Test case: i send 6 stream ( with different protocols ) to 1 interface in STL mode and then check RX stats per stream.
If i not use vm in STLPktBuilder , i can get rx_pckts stats per stream.
but when i use vm , all rx stats in streams = 0.
# Example showing how to define stream for getting per flow statistics, and how to parse the received statistics
import stl_path
from trex_stl_lib.api import *
import subprocess
import json
import time
import pprint
def rx_example (tx_port, rx_port, burst_size, bw):
print("\nGoing to inject {0} packets on port {1} - checking RX stats on port {2}\n".format(burst_size, tx_port, rx_port))
# create client
c = STLClient()
passed = True
try:
vm = STLScVmRaw( [ STLVmFlowVar(
# min_value=1488, max_value=65300,
min_value="16.0.0.1", max_value="16.0.0.5",
size=4,
name="UDP_PORT"),
# STLVmWrFlowVar(fv_name="tuple.ip", pkt_offset= "IP.src" ),
STLVmWrFlowVar(fv_name="UDP_PORT", pkt_offset= "IP.src" ),
STLVmFixIpv4(offset = "IP") # fix checksum
]
)
pkt = STLPktBuilder(pkt = "pcaps/snmp.pcap" )
#pkt2 = STLPktBuilder(pkt = "/tmp/v2.37/avl/http_browsin(.pcap")
pkt2 = STLPktBuilder(pkt = "pcaps/sipv2.pcap" )
pkt3 = STLPktBuilder(pkt = "pcaps/dns_port.pcap" )
pkt4 = STLPktBuilder(pkt = "pcaps/ISAKMP_sa_setup.cap" )
# pkt5 = STLPktBuilder(pkt = "pcaps/udpgmd.pcap", vm = vm)
pkt5 = STLPktBuilder(pkt = "pcaps/tftpv2.pcap")
pkt6 = STLPktBuilder(pkt = "pcaps/NTP_sync.pcap")
# pkt6 = STLPktBuilder(pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025)/'a_aaaaaa')
s1 = STLStream(name = 'rx',
packet = pkt,
flow_stats = STLFlowStats(pg_id = 0),
mode = STLTXCont(percentage = 10))
s2 = STLStream(name = 'rx2',
packet = pkt2,
flow_stats = STLFlowStats(pg_id = 2),
mode = STLTXCont(percentage = 10))
s3 = STLStream(name = 'rx3',
packet = pkt3,
flow_stats = STLFlowStats(pg_id = 3),
mode = STLTXCont(percentage = 10))
s4 = STLStream(name = 'rx4',
packet = pkt4,
flow_stats = STLFlowStats(pg_id = 4),
mode = STLTXCont(percentage = 10))
s5 = STLStream(name = 'rx5',
packet = pkt5,
flow_stats = STLFlowStats(pg_id = 5),
mode = STLTXCont(pps = 4801))
s6 = STLStream(name = 'rx6',
packet = pkt6,
flow_stats = STLFlowStats(pg_id = 6),
mode = STLTXSingleBurst(total_pkts = 100000, percentage = 10))
streams = [s1,s2 ,s3,s4, s5, s6]
# connect to server
c.connect()
# prepare our ports
c.reset(ports = [tx_port, rx_port])
# add stream to port
c.add_streams(streams, ports = [tx_port])
rc = rx_iteration(c, tx_port, rx_port, s1.get_pkt_len())
if not rc:
passed = False
#print c.get_stats()
except STLError as e:
passed = False
print(e)
finally:
c.disconnect()
if passed:
print("\nTest passed :-)\n")
else:
print("\nTest failed :-(\n")
# RX one iteration
def rx_iteration (c, tx_port, rx_port, pkt_len):
ret = True
c.clear_stats()
c.start(ports = [tx_port],duration=500)
c.wait_on_traffic(ports = [tx_port])
global_flow_stats = c.get_pgid_stats()['flow_stats']
print global_flow_stats
# print json.dumps(flow_stats, indent = 4)
print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
# print json.dumps(flow_stats2, indent = 4)
print global_flow_stats.get(0)["rx_pkts"]
print global_flow_stats.get(2)["rx_pkts"]
print global_flow_stats.get(3)["rx_pkts"]
print global_flow_stats.get(5)
# run the tests
rx_example(tx_port = 0, rx_port = 1, burst_size = 1000, bw = 40)