1802 using StationsScenarios = std::vector<std::vector<GcrTestBase::StaInfo>>;
1805 for (
auto& [useAmpdu, ampduScenario] :
1806 std::vector<std::pair<bool, std::string>>{{
false,
"A-MPDU disabled"},
1807 {
true,
"A-MPDU enabled"}})
1809 for (
auto& [rtsThreshold, gcrPotection, protectionName] :
1810 std::vector<std::tuple<uint32_t, GroupcastProtectionMode, std::string>>{
1811 {maxRtsCtsThreshold, GroupcastProtectionMode::RTS_CTS,
"no protection"},
1812 {500, GroupcastProtectionMode::RTS_CTS,
"RTS-CTS"},
1813 {1500, GroupcastProtectionMode::CTS_TO_SELF,
"CTS-TO-SELF"}})
1815 for (
const auto& stasInfo : StationsScenarios{
1831 const auto maxChannelWidth =
1832 std::max_element(stasInfo.cbegin(),
1834 [](
const auto& lhs,
const auto& rhs) {
1835 return lhs.maxChannelWidth < rhs.maxChannelWidth;
1838 const auto useSpectrum =
1839 std::any_of(stasInfo.cbegin(),
1841 [maxChannelWidth](
const auto& staInfo) {
1842 return (staInfo.maxChannelWidth != maxChannelWidth);
1844 const std::string scenario =
"STAs=" + printStasInfo(stasInfo) +
1845 ", protection=" + protectionName +
", " +
1848 new GcrUrTest(
"GCR-UR without any lost frames: " + scenario,
1850 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1851 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1852 .rtsThreshold = rtsThreshold,
1853 .gcrProtectionMode = gcrPotection},
1855 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1857 new GcrUrTest(
"GCR-UR with first frame lost: " + scenario,
1859 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1860 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1861 .rtsThreshold = rtsThreshold,
1862 .gcrProtectionMode = gcrPotection,
1864 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}}}},
1866 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1868 new GcrUrTest(
"GCR-UR with all but last frame lost: " + scenario,
1870 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1871 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1872 .rtsThreshold = rtsThreshold,
1873 .gcrProtectionMode = gcrPotection,
1875 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1881 {7, {{0, {1, 2}}}}}},
1883 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1885 new GcrUrTest(
"GCR-UR with all frames lost: " + scenario,
1887 .numGroupcastPackets = useAmpdu ? uint16_t(4) : uint16_t(2),
1888 .maxNumMpdusInPsdu = useAmpdu ? uint16_t(2) : uint16_t(1),
1889 .rtsThreshold = rtsThreshold,
1890 .gcrProtectionMode = gcrPotection,
1892 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1899 {8, {{0, {1, 2}}}}}},
1901 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1902 if ((GetNumNonGcrStas(stasInfo) == 0) && useAmpdu)
1905 new GcrUrTest(
"GCR-UR with 1 MPDU always corrupted in first A-MPDU but one "
1906 "different MPDU alternatively, starting with second MPDU: " +
1909 .numGroupcastPackets = 4,
1910 .maxNumMpdusInPsdu = 2,
1911 .rtsThreshold = rtsThreshold,
1912 .gcrProtectionMode = gcrPotection,
1913 .mpdusToCorruptPerPsdu = {{1, {{0, {2}}}},
1922 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1924 new GcrUrTest(
"GCR-UR with 1 MPDU always corrupted in first A-MPDU but one "
1925 "different MPDU alternatively, starting with first MPDU: " +
1928 .numGroupcastPackets = 4,
1929 .maxNumMpdusInPsdu = 2,
1930 .rtsThreshold = rtsThreshold,
1931 .gcrProtectionMode = gcrPotection,
1932 .mpdusToCorruptPerPsdu = {{1, {{0, {1}}}},
1941 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1943 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in first A-MPDU "
1944 "except the first MPDU in the last retransmission: " +
1947 .numGroupcastPackets = 4,
1948 .maxNumMpdusInPsdu = 2,
1949 .rtsThreshold = rtsThreshold,
1950 .gcrProtectionMode = gcrPotection,
1951 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1960 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1962 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in first A-MPDU "
1963 "except the second MPDU in the last retransmission: " +
1966 .numGroupcastPackets = 4,
1967 .maxNumMpdusInPsdu = 2,
1968 .rtsThreshold = rtsThreshold,
1969 .gcrProtectionMode = gcrPotection,
1970 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1979 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1981 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in first A-MPDU: " +
1984 .numGroupcastPackets = 4,
1985 .maxNumMpdusInPsdu = 2,
1986 .rtsThreshold = rtsThreshold,
1987 .gcrProtectionMode = gcrPotection,
1988 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}},
1995 {8, {{0, {1, 2}}}}}},
1997 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
1999 "GCR-UR with 1 MPDU always corrupted in second A-MPDU but one "
2000 "different MPDU alternatively, starting with second MPDU: " +
2003 .numGroupcastPackets = 4,
2004 .maxNumMpdusInPsdu = 2,
2005 .rtsThreshold = rtsThreshold,
2006 .gcrProtectionMode = gcrPotection,
2007 .mpdusToCorruptPerPsdu = {{9, {{0, {2}}}},
2016 useSpectrum ? TestCase::Duration::EXTENSIVE
2017 : TestCase::Duration::QUICK);
2019 "GCR-UR with 1 MPDU always corrupted in second A-MPDU but one "
2020 "different MPDU alternatively, starting with first MPDU: " +
2023 .numGroupcastPackets = 4,
2024 .maxNumMpdusInPsdu = 2,
2025 .rtsThreshold = rtsThreshold,
2026 .gcrProtectionMode = gcrPotection,
2027 .mpdusToCorruptPerPsdu = {{9, {{0, {1}}}},
2036 useSpectrum ? TestCase::Duration::EXTENSIVE
2037 : TestCase::Duration::QUICK);
2039 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in second A-MPDU "
2040 "except the first MPDU in the last retransmission: " +
2043 .numGroupcastPackets = 4,
2044 .maxNumMpdusInPsdu = 2,
2045 .rtsThreshold = rtsThreshold,
2046 .gcrProtectionMode = gcrPotection,
2047 .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
2048 {10, {{0, {1, 2}}}},
2049 {11, {{0, {1, 2}}}},
2050 {12, {{0, {1, 2}}}},
2051 {13, {{0, {1, 2}}}},
2052 {14, {{0, {1, 2}}}},
2053 {15, {{0, {1, 2}}}},
2056 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
2058 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in second A-MPDU "
2059 "except the second MPDU in the last retransmission: " +
2062 .numGroupcastPackets = 4,
2063 .maxNumMpdusInPsdu = 2,
2064 .rtsThreshold = rtsThreshold,
2065 .gcrProtectionMode = gcrPotection,
2066 .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
2067 {10, {{0, {1, 2}}}},
2068 {11, {{0, {1, 2}}}},
2069 {12, {{0, {1, 2}}}},
2070 {13, {{0, {1, 2}}}},
2071 {14, {{0, {1, 2}}}},
2072 {15, {{0, {1, 2}}}},
2075 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
2077 new GcrUrTest(
"GCR-UR with all MPDUs always corrupted in second A-MPDU: " +
2080 .numGroupcastPackets = 4,
2081 .maxNumMpdusInPsdu = 2,
2082 .rtsThreshold = rtsThreshold,
2083 .gcrProtectionMode = gcrPotection,
2084 .mpdusToCorruptPerPsdu = {{9, {{0, {1, 2}}}},
2085 {10, {{0, {1, 2}}}},
2086 {11, {{0, {1, 2}}}},
2087 {12, {{0, {1, 2}}}},
2088 {13, {{0, {1, 2}}}},
2089 {14, {{0, {1, 2}}}},
2090 {15, {{0, {1, 2}}}},
2091 {16, {{0, {1, 2}}}}}},
2093 useSpectrum ? TestCase::Duration::EXTENSIVE : TestCase::Duration::QUICK);
2100 .numGroupcastPackets = 1,
2101 .maxNumMpdusInPsdu = 1,
2103 .rtsThreshold = maxRtsCtsThreshold},
2104 {.expectedSkippedRetries = 4}),
2105 TestCase::Duration::QUICK);
2106 AddTestCase(
new GcrUrTest(
"GCR-UR with A-MPDU paused during test and number of packets larger "
2107 "than MPDU buffer size",
2109 .numGroupcastPackets = 300,
2110 .maxNumMpdusInPsdu = 2,
2111 .startGroupcast =
Seconds(1.0),
2113 .rtsThreshold = maxRtsCtsThreshold,
2115 {.packetsPauzeAggregation = 4, .packetsResumeAggregation = 100}),
2116 TestCase::Duration::QUICK);
2122 .numGroupcastPackets = 300,
2124 .maxNumMpdusInPsdu = 1024,
2125 .rtsThreshold = maxRtsCtsThreshold},
2127 TestCase::Duration::QUICK);
2133 .numGroupcastPackets = 300,
2135 .maxNumMpdusInPsdu = 1024,
2136 .rtsThreshold = maxRtsCtsThreshold},
2138 TestCase::Duration::QUICK);
2144 .numGroupcastPackets = 1200,
2146 .maxNumMpdusInPsdu = 1024,
2147 .rtsThreshold = maxRtsCtsThreshold},
2149 TestCase::Duration::QUICK);
2151 "sequence numbers are properly released",
2153 .numGroupcastPackets = 6,
2155 .maxNumMpdusInPsdu = 2,
2158 .rtsThreshold = 500,
2159 .rtsFramesToCorrupt = {3, 4, 5},
2160 .expectedDroppedGroupcastMpdus = {3, 4}},
2161 {.expectedSkippedRetries = 6}),
2162 TestCase::Duration::QUICK);
2164 "sequence numbers are properly released",
2166 .numGroupcastPackets = 6,
2168 .maxNumMpdusInPsdu = 2,
2171 .rtsThreshold = 500,
2172 .ctsFramesToCorrupt = {3, 4, 5},
2173 .expectedDroppedGroupcastMpdus = {3, 4}},
2174 {.expectedSkippedRetries = 6}),
2175 TestCase::Duration::QUICK);
2176 AddTestCase(
new GcrUrTest(
"GCR-UR with reduced lifetime, A-MPDU paused during test and number "
2177 "of packets larger than MPDU buffer size",
2179 .numGroupcastPackets = 300,
2181 .maxNumMpdusInPsdu = 2,
2183 .rtsThreshold = maxRtsCtsThreshold,
2185 {.expectedSkippedRetries = 4,
2186 .packetsPauzeAggregation = 4,
2187 .packetsResumeAggregation = 100}),
2188 TestCase::Duration::QUICK);
2191 for (
auto& [groupcastPackets, groupcastStartTime, unicastPackets, unicastStartTime] :
2192 std::vector<std::tuple<uint16_t, Time, uint16_t, Time>>{
2197 for (
auto& [corruptedBars, corruptedBlockAcks] :
2198 std::vector<std::pair<std::set<uint8_t>, std::set<uint8_t>>>{{{}, {}},
2203 for (
auto& [rtsThreshold, gcrPotection, protectionName] :
2204 std::vector<std::tuple<uint32_t, GroupcastProtectionMode, std::string>>{
2205 {maxRtsCtsThreshold, GroupcastProtectionMode::RTS_CTS,
"no protection"},
2206 {500, GroupcastProtectionMode::RTS_CTS,
"RTS-CTS"},
2207 {1500, GroupcastProtectionMode::CTS_TO_SELF,
"CTS-TO-SELF"}})
2209 for (
const auto& stasInfo : StationsScenarios{
2233 const auto maxChannelWidth =
2234 std::max_element(stasInfo.cbegin(),
2236 [](
const auto& lhs,
const auto& rhs) {
2237 return lhs.maxChannelWidth < rhs.maxChannelWidth;
2240 const auto useSpectrum =
2241 std::any_of(stasInfo.cbegin(),
2243 [maxChannelWidth](
const auto& staInfo) {
2244 return (staInfo.maxChannelWidth != maxChannelWidth);
2246 std::string scenario =
2247 "STAs=" + printStasInfo(stasInfo) +
", protection=" + protectionName +
2248 ", corruptBARs=" + std::to_string(!corruptedBars.empty()) +
2249 ", corruptBACKs=" + std::to_string(!corruptedBlockAcks.empty());
2250 if (unicastPackets > 0)
2252 scenario +=
", mixedGroupcastUnicast";
2253 if (unicastStartTime > groupcastStartTime)
2255 scenario +=
" (groupcast before unicast)";
2259 scenario +=
" (unicast before groupcast)";
2264 .numGroupcastPackets = groupcastPackets,
2265 .numUnicastPackets = unicastPackets,
2266 .maxNumMpdusInPsdu = 2,
2267 .startGroupcast = groupcastStartTime,
2268 .startUnicast = unicastStartTime,
2269 .rtsThreshold = rtsThreshold,
2270 .gcrProtectionMode = gcrPotection},
2271 {corruptedBars, corruptedBlockAcks}),
2272 useSpectrum ? TestCase::Duration::EXTENSIVE
2273 : TestCase::Duration::QUICK);
2274 if (GetNumNonGcrStas(stasInfo) == 0)
2278 .numGroupcastPackets = groupcastPackets,
2279 .numUnicastPackets = unicastPackets,
2280 .maxNumMpdusInPsdu = 2,
2281 .startGroupcast = groupcastStartTime,
2282 .startUnicast = unicastStartTime,
2283 .rtsThreshold = rtsThreshold,
2284 .gcrProtectionMode = gcrPotection,
2285 .mpdusToCorruptPerPsdu = {{1, {{0, {2}}}}}},
2286 {corruptedBars, corruptedBlockAcks}),
2287 useSpectrum ? TestCase::Duration::EXTENSIVE
2288 : TestCase::Duration::QUICK);
2291 .numGroupcastPackets = groupcastPackets,
2292 .numUnicastPackets = unicastPackets,
2293 .maxNumMpdusInPsdu = 2,
2294 .startGroupcast = groupcastStartTime,
2295 .startUnicast = unicastStartTime,
2296 .rtsThreshold = rtsThreshold,
2297 .gcrProtectionMode = gcrPotection,
2298 .mpdusToCorruptPerPsdu = {{1, {{0, {1}}}}}},
2299 {corruptedBars, corruptedBlockAcks}),
2300 useSpectrum ? TestCase::Duration::EXTENSIVE
2301 : TestCase::Duration::QUICK);
2304 .numGroupcastPackets = groupcastPackets,
2305 .numUnicastPackets = unicastPackets,
2306 .maxNumMpdusInPsdu = 2,
2307 .startGroupcast = groupcastStartTime,
2308 .startUnicast = unicastStartTime,
2309 .rtsThreshold = rtsThreshold,
2310 .gcrProtectionMode = gcrPotection,
2311 .mpdusToCorruptPerPsdu = {{1, {{0, {1, 2}}}}}},
2312 {corruptedBars, corruptedBlockAcks}),
2313 useSpectrum ? TestCase::Duration::EXTENSIVE
2314 : TestCase::Duration::QUICK);
2315 if (GetNumGcrStas(stasInfo) > 1)
2318 new GcrBaTest(
"GCR-BA with second MPDU corrupted for first STA: " +
2321 .numGroupcastPackets = groupcastPackets,
2322 .numUnicastPackets = unicastPackets,
2323 .maxNumMpdusInPsdu = 2,
2324 .startGroupcast = groupcastStartTime,
2325 .startUnicast = unicastStartTime,
2326 .rtsThreshold = rtsThreshold,
2327 .gcrProtectionMode = gcrPotection,
2328 .mpdusToCorruptPerPsdu = {{1, {{1, {2}}}}}},
2329 {corruptedBars, corruptedBlockAcks}),
2330 useSpectrum ? TestCase::Duration::EXTENSIVE
2331 : TestCase::Duration::QUICK);
2333 new GcrBaTest(
"GCR-BA with first MPDU corrupted for first STA: " +
2336 .numGroupcastPackets = groupcastPackets,
2337 .numUnicastPackets = unicastPackets,
2338 .maxNumMpdusInPsdu = 2,
2339 .startGroupcast = groupcastStartTime,
2340 .startUnicast = unicastStartTime,
2341 .rtsThreshold = rtsThreshold,
2342 .gcrProtectionMode = gcrPotection,
2343 .mpdusToCorruptPerPsdu = {{1, {{1, {1}}}}}},
2344 {corruptedBars, corruptedBlockAcks}),
2345 useSpectrum ? TestCase::Duration::EXTENSIVE
2346 : TestCase::Duration::QUICK);
2349 "GCR-BA with first different MPDUs corrupted for each STA: " +
2352 .numGroupcastPackets = groupcastPackets,
2353 .numUnicastPackets = unicastPackets,
2354 .maxNumMpdusInPsdu = 2,
2355 .startGroupcast = groupcastStartTime,
2356 .startUnicast = unicastStartTime,
2357 .rtsThreshold = rtsThreshold,
2358 .gcrProtectionMode = gcrPotection,
2359 .mpdusToCorruptPerPsdu = {{1, {{1, {1}}, {2, {2}}}}}},
2360 {corruptedBars, corruptedBlockAcks}),
2361 useSpectrum ? TestCase::Duration::EXTENSIVE
2362 : TestCase::Duration::QUICK);
2364 "GCR-BA with first different MPDUs corrupted for each "
2365 "STA with different order: " +
2368 .numGroupcastPackets = groupcastPackets,
2369 .numUnicastPackets = unicastPackets,
2370 .maxNumMpdusInPsdu = 2,
2371 .startGroupcast = groupcastStartTime,
2372 .startUnicast = unicastStartTime,
2373 .rtsThreshold = rtsThreshold,
2374 .gcrProtectionMode = gcrPotection,
2375 .mpdusToCorruptPerPsdu = {{1, {{1, {2}}, {2, {1}}}}}},
2376 {corruptedBars, corruptedBlockAcks}),
2377 useSpectrum ? TestCase::Duration::EXTENSIVE
2378 : TestCase::Duration::QUICK);
2384 std::string scenario =
"GCR-BA with dropped MPDU because of lifetime expiry";
2385 if (unicastPackets > 0)
2387 scenario +=
", mixedGroupcastUnicast";
2388 if (unicastStartTime > groupcastStartTime)
2390 scenario +=
" (groupcast before unicast)";
2394 scenario +=
" (unicast before groupcast)";
2400 .numGroupcastPackets =
2401 uint16_t(groupcastPackets *
2403 .numUnicastPackets = unicastPackets,
2404 .maxNumMpdusInPsdu = 2,
2405 .startGroupcast = groupcastStartTime,
2406 .startUnicast = unicastStartTime,
2408 .rtsThreshold = maxRtsCtsThreshold,
2409 .mpdusToCorruptPerPsdu =
2410 {{1, {{0, {2}}}}, {2, {{0, {2}}}}, {3, {{0, {2}}}}, {4, {{0, {2}}}}},
2411 .expectedDroppedGroupcastMpdus = {2}},
2413 TestCase::Duration::QUICK);
2415 if (unicastPackets > 0)
2417 if (unicastStartTime > groupcastStartTime)
2419 scenario +=
"Groupcast followed by unicast";
2423 scenario +=
"Unicast followed by groupcast";
2428 scenario +=
"GCR-BA";
2430 scenario +=
" with ";
2433 .numGroupcastPackets = groupcastPackets,
2434 .numUnicastPackets = unicastPackets,
2435 .maxNumMpdusInPsdu = 2,
2436 .startGroupcast = groupcastStartTime,
2437 .startUnicast = unicastStartTime,
2438 .rtsThreshold = maxRtsCtsThreshold,
2439 .addbaReqsToCorrupt = {1}},
2441 TestCase::Duration::QUICK);
2444 .numGroupcastPackets = groupcastPackets,
2445 .numUnicastPackets = unicastPackets,
2446 .maxNumMpdusInPsdu = 2,
2447 .startGroupcast = groupcastStartTime,
2448 .startUnicast = unicastStartTime,
2449 .rtsThreshold = maxRtsCtsThreshold,
2450 .addbaRespsToCorrupt = {1}},
2452 TestCase::Duration::QUICK);
2455 .numGroupcastPackets = groupcastPackets,
2456 .numUnicastPackets = unicastPackets,
2457 .maxNumMpdusInPsdu = 2,
2458 .startGroupcast = groupcastStartTime,
2459 .startUnicast = unicastStartTime,
2460 .rtsThreshold = maxRtsCtsThreshold,
2461 .addbaReqsToCorrupt = {1, 2, 3, 4, 5, 6, 7, 8}},
2463 TestCase::Duration::QUICK);
2466 .numGroupcastPackets = groupcastPackets,
2467 .numUnicastPackets = uint16_t(unicastPackets * 2),
2468 .maxNumMpdusInPsdu = 2,
2469 .startGroupcast = groupcastStartTime,
2470 .startUnicast = unicastStartTime,
2471 .rtsThreshold = maxRtsCtsThreshold,
2472 .baInactivityTimeout = 10},
2474 TestCase::Duration::QUICK);
2477 "GCR-BA with BARs sent over 2 TXOPs because of TXOP limit",
2481 .numGroupcastPackets = 2,
2482 .maxNumMpdusInPsdu = 2,
2484 .rtsThreshold = maxRtsCtsThreshold,
2486 {.expectedNTxBarsPerTxop = {1, 2}}),
2487 TestCase::Duration::QUICK);
2492 .numGroupcastPackets = 2,
2493 .maxNumMpdusInPsdu = 2,
2495 .rtsThreshold = maxRtsCtsThreshold,
2497 {.expectedNTxBarsPerTxop = {1, 2, 1, 2}}),
2498 TestCase::Duration::QUICK);
2501 .numGroupcastPackets = 300,
2502 .maxNumMpdusInPsdu = 2,
2503 .rtsThreshold = maxRtsCtsThreshold},
2505 TestCase::Duration::QUICK);
2511 .numGroupcastPackets = 300,
2513 .maxNumMpdusInPsdu = 1024,
2514 .rtsThreshold = maxRtsCtsThreshold},
2516 TestCase::Duration::QUICK);
2522 .numGroupcastPackets = 300,
2524 .maxNumMpdusInPsdu = 1024,
2525 .rtsThreshold = maxRtsCtsThreshold},
2528 TestCase::Duration::QUICK);
2534 .numGroupcastPackets = 1200,
2536 .maxNumMpdusInPsdu = 1024,
2537 .rtsThreshold = maxRtsCtsThreshold},
2539 TestCase::Duration::QUICK);
2541 "sequence numbers are properly released",
2543 .numGroupcastPackets = 6,
2545 .maxNumMpdusInPsdu = 2,
2548 .rtsThreshold = 500,
2549 .rtsFramesToCorrupt = {2, 3, 4},
2550 .expectedDroppedGroupcastMpdus = {3, 4}},
2552 TestCase::Duration::QUICK);
2554 "sequence numbers are properly released",
2556 .numGroupcastPackets = 6,
2558 .maxNumMpdusInPsdu = 2,
2561 .rtsThreshold = 500,
2562 .ctsFramesToCorrupt = {2, 3, 4},
2563 .expectedDroppedGroupcastMpdus = {3, 4}},
2565 TestCase::Duration::QUICK);