tx_capture - code review
authorimarom <[email protected]>
Thu, 16 Feb 2017 09:38:23 +0000 (11:38 +0200)
committerimarom <[email protected]>
Thu, 16 Feb 2017 13:20:24 +0000 (15:20 +0200)
Signed-off-by: imarom <[email protected]>
src/main_dpdk.cpp
src/stateless/cp/trex_stateless_port.cpp
src/stateless/dp/trex_stateless_dp_core.cpp
src/stateless/dp/trex_stateless_dp_core.h
src/stateless/rx/trex_stateless_capture.cpp

index 7371b36..5c9d249 100644 (file)
@@ -2342,8 +2342,6 @@ int CCoreEthIF::send_pkt_lat(CCorePerPort *lp_port, rte_mbuf_t *m, CVirtualIFPer
     // 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
@@ -2474,22 +2472,28 @@ CCoreEthIFStateless::send_node_packet(CGenNodeStateless      *node_sl,
     }
 }
 
-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 */
@@ -2497,6 +2501,7 @@ int CCoreEthIFStateless::send_node_common(CGenNode *no) {
         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);
 }
 
@@ -2512,6 +2517,8 @@ CCoreEthIFStateless::generate_slow_path_node_pkt(CGenNodeStateless *node_sl) {
         return pcap_node->get_pkt();
     }
 
+    /* unhandled case of slow path node */
+    assert(0);
     return (NULL);
 }
 
index 598577c..423cd44 100644 (file)
@@ -1001,7 +1001,7 @@ TrexStatelessPort::set_service_mode(bool enabled) {
         assert(0);
     }
     
-    /* update the dp cores */
+    /* update the all the relevant dp cores to move to service mode */
     TrexStatelessDpServiceMode *dp_msg = new TrexStatelessDpServiceMode(m_port_id, enabled);
     send_message_to_all_dp(dp_msg);
 }
index 56184ae..b6aa15b 100644 (file)
@@ -27,11 +27,16 @@ limitations under the License.
 #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;
     }
     
@@ -644,7 +649,7 @@ TrexStatelessDpCore::TrexStatelessDpCore() {
     m_core            = NULL;
     m_duration        = -1;
     m_is_service_mode = NULL;
-    m_wrapper         = new DPCoreWrapper();
+    m_wrapper         = new ServiceModeWrapper();
 }
 
 TrexStatelessDpCore::~TrexStatelessDpCore() {
index 9312890..21a5a66 100644 (file)
@@ -34,7 +34,7 @@ class CGenNodeStateless;
 class TrexStreamsCompiledObj;
 class TrexStream;
 class CGenNodePCAP;
-class DPCoreWrapper;
+class ServiceModeWrapper;
 
 class CDpOneStream  {
 public:
@@ -340,7 +340,7 @@ private:
 
     double                 m_duration;
     
-    DPCoreWrapper          *m_wrapper;
+    ServiceModeWrapper    *m_wrapper;
     bool                   m_is_service_mode;
 };
 
index 3b0273a..bbdb8f6 100644 (file)
@@ -269,7 +269,9 @@ TrexStatelessCaptureMngr::reset() {
     }
 }
 
+/* define this macro to stress test the critical section */
 //#define STRESS_TEST
+
 void 
 TrexStatelessCaptureMngr::handle_pkt_slow_path(const rte_mbuf_t *m, int port, TrexPkt::origin_e origin) {