Главная страница


ru.networks

 
 - RU.NETWORKS ------------------------------------------------------------------
 From : Sergey Korolew                       2:6053/1.2     01 Nov 2004  23:43:20
 To : Alexander Shevchenko
 Subject : wlan
 -------------------------------------------------------------------------------- 
 
 
 01 Hоя 04 11:05, Alexander Shevchenko писал к Sergey Korolew:
 
  AS> А где его брать то?? :) Всмысле обновления для ng_*?
 
 В cvs ?
 
  AS>  Похоже пора на 5.2 переезжать.
 
 Hу нафиг, я 5.3 release жду. 5.3 beta5 работает уже давно без претензий.
 
  AS>  Кстати, читал в инете что и на последних mpd и BSD
  AS> данная проблемма невсегда решается :(
 
 _Которая_ проблема ? Их на самом деле много и без изучения можно не понять
 что там на самом деле происходит.
 
 Вот оригинал моего письма. Учти что это старый вариант, сохраняющий
 совместимость с ранними версиями mpd. В общем, читай внимательнее.
 
 === Begin ===
 = RU.UNIX.BSD (2:6053/1.2) From : Sergey Korolew 2:6053/1.2      21 Янв 04 Subj 
 : mpd и потерянные пакеты (no buffer space available)
 =============================================================================== 
 @RealName:Сергей Королев
 Пpивет All!
 
 Прошу у всех прощения за задержку - приболел слегка :-(
 В этом письме предистория, в следующем - патч.
 
 В pptpgre-ноде измеряется время от передачи пакета до получения подтверждения
 gre-ack на него, накапливается статистика и корректируется
 размер окна передачи. Что это означает - нода передает бурстом (в пачке)
 только n-ое количество пакетов, остальные притормаживаются до получения
 подтверждения на уже отосланные, в это время при попытке отослать еще
 нода возвращает NOMBUFS (то самое no buffer space available).
 
 В моем случае засада возникает из-за чрезмерно умного железа (радиокарты),
 которые имеют тенденцию накапливать мелкие пакеты в буфере и потом передавать
 их за один раз. При просмотре tcpdumpом я наблюдал до 32 (!) gre-ack пакетов
 за один раз с запаздыванием до секунды (!!!). Hо максимальный размер окна
 передачи 16, плюс с того конца линка работает тот же самый адаптивный
 алгоритм, в результате имеем следующую ситуацию - у обоих передатчиков
 размер окна становится 1. Самостоятельно разрулиться это в случае с WinXP
 не может (mpd-mpd линк теоретически способен, при определенной настройке).
 Сервер на poptop работает неплохо - он просто тупо шлет пакеты, без
 излишнего интеллекта.
 
 Теперь об грустном. Hа этом же линке у нас повреждаются gre-пакеты :-(
 Как ни странно - ни tcp ни udp пакеты не повреждаются (либо нормально работают
 контрольные суммы - у gre контрольных сумм нет). Поэтому немалая часть
 изменений была сделана для попыток отбраковки битых пакетов и разрешения
 пересинхронизации последовательности (в публичном патче все это выкинуто).
 Увы, я понял, что бороться подобным образом с битыми пакетами -
 примерно то же самое что вычерпывать море ложкой :-( То есть в принципе
 оно получается (с кучей изменений в ng_pptpgre и ng_mppc), но все равно
 остается вторая сторона - XP..
 
 Сейчас этот вариант работает на нескольких production-серверах, проблем нет.
 === End ===
 === Begin ===
 = RU.UNIX.BSD (2:6053/1.2) From : Sergey Korolew 2:6053/1.2      21 Янв 04 Subj 
 : mpd (ng_pptpgre) патч
 =============================================================================== 
 @RealName:Сергей Королев
 Пpивет All!
 
 Пропатчить файлы в /usr/src/sys/netgraph
 cd /usr/src/sys/modules/netgraph/pptpgre
 make
 остановить mpd
 kldunload ng_pptpgre
 make install
 
 !!!! Добавить в конфигурацию set pptp disable delayed-ack
 Это - выключатель, убрав его можно вернуть старое поведение.
 Также можно выключать адаптацию только для конкретных проблемных линков.
 Увы, просто так добавить новый конфигурационный параметр без потери
 совместимости нельзя, приходится использовать уже имеющийся.
 
 ====================================================================
 diff -u /usr/src/sys/netgraph/old/ng_pptpgre.c
 /usr/src/sys/netgraph/ng_pptpgre.c
 -+- /usr/src/sys/netgraph/old/ng_pptpgre.c  Thu Oct 10 22:27:54 2002
 +++ /usr/src/sys/netgraph/ng_pptpgre.c  Wed Jan 21 12:47:59 2004
 @@ -486,6 +486,8 @@
     /* Check if there's data */
     if (m != NULL) {
 
 +       if (priv->conf.enableDelayedAck) {
 +
         /* Is our transmit window full? */
         if ((u_int32_t)PPTP_SEQ_DIFF(priv->xmitSeq, priv->recvAck)
               >= a->xmitWin) {
 @@ -493,6 +495,7 @@
             NG_FREE_DATA(m, meta);
             return (ENOBUFS);
         }
 +       }
 
         /* Sanity check frame length */
         if (m != NULL && m->m_pkthdr.len > PPTP_MAX_PAYLOAD) {
 @@ -511,8 +514,11 @@
     /* Include sequence number if packet contains any data */
     if (m != NULL) {
         gre->hasSeq = 1;
 +
 +       if (priv->conf.enableDelayedAck) {
         a->timeSent[priv->xmitSeq - priv->recvAck]
             = ng_pptpgre_time(node);
 +       }
         priv->xmitSeq++;
         gre->data[0] = htonl(priv->xmitSeq);
     }
 @@ -522,7 +528,9 @@
         gre->hasAck = 1;
         gre->data[gre->hasSeq] = htonl(priv->recvSeq);
         priv->xmitAck = priv->recvSeq;
 -       ng_pptpgre_stop_send_ack_timer(node);
 +       if (priv->conf.enableDelayedAck) {
 +           ng_pptpgre_stop_send_ack_timer(node);
 +       }
     }
 
     /* Prepend GRE header to outgoing frame */
 @@ -554,9 +562,12 @@
     /* Deliver packet */
     NG_SEND_DATA(error, priv->lower, m, meta);
 
 +   if (priv->conf.enableDelayedAck) {
 +
     /* Start receive ACK timer if data was sent and not already running */
     if (error == 0 && gre->hasSeq && priv->xmitSeq == priv->recvAck + 1)
         ng_pptpgre_start_recv_ack_timer(node);
 +   }
     return (error);
  }
 
 @@ -651,6 +662,8 @@
             goto badAck;        /* ack already timed out */
         priv->recvAck = ack;
 
 +       if (priv->conf.enableDelayedAck) {
 +
         /* Update adaptive timeout stuff */
         sample = ng_pptpgre_time(node) - a->timeSent[index];
         diff = sample - a->rtt;
 @@ -679,6 +692,7 @@
         ng_pptpgre_stop_recv_ack_timer(node);
         if (priv->recvAck != priv->xmitSeq)
             ng_pptpgre_start_recv_ack_timer(node);
 +       }
     }
  badAck:
 
 @@ -697,6 +711,8 @@
         }
         priv->recvSeq = seq;
 
 +       if (priv->conf.enableDelayedAck) {
 +
         /* We need to acknowledge this packet; do it soon... */
         if (a->sackTimerPtr == NULL) {
             int maxWait;
 @@ -715,6 +731,8 @@
                 ng_pptpgre_start_send_ack_timer(node, maxWait);
             }
         }
 +       }
 +       else ng_pptpgre_xmit(node, NULL, NULL);
 
         /* Trim mbuf down to internal payload */
         m_adj(m, iphlen + grelen);
 Only in /usr/src/sys/netgraph: old
 ====================================================================
 === End ===
  Всего наилучшего,
   Sergey aka DS
 
 --- GoldED+/W32 snapshot-2001.03.04
  * Origin: Hету. Придумывать лень. (2:6053/1.2)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 wlan   Alexander Shevchenko   29 Oct 2004 22:46:52 
 wlan   Sergey Korolew   30 Oct 2004 11:06:09 
 wlan   Alexander Shevchenko   01 Nov 2004 12:05:02 
 wlan   Sergey Korolew   01 Nov 2004 23:43:20 
Архивное /ru.networks/222041869262.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional