summaryrefslogtreecommitdiffstats
path: root/api/stl/examples/stl_bi_dir_flows.py
diff options
context:
space:
mode:
Diffstat (limited to 'api/stl/examples/stl_bi_dir_flows.py')
-rw-r--r--api/stl/examples/stl_bi_dir_flows.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/api/stl/examples/stl_bi_dir_flows.py b/api/stl/examples/stl_bi_dir_flows.py
new file mode 100644
index 00000000..429445e6
--- /dev/null
+++ b/api/stl/examples/stl_bi_dir_flows.py
@@ -0,0 +1,122 @@
+# include the path of trex_stl_api.py
+import sys
+sys.path.insert(0, "../")
+
+from trex_stl_api import *
+
+import dpkt
+import time
+import json
+
+
+def simple_burst ():
+
+ # build A side packet
+ pkt_a = STLPktBuilder()
+
+ pkt_a.add_pkt_layer("l2", dpkt.ethernet.Ethernet())
+ pkt_a.add_pkt_layer("l3_ip", dpkt.ip.IP())
+ pkt_a.add_pkt_layer("l4_udp", dpkt.udp.UDP())
+ pkt_a.set_pkt_payload("somepayload")
+ pkt_a.set_layer_attr("l3_ip", "len", len(pkt_a.get_layer('l3_ip')))
+
+ # build B side packet
+ pkt_b = pkt_a.clone()
+
+ # set IP range for pkt and split it by multiple cores
+ pkt_a.set_vm_ip_range(ip_layer_name = "l3_ip",
+ ip_field = "src",
+ ip_start="10.0.0.1", ip_end="10.0.0.254",
+ operation = "inc",
+ split = True)
+
+ pkt_a.set_vm_ip_range(ip_layer_name = "l3_ip",
+ ip_field = "dst",
+ ip_start="8.0.0.1", ip_end="8.0.0.254",
+ operation = "inc")
+
+
+ # build B side packet
+ pkt_b.set_vm_ip_range(ip_layer_name = "l3_ip",
+ ip_field = "src",
+ ip_start="8.0.0.1", ip_end="8.0.0.254",
+ operation = "inc",
+ split = True)
+
+ pkt_b.set_vm_ip_range(ip_layer_name = "l3_ip",
+ ip_field = "dst",
+ ip_start="10.0.0.1", ip_end="10.0.0.254",
+ operation = "inc")
+
+
+ # create client
+ c = STLClient()
+ passed = True
+
+ try:
+ # turn this on for some information
+ #c.set_verbose("high")
+
+ # create two streams
+ s1 = STLStream(packet = pkt_a,
+ mode = STLTXCont(pps = 100))
+
+ # second stream with a phase of 1ms (inter stream gap)
+ s2 = STLStream(packet = pkt_b,
+ isg = 1000,
+ mode = STLTXCont(pps = 100))
+
+
+ # connect to server
+ c.connect()
+
+ # prepare our ports (my machine has 0 <--> 1 with static route)
+ c.reset(ports = [0, 1])
+
+ # add both streams to ports
+ c.add_streams(s1, ports = [0])
+ c.add_streams(s2, ports = [1])
+
+ # clear the stats before injecting
+ c.clear_stats()
+
+ # choose rate and start traffic for 10 seconds on 5 mpps
+ print "Running 5 Mpps on ports 0, 1 for 10 seconds..."
+ c.start(ports = [0, 1], mult = "5mpps", duration = 10)
+
+ # block until done
+ c.wait_on_traffic(ports = [0, 1])
+
+ # read the stats after the test
+ stats = c.get_stats()
+
+ print json.dumps(stats["port 0"], indent = 4, separators=(',', ': '), sort_keys = True)
+ print json.dumps(stats["port 1"], indent = 4, separators=(',', ': '), sort_keys = True)
+
+ lost_a = stats["port 0"]["opackets"] - stats["port 1"]["ipackets"]
+ lost_b = stats["port 1"]["opackets"] - stats["port 0"]["ipackets"]
+
+ print "\npackets lost from 0 --> 1: {0} pkts".format(lost_a)
+ print "packets lost from 1 --> 0: {0} pkts".format(lost_b)
+
+ if (lost_a == 0) and (lost_b == 0):
+ passed = True
+ else:
+ passed = False
+
+ except STLError as e:
+ passed = False
+ print e
+
+ finally:
+ c.disconnect()
+
+ if passed:
+ print "\nTest has passed :-)\n"
+ else:
+ print "\nTest has failed :-(\n"
+
+
+# run the tests
+simple_burst()
+