1805 using StationsScenarios = std::vector<std::vector<GcrTestBase::StaInfo>>;
1808 for (
auto& [useAmpdu, ampduScenario] :
1809 std::vector<std::pair<bool, std::string>>{{
false,
"A-MPDU disabled"},
1810 {
true,
"A-MPDU enabled"}})
1812 for (
auto& [rtsThreshold, gcrPotection, protectionName] :
1813 std::vector<std::tuple<uint32_t, GroupcastProtectionMode, std::string>>{
1814 {maxRtsCtsThreshold, GroupcastProtectionMode::RTS_CTS,
"no protection"},
1815 {500, GroupcastProtectionMode::RTS_CTS,
"RTS-CTS"},
1816 {1500, GroupcastProtectionMode::CTS_TO_SELF,
"CTS-TO-SELF"}})
1818 for (
const auto& stasInfo : StationsScenarios{
1834 const auto maxChannelWidth =
1835 std::max_element(stasInfo.cbegin(),
1837 [](
const auto& lhs,
const auto& rhs) {
1838 return lhs.maxChannelWidth < rhs.maxChannelWidth;
1841 const auto useSpectrum =
1842 std::any_of(stasInfo.cbegin(),
1844 [maxChannelWidth](
const auto& staInfo) {
1845 return (staInfo.maxChannelWidth != maxChannelWidth);
1847 const std::string scenario =
"STAs=" + printStasInfo(stasInfo) +
1848 ", protection=" + protectionName +
", " +
1851 new GcrUrTest(
"GCR-UR without any lost frames: " + scenario,
1853 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1854 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1855 .rtsThreshold = rtsThreshold,
1856 .gcrProtectionMode = gcrPotection},
1858 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1860 new GcrUrTest(
"GCR-UR with first frame lost: " + scenario,
1862 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1863 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1864 .rtsThreshold = rtsThreshold,
1865 .gcrProtectionMode = gcrPotection,
1867 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}}}},
1869 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1871 new GcrUrTest(
"GCR-UR with all but last frame lost: " + scenario,
1873 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1874 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1875 .rtsThreshold = rtsThreshold,
1876 .gcrProtectionMode = gcrPotection,
1878 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1884 {7, {{0, {1, 2}}}}}},
1886 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1888 new GcrUrTest(
"GCR-UR with all frames lost: " + scenario,
1890 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1891 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1892 .rtsThreshold = rtsThreshold,
1893 .gcrProtectionMode = gcrPotection,
1895 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1902 {8, {{0, {1, 2}}}}}},
1904 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1905 if ((GetNumNonGcrStas(stasInfo) == 0) && useAmpdu)
1908 new GcrUrTest(
"GCR-UR with 1 MPDU always corrupted in first A-MPDU but one "
1909 "different MPDU alternatively, starting with second MPDU: " +
1912 .numGroupcastPackets = 4,
1913 .maxNumMpdusInPsdu = 2,
1914 .rtsThreshold = rtsThreshold,
1915 .gcrProtectionMode = gcrPotection,
1916 .mpdusToCorruptPerPsdu = {{1, {{0, {2}}}},
1925 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1927 new GcrUrTest(
"GCR-UR with 1 MPDU always corrupted in first A-MPDU but one "
1928 "different MPDU alternatively, starting with first MPDU: " +
1931 .numGroupcastPackets = 4,
1932 .maxNumMpdusInPsdu = 2,
1933 .rtsThreshold = rtsThreshold,
1934 .gcrProtectionMode = gcrPotection,
1935 .mpdusToCorruptPerPsdu = {{1, {{0, {1}}}},
1944 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1946 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in first A-MPDU "
1947 "except the first MPDU in the last retransmission: " +
1950 .numGroupcastPackets = 4,
1951 .maxNumMpdusInPsdu = 2,
1952 .rtsThreshold = rtsThreshold,
1953 .gcrProtectionMode = gcrPotection,
1954 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1963 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1965 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in first A-MPDU "
1966 "except the second MPDU in the last retransmission: " +
1969 .numGroupcastPackets = 4,
1970 .maxNumMpdusInPsdu = 2,
1971 .rtsThreshold = rtsThreshold,
1972 .gcrProtectionMode = gcrPotection,
1973 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1982 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1984 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in first A-MPDU: " +
1987 .numGroupcastPackets = 4,
1988 .maxNumMpdusInPsdu = 2,
1989 .rtsThreshold = rtsThreshold,
1990 .gcrProtectionMode = gcrPotection,
1991 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1998 {8, {{0, {1, 2}}}}}},
2000 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
2002 "GCR-UR with 1 MPDU always corrupted in second A-MPDU but one "
2003 "different MPDU alternatively, starting with second MPDU: " +
2006 .numGroupcastPackets = 4,
2007 .maxNumMpdusInPsdu = 2,
2008 .rtsThreshold = rtsThreshold,
2009 .gcrProtectionMode = gcrPotection,
2010 .mpdusToCorruptPerPsdu = {{9, {{0, {2}}}},
2019 useSpectrum ? TestCase::Duration::EXTENSIVE
2020 : TestCase::Duration::QUICK);
2022 "GCR-UR with 1 MPDU always corrupted in second A-MPDU but one "
2023 "different MPDU alternatively, starting with first MPDU: " +
2026 .numGroupcastPackets = 4,
2027 .maxNumMpdusInPsdu = 2,
2028 .rtsThreshold = rtsThreshold,
2029 .gcrProtectionMode = gcrPotection,
2030 .mpdusToCorruptPerPsdu = {{9, {{0, {1}}}},
2039 useSpectrum ? TestCase::Duration::EXTENSIVE
2040 : TestCase::Duration::QUICK);
2042 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in second A-MPDU "
2043 "except the first MPDU in the last retransmission: " +
2046 .numGroupcastPackets = 4,
2047 .maxNumMpdusInPsdu = 2,
2048 .rtsThreshold = rtsThreshold,
2049 .gcrProtectionMode = gcrPotection,
2050 .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
2051 {10, {{0, {1, 2}}}},
2052 {11, {{0, {1, 2}}}},
2053 {12, {{0, {1, 2}}}},
2054 {13, {{0, {1, 2}}}},
2055 {14, {{0, {1, 2}}}},
2056 {15, {{0, {1, 2}}}},
2059 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
2061 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in second A-MPDU "
2062 "except the second MPDU in the last retransmission: " +
2065 .numGroupcastPackets = 4,
2066 .maxNumMpdusInPsdu = 2,
2067 .rtsThreshold = rtsThreshold,
2068 .gcrProtectionMode = gcrPotection,
2069 .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
2070 {10, {{0, {1, 2}}}},
2071 {11, {{0, {1, 2}}}},
2072 {12, {{0, {1, 2}}}},
2073 {13, {{0, {1, 2}}}},
2074 {14, {{0, {1, 2}}}},
2075 {15, {{0, {1, 2}}}},
2078 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
2080 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in second A-MPDU: " +
2083 .numGroupcastPackets = 4,
2084 .maxNumMpdusInPsdu = 2,
2085 .rtsThreshold = rtsThreshold,
2086 .gcrProtectionMode = gcrPotection,
2087 .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
2088 {10, {{0, {1, 2}}}},
2089 {11, {{0, {1, 2}}}},
2090 {12, {{0, {1, 2}}}},
2091 {13, {{0, {1, 2}}}},
2092 {14, {{0, {1, 2}}}},
2093 {15, {{0, {1, 2}}}},
2094 {16, {{0, {1, 2}}}}}},
2096 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
2103 .numGroupcastPackets = 1,
2104 .maxNumMpdusInPsdu = 1,
2106 .rtsThreshold = maxRtsCtsThreshold},
2107 {.expectedSkippedRetries = 4}),
2108 TestCase::Duration::QUICK);
2109 AddTestCase(
new GcrUrTest(
"GCR-UR with A-MPDU paused during test and number of packets larger "
2110 "than MPDU buffer size",
2112 .numGroupcastPackets = 300,
2113 .maxNumMpdusInPsdu = 2,
2114 .startGroupcast =
Seconds(1.0),
2116 .rtsThreshold = maxRtsCtsThreshold,
2118 {.packetsPauzeAggregation = 4, .packetsResumeAggregation = 100}),
2119 TestCase::Duration::QUICK);
2125 .numGroupcastPackets = 300,
2127 .maxNumMpdusInPsdu = 1024,
2128 .rtsThreshold = maxRtsCtsThreshold},
2130 TestCase::Duration::QUICK);
2136 .numGroupcastPackets = 300,
2138 .maxNumMpdusInPsdu = 1024,
2139 .rtsThreshold = maxRtsCtsThreshold},
2141 TestCase::Duration::QUICK);
2147 .numGroupcastPackets = 1200,
2149 .maxNumMpdusInPsdu = 1024,
2150 .rtsThreshold = maxRtsCtsThreshold},
2152 TestCase::Duration::QUICK);
2154 "sequence numbers are properly released",
2156 .numGroupcastPackets = 6,
2158 .maxNumMpdusInPsdu = 2,
2161 .rtsThreshold = 500,
2162 .rtsFramesToCorrupt = {3, 4, 5},
2163 .expectedDroppedGroupcastMpdus = {3, 4}},
2164 {.expectedSkippedRetries = 6}),
2165 TestCase::Duration::QUICK);
2167 "sequence numbers are properly released",
2169 .numGroupcastPackets = 6,
2171 .maxNumMpdusInPsdu = 2,
2174 .rtsThreshold = 500,
2175 .ctsFramesToCorrupt = {3, 4, 5},
2176 .expectedDroppedGroupcastMpdus = {3, 4}},
2177 {.expectedSkippedRetries = 6}),
2178 TestCase::Duration::QUICK);
2179 AddTestCase(
new GcrUrTest(
"GCR-UR with reduced lifetime, A-MPDU paused during test and number "
2180 "of packets larger than MPDU buffer size",
2182 .numGroupcastPackets = 300,
2184 .maxNumMpdusInPsdu = 2,
2186 .rtsThreshold = maxRtsCtsThreshold,
2188 {.expectedSkippedRetries = 4,
2189 .packetsPauzeAggregation = 4,
2190 .packetsResumeAggregation = 100}),
2191 TestCase::Duration::QUICK);
2194 for (
auto& [groupcastPackets, groupcastStartTime, unicastPackets, unicastStartTime] :
2195 std::vector<std::tuple<uint16_t, Time, uint16_t, Time>>{
2200 for (
auto& [corruptedBars, corruptedBlockAcks] :
2201 std::vector<std::pair<std::set<uint8_t>, std::set<uint8_t>>>{{{}, {}},
2206 for (
auto& [rtsThreshold, gcrPotection, protectionName] :
2207 std::vector<std::tuple<uint32_t, GroupcastProtectionMode, std::string>>{
2208 {maxRtsCtsThreshold, GroupcastProtectionMode::RTS_CTS,
"no protection"},
2209 {500, GroupcastProtectionMode::RTS_CTS,
"RTS-CTS"},
2210 {1500, GroupcastProtectionMode::CTS_TO_SELF,
"CTS-TO-SELF"}})
2212 for (
const auto& stasInfo : StationsScenarios{
2236 const auto maxChannelWidth =
2237 std::max_element(stasInfo.cbegin(),
2239 [](
const auto& lhs,
const auto& rhs) {
2240 return lhs.maxChannelWidth < rhs.maxChannelWidth;
2243 const auto useSpectrum =
2244 std::any_of(stasInfo.cbegin(),
2246 [maxChannelWidth](
const auto& staInfo) {
2247 return (staInfo.maxChannelWidth != maxChannelWidth);
2249 std::string scenario =
2250 "STAs=" + printStasInfo(stasInfo) +
", protection=" + protectionName +
2251 ", corruptBARs=" + std::to_string(!corruptedBars.empty()) +
2252 ", corruptBACKs=" + std::to_string(!corruptedBlockAcks.empty());
2253 if (unicastPackets > 0)
2255 scenario +=
", mixedGroupcastUnicast";
2256 if (unicastStartTime > groupcastStartTime)
2258 scenario +=
" (groupcast before unicast)";
2262 scenario +=
" (unicast before groupcast)";
2267 .numGroupcastPackets = groupcastPackets,
2268 .numUnicastPackets = unicastPackets,
2269 .maxNumMpdusInPsdu = 2,
2270 .startGroupcast = groupcastStartTime,
2271 .startUnicast = unicastStartTime,
2272 .rtsThreshold = rtsThreshold,
2273 .gcrProtectionMode = gcrPotection},
2274 {corruptedBars, corruptedBlockAcks}),
2275 useSpectrum ? TestCase::Duration::EXTENSIVE
2276 : TestCase::Duration::QUICK);
2277 if (GetNumNonGcrStas(stasInfo) == 0)
2281 .numGroupcastPackets = groupcastPackets,
2282 .numUnicastPackets = unicastPackets,
2283 .maxNumMpdusInPsdu = 2,
2284 .startGroupcast = groupcastStartTime,
2285 .startUnicast = unicastStartTime,
2286 .rtsThreshold = rtsThreshold,
2287 .gcrProtectionMode = gcrPotection,
2288 .mpdusToCorruptPerPsdu = {{1, {{0, {2}}}}}},
2289 {corruptedBars, corruptedBlockAcks}),
2290 useSpectrum ? TestCase::Duration::EXTENSIVE
2291 : TestCase::Duration::QUICK);
2294 .numGroupcastPackets = groupcastPackets,
2295 .numUnicastPackets = unicastPackets,
2296 .maxNumMpdusInPsdu = 2,
2297 .startGroupcast = groupcastStartTime,
2298 .startUnicast = unicastStartTime,
2299 .rtsThreshold = rtsThreshold,
2300 .gcrProtectionMode = gcrPotection,
2301 .mpdusToCorruptPerPsdu = {{1, {{0, {1}}}}}},
2302 {corruptedBars, corruptedBlockAcks}),
2303 useSpectrum ? TestCase::Duration::EXTENSIVE
2304 : TestCase::Duration::QUICK);
2307 .numGroupcastPackets = groupcastPackets,
2308 .numUnicastPackets = unicastPackets,
2309 .maxNumMpdusInPsdu = 2,
2310 .startGroupcast = groupcastStartTime,
2311 .startUnicast = unicastStartTime,
2312 .rtsThreshold = rtsThreshold,
2313 .gcrProtectionMode = gcrPotection,
2314 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}}}},
2315 {corruptedBars, corruptedBlockAcks}),
2316 useSpectrum ? TestCase::Duration::EXTENSIVE
2317 : TestCase::Duration::QUICK);
2318 if (GetNumGcrStas(stasInfo) > 1)
2321 new GcrBaTest(
"GCR-BA with second MPDU corrupted for first STA: " +
2324 .numGroupcastPackets = groupcastPackets,
2325 .numUnicastPackets = unicastPackets,
2326 .maxNumMpdusInPsdu = 2,
2327 .startGroupcast = groupcastStartTime,
2328 .startUnicast = unicastStartTime,
2329 .rtsThreshold = rtsThreshold,
2330 .gcrProtectionMode = gcrPotection,
2331 .mpdusToCorruptPerPsdu = {{1, {{1, {2}}}}}},
2332 {corruptedBars, corruptedBlockAcks}),
2333 useSpectrum ? TestCase::Duration::EXTENSIVE
2334 : TestCase::Duration::QUICK);
2336 new GcrBaTest(
"GCR-BA with first MPDU corrupted for first STA: " +
2339 .numGroupcastPackets = groupcastPackets,
2340 .numUnicastPackets = unicastPackets,
2341 .maxNumMpdusInPsdu = 2,
2342 .startGroupcast = groupcastStartTime,
2343 .startUnicast = unicastStartTime,
2344 .rtsThreshold = rtsThreshold,
2345 .gcrProtectionMode = gcrPotection,
2346 .mpdusToCorruptPerPsdu = {{1, {{1, {1}}}}}},
2347 {corruptedBars, corruptedBlockAcks}),
2348 useSpectrum ? TestCase::Duration::EXTENSIVE
2349 : TestCase::Duration::QUICK);
2352 "GCR-BA with first different MPDUs corrupted for each STA: " +
2355 .numGroupcastPackets = groupcastPackets,
2356 .numUnicastPackets = unicastPackets,
2357 .maxNumMpdusInPsdu = 2,
2358 .startGroupcast = groupcastStartTime,
2359 .startUnicast = unicastStartTime,
2360 .rtsThreshold = rtsThreshold,
2361 .gcrProtectionMode = gcrPotection,
2362 .mpdusToCorruptPerPsdu = {{1, {{1, {1}}, {2, {2}}}}}},
2363 {corruptedBars, corruptedBlockAcks}),
2364 useSpectrum ? TestCase::Duration::EXTENSIVE
2365 : TestCase::Duration::QUICK);
2367 "GCR-BA with first different MPDUs corrupted for each "
2368 "STA with different order: " +
2371 .numGroupcastPackets = groupcastPackets,
2372 .numUnicastPackets = unicastPackets,
2373 .maxNumMpdusInPsdu = 2,
2374 .startGroupcast = groupcastStartTime,
2375 .startUnicast = unicastStartTime,
2376 .rtsThreshold = rtsThreshold,
2377 .gcrProtectionMode = gcrPotection,
2378 .mpdusToCorruptPerPsdu = {{1, {{1, {2}}, {2, {1}}}}}},
2379 {corruptedBars, corruptedBlockAcks}),
2380 useSpectrum ? TestCase::Duration::EXTENSIVE
2381 : TestCase::Duration::QUICK);
2387 std::string scenario =
"GCR-BA with dropped MPDU because of lifetime expiry";
2388 if (unicastPackets > 0)
2390 scenario +=
", mixedGroupcastUnicast";
2391 if (unicastStartTime > groupcastStartTime)
2393 scenario +=
" (groupcast before unicast)";
2397 scenario +=
" (unicast before groupcast)";
2403 .numGroupcastPackets =
2404 uint16_t(groupcastPackets *
2406 .numUnicastPackets = unicastPackets,
2407 .maxNumMpdusInPsdu = 2,
2408 .startGroupcast = groupcastStartTime,
2409 .startUnicast = unicastStartTime,
2411 .rtsThreshold = maxRtsCtsThreshold,
2412 .mpdusToCorruptPerPsdu =
2413 {{1, {{0, {2}}}}, {2, {{0, {2}}}}, {3, {{0, {2}}}}, {4, {{0, {2}}}}},
2414 .expectedDroppedGroupcastMpdus = {2}},
2416 TestCase::Duration::QUICK);
2418 if (unicastPackets > 0)
2420 if (unicastStartTime > groupcastStartTime)
2422 scenario +=
"Groupcast followed by unicast";
2426 scenario +=
"Unicast followed by groupcast";
2431 scenario +=
"GCR-BA";
2433 scenario +=
" with ";
2436 .numGroupcastPackets = groupcastPackets,
2437 .numUnicastPackets = unicastPackets,
2438 .maxNumMpdusInPsdu = 2,
2439 .startGroupcast = groupcastStartTime,
2440 .startUnicast = unicastStartTime,
2441 .rtsThreshold = maxRtsCtsThreshold,
2442 .addbaReqsToCorrupt = {1}},
2444 TestCase::Duration::QUICK);
2447 .numGroupcastPackets = groupcastPackets,
2448 .numUnicastPackets = unicastPackets,
2449 .maxNumMpdusInPsdu = 2,
2450 .startGroupcast = groupcastStartTime,
2451 .startUnicast = unicastStartTime,
2452 .rtsThreshold = maxRtsCtsThreshold,
2453 .addbaRespsToCorrupt = {1}},
2455 TestCase::Duration::QUICK);
2458 .numGroupcastPackets = groupcastPackets,
2459 .numUnicastPackets = unicastPackets,
2460 .maxNumMpdusInPsdu = 2,
2461 .startGroupcast = groupcastStartTime,
2462 .startUnicast = unicastStartTime,
2463 .rtsThreshold = maxRtsCtsThreshold,
2464 .addbaReqsToCorrupt = {1, 2, 3, 4, 5, 6, 7, 8}},
2466 TestCase::Duration::QUICK);
2469 .numGroupcastPackets = groupcastPackets,
2470 .numUnicastPackets = uint16_t(unicastPackets * 2),
2471 .maxNumMpdusInPsdu = 2,
2472 .startGroupcast = groupcastStartTime,
2473 .startUnicast = unicastStartTime,
2474 .rtsThreshold = maxRtsCtsThreshold,
2475 .baInactivityTimeout = 10},
2477 TestCase::Duration::QUICK);
2480 "GCR-BA with BARs sent over 2 TXOPs because of TXOP limit",
2484 .numGroupcastPackets = 2,
2485 .maxNumMpdusInPsdu = 2,
2487 .rtsThreshold = maxRtsCtsThreshold,
2489 {.expectedNTxBarsPerTxop = {1, 2}}),
2490 TestCase::Duration::QUICK);
2495 .numGroupcastPackets = 2,
2496 .maxNumMpdusInPsdu = 2,
2498 .rtsThreshold = maxRtsCtsThreshold,
2500 {.expectedNTxBarsPerTxop = {1, 2, 1, 2}}),
2501 TestCase::Duration::QUICK);
2504 .numGroupcastPackets = 300,
2505 .maxNumMpdusInPsdu = 2,
2506 .rtsThreshold = maxRtsCtsThreshold},
2508 TestCase::Duration::QUICK);
2514 .numGroupcastPackets = 300,
2516 .maxNumMpdusInPsdu = 1024,
2517 .rtsThreshold = maxRtsCtsThreshold},
2519 TestCase::Duration::QUICK);
2525 .numGroupcastPackets = 300,
2527 .maxNumMpdusInPsdu = 1024,
2528 .rtsThreshold = maxRtsCtsThreshold},
2531 TestCase::Duration::QUICK);
2537 .numGroupcastPackets = 1200,
2539 .maxNumMpdusInPsdu = 1024,
2540 .rtsThreshold = maxRtsCtsThreshold},
2542 TestCase::Duration::QUICK);
2544 "sequence numbers are properly released",
2546 .numGroupcastPackets = 6,
2548 .maxNumMpdusInPsdu = 2,
2551 .rtsThreshold = 500,
2552 .rtsFramesToCorrupt = {2, 3, 4},
2553 .expectedDroppedGroupcastMpdus = {3, 4}},
2555 TestCase::Duration::QUICK);
2557 "sequence numbers are properly released",
2559 .numGroupcastPackets = 6,
2561 .maxNumMpdusInPsdu = 2,
2564 .rtsThreshold = 500,
2565 .ctsFramesToCorrupt = {2, 3, 4},
2566 .expectedDroppedGroupcastMpdus = {3, 4}},
2568 TestCase::Duration::QUICK);