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);