X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=GPL%2Ftools%2Ftrex%2Ftrex_astf_profile.py;h=193ff21185831a7c1d0be8588629164f6216a57c;hp=63831e4bf4f7a82c882f3ce8a2c1df78f12372d3;hb=7829fea4a2c8936513fa95215b7d84997f814a69;hpb=023fa41e51c966a1956bda6b915ffd894ff10e84 diff --git a/GPL/tools/trex/trex_astf_profile.py b/GPL/tools/trex/trex_astf_profile.py index 63831e4bf4..193ff21185 100644 --- a/GPL/tools/trex/trex_astf_profile.py +++ b/GPL/tools/trex/trex_astf_profile.py @@ -1,11 +1,21 @@ #!/usr/bin/python3 -# Copyright (c) 2020 Cisco and/or its affiliates. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: +# Copyright (c) 2021 Cisco and/or its affiliates. +# +# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later +# +# Licensed under the Apache License 2.0 or +# GNU General Public License v2.0 or later; you may not use this file +# except in compliance with one of these Licenses. You +# may obtain a copy of the Licenses at: # # http://www.apache.org/licenses/LICENSE-2.0 +# https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html +# +# Note: If this file is linked with Scapy, which is GPLv2+, your use of it +# must be under GPLv2+. If at any point in the future it is no longer linked +# with Scapy (or other GPLv2+ licensed software), you are free to choose +# Apache 2. # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -24,9 +34,9 @@ import sys import time sys.path.insert( - 0, u"/opt/trex-core-2.82/scripts/automation/trex_control_plane/interactive/" + 0, u"/opt/trex-core-2.88/scripts/automation/trex_control_plane/interactive/" ) -from trex.astf.api import * +from trex.astf.api import ASTFClient, ASTFProfile, TRexError def fmt_latency(lat_min, lat_avg, lat_max, hdrh): @@ -69,6 +79,7 @@ def simple_burst( latency, async_start=False, traffic_directions=2, + delay=0.0, ): """Send traffic and measure packet loss and latency. @@ -88,8 +99,9 @@ def simple_burst( Duration details: Contrary to stateless mode, ASTF profiles typically limit the number of flows/transactions that can happen. - The caller is expected to set the duration parameter accordingly to - this limit and multiplier, including any overheads. + The caller is expected to set the duration parameter to idealized value, + but set the delay arguments when TRex is expected + to finish processing replies later (including a window for latency). See *_traffic_duration output fields for TRex's measurement of the real traffic duration (should be without any inactivity overheads). If traffic has not ended by the final time, the traffic @@ -101,11 +113,7 @@ def simple_burst( :param profile_file: A python module with T-rex traffic profile. :param duration: Expected duration for all transactions to finish, - assuming only tolerable duration stretching happens. - This includes later start of later transactions - (according to TPS multiplier) and expected duration of each transaction. - Critically, this also includes any delay TRex shows when starting - traffic (but not the similar delay during stopping). + without any TRex related delays, without even latency. :param framesize: Frame size. :param multiplier: Multiplier of profile CPS. :param port_0: Port 0 on the traffic generator. @@ -113,6 +121,7 @@ def simple_burst( :param latency: With latency stats. :param async_start: Start the traffic and exit. :param traffic_directions: Bidirectional (2) or unidirectional (1) traffic. + :param delay: Time increase [s] for sleep duration. :type profile_file: str :type duration: float :type framesize: int or str @@ -122,6 +131,7 @@ def simple_burst( :type latency: bool :type async_start: bool :type traffic_directions: int + :type delay: float """ client = None total_received = 0 @@ -169,14 +179,12 @@ def simple_burst( # Choose CPS and start traffic. client.start( mult=multiplier, - # Increase the input duration slightly, - # to ensure it does not end before sleep&stop below happens. - duration=duration + 0.1 if duration > 0 else duration, + duration=duration, nc=True, latency_pps=int(multiplier) if latency else 0, client_mask=2**len(ports)-1, ) - time_start = time.monotonic() + time_stop = time.monotonic() + duration + delay if async_start: # For async stop, we need to export the current snapshot. @@ -186,8 +194,7 @@ def simple_burst( xsnap1 = client.ports[port_1].get_xstats().reference_stats print(f"Xstats snapshot 1: {xsnap1!r}") else: - time.sleep(duration) - + time.sleep(duration + delay) # Do not block yet, the existing transactions may take long time # to finish. We need an action that is almost reset(), # but without clearing stats. @@ -198,7 +205,7 @@ def simple_burst( client.stop(block=True) # Read the stats after the traffic stopped (or time up). - stats[time.monotonic() - time_start] = client.get_stats( + stats[time.monotonic() - time_stop] = client.get_stats( ports=ports ) @@ -432,6 +439,10 @@ def main(): u"--traffic_directions", type=int, default=2, help=u"Send bi- (2) or uni- (1) directional traffic." ) + parser.add_argument( + u"--delay", required=True, type=float, default=0.0, + help=u"Allowed time overhead, sleep time is increased by this [s]." + ) args = parser.parse_args() @@ -450,6 +461,7 @@ def main(): latency=args.latency, async_start=args.async_start, traffic_directions=args.traffic_directions, + delay=args.delay, )