From 75f7aa377bb030ed5e19fd6b66032864af178906 Mon Sep 17 00:00:00 2001 From: Stefano Avallone Date: Mon, 6 Jan 2020 23:25:14 +0100 Subject: [PATCH] wifi: Improve DCF/EDCA behavior when a packet is queued for transmission --- examples/wireless/examples-to-run.py | 4 +- .../test/aodv-chain-regression-test-0-0.pcap | Bin 1448 -> 1448 bytes .../test/aodv-chain-regression-test-1-0.pcap | Bin 1024 -> 1024 bytes .../test/aodv-chain-regression-test-2-0.pcap | Bin 1024 -> 1024 bytes src/aodv/test/bug-606-test-0-0.pcap | Bin 1448 -> 1448 bytes src/aodv/test/bug-606-test-1-0.pcap | Bin 1024 -> 1024 bytes src/aodv/test/bug-606-test-2-0.pcap | Bin 1024 -> 1024 bytes .../hwmp-proactive-regression-test-0-1.pcap | Bin 784 -> 784 bytes .../hwmp-proactive-regression-test-1-1.pcap | Bin 784 -> 784 bytes .../hwmp-proactive-regression-test-2-1.pcap | Bin 1039 -> 1039 bytes .../hwmp-proactive-regression-test-3-1.pcap | Bin 860 -> 860 bytes .../hwmp-proactive-regression-test-4-1.pcap | Bin 1142 -> 1142 bytes .../hwmp-reactive-regression-test-0-1.pcap | Bin 1544 -> 1544 bytes .../hwmp-reactive-regression-test-1-1.pcap | Bin 1544 -> 1544 bytes .../hwmp-reactive-regression-test-2-1.pcap | Bin 1544 -> 1544 bytes .../hwmp-reactive-regression-test-3-1.pcap | Bin 1544 -> 1544 bytes .../hwmp-reactive-regression-test-4-1.pcap | Bin 1544 -> 1544 bytes .../hwmp-reactive-regression-test-5-1.pcap | Bin 1920 -> 1920 bytes .../hwmp-simplest-regression-test-0-1.pcap | Bin 77637 -> 77637 bytes .../hwmp-simplest-regression-test-1-1.pcap | Bin 81416 -> 81416 bytes ...hwmp-target-flags-regression-test-0-1.pcap | Bin 1066 -> 1066 bytes ...hwmp-target-flags-regression-test-1-1.pcap | Bin 1066 -> 1066 bytes ...hwmp-target-flags-regression-test-2-1.pcap | Bin 1066 -> 1066 bytes ...hwmp-target-flags-regression-test-3-1.pcap | Bin 860 -> 860 bytes .../test/dot11s/pmp-regression-test-0-1.pcap | Bin 771 -> 771 bytes .../test/dot11s/pmp-regression-test-1-1.pcap | Bin 771 -> 771 bytes src/wifi/model/channel-access-manager.cc | 32 --- src/wifi/model/qos-txop.cc | 8 + src/wifi/model/qos-txop.h | 6 + src/wifi/model/txop.cc | 50 ++++ src/wifi/model/txop.h | 9 + src/wifi/test/channel-access-manager-test.cc | 216 +++++++++--------- src/wifi/test/inter-bss-test-suite.cc | 4 +- src/wifi/test/wifi-test.cc | 18 +- 34 files changed, 193 insertions(+), 154 deletions(-) diff --git a/examples/wireless/examples-to-run.py b/examples/wireless/examples-to-run.py index 538fc9383..b32adbd4a 100755 --- a/examples/wireless/examples-to-run.py +++ b/examples/wireless/examples-to-run.py @@ -42,13 +42,13 @@ cpp_examples = [ ("wifi-ht-network --simulationTime=0.2 --frequency=2.4 --useRts=0 --minExpectedThroughput=5 --maxExpectedThroughput=132", "True", "True"), ("wifi-ht-network --simulationTime=0.2 --frequency=2.4 --useRts=1 --minExpectedThroughput=5 --maxExpectedThroughput=127", "True", "True"), ("wifi-vht-network --simulationTime=0.2 --useRts=0 --minExpectedThroughput=5 --maxExpectedThroughput=562", "True", "True"), - ("wifi-vht-network --simulationTime=0.2 --useRts=1 --minExpectedThroughput=5 --maxExpectedThroughput=520", "True", "True"), + ("wifi-vht-network --simulationTime=0.2 --useRts=1 --minExpectedThroughput=5 --maxExpectedThroughput=524", "True", "True"), ("wifi-he-network --simulationTime=0.25 --frequency=5 --useRts=0 --minExpectedThroughput=6 --maxExpectedThroughput=844", "True", "True"), ("wifi-he-network --simulationTime=0.3 --frequency=5 --useRts=0 --useExtendedBlockAck=1 --minExpectedThroughput=6 --maxExpectedThroughput=1033", "True", "True"), ("wifi-he-network --simulationTime=0.3 --frequency=5 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=745", "True", "True"), ("wifi-he-network --simulationTime=0.25 --frequency=2.4 --useRts=0 --minExpectedThroughput=6 --maxExpectedThroughput=238", "True", "True"), ("wifi-he-network --simulationTime=0.3 --frequency=2.4 --useRts=1 --minExpectedThroughput=6 --maxExpectedThroughput=223", "True", "True"), - ("wifi-simple-ht-hidden-stations --simulationTime=1.5 --enableRts=0 --nMpdus=32 --minExpectedThroughput=59 --maxExpectedThroughput=60", "True", "True"), + ("wifi-simple-ht-hidden-stations --simulationTime=1.5 --enableRts=0 --nMpdus=32 --minExpectedThroughput=52 --maxExpectedThroughput=53", "True", "True"), ("wifi-simple-ht-hidden-stations --simulationTime=1 --enableRts=1 --nMpdus=32 --minExpectedThroughput=57 --maxExpectedThroughput=58", "True", "True"), ("wifi-mixed-network --simulationTime=1", "True", "True"), ("wifi-aggregation --simulationTime=1 --verifyResults=1", "True", "True"), diff --git a/src/aodv/test/aodv-chain-regression-test-0-0.pcap b/src/aodv/test/aodv-chain-regression-test-0-0.pcap index dd4d381abad4b1cbe7b3620761acd0f96482792d..9c8c800479b0eaf59174e4c5656618c4a4ba4a07 100644 GIT binary patch delta 26 icmZ3%y@Gqg4o2o(8q5>rr| diff --git a/src/aodv/test/aodv-chain-regression-test-2-0.pcap b/src/aodv/test/aodv-chain-regression-test-2-0.pcap index aa61bb29d714747fac994f38b86ad349121d4e1d..0ee28de79f4ddc43a9eac734f3bbfbe77d064174 100644 GIT binary patch delta 12 TcmZqRXyBO8z*w}gv7Q+K8#Dw+ delta 14 VcmZqRXyBO8Fu8QSK2l02vblxBvhE delta 13 UcmZqRXyBM2Gx3SiM!Q4I03oXd2mk;8 diff --git a/src/aodv/test/bug-606-test-2-0.pcap b/src/aodv/test/bug-606-test-2-0.pcap index 855705acf3b6af0e8c5b4a61a3da5029352d7b8c..d364a162f3fbb400edf4ba754c08e3227b06aeb6 100644 GIT binary patch delta 12 TcmZqRXyBO8z-Y9wv7Q+K8T14Q delta 12 TcmZqRXyBO8z$mb>v7Q+K8A=1@ diff --git a/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap b/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap index 4177b5e964cbff4ff791bc64a95d6ea783dfc050..cc158a14c1af5755df75c003a1754ee3f067b974 100644 GIT binary patch delta 87 zcmbQhHi2z|3}f;{S#Rd%3mg;W diff --git a/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap b/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap index 9727e56b43dd72408d32746eebbbdb85d14cd693..cfba7e3332aeb6f6699feefebb60914b61f3690b 100644 GIT binary patch delta 85 zcmbQhHi2z|4C9)KvfhkmCNnZBPVCZRS~F#$oWjIwT3``x#x;|D8NHd$lyXdzm!G_g a5h(u$C_kBv38cV~38bKw39jH3lNtcB_Z#Q{ delta 85 zcmbQhHi2z|4CCa9vfhlFCo?iCPVCZRnmlEqoWjIwT3``x#>ta?8NHb|mvT&$m!G_g a5h(u$C_kBv38cV~38bKw39jH3lNtbr%^L0i diff --git a/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap b/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap index 321308af8dfb724884be0ede4230a41a651dd8ae..6f08dadddcf96a41f51edc534b0a6e5201a956fe 100644 GIT binary patch delta 118 zcmeC@=;xSF$m}?cVe&*K`H7RYm=n`Ez|8wv%#Q28qLZ~5;lh*48S9xH-$BGBn1JH@ o!OAD6FljM5PVQ&&W=>oW5%~j@b$kU;>A_sjoVXbx{*qY@0CJWjmjD0& delta 118 zcmeC@=;xSF$gDAqVe&*K`H7RYm_5=tz|8wv%o^*!qLZ~5;lh*48S9xf-a*7An1JH@ o!OAD6FljMrOzvm$X7*SQ5%~j@)p!L_>A_sj?6Dal{*qY@05^dnod5s; diff --git a/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap b/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap index dcb7d561b3256b9739e26fa5b9b03cb4cf5f5c35..c564399a4288853f56aaa7d643483d49faf12cac 100644 GIT binary patch delta 98 zcmcb^c86_(45QjaS#M^ysq7QwunIF~H2_Rl8b$yB delta 98 zcmcb^c86_(3?uJES#M_Dsq7QwunIF~H2@Tq88ZL? diff --git a/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap b/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap index 6d1badc344e5d47fc5b38efd0d4bcf024ce4e16e..b9f4ac7c839e5700f5cc58cdc833cbd6111f1df7 100644 GIT binary patch delta 113 zcmeyy@r`4G40DS;!{muf@)PZ}n3k-VJb_7JVwV>45m|n);59AAC6gH$y_t`^`WWXK@DrknAPC delta 113 zcmeyy@r`4G40EjJGlDfvj$#HHX96;A@-pTQ#?_PcS=<3t4EM|l!^HJ}qMR4A))kJ4^70eAw7`6YiPy9kwI(w%dNXk;PxfO3%HIIVPu|6- z#mvRc2x77^fs`0B0hOGeT*m}dG6$^W6%$a2K3ItvGe}7yGf;`~EM|l!}RgrL^&^J!7CgS<>e=KX@U6)6R&A83QlHZ^k({~G}(_4D1QSaKY16U z7V}3gMi7&Y38ci338>`Ue){fDQ3t1*+HvQZbDcq~ai}I{*$3Hnac$ diff --git a/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap b/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap index 9f37af638f41612e909b2eae1b7448422990f350..f9e74626c1697341bcf60feee140750d6184e4f2 100644 GIT binary patch delta 168 zcmeC+>EM|l!?rAo;b-Koe}hCP=XW6&wdC jNMivhn8*TBaF+$BUEM|l!`L}d)|+|d0*;CD@)NtXKwQO%*R&W{PG)5EX6&5o%LtU60Fs@&i&2ZY zlbsR7WMcxUFk}L$s0ETB)ryl}F=;V%{+}qPFxiY5B%jC(l3&XVG{FXJf)oo-!Eum+ iG!~G8i7X%mcUgc6rhpZAu>!5&2U{_X6{O-It2+SQ=ra=l diff --git a/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap b/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap index 0ee9a588da9b9a7fea81f349db836fa943a5acf7..6e96c4a4d2f74568e3c6d02b1806b07b215b53cf 100644 GIT binary patch delta 192 zcmeC+>EM|l!}xiktT(f8G{;1F`H5XxAgL8KHN{m3E$-az0CEQ?vU5r{x zpIax&DNJT#0;*C53kETPRMj#8Rq=xbUNON`nK1)Z*@Fd}m_e%6G6Pjrg9W5mfU5R_ m%t~W{tJ=f@QgxRFsLC9y%8M1Kst}}V8Y@s0Gg$Bus~P}tSvCa# delta 192 zcmeC+>EM|l!+2|=tT*$oD2|Ep@)NtXKwQO%*R+^_sewc$D=`9vCi^l1m2iOtb}?!( z-D;gEr!bj~38+d5EEvQDQdP?YRK*7tc*O)$WyTCtWd{~)Vg{*N%M4Ui1s0HE0jk;y mGAoS*u4)qtNYz~ypei%4Dlb-`szQ*eX{EM|l!^B)RQO=85S(~W# s1*qZ`NJSb8NX0}Jpo(vk@38EM|l!}O|jqMR2qmo(=@dHIQ5T1>A3C(0>Iyr#v-HJOpoo9UJ1WIslr{AUiJ z{N!DXKn1Qq1(VsBKq?HGfGVa=u44kK5C)kr`4tmT#X^t@GiH#AL}svxb<98&*h diff --git a/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap b/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap index 23258feee39bbf3b74a3b4ebdde37166b4543b64..d9287df305d77983d73d51d8ffac3f118fbe27a1 100644 GIT binary patch delta 169 zcmeC+>EM|l!#H`OtT*#!9gd0e@)NtXm?qaxlv9{^O^b2!WJX4B#>ta?8G+Jo*n!fM zcQFFx-GTCx*_c2I44FU*YMI~)UNHd`1cMZqF@qE&GJ_PXWdJ9+4VKsCB delta 169 zcmeC+>EM|l!&o&@)|+{j4#z}!`H5XxOjY$0TKz$Qqs02Mfc6r{0$ h6ij3RDY(l5RImZ8z>8Ijd6z0b$hK*$AQcB$-2n|AGk^d9 diff --git a/src/mesh/test/dot11s/hwmp-reactive-regression-test-5-1.pcap b/src/mesh/test/dot11s/hwmp-reactive-regression-test-5-1.pcap index a06a13dd5084506eb5046540ccd4cc5d32a10a1e..5614e77ede94feea07df4d580bb13c49fb9bff82 100644 GIT binary patch delta 180 zcmW;EtqKA`6hL9;S1oQ7L3ekG;JnC&c>~`<1oLe!qTuCL!)){oELyB~i_t1}lXs>b zJ`NO69H#apjY;p72@I}=!6^f8y@Go$*^TuqI-A7Dve;*_?9cyx CkvTE| delta 180 zcmZqRZ{VLG!bS(2$8Eb0wbp*We3xq~TPe4?DfdFRbZ1Qv#@jk74@C6SxEFsQB7$@3HgsxOt`Nhq#$1{y~;UVG~KCfDCp#JUfmKPI{UNCYgc|DX^aL_eg# zESwHS>{lHK1Ct{?^m+-Kp^#nwwzIa3FCGhioXpY^4|%?X`y!UzQMuGwXuYPQFU^m& zEEj69fF4zJO(?`9$!$?cqkZ`#akdzikjR>)qMq*543EMIX zZ;dQsyGPO1Qd#V1?1)^z4vwaMrLylcae9momkbbW;23p3qYxq5i!-7MVv6Q?Jab8L zF3ug`#h0U|vW0Whn#v+tvw*!{go~ovSn^FIb&>7ckLd&3nDK@se8uL|W1YC*_=yYtq zMzGE-obYrqK9Vkt+|xQ-;}dMeH!3{MFO8Ku2CCHs8G=>r#9ix>F`OZd!}rCiurX4w z_DZa%PsY6?r4gDmh{8VHKPtd_CgTJo?a|W6zc2{5&GO;nnE}>!L4~J{kw)F?ak%t) zAI{1Ou)@8#YZGZ_Nuz7!U>x%cA4X&cSVJ{dJWJZyr0wzGmp731xBzPgt1|JC9MaxT z;cL^eX1rj1`>k-4K}Wv40LyY+hP!j)!KkYR^_9=_1Qhb)vEaqP1bXg`OodZ6FCTt_sMFMIxkg~;+E$PM~+eq~` z!8*IO`$qguvX(}yZ}wqUnSc@exYv>`lMsc)+e!9z0hL^&fH%@QukL$??r_KrzmpDI z%4eieA`6!YXve&#y}`((TNvwom76|7(Q&tcG7A~5E|)NyS7*@Lx_bl!ae2KLuUjUm zlxB>y1n#ACVIF!h^7oQ;*(hU|Q*COL2bN37)+jqFr~(zr)%QuL(kSaHss3>Jv!r@I zInzTVH~4VQ0|6HDD6d8SfgECy+~~tWD*`NEleEUgd*Md8eOOhBT>dFn9>hK2K+8cL*Z%U`@ z;!k54Y2dw^O?J`~obcSIaK(trecnY@ z{XFeBlaSH;uyK{YXnChNV6sjdRkpB(wd|HX#U=71QWK;*q@O}ACA=Gp1?W9JT` z((T2yJ0;^GJ~NH{gu8^5bZg`l{Z-nD_hCs;sKk4Nal5HAs%(?Q--OCGNwi2S0Q6 z%|Vc?!p947UciSd_6s)E{)IB(fX3&?DQ{R^OCdb-hGa?FX}t$&(%T$&z3Diu%I;b((cH?X=QP zr*m%WbbRH!Omu>LeX{vSIF{6 z!?Eg&%W=|wT#or?`#GLF>vHV-ugh`IIhSMW|6GpN2{p%tUWeo9-hPg07aWeqF7$K! z?0c6Z@9XFI!bOK;X;^by_=Dz{bjjiPOd8l6pE(9DNB$Xr1CnzF4oUukLCcked1(YF zmV99(D40BH0N6A)`1mzZ;NaxPqUZ*>+M0^IJDP6Tu8z49DBl|c4$+pu1HnPcr^nKE zbgR9n+N_^n8bl%8YcHxk>*xCh)8>>@!?sKL$^;5ka^DaL>siRB52c8*Xjo(Aml7$W zCSh1lLB8)Qil{LdwnrdenM9!=_a#Hv9)EngmqKd(h3(nLFAb-V8h&Z|Cn)bpfwaUe zPhCFwtV65G*OHfN9Z`)wQ}at$Thntk-wNVQ{iUXMmr=;8)Cy48)9RYh8Q`Jc1K4a3&n7e?-~nJ z+1E?CZye;aukX_DC+^noAC>F(!}q9n*v-?&(eg*{)tBms{IzkAYn0`J^%pyx$L7FT zR&$;o&H*1Ur3<5MihZkzuIQKKyE#y3l!eq^@^qd*-dew2udk&GqwK7GtCOy1{SV_| G_WuFmG6k6c delta 4085 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 diff --git a/src/mesh/test/dot11s/hwmp-target-flags-regression-test-0-1.pcap b/src/mesh/test/dot11s/hwmp-target-flags-regression-test-0-1.pcap index a3900b4180260de9219a7d759d97753b82de3ec3..bf5f463cd95755fd1ba01120c78d33abbf9a9a6c 100644 GIT binary patch delta 91 zcmZ3*v5I4Y3}f;{S#Rd%3mg;Wgm$?q9J%oL^$po+Il-b~5dKn;_lm^+x84}ev%u&4n582%fX delta 91 zcmZ3*v5I4Y45QaXS#Rd73mg;WgmUhf$|%oL^$po+Il-b`NHKn;_lm^+xW4uDm$u&4n5>0lb4 diff --git a/src/mesh/test/dot11s/hwmp-target-flags-regression-test-1-1.pcap b/src/mesh/test/dot11s/hwmp-target-flags-regression-test-1-1.pcap index 105dc09f006ae34784fdc1e53b042f1f2a4804be..6b8b0492a5618a49af6680b24f7546f83c63e59b 100644 GIT binary patch delta 89 zcmZ3*v5I4Y4C9)KvfhkmCNnZBPVCZRS~F#$oWjIwT3``x#x;|D8CNo&Ddm_bFF#p= g2`K*uC_g!csRO9sEt5CXnhzj;6mthm5ethN0AH0JOaK4? delta 89 zcmZ3*v5I4Y4CCa9vfhlFCo?iCPVCZRnmlEqoWjIwT3``x#>ta?8CNoIF6EdgFF#p= g2`K*uC_g!csRO9sEt5CXos7#$}sWCCe<%LG*L3Z!5MGf=^1umTnqH2~qr8^!os7&Rs@WCCe<%LG*L3Z!5MGf=^1umTnqH2|~X8q5Fy diff --git a/src/mesh/test/dot11s/hwmp-target-flags-regression-test-3-1.pcap b/src/mesh/test/dot11s/hwmp-target-flags-regression-test-3-1.pcap index aceb5816ab22bc98596174d09558f6d267302164..2fac0580ba073401da8d9f13af0e240ab628030a 100644 GIT binary patch delta 98 zcmcb^c86_(45QjaS#M^ysq7QwunIF~H2_Rl8b$yB delta 98 zcmcb^c86_(3?uJES#M_Dsq7QwunIF~H2@Tq88ZL? diff --git a/src/mesh/test/dot11s/pmp-regression-test-0-1.pcap b/src/mesh/test/dot11s/pmp-regression-test-0-1.pcap index 2de1094983873242e118040f0e9a2d00e5c32b1f..15ff51c5930ade8c61ecbf5fd0eeb736727925ec 100644 GIT binary patch delta 99 zcmZo>Yi64u!z6NYqMR3_*~Cm=#(NXD%Q9w6yz0$ZFYi64u!}R;aL^&@;{fU{rjMpb_mt`!Tc-5P+d9os-ETjKqdq!Wz_{qIM_KC@> y8NHcu&P?1P!|dhHIC&?N{A4pGS>Y25FBpqha#M>l7@$CTavDYi64u!?Yi64u!#H`OtT*HAiJ88Pt0!)kW#pcC)thnsWJN|<#>bQG8GRYMC-(x`29sAa ydNVnknYcrSd6z%q state, bool isCfPeriod) UpdateBackoff (); NS_ASSERT (!state->IsAccessRequested ()); state->NotifyAccessRequested (); - // If currently transmitting; end of transmission (ACK or no ACK) will cause - // a later access request if needed from EndTxNoAck, GotAck, or MissedAck - Time lastTxEnd = m_lastTxStart + m_lastTxDuration; - if (lastTxEnd > Simulator::Now ()) - { - NS_LOG_DEBUG ("Internal collision (currently transmitting)"); - state->NotifyInternalCollision (); - DoRestartAccessTimeoutIfNeeded (); - return; - } - /** - * If there is a collision, generate a backoff - * by notifying the collision to the user. - */ - if (state->GetBackoffSlots () == 0) - { - if (IsBusy ()) - { - NS_LOG_DEBUG ("medium is busy: collision"); - // someone else has accessed the medium; generate a backoff. - state->NotifyCollision (); - DoRestartAccessTimeoutIfNeeded (); - return; - } - else if (IsWithinAifs (state)) - { - NS_LOG_DEBUG ("busy within AIFS"); - state->NotifyCollision (); - DoRestartAccessTimeoutIfNeeded (); - return; - } - } DoGrantDcfAccess (); DoRestartAccessTimeoutIfNeeded (); } diff --git a/src/wifi/model/qos-txop.cc b/src/wifi/model/qos-txop.cc index 4142f3671..5a7cacebd 100644 --- a/src/wifi/model/qos-txop.cc +++ b/src/wifi/model/qos-txop.cc @@ -182,6 +182,14 @@ QosTxop::GetTypeOfStation (void) const return m_typeOfStation; } +bool +QosTxop::HasFramesToTransmit (void) +{ + bool ret = (m_currentPacket != 0 || m_baManager->HasPackets () || !m_queue->IsEmpty ()); + NS_LOG_FUNCTION (this << ret); + return ret; +} + uint16_t QosTxop::GetNextSequenceNumberFor (const WifiMacHeader *hdr) { diff --git a/src/wifi/model/qos-txop.h b/src/wifi/model/qos-txop.h index b2a1a119e..1746a14bb 100644 --- a/src/wifi/model/qos-txop.h +++ b/src/wifi/model/qos-txop.h @@ -146,6 +146,12 @@ public: */ TypeOfStation GetTypeOfStation (void) const; + /** + * Check if the EDCAF has frames to transmit. + * \return true if the EDCAF has frames to transmit. + */ + virtual bool HasFramesToTransmit (void); + /** * \param address recipient address of the peer station * \param tid traffic ID. diff --git a/src/wifi/model/txop.cc b/src/wifi/model/txop.cc index af15597b8..3643d74d1 100644 --- a/src/wifi/model/txop.cc +++ b/src/wifi/model/txop.cc @@ -304,6 +304,55 @@ Txop::GetTxopLimit (void) const return m_txopLimit; } +bool +Txop::HasFramesToTransmit (void) +{ + bool ret = (m_currentPacket != 0 || !m_queue->IsEmpty ()); + NS_LOG_FUNCTION (this << ret); + return ret; +} + +void +Txop::GenerateBackoffUponAccessIfNeeded (void) +{ + NS_LOG_FUNCTION (this); + /* + * From section 10.3.4.2 "Basic access" of IEEE 802.11-2016: + * + * A STA may transmit an MPDU when it is operating under the DCF access + * method, either in the absence of a PC, or in the CP of the PCF access + * method, when the STA determines that the medium is idle when a frame is + * queued for transmission, and remains idle for a period of a DIFS, or an + * EIFS (10.3.2.3.7) from the end of the immediately preceding medium-busy + * event, whichever is the greater, and the backoff timer is zero. Otherwise + * the random backoff procedure described in 10.3.4.3 shall be followed. + * + * From section 10.22.2.2 "EDCA backoff procedure" of IEEE 802.11-2016: + * + * The backoff procedure shall be invoked by an EDCAF when any of the following + * events occurs: + * a) An MA-UNITDATA.request primitive is received that causes a frame with that AC + * to be queued for transmission such that one of the transmit queues associated + * with that AC has now become non-empty and any other transmit queues + * associated with that AC are empty; the medium is busy on the primary channel + */ + if (!HasFramesToTransmit () && !m_low->IsCfPeriod () && m_backoffSlots == 0) + { + if (!m_channelAccessManager->IsBusy ()) + { + // medium idle. If this is a DCF, use immediate access (we can transmit + // in a DIFS if the medium remains idle). + Time delay = (IsQosTxop () ? Seconds (0) : m_low->GetSifs () + GetAifsn () * m_low->GetSlotTime ()); + UpdateBackoffSlotsNow (0, Simulator::Now () + delay); + } + else + { + // medium busy, generate backoff + GenerateBackoff (); + } + } +} + void Txop::Queue (Ptr packet, const WifiMacHeader &hdr) { @@ -313,6 +362,7 @@ Txop::Queue (Ptr packet, const WifiMacHeader &hdr) SocketPriorityTag priorityTag; packetCopy->RemovePacketTag (priorityTag); m_stationManager->PrepareForQueue (hdr.GetAddr1 (), &hdr, packetCopy); + GenerateBackoffUponAccessIfNeeded (); m_queue->Enqueue (Create (packetCopy, hdr)); StartAccessIfNeeded (); } diff --git a/src/wifi/model/txop.h b/src/wifi/model/txop.h index d4cab533b..613f650ed 100644 --- a/src/wifi/model/txop.h +++ b/src/wifi/model/txop.h @@ -375,6 +375,15 @@ protected: */ virtual void NotifyCollision (void); + /** + * Check if the DCF has frames to transmit. + * \return true if the DCF has frames to transmit. + */ + virtual bool HasFramesToTransmit (void); + /** + * Generate a new backoff, if needed, when a packet is queued for transmission. + */ + virtual void GenerateBackoffUponAccessIfNeeded (void); /** * Generate a new backoff now. */ diff --git a/src/wifi/test/channel-access-manager-test.cc b/src/wifi/test/channel-access-manager-test.cc index 78d837955..ff28eeba5 100644 --- a/src/wifi/test/channel-access-manager-test.cc +++ b/src/wifi/test/channel-access-manager-test.cc @@ -75,6 +75,7 @@ private: void NotifyAccessGranted (void); void NotifyInternalCollision (void); void GenerateBackoff (void); + bool HasFramesToTransmit (void); void NotifyChannelSwitching (void); void NotifySleep (void); void NotifyWakeUp (void); @@ -342,6 +343,12 @@ TxopTest::GenerateBackoff (void) m_test->GenerateBackoff (m_i); } +bool +TxopTest::HasFramesToTransmit (void) +{ + return !m_expectedGrants.empty (); +} + void TxopTest::NotifyChannelSwitching (void) { @@ -465,6 +472,8 @@ ChannelAccessManagerTest::StartTest (uint64_t slotTime, uint64_t sifs, uint64_t { m_ChannelAccessManager = CreateObject (); m_low = CreateObject (); + m_low->SetSlotTime (MicroSeconds (slotTime)); + m_low->SetSifs (MicroSeconds (sifs)); m_ChannelAccessManager->SetupLow (m_low); m_ChannelAccessManager->SetSlot (MicroSeconds (slotTime)); m_ChannelAccessManager->SetSifs (MicroSeconds (sifs)); @@ -478,7 +487,8 @@ ChannelAccessManagerTest::AddDcfState (uint32_t aifsn) Ptr txop = CreateObject (this, m_txop.size ()); txop->SetAifsn (aifsn); m_txop.push_back (txop); - m_ChannelAccessManager->Add (txop); + txop->SetChannelAccessManager (m_ChannelAccessManager); + txop->SetMacLow (m_low); } void @@ -601,6 +611,7 @@ ChannelAccessManagerTest::AddAccessRequestWithSuccessfullAck (uint64_t at, uint6 void ChannelAccessManagerTest::DoAccessRequest (uint64_t txTime, uint64_t expectedGrantTime, Ptr state) { + state->GenerateBackoffUponAccessIfNeeded (); state->QueueTx (txTime, expectedGrantTime); m_ChannelAccessManager->RequestAccess (state); } @@ -632,40 +643,28 @@ ChannelAccessManagerTest::AddRxStartEvt (uint64_t at, uint64_t duration) void ChannelAccessManagerTest::DoRun (void) { - // Bug 2369 addresses this case - // 0 3 4 5 8 9 10 12 - // | sifs | aifsn | tx | sifs | aifsn | | tx | + // DCF immediate access (no backoff) + // 1 4 5 6 8 11 12 + // | sifs | aifsn | tx | idle | sifs | aifsn | tx | // StartTest (1, 3, 10); AddDcfState (1); - AddAccessRequest (1, 1, 4, 0); - // Generate backoff when the request is within SIFS - ExpectBackoff (1, 0, 0); // 0 slots - AddAccessRequest (10, 2, 10, 0); - EndTest (); - // Bug 2369 addresses this case - // 0 3 5 6 9 11 12 13 - // | sifs | aifsn | tx | sifs | aifsn | | tx | - // - StartTest (1, 3, 10); - AddDcfState (2); - AddAccessRequest (4, 1, 5, 0); - // Generate backoff when the request is within AIFSN - ExpectBackoff (4, 0, 0); // 0 slots - AddAccessRequest (12, 2, 12, 0); + AddAccessRequest (1, 1, 5, 0); + AddAccessRequest (8, 2, 12, 0); EndTest (); // Check that receiving inside SIFS shall be cancelled properly: - // 0 3 4 5 8 9 12 13 14 - // | sifs | aifsn | tx | sifs | ack | sifs | aifsn | |tx | + // 1 4 5 6 9 10 14 17 18 + // | sifs | aifsn | tx | sifs | ack | idle | sifs | aifsn | tx | + // | + // 7 start rx // StartTest (1, 3, 10); AddDcfState (1); - AddAccessRequest (1, 1, 4, 0); - ExpectBackoff (1, 0, 0); - AddRxInsideSifsEvt (6, 10); - AddTxEvt (8, 1); - AddAccessRequest (14, 2, 14, 0); + AddAccessRequest (1, 1, 5, 0); + AddRxInsideSifsEvt (7, 10); + AddTxEvt (9, 1); + AddAccessRequest (14, 2, 18, 0); EndTest (); // The test below mainly intends to test the case where the medium // becomes busy in the middle of a backoff slot: the backoff counter @@ -712,31 +711,26 @@ ChannelAccessManagerTest::DoRun (void) ExpectBackoff (30, 0, 0); //backoff: 0 slots EndTest (); - // Bug 2369. Test case of requesting access within SIFS interval + // Requesting access within SIFS interval (DCF immediate access) // - // 20 60 66 70 74 - // | rx | sifs | aifsn | backoff | tx | - // | - // 62 request access. + // 20 60 62 68 72 + // | rx | idle | sifs | aifsn | tx | // StartTest (4, 6, 10); AddDcfState (1); AddRxOkEvt (20, 40); - AddAccessRequest (62, 2, 74, 0); - ExpectBackoff (62, 1, 0); //backoff: 1 slots + AddAccessRequest (62, 2, 72, 0); EndTest (); - // Bug 2369. Test case of requesting access after DIFS (no backoff) + // Requesting access after DIFS (DCF immediate access) // - // 20 60 66 70 - // | rx | sifs | aifsn | tx | - // | - // 70 request access. + // 20 60 70 76 80 + // | rx | idle | sifs | aifsn | tx | // StartTest (4, 6, 10); AddDcfState (1); AddRxOkEvt (20, 40); - AddAccessRequest (70, 2, 70, 0); + AddAccessRequest (70, 2, 80, 0); EndTest (); // Test an EIFS @@ -752,6 +746,19 @@ ChannelAccessManagerTest::DoRun (void) ExpectBackoff (30, 4, 0); //backoff: 4 slots EndTest (); + // Test DCF immediate access after an EIFS (EIFS is greater) + // + // 20 60 66 76 86 + // | <----+-eifs------>| + // | rx | sifs | acktxttime | sifs + aifsn | tx | + // | sifs + aifsn | + // request access 70 80 + StartTest (4, 6, 10); + AddDcfState (1); + AddRxErrorEvt (20, 40); + AddAccessRequest (70, 2, 86, 0); + EndTest (); + // Test that channel stays busy for first frame's duration after Rx error // // 20 60 @@ -801,16 +808,15 @@ ChannelAccessManagerTest::DoRun (void) // Test of AckTimeout handling: First queue requests access and ack procedure fails, // inside the ack timeout second queue with higher priority requests access. // - // 20 40 50 60 66 76 - // DCF0 - low | tx | ack timeout |sifs| | - // DCF1 - high | | |sifs| tx | - // ^ request access + // 20 26 34 54 74 80 + // DCF1 - low | sifs | aifsn | tx | ack timeout | sifs | | + // DCF0 - high | | | sifs | tx | + // ^ request access StartTest (4, 6, 10); - AddDcfState (2); //high priority DCF - AddDcfState (0); //low priority DCF - AddAccessRequestWithAckTimeout (20, 20, 20, 0); - AddAccessRequest (50, 10, 66, 1); - ExpectBackoff (50, 0, 1); + AddDcfState (0); //high priority DCF + AddDcfState (2); //low priority DCF + AddAccessRequestWithAckTimeout (20, 20, 34, 1); + AddAccessRequest (64, 10, 80, 0); EndTest (); // Test of AckTimeout handling: @@ -818,27 +824,27 @@ ChannelAccessManagerTest::DoRun (void) // First queue requests access and ack is 2 us delayed (got ack interval at the picture), // inside this interval second queue with higher priority requests access. // - // 20 40 41 42 48 58 - // DCF0 - low | tx |got ack |sifs| | - // DCF1 - high | | |sifs| tx | - // ^ request access + // 20 26 34 54 56 62 + // DCF1 - low | sifs | aifsn | tx | got ack | sifs | | + // DCF0 - high | | | sifs | tx | + // ^ request access StartTest (4, 6, 10); - AddDcfState (2); //high priority DCF - AddDcfState (0); //low priority DCF - AddAccessRequestWithSuccessfullAck (20, 20, 20, 2, 0); - AddAccessRequest (41, 10, 48, 1); - ExpectBackoff (41, 0, 1); + AddDcfState (0); //high priority DCF + AddDcfState (2); //low priority DCF + AddAccessRequestWithSuccessfullAck (20, 20, 34, 2, 1); + AddAccessRequest (55, 10, 62, 0); EndTest (); //Repeat the same but with one queue: - // 20 40 41 42 48 58 - // DCF0 - low | tx |got ack |sifs| | - // ^ request access + // 20 26 34 54 60 62 68 76 80 + // DCF0 | sifs | aifsn | tx | sifs | ack | sifs | aifsn | bslot0 | tx | + // ^ request access StartTest (4, 6, 10); AddDcfState (2); - AddAccessRequestWithSuccessfullAck (20, 20, 20, 2, 0); - AddAccessRequest (41, 10, 56, 0); - ExpectBackoff (41, 0, 0); + AddAccessRequest (20, 20, 34, 0); + AddRxOkEvt (60, 2); // ack + AddAccessRequest (61, 10, 80, 0); + ExpectBackoff (61, 1, 0); // 1 slot EndTest (); // test simple NAV count. This scenario modelizes a simple DATA+ACK handshake @@ -868,10 +874,13 @@ ChannelAccessManagerTest::DoRun (void) EndTest (); + // 20 60 80 86 94 + // | rx | idle | sifs | aifsn | tx | + // ^ request access StartTest (4, 6, 10); AddDcfState (2); AddRxOkEvt (20, 40); - AddAccessRequest (80, 10, 80, 0); + AddAccessRequest (80, 10, 94, 0); EndTest (); @@ -886,15 +895,13 @@ ChannelAccessManagerTest::DoRun (void) // Channel switching tests - // 0 20 23 24 25 - // | switching | sifs | aifsn | tx | - // | - // 21 access request. + // 0 20 21 24 25 26 + // | switching | idle | sifs | aifsn | tx | + // ^ access request. StartTest (1, 3, 10); AddDcfState (1); - AddSwitchingEvt (0,20); - AddAccessRequest (21, 1, 24, 0); - ExpectBackoff (21, 0, 0); + AddSwitchingEvt (0, 20); + AddAccessRequest (21, 1, 25, 0); EndTest (); // 20 40 50 53 54 55 56 57 @@ -910,64 +917,56 @@ ChannelAccessManagerTest::DoRun (void) AddAccessRequest (45, 1, 56, 0); EndTest (); - // 20 30 50 53 54 55 - // | rx | switching | sifs | aifsn | tx | - // | - // 51 access request. + // 20 30 50 51 54 55 56 + // | rx | switching | idle | sifs | aifsn | tx | + // ^ access request. // StartTest (1, 3, 10); AddDcfState (1); - AddRxStartEvt (20,40); - AddSwitchingEvt (30,20); - AddAccessRequest (51, 1, 54, 0); - ExpectBackoff (51, 0, 0); + AddRxStartEvt (20, 40); + AddSwitchingEvt (30, 20); + AddAccessRequest (51, 1, 55, 0); EndTest (); - // 20 30 50 53 54 55 - // | busy | switching | sifs | aifsn | tx | - // | - // 51 access request. + // 20 30 50 51 54 55 56 + // | busy | switching | idle | sifs | aifsn | tx | + // ^ access request. // StartTest (1, 3, 10); AddDcfState (1); - AddCcaBusyEvt (20,40); - AddSwitchingEvt (30,20); - AddAccessRequest (51, 1, 54, 0); - ExpectBackoff (51, 0, 0); + AddCcaBusyEvt (20, 40); + AddSwitchingEvt (30, 20); + AddAccessRequest (51, 1, 55, 0); EndTest (); - // 20 30 50 53 54 55 - // | nav | switching | sifs | aifsn | tx | - // | - // 51 access request. + // 20 30 50 51 54 55 56 + // | nav | switching | idle | sifs | aifsn | tx | + // ^ access request. // StartTest (1, 3, 10); AddDcfState (1); AddNavStart (20,40); AddSwitchingEvt (30,20); - AddAccessRequest (51, 1, 54, 0); - ExpectBackoff (51, 0, 0); + AddAccessRequest (51, 1, 55, 0); EndTest (); - // 20 40 50 55 58 59 60 - // | tx | ack timeout | switching | sifs | aifsn | tx | - // | | - // 45 access request. 56 access request. + // 20 23 24 44 54 59 60 63 64 65 + // | sifs | aifsn | tx | ack timeout | switching | idle | sifs | aifsn | tx | + // | | + // 49 access request. ^ access request. // StartTest (1, 3, 10); AddDcfState (1); - AddAccessRequestWithAckTimeout (20, 20, 20, 0); - AddAccessRequest (45, 1, 50, 0); - ExpectBackoff (45, 0, 0); - AddSwitchingEvt (50,5); - AddAccessRequest (56, 1, 59, 0); - ExpectBackoff (56, 0, 0); + AddAccessRequestWithAckTimeout (20, 20, 24, 0); + AddAccessRequest (49, 1, 54, 0); + AddSwitchingEvt (54, 5); + AddAccessRequest (60, 1, 64, 0); EndTest (); - // 20 60 66 70 74 78 80 100 106 110 112 - // | rx | sifs | aifsn | bslot0 | bslot1 | | switching | sifs | aifsn | tx | - // | | - // 30 access request. 101 access request. + // 20 60 66 70 74 78 80 100 101 107 111 113 + // | rx | sifs | aifsn | bslot0 | bslot1 | | switching | idle | sifs | aifsn | tx | + // | | + // 30 access request. ^ access request. // StartTest (4, 6, 10); AddDcfState (1); @@ -975,8 +974,7 @@ ChannelAccessManagerTest::DoRun (void) AddAccessRequest (30, 2, 80, 0); ExpectBackoff (30, 4, 0); //backoff: 4 slots AddSwitchingEvt (80,20); - AddAccessRequest (101, 2, 110, 0); - ExpectBackoff (101, 0, 0); //backoff: 0 slots + AddAccessRequest (101, 2, 111, 0); EndTest (); } diff --git a/src/wifi/test/inter-bss-test-suite.cc b/src/wifi/test/inter-bss-test-suite.cc index cd808315e..ef01a4ab9 100644 --- a/src/wifi/test/inter-bss-test-suite.cc +++ b/src/wifi/test/inter-bss-test-suite.cc @@ -281,13 +281,13 @@ TestInterBssConstantObssPdAlgo::SetupSimulation () Simulator::Schedule (Seconds (2.4), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, sta_device2, ap_device2, m_payloadSize2 / 10); Simulator::Schedule (Seconds (2.4) + MicroSeconds (5), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device2, sta_device2, m_payloadSize2 / 10); - Simulator::Schedule (Seconds (2.4) + MicroSeconds (55), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device1, sta_device1, m_payloadSize1 / 10); + Simulator::Schedule (Seconds (2.4) + MicroSeconds (65), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device1, sta_device1, m_payloadSize1 / 10); Simulator::Schedule (Seconds (2.4) + MicroSeconds (105), &TestInterBssConstantObssPdAlgo::SendOnePacket, this, ap_device3, sta_device3, m_payloadSize3 / 10); if (expectPhyReset) { // In this case, we check the TX power is restricted (and set the expected value slightly before transmission should occur) double expectedTxPower = std::min (m_txPowerDbm, 21 - (m_obssPdLevelDbm + 82)); - Simulator::Schedule (Seconds (2.4) + MicroSeconds (300), &TestInterBssConstantObssPdAlgo::SetExpectedTxPower, this, expectedTxPower); + Simulator::Schedule (Seconds (2.4) + MicroSeconds (450), &TestInterBssConstantObssPdAlgo::SetExpectedTxPower, this, expectedTxPower); } Simulator::Stop (Seconds (2.5)); diff --git a/src/wifi/test/wifi-test.cc b/src/wifi/test/wifi-test.cc index e0f006128..1ca004537 100644 --- a/src/wifi/test/wifi-test.cc +++ b/src/wifi/test/wifi-test.cc @@ -1247,7 +1247,7 @@ Bug2222TestCase::DoRun (void) //Generate same backoff for AC_VI and AC_VO //The below combination will work RngSeedManager::SetSeed (1); - RngSeedManager::SetRun (2); + RngSeedManager::SetRun (16); int64_t streamNumber = 100; NodeContainer wifiNodes; @@ -1299,8 +1299,8 @@ Bug2222TestCase::DoRun (void) clientLowPriority->SetAttribute ("Priority", UintegerValue (4)); //AC_VI clientLowPriority->SetRemote (socket); wifiNodes.Get (0)->AddApplication (clientLowPriority); - clientLowPriority->SetStartTime (Seconds (1.0)); - clientLowPriority->SetStopTime (Seconds (2.0)); + clientLowPriority->SetStartTime (Seconds (0.0)); + clientLowPriority->SetStopTime (Seconds (1.0)); Ptr clientHighPriority = CreateObject (); clientHighPriority->SetAttribute ("PacketSize", UintegerValue (1460)); @@ -1308,18 +1308,18 @@ Bug2222TestCase::DoRun (void) clientHighPriority->SetAttribute ("Priority", UintegerValue (6)); //AC_VO clientHighPriority->SetRemote (socket); wifiNodes.Get (0)->AddApplication (clientHighPriority); - clientHighPriority->SetStartTime (Seconds (1.0)); - clientHighPriority->SetStopTime (Seconds (2.0)); + clientHighPriority->SetStartTime (Seconds (0.0)); + clientHighPriority->SetStopTime (Seconds (1.0)); Ptr server = CreateObject (); server->SetLocal (socket); wifiNodes.Get (1)->AddApplication (server); - server->SetStartTime (Seconds (1.0)); - server->SetStopTime (Seconds (2.0)); + server->SetStartTime (Seconds (0.0)); + server->SetStopTime (Seconds (1.0)); Config::Connect ("/NodeList/*/DeviceList/*/RemoteStationManager/MacTxDataFailed", MakeCallback (&Bug2222TestCase::TxDataFailedTrace, this)); - Simulator::Stop (Seconds (2.0)); + Simulator::Stop (Seconds (1.0)); Simulator::Run (); Simulator::Destroy (); @@ -2153,7 +2153,7 @@ Bug2470TestCase::DoRun (void) // Block ADDBA request 3 times (== maximum number of MAC frame transmissions in the ADDBA response timeout interval) blackList.push_back (4); blackList.push_back (5); - blackList.push_back (6); + blackList.push_back (8); apPem->SetList (blackList); {