diff options
-rw-r--r-- | docker/Dockerfile | 2 | ||||
-rw-r--r-- | nfvbench/cfg.default.yaml | 13 | ||||
-rw-r--r-- | nfvbench/nfvbench.py | 9 | ||||
-rw-r--r-- | nfvbench/traffic_server.py | 32 |
4 files changed, 53 insertions, 3 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile index 8676bbd..10b7c41 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,7 +1,7 @@ # docker file for creating a container that has nfvbench installed and ready to use FROM ubuntu:20.04 -ENV TREX_VER "v2.88" +ENV TREX_VER "v2.89" ENV VM_IMAGE_VER "0.12" ENV PYTHONIOENCODING "utf8" diff --git a/nfvbench/cfg.default.yaml b/nfvbench/cfg.default.yaml index 28f84f4..8e822e5 100644 --- a/nfvbench/cfg.default.yaml +++ b/nfvbench/cfg.default.yaml @@ -367,6 +367,19 @@ cache_size: 0 # The cache size is actually limited by the number of 64B mbufs configured in the trex platform configuration (see Trex manual 6.2.2. Memory section configuration) # Note that the resulting value is finally capped to 10000, whatever the requested size is (by design limitation). +# Specification of the TRex behaviour dealing with the i40e network card driver issue: Trex-528 +# see https://trex-tgn.cisco.com/youtrack/issue/trex-528 +# This issue states that if other ports, in the same card, +# are in kernel mode, they could impair traffic counting. +# Can be overridden by --i40e-mixed +# Values can be: +# ignore - don't consider the case (default) +# exit - should the case arise, exit (TRex default behaviour) +# unbind - unbind kernel bound ports (the former NFVbench behaviour) +# The 'ignore' option might be OK as soon as the issue has been fixed in the driver. +# The 'unbind' option should not be used! who knows the current use of other ports? +i40e_mixed: + # Trex will use 1 x 64B mbuf per pre-built cached packet, assuming 1 pre-built cached packet per flow, it means for very large number of flows, the number of configured mbuf_64 will need to be set accordingly. mbuf_64: diff --git a/nfvbench/nfvbench.py b/nfvbench/nfvbench.py index bd86810..598247a 100644 --- a/nfvbench/nfvbench.py +++ b/nfvbench/nfvbench.py @@ -530,6 +530,13 @@ def _parse_opts_from_cli(): 'tagged with given VLAN id(s) or not (given \'no-tag\') ' '\'true\': use current vlans; \'false\': disable this mode.') + parser.add_argument('--i40e-mixed', dest='i40e_mixed', + action='store', + default=None, + metavar='<ignore,check,unbind>', + help='TRex behavior when dealing with a i40e network card driver' + ' [ https://trex-tgn.cisco.com/youtrack/issue/trex-528 ]') + parser.add_argument('--user-info', dest='user_info', action='append', metavar='<data>', @@ -875,6 +882,8 @@ def main(): config.service_chain_count = len(vlans[0]) opts.l2_loopback = None + if config.i40e_mixed is None: + config.i40e_mixed = 'ignore' if config.use_sriov_middle_net is None: config.use_sriov_middle_net = False if opts.use_sriov_middle_net is not None: diff --git a/nfvbench/traffic_server.py b/nfvbench/traffic_server.py index 52ec2f1..629cb3d 100644 --- a/nfvbench/traffic_server.py +++ b/nfvbench/traffic_server.py @@ -34,12 +34,27 @@ class TRexTrafficServer(TrafficServer): assert len(contents) == 1 self.trex_dir = os.path.join(trex_base_dir, contents[0]) + def __apply_trex_patches(self): + parent_dir = os.path.dirname(os.path.realpath(__file__)) + patches_dir = os.path.join(parent_dir, "trex_patches") + patches = os.listdir(patches_dir) + for patch in patches: + patch = os.path.join(patches_dir, patch) + command = ( + "patch --directory=" + self.trex_dir + " --strip=0" + " --forward --no-backup-if-mismatch --reject-file=-" + " --force --input=" + patch + " >&-") + os.system(command) + def run_server(self, generator_config, filename='/etc/trex_cfg.yaml'): """Run TRex server for specified traffic profile. :param traffic_profile: traffic profile object based on config file :param filename: path where to save TRex config file """ + # in order to allow for customized behaviors, let's apply some patches + # this scheme keeps acceptable since we have only simple modifications + self.__apply_trex_patches() cfg = self.__save_config(generator_config, filename) cores = generator_config.cores vtep_vlan = generator_config.gen_config.get('vtep_vlan') @@ -53,10 +68,21 @@ class TRexTrafficServer(TrafficServer): # --unbind-unused-ports: for NIC that have more than 2 ports such as Intel X710 # this will instruct trex to unbind all ports that are unused instead of # erroring out with an exception (i40e only) + # Try: --ignore-528-issue -> neither unbind nor exit with error, + # just proceed cause it might work! + # Note that force unbinding is probably a bad choice: + # we can't assume for sure that other ports are "unused". + # The default TRex behaviour - exit - is indeed a safer option; + # a message informs about the ports that should be unbound. + i40e_opt = ("--ignore-528-issue" if + generator_config.config.i40e_mixed == 'ignore' else + "--unbind-unused-ports" if + generator_config.config.i40e_mixed == 'unbind' else "") cmd = ['nohup', '/bin/bash', '-c', './t-rex-64 -i -c {} --iom 0 --no-scapy-server ' - '--unbind-unused-ports --close-at-end {} {} ' + '--close-at-end {} {} {} ' '{} {} --cfg {} &> /tmp/trex.log & disown'.format(cores, sw_mode, + i40e_opt, vlan_opt, hdrh_opt, mbuf_opt, cfg)] @@ -91,7 +117,7 @@ class TRexTrafficServer(TrafficServer): # parameter, specified as one of the starting command line # arguments, has been modified since the last launch. # Hence we add some extra fields to the config file - # (nb_cores, use_vlan, mbuf_factor, hdrh) + # (nb_cores, use_vlan, mbuf_factor, i40e_mixed, hdrh) # which will serve as a memory between runs - # while being actually ignored by the T-Rex server. @@ -108,6 +134,7 @@ class TRexTrafficServer(TrafficServer): hdrh : {hdrh} nb_cores : {nb_cores} use_vlan : {use_vlan} + i40e_mixed : {i40e_mixed} interfaces : [{ifs}]""".format( zmq_pub_port=generator_config.zmq_pub_port, zmq_rpc_port=generator_config.zmq_rpc_port, @@ -119,6 +146,7 @@ class TRexTrafficServer(TrafficServer): nb_cores=generator_config.cores, use_vlan=generator_config.gen_config.get('vtep_vlan') or generator_config.vlan_tagging, + i40e_mixed=generator_config.config.i40e_mixed, ifs=ifs) if hasattr(generator_config, 'mbuf_64') and generator_config.mbuf_64: |