diff options
author | imarom <imarom@cisco.com> | 2016-09-14 13:31:39 +0300 |
---|---|---|
committer | imarom <imarom@cisco.com> | 2016-09-25 15:00:45 +0300 |
commit | 0f1d226c5fc94d4d28665b9c1f3ffc2bac11cdfc (patch) | |
tree | d0c8daafdc943a4d2e7ebae9d9c16379e0e59d13 /scripts | |
parent | ce6d61aa2943bfa845a9d0f69e8b9353e0456794 (diff) |
draft: new split algorithm
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_sim.py | 56 | ||||
-rw-r--r-- | scripts/stl/tests/multi_core_test.py | 79 |
2 files changed, 127 insertions, 8 deletions
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 3e63c4e2..0394cf43 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 @@ -24,6 +24,9 @@ from .trex_stl_client import STLClient from .utils import pcap from trex_stl_lib.trex_stl_packet_builder_scapy import RawPcapReader, RawPcapWriter, hexdump +from random import randint +from random import choice as rand_choice + from yaml import YAMLError import re @@ -473,7 +476,31 @@ def compare_caps (cap1, cap2, max_diff_sec = (5 * 1e-6)): return True - +def hexdiff (d1, d2): + rc = [] + + if len(d1) != len(d2): + return rc + + for i in range(len(d1)): + if d1[i] != d2[i]: + rc.append(i) + return rc + +def prettyhex (h, diff_list): + if type(h[0]) == str: + h = [ord(x) for x in h] + + for i in range(len(h)): + + if i in diff_list: + sys.stdout.write("->'0x%02x'<-" % h[i]) + else: + sys.stdout.write(" '0x%02x' " % h[i]) + if ((i % 9) == 8): + print("") + + print("") # a more strict comparsion 1 <--> 1 def compare_caps_strict (cap1, cap2, max_diff_sec = (5 * 1e-6)): @@ -495,18 +522,31 @@ def compare_caps_strict (cap1, cap2, max_diff_sec = (5 * 1e-6)): if pkt1[0] != pkt2[0]: print(format_text("RAW error: cap files '{0}', '{1}' differ in cap #{2}\n".format(cap1, cap2, i), 'bold')) - print(hexdump(pkt1[0])) - print("") - print(hexdump(pkt2[0])) + + #d1 = hexdump(pkt1[0]) + #d2 = hexdump(pkt2[0]) + + diff_list = hexdiff(pkt1[0], pkt2[0]) + + print("{0} - packet #{1}:\n".format(cap1, i)) + prettyhex(pkt1[0], diff_list) + + print("\n{0} - packet #{1}:\n".format(cap2, i)) + prettyhex(pkt2[0], diff_list) + + #print(hexdump(pkt1[0])) + #print("") + #print(hexdump(pkt2[0])) + #print("") print("") return False return True -# + def test_multi_core (r, options): - for core_count in [1, 2, 4, 6, 8]: + for core_count in range(1, 9): r.run(input_list = options.input_file, outfile = '{0}.cap'.format(core_count), dp_core_count = core_count, @@ -516,12 +556,12 @@ def test_multi_core (r, options): duration = options.duration, mode = 'none', silent = True, - tunables = options.tunables) + tunables = [{'seed': 5}]) print("") print(format_text("comparing 2 cores to 1 core:\n", 'underline')) - rc = compare_caps('1.cap', '2.cap') + rc = compare_caps_strict('1.cap', '2.cap') if rc: print("[Passed]\n") diff --git a/scripts/stl/tests/multi_core_test.py b/scripts/stl/tests/multi_core_test.py new file mode 100644 index 00000000..a0ec3b2d --- /dev/null +++ b/scripts/stl/tests/multi_core_test.py @@ -0,0 +1,79 @@ +from trex_stl_lib.api import * +import random + +class STLMultiCore(object): + + def __init__ (self): + # default IMIX properties + self.streams_def = [ {'size': 300, 'pps': 2884, 'isg':0 }, + #{'size': 590, 'pps': 20, 'isg':0.1 }, + #{'size': 1514, 'pps': 4, 'isg':0.2 } + ] + + + def create_stream (self, size, pps, isg, vm ): + # Create base packet and pad it to size + base_pkt = Ether()/IP()/UDP() + pad = max(0, size - len(base_pkt)) * 'x' + + pkt = STLPktBuilder(pkt = base_pkt/pad, + vm = vm) + + return STLStream(isg = isg, + packet = pkt, + mode = STLTXCont(pps = pps)) + + + def generate_var (self, rng, i): + + d = {'name': str(i)} + + d['size'] = rng.choice([1, 2, 4]) + max_val = (1 << d['size'] * 8) + + d['start'] = rng.randint(0, max_val - 1) + d['end'] = rng.randint(d['start'], max_val) + d['step'] = rng.randint(1, 1000) + d['op'] = rng.choice(['inc', 'dec']) + + return d + + def dump_var (self, var): + return 'name: {:}, start: {:}, end: {:}, size: {:}, op: {:}, step {:}'.format(var['name'], var['start'], var['end'], var['size'], var['op'], var['step']) + + + def get_streams (self, direction = 0, **kwargs): + + rng = random.Random(kwargs.get('seed', 1)) + + # base offset + pkt_offset = 42 + vm = [] + print("\nusing the following vars:\n") + for i in range(10): + var = self.generate_var(rng, i) + print("at offset {:} - var: {:}".format(pkt_offset, self.dump_var(var))) + vm += [STLVmFlowVar(name = var['name'], + min_value = var['start'], + max_value = var['end'], + size = var['size'], + op = var['op']), + STLVmWrFlowVar(fv_name = var['name'], pkt_offset = pkt_offset), + ] + pkt_offset += var['size'] + + + + + print("\n") + # create imix streams + return [self.create_stream(x['size'], x['pps'],x['isg'] , vm) for x in self.streams_def] + + + +# dynamic load - used for trex console or simulator +def register(): + return STLMultiCore() + + + |