diff options
Diffstat (limited to 'scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py')
-rwxr-xr-x | scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py | 60 |
1 files changed, 43 insertions, 17 deletions
diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py index e63f9125..26613e56 100755 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py @@ -987,7 +987,8 @@ class STLProfile(object): loop_count = 1, vm = None, packet_hook = None, - split_mode = None): + split_mode = None, + min_ipg_usec = None): """ Convert a pcap file with a number of packets to a list of connected streams. packet1->packet2->packet3 etc @@ -1017,6 +1018,9 @@ class STLProfile(object): used for dual mode can be 'MAC' or 'IP' + min_ipg_usec : float + Minumum inter packet gap in usec. Used to guard from too small IPGs. + :return: STLProfile """ @@ -1024,9 +1028,15 @@ class STLProfile(object): # check filename if not os.path.isfile(pcap_file): raise STLError("file '{0}' does not exists".format(pcap_file)) + if speedup <= 0: + raise STLError('Speedup should not be negative.') + if min_ipg_usec and min_ipg_usec < 0: + raise STLError('min_ipg_usec should not be negative.') + - # make sure IPG is not less than 1 usec - if ipg_usec is not None and ipg_usec < 0.001: + # make sure IPG is not less than 0.001 usec + if (ipg_usec is not None and (ipg_usec < 0.001 * speedup) and + (min_ipg_usec is None or min_ipg_usec < 0.001)): raise STLError("ipg_usec cannot be less than 0.001 usec: '{0}'".format(ipg_usec)) if loop_count < 0: @@ -1039,6 +1049,7 @@ class STLProfile(object): pkts = PCAPReader(pcap_file).read_all() return STLProfile.__pkts_to_streams(pkts, ipg_usec, + min_ipg_usec, speedup, loop_count, vm, @@ -1046,8 +1057,20 @@ class STLProfile(object): else: pkts_a, pkts_b = PCAPReader(pcap_file).read_all(split_mode = split_mode) + # swap the packets if a is empty, or the ts of first packet in b is earlier + if not pkts_a: + pkts_a, pkts_b = pkts_b, pkts_a + elif (ipg_usec is None) and pkts_b: + meta = pkts_a[0][1] + start_time_a = meta[0] * 1e6 + meta[1] + meta = pkts_b[0][1] + start_time_b = meta[0] * 1e6 + meta[1] + if start_time_b < start_time_a: + pkts_a, pkts_b = pkts_b, pkts_a + profile_a = STLProfile.__pkts_to_streams(pkts_a, ipg_usec, + min_ipg_usec, speedup, loop_count, vm, @@ -1056,6 +1079,7 @@ class STLProfile(object): profile_b = STLProfile.__pkts_to_streams(pkts_b, ipg_usec, + min_ipg_usec, speedup, loop_count, vm, @@ -1070,23 +1094,27 @@ class STLProfile(object): @staticmethod - def __pkts_to_streams (pkts, ipg_usec, speedup, loop_count, vm, packet_hook, start_delay_usec = 0): + def __pkts_to_streams (pkts, ipg_usec, min_ipg_usec, speedup, loop_count, vm, packet_hook, start_delay_usec = 0): streams = [] - - # 10 ms delay before starting the PCAP - last_ts_usec = -(start_delay_usec) - if packet_hook: pkts = [(packet_hook(cap), meta) for (cap, meta) in pkts] - for i, (cap, meta) in enumerate(pkts, start = 1): # IPG - if not provided, take from cap - if ipg_usec == None: - ts_usec = (meta[0] * 1e6 + meta[1]) / float(speedup) - else: - ts_usec = (ipg_usec * i) / float(speedup) + if ipg_usec is None: + packet_time = meta[0] * 1e6 + meta[1] + if i == 1: + prev_time = packet_time + isg = (packet_time - prev_time) / float(speedup) + if min_ipg_usec and isg < min_ipg_usec: + isg = min_ipg_usec + prev_time = packet_time + else: # user specified ipg + if min_ipg_usec: + isg = min_ipg_usec + else: + isg = ipg_usec / float(speedup) # handle last packet if i == len(pkts): @@ -1100,13 +1128,11 @@ class STLProfile(object): packet = STLPktBuilder(pkt_buffer = cap, vm = vm), mode = STLTXSingleBurst(total_pkts = 1, percentage = 100), self_start = True if (i == 1) else False, - isg = (ts_usec - last_ts_usec), # seconds to usec + isg = isg, # usec action_count = action_count, next = next)) - - last_ts_usec = ts_usec - + profile = STLProfile(streams) profile.meta = {'type': 'pcap'} |