diff options
Diffstat (limited to 'src/stateless')
-rw-r--r-- | src/stateless/rx/trex_stateless_rx_core.cpp | 25 | ||||
-rw-r--r-- | src/stateless/rx/trex_stateless_rx_core.h | 1 |
2 files changed, 26 insertions, 0 deletions
diff --git a/src/stateless/rx/trex_stateless_rx_core.cpp b/src/stateless/rx/trex_stateless_rx_core.cpp index 929ad7fa..42889f0a 100644 --- a/src/stateless/rx/trex_stateless_rx_core.cpp +++ b/src/stateless/rx/trex_stateless_rx_core.cpp @@ -55,6 +55,7 @@ void CRxCoreStateless::idle_state_loop() { int counter = 0; while (m_state == STATE_IDLE) { + flush_rx(); bool had_msg = periodic_check_for_cp_messages(); if (had_msg) { counter = 0; @@ -162,6 +163,30 @@ void CRxCoreStateless::try_rx_queues() { } } +// exactly the same as try_rx, without the handle_rx_pkt +// purpose is to flush rx queues when core is in idle state +void CRxCoreStateless::flush_rx() { + rte_mbuf_t * rx_pkts[64]; + int i, total_pkts = 0; + for (i = 0; i < m_max_ports; i++) { + CLatencyManagerPerPort * lp = &m_ports[i]; + rte_mbuf_t * m; + m_cpu_dp_u.start_work(); + /* try to read 64 packets clean up the queue */ + uint16_t cnt_p = lp->m_io->rx_burst(rx_pkts, 64); + total_pkts += cnt_p; + if (cnt_p) { + int j; + for (j = 0; j < cnt_p; j++) { + m = rx_pkts[j]; + rte_pktmbuf_free(m); + } + /* commit only if there was work to do ! */ + m_cpu_dp_u.commit(); + }/* if work */ + }// all ports +} + int CRxCoreStateless::try_rx() { rte_mbuf_t * rx_pkts[64]; int i, total_pkts = 0; diff --git a/src/stateless/rx/trex_stateless_rx_core.h b/src/stateless/rx/trex_stateless_rx_core.h index 5ab12f4e..81eca38a 100644 --- a/src/stateless/rx/trex_stateless_rx_core.h +++ b/src/stateless/rx/trex_stateless_rx_core.h @@ -62,6 +62,7 @@ class CRxCoreStateless { void idle_state_loop(); void handle_rx_pkt(CLatencyManagerPerPort * lp, rte_mbuf_t * m); void handle_rx_queue_msgs(uint8_t thread_id, CNodeRing * r); + void flush_rx(); int try_rx(); void try_rx_queues(); bool is_flow_stat_id(uint16_t id); |