521 const auto totalFailures = wifiTxStats.
GetFailures();
528 auto nodeDeviceTuple = std::make_tuple(nodeId, deviceId);
529 auto nodeDeviceLink0Tuple = std::make_tuple(nodeId, deviceId, 0);
530 auto nodeDeviceLink1Tuple = std::make_tuple(nodeId, deviceId, 1);
534 const auto totalFailuresDrop =
541 "Number of success packets should be 2");
544 "Number of success packets should be 2");
549 "Number of retransmitted successful packets should be 1");
552 "Number of retransmitted successful packets should be 1");
556 "Number of failed packets should be 1");
561 "Number of dropped packets (aggregate) due to retry limit reached should be 1");
563 totalFailuresDropMap.at(nodeDeviceTuple),
565 "Number of dropped packets (aggregate) due to retry limit reached should be 1");
567 auto successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
570 "Source node ID of the 1st successful data packet should be 1");
571 std::advance(successRecordIt, 1);
574 "Source node ID of the 2nd successful data packet should be 1");
575 auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
578 "Source node ID of the failed data packet should be 1");
580 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
582 successRecordIt->m_retransmissions,
584 "The retransmission count of the 1st successful data packet should be 0");
585 std::advance(successRecordIt, 1);
587 successRecordIt->m_retransmissions,
589 "The retransmission count of the 2nd successful data packet should be 1");
592 "The retransmission count of the failed data packet should be 6");
594 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
597 "The 1st successful data packet should have been TXed");
598 std::advance(successRecordIt, 1);
601 "The 2nd successful data packet should have been TXed");
604 "The failed data packet should have been TXed");
606 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
609 "The 1st successful data packet should have been acked");
610 std::advance(successRecordIt, 1);
613 "The 2nd successful data packet should have been acked");
616 "The failed data packet should not have been acked");
618 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
621 "The 1st successful data packet should have been dequeued");
622 std::advance(successRecordIt, 1);
625 "The 2nd successful data packet should have been dequeued");
627 failureRecordIt->m_dropTime.value().IsStrictlyPositive(),
629 "The failed data packet should have been dequeued");
631 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
632 auto successRecordItNext = successRecordIt;
633 std::advance(successRecordItNext, 1);
635 successRecordItNext->m_enqueueTime,
636 "Three packets should be enqueued at the same time");
638 failureRecordIt->m_enqueueTime,
639 "Three packets should be enqueued at the same time");
641 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
643 successRecordIt->m_enqueueTime,
644 "Packets should be TXed after enqueued");
646 successRecordIt->m_enqueueTime + tolerance +
648 "Packet backoff slots should not exceed cwMin");
652 "Wrong TX start time");
657 "Wrong Ack reception time");
662 "Wrong Ack reception time");
663 std::advance(successRecordIt, 1);
667 "Packets should be TXed after enqueued");
672 "Packet backoff slots should not exceed cwMin");
675 "Wrong TX start time");
680 "Wrong Ack reception time");
682 successRecordIt->m_ackTime,
686 "Wrong Ack reception time");
691 "Packets should be TXed after enqueued");
696 "Packet backoff slots should not exceed cwMin");
699 "Wrong TX start time");
701 failureRecordIt->m_dropReason.has_value(),
703 "Missing drop time or reason");
707 "Wrong Dequeue time for failed packet");
712 "Wrong Dequeue time for failed packet");
715 "Wrong drop reason");
719 const auto totalFailuresQos =
721 const auto totalFailuresQosMap =
724 for (std::vector<Time>::size_type i = 0; i <
m_txStartTimes[0].size(); ++i)
728 for (std::vector<Time>::size_type i = 0; i <
m_txStartTimes[1].size(); ++i)
735 "Number of success packets on link 0 should be 2");
738 "Number of success packets on link 1 should be 2");
741 "Number of success packets should be 4");
746 "Number of retransmitted successful packets should be 2");
749 "Number of retransmitted successful packets (aggregate) should be 2");
752 "Number of failed packets should be 2");
756 "Number of dropped packets (aggregate) by QosTxop should be 2");
759 "Number of dropped packets (aggregate) by QosTxop should be 2");
761 auto successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
763 successRecordLink0It->m_nodeId,
765 "Source node ID of the 1st successful data packet on link 0 should be 1");
766 std::advance(successRecordLink0It, 1);
768 successRecordLink0It->m_nodeId,
770 "Source node ID of the 2nd successful data packet on link 0 should be 1");
771 auto successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
773 successRecordLink1It->m_nodeId,
775 "Source node ID of the 1st successful data packet on link 0 should be 1");
776 std::advance(successRecordLink1It, 1);
778 successRecordLink1It->m_nodeId,
780 "Source node ID of the 2nd successful data packet on link 0 should be 1");
781 auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
784 "Source node ID of the failed data packet on link 0 should be 1");
785 std::advance(failureRecordIt, 1);
788 "Source node ID of the failed data packet on link 1 should be 1");
790 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
793 "Device ID of the 1st successful data packet on link 0 should be 0");
794 std::advance(successRecordLink0It, 1);
797 "Device ID of the 2nd successful data packet on link 0 should be 0");
798 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
801 "Device ID of the 1st successful data packet on link 0 should be 0");
802 std::advance(successRecordLink1It, 1);
805 "Device ID of the 2nd successful data packet on link 1 should be 0");
806 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
809 "Device ID of the failed data packet on link 1 should be 0");
810 std::advance(failureRecordIt, 1);
813 "Device ID of the failed data packet on link 1 should be 0");
815 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
817 *successRecordLink0It->m_successLinkIdSet.begin(),
819 "Successful link ID of the 1st successful data packet on link 0 should be 0");
820 std::advance(successRecordLink0It, 1);
822 *successRecordLink0It->m_successLinkIdSet.begin(),
824 "Successful link ID of the 2nd successful data packet on link 0 should be 0");
825 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
827 *successRecordLink1It->m_successLinkIdSet.begin(),
829 "Successful link ID of the 1st successful data packet on link 1 should be 1");
830 std::advance(successRecordLink1It, 1);
832 *successRecordLink1It->m_successLinkIdSet.begin(),
834 "Successful link ID of the 2nd successful data packet on link 1 should be 1");
835 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
837 failureRecordIt->m_successLinkIdSet.empty(),
839 "Successful link ID set of the failed data packet on link 0 should be empty");
840 std::advance(failureRecordIt, 1);
842 failureRecordIt->m_successLinkIdSet.empty(),
844 "Successful link ID set of the failed data packet on link 1 should be empty");
846 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
848 successRecordLink0It->m_retransmissions,
850 "The 1st successful data packet on link 0 should have no retransmissions");
851 std::advance(successRecordLink0It, 1);
853 successRecordLink0It->m_retransmissions,
855 "The 2nd successful data packet on link 0 should have 1 retransmission");
856 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
858 successRecordLink1It->m_retransmissions,
860 "The 1st successful data packet on link 1 should have no retransmissions");
861 std::advance(successRecordLink1It, 1);
863 successRecordLink1It->m_retransmissions,
865 "The 2nd successful data packet on link 1 should have 1 retransmission");
866 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
869 "The failed data packet on link 0 should have 8 retransmissions");
870 std::advance(failureRecordIt, 1);
873 "The failed data packet on link 1 should have 8 retransmissions");
875 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
878 "The 1st successful data packet on link 0 should have a TID of 3");
879 std::advance(successRecordLink0It, 1);
882 "The 2nd successful data packet on link 0 should have a TID of 3");
883 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
886 "The 1st successful data packet on link 1 should have a TID of 4");
887 std::advance(successRecordLink1It, 1);
890 "The 2nd successful data packet on link 1 should have a TID of 4");
891 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
894 "The failed data packet on link 0 should have a TID of 3");
895 std::advance(failureRecordIt, 1);
898 "The failed data packet on link 1 should have a TID of 4");
900 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
902 successRecordLink0It->m_mpduSeqNum,
904 "The 1st successful data packet on link 0 should have a Seq Num of 0");
905 std::advance(successRecordLink0It, 1);
907 successRecordLink0It->m_mpduSeqNum,
909 "The 2nd successful data packet on link 0 should have a Seq Num of 1");
910 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
912 successRecordLink1It->m_mpduSeqNum,
914 "The 1st successful data packet on link 1 should have a Seq Num of 0");
915 std::advance(successRecordLink1It, 1);
917 successRecordLink1It->m_mpduSeqNum,
919 "The 2nd successful data packet on link 1 should have a Seq Num of 2");
920 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
923 "The failed data packet on link 0 should have a Seq Num of 2");
924 std::advance(failureRecordIt, 1);
927 "The failed data packet on link 1 should have a Seq Num of 1");
929 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
932 "The 1st successful data packet on link 0 should have been TXed");
933 std::advance(successRecordLink0It, 1);
936 "The 2nd successful data packet on link 0 should have been TXed");
937 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
940 "The 1st successful data packet on link 1 should have been TXed");
941 std::advance(successRecordLink1It, 1);
944 "The 2nd successful data packet on link 1 should have been TXed");
945 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
948 "The failed data packet on link 0 should have been TXed");
949 std::advance(failureRecordIt, 1);
952 "The failed data packet on link 1 should have been TXed");
954 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
957 "The 1st successful data packet on link 0 should have been acked");
958 std::advance(successRecordLink0It, 1);
961 "The 2nd successful data packet on link 0 should have been acked");
962 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
965 "The 1st successful data packet on link 1 should have been acked");
966 std::advance(successRecordLink1It, 1);
969 "The 2nd successful data packet on link 1 should have been acked");
970 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
973 "The failed data packet on link 0 should not have been acked");
974 std::advance(failureRecordIt, 1);
977 "The failed data packet on link 1 should not have been acked");
979 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
982 "The 1st successful data packet on link 0 should have been dequeued");
983 std::advance(successRecordLink0It, 1);
986 "The 2nd successful data packet on link 0 should have been dequeued");
987 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
990 "The 1st successful data packet on link 1 should have been dequeued");
991 std::advance(successRecordLink1It, 1);
994 "The 2nd successful data packet on link 1 should have been dequeued");
995 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
997 failureRecordIt->m_dropReason.has_value(),
999 "Missing drop time or reason");
1002 "The failed data packet on link 0 should have been dequeued");
1005 "Wrong drop reason");
1006 std::advance(failureRecordIt, 1);
1008 failureRecordIt->m_dropReason.has_value(),
1010 "Missing drop time or reason");
1013 "The failed data packet on link 1 should have been dequeued");
1016 "Wrong drop reason");
1018 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1019 auto successRecordLink0ItNext = successRecordLink0It;
1020 std::advance(successRecordLink0ItNext, 1);
1021 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1023 successRecordLink0ItNext->m_enqueueTime,
1024 "Packets on link 0 should be enqueued at the same time");
1026 failureRecordIt->m_enqueueTime,
1027 "Packets on link 0 should be enqueued at the same time");
1028 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1029 auto successRecordLink1ItNext = successRecordLink1It;
1030 std::advance(successRecordLink1ItNext, 1);
1031 std::advance(failureRecordIt, 1);
1033 successRecordLink1ItNext->m_enqueueTime,
1034 "Packets on link 1 should be enqueued at the same time");
1036 failureRecordIt->m_enqueueTime,
1037 "Packets on link 1 should be enqueued at the same time");
1039 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1041 successRecordLink0It->m_enqueueTime,
1042 "The 1st data packet on link 0 should be TXed after enqueued");
1043 std::advance(successRecordLink0It, 1);
1045 successRecordLink0It->m_enqueueTime,
1046 "The 2nd data packet on link 0 should be TXed after enqueued");
1047 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1049 successRecordLink1It->m_enqueueTime,
1050 "The 1st data packet on link 1 should be TXed after enqueued");
1051 std::advance(successRecordLink1It, 1);
1053 successRecordLink1It->m_enqueueTime,
1054 "The 2nd data packet on link 1 should be TXed after enqueued");
1055 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1057 failureRecordIt->m_enqueueTime,
1058 "The 3rd data packet on link 0 should be TXed after enqueued");
1059 std::advance(failureRecordIt, 1);
1061 failureRecordIt->m_enqueueTime,
1062 "The 3rd data packet on link 1 should be TXed after enqueued");
1064 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1067 "link 0 pkt first tx should be after the 11th packet on link");
1071 "link 0 pkt first backoff should not exceed cwMin");
1072 successRecordLink0ItNext = successRecordLink0It;
1073 std::advance(successRecordLink0ItNext, 1);
1074 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1076 successRecordLink0ItNext->m_txStartTime,
1077 "3 pkts of link 0 should tx at the same time");
1079 failureRecordIt->m_txStartTime,
1080 "3 pkts of link 0 should tx at the same time");
1082 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1085 "link 1 pkt first tx should be after the 10th packet on link");
1089 "link 1 pkt first backoff should not exceed cwMin");
1090 successRecordLink1ItNext = successRecordLink1It;
1091 std::advance(successRecordLink1ItNext, 1);
1092 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1093 std::advance(failureRecordIt, 1);
1095 successRecordLink1ItNext->m_txStartTime,
1096 "3 pkts of link 1 should tx at the same time");
1098 failureRecordIt->m_txStartTime,
1099 "3 pkts of link 1 should tx at the same time");
1101 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1105 "Wrong first Block Ack reception time on link 0");
1109 "Wrong first Block Ack reception time on link 0");
1110 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1114 "Wrong first Block Ack reception time on link 1");
1118 "Wrong first Block Ack reception time on link 1");
1120 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1121 std::advance(successRecordLink0It, 1);
1125 "Wrong second Block Ack reception time on link 0");
1129 "Wrong second Block Ack reception time on link 0");
1130 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1131 std::advance(successRecordLink1It, 1);
1135 "Wrong second Block Ack reception time on link 1");
1139 "Wrong second Block Ack reception time on link 1");