From 13cfb2c4ea55b7e0dab40155d8d51e7955ae4681 Mon Sep 17 00:00:00 2001 From: imarom Date: Thu, 3 Mar 2016 16:34:20 +0200 Subject: RX stats API --- .../stl/examples/stl_run_udp_simple.py | 1 - .../stl/examples/stl_rx_stream.py | 57 ++++++++++++++++++++++ .../stl/trex_stl_lib/trex_stl_async_client.py | 4 ++ .../stl/trex_stl_lib/trex_stl_client.py | 8 ++- .../trex_stl_lib/trex_stl_packet_builder_scapy.py | 2 +- .../stl/trex_stl_lib/trex_stl_streams.py | 1 - 6 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 scripts/automation/trex_control_plane/stl/examples/stl_rx_stream.py (limited to 'scripts/automation/trex_control_plane/stl') diff --git a/scripts/automation/trex_control_plane/stl/examples/stl_run_udp_simple.py b/scripts/automation/trex_control_plane/stl/examples/stl_run_udp_simple.py index db005608..465b3dde 100644 --- a/scripts/automation/trex_control_plane/stl/examples/stl_run_udp_simple.py +++ b/scripts/automation/trex_control_plane/stl/examples/stl_run_udp_simple.py @@ -19,7 +19,6 @@ class t_global(object): args=None; -import dpkt import time import json import string diff --git a/scripts/automation/trex_control_plane/stl/examples/stl_rx_stream.py b/scripts/automation/trex_control_plane/stl/examples/stl_rx_stream.py new file mode 100644 index 00000000..daff6105 --- /dev/null +++ b/scripts/automation/trex_control_plane/stl/examples/stl_rx_stream.py @@ -0,0 +1,57 @@ +import stl_path +from trex_stl_lib.api import * + +import time +import pprint + +def rx_example (tx_port, rx_port): + + # create client + c = STLClient() + passed = True + + try: + pkt = STLPktBuilder(pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025)/IP()/'a_payload_example') + total_pkts = 500000 + s1 = STLStream(name = 'rx', + packet = pkt, + rx_stats = STLRxStats(user_id = 5), + mode = STLTXSingleBurst(total_pkts = total_pkts, bps_L2 = 250000000)) + + # connect to server + c.connect() + + # prepare our ports + c.reset(ports = [tx_port, rx_port]) + + # add both streams to ports + c.add_streams([s1], ports = [tx_port]) + + print "injecting {0} packets on port {1}".format(total_pkts, tx_port) + c.clear_stats() + c.start(ports = [tx_port]) + c.wait_on_traffic(ports = [tx_port]) + + time.sleep(1) + stats = c.get_stats() + pprint.pprint(stats['rx_stats']) + print "port 3: ipackets {0}, ibytes {1}".format(stats[3]['ipackets'], stats[3]['ibytes']) + #rx_stas = stats['rx_stats'] + + + 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 +rx_example(tx_port = 0, rx_port = 3) + diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_async_client.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_async_client.py index 410482b9..f75d2003 100644 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_async_client.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_async_client.py @@ -280,6 +280,10 @@ class CTRexAsyncClient(): # barriers elif name == "trex-barrier": self.handle_async_barrier(type, data) + + elif name == "rx-stats": + self.event_handler.handle_async_rx_stats_event(data) + else: pass diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py index 04dd77ec..8da7c411 100644 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py @@ -155,6 +155,10 @@ class AsyncEventHandler(object): pass + def handle_async_rx_stats_event (self, data): + self.client.rx_stats = data + + # handles an async stats update from the subscriber def handle_async_stats_update(self, dump_data): global_stats = {} @@ -435,7 +439,7 @@ class STLClient(object): self.stats_generator = trex_stl_stats.CTRexInfoGenerator(self.global_stats, self.ports) - + self.rx_stats = {} ############# private functions - used by the class itself ########### @@ -741,6 +745,8 @@ class STLClient(object): stats['total'] = total + stats['rx_stats'] = copy.deepcopy(self.rx_stats) + return stats diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_packet_builder_scapy.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_packet_builder_scapy.py index 42d648a5..b2843ac3 100644 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_packet_builder_scapy.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_packet_builder_scapy.py @@ -668,7 +668,7 @@ class CTRexVmDescTupleGen(CTRexVmDescBase): class CScapyTRexPktBuilder(CTrexPktBuilderInterface): """ - This class defines the TRex API of building a packet using dpkt package. + This class defines the TRex API of building a packet using scapy package. Using this class the user can also define how TRex will handle the packet by specifying the VM setting. pkt could be Scapy pkt or pcap file name diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py index b56d8708..2dfc5f29 100644 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py @@ -6,7 +6,6 @@ from trex_stl_packet_builder_interface import CTrexPktBuilderInterface from trex_stl_packet_builder_scapy import CScapyTRexPktBuilder, Ether, IP, UDP, TCP, RawPcapReader from collections import OrderedDict, namedtuple -from dpkt import pcap import random import yaml import base64 -- cgit 1.2.3-korg