import time
import pprint
-def rx_example (tx_port, rx_port):
+def rx_example (tx_port, rx_port, burst_size):
+
+ 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()
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
+
+ total_pkts = burst_size
s1 = STLStream(name = 'rx',
packet = pkt,
rx_stats = STLRxStats(user_id = 5),
# add both streams to ports
c.add_streams([s1], ports = [tx_port])
- print "injecting {0} packets on port {1}".format(total_pkts, tx_port)
+ print "injecting {0} packets on port {1}\n".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']
+ # no error check - just an example... should be 5
+ rx_stats = c.get_stats()['rx_stats'][5]
+
+ tx_pkts = rx_stats['tx-pkts'][tx_port]
+ tx_bytes = rx_stats['tx-bytes'][tx_port]
+ rx_pkts = rx_stats['rx-pkts'][rx_port]
+
+ if tx_pkts != total_pkts:
+ print "TX pkts mismatch - got: {0}, expected: {1}".format(tx_pkts, total_pkts)
+ passed = False
+ return
+ else:
+ print "TX pkts match - {0}".format(tx_pkts)
+
+ if tx_bytes != (total_pkts * pkt.get_pkt_len()):
+ print "TX bytes mismatch - got: {0}, expected: {1}".format(tx_bytes, (total_pkts * len(pkt)))
+ passed = False
+ return
+ else:
+ print "TX bytes match - {0}".format(tx_bytes)
+
+ if rx_pkts != total_pkts:
+ print "RX pkts mismatch - got: {0}, expected: {1}".format(rx_pkts, total_pkts)
+ passed = False
+ return
+ else:
+ print "RX pkts match - {0}".format(rx_pkts)
except STLError as e:
# run the tests
-rx_example(tx_port = 0, rx_port = 3)
+rx_example(tx_port = 0, rx_port = 3, burst_size = 500000)
def handle_async_rx_stats_event (self, data):
- self.client.rx_stats = data
+ self.client.rx_stats.update(data)
# handles an async stats update from the subscriber
self.global_stats = trex_stl_stats.CGlobalStats(self.connection_info,
- self.server_version,
- self.ports)
+ self.server_version,
+ self.ports)
self.stats_generator = trex_stl_stats.CTRexInfoGenerator(self.global_stats,
- self.ports)
+ self.ports)
+
+ self.rx_stats = trex_stl_stats.CRxStats()
- self.rx_stats = {}
############# private functions - used by the class itself ###########
stats['total'] = total
- stats['rx_stats'] = copy.deepcopy(self.rx_stats)
+ stats['rx_stats'] = self.rx_stats.get_stats()
return stats
}
+class CRxStats(object):
+ def __init__(self):
+ self.rx_stats = {}
+
+
+ def update (self, snapshot):
+ self.rx_stats = snapshot
+
+
+ def get_stats (self):
+ stats = {}
+ for user_id, user_id_data in self.rx_stats.iteritems():
+ # ignore non user ID keys
+ try:
+ user_id = int(user_id)
+ except ValueError:
+ continue
+
+ # handle user id
+ stats[user_id] = {}
+ for field, per_port_data in user_id_data.iteritems():
+ stats[user_id][field] = {}
+ for port, value in per_port_data.iteritems():
+ stats[user_id][field][int(port)] = value
+
+ return stats
+
if __name__ == "__main__":
pass
std::string str_user_id = static_cast<std::ostringstream*>( &(std::ostringstream()
<< user_id) )->str();
for (uint8_t port = 0; port < m_num_ports; port++) {
- std::string str_port = static_cast<std::ostringstream*>( &(std::ostringstream() << port) )->str();
+ std::string str_port = static_cast<std::ostringstream*>( &(std::ostringstream() << int(port) ) )->str();
+
if (user_id_info->get_rx_counter(port) != 0) {
data_section[str_user_id]["rx-pkts"][str_port] = Json::Value::UInt64(user_id_info->get_rx_counter(port));
ret = true;