diff options
-rw-r--r-- | scripts/automation/regression/functional_tests/stl_basic_tests.py | 37 | ||||
-rw-r--r-- | scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_sim.py | 4 | ||||
-rwxr-xr-x | scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py | 18 | ||||
-rw-r--r-- | scripts/exp/imix_3pkt_vm.pcap | bin | 4588 -> 4588 bytes | |||
-rw-r--r-- | scripts/exp/udp_1pkt_range_clients_split.pcap | bin | 7624 -> 7624 bytes | |||
-rw-r--r-- | scripts/exp/udp_1pkt_src_ip_split.pcap | bin | 3824 -> 3824 bytes | |||
-rw-r--r-- | scripts/exp/udp_1pkt_tuple_gen_split.pcap | bin | 7624 -> 7624 bytes | |||
-rw-r--r-- | scripts/stl/tests/multi_core_test.py | 48 | ||||
-rw-r--r-- | src/rpc-server/commands/trex_rpc_cmd_stream.cpp | 45 | ||||
-rw-r--r-- | src/rpc-server/commands/trex_rpc_cmds.h | 1 |
10 files changed, 108 insertions, 45 deletions
diff --git a/scripts/automation/regression/functional_tests/stl_basic_tests.py b/scripts/automation/regression/functional_tests/stl_basic_tests.py index e9409baf..28178324 100644 --- a/scripts/automation/regression/functional_tests/stl_basic_tests.py +++ b/scripts/automation/regression/functional_tests/stl_basic_tests.py @@ -253,12 +253,12 @@ class CStlBasic_Test(functional_general_test.CGeneralFunctional_Test): ["udp_3pkt_pcap.py","-m 1 -l 10",True, False], #["udp_1pkt_simple.py","-m 1 -l 3",True], ["udp_1pkt_pcap_relative_path.py","-m 1 -l 3",True, False], - ["udp_1pkt_tuple_gen_split.py","-m 1 -c 2 -l 100",True], - ["udp_1pkt_range_clients_split.py","-m 1 -c 2 -l 100",True], - ["udp_1pkt_vxlan.py","-m 1 -c 1 -l 17",True, False], # can't generate: no VXLAN in Scapy, only in profile - ["udp_1pkt_ipv6_in_ipv4.py","-m 1 -c 1 -l 17",True], - ["yaml/imix_3pkt.yaml","-m 50kpps --limit 20 --cores 2",True], - ["yaml/imix_3pkt_vm.yaml","-m 50kpps --limit 20 --cores 2",True], + ["udp_1pkt_tuple_gen_split.py","-m 1 -l 100",True], + ["udp_1pkt_range_clients_split.py","-m 1 -l 100",True], + ["udp_1pkt_vxlan.py","-m 1 -l 17",True, False], # can't generate: no VXLAN in Scapy, only in profile + ["udp_1pkt_ipv6_in_ipv4.py","-m 1 -l 17",True], + ["yaml/imix_3pkt.yaml","-m 50kpps --limit 20",True], + ["yaml/imix_3pkt_vm.yaml","-m 50kpps --limit 20",True], ["udp_1pkt_simple_mac_dst.py","-m 1 -l 1 ",True], ["udp_1pkt_simple_mac_src.py","-m 1 -l 1 ",True], ["udp_1pkt_simple_mac_dst_src.py","-m 1 -l 1 ",True], @@ -271,13 +271,12 @@ class CStlBasic_Test(functional_general_test.CGeneralFunctional_Test): ["udp_1pkt_simple_test.py","-m 1 -l 10 ",True, False], ["udp_1pkt_mac_mask5.py","-m 1 -l 30 ",True], ["udp_1pkt_range_clients_split_garp.py","-m 1 -l 50",True], - ["udp_1pkt_src_ip_split.py","-m 1 -l 50 --cores 2",True], + ["udp_1pkt_src_ip_split.py","-m 1 -l 50",True], ["udp_1pkt_repeat_random.py","-m 1 -l 50",True], ]; p1 = [ ["udp_1pkt_repeat_random.py","-m 1 -l 50",True] ]; - for obj in p: try: test_generated = obj[3] @@ -337,13 +336,29 @@ class CStlBasic_Test(functional_general_test.CGeneralFunctional_Test): def test_multicore_scheduling (self): - mc_tests = ['stl/tests/single_cont.py', + + seed = time.time() + + # test with simple vars + rc = self.run_sim('stl/tests/multi_core_test.py', output = None, options = '--test_multi_core --limit=840 -t test_type=plain#seed={0} -m 27kpps'.format(seed), silent = True) + assert_equal(rc, True) + + + # test with tuple + rc = self.run_sim('stl/tests/multi_core_test.py', output = None, options = '--test_multi_core --limit=840 -t test_type=tuple#seed={0} -m 27kpps'.format(seed), silent = True) + assert_equal(rc, True) + + # some tests + mc_tests = [ + 'stl/tests/single_cont.py', 'stl/tests/single_burst.py', 'stl/tests/multi_burst.py', - 'stl/tests/many_streams.py', ] for mc_test in mc_tests: - rc = self.run_sim(mc_test, output = None, options = '--test_multi_core --limit=3840 -m 27kpps', silent = True) + rc = self.run_sim(mc_test, output = None, options = '--test_multi_core --limit=840 -m 27kpps', silent = True) assert_equal(rc, True) + return + + diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_sim.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_sim.py index 0394cf43..63a1232b 100644 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_sim.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_sim.py @@ -111,8 +111,6 @@ class STLSim(object): # handle YAMLs if tunables == None: tunables = {} - else: - tunables = tunables[0] for input_file in input_files: try: @@ -556,7 +554,7 @@ def test_multi_core (r, options): duration = options.duration, mode = 'none', silent = True, - tunables = [{'seed': 5}]) + tunables = options.tunables) print("") diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py index e1de6b55..65333e0f 100755 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/parsing_opts.py @@ -213,19 +213,25 @@ def is_valid_file(filename): return filename -def decode_tunables_to_dict (**kwargs): - return kwargs def decode_tunables (tunable_str): - try: - tunables = [eval('decode_tunables_to_dict({0})'.format(t)) for t in tunable_str.split('#')] + tunables = {} - except (SyntaxError, NameError): - raise argparse.ArgumentTypeError("bad syntax for tunables: {0}".format(tunable_str)) + # split by diaz to tokens + tokens = tunable_str.split('#') + + # each token is of form X=Y + for token in tokens: + print(token) + m = re.search('(.*)=(.*)', token) + if not m: + raise argparse.ArgumentTypeError("bad syntax for tunables: {0}".format(token)) + tunables[m.group(1)] = m.group(2) return tunables + OPTIONS_DB = {MULTIPLIER: ArgumentPack(['-m', '--multiplier'], {'help': match_multiplier_help, 'dest': "mult", diff --git a/scripts/exp/imix_3pkt_vm.pcap b/scripts/exp/imix_3pkt_vm.pcap Binary files differindex 4a97280d..de78d575 100644 --- a/scripts/exp/imix_3pkt_vm.pcap +++ b/scripts/exp/imix_3pkt_vm.pcap diff --git a/scripts/exp/udp_1pkt_range_clients_split.pcap b/scripts/exp/udp_1pkt_range_clients_split.pcap Binary files differindex fb5037cc..203de6eb 100644 --- a/scripts/exp/udp_1pkt_range_clients_split.pcap +++ b/scripts/exp/udp_1pkt_range_clients_split.pcap diff --git a/scripts/exp/udp_1pkt_src_ip_split.pcap b/scripts/exp/udp_1pkt_src_ip_split.pcap Binary files differindex 08ba764e..af254c45 100644 --- a/scripts/exp/udp_1pkt_src_ip_split.pcap +++ b/scripts/exp/udp_1pkt_src_ip_split.pcap diff --git a/scripts/exp/udp_1pkt_tuple_gen_split.pcap b/scripts/exp/udp_1pkt_tuple_gen_split.pcap Binary files differindex 873ab47f..2b7c7976 100644 --- a/scripts/exp/udp_1pkt_tuple_gen_split.pcap +++ b/scripts/exp/udp_1pkt_tuple_gen_split.pcap diff --git a/scripts/stl/tests/multi_core_test.py b/scripts/stl/tests/multi_core_test.py index 17896b5e..918a30bf 100644 --- a/scripts/stl/tests/multi_core_test.py +++ b/scripts/stl/tests/multi_core_test.py @@ -24,7 +24,7 @@ class STLMultiCore(object): mode = STLTXCont(pps = pps)) - def generate_var (self, rng, i, vm, pkt_offset): + def generate_var (self, rng, i, vm, pkt_offset, verbose = False): name = "var-{0}".format(i) @@ -36,7 +36,7 @@ class STLMultiCore(object): step = rng.randint(1, 1000) op = rng.choice(['inc', 'dec']) - vm += [STLVmFlowVar(name = str(i), + vm += [STLVmFlowVar(name = name, min_value = min_value, max_value = max_value, size = size, @@ -44,17 +44,18 @@ class STLMultiCore(object): STLVmWrFlowVar(fv_name = name, pkt_offset = pkt_offset), ] - print('name: {:}, start: {:}, end: {:}, size: {:}, op: {:}, step {:}'.format(name, - min_value, - max_value, - size, - op, - step)) + if verbose: + print('name: {:}, start: {:}, end: {:}, size: {:}, op: {:}, step {:}'.format(name, + min_value, + max_value, + size, + op, + step)) return size - def generate_tuple_var (self, rng, i, vm, pkt_offset): + def generate_tuple_var (self, rng, i, vm, pkt_offset, verbose = False): name = "tuple-{0}".format(i) # ip @@ -74,11 +75,12 @@ class STLMultiCore(object): STLVmWrFlowVar (fv_name = name + ".port", pkt_offset = (pkt_offset + 4) ), ] - print('name: {:}, ip_start: {:}, ip_end: {:}, port_start: {:}, port_end: {:}'.format(name, - ip_min, - ip_max, - port_min, - port_max)) + if verbose: + print('name: {:}, ip_start: {:}, ip_end: {:}, port_start: {:}, port_end: {:}'.format(name, + ip_min, + ip_max, + port_min, + port_max)) return 8 @@ -88,27 +90,23 @@ class STLMultiCore(object): def get_streams (self, direction = 0, **kwargs): rng = random.Random(kwargs.get('seed', 1)) + test_type = kwargs.get('test_type', 'plain') - var_type = kwargs.get('var_type', 'plain') - - - var_type = 'tuple' - vm = [] # base offset pkt_offset = 42 - print("\nusing the following vars:\n") - if var_type == 'plain': + vm = [] + + if test_type == 'plain': for i in range(20): pkt_offset += self.generate_var(rng, i, vm, pkt_offset) - else: + elif test_type == 'tuple': for i in range(5): pkt_offset += self.generate_tuple_var(rng, i, vm, pkt_offset) + else: + raise STLError('unknown mutli core test type') - - - print("\n") # create imix streams return [self.create_stream(x['size'], x['pps'],x['isg'] , vm) for x in self.streams_def] diff --git a/src/rpc-server/commands/trex_rpc_cmd_stream.cpp b/src/rpc-server/commands/trex_rpc_cmd_stream.cpp index e5072b9e..becd51c5 100644 --- a/src/rpc-server/commands/trex_rpc_cmd_stream.cpp +++ b/src/rpc-server/commands/trex_rpc_cmd_stream.cpp @@ -252,6 +252,51 @@ TrexRpcCmdAddStream::parse_vm_instr_tuple_flow_var(const Json::Value &inst, std: } +/** + * if a user specify min_value and max_value with a step + * that does not create a full cycle - pad the values to allow + * a true cycle + * + */ +void +TrexRpcCmdAddStream::handle_range_padding(uint64_t &max_value, + uint64_t &min_value, + uint64_t step, + int op, + Json::Value &result) { + + /* pad for the step */ + uint64_t pad = (max_value - min_value + 1) % step; + if (pad == 0) { + return; + } + + /* the leftover rounded up */ + uint64_t step_pad = step - pad; + + switch (op) { + case StreamVmInstructionFlowMan::FLOW_VAR_OP_INC: + + if ( (UINT64_MAX - max_value) < step_pad ) { + generate_parse_err(result, "VM: could not pad range to be a true cycle - '(max_value - min_value + 1) % step' should be zero"); + } + max_value += step_pad; + + break; + + case StreamVmInstructionFlowMan::FLOW_VAR_OP_DEC: + if ( min_value < step_pad ) { + generate_parse_err(result, "VM: could not pad range to be a true cycle - '(max_value - min_value + 1) % step' should be zero"); + } + min_value -= step_pad; + + break; + + default: + break; + } +} + void TrexRpcCmdAddStream::check_min_max(uint8_t flow_var_size, uint64_t init_value, diff --git a/src/rpc-server/commands/trex_rpc_cmds.h b/src/rpc-server/commands/trex_rpc_cmds.h index c987f325..506bd2c9 100644 --- a/src/rpc-server/commands/trex_rpc_cmds.h +++ b/src/rpc-server/commands/trex_rpc_cmds.h @@ -114,6 +114,7 @@ void parse_vm_instr_trim_pkt_size(const Json::Value &inst, std::unique_ptr<TrexS void parse_rate(const Json::Value &inst, std::unique_ptr<TrexStream> &stream, Json::Value &result); void parse_vm_instr_write_flow_var(const Json::Value &inst, std::unique_ptr<TrexStream> &stream, Json::Value &result); void parse_vm_instr_write_mask_flow_var(const Json::Value &inst, std::unique_ptr<TrexStream> &stream, Json::Value &result); +void handle_range_padding(uint64_t &max_value, uint64_t &min_value, uint64_t step, int op, Json::Value &result); ); |