summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scripts/automation/regression/stateless_tests/stl_rx_test.py39
-rw-r--r--src/flow_stat.cpp6
-rw-r--r--src/main_dpdk.cpp2
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp3
4 files changed, 31 insertions, 19 deletions
diff --git a/scripts/automation/regression/stateless_tests/stl_rx_test.py b/scripts/automation/regression/stateless_tests/stl_rx_test.py
index 10e70b86..b0dfdbb4 100644
--- a/scripts/automation/regression/stateless_tests/stl_rx_test.py
+++ b/scripts/automation/regression/stateless_tests/stl_rx_test.py
@@ -9,7 +9,7 @@ class STLRX_Test(CStlGeneral_Test):
def setUp(self):
if self.is_virt_nics:
self.skip('Skip this for virtual NICs for now')
- per_driver_params = {"rte_vmxnet3_pmd": [1, 50], "rte_ixgbe_pmd": [30, 5000], "rte_i40e_pmd": [80, 5000, 25],
+ per_driver_params = {"rte_vmxnet3_pmd": [1, 50], "rte_ixgbe_pmd": [30, 5000], "rte_i40e_pmd": [80, 5000, 10],
"rte_igb_pmd": [80, 500], "rte_em_pmd": [1, 50], "rte_virtio_pmd": [1, 50]}
CStlGeneral_Test.setUp(self)
@@ -61,18 +61,16 @@ class STLRX_Test(CStlGeneral_Test):
sth = latency_stats['err_cntrs']['seq_too_high']
stl = latency_stats['err_cntrs']['seq_too_low']
lat = latency_stats['latency']
- if ooo != 0 or dup != 0 or sth != 0:
+ if ooo != 0 or dup != 0 or stl != 0:
pprint.pprint(latency_stats)
tmp='Error packets - dropped:{0}, ooo:{1} dup:{2} seq too high:{3} seq too low:{4}'.format(drops, ooo, dup, sth, stl)
assert False, tmp
- if (drops != 0 or stl != 0) and not self.drops_expected:
+ if (drops != 0 or sth != 0) and not self.drops_expected:
pprint.pprint(latency_stats)
tmp='Error packets - dropped:{0}, ooo:{1} dup:{2} seq too high:{3} seq too low:{4}'.format(drops, ooo, dup, sth, stl)
assert False, tmp
-
-
if tx_pkts != total_pkts:
pprint.pprint(flow_stats)
tmp = 'TX pkts mismatch - got: {0}, expected: {1}'.format(tx_pkts, total_pkts)
@@ -109,7 +107,7 @@ class STLRX_Test(CStlGeneral_Test):
self.__verify_flow(exp['pg_id'], exp['total_pkts'], exp['pkt_len'], stats)
- # one simple stream on TX --> RX
+ # one stream on TX --> RX
def test_one_stream(self):
total_pkts = self.total_pkts * 10
@@ -118,7 +116,7 @@ class STLRX_Test(CStlGeneral_Test):
packet = self.pkt,
flow_stats = STLFlowLatencyStats(pg_id = 5),
mode = STLTXSingleBurst(total_pkts = total_pkts,
- percentage = self.rate_percent
+ percentage = self.rate_lat
))
# add both streams to ports
@@ -135,14 +133,13 @@ class STLRX_Test(CStlGeneral_Test):
assert False , '{0}'.format(e)
- # one simple stream on TX --> RX
def test_multiple_streams(self):
num_latency_streams = 128
num_flow_stat_streams = 127
total_pkts = int(self.total_pkts / (num_latency_streams + num_flow_stat_streams))
if total_pkts == 0:
total_pkts = 1
- percent = float(self.rate_percent) / (num_latency_streams + num_flow_stat_streams)
+ percent = float(self.rate_lat) / (num_latency_streams + num_flow_stat_streams)
try:
streams = []
@@ -181,22 +178,34 @@ class STLRX_Test(CStlGeneral_Test):
try:
s1 = STLStream(name = 'rx',
packet = self.pkt,
- flow_stats = STLFlowLatencyStats(pg_id = 5),
+ flow_stats = STLFlowStats(pg_id = 5),
mode = STLTXSingleBurst(total_pkts = total_pkts,
percentage = self.rate_percent
))
- # add both streams to ports
- self.c.add_streams([s1], ports = [self.tx_port])
+ s_lat = STLStream(name = 'rx',
+ packet = self.pkt,
+ flow_stats = STLFlowLatencyStats(pg_id = 5),
+ mode = STLTXSingleBurst(total_pkts = total_pkts,
+ percentage = self.rate_lat
+ ))
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()}
+ exp_lat = {'pg_id': 5, 'total_pkts': total_pkts, 'pkt_len': self.pkt.get_pkt_len()}
+ self.c.add_streams([s1], ports = [self.tx_port])
for i in range(0, 10):
print("starting iteration {0}".format(i))
self.__rx_iteration( [exp] )
+ self.c.remove_all_streams(ports = [self.tx_port])
+ self.c.add_streams([s_lat], ports = [self.tx_port])
+ for i in range(0, 10):
+ print("starting iteration {0} latency".format(i))
+ self.__rx_iteration( [exp_lat] )
+
except STLError as e:
@@ -205,7 +214,6 @@ class STLRX_Test(CStlGeneral_Test):
# this test adds more and more latency streams and re-test with incremental
- # test does not work yet
def test_incremental_latency_streams (self):
total_pkts = self.total_pkts
percent = 0.5
@@ -244,10 +252,5 @@ class STLRX_Test(CStlGeneral_Test):
self.c.remove_all_streams(ports = [self.tx_port])
-
-
except STLError as e:
assert False , '{0}'.format(e)
-
-
-
diff --git a/src/flow_stat.cpp b/src/flow_stat.cpp
index 1a3e54aa..2385e03f 100644
--- a/src/flow_stat.cpp
+++ b/src/flow_stat.cpp
@@ -871,6 +871,9 @@ int CFlowStatRuleMgr::stop_stream(TrexStream * stream) {
p_user_id_p->set_latency_json(json);
p_user_id_p->set_seq_err_cnt(rfc2544_info.get_seq_err_cnt());
p_user_id_p->set_ooo_cnt(rfc2544_info.get_ooo_cnt());
+ p_user_id_p->set_dup_cnt(rfc2544_info.get_dup_cnt());
+ p_user_id_p->set_seq_err_big_cnt(rfc2544_info.get_seq_err_ev_big());
+ p_user_id_p->set_seq_err_low_cnt(rfc2544_info.get_seq_err_ev_low());
m_hw_id_map_payload.unmap(hw_id);
}
m_user_id_map.unmap(stream->m_rx_check.m_pg_id);
@@ -1049,6 +1052,9 @@ bool CFlowStatRuleMgr::dump_json(std::string & s_json, std::string & l_json, boo
rfc2544_info[hw_id].get_latency_json(lat_hist);
user_id_info_p->set_seq_err_cnt(rfc2544_info[hw_id].get_seq_err_cnt());
user_id_info_p->set_ooo_cnt(rfc2544_info[hw_id].get_ooo_cnt());
+ user_id_info_p->set_dup_cnt(rfc2544_info[hw_id].get_dup_cnt());
+ user_id_info_p->set_seq_err_big_cnt(rfc2544_info[hw_id].get_seq_err_ev_big());
+ user_id_info_p->set_seq_err_low_cnt(rfc2544_info[hw_id].get_seq_err_ev_low());
l_data_section[str_user_id]["latency"]["h"] = lat_hist;
l_data_section[str_user_id]["latency"]["last_max"] = rfc2544_info[hw_id].get_last_max_usec();
l_data_section[str_user_id]["latency"]["jitter"] = rfc2544_info[hw_id].get_jitter_usec();
diff --git a/src/main_dpdk.cpp b/src/main_dpdk.cpp
index 467b0cad..4b2655a3 100644
--- a/src/main_dpdk.cpp
+++ b/src/main_dpdk.cpp
@@ -2093,7 +2093,7 @@ int CCoreEthIFStateless::send_node(CGenNode * no) {
}
if (unlikely(node_sl->is_stat_needed())) {
- return send_node_flow_stat(m, node_sl, lp_port, lp_stats, node_sl->get_cache_mbuf() ? true:false);
+ return send_node_flow_stat(m, node_sl, lp_port, lp_stats, (node_sl->get_cache_mbuf() || node_sl->is_cache_mbuf_array())? true:false);
} else {
send_pkt(lp_port,m,lp_stats);
}
diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp
index 763bf3e2..21334363 100644
--- a/src/stateless/dp/trex_stateless_dp_core.cpp
+++ b/src/stateless/dp/trex_stateless_dp_core.cpp
@@ -235,6 +235,9 @@ rte_mbuf_t * CGenNodeStateless::alloc_flow_stat_mbuf(rte_mbuf_t *m, struct flow_
rte_pktmbuf_attach(m_ret, m);
rte_pktmbuf_trim(m_ret, sizeof(struct flow_stat_payload_header));
utl_rte_pktmbuf_add_after2(m_ret, m_lat);
+ // ref count was updated when we took the (const) mbuf, and again in rte_pktmbuf_attach
+ // so need do decrease now, to avoid leak.
+ rte_pktmbuf_refcnt_update(m, -1);
return m_ret;
} else {
// Short packet. Just copy all bytes.