1807 using StationsScenarios = std::vector<std::vector<GcrTestBase::StaInfo>>;
1810 for (
auto& [useAmpdu, ampduScenario] :
1811 std::vector<std::pair<bool, std::string>>{{
false,
"A-MPDU disabled"},
1812 {
true,
"A-MPDU enabled"}})
1814 for (
auto& [rtsThreshold, gcrPotection, protectionName] :
1815 std::vector<std::tuple<uint32_t, GroupcastProtectionMode, std::string>>{
1816 {maxRtsCtsThreshold, GroupcastProtectionMode::RTS_CTS,
"no protection"},
1817 {500, GroupcastProtectionMode::RTS_CTS,
"RTS-CTS"},
1818 {1500, GroupcastProtectionMode::CTS_TO_SELF,
"CTS-TO-SELF"}})
1820 for (
const auto& stasInfo : StationsScenarios{
1836 const auto maxChannelWidth =
1837 std::max_element(stasInfo.cbegin(),
1839 [](
const auto& lhs,
const auto& rhs) {
1840 return lhs.maxChannelWidth < rhs.maxChannelWidth;
1843 const auto useSpectrum =
1844 std::any_of(stasInfo.cbegin(),
1846 [maxChannelWidth](
const auto& staInfo) {
1847 return (staInfo.maxChannelWidth != maxChannelWidth);
1849 const std::string scenario =
"STAs=" + printStasInfo(stasInfo) +
1850 ", protection=" + protectionName +
", " +
1853 new GcrUrTest(
"GCR-UR without any lost frames: " + scenario,
1855 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1856 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1857 .rtsThreshold = rtsThreshold,
1858 .gcrProtectionMode = gcrPotection},
1860 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1862 new GcrUrTest(
"GCR-UR with first frame lost: " + scenario,
1864 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1865 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1866 .rtsThreshold = rtsThreshold,
1867 .gcrProtectionMode = gcrPotection,
1869 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}}}},
1871 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1873 new GcrUrTest(
"GCR-UR with all but last frame lost: " + scenario,
1875 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1876 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1877 .rtsThreshold = rtsThreshold,
1878 .gcrProtectionMode = gcrPotection,
1880 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1886 {7, {{0, {1, 2}}}}}},
1888 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1890 new GcrUrTest(
"GCR-UR with all frames lost: " + scenario,
1892 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1893 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1894 .rtsThreshold = rtsThreshold,
1895 .gcrProtectionMode = gcrPotection,
1897 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1904 {8, {{0, {1, 2}}}}}},
1906 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1907 if ((GetNumNonGcrStas(stasInfo) == 0) && useAmpdu)
1910 new GcrUrTest(
"GCR-UR with 1 MPDU always corrupted in first A-MPDU but one "
1911 "different MPDU alternatively, starting with second MPDU: " +
1914 .numGroupcastPackets = 4,
1915 .maxNumMpdusInPsdu = 2,
1916 .rtsThreshold = rtsThreshold,
1917 .gcrProtectionMode = gcrPotection,
1918 .mpdusToCorruptPerPsdu = {{1, {{0, {2}}}},
1927 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1929 new GcrUrTest(
"GCR-UR with 1 MPDU always corrupted in first A-MPDU but one "
1930 "different MPDU alternatively, starting with first MPDU: " +
1933 .numGroupcastPackets = 4,
1934 .maxNumMpdusInPsdu = 2,
1935 .rtsThreshold = rtsThreshold,
1936 .gcrProtectionMode = gcrPotection,
1937 .mpdusToCorruptPerPsdu = {{1, {{0, {1}}}},
1946 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1948 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in first A-MPDU "
1949 "except the first MPDU in the last retransmission: " +
1952 .numGroupcastPackets = 4,
1953 .maxNumMpdusInPsdu = 2,
1954 .rtsThreshold = rtsThreshold,
1955 .gcrProtectionMode = gcrPotection,
1956 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1965 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1967 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in first A-MPDU "
1968 "except the second MPDU in the last retransmission: " +
1971 .numGroupcastPackets = 4,
1972 .maxNumMpdusInPsdu = 2,
1973 .rtsThreshold = rtsThreshold,
1974 .gcrProtectionMode = gcrPotection,
1975 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1984 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1986 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in first A-MPDU: " +
1989 .numGroupcastPackets = 4,
1990 .maxNumMpdusInPsdu = 2,
1991 .rtsThreshold = rtsThreshold,
1992 .gcrProtectionMode = gcrPotection,
1993 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
2000 {8, {{0, {1, 2}}}}}},
2002 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
2004 "GCR-UR with 1 MPDU always corrupted in second A-MPDU but one "
2005 "different MPDU alternatively, starting with second MPDU: " +
2008 .numGroupcastPackets = 4,
2009 .maxNumMpdusInPsdu = 2,
2010 .rtsThreshold = rtsThreshold,
2011 .gcrProtectionMode = gcrPotection,
2012 .mpdusToCorruptPerPsdu = {{9, {{0, {2}}}},
2021 useSpectrum ? TestCase::Duration::EXTENSIVE
2022 : TestCase::Duration::QUICK);
2024 "GCR-UR with 1 MPDU always corrupted in second A-MPDU but one "
2025 "different MPDU alternatively, starting with first MPDU: " +
2028 .numGroupcastPackets = 4,
2029 .maxNumMpdusInPsdu = 2,
2030 .rtsThreshold = rtsThreshold,
2031 .gcrProtectionMode = gcrPotection,
2032 .mpdusToCorruptPerPsdu = {{9, {{0, {1}}}},
2041 useSpectrum ? TestCase::Duration::EXTENSIVE
2042 : TestCase::Duration::QUICK);
2044 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in second A-MPDU "
2045 "except the first MPDU in the last retransmission: " +
2048 .numGroupcastPackets = 4,
2049 .maxNumMpdusInPsdu = 2,
2050 .rtsThreshold = rtsThreshold,
2051 .gcrProtectionMode = gcrPotection,
2052 .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
2053 {10, {{0, {1, 2}}}},
2054 {11, {{0, {1, 2}}}},
2055 {12, {{0, {1, 2}}}},
2056 {13, {{0, {1, 2}}}},
2057 {14, {{0, {1, 2}}}},
2058 {15, {{0, {1, 2}}}},
2061 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
2063 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in second A-MPDU "
2064 "except the second MPDU in the last retransmission: " +
2067 .numGroupcastPackets = 4,
2068 .maxNumMpdusInPsdu = 2,
2069 .rtsThreshold = rtsThreshold,
2070 .gcrProtectionMode = gcrPotection,
2071 .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
2072 {10, {{0, {1, 2}}}},
2073 {11, {{0, {1, 2}}}},
2074 {12, {{0, {1, 2}}}},
2075 {13, {{0, {1, 2}}}},
2076 {14, {{0, {1, 2}}}},
2077 {15, {{0, {1, 2}}}},
2080 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
2082 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in second A-MPDU: " +
2085 .numGroupcastPackets = 4,
2086 .maxNumMpdusInPsdu = 2,
2087 .rtsThreshold = rtsThreshold,
2088 .gcrProtectionMode = gcrPotection,
2089 .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
2090 {10, {{0, {1, 2}}}},
2091 {11, {{0, {1, 2}}}},
2092 {12, {{0, {1, 2}}}},
2093 {13, {{0, {1, 2}}}},
2094 {14, {{0, {1, 2}}}},
2095 {15, {{0, {1, 2}}}},
2096 {16, {{0, {1, 2}}}}}},
2098 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
2105 .numGroupcastPackets = 1,
2106 .maxNumMpdusInPsdu = 1,
2108 .rtsThreshold = maxRtsCtsThreshold},
2109 {.expectedSkippedRetries = 4}),
2110 TestCase::Duration::QUICK);
2111 AddTestCase(
new GcrUrTest(
"GCR-UR with A-MPDU paused during test and number of packets larger "
2112 "than MPDU buffer size",
2114 .numGroupcastPackets = 300,
2115 .maxNumMpdusInPsdu = 2,
2116 .startGroupcast =
Seconds(1.0),
2118 .rtsThreshold = maxRtsCtsThreshold,
2120 {.packetsPauzeAggregation = 4, .packetsResumeAggregation = 100}),
2121 TestCase::Duration::QUICK);
2127 .numGroupcastPackets = 300,
2129 .maxNumMpdusInPsdu = 1024,
2130 .rtsThreshold = maxRtsCtsThreshold},
2132 TestCase::Duration::QUICK);
2138 .numGroupcastPackets = 300,
2140 .maxNumMpdusInPsdu = 1024,
2141 .rtsThreshold = maxRtsCtsThreshold},
2143 TestCase::Duration::QUICK);
2149 .numGroupcastPackets = 1200,
2151 .maxNumMpdusInPsdu = 1024,
2152 .rtsThreshold = maxRtsCtsThreshold},
2154 TestCase::Duration::QUICK);
2156 "sequence numbers are properly released",
2158 .numGroupcastPackets = 6,
2160 .maxNumMpdusInPsdu = 2,
2163 .rtsThreshold = 500,
2164 .rtsFramesToCorrupt = {3, 4, 5},
2165 .expectedDroppedGroupcastMpdus = {3, 4}},
2166 {.expectedSkippedRetries = 6}),
2167 TestCase::Duration::QUICK);
2169 "sequence numbers are properly released",
2171 .numGroupcastPackets = 6,
2173 .maxNumMpdusInPsdu = 2,
2176 .rtsThreshold = 500,
2177 .ctsFramesToCorrupt = {3, 4, 5},
2178 .expectedDroppedGroupcastMpdus = {3, 4}},
2179 {.expectedSkippedRetries = 6}),
2180 TestCase::Duration::QUICK);
2181 AddTestCase(
new GcrUrTest(
"GCR-UR with reduced lifetime, A-MPDU paused during test and number "
2182 "of packets larger than MPDU buffer size",
2184 .numGroupcastPackets = 300,
2186 .maxNumMpdusInPsdu = 2,
2188 .rtsThreshold = maxRtsCtsThreshold,
2190 {.expectedSkippedRetries = 4,
2191 .packetsPauzeAggregation = 4,
2192 .packetsResumeAggregation = 100}),
2193 TestCase::Duration::QUICK);
2196 for (
auto& [groupcastPackets, groupcastStartTime, unicastPackets, unicastStartTime] :
2197 std::vector<std::tuple<uint16_t, Time, uint16_t, Time>>{
2202 for (
auto& [corruptedBars, corruptedBlockAcks] :
2203 std::vector<std::pair<std::set<uint8_t>, std::set<uint8_t>>>{{{}, {}},
2208 for (
auto& [rtsThreshold, gcrPotection, protectionName] :
2209 std::vector<std::tuple<uint32_t, GroupcastProtectionMode, std::string>>{
2210 {maxRtsCtsThreshold, GroupcastProtectionMode::RTS_CTS,
"no protection"},
2211 {500, GroupcastProtectionMode::RTS_CTS,
"RTS-CTS"},
2212 {1500, GroupcastProtectionMode::CTS_TO_SELF,
"CTS-TO-SELF"}})
2214 for (
const auto& stasInfo : StationsScenarios{
2238 const auto maxChannelWidth =
2239 std::max_element(stasInfo.cbegin(),
2241 [](
const auto& lhs,
const auto& rhs) {
2242 return lhs.maxChannelWidth < rhs.maxChannelWidth;
2245 const auto useSpectrum =
2246 std::any_of(stasInfo.cbegin(),
2248 [maxChannelWidth](
const auto& staInfo) {
2249 return (staInfo.maxChannelWidth != maxChannelWidth);
2251 std::string scenario =
2252 "STAs=" + printStasInfo(stasInfo) +
", protection=" + protectionName +
2253 ", corruptBARs=" + std::to_string(!corruptedBars.empty()) +
2254 ", corruptBACKs=" + std::to_string(!corruptedBlockAcks.empty());
2255 if (unicastPackets > 0)
2257 scenario +=
", mixedGroupcastUnicast";
2258 if (unicastStartTime > groupcastStartTime)
2260 scenario +=
" (groupcast before unicast)";
2264 scenario +=
" (unicast before groupcast)";
2269 .numGroupcastPackets = groupcastPackets,
2270 .numUnicastPackets = unicastPackets,
2271 .maxNumMpdusInPsdu = 2,
2272 .startGroupcast = groupcastStartTime,
2273 .startUnicast = unicastStartTime,
2274 .rtsThreshold = rtsThreshold,
2275 .gcrProtectionMode = gcrPotection},
2276 {corruptedBars, corruptedBlockAcks}),
2277 useSpectrum ? TestCase::Duration::EXTENSIVE
2278 : TestCase::Duration::QUICK);
2279 if (GetNumNonGcrStas(stasInfo) == 0)
2283 .numGroupcastPackets = groupcastPackets,
2284 .numUnicastPackets = unicastPackets,
2285 .maxNumMpdusInPsdu = 2,
2286 .startGroupcast = groupcastStartTime,
2287 .startUnicast = unicastStartTime,
2288 .rtsThreshold = rtsThreshold,
2289 .gcrProtectionMode = gcrPotection,
2290 .mpdusToCorruptPerPsdu = {{1, {{0, {2}}}}}},
2291 {corruptedBars, corruptedBlockAcks}),
2292 useSpectrum ? TestCase::Duration::EXTENSIVE
2293 : TestCase::Duration::QUICK);
2296 .numGroupcastPackets = groupcastPackets,
2297 .numUnicastPackets = unicastPackets,
2298 .maxNumMpdusInPsdu = 2,
2299 .startGroupcast = groupcastStartTime,
2300 .startUnicast = unicastStartTime,
2301 .rtsThreshold = rtsThreshold,
2302 .gcrProtectionMode = gcrPotection,
2303 .mpdusToCorruptPerPsdu = {{1, {{0, {1}}}}}},
2304 {corruptedBars, corruptedBlockAcks}),
2305 useSpectrum ? TestCase::Duration::EXTENSIVE
2306 : TestCase::Duration::QUICK);
2309 .numGroupcastPackets = groupcastPackets,
2310 .numUnicastPackets = unicastPackets,
2311 .maxNumMpdusInPsdu = 2,
2312 .startGroupcast = groupcastStartTime,
2313 .startUnicast = unicastStartTime,
2314 .rtsThreshold = rtsThreshold,
2315 .gcrProtectionMode = gcrPotection,
2316 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}}}},
2317 {corruptedBars, corruptedBlockAcks}),
2318 useSpectrum ? TestCase::Duration::EXTENSIVE
2319 : TestCase::Duration::QUICK);
2320 if (GetNumGcrStas(stasInfo) > 1)
2323 new GcrBaTest(
"GCR-BA with second MPDU corrupted for first STA: " +
2326 .numGroupcastPackets = groupcastPackets,
2327 .numUnicastPackets = unicastPackets,
2328 .maxNumMpdusInPsdu = 2,
2329 .startGroupcast = groupcastStartTime,
2330 .startUnicast = unicastStartTime,
2331 .rtsThreshold = rtsThreshold,
2332 .gcrProtectionMode = gcrPotection,
2333 .mpdusToCorruptPerPsdu = {{1, {{1, {2}}}}}},
2334 {corruptedBars, corruptedBlockAcks}),
2335 useSpectrum ? TestCase::Duration::EXTENSIVE
2336 : TestCase::Duration::QUICK);
2338 new GcrBaTest(
"GCR-BA with first MPDU corrupted for first STA: " +
2341 .numGroupcastPackets = groupcastPackets,
2342 .numUnicastPackets = unicastPackets,
2343 .maxNumMpdusInPsdu = 2,
2344 .startGroupcast = groupcastStartTime,
2345 .startUnicast = unicastStartTime,
2346 .rtsThreshold = rtsThreshold,
2347 .gcrProtectionMode = gcrPotection,
2348 .mpdusToCorruptPerPsdu = {{1, {{1, {1}}}}}},
2349 {corruptedBars, corruptedBlockAcks}),
2350 useSpectrum ? TestCase::Duration::EXTENSIVE
2351 : TestCase::Duration::QUICK);
2354 "GCR-BA with first different MPDUs corrupted for each STA: " +
2357 .numGroupcastPackets = groupcastPackets,
2358 .numUnicastPackets = unicastPackets,
2359 .maxNumMpdusInPsdu = 2,
2360 .startGroupcast = groupcastStartTime,
2361 .startUnicast = unicastStartTime,
2362 .rtsThreshold = rtsThreshold,
2363 .gcrProtectionMode = gcrPotection,
2364 .mpdusToCorruptPerPsdu = {{1, {{1, {1}}, {2, {2}}}}}},
2365 {corruptedBars, corruptedBlockAcks}),
2366 useSpectrum ? TestCase::Duration::EXTENSIVE
2367 : TestCase::Duration::QUICK);
2369 "GCR-BA with first different MPDUs corrupted for each "
2370 "STA with different order: " +
2373 .numGroupcastPackets = groupcastPackets,
2374 .numUnicastPackets = unicastPackets,
2375 .maxNumMpdusInPsdu = 2,
2376 .startGroupcast = groupcastStartTime,
2377 .startUnicast = unicastStartTime,
2378 .rtsThreshold = rtsThreshold,
2379 .gcrProtectionMode = gcrPotection,
2380 .mpdusToCorruptPerPsdu = {{1, {{1, {2}}, {2, {1}}}}}},
2381 {corruptedBars, corruptedBlockAcks}),
2382 useSpectrum ? TestCase::Duration::EXTENSIVE
2383 : TestCase::Duration::QUICK);
2389 std::string scenario =
"GCR-BA with dropped MPDU because of lifetime expiry";
2390 if (unicastPackets > 0)
2392 scenario +=
", mixedGroupcastUnicast";
2393 if (unicastStartTime > groupcastStartTime)
2395 scenario +=
" (groupcast before unicast)";
2399 scenario +=
" (unicast before groupcast)";
2405 .numGroupcastPackets =
2406 uint16_t(groupcastPackets *
2408 .numUnicastPackets = unicastPackets,
2409 .maxNumMpdusInPsdu = 2,
2410 .startGroupcast = groupcastStartTime,
2411 .startUnicast = unicastStartTime,
2413 .rtsThreshold = maxRtsCtsThreshold,
2414 .mpdusToCorruptPerPsdu =
2415 {{1, {{0, {2}}}}, {2, {{0, {2}}}}, {3, {{0, {2}}}}, {4, {{0, {2}}}}},
2416 .expectedDroppedGroupcastMpdus = {2}},
2418 TestCase::Duration::QUICK);
2420 if (unicastPackets > 0)
2422 if (unicastStartTime > groupcastStartTime)
2424 scenario +=
"Groupcast followed by unicast";
2428 scenario +=
"Unicast followed by groupcast";
2433 scenario +=
"GCR-BA";
2435 scenario +=
" with ";
2438 .numGroupcastPackets = groupcastPackets,
2439 .numUnicastPackets = unicastPackets,
2440 .maxNumMpdusInPsdu = 2,
2441 .startGroupcast = groupcastStartTime,
2442 .startUnicast = unicastStartTime,
2443 .rtsThreshold = maxRtsCtsThreshold,
2444 .addbaReqsToCorrupt = {1}},
2446 TestCase::Duration::QUICK);
2449 .numGroupcastPackets = groupcastPackets,
2450 .numUnicastPackets = unicastPackets,
2451 .maxNumMpdusInPsdu = 2,
2452 .startGroupcast = groupcastStartTime,
2453 .startUnicast = unicastStartTime,
2454 .rtsThreshold = maxRtsCtsThreshold,
2455 .addbaRespsToCorrupt = {1}},
2457 TestCase::Duration::QUICK);
2460 .numGroupcastPackets = groupcastPackets,
2461 .numUnicastPackets = unicastPackets,
2462 .maxNumMpdusInPsdu = 2,
2463 .startGroupcast = groupcastStartTime,
2464 .startUnicast = unicastStartTime,
2465 .rtsThreshold = maxRtsCtsThreshold,
2466 .addbaReqsToCorrupt = {1, 2, 3, 4, 5, 6, 7, 8}},
2468 TestCase::Duration::QUICK);
2471 .numGroupcastPackets = groupcastPackets,
2472 .numUnicastPackets = uint16_t(unicastPackets * 2),
2473 .maxNumMpdusInPsdu = 2,
2474 .startGroupcast = groupcastStartTime,
2475 .startUnicast = unicastStartTime,
2476 .rtsThreshold = maxRtsCtsThreshold,
2477 .baInactivityTimeout = 10},
2479 TestCase::Duration::QUICK);
2482 "GCR-BA with BARs sent over 2 TXOPs because of TXOP limit",
2486 .numGroupcastPackets = 2,
2487 .maxNumMpdusInPsdu = 2,
2489 .rtsThreshold = maxRtsCtsThreshold,
2491 {.expectedNTxBarsPerTxop = {1, 2}}),
2492 TestCase::Duration::QUICK);
2497 .numGroupcastPackets = 2,
2498 .maxNumMpdusInPsdu = 2,
2500 .rtsThreshold = maxRtsCtsThreshold,
2502 {.expectedNTxBarsPerTxop = {1, 2, 1, 2}}),
2503 TestCase::Duration::QUICK);
2506 .numGroupcastPackets = 300,
2507 .maxNumMpdusInPsdu = 2,
2508 .rtsThreshold = maxRtsCtsThreshold},
2510 TestCase::Duration::QUICK);
2516 .numGroupcastPackets = 300,
2518 .maxNumMpdusInPsdu = 1024,
2519 .rtsThreshold = maxRtsCtsThreshold},
2521 TestCase::Duration::QUICK);
2527 .numGroupcastPackets = 300,
2529 .maxNumMpdusInPsdu = 1024,
2530 .rtsThreshold = maxRtsCtsThreshold},
2533 TestCase::Duration::QUICK);
2539 .numGroupcastPackets = 1200,
2541 .maxNumMpdusInPsdu = 1024,
2542 .rtsThreshold = maxRtsCtsThreshold},
2544 TestCase::Duration::QUICK);
2546 "sequence numbers are properly released",
2548 .numGroupcastPackets = 6,
2550 .maxNumMpdusInPsdu = 2,
2553 .rtsThreshold = 500,
2554 .rtsFramesToCorrupt = {2, 3, 4},
2555 .expectedDroppedGroupcastMpdus = {3, 4}},
2557 TestCase::Duration::QUICK);
2559 "sequence numbers are properly released",
2561 .numGroupcastPackets = 6,
2563 .maxNumMpdusInPsdu = 2,
2566 .rtsThreshold = 500,
2567 .ctsFramesToCorrupt = {2, 3, 4},
2568 .expectedDroppedGroupcastMpdus = {3, 4}},
2570 TestCase::Duration::QUICK);