520 const auto totalFailures = wifiTxStats.
GetFailures();
527 auto nodeDeviceTuple = std::make_tuple(nodeId, deviceId);
528 auto nodeDeviceLink0Tuple = std::make_tuple(nodeId, deviceId, 0);
529 auto nodeDeviceLink1Tuple = std::make_tuple(nodeId, deviceId, 1);
533 const auto totalFailuresDrop =
540 "Number of success packets should be 2");
543 "Number of success packets should be 2");
548 "Number of retransmitted successful packets should be 1");
551 "Number of retransmitted successful packets should be 1");
555 "Number of failed packets should be 1");
560 "Number of dropped packets (aggregate) due to retry limit reached should be 1");
562 totalFailuresDropMap.at(nodeDeviceTuple),
564 "Number of dropped packets (aggregate) due to retry limit reached should be 1");
566 auto successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
569 "Source node ID of the 1st successful data packet should be 1");
570 std::advance(successRecordIt, 1);
573 "Source node ID of the 2nd successful data packet should be 1");
574 auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
577 "Source node ID of the failed data packet should be 1");
579 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
581 successRecordIt->m_retransmissions,
583 "The retransmission count of the 1st successful data packet should be 0");
584 std::advance(successRecordIt, 1);
586 successRecordIt->m_retransmissions,
588 "The retransmission count of the 2nd successful data packet should be 1");
591 "The retransmission count of the failed data packet should be 6");
593 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
596 "The 1st successful data packet should have been TXed");
597 std::advance(successRecordIt, 1);
600 "The 2nd successful data packet should have been TXed");
603 "The failed data packet should have been TXed");
605 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
608 "The 1st successful data packet should have been acked");
609 std::advance(successRecordIt, 1);
612 "The 2nd successful data packet should have been acked");
615 "The failed data packet should not have been acked");
617 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
620 "The 1st successful data packet should have been dequeued");
621 std::advance(successRecordIt, 1);
624 "The 2nd successful data packet should have been dequeued");
626 failureRecordIt->m_dropTime.value().IsStrictlyPositive(),
628 "The failed data packet should have been dequeued");
630 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
631 auto successRecordItNext = successRecordIt;
632 std::advance(successRecordItNext, 1);
634 successRecordItNext->m_enqueueTime,
635 "Three packets should be enqueued at the same time");
637 failureRecordIt->m_enqueueTime,
638 "Three packets should be enqueued at the same time");
640 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
642 successRecordIt->m_enqueueTime,
643 "Packets should be TXed after enqueued");
645 successRecordIt->m_enqueueTime + tolerance +
647 "Packet backoff slots should not exceed cwMin");
651 "Wrong TX start time");
656 "Wrong Ack reception time");
661 "Wrong Ack reception time");
662 std::advance(successRecordIt, 1);
666 "Packets should be TXed after enqueued");
671 "Packet backoff slots should not exceed cwMin");
674 "Wrong TX start time");
679 "Wrong Ack reception time");
681 successRecordIt->m_ackTime,
685 "Wrong Ack reception time");
690 "Packets should be TXed after enqueued");
695 "Packet backoff slots should not exceed cwMin");
698 "Wrong TX start time");
700 failureRecordIt->m_dropReason.has_value(),
702 "Missing drop time or reason");
706 "Wrong Dequeue time for failed packet");
711 "Wrong Dequeue time for failed packet");
714 "Wrong drop reason");
718 const auto totalFailuresQos =
720 const auto totalFailuresQosMap =
723 for (std::vector<Time>::size_type i = 0; i <
m_txStartTimes[0].size(); ++i)
727 for (std::vector<Time>::size_type i = 0; i <
m_txStartTimes[1].size(); ++i)
734 "Number of success packets on link 0 should be 2");
737 "Number of success packets on link 1 should be 2");
740 "Number of success packets should be 4");
745 "Number of retransmitted successful packets should be 2");
748 "Number of retransmitted successful packets (aggregate) should be 2");
751 "Number of failed packets should be 2");
755 "Number of dropped packets (aggregate) by QosTxop should be 2");
758 "Number of dropped packets (aggregate) by QosTxop should be 2");
760 auto successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
762 successRecordLink0It->m_nodeId,
764 "Source node ID of the 1st successful data packet on link 0 should be 1");
765 std::advance(successRecordLink0It, 1);
767 successRecordLink0It->m_nodeId,
769 "Source node ID of the 2nd successful data packet on link 0 should be 1");
770 auto successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
772 successRecordLink1It->m_nodeId,
774 "Source node ID of the 1st successful data packet on link 0 should be 1");
775 std::advance(successRecordLink1It, 1);
777 successRecordLink1It->m_nodeId,
779 "Source node ID of the 2nd successful data packet on link 0 should be 1");
780 auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
783 "Source node ID of the failed data packet on link 0 should be 1");
784 std::advance(failureRecordIt, 1);
787 "Source node ID of the failed data packet on link 1 should be 1");
789 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
792 "Device ID of the 1st successful data packet on link 0 should be 0");
793 std::advance(successRecordLink0It, 1);
796 "Device ID of the 2nd successful data packet on link 0 should be 0");
797 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
800 "Device ID of the 1st successful data packet on link 0 should be 0");
801 std::advance(successRecordLink1It, 1);
804 "Device ID of the 2nd successful data packet on link 1 should be 0");
805 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
808 "Device ID of the failed data packet on link 1 should be 0");
809 std::advance(failureRecordIt, 1);
812 "Device ID of the failed data packet on link 1 should be 0");
814 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
816 *successRecordLink0It->m_successLinkIdSet.begin(),
818 "Successful link ID of the 1st successful data packet on link 0 should be 0");
819 std::advance(successRecordLink0It, 1);
821 *successRecordLink0It->m_successLinkIdSet.begin(),
823 "Successful link ID of the 2nd successful data packet on link 0 should be 0");
824 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
826 *successRecordLink1It->m_successLinkIdSet.begin(),
828 "Successful link ID of the 1st successful data packet on link 1 should be 1");
829 std::advance(successRecordLink1It, 1);
831 *successRecordLink1It->m_successLinkIdSet.begin(),
833 "Successful link ID of the 2nd successful data packet on link 1 should be 1");
834 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
836 failureRecordIt->m_successLinkIdSet.empty(),
838 "Successful link ID set of the failed data packet on link 0 should be empty");
839 std::advance(failureRecordIt, 1);
841 failureRecordIt->m_successLinkIdSet.empty(),
843 "Successful link ID set of the failed data packet on link 1 should be empty");
845 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
847 successRecordLink0It->m_retransmissions,
849 "The 1st successful data packet on link 0 should have no retransmissions");
850 std::advance(successRecordLink0It, 1);
852 successRecordLink0It->m_retransmissions,
854 "The 2nd successful data packet on link 0 should have 1 retransmission");
855 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
857 successRecordLink1It->m_retransmissions,
859 "The 1st successful data packet on link 1 should have no retransmissions");
860 std::advance(successRecordLink1It, 1);
862 successRecordLink1It->m_retransmissions,
864 "The 2nd successful data packet on link 1 should have 1 retransmission");
865 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
868 "The failed data packet on link 0 should have 8 retransmissions");
869 std::advance(failureRecordIt, 1);
872 "The failed data packet on link 1 should have 8 retransmissions");
874 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
877 "The 1st successful data packet on link 0 should have a TID of 3");
878 std::advance(successRecordLink0It, 1);
881 "The 2nd successful data packet on link 0 should have a TID of 3");
882 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
885 "The 1st successful data packet on link 1 should have a TID of 4");
886 std::advance(successRecordLink1It, 1);
889 "The 2nd successful data packet on link 1 should have a TID of 4");
890 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
893 "The failed data packet on link 0 should have a TID of 3");
894 std::advance(failureRecordIt, 1);
897 "The failed data packet on link 1 should have a TID of 4");
899 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
901 successRecordLink0It->m_mpduSeqNum,
903 "The 1st successful data packet on link 0 should have a Seq Num of 0");
904 std::advance(successRecordLink0It, 1);
906 successRecordLink0It->m_mpduSeqNum,
908 "The 2nd successful data packet on link 0 should have a Seq Num of 1");
909 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
911 successRecordLink1It->m_mpduSeqNum,
913 "The 1st successful data packet on link 1 should have a Seq Num of 0");
914 std::advance(successRecordLink1It, 1);
916 successRecordLink1It->m_mpduSeqNum,
918 "The 2nd successful data packet on link 1 should have a Seq Num of 2");
919 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
922 "The failed data packet on link 0 should have a Seq Num of 2");
923 std::advance(failureRecordIt, 1);
926 "The failed data packet on link 1 should have a Seq Num of 1");
928 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
931 "The 1st successful data packet on link 0 should have been TXed");
932 std::advance(successRecordLink0It, 1);
935 "The 2nd successful data packet on link 0 should have been TXed");
936 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
939 "The 1st successful data packet on link 1 should have been TXed");
940 std::advance(successRecordLink1It, 1);
943 "The 2nd successful data packet on link 1 should have been TXed");
944 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
947 "The failed data packet on link 0 should have been TXed");
948 std::advance(failureRecordIt, 1);
951 "The failed data packet on link 1 should have been TXed");
953 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
956 "The 1st successful data packet on link 0 should have been acked");
957 std::advance(successRecordLink0It, 1);
960 "The 2nd successful data packet on link 0 should have been acked");
961 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
964 "The 1st successful data packet on link 1 should have been acked");
965 std::advance(successRecordLink1It, 1);
968 "The 2nd successful data packet on link 1 should have been acked");
969 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
972 "The failed data packet on link 0 should not have been acked");
973 std::advance(failureRecordIt, 1);
976 "The failed data packet on link 1 should not have been acked");
978 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
981 "The 1st successful data packet on link 0 should have been dequeued");
982 std::advance(successRecordLink0It, 1);
985 "The 2nd successful data packet on link 0 should have been dequeued");
986 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
989 "The 1st successful data packet on link 1 should have been dequeued");
990 std::advance(successRecordLink1It, 1);
993 "The 2nd successful data packet on link 1 should have been dequeued");
994 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
996 failureRecordIt->m_dropReason.has_value(),
998 "Missing drop time or reason");
1001 "The failed data packet on link 0 should have been dequeued");
1004 "Wrong drop reason");
1005 std::advance(failureRecordIt, 1);
1007 failureRecordIt->m_dropReason.has_value(),
1009 "Missing drop time or reason");
1012 "The failed data packet on link 1 should have been dequeued");
1015 "Wrong drop reason");
1017 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1018 auto successRecordLink0ItNext = successRecordLink0It;
1019 std::advance(successRecordLink0ItNext, 1);
1020 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1022 successRecordLink0ItNext->m_enqueueTime,
1023 "Packets on link 0 should be enqueued at the same time");
1025 failureRecordIt->m_enqueueTime,
1026 "Packets on link 0 should be enqueued at the same time");
1027 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1028 auto successRecordLink1ItNext = successRecordLink1It;
1029 std::advance(successRecordLink1ItNext, 1);
1030 std::advance(failureRecordIt, 1);
1032 successRecordLink1ItNext->m_enqueueTime,
1033 "Packets on link 1 should be enqueued at the same time");
1035 failureRecordIt->m_enqueueTime,
1036 "Packets on link 1 should be enqueued at the same time");
1038 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1040 successRecordLink0It->m_enqueueTime,
1041 "The 1st data packet on link 0 should be TXed after enqueued");
1042 std::advance(successRecordLink0It, 1);
1044 successRecordLink0It->m_enqueueTime,
1045 "The 2nd data packet on link 0 should be TXed after enqueued");
1046 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1048 successRecordLink1It->m_enqueueTime,
1049 "The 1st data packet on link 1 should be TXed after enqueued");
1050 std::advance(successRecordLink1It, 1);
1052 successRecordLink1It->m_enqueueTime,
1053 "The 2nd data packet on link 1 should be TXed after enqueued");
1054 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1056 failureRecordIt->m_enqueueTime,
1057 "The 3rd data packet on link 0 should be TXed after enqueued");
1058 std::advance(failureRecordIt, 1);
1060 failureRecordIt->m_enqueueTime,
1061 "The 3rd data packet on link 1 should be TXed after enqueued");
1063 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1066 "link 0 pkt first tx should be after the 9th packet on link");
1070 "link 0 pkt first backoff should not exceed cwMin");
1071 successRecordLink0ItNext = successRecordLink0It;
1072 std::advance(successRecordLink0ItNext, 1);
1073 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1075 successRecordLink0ItNext->m_txStartTime,
1076 "3 pkts of link 0 should tx at the same time");
1078 failureRecordIt->m_txStartTime,
1079 "3 pkts of link 0 should tx at the same time");
1081 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1084 "link 1 pkt first tx should be after the 10th packet on link");
1088 "link 1 pkt first backoff should not exceed cwMin");
1089 successRecordLink1ItNext = successRecordLink1It;
1090 std::advance(successRecordLink1ItNext, 1);
1091 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1092 std::advance(failureRecordIt, 1);
1094 successRecordLink1ItNext->m_txStartTime,
1095 "3 pkts of link 1 should tx at the same time");
1097 failureRecordIt->m_txStartTime,
1098 "3 pkts of link 1 should tx at the same time");
1100 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1104 "Wrong first Block Ack reception time on link 0");
1108 "Wrong first Block Ack reception time on link 0");
1109 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1113 "Wrong first Block Ack reception time on link 1");
1117 "Wrong first Block Ack reception time on link 1");
1119 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1120 std::advance(successRecordLink0It, 1);
1124 "Wrong second Block Ack reception time on link 0");
1128 "Wrong second Block Ack reception time on link 0");
1129 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1130 std::advance(successRecordLink1It, 1);
1134 "Wrong second Block Ack reception time on link 1");
1138 "Wrong second Block Ack reception time on link 1");