summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHanoh Haim <hhaim@cisco.com>2016-03-14 16:56:01 +0200
committerHanoh Haim <hhaim@cisco.com>2016-03-14 16:56:01 +0200
commit1e9dc291672c4d1c2319b48739afdc2f3b861d0e (patch)
tree1d5d94301c0df1ae3128dd746f71e5777f56e730
parent5817a4501ec08f56c3684260c8373f20e4c6c0f0 (diff)
parentc2954671aa8989a462ad9c63ec8ede5ade491957 (diff)
Merge profile doc
-rw-r--r--scripts/automation/regression/stateless_tests/stl_rx_test.py147
-rw-r--r--src/flow_stat.cpp13
2 files changed, 152 insertions, 8 deletions
diff --git a/scripts/automation/regression/stateless_tests/stl_rx_test.py b/scripts/automation/regression/stateless_tests/stl_rx_test.py
new file mode 100644
index 00000000..90082c59
--- /dev/null
+++ b/scripts/automation/regression/stateless_tests/stl_rx_test.py
@@ -0,0 +1,147 @@
+#!/router/bin/python
+from stl_general_test import CStlGeneral_Test, CTRexScenario
+from trex_stl_lib.api import *
+import os, sys
+
+class STLRX_Test(CStlGeneral_Test):
+ """Tests for RX feature"""
+
+ def setUp(self):
+ CStlGeneral_Test.setUp(self)
+ assert 'bi' in CTRexScenario.stl_ports_map
+
+ self.c = CTRexScenario.stl_trex
+
+ self.tx_port, self.rx_port = CTRexScenario.stl_ports_map['bi'][0]
+
+ cap = self.c.get_port_info(ports = self.rx_port)[0]['rx']['caps']
+ if cap != 1:
+ self.skip('port {0} does not support RX'.format(self.rx_port))
+
+
+ self.c.reset(ports = [self.tx_port, self.rx_port])
+
+ self.pkt = STLPktBuilder(pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=12,sport=1025)/IP()/'a_payload_example')
+
+ @classmethod
+ def tearDownClass(cls):
+ # connect back at end of tests
+ if not cls.is_connected():
+ CTRexScenario.stl_trex.connect()
+
+
+ def __verify_flow (self, pg_id, total_pkts, pkt_len):
+
+ flow_stats = self.c.get_stats()['flow_stats'].get(pg_id)
+ if not flow_stats:
+ assert False, "no flow stats available"
+
+ tx_pkts = flow_stats['tx_pkts'].get(self.tx_port, 0)
+ tx_bytes = flow_stats['tx_bytes'].get(self.tx_port, 0)
+ rx_pkts = flow_stats['rx_pkts'].get(self.rx_port, 0)
+
+ if tx_pkts != total_pkts:
+ pprint.pprint(flow_stats)
+ assert False, 'TX pkts mismatch - got: {0}, expected: {1}'.format(tx_pkts, total_pkts)
+
+ if tx_bytes != (total_pkts * pkt_len):
+ pprint.pprint(flow_stats)
+ assert False, 'TX bytes mismatch - got: {0}, expected: {1}'.format(tx_bytes, (total_pkts * pkt_len))
+
+ if rx_pkts != total_pkts:
+ pprint.pprint(flow_stats)
+ assert False, 'RX pkts mismatch - got: {0}, expected: {1}'.format(rx_pkts, total_pkts)
+
+
+ # RX itreation
+ def __rx_iteration (self, exp_list):
+
+ self.c.clear_stats()
+
+ self.c.start(ports = [self.tx_port])
+ self.c.wait_on_traffic(ports = [self.tx_port])
+
+ for exp in exp_list:
+ self.__verify_flow(exp['pg_id'], exp['total_pkts'], exp['pkt_len'])
+
+
+
+ # one simple stream on TX --> RX
+ def test_one_stream(self):
+ total_pkts = 500000
+
+ try:
+ s1 = STLStream(name = 'rx',
+ packet = self.pkt,
+ flow_stats = STLFlowStats(pg_id = 5),
+ mode = STLTXSingleBurst(total_pkts = total_pkts,
+ percentage = 80
+ ))
+
+ # add both streams to ports
+ self.c.add_streams([s1], ports = [self.tx_port])
+
+ print "\ninjecting {0} packets on port {1}\n".format(total_pkts, self.tx_port)
+
+ exp = {'pg_id': 5, 'total_pkts': total_pkts, 'pkt_len': self.pkt.get_pkt_len()}
+
+ self.__rx_iteration( [exp] )
+
+
+ except STLError as e:
+ assert False , '{0}'.format(e)
+
+
+ # one simple stream on TX --> RX
+ def test_multiple_streams(self):
+ total_pkts = 500000
+
+ try:
+ streams = []
+ exp = []
+ # 10 identical streams
+ for pg_id in range(1, 10):
+
+ streams.append(STLStream(name = 'rx {0}'.format(pg_id),
+ packet = self.pkt,
+ flow_stats = STLFlowStats(pg_id = pg_id),
+ mode = STLTXSingleBurst(total_pkts = total_pkts * pg_id,
+ pps = total_pkts * pg_id)))
+
+ exp.append({'pg_id': pg_id, 'total_pkts': total_pkts * pg_id, 'pkt_len': self.pkt.get_pkt_len()})
+
+ # add both streams to ports
+ self.c.add_streams(streams, ports = [self.tx_port])
+
+ self.__rx_iteration(exp)
+
+
+ except STLError as e:
+ assert False , '{0}'.format(e)
+
+ def test_1_stream_many_iterations (self):
+ total_pkts = 50000
+
+ try:
+ s1 = STLStream(name = 'rx',
+ packet = self.pkt,
+ flow_stats = STLFlowStats(pg_id = 5),
+ mode = STLTXSingleBurst(total_pkts = total_pkts,
+ percentage = 80
+ ))
+
+ # add both streams to ports
+ self.c.add_streams([s1], ports = [self.tx_port])
+
+ #print "\ninjecting {0} packets on port {1}\n".format(total_pkts, self.tx_port)
+
+ exp = {'pg_id': 5, 'total_pkts': total_pkts, 'pkt_len': self.pkt.get_pkt_len()}
+
+ for i in range(0, 10):
+ print "starting iteration {0}".format(i)
+ self.__rx_iteration( [exp] )
+
+
+
+ except STLError as e:
+ assert False , '{0}'.format(e)
diff --git a/src/flow_stat.cpp b/src/flow_stat.cpp
index dc039661..f03065d2 100644
--- a/src/flow_stat.cpp
+++ b/src/flow_stat.cpp
@@ -595,14 +595,11 @@ int CFlowStatRuleMgr::stop_stream(const TrexStream * stream) {
for (uint8_t port = 0; port < m_num_ports; port++) {
m_api->del_rx_flow_stat_rule(port, FLOW_STAT_RULE_TYPE_IPV4_ID, proto, hw_id);
m_api->get_flow_stats(port, &rx_counter, (void *)&tx_counter, hw_id, hw_id, true);
- if (p_user_id->get_rx_counter(port) != rx_counter) {
- p_user_id->set_rx_counter(port, rx_counter);
- p_user_id->set_need_to_send_rx(port);
- }
- if (p_user_id->get_tx_counter(port) != tx_counter) {
- p_user_id->set_tx_counter(port, tx_counter);
- p_user_id->set_need_to_send_tx(port);
- }
+ // when stopping, always send counters for stopped stream one last time
+ p_user_id->set_rx_counter(port, rx_counter);
+ p_user_id->set_need_to_send_rx(port);
+ p_user_id->set_tx_counter(port, tx_counter);
+ p_user_id->set_need_to_send_tx(port);
}
m_user_id_map.unmap(stream->m_rx_check.m_pg_id);
m_hw_id_map.unmap(hw_id);