|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.networks/222041869262.html, оценка из 5, голосов 10
|