Trex Per-Trial Bi-Directional Stats 98/72798/4
authorSridhar K. N. Rao <sridhar.rao@spirent.com>
Wed, 4 Aug 2021 08:49:11 +0000 (14:19 +0530)
committerSridhar K. N. Rao <sridhar.rao@spirent.com>
Wed, 25 Aug 2021 13:48:45 +0000 (19:18 +0530)
This patch adds code to get stats for each trial for each port.

Added changes suggested by AL
1. Include dropped packets
2. Include Latency values

Added missing comma (thanks to Parth).

Removed WIP

Signed-off-by: Sridhar K. N. Rao <sridhar.rao@spirent.com>
Change-Id: If760fbae2362c3f622c5517f5e53e159e31fccea

tools/pkt_gen/trex/trex_client.py

index 3d6836d..ff9d5c7 100644 (file)
@@ -85,6 +85,11 @@ _SCAPY_FRAME = {
           '{IP_PROTO}(sport={IP_PROTO_dport}, dport={IP_PROTO_sport})',
 }
 
+def cast_integer(value):
+    """
+    force 0 value if NaN value from TRex to avoid error in JSON result parsing
+    """
+    return int(value) if not isnan(value) else 0
 
 class Trex(ITrafficGenerator):
     """Trex Traffic generator wrapper."""
@@ -103,6 +108,7 @@ class Trex(ITrafficGenerator):
         self._stlclient = None
         self._verification_params = None
         self._show_packet_data = False
+        self.trial_results = []
 
     def show_packet_info(self, packet_a, packet_b):
         """
@@ -564,6 +570,48 @@ class Trex(ITrafficGenerator):
             result[ResultsConstants.CAPTURE_TX] = stats['capture_tx']
         if 'capture_rx' in stats:
             result[ResultsConstants.CAPTURE_RX] = stats['capture_rx']
+        # Write all per-trial results to a file
+        filec = os.path.join(settings.getValue('RESULTS_PATH'), 'trex_pertrial_results.csv')
+
+        ports = [0, 1]
+        with open(filec, 'a') as fcp:
+            fcp.write("frame_size,port,rx_pkts,tx_pkts,rx_bytes,tx_bytes,"+
+                      "rx_pps,tx_pps,rx_bps,tx_bps,"+
+                      "drp_pkts_d1,drp_pkts_d2,min1,avg1,max1,"+
+                      "min2,avg2,max2\n")
+            for key in self.trial_results:
+                for port in ports:
+                    stats = self.trial_results[key][port]
+                    far_end_stats = self.trial_results[key][1 - port]
+                    tx_pkts = stats['opackets']
+                    rx_pkts = stats['ipackets']
+                    tx_bytes = stats['obytes']
+                    rx_bytes = stats['ibytes']
+                    rx_pps = stats['rx_pps']
+                    tx_pps = stats['tx_pps']
+                    rx_bps = stats['rx_bps']
+                    tx_bps = stats['tx_bps']
+                    dr_pkts_d1 = (cast_integer(far_end_stats['0packets'])
+                            - cast_integer(stats['ipackets']))
+                    dr_pkts_d2 = (cast_integer(stats['0packets'])
+                            - cast_integer(far_end_stats['ipackets']))
+                    try:
+                        min1 = float(stats["latency"][0]["latency"]["total_min"])
+                        min2 = float(stats["latency"][1]["latency"]["total_min"])
+                        max1 = float(stats["latency"][0]["latency"]["total_max"])
+                        max2 = float(stats["latency"][1]["latency"]["total_max"])
+                        avg1 = float(stats["latency"][0]["latency"]["average"])
+                        avg2 = float(stats["latency"][1]["latency"]["average"])
+                    except TypeError:
+                        min1,min2,max1,max2,avg1,avg2 = -1.0
+
+                    fcp.write("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17}\n".format(
+                        key,port,rx_pkts,tx_pkts,rx_bytes,
+                        tx_bytes,rx_pps,tx_pps,rx_bps,tx_bps,
+                        dr_pkts_d1, dr_pkts_d2, min1, avg1, max1,
+                        min2, avg2, max2))
+
+
         return result
 
     def learning_packets(self, traffic):
@@ -595,6 +643,7 @@ class Trex(ITrafficGenerator):
         """
         threshold = settings.getValue('TRAFFICGEN_TREX_RFC2544_TPUT_THRESHOLD')
         max_repeat = settings.getValue('TRAFFICGEN_TREX_RFC2544_MAX_REPEAT')
+        frame_size = traffic['l2']['framesize']
         loss_verification = settings.getValue('TRAFFICGEN_TREX_RFC2544_BINARY_SEARCH_LOSS_VERIFICATION')
         if loss_verification:
             self._logger.info("Running Binary Search with Loss Verification")
@@ -606,8 +655,10 @@ class Trex(ITrafficGenerator):
         right = boundaries['right']
         center = boundaries['center']
         self._logger.info('Starting RFC2544 trials')
+        results = []
         while (right - left) > threshold:
             stats = self.generate_traffic(new_params, duration)
+            results.append(copy.deepcopy(stats))
             test_lossrate = ((stats["total"]["opackets"] - stats[
                 "total"]["ipackets"]) * 100) / stats["total"]["opackets"]
             if stats["total"]["ipackets"] == 0:
@@ -645,6 +696,7 @@ class Trex(ITrafficGenerator):
                 new_params = copy.deepcopy(traffic)
                 new_params['frame_rate'] = center
             iteration += 1
+        self.trial_results[frame_size] = results
         return stats_ok
 
     def send_cont_traffic(self, traffic=None, duration=30):