512    const auto totalFailures = wifiTxStats.
GetFailures();
 
  519    auto nodeDeviceTuple = std::make_tuple(nodeId, deviceId);
 
  520    auto nodeDeviceLink0Tuple = std::make_tuple(nodeId, deviceId, 0);
 
  521    auto nodeDeviceLink1Tuple = std::make_tuple(nodeId, deviceId, 1);
 
  525        const auto totalFailuresDrop =
 
  526            wifiTxStats.
GetFailures(WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT);
 
  528            WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT);
 
  532                              "Number of success packets should be 2");
 
  535                              "Number of success packets should be 2");
 
  540                              "Number of retransmitted successful packets should be 1");
 
  543                              "Number of retransmitted successful packets should be 1");
 
  547                              "Number of failed packets should be 1");
 
  552            "Number of dropped packets (aggregate) due to retry limit reached should be 1");
 
  554            totalFailuresDropMap.at(nodeDeviceTuple),
 
  556            "Number of dropped packets (aggregate) due to retry limit reached should be 1");
 
  558        auto successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  561                              "Source node ID of the 1st successful data packet should be 1");
 
  562        std::advance(successRecordIt, 1);
 
  565                              "Source node ID of the 2nd successful data packet should be 1");
 
  566        auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
  569                              "Source node ID of the failed data packet should be 1");
 
  571        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  573            successRecordIt->m_retransmissions,
 
  575            "The retransmission count of the 1st successful data packet should be 0");
 
  576        std::advance(successRecordIt, 1);
 
  578            successRecordIt->m_retransmissions,
 
  580            "The retransmission count of the 2nd successful data packet should be 1");
 
  583                              "The retransmission count of the failed data packet should be 6");
 
  585        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  588                              "The 1st successful data packet should have been TXed");
 
  589        std::advance(successRecordIt, 1);
 
  592                              "The 2nd successful data packet should have been TXed");
 
  595                              "The failed data packet should have been TXed");
 
  597        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  600                              "The 1st successful data packet should have been acked");
 
  601        std::advance(successRecordIt, 1);
 
  604                              "The 2nd successful data packet should have been acked");
 
  607                              "The failed data packet should not have been acked");
 
  609        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  612                              "The 1st successful data packet should have been dequeued");
 
  613        std::advance(successRecordIt, 1);
 
  616                              "The 2nd successful data packet should have been dequeued");
 
  618                                  failureRecordIt->m_dropTime.value().IsStrictlyPositive(),
 
  620                              "The failed data packet should have been dequeued");
 
  622        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  623        auto successRecordItNext = successRecordIt;
 
  624        std::advance(successRecordItNext, 1);
 
  626                              successRecordItNext->m_enqueueTime,
 
  627                              "Three packets should be enqueued at the same time");
 
  629                              failureRecordIt->m_enqueueTime,
 
  630                              "Three packets should be enqueued at the same time");
 
  632        successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  634                                    successRecordIt->m_enqueueTime,
 
  635                                    "Packets should be TXed after enqueued");
 
  637                                    successRecordIt->m_enqueueTime + tolerance +
 
  639                                    "Packet backoff slots should not exceed cwMin");
 
  643                              "Wrong TX start time");
 
  648                                    "Wrong Ack reception time");
 
  653                                    "Wrong Ack reception time");
 
  654        std::advance(successRecordIt, 1);
 
  658                                    "Packets should be TXed after enqueued");
 
  663                                    "Packet backoff slots should not exceed cwMin");
 
  666                              "Wrong TX start time");
 
  671                                    "Wrong Ack reception time");
 
  673            successRecordIt->m_ackTime,
 
  677            "Wrong Ack reception time");
 
  682                                    "Packets should be TXed after enqueued");
 
  687                                    "Packet backoff slots should not exceed cwMin");
 
  690                              "Wrong TX start time");
 
  692                                  failureRecordIt->m_dropReason.has_value(),
 
  694                              "Missing drop time or reason");
 
  698                                    "Wrong Dequeue time for failed packet");
 
  703                                    "Wrong Dequeue time for failed packet");
 
  705                              WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT,
 
  706                              "Wrong drop reason");
 
  710        const auto totalFailuresQos =
 
  711            wifiTxStats.
