514 const auto totalFailures = wifiTxStats.
GetFailures();
521 auto nodeDeviceTuple = std::make_tuple(nodeId, deviceId);
522 auto nodeDeviceLink0Tuple = std::make_tuple(nodeId, deviceId, 0);
523 auto nodeDeviceLink1Tuple = std::make_tuple(nodeId, deviceId, 1);
527 const auto totalFailuresDrop =
528 wifiTxStats.
GetFailures(WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT);
530 WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT);
534 "Number of success packets should be 2");
537 "Number of success packets should be 2");
542 "Number of retransmitted successful packets should be 1");
545 "Number of retransmitted successful packets should be 1");
549 "Number of failed packets should be 1");
554 "Number of dropped packets (aggregate) due to retry limit reached should be 1");
556 totalFailuresDropMap.at(nodeDeviceTuple),
558 "Number of dropped packets (aggregate) due to retry limit reached should be 1");
560 auto successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
563 "Source node ID of the 1st successful data packet should be 1");
564 std::advance(successRecordIt, 1);
567 "Source node ID of the 2nd successful data packet should be 1");
568 auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
571 "Source node ID of the failed data packet should be 1");
573 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
575 successRecordIt->m_retransmissions,
577 "The retransmission count of the 1st successful data packet should be 0");
578 std::advance(successRecordIt, 1);
580 successRecordIt->m_retransmissions,
582 "The retransmission count of the 2nd successful data packet should be 1");
585 "The retransmission count of the failed data packet should be 6");
587 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
590 "The 1st successful data packet should have been TXed");
591 std::advance(successRecordIt, 1);
594 "The 2nd successful data packet should have been TXed");
597 "The failed data packet should have been TXed");
599 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
602 "The 1st successful data packet should have been acked");
603 std::advance(successRecordIt, 1);
606 "The 2nd successful data packet should have been acked");
609 "The failed data packet should not have been acked");
611 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
614 "The 1st successful data packet should have been dequeued");
615 std::advance(successRecordIt, 1);
618 "The 2nd successful data packet should have been dequeued");
620 failureRecordIt->m_dropTime.value().IsStrictlyPositive(),
622 "The failed data packet should have been dequeued");
624 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
625 auto successRecordItNext = successRecordIt;
626 std::advance(successRecordItNext, 1);
628 successRecordItNext->m_enqueueTime,
629 "Three packets should be enqueued at the same time");
631 failureRecordIt->m_enqueueTime,
632 "Three packets should be enqueued at the same time");
634 successRecordIt = successRecords.at(nodeDeviceLink0Tuple).begin();
636 successRecordIt->m_enqueueTime,
637 "Packets should be TXed after enqueued");
639 successRecordIt->m_enqueueTime + tolerance +
641 "Packet backoff slots should not exceed cwMin");
645 "Wrong TX start time");
650 "Wrong Ack reception time");
655 "Wrong Ack reception time");
656 std::advance(successRecordIt, 1);
660 "Packets should be TXed after enqueued");
665 "Packet backoff slots should not exceed cwMin");
668 "Wrong TX start time");
673 "Wrong Ack reception time");
675 successRecordIt->m_ackTime,
679 "Wrong Ack reception time");
684 "Packets should be TXed after enqueued");
689 "Packet backoff slots should not exceed cwMin");
692 "Wrong TX start time");
694 failureRecordIt->m_dropReason.has_value(),
696 "Missing drop time or reason");
700 "Wrong Dequeue time for failed packet");
705 "Wrong Dequeue time for failed packet");
707 WifiMacDropReason::WIFI_MAC_DROP_REACHED_RETRY_LIMIT,
708 "Wrong drop reason");
712 const auto totalFailuresQos =
713 wifiTxStats.
GetFailures(WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET);
714 const auto totalFailuresQosMap =
717 for (std::vector<Time>::size_type i = 0; i <
m_txStartTimes[0].size(); ++i)
721 for (std::vector<Time>::size_type i = 0; i <
m_txStartTimes[1].size(); ++i)
728 "Number of success packets on link 0 should be 2");
731 "Number of success packets on link 1 should be 2");
734 "Number of success packets should be 4");
739 "Number of retransmitted successful packets should be 2");
742 "Number of retransmitted successful packets (aggregate) should be 2");
745 "Number of failed packets should be 2");
749 "Number of dropped packets (aggregate) by QosTxop should be 2");
752 "Number of dropped packets (aggregate) by QosTxop should be 2");
754 auto successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
756 successRecordLink0It->m_nodeId,
758 "Source node ID of the 1st successful data packet on link 0 should be 1");
759 std::advance(successRecordLink0It, 1);
761 successRecordLink0It->m_nodeId,
763 "Source node ID of the 2nd successful data packet on link 0 should be 1");
764 auto successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
766 successRecordLink1It->m_nodeId,
768 "Source node ID of the 1st successful data packet on link 0 should be 1");
769 std::advance(successRecordLink1It, 1);
771 successRecordLink1It->m_nodeId,
773 "Source node ID of the 2nd successful data packet on link 0 should be 1");
774 auto failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
777 "Source node ID of the failed data packet on link 0 should be 1");
778 std::advance(failureRecordIt, 1);
781 "Source node ID of the failed data packet on link 1 should be 1");
783 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
786 "Device ID of the 1st successful data packet on link 0 should be 0");
787 std::advance(successRecordLink0It, 1);
790 "Device ID of the 2nd successful data packet on link 0 should be 0");
791 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
794 "Device ID of the 1st successful data packet on link 0 should be 0");
795 std::advance(successRecordLink1It, 1);
798 "Device ID of the 2nd successful data packet on link 1 should be 0");
799 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
802 "Device ID of the failed data packet on link 1 should be 0");
803 std::advance(failureRecordIt, 1);
806 "Device ID of the failed data packet on link 1 should be 0");
808 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
810 *successRecordLink0It->m_successLinkIdSet.begin(),
812 "Successful link ID of the 1st successful data packet on link 0 should be 0");
813 std::advance(successRecordLink0It, 1);
815 *successRecordLink0It->m_successLinkIdSet.begin(),
817 "Successful link ID of the 2nd successful data packet on link 0 should be 0");
818 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
820 *successRecordLink1It->m_successLinkIdSet.begin(),
822 "Successful link ID of the 1st successful data packet on link 1 should be 1");
823 std::advance(successRecordLink1It, 1);
825 *successRecordLink1It->m_successLinkIdSet.begin(),
827 "Successful link ID of the 2nd successful data packet on link 1 should be 1");
828 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
830 failureRecordIt->m_successLinkIdSet.empty(),
832 "Successful link ID set of the failed data packet on link 0 should be empty");
833 std::advance(failureRecordIt, 1);
835 failureRecordIt->m_successLinkIdSet.empty(),
837 "Successful link ID set of the failed data packet on link 1 should be empty");
839 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
841 successRecordLink0It->m_retransmissions,
843 "The 1st successful data packet on link 0 should have no retransmissions");
844 std::advance(successRecordLink0It, 1);
846 successRecordLink0It->m_retransmissions,
848 "The 2nd successful data packet on link 0 should have 1 retransmission");
849 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
851 successRecordLink1It->m_retransmissions,
853 "The 1st successful data packet on link 1 should have no retransmissions");
854 std::advance(successRecordLink1It, 1);
856 successRecordLink1It->m_retransmissions,
858 "The 2nd successful data packet on link 1 should have 1 retransmission");
859 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
862 "The failed data packet on link 0 should have 8 retransmissions");
863 std::advance(failureRecordIt, 1);
866 "The failed data packet on link 1 should have 8 retransmissions");
868 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
871 "The 1st successful data packet on link 0 should have a TID of 3");
872 std::advance(successRecordLink0It, 1);
875 "The 2nd successful data packet on link 0 should have a TID of 3");
876 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
879 "The 1st successful data packet on link 1 should have a TID of 4");
880 std::advance(successRecordLink1It, 1);
883 "The 2nd successful data packet on link 1 should have a TID of 4");
884 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
887 "The failed data packet on link 0 should have a TID of 3");
888 std::advance(failureRecordIt, 1);
891 "The failed data packet on link 1 should have a TID of 4");
893 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
895 successRecordLink0It->m_mpduSeqNum,
897 "The 1st successful data packet on link 0 should have a Seq Num of 0");
898 std::advance(successRecordLink0It, 1);
900 successRecordLink0It->m_mpduSeqNum,
902 "The 2nd successful data packet on link 0 should have a Seq Num of 1");
903 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
905 successRecordLink1It->m_mpduSeqNum,
907 "The 1st successful data packet on link 1 should have a Seq Num of 0");
908 std::advance(successRecordLink1It, 1);
910 successRecordLink1It->m_mpduSeqNum,
912 "The 2nd successful data packet on link 1 should have a Seq Num of 2");
913 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
916 "The failed data packet on link 0 should have a Seq Num of 2");
917 std::advance(failureRecordIt, 1);
920 "The failed data packet on link 1 should have a Seq Num of 1");
922 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
925 "The 1st successful data packet on link 0 should have been TXed");
926 std::advance(successRecordLink0It, 1);
929 "The 2nd successful data packet on link 0 should have been TXed");
930 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
933 "The 1st successful data packet on link 1 should have been TXed");
934 std::advance(successRecordLink1It, 1);
937 "The 2nd successful data packet on link 1 should have been TXed");
938 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
941 "The failed data packet on link 0 should have been TXed");
942 std::advance(failureRecordIt, 1);
945 "The failed data packet on link 1 should have been TXed");
947 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
950 "The 1st successful data packet on link 0 should have been acked");
951 std::advance(successRecordLink0It, 1);
954 "The 2nd successful data packet on link 0 should have been acked");
955 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
958 "The 1st successful data packet on link 1 should have been acked");
959 std::advance(successRecordLink1It, 1);
962 "The 2nd successful data packet on link 1 should have been acked");
963 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
966 "The failed data packet on link 0 should not have been acked");
967 std::advance(failureRecordIt, 1);
970 "The failed data packet on link 1 should not have been acked");
972 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
975 "The 1st successful data packet on link 0 should have been dequeued");
976 std::advance(successRecordLink0It, 1);
979 "The 2nd successful data packet on link 0 should have been dequeued");
980 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
983 "The 1st successful data packet on link 1 should have been dequeued");
984 std::advance(successRecordLink1It, 1);
987 "The 2nd successful data packet on link 1 should have been dequeued");
988 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
990 failureRecordIt->m_dropReason.has_value(),
992 "Missing drop time or reason");
995 "The failed data packet on link 0 should have been dequeued");
997 WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET,
998 "Wrong drop reason");
999 std::advance(failureRecordIt, 1);
1001 failureRecordIt->m_dropReason.has_value(),
1003 "Missing drop time or reason");
1006 "The failed data packet on link 1 should have been dequeued");
1008 WifiMacDropReason::WIFI_MAC_DROP_QOS_OLD_PACKET,
1009 "Wrong drop reason");
1011 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1012 auto successRecordLink0ItNext = successRecordLink0It;
1013 std::advance(successRecordLink0ItNext, 1);
1014 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1016 successRecordLink0ItNext->m_enqueueTime,
1017 "Packets on link 0 should be enqueued at the same time");
1019 failureRecordIt->m_enqueueTime,
1020 "Packets on link 0 should be enqueued at the same time");
1021 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1022 auto successRecordLink1ItNext = successRecordLink1It;
1023 std::advance(successRecordLink1ItNext, 1);
1024 std::advance(failureRecordIt, 1);
1026 successRecordLink1ItNext->m_enqueueTime,
1027 "Packets on link 1 should be enqueued at the same time");
1029 failureRecordIt->m_enqueueTime,
1030 "Packets on link 1 should be enqueued at the same time");
1032 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1034 successRecordLink0It->m_enqueueTime,
1035 "The 1st data packet on link 0 should be TXed after enqueued");
1036 std::advance(successRecordLink0It, 1);
1038 successRecordLink0It->m_enqueueTime,
1039 "The 2nd data packet on link 0 should be TXed after enqueued");
1040 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1042 successRecordLink1It->m_enqueueTime,
1043 "The 1st data packet on link 1 should be TXed after enqueued");
1044 std::advance(successRecordLink1It, 1);
1046 successRecordLink1It->m_enqueueTime,
1047 "The 2nd data packet on link 1 should be TXed after enqueued");
1048 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1050 failureRecordIt->m_enqueueTime,
1051 "The 3rd data packet on link 0 should be TXed after enqueued");
1052 std::advance(failureRecordIt, 1);
1054 failureRecordIt->m_enqueueTime,
1055 "The 3rd data packet on link 1 should be TXed after enqueued");
1057 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1060 "link 0 pkt first tx should be after the 11th packet on link");
1064 "link 0 pkt first backoff should not exceed cwMin");
1065 successRecordLink0ItNext = successRecordLink0It;
1066 std::advance(successRecordLink0ItNext, 1);
1067 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1069 successRecordLink0ItNext->m_txStartTime,
1070 "3 pkts of link 0 should tx at the same time");
1072 failureRecordIt->m_txStartTime,
1073 "3 pkts of link 0 should tx at the same time");
1075 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1078 "link 1 pkt first tx should be after the 10th packet on link");
1082 "link 1 pkt first backoff should not exceed cwMin");
1083 successRecordLink1ItNext = successRecordLink1It;
1084 std::advance(successRecordLink1ItNext, 1);
1085 failureRecordIt = failureRecords.at(nodeDeviceTuple).begin();
1086 std::advance(failureRecordIt, 1);
1088 successRecordLink1ItNext->m_txStartTime,
1089 "3 pkts of link 1 should tx at the same time");
1091 failureRecordIt->m_txStartTime,
1092 "3 pkts of link 1 should tx at the same time");
1094 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1098 "Wrong first Block Ack reception time on link 0");
1102 "Wrong first Block Ack reception time on link 0");
1103 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1107 "Wrong first Block Ack reception time on link 1");
1111 "Wrong first Block Ack reception time on link 1");
1113 successRecordLink0It = successRecords.at(nodeDeviceLink0Tuple).begin();
1114 std::advance(successRecordLink0It, 1);
1118 "Wrong second Block Ack reception time on link 0");
1122 "Wrong second Block Ack reception time on link 0");
1123 successRecordLink1It = successRecords.at(nodeDeviceLink1Tuple).begin();
1124 std::advance(successRecordLink1It, 1);
1128 "Wrong second Block Ack reception time on link 1");
1132 "Wrong second Block Ack reception time on link 1");