From c56da284b309fed41015f38e1dbc1043736d0236 Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Fri, 17 Dec 2010 21:07:57 -0800 Subject: [PATCH] Update TCP regression tests --- src/routing/aodv/test/tcp-chain-test-0-0.pcap | Bin 59968 -> 38460 bytes src/routing/aodv/test/tcp-chain-test-9-0.pcap | Bin 29392 -> 20308 bytes src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc | 44 +++++++++--------- .../ns3tcp-interop-response-vectors.pcap | Bin 3696 -> 3660 bytes 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/routing/aodv/test/tcp-chain-test-0-0.pcap b/src/routing/aodv/test/tcp-chain-test-0-0.pcap index cd9dd905b1c4b1815b974c1bc7b42162f361c457..747cee0e65e8ec950bc969461a8bee6106a02b30 100644 GIT binary patch delta 1614 zcmZXUe@v8h9LJyM`+4rJ^X>*l%tH>I<0SvG6C@Q*I4=ajEwFA7!+(SVDd(KwMmbzT zC~Yu}yH7bcZ7Q-fCLnv-vS*f*xzJG&9bj%YaJewY2576Lqdw2)MhC^lzVFZX^Xv8b zKKK0&MBwrT(cuDjsf2Q!8tU|0B>H>d8JSEc<_Sy4?+;BxteGn%DL|e8E;l9NnCyk# zWC=q>$s*vwlZqP)gxC7AYayt*KMCI#UWiMPa5660dOJmu$|$`IXUA3|z(%`eo=i!m z|LGK*Fu6oQD%D8}{cXWR;I&q&3#Deqk}v{Z@tVqE(<;uJ+?cQUpxe#GMPV9cmO_Fj z3UtSV%S=1q*d{h1J6FQ$E)}~>K2e;@HIC&{jU5ooi{@APDZ#BBHwR46^SUsmg6;K! zvz&Gx>?A#DN`@X8!#w))qGNz`@1``Bl&3puxycGWQoSC84 zWa`lNfCEJ2A%2l{3)ZJvxbHZv#y9$8y$^mRZJhQ=Z`9{sYxvw)vLOdbNgGUE8_XtX zTWe*efS*2x=~>O~uNTm^(P|LL54HZlegPLYS-JOofey>_*aa#1Rz8qF3w4;b0WT#=|!svhna` zK^i{iu#Eu*%XFA)rKDd}G;~c{OkZ!0CMF!QG1yn-I%L0RV=zOTyKH<)=V|@nYd3!W zQVv`qZJg44Z`60X&&H%>6+UsXPwS}Y6|nV+gCUD|5=h@w2Y)m+^ua~O<{<}jfBe0J zxo=fdc;2vsxl3#4mo!3kh}+Pek(joOMH62fcQAKxtq$9MauBy0x7B_IyB|52+y2jezmk$B#}4g|%rlKYZW zLl`vz2b!E3@9m%Y-yYcKB%by0+dA04kqst!7$3B(!acQNEnqn=W5;dO4YUV)x$mQaoF6kDBf`1KT1yOQy%6E z7e6ezyMa#f38_#L0m+3`&Zm}?!<$_mnV!Aye`uaR7r-}L?D*CP&L#2khd6mJEk1rx XT`5CK#f-Xj;`YKf6f*)(-^=|6%#Ahy literal 59968 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 Lh{V_7+1K%ZSxrt= diff --git a/src/routing/aodv/test/tcp-chain-test-9-0.pcap b/src/routing/aodv/test/tcp-chain-test-9-0.pcap index bd2dbc84f364bffb2fb92eb2880f9653dfc45387..376b494f3ccd07025ee396d71ee40c98df7cba98 100644 GIT binary patch delta 1456 zcmZ8geQXnD7{7a;uD4r1*437*YuD>WJGMqTHoF#%Lb`772gb&YsarKLiP4~o8F7Aw z2%;qD66bgXalyfqz#LIYE>Tkn3`I1Hf>vT8Tih@@2}qp&K{O%L=Y216j!Q1j_wV<6 z-uLdCU*wC!@@oOMV#{D~3+((v!U3x``1W3yv`TnpiJuKA7)yq*PmZyZ3O-NnSvdw< zizOTh`{k#wjCI|n%uDph^q#g!QU}=%+}7s9{Vc;S*l-2{Y}$_Fi4c}UOufBSlG4Gds#|$-paap$8@!OkF*Vc%mqTM?h!W8wJHgBhEvX1>=~tWaSu6LnXWs zm$2EX;gm&(jwYcQmL??p!=vH7MLK-fVxm3SN@zK@yHy}v+%y;r;Rb7lABZtv?FZ0% zm>5cx=x}I|iK9{Xp-TxFAC|N;@a3Pu_Nj0|66zek6UKBH9F&(5F4 zIZqBU=PdX_N<)`dhx#uT{3~CZaE%u%LddK)4;k`Fh;eF36kx5SU~@Kvwu)7-KBx%p z6IBX+`)J76UD3v1oC3bm!H8L$tx*J0yfP0r$mg}zWduUPVnH3GT7?UPx;pCfXvS!e zwt8oyDv%xbsbZ@_6>U{X0iS-1ET4WTtg~gEcsLw@LZ>Ru`NyyhUv{autt*7n;Z^WM zZowbiEHK$*H_k;a!L@FIW?ZSEt-P<>#C$xeL+P+ha6da@6Ws4diTh;=ICu1@S?oJT z19VZFmeWO%&uay;TvumIhk;R>*sA|s0c;dvwAGPWhd_2-bqM5}4TKz|fKT_3<Y;4Y>v`q=C%X@P1Ahzxqk{sS65uv*1qdW1cp;(0v_FREsFO^Gb_YtPi; z@ESM#O)fsrvuIyIubeVWeD4vR>b! zv^Qu9J-3#GMkwGyE2~YGN0t%`omgjc9-bzj*FGo9Z=tru0kx77d!6O@T*eK%!lv5e z5mVV$nNrz_A+K2t{%j)d`Bl*2SW6g>HtjWfl>;)S+bwW_3LL&I3jBC+PfIoC)-P_t zo9lw`%&1kI|4+xsDw-<<3-`s+QUGU)Jd2_Kq)vjyl^fHT+F-}-JIfa};KV%@{{p82 Bx=a87 literal 29392 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 IS0^3$zXU3I?*IS* diff --git a/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc b/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc index 2feb00b0b..4d97de635 100644 --- a/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc +++ b/src/test/ns3tcp/ns3tcp-cwnd-test-suite.cc @@ -507,17 +507,23 @@ Ns3TcpCwndTestCase2::DoRun (void) // the congestion window as it opens up when the ns-3 TCP under test // transmits its bits // - // From inspecting the results, we know that we should see 31 congestion - // window change events. On the tenth change event, the window should go back - // to one segment due to 3 dup acks. It should then slow start again for - // 4 events and then enter congestion avoidance. On change event 30 - // (29 zero-based indexing), it should go back to one segment, because of triple dup ack. + // From inspecting the results, we know that we should see 43 congestion + // window change events. On the ninth change event, the window should + // be cut from 5360 to 4288 due to 3 dup acks (NewReno behavior is to + // cut in half, and then add 3 segments (5360/2 + 3*536 = 4288) + // It should then increment cwnd by one segment per ack throughout + // the fast recovery phase. The trace shows that three segments are lost + // within the fast recovery window (with sequence numbers starting at + // 9113, 10721, and 12329). This last segment (12329) is not recovered + // by a fast retransmit and consequently, a coarse timeout is taken and + // cwnd is reset to MSS at event index 31. It slow starts again, and takes + // another fast retransmit at index 41. // const uint32_t MSS = 536; CwndEvent event; - NS_TEST_ASSERT_MSG_EQ (m_responses.GetN (), 31, "Unexpected number of cwnd change events"); + NS_TEST_ASSERT_MSG_EQ (m_responses.GetN (), 43, "Unexpected number of cwnd change events"); for (uint32_t i = 0, from = MSS, to = MSS * 2; i < 9; ++i, from += MSS, to += MSS) { @@ -526,35 +532,29 @@ Ns3TcpCwndTestCase2::DoRun (void) NS_TEST_ASSERT_MSG_EQ (event.m_newCwnd, to, "Wrong new cwnd value in cwnd change event " << i); } - // Cwnd should be back to MSS + // Cwnd should be back to (10/2 + 3) = 8*MSS event = m_responses.Get (9); - NS_TEST_ASSERT_MSG_EQ (event.m_newCwnd, MSS, "Wrong new cwnd value in cwnd change event " << 9); + NS_TEST_ASSERT_MSG_EQ (event.m_newCwnd, 8*MSS, "Wrong new cwnd value in cwnd change event " << 9); - // Another round of slow start - for (uint32_t i = 10, from = MSS, to = MSS * 2; i < 14; ++i, from += MSS, to += MSS) + // Fast recovery + for (uint32_t i = 10, from = 8*MSS, to = 9 * MSS; i < 31; ++i, from += MSS, to += MSS) { event = m_responses.Get (i); NS_TEST_ASSERT_MSG_EQ (event.m_oldCwnd, from, "Wrong old cwnd value in cwnd change event " << i); NS_TEST_ASSERT_MSG_EQ (event.m_newCwnd, to, "Wrong new cwnd value in cwnd change event " << i); } - // Congestion Avoidance - double adder; - uint32_t from = 2680; - for (uint32_t i = 14; i < 29; ++i) + // Slow start again after coarse timeout + for (uint32_t i = 32, from = MSS, to = MSS * 2; i < 41; ++i, from += MSS, to += MSS) { event = m_responses.Get (i); NS_TEST_ASSERT_MSG_EQ (event.m_oldCwnd, from, "Wrong old cwnd value in cwnd change event " << i); - adder = ((double) MSS * MSS) / event.m_oldCwnd; - adder += event.m_oldCwnd; - from = static_cast (adder); - NS_TEST_ASSERT_MSG_EQ (event.m_newCwnd, static_cast (adder), "Wrong new cwnd value in cwnd change event " - << i); + NS_TEST_ASSERT_MSG_EQ (event.m_newCwnd, to, "Wrong new cwnd value in cwnd change event " << i); } - // Cwnd should be back to MSS - event = m_responses.Get (29); - NS_TEST_ASSERT_MSG_EQ (event.m_newCwnd, MSS, "Wrong new cwnd value in cwnd change event " << 29); + // Fast retransmit again; cwnd should be back to 8*MSS + event = m_responses.Get (41); + NS_TEST_ASSERT_MSG_EQ (event.m_newCwnd, 8*MSS, "Wrong new cwnd value in cwnd change event " << 41); return GetErrorStatus (); } diff --git a/src/test/ns3tcp/ns3tcp-interop-response-vectors.pcap b/src/test/ns3tcp/ns3tcp-interop-response-vectors.pcap index 12fe86e356beedb9e646f30f203d1dd71caa33dc..40fc5cebbd8666e8ef6a7c2c3ea11b40a08442c9 100644 GIT binary patch literal 3660 zcmZ|SPl%2|0LSs?dH0Wfjm3(CgXEw!SqI6%K{(jjCbbR@QXCw%2}zPR$xf0q2}zQ) zZIYfOElHB3ZIdQRNRqTkdXlsU2M4X^rG53YUr$XlhfnkTYU+7@^J?t&NG)s4rk{<~ zVsc`pvIB8q$ZNN zq9&0UQDa&m&owoUOra){xv3_R8C7H2AkSSjj?8^Ek<3FiiOgd)rXBK(t8rwWs)=Nt zsYzsBs4=r3&ucY~%v&{)%zHJ7%!C@#0eL>Dab!w0k<3>$iOi%LQ-?g?)i^Rg)I>5r z)g&+>S7T<+%oEzwI5KrLkxZwWM5arPF_34G8b@Zann-4ennY%q8Z!s-ELY>mST&K% zDm97BYBi=4@~l0j s3tb|-Q{%~eP*afksHPLikZ_R88D65Hq2cY`;C<=IZx;^d3?H};T<-5YU+bSg zR-%rm^*k;P-@knsjf;J-JBn@=d$|VQe|lYPQ9M6c8@thLmgh>b-q{N#j_2+0*!91R zCo`ockeOCv;(zlL@0w9#$;_(pWaiWaG7D-<1@bJav1FFicrwds0+|&xrV4ph)mSoX zYCM^BHG#~A8q)!JHq}@%UX3TSr6!QsR%0$fo*gxo%&rN8Bi0*+)-n$K%SZ!OU9`2 zWFDvqWCqoktB_|%jV1F)jVCj#CXg9XW3EA-Cu%I2XKFl|=V}6(7ivr&@8>J=s4Yjjkfs>|D2f{