GetFailures(WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET);
 
  712        const auto totalFailuresQosMap =
 
  715        for (std::vector<Time>::size_type i = 0; i < 
m_txStartTimes[0].size(); ++i)
 
  719        for (std::vector<Time>::size_type i = 0; i < 
m_txStartTimes[1].size(); ++i)
 
  726                              "Number of success packets on link 0 should be 2");
 
  729                              "Number of success packets on link 1 should be 2");
 
  732                              "Number of success packets should be 4");
 
  737                              "Number of retransmitted successful packets should be 2");
 
  740                              "Number of retransmitted successful packets (aggregate) should be 2");
 
  743                              "Number of failed packets should be 2");
 
  747                              "Number of dropped packets (aggregate) by QosTxop should be 2");
 
  750                              "Number of dropped packets (aggregate) by QosTxop should be 2");
 
  752        auto successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  754            successRecordLink0It->m_nodeId,
 
  756            "Source node ID of the 1st successful data packet on link 0 should be 1");
 
  757        std::advance(successRecordLink0It, 1);
 
  759            successRecordLink0It->m_nodeId,
 
  761            "Source node ID of the 2nd successful data packet on link 0 should be 1");
 
  762        auto successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
  764            successRecordLink1It->m_nodeId,
 
  766            "Source node ID of the 1st successful data packet on link 0 should be 1");
 
  767        std::advance(successRecordLink1It, 1);
 
  769            successRecordLink1It->m_nodeId,
 
  771            "Source node ID of the 2nd successful data packet on link 0 should be 1");
 
  772        auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
  775                              "Source node ID of the failed data packet on link 0 should be 1");
 
  776        std::advance(failureRecordIt, 1);
 
  779                              "Source node ID of the failed data packet on link 1 should be 1");
 
  781        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  784                              "Device ID of the 1st successful data packet on link 0 should be 0");
 
  785        std::advance(successRecordLink0It, 1);
 
  788                              "Device ID of the 2nd successful data packet on link 0 should be 0");
 
  789        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
  792                              "Device ID of the 1st successful data packet on link 0 should be 0");
 
  793        std::advance(successRecordLink1It, 1);
 
  796                              "Device ID of the 2nd successful data packet on link 1 should be 0");
 
  797        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
  800                              "Device ID of the failed data packet on link 1 should be 0");
 
  801        std::advance(failureRecordIt, 1);
 
  804                              "Device ID of the failed data packet on link 1 should be 0");
 
  806        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  808            *successRecordLink0It->m_successLinkIdSet.begin(),
 
  810            "Successful link ID of the 1st successful data packet on link 0 should be 0");
 
  811        std::advance(successRecordLink0It, 1);
 
  813            *successRecordLink0It->m_successLinkIdSet.begin(),
 
  815            "Successful link ID of the 2nd successful data packet on link 0 should be 0");
 
  816        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
  818            *successRecordLink1It->m_successLinkIdSet.begin(),
 
  820            "Successful link ID of the 1st successful data packet on link 1 should be 1");
 
  821        std::advance(successRecordLink1It, 1);
 
  823            *successRecordLink1It->m_successLinkIdSet.begin(),
 
  825            "Successful link ID of the 2nd successful data packet on link 1 should be 1");
 
  826        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
  828            failureRecordIt->m_successLinkIdSet.empty(),
 
  830            "Successful link ID set of the failed data packet on link 0 should be empty");
 
  831        std::advance(failureRecordIt, 1);
 
  833            failureRecordIt->m_successLinkIdSet.empty(),
 
  835            "Successful link ID set of the failed data packet on link 1 should be empty");
 
  837        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  839            successRecordLink0It->m_retransmissions,
 
  841            "The 1st successful data packet on link 0 should have no retransmissions");
 
  842        std::advance(successRecordLink0It, 1);
 
  844            successRecordLink0It->m_retransmissions,
 
  846            "The 2nd successful data packet on link 0 should have 1 retransmission");
 
  847        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
  849            successRecordLink1It->m_retransmissions,
 
  851            "The 1st successful data packet on link 1 should have no retransmissions");
 
  852        std::advance(successRecordLink1It, 1);
 
  854            successRecordLink1It->m_retransmissions,
 
  856            "The 2nd successful data packet on link 1 should have 1 retransmission");
 
  857        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
  860                              "The failed data packet on link 0 should have 8 retransmissions");
 
  861        std::advance(failureRecordIt, 1);
 
  864                              "The failed data packet on link 1 should have 8 retransmissions");
 
  866        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  869                              "The 1st successful data packet on link 0 should have a TID of 3");
 
  870        std::advance(successRecordLink0It, 1);
 
  873                              "The 2nd successful data packet on link 0 should have a TID of 3");
 
  874        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
  877                              "The 1st successful data packet on link 1 should have a TID of 4");
 
  878        std::advance(successRecordLink1It, 1);
 
  881                              "The 2nd successful data packet on link 1 should have a TID of 4");
 
  882        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
  885                              "The failed data packet on link 0 should have a TID of 3");
 
  886        std::advance(failureRecordIt, 1);
 
  889                              "The failed data packet on link 1 should have a TID of 4");
 
  891        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  893            successRecordLink0It->m_mpduSeqNum,
 
  895            "The 1st successful data packet on link 0 should have a Seq Num of 0");
 
  896        std::advance(successRecordLink0It, 1);
 
  898            successRecordLink0It->m_mpduSeqNum,
 
  900            "The 2nd successful data packet on link 0 should have a Seq Num of 1");
 
  901        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
  903            successRecordLink1It->m_mpduSeqNum,
 
  905            "The 1st successful data packet on link 1 should have a Seq Num of 0");
 
  906        std::advance(successRecordLink1It, 1);
 
  908            successRecordLink1It->m_mpduSeqNum,
 
  910            "The 2nd successful data packet on link 1 should have a Seq Num of 2");
 
  911        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
  914                              "The failed data packet on link 0 should have a Seq Num of 2");
 
  915        std::advance(failureRecordIt, 1);
 
  918                              "The failed data packet on link 1 should have a Seq Num of 1");
 
  920        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  923                              "The 1st successful data packet on link 0 should have been TXed");
 
  924        std::advance(successRecordLink0It, 1);
 
  927                              "The 2nd successful data packet on link 0 should have been TXed");
 
  928        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
  931                              "The 1st successful data packet on link 1 should have been TXed");
 
  932        std::advance(successRecordLink1It, 1);
 
  935                              "The 2nd successful data packet on link 1 should have been TXed");
 
  936        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
  939                              "The failed data packet on link 0 should have been TXed");
 
  940        std::advance(failureRecordIt, 1);
 
  943                              "The failed data packet on link 1 should have been TXed");
 
  945        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  948                              "The 1st successful data packet on link 0 should have been acked");
 
  949        std::advance(successRecordLink0It, 1);
 
  952                              "The 2nd successful data packet on link 0 should have been acked");
 
  953        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
  956                              "The 1st successful data packet on link 1 should have been acked");
 
  957        std::advance(successRecordLink1It, 1);
 
  960                              "The 2nd successful data packet on link 1 should have been acked");
 
  961        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
  964                              "The failed data packet on link 0 should not have been acked");
 
  965        std::advance(failureRecordIt, 1);
 
  968                              "The failed data packet on link 1 should not have been acked");
 
  970        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
  973                              "The 1st successful data packet on link 0 should have been dequeued");
 
  974        std::advance(successRecordLink0It, 1);
 
  977                              "The 2nd successful data packet on link 0 should have been dequeued");
 
  978        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
  981                              "The 1st successful data packet on link 1 should have been dequeued");
 
  982        std::advance(successRecordLink1It, 1);
 
  985                              "The 2nd successful data packet on link 1 should have been dequeued");
 
  986        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
  988                                  failureRecordIt->m_dropReason.has_value(),
 
  990                              "Missing drop time or reason");
 
  993                              "The failed data packet on link 0 should have been dequeued");
 
  995                              WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET,
 
  996                              "Wrong drop reason");
 
  997        std::advance(failureRecordIt, 1);
 
  999                                  failureRecordIt->m_dropReason.has_value(),
 
 1001                              "Missing drop time or reason");
 
 1004                              "The failed data packet on link 1 should have been dequeued");
 
 1006                              WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET,
 
 1007                              "Wrong drop reason");
 
 1009        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
 1010        auto successRecordLink0ItNext = successRecordLink0It;
 
 1011        std::advance(successRecordLink0ItNext, 1);
 
 1012        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
 1014                              successRecordLink0ItNext->m_enqueueTime,
 
 1015                              "Packets on link 0 should be enqueued at the same time");
 
 1017                              failureRecordIt->m_enqueueTime,
 
 1018                              "Packets on link 0 should be enqueued at the same time");
 
 1019        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
 1020        auto successRecordLink1ItNext = successRecordLink1It;
 
 1021        std::advance(successRecordLink1ItNext, 1);
 
 1022        std::advance(failureRecordIt, 1);
 
 1024                              successRecordLink1ItNext->m_enqueueTime,
 
 1025                              "Packets on link 1 should be enqueued at the same time");
 
 1027                              failureRecordIt->m_enqueueTime,
 
 1028                              "Packets on link 1 should be enqueued at the same time");
 
 1030        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
 1032                                    successRecordLink0It->m_enqueueTime,
 
 1033                                    "The 1st data packet on link 0 should be TXed after enqueued");
 
 1034        std::advance(successRecordLink0It, 1);
 
 1036                                    successRecordLink0It->m_enqueueTime,
 
 1037                                    "The 2nd data packet on link 0 should be TXed after enqueued");
 
 1038        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
 1040                                    successRecordLink1It->m_enqueueTime,
 
 1041                                    "The 1st data packet on link 1 should be TXed after enqueued");
 
 1042        std::advance(successRecordLink1It, 1);
 
 1044                                    successRecordLink1It->m_enqueueTime,
 
 1045                                    "The 2nd data packet on link 1 should be TXed after enqueued");
 
 1046        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
 1048                                    failureRecordIt->m_enqueueTime,
 
 1049                                    "The 3rd data packet on link 0 should be TXed after enqueued");
 
 1050        std::advance(failureRecordIt, 1);
 
 1052                                    failureRecordIt->m_enqueueTime,
 
 1053                                    "The 3rd data packet on link 1 should be TXed after enqueued");
 
 1055        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
 1058                                    "link 0 pkt first tx should be after the 11th packet on link");
 
 1062                                    "link 0 pkt first backoff should not exceed cwMin");
 
 1063        successRecordLink0ItNext = successRecordLink0It;
 
 1064        std::advance(successRecordLink0ItNext, 1);
 
 1065        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
 1067                              successRecordLink0ItNext->m_txStartTime,
 
 1068                              "3 pkts of link 0 should tx at the same time");
 
 1070                              failureRecordIt->m_txStartTime,
 
 1071                              "3 pkts of link 0 should tx at the same time");
 
 1073        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
 1076                                    "link 1 pkt first tx should be after the 10th packet on link");
 
 1080                                    "link 1 pkt first backoff should not exceed cwMin");
 
 1081        successRecordLink1ItNext = successRecordLink1It;
 
 1082        std::advance(successRecordLink1ItNext, 1);
 
 1083        failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
 
 1084        std::advance(failureRecordIt, 1);
 
 1086                              successRecordLink1ItNext->m_txStartTime,
 
 1087                              "3 pkts of link 1 should tx at the same time");
 
 1089                              failureRecordIt->m_txStartTime,
 
 1090                              "3 pkts of link 1 should tx at the same time");
 
 1092        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
 1096                                    "Wrong first Block Ack reception time on link 0");
 
 1100                                    "Wrong first Block Ack reception time on link 0");
 
 1101        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
 1105                                    "Wrong first Block Ack reception time on link 1");
 
 1109                                    "Wrong first Block Ack reception time on link 1");
 
 1111        successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
 
 1112        std::advance(successRecordLink0It, 1);
 
 1116                                    "Wrong second Block Ack reception time on link 0");
 
 1120                                    "Wrong second Block Ack reception time on link 0");
 
 1121        successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
 
 1122        std::advance(successRecordLink1It, 1);
 
 1126                                    "Wrong second Block Ack reception time on link 1");
 
 1130                                    "Wrong second Block Ack reception time on link 1");