// We allow sending only from first core of each port. This is serious internal bug otherwise.
assert(lp_port->m_tx_queue_id_lat != INVALID_Q_ID);
- TrexStatelessCaptureMngr::getInstance().handle_pkt_tx(m, lp_port->m_port->get_port_id());
-
int ret = lp_port->m_port->tx_burst(lp_port->m_tx_queue_id_lat, &m, 1);
#ifdef DELAY_IF_NEEDED
}
}
-int CCoreEthIFStateless::send_node(CGenNode *no) {
- return send_node_common<false>(no);
+int CCoreEthIFStateless::send_node(CGenNode *node) {
+ return send_node_common<false>(node);
}
-int CCoreEthIFStateless::send_node_service_mode(CGenNode *no) {
- return send_node_common<true>(no);
+int CCoreEthIFStateless::send_node_service_mode(CGenNode *node) {
+ return send_node_common<true>(node);
}
+/**
+ * this is the common function and it is templated
+ * for two compiler evaluation for performance
+ *
+ */
template <bool SERVICE_MODE>
-int CCoreEthIFStateless::send_node_common(CGenNode *no) {
- CGenNodeStateless * node_sl = (CGenNodeStateless *) no;
+int CCoreEthIFStateless::send_node_common(CGenNode *node) {
+ CGenNodeStateless * node_sl = (CGenNodeStateless *) node;
pkt_dir_t dir = (pkt_dir_t)node_sl->get_mbuf_cache_dir();
CCorePerPort *lp_port = &m_ports[dir];
CVirtualIFPerSideStats *lp_stats = &m_stats[dir];
+ /* generate packet (can never fail) */
rte_mbuf_t *m = generate_node_pkt(node_sl);
/* template boolean - this will be removed at compile time */
TrexStatelessCaptureMngr::getInstance().handle_pkt_tx(m, lp_port->m_port->get_port_id());
}
+ /* send */
return send_node_packet(node_sl, m, lp_port, lp_stats);
}
return pcap_node->get_pkt();
}
+ /* unhandled case of slow path node */
+ assert(0);
return (NULL);
}
#include "trex_streams_compiler.h"
#include "mbuf.h"
-
-class DPCoreWrapper : public CVirtualIF {
+/**
+ * a wrapper for service mode
+ * it will move the fast send_node virtual call
+ * to send_node_service_mode which does capturing
+ *
+ */
+class ServiceModeWrapper : public CVirtualIF {
public:
-
- DPCoreWrapper() {
+
+ ServiceModeWrapper() {
m_wrapped = nullptr;
}
m_core = NULL;
m_duration = -1;
m_is_service_mode = NULL;
- m_wrapper = new DPCoreWrapper();
+ m_wrapper = new ServiceModeWrapper();
}
TrexStatelessDpCore::~TrexStatelessDpCore() {