SACK TCP in FreeBSD does not do Lost Retransmission Detection. Unlike linux, that functionality is not implemented, leading to a RTO when a single segment is lost twice. This reduces Goodput considerably during phases of higher congestion. See http://ubinet.yonsei.ac.kr/v2/publication/hpmn_papaers/ij/29.pdf And http://projects.itri.aist.go.jp/gnet/pfldnet08kodama.ppt Fix: Simple fix is rather easy (doesn't work perfectly under all circumstances, but doesn't need new state variable and runs in constant time): When sending the last segment in a sackhole, store snd.max in rxmit. During SACK Ack processing, check the value of rxmit from the lowest hole against snd.fack; if snd.fack <= rxmit of that hole, set rxmit to start, and sackhint.nexthole == sackhole[0]. Care must be taken during hole-splitting (if rxmit > end of lower hole, set rxmit to snd.max), and all checks of sackhole[].rxmit need to deal with the signal rxmit > end. See http://www.ietf.org/mail-archive/web/tcpm/current/msg05003.html ff. How-To-Repeat: Drop the same segment of a TCP Stram twice, when cwnd is open enough (3+ segments).
State Changed From-To: open->suspended Mark suspended awaiting patches.
Responsible Changed From-To: freebsd-bugs->freebsd-net Over to maintainer(s).
As discussed earlier, here is a simple fix. Caveat: Doesn't work at the end of a session or when cwnd is very small (<4 segments). Also, during heavy reordering, some spurious re-retransmissions might occur (but that would only affect very few re-retransmitted segments, as holes would still close with each additional received SACK, reducing the chance of spurious re-transmissions).=20 Benefit: during LAN burst drop events, TCP will not revert to retransmission timeouts in order to recover. In a LAN, the RTO is typically many orders of magnitude larger than the RTT. Not relying on RTO whenever possible can help keep throughput up.. Simple Patch: ------------------------------------------ diff -u netinet.orig/tcp_output.c netinet/tcp_output.c --- netinet.orig/tcp_output.c 2009-10-25 02:10:29.000000000 +0100 +++ netinet/tcp_output.c 2010-04-02 16:55:14.000000000 +0200 @@ -953,6 +953,10 @@ } else { th->th_seq =3D htonl(p->rxmit); p->rxmit +=3D len; + /* lost again detection */ + if (SEQ_GEQ(p->rxmit, p->end)) { + p->rxmit =3D tp->snd_nxt; + } tp->sackhint.sack_bytes_rexmit +=3D len; } th->th_ack =3D htonl(tp->rcv_nxt); diff -u netinet.orig/tcp_sack.c netinet/tcp_sack.c --- netinet.orig/tcp_sack.c 2009-10-25 02:10:29.000000000 +0100 +++ netinet/tcp_sack.c 2010-04-02 16:46:42.000000000 +0200 @@ -460,6 +460,13 @@ /* We must have at least one SACK hole in scoreboard. */ KASSERT(!TAILQ_EMPTY(&tp->snd_holes), ("SACK scoreboard must not be empty")); + /* lost again - then restart */ + if ((temp =3D TAILQ_FIRST(&tp->snd_holes)) !=3D NULL) { + if (SEQ_GT(tp->snd_fack, temp->rxmit)) { + temp->rxmit =3D temp->start; + tp->sackhint.nexthole =3D temp; + } + } cur =3D TAILQ_LAST(&tp->snd_holes, sackhole_head); /* Last SACK hole. */ /* * Since the incoming sack blocks are sorted, we can process them @@ -508,7 +515,9 @@ if (SEQ_GEQ(sblkp->end, cur->end)) { /* Move end of hole backward. */ cur->end =3D sblkp->start; - cur->rxmit =3D SEQ_MIN(cur->rxmit, cur->end); + if (SEQ_GEQ(cur->rxmit, cur->end)) { + cur->rxmit =3D tp->snd_nxt; + } } else { /* * ACKs some data in middle of a hole; need @@ -524,8 +533,9 @@ - temp->start); } cur->end =3D sblkp->start; - cur->rxmit =3D = SEQ_MIN(cur->rxmit, - cur->end); + if (SEQ_GEQ(cur->rxmit, cur->end)) { + cur->rxmit =3D tp->snd_nxt; + } } } }
State Changed From-To: suspended->open New patch received.
uuencoded version of patch received in private email (should fix the problems with quoted-printable): ----- Forwarded message from "Scheffenegger, Richard" <rs@netapp.com> ----- begin 600 patch.tar M'XL("$<LN$L``W!A=&-H+G1A<@#MO6MS&\F1-KI?R5]1(Z\U@`1>=?%8'.E] M(1*2<(8D:`"41L<Q`3>!)MD6@(;1#5+T>LYO/_ED9EVZT0"IV?7&;H09MH;L MKJK.RLK*RGOEP]D@7>2S1;X]_+=_TL_N[N[+Y\\-_DL_I?_N[;_8>[%O]O:> MO7CQ?'?_Q?Z^V:7?GSW_-[/[SP(H_%ED>30G4.9IFJ]K=WL=Q^,U[\N3^U_R ML_-D:],\,8?I[&Z>7%WGIC:LF[T__K#?P+\O^=\?\.\?=_G?9_SO"^JST;^. M33>^BJ=Y9M)+D].?Y]/D)IYG27Z')X?1.+E,Y],DVC:F.1X;_D)FYG$6SV_B MT3:-@H]WXU&2Y?/D8I$GZ=1$TY%99+%)IB9+%_-AS$\NDFDTOS,TWB1KF-LD MOS;IG/]+Y(M1)NDHN4R&$<9HF&@>FUD\GR1Y'H_,;)[>)"/Z);^.<H;T,AV/ MT]MD>F6&Z724H%.&4=!O$N>O\/O>=@DTGJ?"-$Q'U)*HAZ:31P0K1HTNTAN\ M4F1B$/J9IGDRC!O4(LG,F,;#,/ZS/+TB3/31X3A*)O$<.#+[RX#0!P.,6$!H MGJ,%`??/@<7(+'6D43I<3&CQ([MH.[0>*;V?FTF4Q_,D&F<>\;Q@&#B<!D_N M^;8YC1/NA_?3:!)7D-,T]:]Y&1(B)();QDKGF4(UB>[,10SZH7FD)IZ.Z%T, M4B%0)FD>&\$1]1X1C$2%YI)>"#ZR]#*_)0K0L92X3#:+AR`MZIJ`YN8@JJF0 M5Y;I/-"G_Z'=,[W.N_ZG9K=EZ/>S;N=C^ZAU9-Y^II<MTVV];YWV>Z9Y>F0. M.Z?];OOM>;_3[9F__*79HP[??X]7&*IY^MFT?C[KMGH]T^F:]LG9<9O&H8&[ MS=-^N]5KF/;IX?'Y4?OT?</0*.:TTS?'[9-VGYKU.PU\#P,M]S2==^:DU3W\ M0'\VW[:/V_W/#-"[=O\4GWM'WVN:LV:WWSX\/VYVS=EY]ZS3X]$PKZ-V[_"X MV3YI'=&V;I_2ATWK(TW+]#XTCX\+\Z21"M-\VR(0FV^/>2S^#DWSJ-UM'?8Q M'__;(6&-H#MNF-Y9Z["-7UH_MV@JS>[GA@[;:_WIG!K12XQVU#QIOJ?)U>Y! M"RW)X7FW=0*`"1&]\[>]?KM_WF^9]YW.40]#T?"]5O=C^[#5.S#'G1YC[+S7 M:M!'^DW^/(U"Z*+7]/O;\UZ;$=<^[;>ZW?.S?KMS6L=`'SJ?"#,$;)-Z'S&2 M.Z<\9T)2I_L9XP(?O`8-\^E#BYYW@5/&6A.XZ!'V#OL8+6A)7R5\]H/)FM/6 M^^,V8?VPA;<=#/2IW6O5:<G:/31HRY<_-3_S',]Y^E@L@DU^#8BWP4MJVN], M\^AC&\!K8R*$7EN)IO,.(_7.#S\H]G4?;/S?VN_J>2!8;/RP_=S4WL;S+_$X MOJN;%SO[SW?X$-G9W/Q=,AV.%\1,?\SNLIWA*+[,MJ_?;`X&[][VCMI'M4?_ M_FX>Q_3[*Y/-ASMH-(WSA/Z_$WZC<4/\>N_E\^W][3W\W^SO[OYQ9V]W9_\% M"12O]G9?[?_1?(FGV02<J/5U9O[]4?T@^/RC=)8/,.SV]:.*IR\K'L^R>+C\ MF*`:Q1>+*[PIS6X6S:,)9E=\3/_/*QZ/T@D=+,O/O\3S:3Q>?CY.AU^6GTXN M%I<53Q=Y_'7Y,3''/,UN*T"DL8&:ZN<WT;QR5L.<P0Q>8-F2$CQX-J=UC)<? MWTSEH\7'O/AES/CG@PI\NK>SE;UFPXM5?09+$PS>T9KCZ)3WET2_M-5:_9?+ MC5_25UZN^\S+RA<O\<9!0"=:<EG1FZB.W]/WZ>^-_N$9;?%WQ\WWO>K&@\ML M!8KP,HO_MOIESH+)RM<K<44O+?H9303C4>OM^?L5X^@F<G-VV#WKM0Y+?;`3 M=W0_V@YFYPDW+3*9232\ID]@P8=?LL6D1%TTPH+.][L=:H?_#RYIQ\:WZ?R+ M-F002(JZB_/-^"O).22EYG,2*`PVFGDR&4#DFD7#+S5B+Q;TCT01@Z/6.Z*, M6C+-&V86Y=>#2;X80+PB06U^1ZV76F79X'*<9W]?]VY`VSX:5[5@)*:#:7P[ MCZ?IFA9YMNYM1/)5-AW1[%8U\BV(50X?T&H2?07O[7WN'?:/!]R:#L\:@2K, M%CR43KGVT:!YCD-[&5L-0SU!WH/NI\;FQF,>X[1YTJI58)9T%FKSJ#6-+L:Q M.:,&YJ1_;HYL@T??!$Q&@C&4QISPSPI-\O=X-3AN"16('O4VW-U(=X/^WP8! MK_B@$H[-C0`04P&'DLM::*!3R$<,?1W$GWT;@$IRJ[%2(LV&V0T6Z#2^[=)3 M4AFO4MJ+UY-O_#J1\[U?!LD7OTK<R/3B*Z_2="XOQVDT^D;BB(7"0>SW`A'L MK"(L>$%*%*D<&,]0@TM2CVAI2"'[;?#0OEP/3FD/*SSMZ7`>`R5$$%D>SX0\ M2/VJA/"W@4;,X,&@@7$H:"?1UP=`L[DCFMEP9D12-)`T")Q7YC*Y6I"V#PWO M%F:!C)2]\0C:(PV2LR;,HR7Y-DNJQ,@VO<194ZY/3X87YDD^JV_^Q^:&/A2I MR#S)4O/:Y+.M-\``M=MZ0_\9R-N#S8UQ2OKU.)XV2'4?DK(M.*%?Z!U]C69V MV:!]&5UE#1//Y^G\P'U!#QO_()F9)_3_U^;T_/@X?)S>C._P*KU9>DFP7X_F M!/PU/5L,AM<1:?"S_,^T%08GS9\[QZW37_!FFB574]*4:9!9SO#:_U)W^N]! M\6@..]!Y.I#&]/5==R#R])+1.)8I1^,TUSEG='(.YE])2F_([Q=W>9SA2>X! MQXOKE#;*DYEVRQG5NX6YT7=-GC)P9E>:$?U<+.993FUUDF_/N[W^@9>K`@'. MX_#E@/%$OW@<\@RR9';SDLAL0WZCM[6EY;[!"IK'-.C9H'WV\67=?!>B8G,# M+SX==PY_&C1[I'CVPR%`PQM$PQM0<>,<)H=I#)JY@@'LTHRB/!*KEB???!ZQ MFI/'HP9W!"DS&4G+VV0\MD:2;6[09GL+;08V@DQB&9;V_)#X;X)S@$TMZ3@S MM=[GTX8AG-6Y9Y[R`L*@1$MLOWP@AJ#;)*,%3J8W<98G5U%.!\MBCA?\U1W" M&E&`QYF`^-CTWPV.FZ25'QV3^OJ/?\AK8@#8_>:U;"C\N9A&=2S$I:GQ0(\? M&P+V2V:V=,_-AS>05<T;NPGG7W,2[^J&=BHC%3/X%)OKZ"8FA-`$>!R<?H\B M8@K).'[$R*/#*,+`L`UQI_CK+![F8F,:0N]B-A)-[P1SM[&PCJTM:9[Y8Y8Z M7!%KH.',(^[YR,P7TRDL;=$5U#WN(=UZL1@KT7UK^90>Q3.0$/6DT^KV.@9F MI2-;L^A_4?$4QXJ2Z"J?(/3+ALMH!3X.K'QP4-H#@EZF;L&;/"!%AH>.1J-Y M[7&)YE^2=H$7]3K:;Y2^(!UIX39^-?$XB[VX+M]4T/@KP4>6]E7PB95?L*0R MO*75L%1`9)3%5UB6C-K\NKE1(+_7YO\+"#"@+YD^_EHBUY-.M]7O''9.6HJC ML,4_7IOB@!N6[G<9"0"!E_Z5V^FT'V_C[XDHZ5R@LX@8>!Y](?*DK4[T3*1& MO%'W@]W,5_,85E?L\"F/@0;3K_FV,7W>VFH9[34/?Z(M":NQB#G,$B)8>S/B M"*#/Z"9-1CP&+/5"8=&8QA\1><=CV&2)\D'HL.N/_@K;LWZ-Z'J8SM%C?.<V M.6%L&66`8W#6ZIZT^W7:N=26?GJM/PV.^VZ_TX`-$VQ^7FQ63W$P1/QE:@PF M8$\1Q2J=G,8S"@"V%;(-[4`G+;4BCNJ^>,NL+"":^E)3_<LWNY!FFQLRN]=& MA03^\\\R<=J\>8RS5!>X!^X`=@$T;%W%TW@>@9W,8V6A;%?.8&!E4J#U(Y8S M3H8)$\/\CC`<\E]F/R1-"_NIW8(9.Y00(]@CJ>F"M-(L$]YPN9@.Q0+OR,U_ M.X>A_S)BCX(H2'"N$"<?Q2H-&HL>HD.2%F,>1<"<Q[-Q-&22,;7+14XB5ITA M"R<F[H"H-%T>99K>-ICGWL)4']\DZ2*C*2=6$"4DN0T-?P3AFI@!R6-U2V\6 MQ3EV!IQ(X+5N)@TF:IH:1`P^%8'#O\?SU/;W$HB5*(IBB#YU(LU&('4]B-:) MS0W>$3OHM@X['UO=SR!AMP5J,Z4@_JK*FCD)SH]+8-3KPFM8B!R*T+A!_QL^ MA*II.RP+5PP]=__1[#)?U;&83Q%[/DIQ?(2$PMPD$ZTI(_9RETYE?13?GI=C M:[_OUPB(.(1&V^E<Y%#&ZM6:.4DY1(-U4O[G[*7B=62I#W:7Z<A^3WL$HVV; MP^N8&O/F(*&&R7L830ER7E9L$NUUR7XEVA$8>%L>[MA3CF%N_0E`JT2Z`FR% M&P,>1M/O<_LA[/!).E=Y:OE;Z-`'_Q6I05FY=`:EJUMQ2A.VS8O4',^2C+>F M['@/F6T^H3\R0B%M9CL+^V6>9DB\]'.5@O]?TD$B]">@\#L]K&6VF*:=I%T? M0$K2U1S\081S^8)LE%H-A%I?C$&8K.SPRPT0?0FK1)P6UGH]D!/6C&6$KI9Z MRCE@GRT=`AL_J<2-=B0E[C9JCWZ?O1(D7[!<1_C`Q,;Q)4^2^IE7YO>C1P`? M^W4P`"\=#!K0UN2C(!T`^H9VD=!'@:7L,3J#`TL>D#[2ZS>A,Q]"Z\W"!<CJ MA2;-HZ.E)K*5&:GL!R7,L(86BCR*318XRFOLA8_WQ!WIO"+PYB.K?8(AD[AE M2/B'$/FN?8I=-8__MB#1G@CUXLY\?YV,1O'T>Q$^<I;VT3D4`Y8XXVFK=42# M@=EX8>G#@!X=K.E!4)1[T",<P3W2HMZ>D[1%_ZT]SE):['20R3'N9:N$G;<9 MO-\J3\F!1)0T(D&=EGE7]%*S9X!6.24[@4IS:=M"89I$V+<X@-,I#A*G<[&A M'`=W0@)3`TR(MSB/S"8'84NN_57*Y&:9*R-Q+?K>=;J'+3@EO6SJA)77COH< M4Y5S/N.#D74>K^L5]#AM/B0&+%YWK/=%`EGR/%O0;.^$C]U"X]3&U]&,M!%B M7U!UF!LE8(/1F#05JW?&VI;4*#!)+UN.)31`),H/Z6U,7*"AC85[,[CQUV@( M^4=61;8CVVK0T[;/]=NW*;ZQ-`>!T#8&UN4#"/P(Z()QKTOFCIC%S,&,$6'D MCW,7)@#NQ:*O`T16F"$,L2COM=4G)@&"E,7HBS%]C6:X!+8%^"(>1AP<PT"/ M>(Z,F\)18R%0X5!T\VN.?;B(W3FCPUL\YUD\OBP?@6",/QJ_D;:SB\%P*'I= MH##9+;L1",M[GG6K4F1]1P-:QN2&$,R"3;\/V:C7[O4;1+('7GTB;3V[3B[S M@J84[F,KVQ.M6W5()4=&26`'(5F3`&3JYLXTK2SVEA#BU(9H;@JTAO/$]MYE MB7$QSK'LB6Y6.I*O2'VZL:88UK*H,82,:)RE)AW242C[`(;EE/8&J5>S3<4T M["E7L(JP+,R<A,T-K/`E-[PK1A*30^K[:`'1G_`E'V=+!/@W"^E;@3AFJ0.? MY+F)K*MX<@J#Q=5EKD$WI7&8YPB250"!MC@.!+\MPN96.@6E1F"(U[IGW9+@ MZYM"L`8@Z&?I^.1%*"_`;L-%'JEMB]15T2H2A(/-S&X`U&5@)<02Y?-%;/>P MAY$73(-["`C:G/%%2F>:K`$L)LGPFN''-]E<HDHN01:RW?#T=ES5O0@5@]<J M-U>(*>4MY&R]D,4A.H#"_5X)I/I-L^)G)^`APKZR9"3V<!',RV*B'.-SRX8M M+[-Z8P/;!@\"'&+K"'O63GQ:S%)2V."H4`'5(S?D'P_"0J"CU(V57NC'(\6? M7T>IR-80:N4$\G+6D"7^[SQ&`GU9WK%32YH;MHC4HC$X]]4UC@O+!3/Y!!]R M4]J,61:Q!Y$(F$UHT3Q=`(OFBMB#=D($P"3YN]A32)<E:MQ"!_KB,.:&,!.F M$U+E+!H!"$?H;9M/>G[PA!A4V2+2@0>UW[FTE'JQF%Z-1>[BW20`L&&UP+Z+ M8JC5YPI6L2TC@GBMPEH"^B;JP)H3F4J["KVQ0G,LZHZ6%L9.+,5;6=U?ESC[ M<3K#XK.PB1,[0;0?T:;?H&RKQ;D:B`MH!A3*]L[0>ZN'*"^11?6D5UV5[=D1 M;1BA9R\&\(G*0WR9$E/F,YR6,4ZNIL3D(!@L9K-T3AR\WX0/B_XB'INYO:3C M%VQ?3F!C,94M`*H-5QJZ8-8NVQIE#M^QUZ*'40;=UF&K_;%UQ-@NG,0L"K/J ML[75`,$\?7I0P.];B!SS^'(Q9G7>2@D6$SLJX!,M8P6L=B]",)]R$U+,%^(M MF,;Q2,S@,-8`L\F43A4Z[^;113)&Z":$CG$\R92=$V_'5^GKV)FI6"*I'\ZL M9#(;Q\X#F]V'Q0KMH-,YZUO#B#/05$DJP(?=(3_:'6)]`G3"``,@.4=J*N&S MZ9X=*WRZ+7(K;H!O<.,A\0Y!B>>CVAP?LT<>?92H-U`J5`[(KJG/%VDO)[25 M(0FSJ6$IO'U9;(V/[>HW2`09QF-C70,!#&:V@/:A6_R"YK%IQ<3:<)QF,7%@ M&;:AWD^16T-=21T,LB6%6=I->972]P0X]%(`1\F(=Y0H%/01YFOC.(_'=PT1 M>F^CA#<9?=30L>7=$\$*KE!M5HN4W=;/)_<)E!LARWM=M@WP-[\K?:$LLJJ+ M0V*F<L64VJ0]6RLL/.P,3O:B+30CO-&B8L;6',%L&^8(4WOTY]]GKWX_^N65 M44I]U`AL#H/!<?NT-1C40S]ATWO#.6*`C6?8X>J6%O<XB.\R5\4@<)N+_@[_ M$K8WT3L?+GP>BL5=:)M#S(?Y(O`N!9'T3+S@V31L;12/X7N(L'HCVOX:@5TG M"'JQB&D8S4<YT.&>BA8MNO4X@0V$&LUQ6L.)3[R)-"62@YF?7"=TAOOQ\5$\ MXA'DX[68*),WPA8X?S(%CQGOI,,XFA*>>*P2/"*]%F&BXX@3!K(%HM#Q8+(@ M&1+B@I&H3.*-I(7=B=\UYLAQ1AW#.8&21MU)KM!T`E*8%QD$SCD"W;V(B]P* M^%X11L\,&K$7)`67UHH&@'">$PS$T%]Q5Z0MB!81!P8-"$UT@O`1ALC_:'ZE MSJ*EM6<KM!KH+Q>C*Z@'0P2`T#`O=I[GUZ!MM-O?+L`"MT)B6=\?=GY@@PK] M(RX)THEN+<6,[]R'6%&S%HA)](6]TA+?;S_SK/B92[%>"&U>)^S3!WV&02"T M7-KY^;9)21$3DXM@HQ9X8T$JP]1J8NKD'H,1JB"!GQ*RY"0@)C&$B$"-K]0; MQLX&#VEQ-<,%*"U/1B<&ZRJ"9CCJF.(=%5[-)15#C:PA-BYB2"=J:R'A,6/M MDMUYL6@ZC)[%)%"?<OXB-1TE!$ENJ3-`"SS_90756:E&*76ES3W!5$"`3)S$ M^NR\1LS%52.&:BE;66>)I6-KSSRZQ1F$6=D)+L].#/P0'"")P=J6SQ.&V0GG MCG(@4ECR(?F<()EZ%O!$^(-G/UYT-#DFJJ!EI,I.A3$3@5F5^2*6G8Z1IU:B M@?<3=B;$DZCV22R&3]W;B$=46X.);J)DS)%=#HJ:Z-73+4_O?`9J3S;-"=Y" MIJWL)2"MSE'GE>E=SXF#%5`W6LS98`%/,ZU-DH[`L*XT2,!*8DNK3'/JQG]; M$&$@%TC2>23>E]"%E1.^[([LQ8R.<UZZX4SMG?,8&3(%P^7'P5+$&^2WHC9H MQ;C>6PX0Z[7_WY87@T-?EMDQSPF&%W6<D<4QKI-;(A/XTEB/+*N;Z%"KZK%C M?J`1_U!?T_5'([,H1J,%'50Z6?X$==XR5>J5%?:#P(KOL@M-CT,0`PF:H16[ M8-VOFL;391@1^.?4ZJH9D&Z+>,DA(G,@R-F@C:JU(0$Z6)UEFUQ_3G()-!45 M$)3W.*W+QBW-35P=="F&=@F\!%75H+*)QB7:[G4T'R%%J\ZL*)ZR'L):&OLD M,K4.J)'G,K0H35,#2T0\]\H?OX5OC-FW,_7+7'H=9L5LY;(I905;<40"]1QR MR_B+U__89L\Q%SS*C$,HAKS%:;);)T<O&M8X8P7S3)]$(V)&.9U=XDV-E/.U MSXRF&#@=:Y'A6P0A?0GF`P86DP$^KVD1Y3AF=AHI'ZG%7X?Q+%<O)/CLWQ8, MV70QN8CGPGT@;?EH!#%P9\K*]33YPF<,5#5K!`I]%I!P++1B8+L!B\;IX,85 MMJ8D@<P\_DSQN/01;I@:Q^QQ1!,?C")B:`#?I_8I`T@D(*>FQ1M3`LD%J2AS M("56WU1=(3JE\W+$IJ`Z+RFD58@O8PZD80E]4ST*XGH(H++(MG-%?X@#4V5[ MQ8!(W1YG\WB+3L'A`E\0&Q2Q5*AW8L$7=CM.TR\DZK&V)VZ1^9<I'75Q9H^3 M]ED6#]6_0!3*0@P,SRI<(4X#AL!$D$=82[\X;ER,R)0_KT>DMOP=O$$T%Q>D MZ2Q(!2]BD2D7]&_Z'FOFCN$C+M.QR*K0B/;[TV;_O$NL7M0ZUQA-Y\.;`9%G MQB9OO.=3HVB.+?8H1(C9Q7DM+NZ5+5\N-2VM'W>B3Q>Q1Q]WJ.(65BGE6-0E M]X=@/,1DM2/8A[(*=RW9H#WZ-5K*>;>?&N?QU:.%'BVY;I8-1FH0\:`&@X>G MUG]R?#HF),R99I==9+3K8W>XT4*'&BS"HUCM$M6)I62.2H-M@W8[[+N.Y2RX M;2%IF0<)LIK9#Z.F4\A<\-*^LOQF8\O%@$8B0UK>5(,T#O'Z5GEL7=OW-;[2 MG1]6!<*AP-)/K;Z#A:W5K4>*S>[4V1A-=F;)C#Y@HS]/.T>MX^9G_8*$_T&@ MDMBN6KQ-&FS!$E-W305XAI1=?7L[^Z7CUVD_W\-K.V<>IN"(>J:B^]R&"3H^ MZRTYT*J";\+R5S1R!0(?X=K3J5HS"CQDTP:;`+:#P/1VVNFWOF/]'C&<K"Z% M&C.QN>]I*WSO'3NB6$EGS)//;/:^97?3X?4\G4H$F<M`USP`X9J+3+M*Z./E M>)%![]7UI!-R89/7@=X\)6D7!/CSSS]O^CA=8MSQ*RMJT)Z`\5I\#NQ48D5I M2$<[R1P$R&+J5)<@$A>RW_K`TL>/84E25QR[K;@G,U8F)ALJ7;*(,EG5`\[J M@5R2GTE4]=RZ8JRS\]Z'>FB`*ZSAKP6;=66<`@</Y7>S;1=YX6=2'*Q$.40W M`%+$_WV.]2X^?:.>AZ5![@TJ!4B!$W4=0`$;+K\/Q.##=#*#0.#5/MU""*Z: MI`M.[0C5:I8<V(@>$]75X.D063"+G=F"%'81`!`-Y@/0.?BQ[LVN=!H1Y;)@ ME[":SE%T)K]-K35`K%G6K-\`#W+-7NS^WDHWEGE8,<]Y8V$>9C9S"[.]]1Y$ M%L[%;*0:`"8C7H/>EV2F0>D:)^:V-*`DMMG?8=$U&E]NP5<>Q+ZHUX\_PO)V MX3O*V\5,3;B#"B^V;">Z!=]B7LS#L=[/8[J@B5!AU8/JC4@<%1O3AB&YN,WO MV#/SH?FQU3W\B)BFT'-3+[H7'M'J/K+GAQ*$1BARG"L(T#->M>OGT1>)0``1 M#8?<R8:8@-@LQ[ZXD_9>/#8__NBD*;;\!!;VE",-;C1@U*8AB<MVS0CJ#:S9 MAQABRXML7W,^S1F5>`6=F(<TM7U,I1"35KG1T*S8TTL*3M]=MP<YPEK4M?0V M]@0B/@;.8&D8SF6!%6-^9<.(8-0Y_.FT\\GZ$3F<(Q)U80OZD56@`I8AAH^0 MHZT-VY(/`/H0^+*7"SDVQ-,U+/B!_B]+ELRBJ[Y0\CPN9B7'8ZF+#[9A,RJ[ M(8DJ.1HE\XIW,7?.F0JM:`*]ZR[.X5V-V=H@_,,+$?A:B+)@LAC>!4=7*!"M MTSXB"$47H".PX--Y_:#)35G_;HA+RP<W\$*[A#\6#XB?!QQ/>>BF=]45Z$)" MW84VG"LQ7\R1&4>G+U':"<R6,&$HL]+B1)4CP/99C$OYAJ2*8,4YW3+$BF=A MJWQ=[$M[0#OG$V-N=Z]OKI"3=6#7!BZF`6&`\,1:B3<N<5!3@?>#[TE$^CC! M.=LP\XB%:X2HC-G<S!4MAJD$(XG=Y"]_43GZ^^^MB0/8M36#$C$JL40\*Y_4 M^F6Q\,`C%<<T'N^+C(:SO$%)AN-QK&>&LWZ(80'@45KTS69L!Q&H^)3?T#^H M&6$RY3AN4!S[PZ@M-)@`K@UBW?4P\&E#PZGF\<4=H\B/Y^PL]RVC`&W#JW3' M5L5)RCF]3NRS0W',5S"2]Y7KEK+C!C:AE7`*6:X:NA@(Y@Q+X<I`](#@S-TN M4N@'^(S0E4L)<3%G@0\I$>\?+T?#YTY:1Y9WN4OVH-JCW'GA%YL9CM@.E2M* M$'`%?MMLO[H61\6,`PJS--6D816#@H#C[)6U@7J8-4"YX97G(`Q9?)8N<5.C MESBOT9M&;4C<LM;P7\X^*EWVE8[VX-@_A4(:9>ETF4UKM(&P%IU,P&Q>^>CQ M\].J^'%I9FH(*=C$T*^*\>8V>[<Z[/RM..I:O7[S[7&[]Z%UU%`,6],QG$#3 M)$]@LIQY-_IB"LF?N1](7"-V1FEH:A4"@>K\BLD_@X/:GR?MLYW`,#PC'3>T M7<KQ-;Z-[N#`S<6(`49).P-IYH@ATKC`E'1N-A-;[8#[PGNN@],9NBV$L@'5 M#&^0.?V4=8X4A..RLQ/DGM>AB(HY[<?7YN3P^.WG?JNGA%;(&R\DI08YJ403 MDH0.JU+Q(YJW7:_\/%[0Z@0)J)LK!W+0'A1UO$4>.P,PT!(&?\&FQ*X#"45. M.>0*(7^TGQ!6Q>X+VMT7XR2#&=IK*:%Y'`=-)_@"@MH**5>AW3KA6&/I?C<= MPAV\7ER0:*E`G<_3[3P=V#Q&F_9U4O+B`#O;WFQ1%DQ=`FPQLB;A;%O[C4EF M,R7I-\+A4@[Q3$O);!2A0K9'Y]W@I->S!@<"\%/!CQZ`]C"AN4L"4N^P>=RR MCCCYX"UK.@J]IKH,YJ+_K(*+APD@ZQ.;HT6>S+(0JF4(2&4<]'O]DS.1^+]% MY`?TTK4(?I[!^?%:4^*?BK25#23P^B!L%P_GUC"=#23C>-7\^CV-R.7<=!O' MH-8R]BM*Q%%NY[T=!*,R'B_A=LRSP'0ODRVJ=U6^8(VT*@PBLPL0WHO',1\J MT.*^#[&^7EAV#M@2SN6;%0M-G=&7T<&&<W1V-H"`S1?L`.&,[Y?>5SA"@H#> M%9`=!"^GZCU9&B=L9-O4M`K(D[J-_[T8:TN)T_6EN[SK1DE=O)NFUGUWN/_L MAQ?UM;AW;I]5&\DV.`C*`Q2^RL4#^<MG\Q3V5!M`8L]$^;SR]*>OC3M.V`<^ M&FD[XCPI%S1126+=26,+H+#G[*4Z@DKE.HI'BI_]LE^J-.*J9EMO)@.TD/AK MV;_II3_DI%E#?AN@IJN#HC#^;KE,BWOW]'7!LQ64)K$1A9+DS^*M^D`1`3K- M8*,D68O.2N?T=8D?B\DL3)/2?IHCC!=L`DIG(YM#(^=J1<*6)+5`2EUP41SI M#5U<O!CJS_:'KQS`D(A%T8(;5)W#XDLN^H]A^UID+MRJ?=9@^0A'M#U\%7KJ M]B6.9X0N6J(9+PL<$2(YW\3S2_$_T:E]IJYZYR*RIR<[+BYBJY-<SJ.AIOGD MUP3$1,Q\U&W"WG@Z=^@5CMR1#<IU4[;9ZQ+2N'"B)+13<?R.D@QZL:@'Y6@" MDB>8$J18,@<J%.P+ZB=0&G'5?T)W,*V>L**J7#"F_2P-F*OT#A"_I16$D.[! M@UO&)B2[KF4AKX"?\_"_M_M-:<L-+++$LKM5_9[WI:<N]USCVPT_3+]8S%7Z M>R6"9N>)[LVC=O/]::?7;Q\&402>%Q6E:D7)&R<YUVGK\L9?U_;#<>NT[CW7 M,X3`UAYI,2B-<D7Q+(*)VS"CM488&/$U3!D$QIHO2[<(0D4L))L_V?.`.CA$ MP5*1<F10%T)565&&H/`B(/PZ(GXP3ZZNN*Y(C53343I!WC]"<P,OKA8/HCWM MPBS^BR*FW\^C"P)7%211>J(\YU*1*&2!DHZ^VI*H\Z5"2Y)#(OH;1PM?QW8\ MQR&8;<63&8=_B,*`,@:IQAMZ%:"T"V53%"M_78!V%@,N:D4LT9G;UR8)DP"I MD0M[3-/+.>?3$>>(^FRTAWC08'8M!RA4CBVIYC@05B6TVS8P.'#R2KV\U2IA M7CMB::Q2$4]%VP0N$%^[LVC@F%QP>K_-^4=-RSK'0E1ML7K!0;K>ID!(1ETW M^G;KM$/-1+QF.R@IBEZN%9>.AT_J$7`,!1,2C//T]0,IG!]4>)I8Z8'.>%NL M39\R,6_YQ\HY-D[>M_H?CKJU2<.<#(XZI_U/S7:??N\/F(@L9Y_86)G_LHE6 M%)YB7D5[V$IQ(<+UN\3Z".`BM'67OU'CJ=K=<#)H_5Q0>.\'>X-ZS^-X4IOH MWU7S*$S$2LJ6OWIDTQH$\!^$R^.7(5COGE0,@S.65]Z5[<E\^`,[.S-A"YLV MG2?(L+49FH4H8I+Q;:4Q)I(+"<FAC93/"P&G4H*02?WQ1!(R`]<\3#:\0,'A MO+Q``CL04,,^FO"0;@M9+6>2IR,LXA!5O09YW6\GQFE(QTK$(5/@U^P8M[NX MXEN>*H+F!1J^GQIJB$*J&R&*WTX30:*9E$VR1D#XI>_$R"LA0#1*@PU_"+V0 M)2,]DZLO(!&"I5&8@^_T,"VET&D0)BQ1TA=A\=Y.?<UQK9JH'H4I%A`/I4?$ MGT;:%B(_I]OUS3!H!>+X4WNJ5-8)",MT8"3@8SV>@Y6]9T'N<:]6'A90=8OG MF^U;$Z7_'R+"_D-]L"L'&N;S\?)!>8]SM7*DQ?S*#;2J#>D5BYGLO]_(H7\3 M!];"EC`]K6?&+FY(FKVQ',VRZ0^#YC'I[@`ZV-B%$H#?SBRQKXHDLL(*SWUG M7W+JN#T?WB0H"^14Z,LIBK76O8)\TB3U&-6_61L?#+FVW@`L-E3FB;_45U0. M+1=-E,JAEL>5ZXHR)DB[?%TR4-.;&GH^)7%-G1^D=&)WBF29%:&AIA"I_0ZJ MK*PHX%1!HX!HJ=A:J8)L/9FM!?/A4#H@O0#^3FNU72;Q>)2AXL8D1E0Z^*`- M1/(A44$HDB2AR&U!G.?#/1!==P4EY$)J^[CXQ<RYTH+2AE(:Y$(\\=;!@C$C M+HU0"I1?&Z9@5L4G.._7BO`$B-&;!;/YUM9!L1XDJ^F<GV65$JLNJ`NP=8AL M[5RKC,#)H%[4H#^"H`HYP;>Q*[4A*-%SY(+SR'3.'!,&DR[BU6<:%M]]=VB> M[;W\83G41<)$7@?9ZIR('\:%Q\,@0+3DZGL#]<0;#4IO?WRMH]`00!LFD\19 M6))&SIK680LL_/!3-V`TZ]H0+UD]B\"BZ\-1EE:;EL!:<)<RR@LQ:M00VL/\ MBQ;4T#`$1)I*!RSF,)IQ]&`A&J36.NS751!H7TWA5.2P.&@%.DRC7$=2@G%D M&[!^EQ4C3VU9#%N9H/6G-<J>8_3?/5S9!#)*ATO)M,H\$D:UEP,8T;`^USF) M+;7V6;_38\32Q'<1B;:O2=W%DP,#L%$N3WEUB_T*RJ$[5D%"M(5V;;;V1K!B MW7AFHX9G7,^`EP3W9]E;QDI(K"2&WND1J$O).20]I<NJXK-!1R'=^[Y`9+PD M:M$S2]-+7*04?B)$HO$'2Q5\),#F$GX5L3HF,*!JY:UTF(/!F'?$AN&8%$$3 MB4^6%+FH!@\B\:++J4<:<5H*DO`)2%*&:T5GFQ-CZR26`>NE6AE$0S2FJ5;( M@ARMM9U]5;MZ@QF_K9"43+.<SC!.H`]J*+&TC`-.`C*)-?*%*<:\7>25Y<3$ M)RLEQ>S8$R[D;!&+P#@N:N;MXX(/;L5VM32LJX"D/0<JEBN12KZ2^<`UF;@R M*V#A2B8"$T)?9?'+Q5<UAB<(4@%R;!@*7XNWT/2B^.MPO,A(C]C>WJZ'02&K MZB2!#2`XO5K.K@<^SP=56\BO:1M<`^7&,HF`6Q4$Z35-Y0Z24->H:.RJ26)0 MGVCC=%"4=D!T/]=O)@$DUT#C8MG30@E1J51I?;5NS$*U8LN.K!/N&A4BPL([ M<1$.U+`6X'$*A#/UX;BBK05&]@M6D^D)-CZD-UO67\51'D\*:-:JXR><=Z!N MWKPQ^P5`;!`!_]=+,H<N_:V8!$^;1^.\)979A3X;*;+"V3_%A*#L;CJ:(QUC M.6[[1PT:KE4$#2-[V`<CE3J4<U1<PM+N0?4'5@=`%[K?V[HX_)L'1&`O#[^F M=5@=Q%;HAI1+,MS>L_UG89H/B^`2!`2^6$-`3X/^^)'^>B/<=LY_-(C?OZD[ MOY;4#Y2:0!Q<C^^.-%#2M7?\B9T'/G"E*F!EV16OM"63!I%GM=IBD%VG<XD% MWZAQ9G1%<EDC\"75ZX&#=-V0;CG>E'!?J+8BOE%@L(O1=UG69=?<E@N5=I'Z MDF96U&0BDKS<+I`"2]&=Y"8%&4Z!MV$N)4&(&8>IN>(-C&&ZR5+=7;4Z!XN) M%U`4)/@1?>4*B2)RWL'1G/A8L2!+6-I0\JHTA\.EC'&>"?P:+M"2T\*B(+=" MBF=@B`L[+E_+BOLT@WC)7"XSJ$C=J-CDMMI>*!5)K7V_#L$Z+XM9A6;WF&]X M1X>GQ&(^JR`8WS7(\>>^`4\-I;3S[GNOKA?4!9)+-"V!"P3IHON[-E`??0$1 MS2)KN;4K7!S*#T$8J_3-4J%.%,9.8R[I-)I#TW(9R&'D:SIU$IAT5QGN=D[* M"M?&\U)Q@(UB=24^.(G6KO#1B)-0Y):VJN"2>P)(1,K@L+0K+?LO(2W)U31" M^7GQQ*IEPC\>:$$^F$!VU<:MU]JH,.*#86IR0$HDX14;E=ES/CAJ=P>=\_[; MSOGID9@TRJ$39PLI;6;#)J9:O9PSSR5D4D.UA>PY;S!;3,K-I/1*D*846K1" MHYA88P]@],$M'3Q8K:Z9%MC(E7YEKXA9$H0F-G,YL[E+U;B(;9D?7ZI?*UO) M<^T^E1`9N9[3DX3*6`OXVSQ\$R#TK-OI=P:$K(8&8)8#.:5DN!:(+#8I2R2" MA5(XSK(A+$3BD`!Q8LMA[_P$H!Q4-6*.]MJ40W$$!FQ/S"_<\7:Z@UD6+T9I M3375;#[<SA"*A+A9>33*<OM(J5!8S*K9!EA3,_S3(.!!)-3VF>%KE&GK\CW1 M6I*5-2*8SVCEG^^PE9>)#SQ82B#PBED/NP)X`[[;/OL(@;QSZK8*ETT//D2Z M1SI'=2$IEAXXX.TX]9()T%[#UNM(G`M?NBSE+>TU7T&8CRM'*&48!*]VJ[@] MQ.E;'-AL+Z*6;C___/,K\R[Y.HE?N5QN+5T_EG0)/GTBB8*G>=V\+%BY;%#+ M/>33ZY3))X=%.K[*_KXJ6J2(D_:T5`V\P68X"20(C4)2V)6>7#'$[@`-:OH: MC%8J;RU7MVB%8()D?;AP8-NQR5;?G!`$Y8IMF*)E%72>@/DT1S=(]7?:;2KI MFJKYB]\[E7J?0>!78(Q9J6HZLV)EH*<'AXMF+K7D3+/_6-&V0A)1ZV_@`ER= M1\P(/"@:@0-5LT)`64YE+@9?\WU99;W2E]/M"REQAD]`2[9.2CD-+7)UT/': M;Q>4GH5!82I^RW()6C7?YCE3;NAZ+[WQL;S^E5"))1AYM^P<HPW%E1+"@K(! M,4FH<BE94V?IIT';0#-MQ2KD#27.O,J9#_"X;D6X!4E,J=84JZD;-]%X(5QC M^9.X*R!%@HV>D2PN;>7S1$IG$>O>KWAZ$\T3KGM1^!#G<+-!G%.!V8<+3Z]- M9`,$**]&A]2F+1Y<@LCN&(;NU>8]!2^#+!X-3P_L/>KYL%3[W>MR?)!V*I;! M^JZ4GAD:_1_$4;ZEIORJ&J"_;JX=9E6NXJ\%TY$EM3/EKV*!TU1XNQ4O..], MC7)B()1>EBOCEB53F]K$OGI@.PV&PJ5>GM>1X/O5!4%:/E'!VYX^_5K=P+,T MWV0])[-,;)D;$05_+=2(L9=VK69)*JZ&H=?N7FA?5LQ&#A;3SVP@ZV/3ZPRX MB\Q$U3$IJU21/B2$;D5>YT%@)&@?>#U)3KD>6(R$#YSB5Y;!2=C:\F)X+;"A MP6U1)_B=IX$I#O.J]9M0(<[.'979DYX(T/IHV?KU!&7(KX6@'S2A$LR86J6. M8KVO;:>FL+(19[BW1"6.U##+L\6UQ%.82I>;>.RNF?.9X!']P\:*6_4O4G.Q M^)@\'XO6DV8''-?-?3B6A0.?$V\"L/&2#:F_'/-=#JAZA:!3*^?=NA+J\:1T M#5AYB10^?^4CQ!^MHBF#<86N.7MXU/YH[]PHJU.)#9=>[_RWS('K.).2'*'V ML8C@Z4S"TL&M.?3')RL*IY#"^YRZC,A4]@;8NANDG$+>`Y;DU+E)D.R8(]:+ MMH:>%\TQ$N[M8A*8T6+,7]:(>!F3UDN&&V$4Z7D:TZL+@LQ=E!WP'>NLNZ91 M5)7+./<&#XH>?PY!L<J(%*R$1$W_O!0779_C_*W9W(:I>/61=L!FD`Q3JMS% M36B^F7S)-:U5LXG.:;]+^ZU5-__'MFR?#?A1O]-^9U[1_M*1]-]2?L?JV`J, M]1^;&T%RP.LR_55E,BXE?I1OC&453[)%Q,.9CQ^&\BJUM^`,I--E9J]##^Y6 MMP8FT.C1.ZR,$&>8E2V&2B8>'%!ZG\Q%S+90-2^/4G\AI)J;GSW[XZ[$)ZBK M9'_;UV'%?A_.N$@N6X,Q?I)KJ8G8UEW=5*L5;$>7ES1,)IF6WCF)08*R+UK, M&,,6JY)6W!7OL0RVS7[DP=$[4*^G2T^6*Y-V'"T^C!*K2'"WL5DF>5I2/-&: M<`P06$S`8S[%P<4%0?;-;92QIXK]AE)V=Y%[[E+VR$:B?['KE`3[\%):C600 M;!`)M!#O$'[J"M0@Q4OU?@KI*%?1T@+%MV*Y/N525G#HN&-#+C@6@[EV"];Q M0D"6T24TZ"[DY"2HX[I(Z3=:\*D5N2_R=2A3OO5;;NH8W@W',;N(`4&.("^U M7:&4Y!><8#9W*<TDAF(<ERIT6-E>E".<65($)@/M4\MD+M>&L`+KA6ZQ0+1S MN:3WK'/<-)Q?FOB;?+DV@E;6'8SFQ*_9%ZPJ"D[`6W?A,T,4R84*;'6AI[C+ M!2LD+NRB=OP@Y5Y%]@<H]X%.4$Y9+15U%)J%X,]D$TK\2PD$WC>ZY83;>UVB M8=.?@NNTUW3AM!%G6:P]LDW9'Y^9>?Z5FSS2#*+@'L10C/4?_G63UA_JU`," M$_DJ1:X4!Q.`S5G,B&&1*N<W^,8&VZ(89Z^\?)ZE*#HC7,G>#[_AZA1([P/7 M6:(^7VU:`ZK[>;#:]T!Z6/Z"_?EV-6O=#<Z%V>X&,SWIO4?&\*N"M0,1*GS? MG:T/<1W+7267D6AD4N!7M&N.EE:95:Y.L`GW5DH":]&"K;A7B$ZP>6SM(PB= MHQ.U>-$;Y[KG"YPTM;J8S"\3O;E7@E=N^1AF4UX6C,39@Y$&^@E\>;E&4$/. M0]LKX_*\\UP%13%FH`E$]")8;2D2B_-!EA.HT!*5X.1<DTRQI%VLM(U^'**& M>UXXG=".%!0YTCY'ZH),<G\-:EB83>JI>!-3,IG$(YHHL33,5`.Q3GH]385T MZQ%4%>:.%WHW87##<=$<E:7>UE=R"*K!=B-<JH)8I::$*IK[T.GUCSJ?3E\5 MGIR?=EO-PP_^(8EAQ5;T(&BT4<@B1UD`XJ(5E>36<X`2@&+B($[SKGE\W/]` M<L;[#X(1U09>5;,-J3Y;%8N>IWDT#IW@1_"(<-P5BA=>1G,M;`R/+US2=1=W MRXOC'.!\1;U<KV!+),)1S*5-F`2M.F3UP:D+#5[R#"R53)1O-J=W[C(<1*C) MU1&WP1U2RZ[E,!:R'\;1D%9O:^0%L1QUZX:VL1VO356?`[EI'OL9<3H#QE>A MZ<'R7?0UE]!@_H%S&M4\#W^R\2*K>+&VJF^N,VU)(V=/,+O%+$]_3X^Y()[Y M18K&P&X:W\[C:<I%D'2C3U&(_)IO?.'*1)O*AL2Q?&DC#[;D[D*DC-J.1EFQ MC29H6-XPTIL:IZ&W@^T),0O]U)A+76?Y/+T3_<!7")/:.C8<(9'B;4B2LX&V MM;WM%S]]?4[H?_F3-;<5+$PV2Q>)#]^YL&4[]7_\PVQMT2G$R>2^KAR'@17K M9]N!RFT*>_37S4U8>#9+U8V\MV]X89[DL_HFM$OP=+Y73UG`/,\Y_*INBWS` MI'X3S3DH"RG&W(/]*^M(1@YZ@.D3@@-@7H4RK^ZG1T%](\Y5VYG'<H&(=F(? MCEP?H;BE):)/-4_?MWHMVEGP7^C9J,;J/Q?-M+]8#Z/!ZO8_LI1Q@GC]X,_F MSP#D`:;@W`5:E8/*;7A0]^=^[T/[7=\'EM@V</)PHO8F&^%1^J!8`3Y4=)DW M+6:S<<)1K/-H0AMIGME7G`J-<:CS3&*M<*L080PL@61[VDZX85O-98MI-$ZN MIFR^00DW&WUL&!:N:C8?N3A:A0C:LBV+@0U%I`3_!&>+RHU.O!G$=3/"0/P1 MJ5%@[P@81EP#3`9DMUOAJSJ.?%T*0]%YM5.J4D2??X4NAL_OVG,0ZFGGC/8@ M?@N*]\2F]@R/^#:$&51!C@*N@;1E`%=/ASKO<E,7Y5';^X'4#?/L!Y7;4ZX5 MX4M5X8_GNR'X_!F[?-YN"?X,K1!O6=/,[)5/YH<GTZ?[,CX&@N9H2X;C(`J[ M*,X(\\^>*T1RJ=+SL%F=AVG""C=E(&U-S+U=VXE(QLHX9B_HJS5_4;:.)T2D MZ*L-$3843BE`SO=L6%3A[0_NK:_]T-@4(Z4O6^6@X-I3(;IJSW=1<8&^\M00 MXGD>.YO$:39+U54\#Z,GQ,32AK%A-2!^9FF:QAYE7QJ^2LLN&!:^6\,+KI;` M3;!740&J^7/GK&\?_>A21L1U32J6JRCSF-O4H73R+Q!V;,4,ZP_Q)?V5#W2X M1@*UY*/O(%#**L=V*IH6IV*)2F[TM6/_'F&G(KOYLBOT-7P)E;5%<F.D/'TJ MM2]H@N[-KX%T:`'T-29^="/1JU[KO8BXX2PK/BI-^>729U>^*W54;$@Y+W&* M^$<B?4J<L0^F>NP;\'+/7+A/T+-N89X!XN7W!X6U<:CG^ELA\K_3:=.![=9A M'Z2P]]^Q&)_:IT>:B7K?8DC3ZL58^6YE1\74K2]65H$K+6%52:O[_QWH"0I> M]?4FT_O05.Q2C:Y[VZP8:!E%_=Y]M/0<M/3?@JQ^^P0Y:"=G#\*3:UV-HG6O ME[LK-=F*<II=$#RL%YM)0;E2,WJXGA_P2-4<03ZRCB<$8*P>GT!8-3Z@6S^^ MAW]Y)]E@5*86L6A*0*HK8R0TYVJ7;2%;XG\,:16KL=V[!7UIMLK=M^;U<G=% MKP_6Y3IMG&EL<2-HW-H2X(P?<;>X'#S=`G<K+8=6LW,]5331Y^9))LDSM?+S MN@725<USD6RBQO_M?]):TKP_''5)+`N?/)BW4M?53%6PYM&(9`O%C509%#/Z M1B6,=;-3!&D-8Y8)N"\]*;PLT(8V(>I0W-HE<0P(#[;>L%JJ@4!+#,+V*3$' M^]B6#BMQ!O?Z8-V'8U<ZY)_SV>IE]"!I;"*3S[(I3\U0HX&J(Q4[*K01JF4` ML;Z+J5Q:XE5@7.L2!Z&^I<'\9<A]Y^3C%,-H5-"CV6?W7),A$0J'>W*<7:8L M3"]/O]4YQN>6"%B>_[HR#\K\X8_/3*W7/]K=W?U#7>_2-8_ZDH;"BKGJUQIE M'%0R;$U'6^GEEA0+U)GH`"[DVE9?)MU(;C;DO"J4XZYO/]+&[&)$Z/4K^;!M MK-8X7&L"(-`IDTZ$EA5JQC)FSII'E9B1YU@<ZS&S7*6@#C4TRKNX6'*I8KCL M8:ULEU#XZ^:__>OG?^`/GV3$!;:'_[QOT(9Z^?RYP7_II_S?%_LOG_W![.T] M>_'B^>[>B_U]L[OW;&__V;^9W7\>2/YG@9.!0)FG:;ZNW>UU'(_7O"]/[G_) MS\Z3+5A]#NEHDE3SVK!N]O[XPWX#_[[D?W_`OW_<Y7^?\;_/^=\7U',#;*H; M7[$O3OGC^33A-)"<:R8>1N/D,IU/DTAL70C$P)<RHQ?=CJQ-KAN/$ESO?+%P MES5I99<L7<`.B2<7='+,[V"0FJ"X0"+7R:I+$J-,TI&KT-`0\Y:S)-HL$!\> MXZX,#&^OART4">]QSG;+O>T2:#Q3A0F."N'QQ/,BK;867>"ZCJ%%JM@NN7;$ M,%8'!^KT8IB@OJ7F@04PP0,YCL1^3F/L+P-"'PPP8@&1*Z[C?Q(L6E-.1QJE MPX6K-X9^.[`PL_-N$O$%]F.??N-OX0NGP9-[OHV`0^['[O!H$E<0U#3UKS.Y M-SN3>]LQ5CK/%"J]QM#>Z4(B#KWC^Q8)%$ZGU6O`,T.G,E]:KB7U$*6?7N:X M9%C'LOYN24E*AIJWBGL>22P0\M(:"FI<_M#NF5[G7?]3DW0]^OVLV_G8/FH= MF;>?Z67+=%OO6Z?]GFF>'IE#A(&UWY[W.]V>^<M?FCWJ\/WW>,7;Y?2S:?U\ MUFWU>J;3->V3L^,VC4,#=YNG_7:KUS`DS1V?'[5/WS<,C8);(,QQ^Z3=IV;] M3@/?8X_%4D_3>6=.6MW##_1G\VW[N-W_S`"]:_=/\;EW]+VF.6MV^^W#\^-F MUYR==\\Z/1X-\SIJ]PZ/F^V3UA$LT:?T8=/ZB-SGWH?F\7%AGC1289IO6P1B M\^TQC\7?H6D>M;NMPS[FXW\[)*P1=,<-TSMK';;Q2^OG%DVEV?W<T&%[K3^= M4R-ZB=&.FB?-]S2YVCUHH24Y)"7T!``3(GKG;WO]=O^\WS+O.YVC'H:BX4D: M^M@^;/4.S'&GQQ@[[[4:!G%2_'D:A=!%K^GWM^>]-B.N?=IO=;OG9_UVY[2. M@3YT/A%F"-@F]3YB)'=.><Z$I$[W,\8%/G@-&N;3AQ8][P*GC+4F<-$C[!WV M,5K0DKY*^.P'DS6GK??';<+Z80MO.QCH4[O7JM.2M7MHT)8O?VI^YCF>\_2Q M6`2;_!H0;X.7U+3?F>;1QS:`U\9$"+VV$DWG'?M"S@\_*/9U'VS\W]KOZE[` MV/AA>V_?U-[&\R_Q.+ZKFQ<[^\]W^!39@5]MB[N@SV'G['.W_?Y#?V-O>\_4 M3KO'=";]P?P_T70!3J='#SY*K\S5/,+AX[>A9M\\^##!0-7G2>DPL2F(RAXD M2CYD?QA)BL6-4``9T#WLR`G/FW\=.?]=1\ZS;19';."(1)3:_O@`-<3#RUC] M9EIKSF4>%L\)Q@1]9#:.[DHS*5=<>"6B4Y+98P@)L^/%*/:#TKET$X_3F8NB M+<I5&,"+5L3C=%M)'>K2H;C]39^SMP9-L;Z6KC?Z\?!ZFH[3JSMSE-PD$G5V MWC.G$:S"79+EHOGPVAS3XL\C^NC=?:<Z=L?_DN.\Y4_S\"C'#$JG.QY5GNI\ M!NO!_I\[U1DD.=A_ZZF.(98/]H><ZIA?I\LJ0^6!_HVG.09:<Z`_]#3G^:P_ MT!]PFNLH]QSH#SG-2\?TF@-]_6G.1]S##_05ISF?SM]VH%><YAPR<9/$M\*I M:9-R%3!P;FS8B&O\NVK3ZTY(CO_B(I,V<F]!?\YE7(W#T)02#CV=T3$'MI3Q M,<.A"HCLXIQ6VK^(:IFE8_HEIA-<F4W\%2W97C;GFLA)/'('N.5:HG0N,2Z1 M."2B8?-WRBG-C]E=MC,<Q9?9]O6;S<'@W=O>4?NH]NC?W\WCF'Y_9;+Y<`>- MIC'!%^<[7O1IW-")_N+9]O[V'OYO]G=W_[BSM[NS_\+L[KW:VWVU_T?S)>;8 MJFO3^CHS_X[0*O_M1[C9!6-N7S^J>/IR^3%]>Q1?+*[PIC0'#D?"'(J/Z?]Y MQ>,O\7P:CRN;#_.*Y\CH2(<5SR\6E\M/$:-$3SDZ]5*X^7"76#@=^YJDP=EU MI2YYFMU60,0ESE<]OXGFE9.@`VT-+H+G$[X-(MX9SA:`>.>)S1I49]#V=</= M&"M76.S]4*N7:.AFLK.81*6102M)"3EX-J=3*EY^?#.5618?,\4ETZ7F^GQ0 ML;SN[6QEKR6L!>]FPXM5XZWI-WNYXL5PLN+5RYWI:-4;Y`BN^A:]G;Y<#26M MT\H7@\ML!:[<8J]Z*=&.*U^O!I;>KI[+#A=5EE?%'.GJS^C>?U.\/(M[E"C2 MDC4M*.>V,F5]/&TA/)@$@6[+ND.);@=_1YG*)PWQ>UZGXYB?$*O2#N_HO$2U M_8;1>-E,+N:H?,V#3**O&"=;V^AJG%Y$XV]H:MMM_DXNG]GX."B"O+&!(6JE M>03-`_@WM'$XI5++PE2"YL4I5G4J3JW4LS3OU?TKOQNB8G.S][EWV#\>G':. M6K4!D0D?'!B'Y([V$=^R)^O:,-3NW7'S_:#[B2MC/>+@P>;A3SB3=!A>`!*+ MBD,-I+\?+Y[*K<S!B)S`^)C[GS9/6@6LRN>D$-".S1BQ7^=XVG2>\\GX;6!8 M#-X+2'&].`43K1[9&S!]O5H'%3?%35WI;<SU4H.TEM\`:G')'P9PB4P8BP+W M>W[C(F!7@?^;X2P#>70?D&7$*H`K\>K+L[!8`<,*`[NC$FF0Z,-.4KE.>C%+ MI^']W4BM(G$OD0)JIB8>4XB8"0NDUC4+FY&,A4H<=;W3*7?7C><VTIJ^80T8 M'/<@LJ(+X9?V,N]Q52!_PPH-AFM*(C:A^`A1`XB,=04:YF)D(?J'/0#.>G-R MWNO;[,])FLEUG%,N)8SPY<6%)/5*26"-2NY]Z)P?'XED[:>#/Z1Z##VZ0R$I MUJ"C/"C++-D94N8!=2EOT]!V,\%%]IQ15[A^A&.CI?@#9Y,D2$AC>PP<[ON[ M>ZYX?"GF!BLRH%\:7+2"?\W^?-+\6<+VWA[_U/M%$QN(=`9HW>#?N'7#)`C( M0?;\IS#SLIA(O>ES+Z/YU4)OVPWO%--KKX(ELDL#5[A[;'ZTSQ_9PJ!!F+:+ MI5<4NM0U^9:=Z+8,]=H3Q$'P,N;<1_U*D'9U$L^O8B7/42'\G&LW>BRR9H6( M;MHLFL"(UB%I<(\`V[_06CN42KZB7&5\756W6UH%$-B%]4-(V!5'="?\ATF, M+U/K;B4UR=.G%?7";-48#?CY<_++MD63:QB[%-&P&:.L6(U9EQ-+B3`M7FC_ MN%#%5\**7!8I2F%$<ZVDZ*<;9!D&]PG:<8N+K-]U&;46J'"U&S+II<_+@I<^ M7EQL6Z]5UG?#K;`MT&N+-8YD)EP2KY`AJ5EO9:`5(`XL6J):MQ1NA.-^:4)< M]+K86]9+UR>\SLG-MR<4MPK7&P&].D+[I0*JZG:%[WM*E9"I7PN5^,ZE_A)# MP:P?_#,DM%]"@L<,@Z+1*S"Z3&>VBD,_Y!<CR:VTJ33(R"7%$/%&PKP=/T&M M4>EOOV1-N7DZPV9UT)=*M-HY[/Z"X#7M"QP$<^&[*DNW67@VL+3]420^CD>9 M9#"CT(P65QNY#:3WHA87UM<H\(SCS6M38/WUPFKQ/2E:$2/H8\O,69`1X2"V MJ250D7GFORUA>IY@&N9Q`4D6)T%F6K$XI[8DU=_S3U_KTI)TB+V0;3(02U<^ MOW;GG'GJ1PT2THYBI&H:+7/!9_56EHR48A-ORB^)*L-Q'$U94A'I8G7.X4/. MU"K`JYA^83F%XY=I,?';N(*AO]X-YMY4T=`$"P#Q4::*M.ED6'YGGFQ:T93U M/Q8OU\AI)1G-RF=+H^)?EVEIRT,L)B+-OK%7UQ3T#"ZU`3*J5NM*O4K"/M/X MBKC."WLC,4=B:D@>RM(H,3+$Q7AGF42==7U!25ESQI5CIQU[R2*F*</H36/E M#\E7-/XV8,GR-&3`\L1>AJ#M-C?*2&3F'.7I)!DBS0R98[7'U9AK\(54+AA1 MEL91#<RV:RG&9^1:(N$[_Y9II)((0!Z;&XQ([K:,1VY5-47F:#K%;'&!*G'Y M0^99J'=2HCN^&+?RA=0UL7U7TZ",L.HECU).CX7>Y90Y%3"'Z3R^2.D$^);= M*3>-?]/V%`5S:=P(]1+6;]V=@*-$Q3FHS"[[IH)_"#4X&>]A&V3'X<N6`5F- M,Q<'S?-`4H$=M-]L'_^).`!6<=!\UV]U:X_M>BN5<!^A.P)S>(&K]8*;$`HC MX(^E`<H]&?90,N(*.X7+P%S='=S-4T;$B@;&KD3UQNW&$X07>"2QIW<%82UO MXCEW_[9M_-NF*?U73U,0?MKZN5^KQ*Q.U(N_G@2E:[=UTOG8>M@R,;NK&FJ9 MPP$9RIP<TL\DF=P,%Q-<WX(Z,1C&QFPXLXU-!4AMQ5))(P_7QA3`M1)MR:PB M[VKI>,0%Y5+LBQCERR!WQ_-))B$0IG`C%">HUTL2#K.K41KA4N=5:QYF)UL> M(I?I5+.*X8+VT1.4ICQ8,EV(I4S*3+%(]V>-H6>)!^G2OU#?C)K.U(21-,Q? MK?F">R'+Z`'VBT(/E;1\=;_>Z='V^6G3Z7M:THVC27JM]]M<^H,-7)>AQ2W^ M2BN@Y580R63^K`,U;*\Z/+$)0C6D>EE!@'>[HG1G^&(:-2Q*45/C.Z'@ULE9 M_W.)@%47"C%8F&E),-0K)=;U>/K4ZGH"03$/!`5+1E[=$D-AJ!^P7<0/_8N4 M(N4L>;[L*[20C9B!:T=W2;/6LB%YO%!&OIA);K/69/I+=I(PSRHPDMBTHC!' MC8@L*25-U5U9S,=*H#Z;2!.-V%5M44OGSK6D,&T'J5/\MV`R:.!2G`)=U[Z0 MG:!C!%7$PF:!.FQ+0=_3TM%1V.BX>CA_9^'2<'*9RNK/LDUHJ:&K:;R6X+C> M[M!G/EERZ\J9EO@-JO=KN/VIE]*5Z=#H-3^6T$)**G$"O1A'CL_`7-A+5<@( MJ3M+;:&F2HXMYEJ^*("D5KW:+R,]E0N`D()Q;2_(2^5BTL6,]LOSIWLF'NOM M0@CWP]F!TDY2DS?Z4FB)`1'^96N`AN>%3+*\&XK,TN\&;O=7%.D$HSTP?UUN M^U>W<TKD:E=2-,PB"_\K/ZN'28:ZP+[7P1)-)+^4&OVUHM%?0U*QEP2H/6,= MDPQL&ZW)++\KB(FG>EE+$A2+IZZ7@+N&HK\<3R>]%U/?BL-EY(XJ<Y%>+3*I M+%S?-CU/$0R`]*TY%L<H49*R)"K516Q`K-PI<A&/[<5#-?5!C-,KDM0X/I8T MNDP/(BV5DT?)V!F:V=+L`*DOWS1T*0N#5:43M_+T.2C<KH%[S^`-VAJGZ4R` M:_#E)7RG0;A/"C3R2]U5P@[.SII?'@ERFD<(V/3!B"@'B@EE?E=ID:N8-P&D M&S'J\0U:+J#6FXK@1HD0BAIS^**43[5W!W%MU`A7A8_RZRVNN>4#/C,IM,8[ MBEN?ICFN/[F;)7";W36L2TA*Z';[?6>:0N%45QB8I-^KZU@!SZ\A5J9S*:X5 MHLM%W68(^<2RV-*R\[C(P^PZ9"C/.L*'N>QL\2;0T`@JT=+@F5S1UDU=`;L/ MJ!`6YKFV3-@29/!+04XCBGJ\DM>;+9+HN)#G<=&<N4H4NI3S%P/;O.1EZZ^= M2X'_VY13C+!MK.1B-48U_4)`M69?(C6I$A3@%]4J>2>&G]CT?@+!;C1&G6"? MX:J.6"/`LYM0!<M-O>X)&JQ(EZA-JR(\B>1CO=8MJ=YMP1XF<;JL5JOBGP<W ML3$$(?8:6NQ:ZSMBE.\*]]Z7F(/VM69_6KCWJ2O,-8]O4$(X8&?;UM7`W;:6 M715&?16?:.L0PK4VZ&BDQ@-&PT642;6[$)?:+_R4Z7U)9G(0PI1;9JS,([7; M)1H$-?IT!I+%IQ?6\HQ]44VN"";PY?-D4C[I0R"U!RG+>B%@`(;U,#&-8*`L MZ!&,)YY/OI*TYBXG"??1[B_UT)EC<_IYR[TIG)Q0&:QDYL6]=3M*SEF_9E*, M[YZAUXWK_5=KZ<G?"W+?UK<#(O0QDOUM9<#MRE.M\*$=)CA..9#SFKAA'(F4 M5C`@+9F/K*EOG0IF"Y<_DL@;OZ;\00W.Q8V/=V(^+-Z#NV4K=8HVX6^4DATN MWWW7[O;ZRZI?L'5MU>"JRT:4#]&`]H;>L`?WV@C>@J_P7VI7+C5<8:`1!=^U M^W53_[.!6S#M/(Z;2]-H.%,!NVSJ?!F?/QV\[<7*Y?:J!R]YA+L>_#CCR(^& M%=6UMA_Z3$*1&HN?W>(>#9NKM"1*K]MEV`N86X%_%ASG(=]%T\)EQMYM2]/, MY,RN.$-D_I[K.NZTS'M#5V^PE\-")N%M-,<>1!;A&<!J3WH!1(GC_080Q5G@ M@0L)XJS;^EAC"U&!"@HFU^4IW%_7O,:ST8KHX=0PQ#?6.I?-;1M65SJO0&JX M[B6T2@E@MCXX5L3R:'R53/D$49'`GJ<59.77+%2V8(]GCS(AC)9)K9LI:LK" MY1F.:64(&D,4K6]?EXTJ8S'+'S2T-A$BLJ*:)U=6J_C('8\Y-PG<S^DN<G4: MKJAG]I*G*4_#$@+M73W"T<:V=X1F*:U8Q">41("H$QB,A>M:"8QH^];Q?D%) MX(XKRD(;`8EY+<H_;)3)3O35HCBT@A`@JOXG2(!G%HS!7OOEB8EQ*B17F5CX MJ:7YA)\JHJ!\=Y[4T2EAW:X5<Q0N,<]LA0["23)"_58N0\I>#"[N:=O#K@CQ MN,!U"FM]CT@<X$RZT8^=$$^M[B=?(1<7+"`A4LK'*K<M':>^_8%]OY;U:".` M^/2U@*/]@S=;X2FMP`O*[UG>;UC?>Q98/_=K8(RYCS<_O8<W.[V.B_=>%<`7 MB2G+@SYZA_<BLS>!;.KM4=\C2Q,G?*!;.]9C*_;BB64:)JAR!`7_UGD!6%#0 M+FR<+L;>W,_V?].A9R_.\$?YKR5_/!AG8%#!)5?$09:M@@4/#YQ6;G]DU1$L M2RZ<OSTDG$5EI=K?'BJU;JX^/_YFXV/64))6O5WIR'^]RI'_>LF1O];Y"G:A MHZQJ4G3HG]&B(\^.J0M%J4''($.N7<U$9XU$)IXE63J"^/03":)RF3SI-GB' MH3(.$6;E<,HWWG^"KA#Q86D_D7@;HE1R%_,EWP'"]<'8*BG^OR@72P2'X*NA M8ZHF-%>P?)K*7?1\N\"^OT08QI%-/I8A3D<P<;EKZ[(A"=>QO;0^0D5C"8J. MU(#"-ZV+,TAGT[`NR:N49I(P`4-F!',/(&-K()>.EPM&V3!GH@DN\L1AH<>' M'8Q.$1]K[O!<Y>94'-[GZ[P>S>G1M0OM8GM6S!<7[STHRNN^:UQV+:V'U[N* M>]+T^!`7]N-7PAL?KFD5)XOA-1M/&!-R-\F7.`A_J-F[%8&1K:(/9Z=P24S= MH#3^I@8,RB3W#S;+]\K<)S@_586X<.6/BTS#O0``M6ZC\_"=)T4X#HI!8?S= M-P[R+(/5,KMV\0+%*V_")@>;%==SRA41]*H&BJBSR*"WE.4SV<ERQ8,-%[Q8 M7+G+NB&B6A+23G7=6='X2U;FOL:<ZPVSO'6PZ^`AG:(P`5_)J-987*WQH!@? M_:ADK550+FCT26E-\FJV/GL(_2Z-I=2I++[#U['49C;R,U#K]3`KZ,7'_=K, MR1NS@K11V:1PY:WY#]H2Z7@4F&PJY7S\LPPV)(^9ESN*DE-8>?';^O[J"_@) M[=@+0VT`#MYE3E>Q^DQX0X0-#/&>BZ(]GR'APBO.@102V"=H,6#8*&]?^M#2 MT)MLJ%P:'6$*(,+,U")Q\*<3HC)6])%[KMZ.\9WD"V$!=F`*5Q\K![+4G:T3 MVRH++6'JW$&I$&^%#7/EV<;-=Z+R^62=0>9)E'.^CKA]0$_TD0_4[GM!J<U& MH:?O9(OE=C0YTF08?Y[M\2#6C(%+I>30+:Y.$4LL#,H%<E,U"1?-B'NTL4=A M"9/`/,(Y4XE-Y:FI+,V!G$#8VT4NJ="0YD0^J1R&Q^`CLZ;ZZ&LC2D?#WY/, M4,'@>%>XQ3L/G&J3;47YG#'0*'C1BOA25#G'H_?YV8L7!%'+)M75V`A149P' M_8+!/%J$J9)$\;V]*:<1].&TD$D<3=70;ST`!7$@T@7%-49RA1$?C0V?PR5W M3S,+1L/;TGVW(I*.5NT]Y=CWL.K_')-6\ZH-@/PM['K]<7W@@S2K9-R*N$R7 M!B2Q>(Y9NSAE?\D/82!0#>Z+Y:M7&U/7?"=P6E78I!7^<F%=N7+0<NUR]%Z3 MHT4C>SEEPP>!<+R=5M<A$E@DXSQ,(`HS!UAX=[>DV%(\S!C#C6G]YNJTM:/9 M-$VF8MV360D.OFR/'2=6Q/+?8Z)UQJP*V3<:P9W^0.V/Z/5)J+Y6JG4/H4VL M)P]4#N]EF_]IJOPO=`7#1!&(D47/9KTTPB?6^J,Q+?;HSAK3<3V:HE@-]^), MV)++NY":&65Z:XOP!#![O0S06@#T\U+H.*D[E(^3&)PEOP6S4(,;&*`[>PL6 M7;T#40:Y9Q1.]W'#V!D7W1*U67$SB4GAWKU4P*>W^6"?V"BHC=4+,*LP:\RL MP:+H0\;<7KL.!\4/^,"=>\%RG8H#AZ3PKZ+)__KYU\^_?OZI/_\_!,1;;0`* "`0`` ` end ----- End forwarded message -----
I found a small oversight (bug) in my earlier simple fix. If we had sent out multiple holes already, all of which get (partially) lost in the retransmission again, the original simple patch would only work for the very first hole. So, subsequent holes would not get re-sent, unless another ACK (SACK) would be received - however, seeing more SACKs becomes less likely the more loss is expirienced. This is a updated patch diff, which accounts for that case as well - but at the cost of O(n) time, instead of O(c). (Just check all holes from the hint backwards to the head, if any already fully resent hole needs to be reset, instead of only the first one - which might go away during subsequent processing in the original patch). diff -u netinet.orig/tcp_output.c netinet/tcp_output.c --- netinet.orig/tcp_output.c 2009-10-25 02:10:29.000000000 +0100 +++ netinet/tcp_output.c 2010-04-02 16:55:14.000000000 +0200 @@ -953,6 +953,10 @@ } else { th->th_seq =3D htonl(p->rxmit); p->rxmit +=3D len; + /* lost again detection */ + if (SEQ_GEQ(p->rxmit, p->end)) { + p->rxmit =3D tp->snd_nxt; + } tp->sackhint.sack_bytes_rexmit +=3D len; } th->th_ack =3D htonl(tp->rcv_nxt); diff -u netinet.orig/tcp_sack.c netinet.simple_mod/tcp_sack.c --- netinet.orig/tcp_sack.c 2009-10-25 02:10:29.000000000 +0100 +++ netinet/tcp_sack.c 2010-04-21 00:48:23.000000000 +0200 @@ -508,7 +508,9 @@ if (SEQ_GEQ(sblkp->end, cur->end)) { /* Move end of hole backward. */ cur->end =3D sblkp->start; - cur->rxmit =3D SEQ_MIN(cur->rxmit, cur->end); + if (SEQ_GEQ(cur->rxmit, cur->end)) { + cur->rxmit =3D tp->snd_nxt; + } } else { /* * ACKs some data in middle of a hole; need @@ -524,8 +526,9 @@ - temp->start); } cur->end =3D sblkp->start; - cur->rxmit =3D = SEQ_MIN(cur->rxmit, - cur->end); + if (SEQ_GEQ(cur->rxmit, cur->end)) { + cur->rxmit =3D tp->snd_nxt; + } } } } @@ -540,6 +543,15 @@ else sblkp--; } + /* retransmission lost again - then restart */ + if ((temp =3D tp->sackhint.nexthole) !=3D NULL) { + do { + if (SEQ_GT(tp->snd_fack, temp->rxmit)) { + temp->rxmit =3D temp->start; + tp->sackhint.nexthole =3D temp; + } + } while ((temp =3D TAILQ_PREV(temp, sackhole_head, scblink)) !=3D NULL); + } } /* Richard Scheffenegger =20
Responsible Changed From-To: freebsd-net->andre Take over.
This might still be true but I am not quite sure. i.e. dropping the same segment twice resulting in RTO. If thats still the case, it'd be nice to resurrect this patch.
batch change: For bugs that match the following - Status Is In progress AND - Untouched since 2018-01-01. AND - Affects Base System OR Documentation DO: Reset to open status. Note: I did a quick pass but if you are getting this email it might be worthwhile to double check to see if this bug ought to be closed.
LRD is implicitly performed by RACK. LRD is not formally specified in any IETF standard. This constitues a new functionality, but as long as simple RTO fall-back loss recovery is sufficient, I don't see support to commit this mechanism.
Feature added with D28931