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");