summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2016-09-14 13:31:39 +0300
committerimarom <imarom@cisco.com>2016-09-25 15:00:45 +0300
commit0f1d226c5fc94d4d28665b9c1f3ffc2bac11cdfc (patch)
treed0c8daafdc943a4d2e7ebae9d9c16379e0e59d13 /scripts
parentce6d61aa2943bfa845a9d0f69e8b9353e0456794 (diff)
draft: new split algorithm
Diffstat (limited to 'scripts')
-rw-r--r--scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_sim.py56
-rw-r--r--scripts/stl/tests/multi_core_test.py79
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()
+
+
+