Skip latency measurements for unsupported streams
[csit.git] / resources / tools / t-rex / t-rex-stateless.py
index 455ecef..21f3274 100755 (executable)
@@ -134,19 +134,19 @@ def create_streams_v46(base_pkt_a, base_pkt_b, vm1, vm2, frame_size):
             max(0, fsize_no_fcs-len(base_pkt_b))))
         lat_stream1 = STLStream(packet=pkt_lat_a,
                                 flow_stats=STLFlowLatencyStats(pg_id=0),
-                                mode=STLTXCont(pps=1000))
+                                mode=STLTXCont(pps=9000))
         # second traffic stream with a phase of 10ns (inter stream gap)
         lat_stream2 = STLStream(packet=pkt_lat_b,
                                 isg=10.0,
                                 flow_stats=STLFlowLatencyStats(pg_id=1),
-                                mode=STLTXCont(pps=1000))
+                                mode=STLTXCont(pps=9000))
 
         stream1 = STLStream(packet=pkt_a,
-                            mode=STLTXCont(pps=1000))
+                            mode=STLTXCont(pps=9000))
         # second traffic stream with a phase of 10ns (inter stream gap)
         stream2 = STLStream(packet=pkt_b,
                             isg=10.0,
-                            mode=STLTXCont(pps=1000))
+                            mode=STLTXCont(pps=9000))
     elif type(frame_size) is str:
         lat_stream1 = []
         lat_stream2 = []
@@ -315,6 +315,34 @@ def create_streams_v6(traffic_options, frame_size=78):
 
     return create_streams_v46(base_pkt_a, base_pkt_b, vm1, vm2, frame_size)
 
+def fmt_latency(lat_min, lat_avg, lat_max):
+    """ Return formatted, rounded latency
+
+    :param lat_min: Min latency
+    :param lat_avg: Average latency
+    :param lat_max: Max latency
+    :type lat_min: string
+    :type lat_avg: string
+    :type lat_max: string
+    :return: Formatted and rounded output "min/avg/max"
+    :rtype: string
+    """
+
+    try:
+        t_min = int(round(float(lat_min)))
+    except ValueError:
+        t_min = int(-1)
+    try:
+        t_avg = int(round(float(lat_avg)))
+    except ValueError:
+        t_avg = int(-1)
+    try:
+        t_max = int(round(float(lat_max)))
+    except ValueError:
+        t_max = int(-1)
+
+    return "/".join(str(tmp) for tmp in (t_min, t_avg, t_max))
+
 def simple_burst(stream_a, stream_b, stream_lat_a, stream_lat_b, duration, rate,
                  warmup_time, async_start, latency):
     """Run the traffic with specific parameters.
@@ -347,8 +375,8 @@ def simple_burst(stream_a, stream_b, stream_lat_a, stream_lat_b, duration, rate,
     total_sent = 0
     lost_a = 0
     lost_b = 0
-    lat_a = 'NA'
-    lat_b = 'NA'
+    lat_a = "-1/-1/-1"
+    lat_b = "-1/-1/-1"
 
     try:
         # turn this off if too many logs
@@ -364,8 +392,13 @@ def simple_burst(stream_a, stream_b, stream_lat_a, stream_lat_b, duration, rate,
         client.add_streams(stream_b, ports=[1])
 
         if latency:
-            client.add_streams(stream_lat_a, ports=[0])
-            client.add_streams(stream_lat_b, ports=[1])
+            try:
+                client.add_streams(stream_lat_a, ports=[0])
+                client.add_streams(stream_lat_b, ports=[1])
+            except:
+                #Disable latency if NIC does not support requested stream type
+                print "##### FAILED to add latency streams #####"
+                latency = False
 
         #warmup phase
         if warmup_time > 0:
@@ -380,7 +413,7 @@ def simple_burst(stream_a, stream_b, stream_lat_a, stream_lat_b, duration, rate,
 
             if client.get_warnings():
                 for warning in client.get_warnings():
-                    print_error(warning)
+                    print(warning)
 
             # read the stats after the test
             stats = client.get_stats()
@@ -408,7 +441,7 @@ def simple_burst(stream_a, stream_b, stream_lat_a, stream_lat_b, duration, rate,
 
             if client.get_warnings():
                 for warning in client.get_warnings():
-                    print_error(warning)
+                    print(warning)
 
             # read the stats after the test
             stats = client.get_stats()
@@ -420,14 +453,14 @@ def simple_burst(stream_a, stream_b, stream_lat_a, stream_lat_b, duration, rate,
             lost_b = stats[1]["opackets"] - stats[0]["ipackets"]
 
             if latency:
-                lat_a = "/".join((\
+                lat_a = fmt_latency(\
                     str(stats["latency"][0]["latency"]["total_min"]),\
                     str(stats["latency"][0]["latency"]["average"]),\
-                    str(stats["latency"][0]["latency"]["total_max"])))
-                lat_b = "/".join((\
+                    str(stats["latency"][0]["latency"]["total_max"]))
+                lat_b = fmt_latency(\
                     str(stats["latency"][1]["latency"]["total_min"]),\
                     str(stats["latency"][1]["latency"]["average"]),\
-                    str(stats["latency"][1]["latency"]["total_max"])))
+                    str(stats["latency"][1]["latency"]["total_max"]))
 
             total_sent = stats[0]["opackets"] + stats[1]["opackets"]
             total_rcvd = stats[0]["ipackets"] + stats[1]["ipackets"]
@@ -542,10 +575,6 @@ def main():
             _traffic_options[attr] = getattr(args, attr)
 
     if _use_ipv6:
-        # WARNING: Trex limitation to IPv4 only. IPv6 is not yet supported.
-        print_error('IPv6 latency is not supported yet. Running without lat.')
-        _latency = False
-
         stream_a, stream_b, stream_lat_a, stream_lat_b = create_streams_v6(
             _traffic_options, frame_size=_frame_size)
     else: