511 const auto totalFailures = wifiTxStats.
GetFailures();
518 auto nodeDeviceTuple = std::make_tuple(nodeId, deviceId);
519 auto nodeDeviceLink0Tuple = std::make_tuple(nodeId, deviceId, 0);
520 auto nodeDeviceLink1Tuple = std::make_tuple(nodeId, deviceId, 1);
524 const auto totalFailuresDrop =
525 wifiTxStats.
GetFailures(WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT);
527 WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT);
531 "Number of success packets should be 2");
534 "Number of success packets should be 2");
539 "Number of retransmitted successful packets should be 1");
542 "Number of retransmitted successful packets should be 1");
546 "Number of failed packets should be 1");
551 "Number of dropped packets (aggregate) due to retry limit reached should be 1");
553 totalFailuresDropMap.at(nodeDeviceTuple),
555 "Number of dropped packets (aggregate) due to retry limit reached should be 1");
557 auto successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
560 "Source node ID of the 1st successful data packet should be 1");
561 std::advance(successRecordIt, 1);
564 "Source node ID of the 2nd successful data packet should be 1");
565 auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
568 "Source node ID of the failed data packet should be 1");
570 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
572 successRecordIt->m_retransmissions,
574 "The retransmission count of the 1st successful data packet should be 0");
575 std::advance(successRecordIt, 1);
577 successRecordIt->m_retransmissions,
579 "The retransmission count of the 2nd successful data packet should be 1");
582 "The retransmission count of the failed data packet should be 6");
584 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
587 "The 1st successful data packet should have been TXed");
588 std::advance(successRecordIt, 1);
591 "The 2nd successful data packet should have been TXed");
594 "The failed data packet should have been TXed");
596 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
599 "The 1st successful data packet should have been acked");
600 std::advance(successRecordIt, 1);
603 "The 2nd successful data packet should have been acked");
606 "The failed data packet should not have been acked");
608 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
611 "The 1st successful data packet should have been dequeued");
612 std::advance(successRecordIt, 1);
615 "The 2nd successful data packet should have been dequeued");
617 failureRecordIt->m_dropTime.value().IsStrictlyPositive(),
619 "The failed data packet should have been dequeued");
621 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
622 auto successRecordItNext = successRecordIt;
623 std::advance(successRecordItNext, 1);
625 successRecordItNext->m_enqueueTime,
626 "Three packets should be enqueued at the same time");
628 failureRecordIt->m_enqueueTime,
629 "Three packets should be enqueued at the same time");
631 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
633 successRecordIt->m_enqueueTime,
634 "Packets should be TXed after enqueued");
636 successRecordIt->m_enqueueTime + tolerance +
638 "Packet backoff slots should not exceed cwMin");
642 "Wrong TX start time");
647 "Wrong Ack reception time");
652 "Wrong Ack reception time");
653 std::advance(successRecordIt, 1);
657 "Packets should be TXed after enqueued");
662 "Packet backoff slots should not exceed cwMin");
665 "Wrong TX start time");
670 "Wrong Ack reception time");
672 successRecordIt->m_ackTime,
676 "Wrong Ack reception time");
681 "Packets should be TXed after enqueued");
686 "Packet backoff slots should not exceed cwMin");
689 "Wrong TX start time");
691 failureRecordIt->m_dropReason.has_value(),
693 "Missing drop time or reason");
697 "Wrong Dequeue time for failed packet");
702 "Wrong Dequeue time for failed packet");
704 WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT,
705 "Wrong drop reason");
709 const auto totalFailuresQos =
710 wifiTxStats.
GetFailures(WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET);
711 const auto totalFailuresQosMap =
714 for (std::vector<Time>::size_type i = 0; i <
m_txStartTimes[0].size(); ++i)
718 for (std::vector<Time>::size_type i = 0; i <
m_txStartTimes[1].size(); ++i)
725 "Number of success packets on link 0 should be 2");
728 "Number of success packets on link 1 should be 2");
731 "Number of success packets should be 4");
736 "Number of retransmitted successful packets should be 2");
739 "Number of retransmitted successful packets (aggregate) should be 2");
742 "Number of failed packets should be 2");
746 "Number of dropped packets (aggregate) by QosTxop should be 2");
749 "Number of dropped packets (aggregate) by QosTxop should be 2");
751 auto successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
753 successRecordLink0It->m_nodeId,
755 "Source node ID of the 1st successful data packet on link 0 should be 1");
756 std::advance(successRecordLink0It, 1);
758 successRecordLink0It->m_nodeId,
760 "Source node ID of the 2nd successful data packet on link 0 should be 1");
761 auto successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
763 successRecordLink1It->m_nodeId,
765 "Source node ID of the 1st successful data packet on link 0 should be 1");
766 std::advance(successRecordLink1It, 1);
768 successRecordLink1It->m_nodeId,
770 "Source node ID of the 2nd successful data packet on link 0 should be 1");
771 auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
774 "Source node ID of the failed data packet on link 0 should be 1");
775 std::advance(failureRecordIt, 1);
778 "Source node ID of the failed data packet on link 1 should be 1");
780 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
783 "Device ID of the 1st successful data packet on link 0 should be 0");
784 std::advance(successRecordLink0It, 1);
787 "Device ID of the 2nd successful data packet on link 0 should be 0");
788 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
791 "Device ID of the 1st successful data packet on link 0 should be 0");
792 std::advance(successRecordLink1It, 1);
795 "Device ID of the 2nd successful data packet on link 1 should be 0");
796 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
799 "Device ID of the failed data packet on link 1 should be 0");
800 std::advance(failureRecordIt, 1);
803 "Device ID of the failed data packet on link 1 should be 0");
805 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
807 *successRecordLink0It->m_successLinkIdSet.begin(),
809 "Successful link ID of the 1st successful data packet on link 0 should be 0");
810 std::advance(successRecordLink0It, 1);
812 *successRecordLink0It->m_successLinkIdSet.begin(),
814 "Successful link ID of the 2nd successful data packet on link 0 should be 0");
815 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
817 *successRecordLink1It->m_successLinkIdSet.begin(),
819 "Successful link ID of the 1st successful data packet on link 1 should be 1");
820 std::advance(successRecordLink1It, 1);
822 *successRecordLink1It->m_successLinkIdSet.begin(),
824 "Successful link ID of the 2nd successful data packet on link 1 should be 1");
825 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
827 failureRecordIt->m_successLinkIdSet.empty(),
829 "Successful link ID set of the failed data packet on link 0 should be empty");
830 std::advance(failureRecordIt, 1);
832 failureRecordIt->m_successLinkIdSet.empty(),
834 "Successful link ID set of the failed data packet on link 1 should be empty");
836 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
838 successRecordLink0It->m_retransmissions,
840 "The 1st successful data packet on link 0 should have no retransmissions");
841 std::advance(successRecordLink0It, 1);
843 successRecordLink0It->m_retransmissions,
845 "The 2nd successful data packet on link 0 should have 1 retransmission");
846 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
848 successRecordLink1It->m_retransmissions,
850 "The 1st successful data packet on link 1 should have no retransmissions");
851 std::advance(successRecordLink1It, 1);
853 successRecordLink1It->m_retransmissions,
855 "The 2nd successful data packet on link 1 should have 1 retransmission");
856 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
859 "The failed data packet on link 0 should have 8 retransmissions");
860 std::advance(failureRecordIt, 1);
863 "The failed data packet on link 1 should have 8 retransmissions");
865 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
868 "The 1st successful data packet on link 0 should have a TID of 3");
869 std::advance(successRecordLink0It, 1);
872 "The 2nd successful data packet on link 0 should have a TID of 3");
873 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
876 "The 1st successful data packet on link 1 should have a TID of 4");
877 std::advance(successRecordLink1It, 1);
880 "The 2nd successful data packet on link 1 should have a TID of 4");
881 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
884 "The failed data packet on link 0 should have a TID of 3");
885 std::advance(failureRecordIt, 1);
888 "The failed data packet on link 1 should have a TID of 4");
890 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
892 successRecordLink0It->m_mpduSeqNum,
894 "The 1st successful data packet on link 0 should have a Seq Num of 0");
895 std::advance(successRecordLink0It, 1);
897 successRecordLink0It->m_mpduSeqNum,
899 "The 2nd successful data packet on link 0 should have a Seq Num of 1");
900 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
902 successRecordLink1It->m_mpduSeqNum,
904 "The 1st successful data packet on link 1 should have a Seq Num of 0");
905 std::advance(successRecordLink1It, 1);
907 successRecordLink1It->m_mpduSeqNum,
909 "The 2nd successful data packet on link 1 should have a Seq Num of 2");
910 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
913 "The failed data packet on link 0 should have a Seq Num of 2");
914 std::advance(failureRecordIt, 1);
917 "The failed data packet on link 1 should have a Seq Num of 1");
919 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
922 "The 1st successful data packet on link 0 should have been TXed");
923 std::advance(successRecordLink0It, 1);
926 "The 2nd successful data packet on link 0 should have been TXed");
927 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
930 "The 1st successful data packet on link 1 should have been TXed");
931 std::advance(successRecordLink1It, 1);
934 "The 2nd successful data packet on link 1 should have been TXed");
935 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
938 "The failed data packet on link 0 should have been TXed");
939 std::advance(failureRecordIt, 1);
942 "The failed data packet on link 1 should have been TXed");
944 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
947 "The 1st successful data packet on link 0 should have been acked");
948 std::advance(successRecordLink0It, 1);
951 "The 2nd successful data packet on link 0 should have been acked");
952 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
955 "The 1st successful data packet on link 1 should have been acked");
956 std::advance(successRecordLink1It, 1);
959 "The 2nd successful data packet on link 1 should have been acked");
960 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
963 "The failed data packet on link 0 should not have been acked");
964 std::advance(failureRecordIt, 1);
967 "The failed data packet on link 1 should not have been acked");
969 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
972 "The 1st successful data packet on link 0 should have been dequeued");
973 std::advance(successRecordLink0It, 1);
976 "The 2nd successful data packet on link 0 should have been dequeued");
977 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
980 "The 1st successful data packet on link 1 should have been dequeued");
981 std::advance(successRecordLink1It, 1);
984 "The 2nd successful data packet on link 1 should have been dequeued");
985 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
987 failureRecordIt->m_dropReason.has_value(),
989 "Missing drop time or reason");
992 "The failed data packet on link 0 should have been dequeued");
994 WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET,
995 "Wrong drop reason");
996 std::advance(failureRecordIt, 1);
998 failureRecordIt->m_dropReason.has_value(),
1000 "Missing drop time or reason");
1003 "The failed data packet on link 1 should have been dequeued");
1005 WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET,
1006 "Wrong drop reason");
1008 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1009 auto successRecordLink0ItNext = successRecordLink0It;
1010 std::advance(successRecordLink0ItNext, 1);
1011 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1013 successRecordLink0ItNext->m_enqueueTime,
1014 "Packets on link 0 should be enqueued at the same time");
1016 failureRecordIt->m_enqueueTime,
1017 "Packets on link 0 should be enqueued at the same time");
1018 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1019 auto successRecordLink1ItNext = successRecordLink1It;
1020 std::advance(successRecordLink1ItNext, 1);
1021 std::advance(failureRecordIt, 1);
1023 successRecordLink1ItNext->m_enqueueTime,
1024 "Packets on link 1 should be enqueued at the same time");
1026 failureRecordIt->m_enqueueTime,
1027 "Packets on link 1 should be enqueued at the same time");
1029 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1031 successRecordLink0It->m_enqueueTime,
1032 "The 1st data packet on link 0 should be TXed after enqueued");
1033 std::advance(successRecordLink0It, 1);
1035 successRecordLink0It->m_enqueueTime,
1036 "The 2nd data packet on link 0 should be TXed after enqueued");
1037 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1039 successRecordLink1It->m_enqueueTime,
1040 "The 1st data packet on link 1 should be TXed after enqueued");
1041 std::advance(successRecordLink1It, 1);
1043 successRecordLink1It->m_enqueueTime,
1044 "The 2nd data packet on link 1 should be TXed after enqueued");
1045 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1047 failureRecordIt->m_enqueueTime,
1048 "The 3rd data packet on link 0 should be TXed after enqueued");
1049 std::advance(failureRecordIt, 1);
1051 failureRecordIt->m_enqueueTime,
1052 "The 3rd data packet on link 1 should be TXed after enqueued");
1054 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1057 "link 0 pkt first tx should be after the 11th packet on link");
1061 "link 0 pkt first backoff should not exceed cwMin");
1062 successRecordLink0ItNext = successRecordLink0It;
1063 std::advance(successRecordLink0ItNext, 1);
1064 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1066 successRecordLink0ItNext->m_txStartTime,
1067 "3 pkts of link 0 should tx at the same time");
1069 failureRecordIt->m_txStartTime,
1070 "3 pkts of link 0 should tx at the same time");
1072 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1075 "link 1 pkt first tx should be after the 10th packet on link");
1079 "link 1 pkt first backoff should not exceed cwMin");
1080 successRecordLink1ItNext = successRecordLink1It;
1081 std::advance(successRecordLink1ItNext, 1);
1082 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1083 std::advance(failureRecordIt, 1);
1085 successRecordLink1ItNext->m_txStartTime,
1086 "3 pkts of link 1 should tx at the same time");
1088 failureRecordIt->m_txStartTime,
1089 "3 pkts of link 1 should tx at the same time");
1091 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1095 "Wrong first Block Ack reception time on link 0");
1099 "Wrong first Block Ack reception time on link 0");
1100 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1104 "Wrong first Block Ack reception time on link 1");
1108 "Wrong first Block Ack reception time on link 1");
1110 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1111 std::advance(successRecordLink0It, 1);
1115 "Wrong second Block Ack reception time on link 0");
1119 "Wrong second Block Ack reception time on link 0");
1120 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1121 std::advance(successRecordLink1It, 1);
1125 "Wrong second Block Ack reception time on link 1");
1129 "Wrong second Block Ack reception time on link 1");