changing "latency" to "rx" + rx core options logic fix
authorIdo Barnea <[email protected]>
Thu, 3 Mar 2016 09:40:57 +0000 (11:40 +0200)
committerIdo Barnea <[email protected]>
Thu, 3 Mar 2016 09:40:57 +0000 (11:40 +0200)
indentation fix, whitespace cleanup

src/bp_gtest.cpp
src/bp_sim.cpp
src/bp_sim.h
src/latency.cpp
src/latency.h
src/main_dpdk.cpp
src/platform_cfg.cpp
src/platform_cfg.h
src/rx_check.cpp

index e312abc..3189e88 100755 (executable)
@@ -877,11 +877,11 @@ public:
 TEST_F(basic, latency3) {
     CLatencyManager mg;
     CLatencyManagerCfg  cfg;
-    CDummyLatencyHWBase dports[MAX_LATENCY_PORTS];
+    CDummyLatencyHWBase dports[TREX_MAX_PORTS];
     cfg.m_cps =10;
     cfg.m_max_ports=4;
     int i;
-    for (i=0; i<MAX_LATENCY_PORTS; i++) {
+    for (i = 0; i < TREX_MAX_PORTS; i++) {
         dports[i].m_port_id=i;
         cfg.m_ports[i] = &dports[i];
     }
@@ -2179,7 +2179,7 @@ TEST_F(rx_check_system, rx_system1) {
     m_rxcs.lpVf=&m_rx_check;
     CParserOption * po =&CGlobalInfo::m_options;
 
-    po->m_rx_check_sampe=2; /* sample rate */
+    po->m_rx_check_sample=2; /* sample rate */
     po->m_duration=100;
     po->cfg_file ="cap2/dns.yaml";
 
@@ -2197,7 +2197,7 @@ TEST_F(rx_check_system, rx_system1_dns) {
     m_rxcs.lpVf=&m_rx_check;
     CParserOption * po =&CGlobalInfo::m_options;
 
-    po->m_rx_check_sampe=1; /* sample rate */
+    po->m_rx_check_sample=1; /* sample rate */
     po->m_duration=1;
     po->cfg_file ="cap2/dns.yaml";
     m_rx_check.m_store_pcfg=true;
@@ -2221,7 +2221,7 @@ TEST_F(rx_check_system, rx_system1_ipv6) {
     CParserOption * po =&CGlobalInfo::m_options;
     po->preview.set_ipv6_mode_enable(true);
 
-    po->m_rx_check_sampe=4; /* sample rate */
+    po->m_rx_check_sample=4; /* sample rate */
     po->m_duration=100;
     po->cfg_file ="cap2/dns.yaml";
 
@@ -2242,7 +2242,7 @@ TEST_F(rx_check_system, rx_system1_dns_ipv6) {
     CParserOption * po =&CGlobalInfo::m_options;
 
     po->preview.set_ipv6_mode_enable(true);
-    po->m_rx_check_sampe=1; /* sample rate */
+    po->m_rx_check_sample=1; /* sample rate */
     po->m_duration=1;
     po->cfg_file ="cap2/dns.yaml";
     m_rx_check.m_store_pcfg=true;
@@ -2265,7 +2265,7 @@ TEST_F(rx_check_system, rx_system2_plugin_one_dir) {
     m_rxcs.lpVf=&m_rx_check;
     CParserOption * po =&CGlobalInfo::m_options;
 
-    po->m_rx_check_sampe=2; /* sample rate */
+    po->m_rx_check_sample=2; /* sample rate */
     po->m_duration=100;
     po->cfg_file ="cap2/rtsp_short1.yaml";
 
@@ -2283,7 +2283,7 @@ TEST_F(rx_check_system, rx_system2_plugin) {
     m_rxcs.lpVf=&m_rx_check;
     CParserOption * po =&CGlobalInfo::m_options;
 
-    po->m_rx_check_sampe=1; /* sample rate */
+    po->m_rx_check_sample=1; /* sample rate */
     po->m_duration=1;
     po->cfg_file ="cap2/rtsp_short1.yaml";
     m_rx_check.m_store_pcfg=true;
@@ -2308,7 +2308,7 @@ TEST_F(rx_check_system, rx_system2_plugin_ipv6) {
     CParserOption * po =&CGlobalInfo::m_options;
 
     po->preview.set_ipv6_mode_enable(true);
-    po->m_rx_check_sampe=1; /* sample rate */
+    po->m_rx_check_sample=1; /* sample rate */
     po->m_duration=1;
     po->cfg_file ="cap2/rtsp_short1.yaml";
     m_rx_check.m_store_pcfg=true;
@@ -2331,7 +2331,7 @@ TEST_F(rx_check_system, rx_system2_plugin_two_dir) {
     m_rxcs.lpVf=&m_rx_check;
     CParserOption * po =&CGlobalInfo::m_options;
 
-    po->m_rx_check_sampe=2; /* sample rate */
+    po->m_rx_check_sample=2; /* sample rate */
     po->m_duration=100;
     po->cfg_file ="cap2/rtsp_short1_slow.yaml";
     m_rx_check.m_one_dir=false;
@@ -2349,7 +2349,7 @@ TEST_F(rx_check_system, rx_system2_plugin_two_dir_2) {
     m_rxcs.lpVf=&m_rx_check;
     CParserOption * po =&CGlobalInfo::m_options;
 
-    po->m_rx_check_sampe=2; /* sample rate */
+    po->m_rx_check_sample=2; /* sample rate */
     po->m_duration=100;
     po->cfg_file ="cap2/rtsp_short1.yaml";
     m_rx_check.m_one_dir=false;
@@ -2367,7 +2367,7 @@ TEST_F(rx_check_system, rx_system_two_dir) {
     m_rxcs.lpVf=&m_rx_check;
     CParserOption * po =&CGlobalInfo::m_options;
 
-    po->m_rx_check_sampe=2; /* sample rate */
+    po->m_rx_check_sample=2; /* sample rate */
     po->m_duration=100;
     po->cfg_file ="cap2/dns.yaml";
     m_rx_check.m_one_dir=false;
@@ -2386,7 +2386,7 @@ TEST_F(rx_check_system, rx_json) {
     m_rxcs.lpVf=&m_rx_check;
     CParserOption * po =&CGlobalInfo::m_options;
 
-    po->m_rx_check_sampe=2; /* sample rate */
+    po->m_rx_check_sample=2; /* sample rate */
     po->m_duration=100;
     po->cfg_file ="cap2/dns.yaml";
 
index 88e2c3a..6ea40be 100755 (executable)
@@ -120,8 +120,8 @@ socket_id_t CPlatformSocketInfoNoConfig::port_to_socket(port_id_t port){
 }
 
 
-void CPlatformSocketInfoNoConfig::set_latency_thread_is_enabled(bool enable){
-    m_latency_is_enabled = enable;
+void CPlatformSocketInfoNoConfig::set_rx_thread_is_enabled(bool enable) {
+    m_rx_is_enabled = enable;
 }
 
 void CPlatformSocketInfoNoConfig::set_number_of_dual_ports(uint8_t num_dual_ports){
@@ -141,7 +141,7 @@ bool CPlatformSocketInfoNoConfig::sanity_check(){
 uint64_t CPlatformSocketInfoNoConfig::get_cores_mask(){
 
     uint32_t cores_number = m_threads_per_dual_if*m_dual_if;
-    if ( m_latency_is_enabled ) {
+    if ( m_rx_is_enabled ) {
         cores_number +=   2;
     }else{
         cores_number += 1; /* only MASTER*/
@@ -170,7 +170,7 @@ bool CPlatformSocketInfoNoConfig::thread_phy_is_master(physical_thread_id_t  phy
     return (phy_id==0);
 }
 
-bool CPlatformSocketInfoNoConfig::thread_phy_is_latency(physical_thread_id_t  phy_id){
+bool CPlatformSocketInfoNoConfig::thread_phy_is_rx(physical_thread_id_t  phy_id){
     return (phy_id==(m_threads_per_dual_if*m_dual_if+1));
 }
 
@@ -257,8 +257,8 @@ bool CPlatformSocketInfoConfig::init(){
         exit(1);
     }
 
-    if ( m_thread_phy_to_virtual[m_platform->m_latency_thread] ){
-        printf("ERROR physical latency thread %d already defined \n",m_platform->m_latency_thread);
+    if ( m_thread_phy_to_virtual[m_platform->m_rx_thread] ){
+        printf("ERROR physical latency thread %d already defined \n",m_platform->m_rx_thread);
         exit(1);
     }
 
@@ -286,7 +286,7 @@ void CPlatformSocketInfoConfig::dump(FILE *fd){
 
     fprintf(fd," ports_sockets : %d \n",max_num_active_sockets());
 
-    for (i=0; i<(MAX_LATENCY_PORTS); i++) {
+    for (i = 0; i <  TREX_MAX_PORTS; i++) {
         fprintf(fd,"%d,",port_to_socket(i));
     }
     fprintf(fd,"\n");
@@ -314,14 +314,14 @@ void CPlatformSocketInfoConfig::reset(){
     for (i=0; i<MAX_THREADS_SUPPORTED; i++) {
         m_thread_phy_to_virtual[i]=0;
     }
-    for (i=0; i<(MAX_LATENCY_PORTS>>1); i++) {
+    for (i = 0; i < TREX_MAX_PORTS >> 1; i++) {
         m_socket_per_dual_if[i]=0;
     }
 
     m_num_dual_if=0;
 
     m_threads_per_dual_if=0;
-    m_latency_is_enabled=false;
+    m_rx_is_enabled=false;
     m_max_threads_per_dual_if=0;
 }
 
@@ -343,8 +343,8 @@ socket_id_t CPlatformSocketInfoConfig::port_to_socket(port_id_t port){
     return ( m_socket_per_dual_if[(port>>1)]);
 }
 
-void CPlatformSocketInfoConfig::set_latency_thread_is_enabled(bool enable){
-    m_latency_is_enabled =enable;
+void CPlatformSocketInfoConfig::set_rx_thread_is_enabled(bool enable){
+    m_rx_is_enabled =enable;
 }
 
 void CPlatformSocketInfoConfig::set_number_of_dual_ports(uint8_t num_dual_ports){
@@ -376,9 +376,9 @@ uint64_t CPlatformSocketInfoConfig::get_cores_mask(){
 
     mask |=(1<<m_platform->m_master_thread);
     assert(m_platform->m_master_thread<64);
-    if (m_latency_is_enabled) {
-        mask |=(1<<m_platform->m_latency_thread);
-        assert(m_platform->m_latency_thread<64);
+    if (m_rx_is_enabled) {
+        mask |=(1<<m_platform->m_rx_thread);
+        assert(m_platform->m_rx_thread<64);
     }
     return (mask);
 }
@@ -395,8 +395,8 @@ bool CPlatformSocketInfoConfig::thread_phy_is_master(physical_thread_id_t  phy_i
     return (m_platform->m_master_thread==phy_id?true:false);
 }
 
-bool CPlatformSocketInfoConfig::thread_phy_is_latency(physical_thread_id_t  phy_id){
-    return (m_platform->m_latency_thread == phy_id?true:false);
+bool CPlatformSocketInfoConfig::thread_phy_is_rx(physical_thread_id_t  phy_id){
+    return (m_platform->m_rx_thread == phy_id?true:false);
 }
 
 
@@ -437,8 +437,8 @@ socket_id_t CPlatformSocketInfo::port_to_socket(port_id_t port){
 }
 
 
-void CPlatformSocketInfo::set_latency_thread_is_enabled(bool enable){
-    m_obj->set_latency_thread_is_enabled(enable);
+void CPlatformSocketInfo::set_rx_thread_is_enabled(bool enable){
+    m_obj->set_rx_thread_is_enabled(enable);
 }
 
 void CPlatformSocketInfo::set_number_of_dual_ports(uint8_t num_dual_ports){
@@ -470,8 +470,8 @@ bool CPlatformSocketInfo::thread_phy_is_master(physical_thread_id_t  phy_id){
     return ( m_obj->thread_phy_is_master(phy_id));
 }
 
-bool CPlatformSocketInfo::thread_phy_is_latency(physical_thread_id_t  phy_id){
-    return ( m_obj->thread_phy_is_latency(phy_id));
+bool CPlatformSocketInfo::thread_phy_is_rx(physical_thread_id_t  phy_id) {
+    return ( m_obj->thread_phy_is_rx(phy_id));
 }
 
 void CPlatformSocketInfo::dump(FILE *fd){
@@ -3930,9 +3930,9 @@ void CFlowGenListPerThread::terminate_nat_flows(CGenNode *p){
 }
 
 
-void CFlowGenListPerThread::handel_latecy_pkt_msg(CGenNodeLatencyPktInfo * msg){
+void CFlowGenListPerThread::handle_latency_pkt_msg(CGenNodeLatencyPktInfo * msg){
     /* send the packet */
-    #ifdef LATENCY_QUEUE_TRACE_
+    #ifdef RX_QUEUE_TRACE_
     printf(" latency  msg dir %d\n",msg->m_dir);
     struct rte_mbuf * m;
     m=msg->m_pkt;
@@ -3950,7 +3950,7 @@ void CFlowGenListPerThread::handel_latecy_pkt_msg(CGenNodeLatencyPktInfo * msg){
 }
 
 
-void CFlowGenListPerThread::handel_nat_msg(CGenNodeNatInfo * msg){
+void CFlowGenListPerThread::handle_nat_msg(CGenNodeNatInfo * msg){
     int i;
     for (i=0; i<msg->m_cnt; i++) {
         CNatFlowInfo * nat_msg=&msg->m_data[i];
@@ -4010,11 +4010,11 @@ void CFlowGenListPerThread::check_msgs(void) {
         uint8_t   msg_type =  msg->m_msg_type;
         switch (msg_type ) {
         case CGenNodeMsgBase::NAT_FIRST:
-            handel_nat_msg((CGenNodeNatInfo * )msg);
+            handle_nat_msg((CGenNodeNatInfo * )msg);
             break;
 
         case CGenNodeMsgBase::LATENCY_PKT:
-            handel_latecy_pkt_msg((CGenNodeLatencyPktInfo *) msg);
+            handle_latency_pkt_msg((CGenNodeLatencyPktInfo *) msg);
             break;
 
         default:
@@ -4525,7 +4525,7 @@ void CParserOption::dump(FILE *fd){
 
 
     int i;
-    for (i=0; i<MAX_LATENCY_PORTS; i++) {
+    for (i = 0; i < TREX_MAX_PORTS; i++) {
         fprintf(fd," port : %d dst:",i);
         CMacAddrCfg * lp=&m_mac_addr[i];
         dump_mac_addr(fd,lp->u.m_mac.dest);
index 68d74b9..37ed785 100755 (executable)
@@ -71,8 +71,6 @@ usec_to_sec(double usec) {
 
 #define FORCE_NO_INLINE __attribute__ ((noinline))
 
-#define MAX_LATENCY_PORTS TREX_MAX_PORTS
-
 /* IP address, last 32-bits of IPv6 remaps IPv4 */
 typedef struct {
     uint16_t v6[6];  /* First 96-bits of IPv6 */
@@ -738,7 +736,7 @@ public:
         m_expected_portd = 4; /* should be at least the number of ports found in the system but could be less */
         m_vlan_port[0]=100;
         m_vlan_port[1]=100;
-               m_rx_check_sampe=0;
+               m_rx_check_sample=0;
         m_rx_check_hops = 0;
         m_io_mode=1;
         m_run_flags=0;
@@ -746,6 +744,7 @@ public:
         m_mac_splitter=0;
         m_run_mode = RUN_MODE_INVALID;
         m_l_pkt_mode = 0;
+        m_rx_thread_enabled = false;
     }
 
 
@@ -760,7 +759,7 @@ public:
     uint32_t        m_latency_rate; /* pkt/sec for each thread/port zero disable */
     uint32_t        m_latency_mask;
     uint32_t        m_latency_prev;
-    uint16_t           m_rx_check_sampe; /* the sample rate of flows */
+    uint16_t           m_rx_check_sample; /* the sample rate of flows */
     uint16_t        m_rx_check_hops;
     uint16_t        m_zmq_port;
     uint16_t        m_telnet_port;
@@ -771,6 +770,7 @@ public:
     uint8_t         m_l_pkt_mode;
     uint8_t         m_learn_mode;
     uint16_t        m_debug_pkt_proto;
+    bool            m_rx_thread_enabled;
     trex_run_mode_e    m_run_mode;
 
 
@@ -783,7 +783,7 @@ public:
     std::string        prefix;
 
                                  
-    CMacAddrCfg     m_mac_addr[MAX_LATENCY_PORTS];
+    CMacAddrCfg     m_mac_addr[TREX_MAX_PORTS];
 
     uint8_t *       get_src_mac_addr(int if_index){
         return (m_mac_addr[if_index].u.m_mac.src);
@@ -805,17 +805,19 @@ public:
     uint32_t get_number_of_dp_cores_needed() {
         return ( (m_expected_portd>>1)   * preview.getCores());
     }
-    bool is_latency_disabled(){
-        return ( m_latency_rate == 0 ?true:false);
-    }
-
     bool is_stateless(){
         return (m_run_mode == RUN_MODE_INTERACTIVE ?true:false);
     }
-
-    bool is_latency_enabled(){
-        return ( !is_latency_disabled() );
+    bool is_latency_enabled() {
+        return ( (m_latency_rate == 0) ? false : true);
     }
+    bool is_rx_enabled() {
+        return m_rx_thread_enabled;
+    }
+    void set_rx_enabled() {
+        m_rx_thread_enabled = true;
+    }
+
     inline void set_rxcheck_const_ts(){
         m_run_flags |= RUN_FLAGS_RXCHECK_CONST_TS;
     }
@@ -886,7 +888,7 @@ DEFAULT:
     v5        v6
     v7        v8       
        
-    latency is v9          
+    rx is v9          
 
   */  
 
@@ -915,7 +917,7 @@ public:
 public:
     /* this is from CLI, number of thread per dual port */
     virtual void set_number_of_threads_per_ports(uint8_t num_threads)=0;
-    virtual void set_latency_thread_is_enabled(bool enable)=0;
+    virtual void set_rx_thread_is_enabled(bool enable)=0;
     virtual void set_number_of_dual_ports(uint8_t num_dual_ports)=0;
 
 
@@ -931,7 +933,7 @@ public:
     virtual physical_thread_id_t thread_virt_to_phy(virtual_thread_id_t virt_id)=0;
 
     virtual bool thread_phy_is_master(physical_thread_id_t  phy_id)=0;
-    virtual bool thread_phy_is_latency(physical_thread_id_t  phy_id)=0;
+    virtual bool thread_phy_is_rx(physical_thread_id_t  phy_id)=0;
 
     virtual void dump(FILE *fd)=0;
 };
@@ -942,7 +944,7 @@ public:
     CPlatformSocketInfoNoConfig(){
         m_dual_if=0;
         m_threads_per_dual_if=0;
-        m_latency_is_enabled=false;
+        m_rx_is_enabled=false;
     }
 
     /* is socket enabled */
@@ -958,7 +960,7 @@ public:
 public:
     /* this is from CLI, number of thread per dual port */
     void set_number_of_threads_per_ports(uint8_t num_threads);
-    void set_latency_thread_is_enabled(bool enable);
+    void set_rx_thread_is_enabled(bool enable);
     void set_number_of_dual_ports(uint8_t num_dual_ports);
 
     bool sanity_check();
@@ -973,14 +975,14 @@ public:
     physical_thread_id_t thread_virt_to_phy(virtual_thread_id_t virt_id);
 
     bool thread_phy_is_master(physical_thread_id_t  phy_id);
-    bool thread_phy_is_latency(physical_thread_id_t  phy_id);
+    bool thread_phy_is_rx(physical_thread_id_t  phy_id);
 
     virtual void dump(FILE *fd);
 
 private:
     uint32_t                 m_dual_if;
     uint32_t                 m_threads_per_dual_if;
-    bool                     m_latency_is_enabled;
+    bool                     m_rx_is_enabled;
 };
 
 
@@ -1004,7 +1006,7 @@ public:
 public:
     /* this is from CLI, number of thread per dual port */
     void set_number_of_threads_per_ports(uint8_t num_threads);
-    void set_latency_thread_is_enabled(bool enable);
+    void set_rx_thread_is_enabled(bool enable);
     void set_number_of_dual_ports(uint8_t num_dual_ports);
 
     bool sanity_check();
@@ -1019,7 +1021,7 @@ public:
     physical_thread_id_t thread_virt_to_phy(virtual_thread_id_t virt_id);
 
     bool thread_phy_is_master(physical_thread_id_t  phy_id);
-    bool thread_phy_is_latency(physical_thread_id_t  phy_id);
+    bool thread_phy_is_rx(physical_thread_id_t  phy_id);
 
 public:
     virtual void dump(FILE *fd);
@@ -1030,13 +1032,13 @@ private:
 private:
     bool                     m_sockets_enable[MAX_SOCKETS_SUPPORTED];
     uint32_t                 m_sockets_enabled;
-    socket_id_t              m_socket_per_dual_if[(MAX_LATENCY_PORTS>>1)];
+    socket_id_t              m_socket_per_dual_if[(TREX_MAX_PORTS >> 1)];
     
     uint32_t                 m_max_threads_per_dual_if;
 
     uint32_t                 m_num_dual_if;
     uint32_t                 m_threads_per_dual_if;
-    bool                     m_latency_is_enabled;
+    bool                     m_rx_is_enabled;
     uint8_t                  m_thread_virt_to_phy[MAX_THREADS_SUPPORTED];
     uint8_t                  m_thread_phy_to_virtual[MAX_THREADS_SUPPORTED];
 
@@ -1067,7 +1069,7 @@ public:
 public:
     /* this is from CLI, number of thread per dual port */
     void set_number_of_threads_per_ports(uint8_t num_threads);
-    void set_latency_thread_is_enabled(bool enable);
+    void set_rx_thread_is_enabled(bool enable);
     void set_number_of_dual_ports(uint8_t num_dual_ports);
 
 
@@ -1083,7 +1085,7 @@ public:
     physical_thread_id_t thread_virt_to_phy(virtual_thread_id_t virt_id);
 
     bool thread_phy_is_master(physical_thread_id_t  phy_id);
-    bool thread_phy_is_latency(physical_thread_id_t  phy_id);
+    bool thread_phy_is_rx(physical_thread_id_t  phy_id);
 
     void dump(FILE *fd);
 
@@ -1244,7 +1246,7 @@ static inline int get_is_rx_check_mode(){
     return (CGlobalInfo::m_options.preview.get_is_rx_check_enable() ?1:0);
 }
 
-static inline bool get_is_rx_filter_enable(){
+static inline bool get_is_rx_filter_enable(){//???
     uint32_t latency_rate=CGlobalInfo::m_options.m_latency_rate;
     return ( ( get_is_rx_check_mode() || CGlobalInfo::is_learn_mode() || latency_rate != 0) ?true:false );
 }
@@ -2900,7 +2902,7 @@ inline void CFlowPktInfo::update_pkt_info(char *p,
                    }
                }
             }
-            /* in call cases update the ip using the outside ip */
+            /* in all cases update the ip using the outside ip */
 
             if ( m_pkt_indication.m_desc.IsInitSide()  ) {
 #ifdef NAT_TRACE_
@@ -3577,8 +3579,8 @@ public:
 private:
     void check_msgs(void);
 
-    void handel_nat_msg(CGenNodeNatInfo * msg);
-    void handel_latecy_pkt_msg(CGenNodeLatencyPktInfo * msg);
+    void handle_nat_msg(CGenNodeNatInfo * msg);
+    void handle_latency_pkt_msg(CGenNodeLatencyPktInfo * msg);
 
     void terminate_nat_flows(CGenNode *node);
 
@@ -3651,8 +3653,8 @@ private:
     CGenNodeDeferPort     *          m_tcp_dpc;
     CGenNodeDeferPort     *          m_udp_dpc;
 
-    CNodeRing *                      m_ring_from_rx; /* ring latency thread -> dp */
-    CNodeRing *                      m_ring_to_rx;   /* ring dp -> latency thread */
+    CNodeRing *                      m_ring_from_rx; /* ring rx thread -> dp */
+    CNodeRing *                      m_ring_to_rx;   /* ring dp -> rx thread */
 
     flow_id_node_t                   m_flow_id_to_node_lookup;
 
@@ -3780,8 +3782,8 @@ inline void CCapFileFlowInfo::generate_flow(CTupleTemplateGeneratorSmart   * tup
     }
 
     if ( unlikely(  get_is_rx_check_mode()) ) {
-        if  ( (CGlobalInfo::m_options.m_rx_check_sampe == 1 ) ||
-            ( ( rte_rand() % CGlobalInfo::m_options.m_rx_check_sampe ) == 1 )){
+        if  ( (CGlobalInfo::m_options.m_rx_check_sample == 1 ) ||
+            ( ( rte_rand() % CGlobalInfo::m_options.m_rx_check_sample ) == 1 )){
            if (unlikely(!node->is_repeat_flow() )) {
                node->set_rx_check();
            }
index fb3c6aa..d57e97c 100644 (file)
@@ -231,11 +231,9 @@ void CCPortLatency::update_packet(rte_mbuf_t * m, int port_id){
 }
 
 
-void CCPortLatency::DumpShortHeader(FILE *fd){
-    
-
-    fprintf(fd," if|   tx_ok , rx_ok  , rx   ,error,    average   ,   max         , Jitter ,  max window \n");
-       fprintf(fd,"   |         ,        , check,     , latency(usec),latency (usec) ,(usec)  ,             \n");
+void CCPortLatency::DumpShortHeader(FILE *fd){   
+    fprintf(fd," if|   tx_ok , rx_ok  , rx check ,error,       latency (usec) ,    Jitter          max window \n");
+       fprintf(fd,"   |         ,        ,          ,     ,   average   ,   max  ,    (usec)                     \n");
     fprintf(fd," ---------------------------------------------------------------------------------------------------------------- \n");
 }
 
@@ -269,7 +267,7 @@ void CCPortLatency::dump_json(std::string & json ){
 void CCPortLatency::DumpShort(FILE *fd){
 
 //     m_hist.update(); <- moved to CLatencyManager::update()
-    fprintf(fd,"%8lu,%8lu,%10lu,%4lu,",                          
+    fprintf(fd,"%8lu,%8lu,%10lu,%5lu,",                          
                     m_tx_pkt_ok,
                     m_pkt_ok,
                     m_rx_check,
@@ -530,7 +528,7 @@ bool CLatencyManager::Create(CLatencyManagerCfg * cfg){
     }
     
     m_max_ports=cfg->m_max_ports;
-    assert (m_max_ports<=MAX_LATENCY_PORTS);
+    assert (m_max_ports <= TREX_MAX_PORTS);
     assert ((m_max_ports%2)==0);
     m_port_mask =0xffffffff;
     m_do_stop =false;
index cbb67db..1f8ef5c 100644 (file)
@@ -273,7 +273,7 @@ public:
     }
     uint32_t             m_max_ports;
     double               m_cps;// CPS
-    CPortLatencyHWBase * m_ports[MAX_LATENCY_PORTS];
+    CPortLatencyHWBase * m_ports[TREX_MAX_PORTS];
     ipaddr_t             m_client_ip;
     ipaddr_t             m_server_ip;
     uint32_t             m_dual_port_mask;
@@ -387,7 +387,7 @@ private:
      pqueue_t                m_p_queue; /* priorty queue */
      bool                    m_is_active;
      CLatencyPktInfo         m_pkt_gen;
-     CLatencyManagerPerPort  m_ports[MAX_LATENCY_PORTS];
+     CLatencyManagerPerPort  m_ports[TREX_MAX_PORTS];
      uint64_t                m_d_time; // calc tick betwen sending 
      double                  m_cps;
      double                  m_delta_sec;
index 3404d6b..77e186b 100644 (file)
@@ -1,22 +1,22 @@
 /*
- Hanoh Haim
- Cisco Systems, Inc.
 Hanoh Haim
 Cisco Systems, Inc.
 */
 
 /*
-Copyright (c) 2015-2016 Cisco Systems, Inc.
+  Copyright (c) 2015-2016 Cisco Systems, Inc.
 
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
 
-    http://www.apache.org/licenses/LICENSE-2.0
+  http://www.apache.org/licenses/LICENSE-2.0
 
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
 */
 #include <pwd.h>
 #include <rte_common.h>
@@ -87,8 +87,6 @@ extern "C" {
 #define BP_MAX_PKT      32
 #define MAX_PKT_BURST   32
 
-
-#define BP_MAX_PORTS (MAX_LATENCY_PORTS)
 #define BP_MAX_CORES 32
 #define BP_MAX_TX_QUEUE 16
 #define BP_MASTER_AND_LATENCY 2
@@ -112,8 +110,8 @@ static inline int get_vm_one_queue_enable(){
     return (CGlobalInfo::m_options.preview.get_vm_one_queue_enable() ?1:0);
 }
 
-static inline int get_is_latency_thread_enable(){
-    return (CGlobalInfo::m_options.is_latency_enabled() ?1:0);
+static inline int get_is_rx_thread_enabled() {
+    return (CGlobalInfo::m_options.is_rx_enabled() ?1:0);
 }
 
 struct port_cfg_t;
@@ -183,7 +181,7 @@ public:
     virtual int configure_rx_filter_rules(CPhyEthIF * _if);
     int configure_rx_filter_rules_statefull(CPhyEthIF * _if);
     int configure_rx_filter_rules_stateless(CPhyEthIF * _if);
-    
+
     virtual bool is_hardware_support_drop_queue(){
         return(true);
     }
@@ -217,7 +215,7 @@ public:
     }
 
     virtual void update_global_config_fdir(port_cfg_t * cfg){
-        
+
     }
 
     virtual int get_min_sample_rate(void){
@@ -327,7 +325,7 @@ public:
     virtual int wait_for_stable_link();
     // disabling flow control on 40G using DPDK API causes the interface to malfunction
     bool flow_control_disable_supported(){return false;}
-private:    
+private:
     void add_del_rules(enum rte_filter_op op, uint8_t port_id, uint16_t type, uint8_t ttl, uint16_t ip_id, int queue, uint16_t stat_idx);
     virtual int configure_rx_filter_rules_statfull(CPhyEthIF * _if);
 private:
@@ -366,31 +364,31 @@ public:
 class CTRexExtendedDriverDb {
 public:
 
-   const std::string & get_driver_name() {
-       return m_driver_name;
-   }
+    const std::string & get_driver_name() {
+        return m_driver_name;
+    }
 
-   bool is_driver_exists(std::string name);
+    bool is_driver_exists(std::string name);
 
 
 
-   void set_driver_name(std::string name){
-       m_driver_was_set=true;
-       m_driver_name=name;
-       printf(" set driver name %s \n",name.c_str());
-       m_drv=create_driver(m_driver_name);
-       assert(m_drv);
-   }
+    void set_driver_name(std::string name){
+        m_driver_was_set=true;
+        m_driver_name=name;
+        printf(" set driver name %s \n",name.c_str());
+        m_drv=create_driver(m_driver_name);
+        assert(m_drv);
+    }
 
-   CTRexExtendedDriverBase * get_drv(){
-       if (!m_driver_was_set) {
-           printf(" ERROR too early to use this object !\n");
-           printf(" need to set the right driver \n");
-           assert(0);
-       }
-       assert(m_drv);
-       return (m_drv);
-   }
+    CTRexExtendedDriverBase * get_drv(){
+        if (!m_driver_was_set) {
+            printf(" ERROR too early to use this object !\n");
+            printf(" need to set the right driver \n");
+            assert(0);
+        }
+        assert(m_drv);
+        return (m_drv);
+    }
 
 public:
 
@@ -409,7 +407,7 @@ private:
         register_driver(std::string("rte_vmxnet3_pmd"),CTRexExtendedDriverBase1GVm::create);
         register_driver(std::string("rte_virtio_pmd"),CTRexExtendedDriverBase1GVm::create);
         register_driver(std::string("rte_enic_pmd"),CTRexExtendedDriverBaseVIC::create);
-        
+
 
 
 
@@ -488,49 +486,49 @@ static char global_loglevel_str[20];
 
 // cores =0==1,1*2,2,3,4,5,6
 // An enum for all the option types
-enum { OPT_HELP, 
-    OPT_MODE_BATCH, 
-    OPT_MODE_INTERACTIVE,
-    OPT_NODE_DUMP,  
-    OPT_UT,
-    OPT_FILE_OUT,
-    OPT_REAL_TIME,
-    OPT_CORES,
-    OPT_SINGLE_CORE,
-    OPT_FLIP_CLIENT_SERVER,
-    OPT_FLOW_FLIP_CLIENT_SERVER,
-    OPT_FLOW_FLIP_CLIENT_SERVER_SIDE,
-    OPT_BW_FACTOR,
-    OPT_DURATION,
-    OPT_PLATFORM_FACTOR,
-    OPT_PUB_DISABLE,
-    OPT_LIMT_NUM_OF_PORTS,
-    OPT_PLAT_CFG_FILE,
-
-
-    OPT_LATENCY,
-    OPT_NO_CLEAN_FLOW_CLOSE,
-    OPT_LATENCY_MASK,
-    OPT_ONLY_LATENCY,
-    OPT_1G_MODE,
-    OPT_LATENCY_PREVIEW ,
-    OPT_PCAP,
-       OPT_RX_CHECK,
-    OPT_IO_MODE,
-    OPT_IPV6,
-    OPT_LEARN,
-    OPT_LEARN_MODE,
-    OPT_LEARN_VERIFY,
-    OPT_L_PKT_MODE,
-    OPT_NO_FLOW_CONTROL,
-    OPT_RX_CHECK_HOPS,
-       OPT_MAC_FILE,
-    OPT_NO_KEYBOARD_INPUT,
-       OPT_VLAN,
-    OPT_VIRT_ONE_TX_RX_QUEUE,
-    OPT_PREFIX,
-    OPT_MAC_SPLIT,
-    OPT_SEND_DEBUG_PKT
+enum { OPT_HELP,
+       OPT_MODE_BATCH,
+       OPT_MODE_INTERACTIVE,
+       OPT_NODE_DUMP,
+       OPT_UT,
+       OPT_FILE_OUT,
+       OPT_REAL_TIME,
+       OPT_CORES,
+       OPT_SINGLE_CORE,
+       OPT_FLIP_CLIENT_SERVER,
+       OPT_FLOW_FLIP_CLIENT_SERVER,
+       OPT_FLOW_FLIP_CLIENT_SERVER_SIDE,
+       OPT_BW_FACTOR,
+       OPT_DURATION,
+       OPT_PLATFORM_FACTOR,
+       OPT_PUB_DISABLE,
+       OPT_LIMT_NUM_OF_PORTS,
+       OPT_PLAT_CFG_FILE,
+
+
+       OPT_LATENCY,
+       OPT_NO_CLEAN_FLOW_CLOSE,
+       OPT_LATENCY_MASK,
+       OPT_ONLY_LATENCY,
+       OPT_1G_MODE,
+       OPT_LATENCY_PREVIEW ,
+       OPT_PCAP,
+       OPT_RX_CHECK,
+       OPT_IO_MODE,
+       OPT_IPV6,
+       OPT_LEARN,
+       OPT_LEARN_MODE,
+       OPT_LEARN_VERIFY,
+       OPT_L_PKT_MODE,
+       OPT_NO_FLOW_CONTROL,
+       OPT_RX_CHECK_HOPS,
+       OPT_MAC_FILE,
+       OPT_NO_KEYBOARD_INPUT,
+       OPT_VLAN,
+       OPT_VIRT_ONE_TX_RX_QUEUE,
+       OPT_PREFIX,
+       OPT_MAC_SPLIT,
+       OPT_SEND_DEBUG_PKT
 };
 
 
@@ -540,60 +538,60 @@ enum { OPT_HELP,
    SO_MULTI --   multiple arguments needed
 */
 static CSimpleOpt::SOption parser_options[] =
-{
-    { OPT_HELP,                   "-?",                SO_NONE   },
-    { OPT_HELP,                   "-h",                SO_NONE   },
-    { OPT_HELP,                   "--help",            SO_NONE   },
-    { OPT_UT,                     "--ut",              SO_NONE   },
-    { OPT_MODE_BATCH,             "-f",                SO_REQ_SEP},
-    { OPT_MODE_INTERACTIVE,       "-i",                SO_NONE   },
-    { OPT_PLAT_CFG_FILE,          "--cfg",             SO_REQ_SEP},
-    { OPT_REAL_TIME ,             "-r",                SO_NONE  },
-    { OPT_SINGLE_CORE,            "-s",                SO_NONE  },
-    { OPT_FILE_OUT,               "-o" ,               SO_REQ_SEP},
-    { OPT_FLIP_CLIENT_SERVER,"--flip",SO_NONE  },
-    { OPT_FLOW_FLIP_CLIENT_SERVER,"-p",SO_NONE  },
-    { OPT_FLOW_FLIP_CLIENT_SERVER_SIDE,"-e",SO_NONE  },
-
-    { OPT_NO_CLEAN_FLOW_CLOSE,"--nc",SO_NONE  },
-
-    { OPT_LIMT_NUM_OF_PORTS,"--limit-ports", SO_REQ_SEP },
-    { OPT_CORES     , "-c",         SO_REQ_SEP },
-    { OPT_NODE_DUMP , "-v",         SO_REQ_SEP },
-    { OPT_LATENCY , "-l",         SO_REQ_SEP },
-
-    { OPT_DURATION     , "-d",  SO_REQ_SEP },
-    { OPT_PLATFORM_FACTOR     , "-pm",  SO_REQ_SEP },
-
-    { OPT_PUB_DISABLE     , "-pubd",  SO_NONE },
-
-
-    { OPT_BW_FACTOR     , "-m",  SO_REQ_SEP },
-    { OPT_LATENCY_MASK     , "--lm",  SO_REQ_SEP },
-    { OPT_ONLY_LATENCY, "--lo",  SO_NONE  },
-
-    { OPT_1G_MODE,       "-1g",   SO_NONE   },
-    { OPT_LATENCY_PREVIEW ,       "-k",   SO_REQ_SEP   },
-    { OPT_PCAP,       "--pcap",       SO_NONE   },
-       { OPT_RX_CHECK,   "--rx-check",  SO_REQ_SEP },
-    { OPT_IO_MODE,   "--iom",  SO_REQ_SEP },      
-    { OPT_RX_CHECK_HOPS, "--hops", SO_REQ_SEP },
-    { OPT_IPV6,       "--ipv6",       SO_NONE   },
-    { OPT_LEARN, "--learn",       SO_NONE   },
-    { OPT_LEARN_MODE, "--learn-mode",       SO_REQ_SEP   },
-    { OPT_LEARN_VERIFY, "--learn-verify",       SO_NONE   },
-    { OPT_L_PKT_MODE, "--l-pkt-mode",       SO_REQ_SEP   },
-    { OPT_NO_FLOW_CONTROL, "--no-flow-control-change",       SO_NONE   },
-    { OPT_VLAN,       "--vlan",       SO_NONE   },
-    { OPT_MAC_FILE, "--mac", SO_REQ_SEP }, 
-    { OPT_NO_KEYBOARD_INPUT ,"--no-key", SO_NONE   },
-    { OPT_VIRT_ONE_TX_RX_QUEUE, "--vm-sim", SO_NONE }, 
-    { OPT_PREFIX, "--prefix", SO_REQ_SEP }, 
-    { OPT_MAC_SPLIT, "--mac-spread", SO_REQ_SEP },
-    { OPT_SEND_DEBUG_PKT, "--send-debug-pkt", SO_REQ_SEP },
-
-    SO_END_OF_OPTIONS
-};
+    {
+        { OPT_HELP,                   "-?",                SO_NONE   },
+        { OPT_HELP,                   "-h",                SO_NONE   },
+        { OPT_HELP,                   "--help",            SO_NONE   },
+        { OPT_UT,                     "--ut",              SO_NONE   },
+        { OPT_MODE_BATCH,             "-f",                SO_REQ_SEP},
+        { OPT_MODE_INTERACTIVE,       "-i",                SO_NONE   },
+        { OPT_PLAT_CFG_FILE,          "--cfg",             SO_REQ_SEP},
+        { OPT_REAL_TIME ,             "-r",                SO_NONE  },
+        { OPT_SINGLE_CORE,            "-s",                SO_NONE  },
+        { OPT_FILE_OUT,               "-o" ,               SO_REQ_SEP},
+        { OPT_FLIP_CLIENT_SERVER,"--flip",SO_NONE  },
+        { OPT_FLOW_FLIP_CLIENT_SERVER,"-p",SO_NONE  },
+        { OPT_FLOW_FLIP_CLIENT_SERVER_SIDE,"-e",SO_NONE  },
+
+        { OPT_NO_CLEAN_FLOW_CLOSE,"--nc",SO_NONE  },
+
+        { OPT_LIMT_NUM_OF_PORTS,"--limit-ports", SO_REQ_SEP },
+        { OPT_CORES     , "-c",         SO_REQ_SEP },
+        { OPT_NODE_DUMP , "-v",         SO_REQ_SEP },
+        { OPT_LATENCY , "-l",         SO_REQ_SEP },
+
+        { OPT_DURATION     , "-d",  SO_REQ_SEP },
+        { OPT_PLATFORM_FACTOR     , "-pm",  SO_REQ_SEP },
+
+        { OPT_PUB_DISABLE     , "-pubd",  SO_NONE },
+
+
+        { OPT_BW_FACTOR     , "-m",  SO_REQ_SEP },
+        { OPT_LATENCY_MASK     , "--lm",  SO_REQ_SEP },
+        { OPT_ONLY_LATENCY, "--lo",  SO_NONE  },
+
+        { OPT_1G_MODE,       "-1g",   SO_NONE   },
+        { OPT_LATENCY_PREVIEW ,       "-k",   SO_REQ_SEP   },
+        { OPT_PCAP,       "--pcap",       SO_NONE   },
+        { OPT_RX_CHECK,   "--rx-check",  SO_REQ_SEP },
+        { OPT_IO_MODE,   "--iom",  SO_REQ_SEP },
+        { OPT_RX_CHECK_HOPS, "--hops", SO_REQ_SEP },
+        { OPT_IPV6,       "--ipv6",       SO_NONE   },
+        { OPT_LEARN, "--learn",       SO_NONE   },
+        { OPT_LEARN_MODE, "--learn-mode",       SO_REQ_SEP   },
+        { OPT_LEARN_VERIFY, "--learn-verify",       SO_NONE   },
+        { OPT_L_PKT_MODE, "--l-pkt-mode",       SO_REQ_SEP   },
+        { OPT_NO_FLOW_CONTROL, "--no-flow-control-change",       SO_NONE   },
+        { OPT_VLAN,       "--vlan",       SO_NONE   },
+        { OPT_MAC_FILE, "--mac", SO_REQ_SEP },
+        { OPT_NO_KEYBOARD_INPUT ,"--no-key", SO_NONE   },
+        { OPT_VIRT_ONE_TX_RX_QUEUE, "--vm-sim", SO_NONE },
+        { OPT_PREFIX, "--prefix", SO_REQ_SEP },
+        { OPT_MAC_SPLIT, "--mac-spread", SO_REQ_SEP },
+        { OPT_SEND_DEBUG_PKT, "--send-debug-pkt", SO_REQ_SEP },
+
+        SO_END_OF_OPTIONS
+    };
 
 
 
@@ -603,7 +601,7 @@ static int usage(){
     printf(" Usage: t-rex-64 [MODE] [OPTION] -f cfg.yaml -c cores   \n");
     printf(" \n");
     printf(" \n");
-    
+
     printf(" mode \n\n");
     printf(" -f [file]                  : YAML file  with template configuration \n");
     printf(" -i                         : launch TRex in interactive mode (RPC server)\n");
@@ -658,8 +656,8 @@ static int usage(){
     printf(" --ipv6                     : work in ipv6 mode\n");
     printf(" --learn (deprecated). Replaced by --learn-mode. To get older behaviour, use --learn-mode 2\n");
     printf(" --learn-mode [1-2]         : Work in NAT environments, learn the dynamic NAT translation and ALG  \n");
-       printf("      1    Use TCP ACK in first SYN to pass NAT translation information. Will work only for TCP streams. Initial SYN packet must be present in stream.\n");
-       printf("      2    Add special IP option to pass NAT translation information. Will not work on certain firewalls if they drop packets with IP options\n");
+    printf("      1    Use TCP ACK in first SYN to pass NAT translation information. Will work only for TCP streams. Initial SYN packet must be present in stream.\n");
+    printf("      2    Add special IP option to pass NAT translation information. Will not work on certain firewalls if they drop packets with IP options\n");
     printf(" --learn-verify             : Learn the translation, but intended for verification of the mechanism in cases that NAT does not exist \n");
     printf("  \n");
     printf(" --l-pkt-mode [0-3]         : Set mode for sending latency packets.\n");
@@ -675,9 +673,9 @@ static int usage(){
     printf("   \n");
     printf("  Warning : This program can generate huge-files (TB ) watch out! try this only on local drive \n");
     printf(" \n");
-       printf("  \n");
-       printf(" --rx-check  [sample]       :  enable rx check thread, using this thread we sample flows 1/sample and check order,latency and more  \n");
-       printf("                              this feature consume another thread  \n");
+    printf("  \n");
+    printf(" --rx-check  [sample]       :  enable rx check thread, using this thread we sample flows 1/sample and check order,latency and more  \n");
+    printf("                              this feature consume another thread  \n");
     printf("  \n");
     printf(" --hops [hops]              :  If rx check is enabled, the hop number can be assigned. The default number of hops is 1\n");
     printf(" --iom  [mode]              :  io mode for interactive mode [0- silent, 1- normal , 2- short]   \n");
@@ -688,8 +686,8 @@ static int usage(){
     printf(" --prefix                   : for multi trex, each instance should have a different name \n");
     printf(" --mac-spread               : Spread the destination mac-order by this factor. e.g 2 will generate the traffic to 2 devices DEST-MAC ,DEST-MAC+1  \n");
     printf("                             maximum is up to 128 devices   \n");
-    
-    
+
+
     printf("\n simulation mode : \n");
     printf(" Using this mode you can generate the traffic into a pcap file and learn how trex works \n");
     printf(" With this version you must be SUDO to use this mode ( I know this is not normal )  \n");
@@ -754,21 +752,21 @@ static void parse_err(const std::string &msg) {
 }
 
 static int parse_options(int argc, char *argv[], CParserOption* po, bool first_time ) {
-     CSimpleOpt args(argc, argv, parser_options);
+    CSimpleOpt args(argc, argv, parser_options);
 
-     bool latency_was_set=false;
-     (void)latency_was_set;
+    bool latency_was_set=false;
+    (void)latency_was_set;
 
-     int a=0;
-     int node_dump=0;
+    int a=0;
+    int node_dump=0;
 
-     po->preview.setFileWrite(true);
-     po->preview.setRealTime(true);
-     uint32_t tmp_data;
+    po->preview.setFileWrite(true);
+    po->preview.setRealTime(true);
+    uint32_t tmp_data;
 
-     po->m_run_mode = CParserOption::RUN_MODE_INVALID;
+    po->m_run_mode = CParserOption::RUN_MODE_INVALID;
 
-     while ( args.Next() ){
+    while ( args.Next() ){
         if (args.LastError() == SO_SUCCESS) {
             switch (args.OptionId()) {
 
@@ -776,7 +774,7 @@ static int parse_options(int argc, char *argv[], CParserOption* po, bool first_t
                 parse_err("Supported only in simulation");
                 break;
 
-            case OPT_HELP: 
+            case OPT_HELP:
                 usage();
                 return -1;
 
@@ -825,25 +823,25 @@ static int parse_options(int argc, char *argv[], CParserOption* po, bool first_t
 
             case OPT_LEARN_MODE :
                 sscanf(args.OptionArg(),"%d", &tmp_data);
-               if (! po->is_valid_opt_val(tmp_data, CParserOption::LEARN_MODE_DISABLED, CParserOption::LEARN_MODE_MAX, "--learn-mode")) {
-                   exit(-1);
-               }
+                if (! po->is_valid_opt_val(tmp_data, CParserOption::LEARN_MODE_DISABLED, CParserOption::LEARN_MODE_MAX, "--learn-mode")) {
+                    exit(-1);
+                }
                 po->m_learn_mode = (uint8_t)tmp_data;
                 break;
 
             case OPT_LEARN_VERIFY :
-               // must configure learn_mode for learn verify to work. If different learn mode will be given later, it will be set instead.
-               if (po->m_learn_mode == 0) {
-                   po->m_learn_mode = CParserOption::LEARN_MODE_IP_OPTION;
-               }
+                // must configure learn_mode for learn verify to work. If different learn mode will be given later, it will be set instead.
+                if (po->m_learn_mode == 0) {
+                    po->m_learn_mode = CParserOption::LEARN_MODE_IP_OPTION;
+                }
                 po->preview.set_learn_and_verify_mode_enable(true);
                 break;
 
             case OPT_L_PKT_MODE :
                 sscanf(args.OptionArg(),"%d", &tmp_data);
-               if (! po->is_valid_opt_val(tmp_data, 0, L_PKT_SUBMODE_0_SEQ, "--l-pkt-mode")) {
-                   exit(-1);
-               }
+                if (! po->is_valid_opt_val(tmp_data, 0, L_PKT_SUBMODE_0_SEQ, "--l-pkt-mode")) {
+                    exit(-1);
+                }
                 po->m_l_pkt_mode=(uint8_t)tmp_data;
                 break;
 
@@ -918,7 +916,7 @@ static int parse_options(int argc, char *argv[], CParserOption* po, bool first_t
 
             case OPT_RX_CHECK :
                 sscanf(args.OptionArg(),"%d", &tmp_data);
-                po->m_rx_check_sampe=(uint16_t)tmp_data;
+                po->m_rx_check_sample=(uint16_t)tmp_data;
                 po->preview.set_rx_check_enable(true);
                 break;
             case OPT_RX_CHECK_HOPS :
@@ -956,17 +954,17 @@ static int parse_options(int argc, char *argv[], CParserOption* po, bool first_t
                 return -1;
                 break;
             } // End of switch
-         }// End of IF
+        }// End of IF
         else {
             usage();
             return -1;
         }
-     } // End of while
+    } // End of while
 
 
     if ((po->m_run_mode ==  CParserOption::RUN_MODE_INVALID) ) {
         parse_err("Please provide single run mode (e.g. batch or interactive)");
-     }
+    }
 
     if ( po->m_mac_splitter > 128 ){
         std::stringstream ss;
@@ -979,15 +977,10 @@ static int parse_options(int argc, char *argv[], CParserOption* po, bool first_t
             parse_err("--learn mode is not supported with --ipv6, beacuse there is not such thing NAT66 ( ipv6-ipv6) \n" \
                       "if you think it is important,open a defect \n");
         }
-        if ( po->is_latency_disabled() ){
-            /* set latency thread */
-            po->m_latency_rate =1000;
-        }
     }
 
-    if (po->preview.get_is_rx_check_enable() &&  ( po->is_latency_disabled() ) ) {
-        printf(" rx check must be enabled with latency check. try adding '-l 1000'   \n");
-        return -1;
+    if (po->preview.get_is_rx_check_enable() ||  po->is_latency_enabled() || CGlobalInfo::is_learn_mode()) {
+        po->set_rx_enabled();
     }
 
     if ( node_dump ){
@@ -1008,7 +1001,7 @@ static int parse_options(int argc, char *argv[], CParserOption* po, bool first_t
         /* only first time read the configuration file */
         if ( po->platform_cfg_file.length() >0  ) {
             if ( node_dump ){
-               printf("load platform configuration file from %s \n",po->platform_cfg_file.c_str());
+                printf("load platform configuration file from %s \n",po->platform_cfg_file.c_str());
             }
             global_platform_cfg_info.load_from_yaml_file(po->platform_cfg_file);
             if ( node_dump ){
@@ -1030,7 +1023,7 @@ static int parse_options(int argc, char *argv[], CParserOption* po, bool first_t
             parse_err("Rx check is not supported with interactive mode ");
         }
 
-        if  ( (! po->is_latency_disabled()) || (po->preview.getOnlyLatency()) ){
+        if  ( (po->is_latency_enabled()) || (po->preview.getOnlyLatency()) ){
             parse_err("Latecny check is not supported with interactive mode ");
         }
 
@@ -1064,7 +1057,7 @@ int main_test(int argc , char * argv[]);
 
 
 struct port_cfg_t {
-    public:
+public:
     port_cfg_t(){
         memset(&m_port_conf,0,sizeof(m_port_conf));
         memset(&m_rx_conf,0,sizeof(m_rx_conf));
@@ -1101,33 +1094,33 @@ struct port_cfg_t {
         get_ex_drv()->update_global_config_fdir(this);
     }
 
-       /* enable FDIR */
+    /* enable FDIR */
     inline void update_global_config_fdir_10g(void){
-               m_port_conf.fdir_conf.mode=RTE_FDIR_MODE_PERFECT_MAC_VLAN;
-               m_port_conf.fdir_conf.pballoc=RTE_FDIR_PBALLOC_64K;
-               m_port_conf.fdir_conf.status=RTE_FDIR_NO_REPORT_STATUS; 
-               /* Offset of flexbytes field in RX packets (in 16-bit word units). */
-               /* Note: divide by 2 to convert byte offset to word offset */
-               if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
-                       m_port_conf.fdir_conf.flexbytes_offset=(14+6)/2;
-               }else{
-                       m_port_conf.fdir_conf.flexbytes_offset=(14+8)/2;
-               }
-                        
-               /* Increment offset 4 bytes for the case where we add VLAN */
-               if (  CGlobalInfo::m_options.preview.get_vlan_mode_enable() ){
-                       m_port_conf.fdir_conf.flexbytes_offset+=(4/2);
-               }
-               m_port_conf.fdir_conf.drop_queue=1;
+        m_port_conf.fdir_conf.mode=RTE_FDIR_MODE_PERFECT_MAC_VLAN;
+        m_port_conf.fdir_conf.pballoc=RTE_FDIR_PBALLOC_64K;
+        m_port_conf.fdir_conf.status=RTE_FDIR_NO_REPORT_STATUS;
+        /* Offset of flexbytes field in RX packets (in 16-bit word units). */
+        /* Note: divide by 2 to convert byte offset to word offset */
+        if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
+            m_port_conf.fdir_conf.flexbytes_offset=(14+6)/2;
+        }else{
+            m_port_conf.fdir_conf.flexbytes_offset=(14+8)/2;
+        }
+
+        /* Increment offset 4 bytes for the case where we add VLAN */
+        if (  CGlobalInfo::m_options.preview.get_vlan_mode_enable() ){
+            m_port_conf.fdir_conf.flexbytes_offset+=(4/2);
+        }
+        m_port_conf.fdir_conf.drop_queue=1;
     }
 
     inline void update_global_config_fdir_40g(void){
         m_port_conf.fdir_conf.mode=RTE_FDIR_MODE_PERFECT;
         m_port_conf.fdir_conf.pballoc=RTE_FDIR_PBALLOC_64K;
-        m_port_conf.fdir_conf.status=RTE_FDIR_NO_REPORT_STATUS; 
+        m_port_conf.fdir_conf.status=RTE_FDIR_NO_REPORT_STATUS;
         /* Offset of flexbytes field in RX packets (in 16-bit word units). */
         /* Note: divide by 2 to convert byte offset to word offset */
-        #if 0
+#if 0
         if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
             m_port_conf.fdir_conf.flexbytes_offset=(14+6)/2;
         }else{
@@ -1136,12 +1129,12 @@ struct port_cfg_t {
 
         /* Increment offset 4 bytes for the case where we add VLAN */
         if (  CGlobalInfo::m_options.preview.get_vlan_mode_enable() ){
-                m_port_conf.fdir_conf.flexbytes_offset+=(4/2);
+            m_port_conf.fdir_conf.flexbytes_offset+=(4/2);
         }
-        #endif
+#endif
 
-    // TBD Flow Director does not work with XL710 yet we need to understand why 
-    #if 0
+        // TBD Flow Director does not work with XL710 yet we need to understand why
+#if 0
         struct rte_eth_fdir_flex_conf * lp = &m_port_conf.fdir_conf.flex_conf;
 
         //lp->nb_flexmasks=1;
@@ -1149,11 +1142,11 @@ struct port_cfg_t {
         //memset(lp->flex_mask[0].mask,0xff,RTE_ETH_FDIR_MAX_FLEXLEN);
 
         lp->nb_payloads=1;
-        lp->flex_set[0].type = RTE_ETH_L3_PAYLOAD; 
+        lp->flex_set[0].type = RTE_ETH_L3_PAYLOAD;
         lp->flex_set[0].src_offset[0]=8;
 
         //m_port_conf.fdir_conf.drop_queue=1;
-    #endif
+#endif
     }
 
     struct rte_eth_conf     m_port_conf;
@@ -1163,13 +1156,13 @@ struct port_cfg_t {
 };
 
 
-/* this object is per core / per port / per queue 
-   each core will have 2 ports to send too  
+/* this object is per core / per port / per queue
+   each core will have 2 ports to send too
 
 
-       port0                                port1
+   port0                                port1
 
- 0,1,2,3,..15 out queue ( per core )       0,1,2,3,..15 out queue ( per core )
  0,1,2,3,..15 out queue ( per core )       0,1,2,3,..15 out queue ( per core )
 
 */
 
@@ -1183,7 +1176,7 @@ typedef struct cnt_name_ {
 
 void CPhyEthIFStats::Clear(){
     ipackets = 0;
-    ibytes = 0; 
+    ibytes = 0;
     f_ipackets = 0;
     f_ibytes = 0;
     opackets = 0;
@@ -1198,108 +1191,108 @@ void CPhyEthIFStats::Clear(){
 
 void CPhyEthIFStats::DumpAll(FILE *fd){
 
-    #define DP_A4(f) printf(" %-40s : %llu \n",#f, (unsigned long long)f)
-    #define DP_A(f) if (f) printf(" %-40s : %llu \n",#f, (unsigned long long)f)
-    DP_A4(opackets);  
-    DP_A4(obytes);      
-    DP_A4(ipackets);  
-    DP_A4(ibytes);      
-    DP_A(ierrors);     
-    DP_A(oerrors);     
+#define DP_A4(f) printf(" %-40s : %llu \n",#f, (unsigned long long)f)
+#define DP_A(f) if (f) printf(" %-40s : %llu \n",#f, (unsigned long long)f)
+    DP_A4(opackets);
+    DP_A4(obytes);
+    DP_A4(ipackets);
+    DP_A4(ibytes);
+    DP_A(ierrors);
+    DP_A(oerrors);
 
 }
 
 
 void CPhyEthIFStats::Dump(FILE *fd){
 
-    DP_A(opackets);  
-    DP_A(obytes);      
+    DP_A(opackets);
+    DP_A(obytes);
 
-    DP_A(f_ipackets);  
-    DP_A(f_ibytes);      
+    DP_A(f_ipackets);
+    DP_A(f_ibytes);
 
-    DP_A(ipackets);  
-    DP_A(ibytes);      
-    DP_A(ierrors);     
-    DP_A(oerrors);     
-    DP_A(imcasts);     
-    DP_A(rx_nombuf);   
+    DP_A(ipackets);
+    DP_A(ibytes);
+    DP_A(ierrors);
+    DP_A(oerrors);
+    DP_A(imcasts);
+    DP_A(rx_nombuf);
 }
 
 void CPhyEthIF::flush_rx_queue(void){
 
-        rte_mbuf_t * rx_pkts[32];
-        int j=0;
-        uint16_t cnt=0;
-
-        while (true) {
-            j++;
-            cnt = rx_burst(m_rx_queue,rx_pkts,32);
-            if ( cnt ) {
-                int i;
-                for (i=0; i<(int)cnt;i++) {
-                    rte_mbuf_t * m=rx_pkts[i];
-                    /*printf("rx--\n");
-                    rte_pktmbuf_dump(stdout,m, rte_pktmbuf_pkt_len(m));*/
-                    rte_pktmbuf_free(m);
-                }
-            }
-            if ( ((cnt==0) && (j>10)) || (j>15) ) {
-                break;
+    rte_mbuf_t * rx_pkts[32];
+    int j=0;
+    uint16_t cnt=0;
+
+    while (true) {
+        j++;
+        cnt = rx_burst(m_rx_queue,rx_pkts,32);
+        if ( cnt ) {
+            int i;
+            for (i=0; i<(int)cnt;i++) {
+                rte_mbuf_t * m=rx_pkts[i];
+                /*printf("rx--\n");
+                  rte_pktmbuf_dump(stdout,m, rte_pktmbuf_pkt_len(m));*/
+                rte_pktmbuf_free(m);
             }
         }
-        if (cnt>0) {
-            printf(" Warning can't flush rx-queue for port %d \n",(int)get_port_id());
+        if ( ((cnt==0) && (j>10)) || (j>15) ) {
+            break;
         }
+    }
+    if (cnt>0) {
+        printf(" Warning can't flush rx-queue for port %d \n",(int)get_port_id());
+    }
 }
 
 
 void CPhyEthIF::dump_stats_extended(FILE *fd){
 
     cnt_name_t reg[]={
-            MY_REG(IXGBE_GPTC), /* total packet */
-            MY_REG(IXGBE_GOTCL), /* total bytes */
-            MY_REG(IXGBE_GOTCH), 
-
-            MY_REG(IXGBE_GPRC),
-            MY_REG(IXGBE_GORCL),
-            MY_REG(IXGBE_GORCH),
-
-
-
-            MY_REG(IXGBE_RXNFGPC),
-            MY_REG(IXGBE_RXNFGBCL),
-            MY_REG(IXGBE_RXNFGBCH),     
-            MY_REG(IXGBE_RXDGPC  ),     
-            MY_REG(IXGBE_RXDGBCL ),     
-            MY_REG(IXGBE_RXDGBCH  ),    
-             MY_REG(IXGBE_RXDDGPC ),    
-             MY_REG(IXGBE_RXDDGBCL ),   
-             MY_REG(IXGBE_RXDDGBCH  ),  
-             MY_REG(IXGBE_RXLPBKGPC ),  
-             MY_REG(IXGBE_RXLPBKGBCL),  
-             MY_REG(IXGBE_RXLPBKGBCH ), 
-             MY_REG(IXGBE_RXDLPBKGPC ), 
-             MY_REG(IXGBE_RXDLPBKGBCL), 
-             MY_REG(IXGBE_RXDLPBKGBCH ),
-             MY_REG(IXGBE_TXDGPC      ),
-             MY_REG(IXGBE_TXDGBCL     ),
-             MY_REG(IXGBE_TXDGBCH     ),
-               MY_REG(IXGBE_FDIRUSTAT ),
-        MY_REG(IXGBE_FDIRFSTAT ),
-        MY_REG(IXGBE_FDIRMATCH ),
-        MY_REG(IXGBE_FDIRMISS )
+        MY_REG(IXGBE_GPTC), /* total packet */
+        MY_REG(IXGBE_GOTCL), /* total bytes */
+        MY_REG(IXGBE_GOTCH),
+
+        MY_REG(IXGBE_GPRC),
+        MY_REG(IXGBE_GORCL),
+        MY_REG(IXGBE_GORCH),
+
+
+
+        MY_REG(IXGBE_RXNFGPC),
+        MY_REG(IXGBE_RXNFGBCL),
+        MY_REG(IXGBE_RXNFGBCH),
+        MY_REG(IXGBE_RXDGPC  ),
+        MY_REG(IXGBE_RXDGBCL ),
+        MY_REG(IXGBE_RXDGBCH  ),
+        MY_REG(IXGBE_RXDDGPC ),
+        MY_REG(IXGBE_RXDDGBCL ),
+        MY_REG(IXGBE_RXDDGBCH  ),
+        MY_REG(IXGBE_RXLPBKGPC ),
+        MY_REG(IXGBE_RXLPBKGBCL),
+        MY_REG(IXGBE_RXLPBKGBCH ),
+        MY_REG(IXGBE_RXDLPBKGPC ),
+        MY_REG(IXGBE_RXDLPBKGBCL),
+        MY_REG(IXGBE_RXDLPBKGBCH ),
+        MY_REG(IXGBE_TXDGPC      ),
+        MY_REG(IXGBE_TXDGBCL     ),
+        MY_REG(IXGBE_TXDGBCH     ),
+        MY_REG(IXGBE_FDIRUSTAT ),
+        MY_REG(IXGBE_FDIRFSTAT ),
+        MY_REG(IXGBE_FDIRMATCH ),
+        MY_REG(IXGBE_FDIRMISS )
 
     };
     fprintf (fd," extended counters \n");
     int i;
     for (i=0; i<sizeof(reg)/sizeof(reg[0]); i++) {
         cnt_name_t *lp=&reg[i];
-               uint32_t c=pci_reg_read(lp->offset);
+        uint32_t c=pci_reg_read(lp->offset);
         // xl710 bug. Counter values are -559038737 when they should be 0
-               if (c && c != -559038737 ) {
-                       fprintf (fd," %s  : %d \n",lp->name,c);
-               }
+        if (c && c != -559038737 ) {
+            fprintf (fd," %s  : %d \n",lp->name,c);
+        }
     }
 }
 
@@ -1311,15 +1304,15 @@ void CPhyEthIF::configure(uint16_t nb_rx_queue,
                           uint16_t nb_tx_queue,
                           const struct rte_eth_conf *eth_conf){
     int ret;
-    ret = rte_eth_dev_configure(m_port_id, 
+    ret = rte_eth_dev_configure(m_port_id,
                                 nb_rx_queue,
-                                nb_tx_queue, 
+                                nb_tx_queue,
                                 eth_conf);
 
     if (ret < 0)
         rte_exit(EXIT_FAILURE, "Cannot configure device: "
-                "err=%d, port=%u\n",
-              ret, m_port_id);
+                 "err=%d, port=%u\n",
+                 ret, m_port_id);
 
     /* get device info */
     rte_eth_dev_info_get(m_port_id, &m_dev_info);
@@ -1329,13 +1322,13 @@ void CPhyEthIF::configure(uint16_t nb_rx_queue,
 
 /*
 
-rx-queue 0 - default- all traffic not goint to queue 1
-             will be drop as queue is disable 
-             
+  rx-queue 0 - default- all traffic not goint to queue 1
+  will be drop as queue is disable
+
 
-rx-queue 1 - Latency measurement packets will go here  
+  rx-queue 1 - Latency measurement packets will go here
 
-            pci_reg_write(IXGBE_L34T_IMIR(0),(1<<21));
+  pci_reg_write(IXGBE_L34T_IMIR(0),(1<<21));
 
 */
 
@@ -1357,7 +1350,7 @@ void CPhyEthIF::configure_rx_drop_queue(){
     if ( get_vm_one_queue_enable() || (CGlobalInfo::m_options.m_debug_pkt_proto != 0)) {
         return;
     }
-    if ( CGlobalInfo::m_options.is_latency_disabled()==false ) {
+    if ( CGlobalInfo::m_options.is_rx_enabled() ) {
         if ( (!get_ex_drv()->is_hardware_support_drop_queue())  ) {
             printf(" ERROR latency feature is not supported with current hardware  \n");
             exit(1);
@@ -1368,38 +1361,38 @@ void CPhyEthIF::configure_rx_drop_queue(){
 
 
 void CPhyEthIF::rx_queue_setup(uint16_t rx_queue_id,
-                               uint16_t nb_rx_desc, 
+                               uint16_t nb_rx_desc,
                                unsigned int socket_id,
                                const struct rte_eth_rxconf *rx_conf,
                                struct rte_mempool *mb_pool){
 
-    int ret = rte_eth_rx_queue_setup(m_port_id , rx_queue_id, 
+    int ret = rte_eth_rx_queue_setup(m_port_id , rx_queue_id,
                                      nb_rx_desc,
-                                     socket_id, 
+                                     socket_id,
                                      rx_conf,
                                      mb_pool);
     if (ret < 0)
         rte_exit(EXIT_FAILURE, "rte_eth_rx_queue_setup: "
-                "err=%d, port=%u\n",
-              ret, m_port_id);
+                 "err=%d, port=%u\n",
+                 ret, m_port_id);
 }
 
 
 
 void CPhyEthIF::tx_queue_setup(uint16_t tx_queue_id,
-                               uint16_t nb_tx_desc, 
+                               uint16_t nb_tx_desc,
                                unsigned int socket_id,
                                const struct rte_eth_txconf *tx_conf){
 
     int ret = rte_eth_tx_queue_setup( m_port_id,
-                                     tx_queue_id, 
+                                      tx_queue_id,
                                       nb_tx_desc,
-                                      socket_id, 
+                                      socket_id,
                                       tx_conf);
     if (ret < 0)
         rte_exit(EXIT_FAILURE, "rte_eth_tx_queue_setup: "
-                "err=%d, port=%u queue=%u\n",
-              ret, m_port_id, tx_queue_id);
+                 "err=%d, port=%u queue=%u\n",
+                 ret, m_port_id, tx_queue_id);
 
 }
 
@@ -1419,7 +1412,7 @@ void CPhyEthIF::start(){
     m_bw_rx.reset();
 
     m_stats.Clear();
-    int i; 
+    int i;
     for (i=0;i<10; i++ ) {
         ret = rte_eth_dev_start(m_port_id);
         if (ret==0) {
@@ -1429,32 +1422,32 @@ void CPhyEthIF::start(){
     }
     if (ret < 0)
         rte_exit(EXIT_FAILURE, "rte_eth_dev_start: "
-                "err=%d, port=%u\n",
-              ret, m_port_id);
+                 "err=%d, port=%u\n",
+                 ret, m_port_id);
 
 }
 
 // Disabling flow control on interface
 void CPhyEthIF::disable_flow_control(){
-       int ret;
-        // see trex-64 issue with loopback on the same NIC
-        struct rte_eth_fc_conf fc_conf;
-        memset(&fc_conf,0,sizeof(fc_conf));
-        fc_conf.mode=RTE_FC_NONE;
-        fc_conf.autoneg=1;
-        fc_conf.pause_time=100;
-        int i;
-        for (i=0; i<5; i++) {
-            ret=rte_eth_dev_flow_ctrl_set(m_port_id,&fc_conf);
-            if (ret==0) {
-                break;
-            }
-            delay(1000);
+    int ret;
+    // see trex-64 issue with loopback on the same NIC
+    struct rte_eth_fc_conf fc_conf;
+    memset(&fc_conf,0,sizeof(fc_conf));
+    fc_conf.mode=RTE_FC_NONE;
+    fc_conf.autoneg=1;
+    fc_conf.pause_time=100;
+    int i;
+    for (i=0; i<5; i++) {
+        ret=rte_eth_dev_flow_ctrl_set(m_port_id,&fc_conf);
+        if (ret==0) {
+            break;
         }
-        if (ret < 0)
-          rte_exit(EXIT_FAILURE, "rte_eth_dev_flow_ctrl_set: "
-                  "err=%d, port=%u\n probably link is down. Please check your link activity, or skip flow-control disabling, using: --no-flow-control-change option\n",
-                ret, m_port_id);
+        delay(1000);
+    }
+    if (ret < 0)
+        rte_exit(EXIT_FAILURE, "rte_eth_dev_flow_ctrl_set: "
+                 "err=%d, port=%u\n probably link is down. Please check your link activity, or skip flow-control disabling, using: --no-flow-control-change option\n",
+                 ret, m_port_id);
 }
 
 
@@ -1466,9 +1459,9 @@ void CPhyEthIF::dump_link(FILE *fd){
     fprintf(fd,"link         : ");
     if (m_link.link_status) {
         fprintf(fd," link : Link Up - speed %u Mbps - %s\n",
-               (unsigned) m_link.link_speed,
-               (m_link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
-               ("full-duplex") : ("half-duplex\n"));
+                (unsigned) m_link.link_speed,
+                (m_link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
+                ("full-duplex") : ("half-duplex\n"));
     } else {
         fprintf(fd," Link Down\n");
     }
@@ -1492,7 +1485,7 @@ void CPhyEthIF::set_promiscuous(bool enable){
     if (enable) {
         rte_eth_promiscuous_enable(m_port_id);
     }else{
-       rte_eth_promiscuous_disable(m_port_id);
+        rte_eth_promiscuous_disable(m_port_id);
     }
 }
 
@@ -1500,7 +1493,7 @@ bool CPhyEthIF::get_promiscuous(){
     int ret=rte_eth_promiscuous_get(m_port_id);
     if (ret<0) {
         rte_exit(EXIT_FAILURE, "rte_eth_promiscuous_get: "
-                "err=%d, port=%u\n",
+                 "err=%d, port=%u\n",
                  ret, m_port_id);
 
     }
@@ -1509,51 +1502,51 @@ bool CPhyEthIF::get_promiscuous(){
 
 
 void CPhyEthIF::macaddr_get(struct ether_addr *mac_addr){
-       rte_eth_macaddr_get(m_port_id , mac_addr);
+    rte_eth_macaddr_get(m_port_id , mac_addr);
 }
 
 
-void CPhyEthIF::get_stats_1g(CPhyEthIFStats *stats){ 
+void CPhyEthIF::get_stats_1g(CPhyEthIFStats *stats){
 
-   stats->ipackets     +=  pci_reg_read(E1000_GPRC) ;
+    stats->ipackets     +=  pci_reg_read(E1000_GPRC) ;
 
-   stats->ibytes       +=  (pci_reg_read(E1000_GORCL) );
-   stats->ibytes       +=  (((uint64_t)pci_reg_read(E1000_GORCH))<<32);
-                        
+    stats->ibytes       +=  (pci_reg_read(E1000_GORCL) );
+    stats->ibytes       +=  (((uint64_t)pci_reg_read(E1000_GORCH))<<32);
 
-   stats->opackets     +=  pci_reg_read(E1000_GPTC);
-   stats->obytes       +=  pci_reg_read(E1000_GOTCL) ;
-   stats->obytes       +=  ( (((uint64_t)pci_reg_read(IXGBE_GOTCH))<<32) );
 
-   stats->f_ipackets   +=  0;
-   stats->f_ibytes     += 0;
+    stats->opackets     +=  pci_reg_read(E1000_GPTC);
+    stats->obytes       +=  pci_reg_read(E1000_GOTCL) ;
+    stats->obytes       +=  ( (((uint64_t)pci_reg_read(IXGBE_GOTCH))<<32) );
 
+    stats->f_ipackets   +=  0;
+    stats->f_ibytes     += 0;
 
-   stats->ierrors      +=  ( pci_reg_read(E1000_RNBC) +
-                             pci_reg_read(E1000_CRCERRS) + 
-                             pci_reg_read(E1000_ALGNERRC ) +
-                             pci_reg_read(E1000_SYMERRS ) +
-                             pci_reg_read(E1000_RXERRC ) +
 
-                             pci_reg_read(E1000_ROC)+
-                             pci_reg_read(E1000_RUC)+ 
-                             pci_reg_read(E1000_RJC) +
+    stats->ierrors      +=  ( pci_reg_read(E1000_RNBC) +
+                              pci_reg_read(E1000_CRCERRS) +
+                              pci_reg_read(E1000_ALGNERRC ) +
+                              pci_reg_read(E1000_SYMERRS ) +
+                              pci_reg_read(E1000_RXERRC ) +
 
-                             pci_reg_read(E1000_XONRXC)+   
-                            pci_reg_read(E1000_XONTXC)+
-                            pci_reg_read(E1000_XOFFRXC)+
-                            pci_reg_read(E1000_XOFFTXC)+
-                            pci_reg_read(E1000_FCRUC)
-                             );
+                              pci_reg_read(E1000_ROC)+
+                              pci_reg_read(E1000_RUC)+
+                              pci_reg_read(E1000_RJC) +
 
-   stats->oerrors      +=  0;
-   stats->imcasts      =  0;
-   stats->rx_nombuf    =  0;
+                              pci_reg_read(E1000_XONRXC)+
+                              pci_reg_read(E1000_XONTXC)+
+                              pci_reg_read(E1000_XOFFRXC)+
+                              pci_reg_read(E1000_XOFFTXC)+
+                              pci_reg_read(E1000_FCRUC)
+                              );
 
-   m_last_tx_rate      =  m_bw_tx.add(stats->obytes);
-   m_last_rx_rate      =  m_bw_rx.add(stats->ibytes);
-   m_last_tx_pps       =  m_pps_tx.add(stats->opackets);
-   m_last_rx_pps       =  m_pps_rx.add(stats->ipackets);
+    stats->oerrors      +=  0;
+    stats->imcasts      =  0;
+    stats->rx_nombuf    =  0;
+
+    m_last_tx_rate      =  m_bw_tx.add(stats->obytes);
+    m_last_rx_rate      =  m_bw_rx.add(stats->ibytes);
+    m_last_tx_pps       =  m_pps_tx.add(stats->opackets);
+    m_last_rx_pps       =  m_pps_rx.add(stats->ipackets);
 
 }
 
@@ -1563,13 +1556,13 @@ int CPhyEthIF::dump_fdir_global_stats(FILE *fd) {
 
 void dump_hw_state(FILE *fd,struct ixgbe_hw_stats *hs ){
 
-    #define DP_A1(f) if (hs->f) fprintf(fd," %-40s : %llu \n",#f, (unsigned long long)hs->f)
-    #define DP_A2(f,m) for (i=0;i<m; i++) { if (hs->f[i]) fprintf(fd," %-40s[%d] : %llu \n",#f,i, (unsigned long long)hs->f[i]); }
-       int i;
+#define DP_A1(f) if (hs->f) fprintf(fd," %-40s : %llu \n",#f, (unsigned long long)hs->f)
+#define DP_A2(f,m) for (i=0;i<m; i++) { if (hs->f[i]) fprintf(fd," %-40s[%d] : %llu \n",#f,i, (unsigned long long)hs->f[i]); }
+    int i;
 
     //for (i=0;i<8; i++) { if (hs->mpc[i]) fprintf(fd," %-40s[%d] : %llu \n","mpc",i,hs->mpc[i]); }
-     DP_A2(mpc,8);
-     DP_A1(crcerrs);
+    DP_A2(mpc,8);
+    DP_A1(crcerrs);
     DP_A1(illerrc);
     //DP_A1(errbc);
     DP_A1(mspdc);
@@ -1589,7 +1582,7 @@ void dump_hw_state(FILE *fd,struct ixgbe_hw_stats *hs ){
     //DP_A1(prc64);
     //DP_A1(prc127);
     //DP_A1(prc255);
-   // DP_A1(prc511);
+    // DP_A1(prc511);
     //DP_A1(prc1023);
     //DP_A1(prc1522);
 
@@ -1620,7 +1613,7 @@ void dump_hw_state(FILE *fd,struct ixgbe_hw_stats *hs ){
     DP_A1(bptc);
     DP_A1(xec);
     DP_A2(qprc,16)
-    DP_A2(qptc,16);
+        DP_A2(qptc,16);
     DP_A2(qbrc,16);
     DP_A2(qbtc,16);
     DP_A2(qprdc,16);
@@ -1649,19 +1642,19 @@ void dump_hw_state(FILE *fd,struct ixgbe_hw_stats *hs ){
 }
 
 
-void CPhyEthIF::update_counters(){ 
-   get_ex_drv()->get_extended_stats(this, &m_stats);
+void CPhyEthIF::update_counters(){
+    get_ex_drv()->get_extended_stats(this, &m_stats);
 
-   m_last_tx_rate      =  m_bw_tx.add(m_stats.obytes);
-   m_last_rx_rate      =  m_bw_rx.add(m_stats.ibytes);
-   m_last_tx_pps       =  m_pps_tx.add(m_stats.opackets);
-   m_last_rx_pps       =  m_pps_rx.add(m_stats.ipackets);
+    m_last_tx_rate      =  m_bw_tx.add(m_stats.obytes);
+    m_last_rx_rate      =  m_bw_rx.add(m_stats.ibytes);
+    m_last_tx_pps       =  m_pps_tx.add(m_stats.opackets);
+    m_last_rx_pps       =  m_pps_rx.add(m_stats.ipackets);
 }
 
-void CPhyEthIF::dump_stats(FILE *fd){ 
+void CPhyEthIF::dump_stats(FILE *fd){
 
     update_counters();
-    
+
     fprintf(fd,"port : %d \n",(int)m_port_id);
     fprintf(fd,"------------\n");
     m_stats.DumpAll(fd);
@@ -1689,7 +1682,7 @@ public:
     uint16_t                m_tx_queue_id;
     uint16_t                m_len;
     rte_mbuf_t *            m_table[MAX_PKT_BURST];
-    CPhyEthIF  *            m_port;  
+    CPhyEthIF  *            m_port;
 };
 
 
@@ -1708,7 +1701,7 @@ public:
 public:
     bool Create(uint8_t             core_id,
                 uint16_t            tx_client_queue_id,
-                CPhyEthIF  *        tx_client_port, 
+                CPhyEthIF  *        tx_client_port,
 
                 uint16_t            tx_server_queue_id,
                 CPhyEthIF  *        tx_server_port);
@@ -1764,7 +1757,7 @@ protected:
 
 protected:
     uint8_t      m_core_id;
-    uint16_t     m_mbuf_cache; 
+    uint16_t     m_mbuf_cache;
     CCorePerPort m_ports[CS_NUM]; /* each core has 2 tx queues 1. client side and server side */
     CNodeRing *  m_ring_to_rx;
 
@@ -1777,7 +1770,7 @@ public:
 
 bool CCoreEthIF::Create(uint8_t             core_id,
                         uint16_t            tx_client_queue_id,
-                        CPhyEthIF  *        tx_client_port, 
+                        CPhyEthIF  *        tx_client_port,
 
                         uint16_t            tx_server_queue_id,
                         CPhyEthIF  *        tx_server_port){
@@ -1796,7 +1789,7 @@ bool CCoreEthIF::Create(uint8_t             core_id,
 
 void CCoreEthIF::flush_rx_queue(void){
     pkt_dir_t   dir ;
-    bool is_latency=get_is_latency_thread_enable();
+    bool is_rx = get_is_rx_thread_enabled();
     for (dir=CLIENT_SIDE; dir<CS_NUM; dir++) {
         CCorePerPort * lp_port=&m_ports[dir];
         CPhyEthIF * lp=lp_port->m_port;
@@ -1811,7 +1804,7 @@ void CCoreEthIF::flush_rx_queue(void){
                 int i;
                 for (i=0; i<(int)cnt;i++) {
                     rte_mbuf_t * m=rx_pkts[i];
-                    if ( is_latency ){
+                    if ( is_rx ){
                         if (!process_rx_pkt(dir,m)){
                             rte_pktmbuf_free(m);
                         }
@@ -1835,7 +1828,7 @@ int CCoreEthIF::flush_tx_queue(void){
         CVirtualIFPerSideStats  * lp_stats= &m_stats[dir];
         if ( likely(lp_port->m_len > 0) ) {
             send_burst(lp_port,lp_port->m_len,lp_stats);
-             lp_port->m_len = 0;
+            lp_port->m_len = 0;
         }
     }
 
@@ -1903,18 +1896,18 @@ int CCoreEthIF::send_burst(CCorePerPort * lp_port,
                            CVirtualIFPerSideStats  * lp_stats){
 
     uint16_t ret = lp_port->m_port->tx_burst(lp_port->m_tx_queue_id,lp_port->m_table,len);
-    #ifdef DELAY_IF_NEEDED
+#ifdef DELAY_IF_NEEDED
     while ( unlikely( ret<len ) ){
         rte_delay_us(1);
         //rte_pause();
         //rte_pause();
         lp_stats->m_tx_queue_full += 1;
         uint16_t ret1=lp_port->m_port->tx_burst(lp_port->m_tx_queue_id,
-                                        &lp_port->m_table[ret],
-                                        len-ret);
+                                                &lp_port->m_table[ret],
+                                                len-ret);
         ret+=ret1;
     }
-    #endif
+#endif
 
     /* CPU has burst of packets , more that TX can send need to drop them !!*/
     if ( unlikely(ret < len) ) {
@@ -1928,7 +1921,7 @@ int CCoreEthIF::send_burst(CCorePerPort * lp_port,
 
     return (0);
 }
-                         
+
 
 int CCoreEthIF::send_pkt(CCorePerPort * lp_port,
                          rte_mbuf_t      *m,
@@ -1957,7 +1950,7 @@ int CCoreEthIF::send_pkt(CCorePerPort * lp_port,
 
 
 
-void CCoreEthIF::send_one_pkt(pkt_dir_t       dir, 
+void CCoreEthIF::send_one_pkt(pkt_dir_t       dir,
                               rte_mbuf_t      *m){
     CCorePerPort *  lp_port=&m_ports[dir];
     CVirtualIFPerSideStats  * lp_stats = &m_stats[dir];
@@ -2033,7 +2026,7 @@ int CCoreEthIF::send_node(CGenNode * node){
         send_pkt(lp_port,m,lp_stats);
         return (0);
     }
-    
+
 
     CFlowPktInfo *  lp=node->m_pkt_info;
     rte_mbuf_t *    m=lp->generate_new_mbuf(node);
@@ -2050,18 +2043,18 @@ int CCoreEthIF::send_node(CGenNode * node){
 
         /* set the vlan */
         m->ol_flags = PKT_TX_VLAN_PKT;
-               m->l2_len   =14;
-               uint16_t vlan_id = CGlobalInfo::m_options.m_vlan_port[vlan_port];
+        m->l2_len   =14;
+        uint16_t vlan_id = CGlobalInfo::m_options.m_vlan_port[vlan_port];
 
 
-               if (likely( vlan_id >0 ) ) {
-                       m->vlan_tci = vlan_id;
-                       dir = dir ^ vlan_port;
-               }else{
-                       /* both from the same dir but with VLAN0 */
-                       m->vlan_tci = CGlobalInfo::m_options.m_vlan_port[0];
-                       dir = dir ^ 0;
-               }
+        if (likely( vlan_id >0 ) ) {
+            m->vlan_tci = vlan_id;
+            dir = dir ^ vlan_port;
+        }else{
+            /* both from the same dir but with VLAN0 */
+            m->vlan_tci = CGlobalInfo::m_options.m_vlan_port[0];
+            dir = dir ^ 0;
+        }
     }
 
     CCorePerPort *  lp_port=&m_ports[dir];
@@ -2071,7 +2064,7 @@ int CCoreEthIF::send_node(CGenNode * node){
         lp_stats->m_tx_alloc_error++;
         return(0);
     }
-    
+
     /* update mac addr dest/src 12 bytes */
     uint8_t *p=rte_pktmbuf_mtod(m, uint8_t*);
     uint8_t p_id=lp_port->m_port->get_port_id();
@@ -2079,19 +2072,19 @@ int CCoreEthIF::send_node(CGenNode * node){
 
     memcpy(p,CGlobalInfo::m_options.get_dst_src_mac_addr(p_id),12);
 
-    /* if customer enables both mac_file and get_mac_ip_overide, 
+    /* if customer enables both mac_file and get_mac_ip_overide,
      * we will apply mac_file.
      */
     if ( unlikely(CGlobalInfo::m_options.preview.get_mac_ip_features_enable() ) ) {
         update_mac_addr(node,p);
     }
 
-       if ( unlikely( node->is_rx_check_enabled() ) ) {
+    if ( unlikely( node->is_rx_check_enabled() ) ) {
         lp_stats->m_tx_rx_check_pkt++;
         lp->do_generate_new_mbuf_rxcheck(m, node, single_port);
         lp_stats->m_template.inc_template( node->get_template_id( ));
-       }else{
-        // cache only if it is not sample as this is more complex mbuf struct 
+    }else{
+        // cache only if it is not sample as this is more complex mbuf struct
         if ( unlikely( node->can_cache_mbuf() ) ) {
             if ( !CGlobalInfo::m_options.preview.isMbufCacheDisabled() ){
                 m_mbuf_cache++;
@@ -2106,7 +2099,7 @@ int CCoreEthIF::send_node(CGenNode * node){
     }
 
     /*printf("send packet -- \n");
-    rte_pktmbuf_dump(stdout,m, rte_pktmbuf_pkt_len(m));*/
+      rte_pktmbuf_dump(stdout,m, rte_pktmbuf_pkt_len(m));*/
 
     /* send the packet */
     send_pkt(lp_port,m,lp_stats);
@@ -2124,7 +2117,7 @@ int CCoreEthIF::update_mac_addr_from_global_cfg(pkt_dir_t  dir, uint8_t * p){
     return (0);
 }
 
-pkt_dir_t 
+pkt_dir_t
 CCoreEthIF::port_id_to_dir(uint8_t port_id) {
 
     for (pkt_dir_t dir = 0; dir < CS_NUM; dir++) {
@@ -2150,11 +2143,11 @@ public:
         rte_mbuf_t * tx_pkts[2];
         tx_pkts[0]=m;
         if ( likely( CGlobalInfo::m_options.preview.get_vlan_mode_enable() ) ){
-             /* vlan mode is the default */
-             /* set the vlan */
-             m->ol_flags = PKT_TX_VLAN_PKT;
-             m->vlan_tci =CGlobalInfo::m_options.m_vlan_port[0];
-                        m->l2_len   =14;
+            /* vlan mode is the default */
+            /* set the vlan */
+            m->ol_flags = PKT_TX_VLAN_PKT;
+            m->vlan_tci =CGlobalInfo::m_options.m_vlan_port[0];
+            m->l2_len   =14;
         }
         uint16_t res=m_port->tx_burst(m_tx_queue_id,tx_pkts,1);
         if ( res == 0 ) {
@@ -2162,13 +2155,13 @@ public:
             //printf(" queue is full for latency packet !!\n");
             return (-1);
 
-        }                        
-        #if 0
+        }
+#if 0
         fprintf(stdout," ==> %f.03 send packet ..\n",now_sec());
         uint8_t *p1=rte_pktmbuf_mtod(m, uint8_t*);
         uint16_t pkt_size1=rte_pktmbuf_pkt_len(m);
         utl_DumpBuffer(stdout,p1,pkt_size1,0);
-        #endif
+#endif
 
         return (0);
     }
@@ -2182,8 +2175,8 @@ public:
         }
     }
 
-    virtual uint16_t rx_burst(struct rte_mbuf **rx_pkts, 
-                               uint16_t nb_pkts){
+    virtual uint16_t rx_burst(struct rte_mbuf **rx_pkts,
+                              uint16_t nb_pkts){
         uint16_t cnt=m_port->rx_burst(m_rx_queue_id,rx_pkts,nb_pkts);
         return (cnt);
     }
@@ -2199,7 +2192,7 @@ private:
 class CLatencyVmPort : public CPortLatencyHWBase {
 public:
     void Create(uint8_t port_index,CNodeRing * ring,
-                        CLatencyManager * mgr){
+                CLatencyManager * mgr){
         m_dir        = (port_index%2);
         m_ring_to_dp = ring;
         m_mgr        = mgr;
@@ -2207,11 +2200,11 @@ public:
 
     virtual int tx(rte_mbuf_t * m){
         if ( likely( CGlobalInfo::m_options.preview.get_vlan_mode_enable() ) ){
-             /* vlan mode is the default */
-             /* set the vlan */
-             m->ol_flags = PKT_TX_VLAN_PKT;
-             m->vlan_tci =CGlobalInfo::m_options.m_vlan_port[0];
-                        m->l2_len   =14;
+            /* vlan mode is the default */
+            /* set the vlan */
+            m->ol_flags = PKT_TX_VLAN_PKT;
+            m->vlan_tci =CGlobalInfo::m_options.m_vlan_port[0];
+            m->l2_len   =14;
         }
 
         /* allocate node */
@@ -2230,11 +2223,11 @@ public:
     }
 
     virtual rte_mbuf_t * rx(){
-            return (0);
+        return (0);
     }
 
-    virtual uint16_t rx_burst(struct rte_mbuf **rx_pkts, 
-                               uint16_t nb_pkts){
+    virtual uint16_t rx_burst(struct rte_mbuf **rx_pkts,
+                              uint16_t nb_pkts){
         return (0);
     }
 
@@ -2250,14 +2243,14 @@ private:
 class CPerPortStats {
 public:
     uint64_t opackets;
-    uint64_t obytes;      
-    uint64_t ipackets;  
+    uint64_t obytes;
+    uint64_t ipackets;
     uint64_t ibytes;
     uint64_t ierrors;
-    uint64_t oerrors;     
+    uint64_t oerrors;
     tx_per_flow_t m_tx_per_flow[MAX_FLOW_STATS];
     tx_per_flow_t m_prev_tx_per_flow[MAX_FLOW_STATS];
-    
+
     float     m_total_tx_bps;
     float     m_total_tx_pps;
 
@@ -2269,7 +2262,7 @@ class CGlobalStats {
 public:
     enum DumpFormat {
         dmpSTANDARD,
-        dmpTABLE 
+        dmpTABLE
     };
 
     uint64_t  m_total_tx_pkts;
@@ -2290,7 +2283,7 @@ public:
     uint64_t  m_total_nat_active  ;
     uint64_t  m_total_nat_open    ;
     uint64_t  m_total_nat_learn_error    ;
-    
+
     CPerTxthreadTemplateInfo m_template;
 
     float     m_socket_util;
@@ -2311,7 +2304,7 @@ public:
     uint8_t m_threads;
 
     uint32_t      m_num_of_ports;
-    CPerPortStats m_port[BP_MAX_PORTS];
+    CPerPortStats m_port[TREX_MAX_PORTS];
 public:
     void Dump(FILE *fd,DumpFormat mode);
     void DumpAllPorts(FILE *fd);
@@ -2352,8 +2345,8 @@ std::string CGlobalStats::get_field_port(int port,std::string name,uint64_t &f){
 void CGlobalStats::dump_json(std::string & json){
     json="{\"name\":\"trex-global\",\"type\":0,\"data\":{";
 
-    #define GET_FIELD(f) get_field(std::string(#f),f)
-    #define GET_FIELD_PORT(p,f) get_field_port(p,std::string(#f),lp->f)
+#define GET_FIELD(f) get_field(std::string(#f),f)
+#define GET_FIELD_PORT(p,f) get_field_port(p,std::string(#f),lp->f)
 
     json+=GET_FIELD(m_cpu_util);
     json+=GET_FIELD(m_platform_factor);
@@ -2415,7 +2408,7 @@ void CGlobalStats::DumpAllPorts(FILE *fd){
     //fprintf (fd," Total-Rx-Bytes  : %s  \n",double_to_human_str((double)m_total_rx_bytes,"bytes",KBYE_1000).c_str());
 
 
-    
+
     fprintf (fd," Cpu Utilization : %2.1f  %%  %2.1f Gb/core \n",m_cpu_util,(2*(m_tx_bps/1e9)*100.0/(m_cpu_util*m_threads)));
     fprintf (fd," Platform_factor : %2.1f  \n",m_platform_factor);
     fprintf (fd," Total-Tx        : %s  ",double_to_human_str(m_tx_bps,"bps",KBYE_1000).c_str());
@@ -2492,76 +2485,76 @@ void CGlobalStats::Dump(FILE *fd,DumpFormat mode){
 
 
     if ( mode== dmpSTANDARD ){
-        fprintf (fd," --------------- \n"); 
+        fprintf (fd," --------------- \n");
         for (i=0; i<(int)port_to_show; i++) {
             CPerPortStats * lp=&m_port[i];
             fprintf(fd,"port : %d \n",(int)i);
             fprintf(fd,"------------\n");
-            #define GS_DP_A4(f) fprintf(fd," %-40s : %llu \n",#f, (unsigned long long)lp->f)
-            #define GS_DP_A(f) if (lp->f) fprintf(fd," %-40s : %llu \n",#f, (unsigned long long)lp->f)
-            GS_DP_A4(opackets);  
-            GS_DP_A4(obytes);      
-            GS_DP_A4(ipackets);  
-            GS_DP_A4(ibytes);      
-            GS_DP_A(ierrors);     
-            GS_DP_A(oerrors);     
+#define GS_DP_A4(f) fprintf(fd," %-40s : %llu \n",#f, (unsigned long long)lp->f)
+#define GS_DP_A(f) if (lp->f) fprintf(fd," %-40s : %llu \n",#f, (unsigned long long)lp->f)
+            GS_DP_A4(opackets);
+            GS_DP_A4(obytes);
+            GS_DP_A4(ipackets);
+            GS_DP_A4(ibytes);
+            GS_DP_A(ierrors);
+            GS_DP_A(oerrors);
             fprintf (fd," Tx : %s  \n",double_to_human_str((double)lp->m_total_tx_bps,"bps",KBYE_1000).c_str());
         }
     }else{
-            fprintf(fd," %10s ","ports");
-            for (i=0; i<(int)port_to_show; i++) {
-                fprintf(fd,"| %15d ",i);
-            }
-            fprintf(fd,"\n");
-            fprintf(fd," -----------------------------------------------------------------------------------------\n");
-            std::string names[]={"opackets","obytes","ipackets","ibytes","ierrors","oerrors","Tx Bw"
-            };
-            for (i=0; i<7; i++) {
-                fprintf(fd," %10s ",names[i].c_str());
-                int j=0;
-                for (j=0; j<port_to_show;j++) {
-                    CPerPortStats * lp=&m_port[j];
-                    uint64_t cnt;
-                    switch (i) {
-                    case 0:
-                        cnt=lp->opackets;
-                        fprintf(fd,"| %15lu ",cnt);
+        fprintf(fd," %10s ","ports");
+        for (i=0; i<(int)port_to_show; i++) {
+            fprintf(fd,"| %15d ",i);
+        }
+        fprintf(fd,"\n");
+        fprintf(fd," -----------------------------------------------------------------------------------------\n");
+        std::string names[]={"opackets","obytes","ipackets","ibytes","ierrors","oerrors","Tx Bw"
+        };
+        for (i=0; i<7; i++) {
+            fprintf(fd," %10s ",names[i].c_str());
+            int j=0;
+            for (j=0; j<port_to_show;j++) {
+                CPerPortStats * lp=&m_port[j];
+                uint64_t cnt;
+                switch (i) {
+                case 0:
+                    cnt=lp->opackets;
+                    fprintf(fd,"| %15lu ",cnt);
 
-                        break;
-                    case 1:
-                        cnt=lp->obytes;
-                        fprintf(fd,"| %15lu ",cnt);
+                    break;
+                case 1:
+                    cnt=lp->obytes;
+                    fprintf(fd,"| %15lu ",cnt);
 
-                        break;
-                    case 2:
-                        cnt=lp->ipackets;
-                        fprintf(fd,"| %15lu ",cnt);
+                    break;
+                case 2:
+                    cnt=lp->ipackets;
+                    fprintf(fd,"| %15lu ",cnt);
 
-                        break;
-                    case 3:
-                        cnt=lp->ibytes;
-                        fprintf(fd,"| %15lu ",cnt);
+                    break;
+                case 3:
+                    cnt=lp->ibytes;
+                    fprintf(fd,"| %15lu ",cnt);
 
-                        break;
-                    case 4:
-                        cnt=lp->ierrors;
-                        fprintf(fd,"| %15lu ",cnt);
+                    break;
+                case 4:
+                    cnt=lp->ierrors;
+                    fprintf(fd,"| %15lu ",cnt);
 
-                        break;
-                    case 5:
-                        cnt=lp->oerrors;
-                        fprintf(fd,"| %15lu ",cnt);
+                    break;
+                case 5:
+                    cnt=lp->oerrors;
+                    fprintf(fd,"| %15lu ",cnt);
 
-                        break;
-                    case 6:
-                        fprintf(fd,"| %15s ",double_to_human_str((double)lp->m_total_tx_bps,"bps",KBYE_1000).c_str());
-                        break;
-                    default:
-                        cnt=0xffffff;
-                    }
-                } /* ports */
-                       fprintf(fd, "\n");
-               }/* fields*/
+                    break;
+                case 6:
+                    fprintf(fd,"| %15s ",double_to_human_str((double)lp->m_total_tx_bps,"bps",KBYE_1000).c_str());
+                    break;
+                default:
+                    cnt=0xffffff;
+                }
+            } /* ports */
+            fprintf(fd, "\n");
+        }/* fields*/
     }
 
 
@@ -2571,15 +2564,15 @@ class CGlobalTRex  {
 
 public:
     CGlobalTRex (){
-       m_max_ports=4;
-       m_max_cores=1;
-       m_cores_to_dual_ports=0;
-       m_max_queues_per_port=0;
-       m_fl_was_init=false;
-       m_expected_pps=0.0;                
-       m_expected_cps=0.0;
-       m_expected_bps=0.0;
-       m_trex_stateless = NULL;
+        m_max_ports=4;
+        m_max_cores=1;
+        m_cores_to_dual_ports=0;
+        m_max_queues_per_port=0;
+        m_fl_was_init=false;
+        m_expected_pps=0.0;
+        m_expected_cps=0.0;
+        m_expected_bps=0.0;
+        m_trex_stateless = NULL;
     }
 
     bool Create();
@@ -2599,25 +2592,24 @@ private:
     /* send message to all dp cores */
     int  send_message_all_dp(TrexStatelessCpToDpMsgBase *msg);
     void check_for_dp_message_from_core(int thread_id);
-    
+
 public:
     void check_for_dp_messages();
     int start_master_statefull();
     int start_master_stateless();
     int run_in_core(virtual_thread_id_t virt_core_id);
     int stop_core(virtual_thread_id_t virt_core_id);
-    int core_for_latency(){
-        if ( (!get_is_latency_thread_enable()) ){
-            return (-1);
+    int core_for_rx(){
+        if ( (! get_is_rx_thread_enabled()) ) {
+            return -1;
         }else{
-                return ( m_max_cores - 1 );
-            }
-
+            return m_max_cores - 1;
+        }
     }
-    int run_in_laterncy_core();
+    int run_in_rx_core();
     int run_in_master();
     int stop_master();
-    /* return the minimum number of dp cores needed to support the active ports 
+    /* return the minimum number of dp cores needed to support the active ports
        this is for c==1 or  m_cores_mul==1
     */
     int get_base_num_cores(){
@@ -2625,12 +2617,12 @@ public:
     }
 
     int get_cores_tx(){
-        /* 0 - master 
-           num_of_cores - 
+        /* 0 - master
+           num_of_cores -
            last for latency */
-        if ( (!get_is_latency_thread_enable()) ){
+        if ( (! get_is_rx_thread_enabled()) ) {
             return (m_max_cores - 1 );
-        }else{
+        } else {
             return (m_max_cores - BP_MASTER_AND_LATENCY );
         }
     }
@@ -2662,14 +2654,14 @@ public:
     uint32_t    m_max_queues_per_port;
     uint32_t    m_cores_to_dual_ports; /* number of ports that will handle dual ports */
     uint16_t    m_latency_tx_queue_id;
-    // statistic 
+    // statistic
     CPPSMeasure  m_cps;
-    float        m_expected_pps;                
-    float        m_expected_cps;                
-    float        m_expected_bps;//bps           
+    float        m_expected_pps;
+    float        m_expected_cps;
+    float        m_expected_bps;//bps
     float        m_last_total_cps;
 
-    CPhyEthIF   m_ports[BP_MAX_PORTS];
+    CPhyEthIF   m_ports[TREX_MAX_PORTS];
     CCoreEthIF          m_cores_vif_sf[BP_MAX_CORES]; /* counted from 1 , 2,3 core zero is reserved - stateful */
     CCoreEthIFStateless m_cores_vif_sl[BP_MAX_CORES]; /* counted from 1 , 2,3 core zero is reserved - stateless*/
     CCoreEthIF *        m_cores_vif[BP_MAX_CORES];
@@ -2681,8 +2673,8 @@ public:
     CTrexGlobalIoMode   m_io_modes;
 
 private:
-    CLatencyHWPort      m_latency_vports[BP_MAX_PORTS];    /* read hardware driver */
-    CLatencyVmPort      m_latency_vm_vports[BP_MAX_PORTS]; /* vm driver */
+    CLatencyHWPort      m_latency_vports[TREX_MAX_PORTS];    /* read hardware driver */
+    CLatencyVmPort      m_latency_vm_vports[TREX_MAX_PORTS]; /* vm driver */
     CLatencyPktInfo     m_latency_pkt;
     TrexPublisher       m_zmq_publisher;
     CGlobalStats        m_stats;
@@ -2690,7 +2682,7 @@ private:
 
 public:
     TrexStateless       *m_trex_stateless;
-     
+
 };
 
 int  CGlobalTRex::reset_counters(){
@@ -2705,12 +2697,12 @@ int  CGlobalTRex::reset_counters(){
 
 /**
  * check for a single core
- * 
+ *
  * @author imarom (19-Nov-15)
- * 
- * @param thread_id 
+ *
+ * @param thread_id
  */
-void 
+void
 CGlobalTRex::check_for_dp_message_from_core(int thread_id) {
 
     CNodeRing *ring = CMsgIns::Ins()->getCpDp()->getRingDpToCp(thread_id);
@@ -2736,9 +2728,9 @@ CGlobalTRex::check_for_dp_message_from_core(int thread_id) {
 
 /**
  * check for messages that arrived from DP to CP
- * 
+ *
  */
-void 
+void
 CGlobalTRex::check_for_dp_messages() {
 
     /* for all the cores - check for a new message */
@@ -2771,7 +2763,7 @@ void CGlobalTRex::try_stop_all_dp(){
     send_message_all_dp(msg);
     delete msg;
     bool all_core_finished = false;
-    int i; 
+    int i;
     for (i=0; i<20; i++) {
         if ( is_all_cores_finished() ){
             all_core_finished =true;
@@ -2790,14 +2782,14 @@ void CGlobalTRex::try_stop_all_dp(){
 
 int  CGlobalTRex::send_message_all_dp(TrexStatelessCpToDpMsgBase *msg){
 
-        int max_threads=(int)CMsgIns::Ins()->getCpDp()->get_num_threads();
-        int i;
+    int max_threads=(int)CMsgIns::Ins()->getCpDp()->get_num_threads();
+    int i;
 
-        for (i=0; i<max_threads; i++) {
-            CNodeRing *ring = CMsgIns::Ins()->getCpDp()->getRingCpToDp((uint8_t)i);
-            ring->Enqueue((CGenNode*)msg->clone());
-        }
-        return (0);
+    for (i=0; i<max_threads; i++) {
+        CNodeRing *ring = CMsgIns::Ins()->getCpDp()->getRingCpToDp((uint8_t)i);
+        ring->Enqueue((CGenNode*)msg->clone());
+    }
+    return (0);
 }
 
 
@@ -2821,7 +2813,7 @@ int  CGlobalTRex::ixgbe_configure_mg(void){
     if ( latency_rate ) {
         mg_cfg.m_cps = (double)latency_rate ;
     }else{
-        mg_cfg.m_cps = 100.0;
+        mg_cfg.m_cps = 1.0;
     }
 
     if ( get_vm_one_queue_enable() ) {
@@ -2830,7 +2822,7 @@ int  CGlobalTRex::ixgbe_configure_mg(void){
 
             CMessagingManager * rx_dp=CMsgIns::Ins()->getRxDp();
 
-            uint8_t thread_id = (i>>1); 
+            uint8_t thread_id = (i>>1);
 
             CNodeRing * r = rx_dp->getRingCpToDp(thread_id);
             m_latency_vm_vports[i].Create((uint8_t)i,r,&m_mg);
@@ -2885,7 +2877,7 @@ int  CGlobalTRex::ixgbe_start(void){
             _if->set_rx_queue(0);
             _if->rx_queue_setup(0,
                                 RTE_TEST_RX_DESC_VM_DEFAULT,
-                                socket_id, 
+                                socket_id,
                                 &m_port_cfg.m_rx_conf,
                                 CGlobalInfo::m_mem_pool[socket_id].m_mbuf_pool_2048);
 
@@ -2893,15 +2885,15 @@ int  CGlobalTRex::ixgbe_start(void){
             for ( qid=0; qid<(m_max_queues_per_port); qid++) {
                 _if->tx_queue_setup((uint16_t)qid,
                                     RTE_TEST_TX_DESC_VM_DEFAULT ,
-                                    socket_id, 
+                                    socket_id,
                                     &m_port_cfg.m_tx_conf);
 
             }
 
         }else{
             _if->configure(2,
-                          m_cores_to_dual_ports+1,
-                          &m_port_cfg.m_port_conf);
+                           m_cores_to_dual_ports+1,
+                           &m_port_cfg.m_port_conf);
 
             /* the latency queue for latency measurement packets */
             m_latency_tx_queue_id= m_cores_to_dual_ports;
@@ -2913,7 +2905,7 @@ int  CGlobalTRex::ixgbe_start(void){
             /* drop queue */
             _if->rx_queue_setup(0,
                                 RTE_TEST_RX_DESC_DEFAULT,
-                                socket_id, 
+                                socket_id,
                                 &m_port_cfg.m_rx_conf,
                                 CGlobalInfo::m_mem_pool[socket_id].m_mbuf_pool_2048);
 
@@ -2923,7 +2915,7 @@ int  CGlobalTRex::ixgbe_start(void){
             /* latency measurement ring is 1 */
             _if->rx_queue_setup(1,
                                 RTE_TEST_RX_LATENCY_DESC_DEFAULT,
-                                socket_id, 
+                                socket_id,
                                 &m_port_cfg.m_rx_conf,
                                 CGlobalInfo::m_mem_pool[socket_id].m_mbuf_pool_9k);
 
@@ -2931,7 +2923,7 @@ int  CGlobalTRex::ixgbe_start(void){
             for ( qid=0; qid<(m_max_queues_per_port+1); qid++) {
                 _if->tx_queue_setup((uint16_t)qid,
                                     RTE_TEST_TX_DESC_DEFAULT ,
-                                    socket_id, 
+                                    socket_id,
                                     &m_port_cfg.m_tx_conf);
 
             }
@@ -2945,15 +2937,15 @@ int  CGlobalTRex::ixgbe_start(void){
         _if->configure_rx_drop_queue();
         _if->configure_rx_duplicate_rules();
 
-       if ( ! get_vm_one_queue_enable()  && ! CGlobalInfo::m_options.preview.get_is_disable_flow_control_setting() 
-           && get_ex_drv()->flow_control_disable_supported()) {
-          _if->disable_flow_control();
-       }
+        if ( ! get_vm_one_queue_enable()  && ! CGlobalInfo::m_options.preview.get_is_disable_flow_control_setting()
+             && get_ex_drv()->flow_control_disable_supported()) {
+            _if->disable_flow_control();
+        }
 
         _if->update_link_status();
 
         _if->dump_link(stdout);
-        
+
         _if->add_mac((char *)CGlobalInfo::m_options.get_src_mac_addr(i));
 
         fflush(stdout);
@@ -2965,7 +2957,7 @@ int  CGlobalTRex::ixgbe_start(void){
 
         if ( !is_all_links_are_up(true) ){
             rte_exit(EXIT_FAILURE, " "
-                    " one of the link is down \n");
+                     " one of the link is down \n");
         }
     } else {
         get_ex_drv()->wait_after_link_up();
@@ -2979,9 +2971,9 @@ int  CGlobalTRex::ixgbe_start(void){
 
     /* core 0 - control
        core 1 - port 0-0,1-0,
-       core 2 - port 2-0,3-0, 
-       core 3 - port 0-1,1-1, 
-       core 4 - port 2-1,3-1, 
+       core 2 - port 2-0,3-0,
+       core 3 - port 0-1,1-1,
+       core 4 - port 2-1,3-1,
 
     */
     int port_offset=0;
@@ -2994,16 +2986,16 @@ int  CGlobalTRex::ixgbe_start(void){
             m_cores_vif[j]=&m_cores_vif_sf[j];
         }
         m_cores_vif[j]->Create(j,
-                              queue_id,
-                              &m_ports[port_offset], /* 0,2*/
-                              queue_id,
-                              &m_ports[port_offset+1] /*1,3*/
-                              );
+                               queue_id,
+                               &m_ports[port_offset], /* 0,2*/
+                               queue_id,
+                               &m_ports[port_offset+1] /*1,3*/
+                               );
         port_offset+=2;
         if (port_offset == m_max_ports) {
             port_offset = 0;
-        }    
-     }
+        }
+    }
 
     fprintf(stdout," -------------------------------\n");
     CCoreEthIF::DumpIfCfgHeader(stdout);
@@ -3028,22 +3020,22 @@ bool CGlobalTRex::Create(){
         return (false);
     }
 
-   if ( pre_yaml_info.m_vlan_info.m_enable ){
-       CGlobalInfo::m_options.preview.set_vlan_mode_enable(true);
-   }
-   /* End update pre flags */
+    if ( pre_yaml_info.m_vlan_info.m_enable ){
+        CGlobalInfo::m_options.preview.set_vlan_mode_enable(true);
+    }
+    /* End update pre flags */
 
-   ixgbe_prob_init();
-   cores_prob_init();
-   queues_prob_init();
+    ixgbe_prob_init();
+    cores_prob_init();
+    queues_prob_init();
 
-   /* allocate rings */
-   assert( CMsgIns::Ins()->Create(get_cores_tx()) );
+    /* allocate rings */
+    assert( CMsgIns::Ins()->Create(get_cores_tx()) );
 
-   if ( sizeof(CGenNodeNatInfo) != sizeof(CGenNode)  ) {
-       printf("ERROR sizeof(CGenNodeNatInfo) %lu != sizeof(CGenNode) %lu must be the same size \n",sizeof(CGenNodeNatInfo),sizeof(CGenNode));
-       assert(0);
-   }
+    if ( sizeof(CGenNodeNatInfo) != sizeof(CGenNode)  ) {
+        printf("ERROR sizeof(CGenNodeNatInfo) %lu != sizeof(CGenNode) %lu must be the same size \n",sizeof(CGenNodeNatInfo),sizeof(CGenNode));
+        assert(0);
+    }
 
     if ( sizeof(CGenNodeLatencyPktInfo) != sizeof(CGenNode)  ) {
         printf("ERROR sizeof(CGenNodeLatencyPktInfo) %lu != sizeof(CGenNode) %lu must be the same size \n",sizeof(CGenNodeLatencyPktInfo),sizeof(CGenNode));
@@ -3052,36 +3044,36 @@ bool CGlobalTRex::Create(){
 
     /* allocate the memory */
 
-   uint32_t rx_mbuf = 0 ;
+    uint32_t rx_mbuf = 0 ;
 
-   if ( get_vm_one_queue_enable() ) {
+    if ( get_vm_one_queue_enable() ) {
         rx_mbuf = (m_max_ports * RTE_TEST_RX_DESC_VM_DEFAULT);
-   }else{
+    }else{
         rx_mbuf = (m_max_ports * (RTE_TEST_RX_LATENCY_DESC_DEFAULT+RTE_TEST_RX_DESC_DEFAULT));
-   }
+    }
 
-   CGlobalInfo::init_pools(rx_mbuf);
-   ixgbe_start();
-   dump_config(stdout);
+    CGlobalInfo::init_pools(rx_mbuf);
+    ixgbe_start();
+    dump_config(stdout);
 
-   /* start stateless */
-   if (get_is_stateless()) {
+    /* start stateless */
+    if (get_is_stateless()) {
 
-       TrexStatelessCfg cfg;
+        TrexStatelessCfg cfg;
 
-       TrexRpcServerConfig rpc_req_resp_cfg(TrexRpcServerConfig::RPC_PROT_TCP, global_platform_cfg_info.m_zmq_rpc_port);
+        TrexRpcServerConfig rpc_req_resp_cfg(TrexRpcServerConfig::RPC_PROT_TCP, global_platform_cfg_info.m_zmq_rpc_port);
 
-       cfg.m_port_count         = CGlobalInfo::m_options.m_expected_portd;
-       cfg.m_rpc_req_resp_cfg   = &rpc_req_resp_cfg;
-       cfg.m_rpc_server_verbose = false;
-       cfg.m_platform_api       = new TrexDpdkPlatformApi();
-       cfg.m_publisher          = &m_zmq_publisher;
-       cfg.m_global_lock        = &m_cp_lock;
+        cfg.m_port_count         = CGlobalInfo::m_options.m_expected_portd;
+        cfg.m_rpc_req_resp_cfg   = &rpc_req_resp_cfg;
+        cfg.m_rpc_server_verbose = false;
+        cfg.m_platform_api       = new TrexDpdkPlatformApi();
+        cfg.m_publisher          = &m_zmq_publisher;
+        cfg.m_global_lock        = &m_cp_lock;
 
-       m_trex_stateless = new TrexStateless(cfg);
-   }
+        m_trex_stateless = new TrexStateless(cfg);
+    }
 
-   return (true);
+    return (true);
 
 }
 void CGlobalTRex::Delete(){
@@ -3092,9 +3084,9 @@ void CGlobalTRex::Delete(){
 
 int  CGlobalTRex::ixgbe_prob_init(void){
 
-       m_max_ports  = rte_eth_dev_count();
-       if (m_max_ports == 0)
-               rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n");
+    m_max_ports  = rte_eth_dev_count();
+    if (m_max_ports == 0)
+        rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n");
 
     printf(" Number of ports found: %d \n",m_max_ports);
 
@@ -3103,8 +3095,8 @@ int  CGlobalTRex::ixgbe_prob_init(void){
                  m_max_ports);
     }
 
-    if ( CGlobalInfo::m_options.get_expected_ports() >BP_MAX_PORTS ){
-        rte_exit(EXIT_FAILURE, " Maximum ports supported are %d, use the configuration file to set the expected number of ports   \n",BP_MAX_PORTS);
+    if ( CGlobalInfo::m_options.get_expected_ports() > TREX_MAX_PORTS ) {
+        rte_exit(EXIT_FAILURE, " Maximum ports supported are %d, use the configuration file to set the expected number of ports   \n",TREX_MAX_PORTS);
     }
 
     if ( CGlobalInfo::m_options.get_expected_ports() > m_max_ports ){
@@ -3116,7 +3108,7 @@ int  CGlobalTRex::ixgbe_prob_init(void){
         /* limit the number of ports */
         m_max_ports=CGlobalInfo::m_options.get_expected_ports();
     }
-    assert(m_max_ports <= BP_MAX_PORTS);
+    assert(m_max_ports <= TREX_MAX_PORTS);
 
     struct rte_eth_dev_info dev_info;
     rte_eth_dev_info_get((uint8_t) 0,&dev_info);
@@ -3188,23 +3180,23 @@ int  CGlobalTRex::queues_prob_init(){
 
     m_cores_to_dual_ports  = m_cores_mul;
 
-    /* core 0 - control 
+    /* core 0 - control
        -core 1 - port 0/1
        -core 2 - port 2/3
        -core 3 - port 0/1
        -core 4 - port 2/3
 
        m_cores_to_dual_ports = 2;
-     */
-    
+    */
+
     /* number of queue - 1 per core for dual ports*/
     m_max_queues_per_port  = m_cores_to_dual_ports;
 
     if (m_max_queues_per_port > BP_MAX_TX_QUEUE) {
-        rte_exit(EXIT_FAILURE, 
-         "maximum number of queue should be maximum %d  \n",BP_MAX_TX_QUEUE);
+        rte_exit(EXIT_FAILURE,
+                 "maximum number of queue should be maximum %d  \n",BP_MAX_TX_QUEUE);
     }
-    
+
     assert(m_max_queues_per_port>0);
     return (0);
 }
@@ -3245,7 +3237,7 @@ void CGlobalTRex::dump_post_test_stats(FILE *fd){
         pkt_out +=_if->get_stats().opackets;
         pkt_out_bytes +=_if->get_stats().obytes;
     }
-    if ( !CGlobalInfo::m_options.is_latency_disabled() ){
+    if ( CGlobalInfo::m_options.is_latency_enabled() ){
         sw_pkt_out += m_mg.get_total_pkt();
         sw_pkt_out_bytes +=m_mg.get_total_bytes();
     }
@@ -3253,13 +3245,13 @@ void CGlobalTRex::dump_post_test_stats(FILE *fd){
 
     fprintf (fd," summary stats \n");
     fprintf (fd," -------------- \n");
-    
+
     if (pkt_in > pkt_out)
-    {
-        fprintf (fd, " Total-pkt-drop       : 0 pkts \n");
-        if (pkt_in > pkt_out * 1.01)
-            fprintf (fd, " Warning : number of rx packets exceeds 101%% of tx packets!\n");
-    }
+        {
+            fprintf (fd, " Total-pkt-drop       : 0 pkts \n");
+            if (pkt_in > pkt_out * 1.01)
+                fprintf (fd, " Warning : number of rx packets exceeds 101%% of tx packets!\n");
+        }
     else
         fprintf (fd, " Total-pkt-drop       : %llu pkts \n", (unsigned long long) (pkt_out - pkt_in));
     fprintf (fd," Total-tx-bytes       : %llu bytes \n", (unsigned long long)pkt_out_bytes);
@@ -3274,7 +3266,7 @@ void CGlobalTRex::dump_post_test_stats(FILE *fd){
     fprintf (fd," Total-sw-err         : %llu pkts \n", (unsigned long long)sw_pkt_out_err);
 
 
-    if ( !CGlobalInfo::m_options.is_latency_disabled() ){
+    if ( CGlobalInfo::m_options.is_latency_enabled() ){
         fprintf (fd," maximum-latency   : %.0f usec \n",m_mg.get_max_latency());
         fprintf (fd," average-latency   : %.0f usec \n",m_mg.get_avr_latency());
         fprintf (fd," latency-any-error : %s  \n",m_mg.is_any_error()?"ERROR":"OK");
@@ -3340,17 +3332,17 @@ void CGlobalTRex::get_stats(CGlobalStats & stats){
         CPhyEthIFStats & st =_if->get_stats();
 
         stp->opackets = st.opackets;
-        stp->obytes   = st.obytes;     
-        stp->ipackets = st.ipackets; 
+        stp->obytes   = st.obytes;
+        stp->ipackets = st.ipackets;
         stp->ibytes   = st.ibytes;
         stp->ierrors  = st.ierrors;
-        stp->oerrors  = st.oerrors;    
+        stp->oerrors  = st.oerrors;
         stp->m_total_tx_bps = _if->get_last_tx_rate()*_1Mb_DOUBLE;
         stp->m_total_tx_pps = _if->get_last_tx_pps_rate();
         stp->m_total_rx_bps = _if->get_last_rx_rate()*_1Mb_DOUBLE;
         stp->m_total_rx_pps = _if->get_last_rx_pps_rate();
 
-        stats.m_total_tx_pkts  += st.opackets; 
+        stats.m_total_tx_pkts  += st.opackets;
         stats.m_total_rx_pkts  += st.ipackets;
         stats.m_total_tx_bytes += st.obytes;
         stats.m_total_rx_bytes += st.ibytes;
@@ -3388,12 +3380,12 @@ void CGlobalTRex::get_stats(CGlobalStats & stats){
         total_active_flows += (lpt->m_stats.m_total_open_flows-lpt->m_stats.m_total_close_flows) ;
 
         stats.m_total_alloc_error += lpt->m_node_gen.m_v_if->m_stats[0].m_tx_alloc_error+
-                               lpt->m_node_gen.m_v_if->m_stats[1].m_tx_alloc_error;
+            lpt->m_node_gen.m_v_if->m_stats[1].m_tx_alloc_error;
         stats.m_total_queue_full +=lpt->m_node_gen.m_v_if->m_stats[0].m_tx_queue_full+
-                               lpt->m_node_gen.m_v_if->m_stats[1].m_tx_queue_full;
+            lpt->m_node_gen.m_v_if->m_stats[1].m_tx_queue_full;
 
         stats.m_total_queue_drop +=lpt->m_node_gen.m_v_if->m_stats[0].m_tx_drop+
-                               lpt->m_node_gen.m_v_if->m_stats[1].m_tx_drop;
+            lpt->m_node_gen.m_v_if->m_stats[1].m_tx_drop;
 
         stats.m_template.Add(&lpt->m_node_gen.m_v_if->m_stats[0].m_template);
         stats.m_template.Add(&lpt->m_node_gen.m_v_if->m_stats[1].m_template);
@@ -3433,7 +3425,7 @@ void CGlobalTRex::get_stats(CGlobalStats & stats){
     } else {
         stats.m_socket_util = 0;
     }
-    
+
 
 
     float drop_rate=total_tx-total_rx;
@@ -3501,27 +3493,27 @@ void CGlobalTRex::dump_stats(FILE *fd, CGlobalStats::DumpFormat format){
     if (format==CGlobalStats::dmpTABLE) {
         if ( m_io_modes.m_g_mode == CTrexGlobalIoMode::gNORMAL ){
             switch (m_io_modes.m_pp_mode ){
-                case CTrexGlobalIoMode::ppDISABLE:
-                    fprintf(fd,"\n+Per port stats disabled \n");
-                    break;
-                case CTrexGlobalIoMode::ppTABLE:
-                    fprintf(fd,"\n-Per port stats table \n");
-                    m_stats.Dump(fd,CGlobalStats::dmpTABLE);
-                    break;
-                case CTrexGlobalIoMode::ppSTANDARD:
-                    fprintf(fd,"\n-Per port stats - standard\n");
-                    m_stats.Dump(fd,CGlobalStats::dmpSTANDARD);
-                    break;
+            case CTrexGlobalIoMode::ppDISABLE:
+                fprintf(fd,"\n+Per port stats disabled \n");
+                break;
+            case CTrexGlobalIoMode::ppTABLE:
+                fprintf(fd,"\n-Per port stats table \n");
+                m_stats.Dump(fd,CGlobalStats::dmpTABLE);
+                break;
+            case CTrexGlobalIoMode::ppSTANDARD:
+                fprintf(fd,"\n-Per port stats - standard\n");
+                m_stats.Dump(fd,CGlobalStats::dmpSTANDARD);
+                break;
             };
 
             switch (m_io_modes.m_ap_mode ){
-                case   CTrexGlobalIoMode::apDISABLE:
-                    fprintf(fd,"\n+Global stats disabled \n");
-                    break;
-                case   CTrexGlobalIoMode::apENABLE:
-                    fprintf(fd,"\n-Global stats enabled \n");
-                    m_stats.DumpAllPorts(fd);
-                    break;
+            case   CTrexGlobalIoMode::apDISABLE:
+                fprintf(fd,"\n+Global stats disabled \n");
+                break;
+            case   CTrexGlobalIoMode::apENABLE:
+                fprintf(fd,"\n-Global stats enabled \n");
+                m_stats.DumpAllPorts(fd);
+                break;
             };
         }
     }else{
@@ -3529,60 +3521,57 @@ void CGlobalTRex::dump_stats(FILE *fd, CGlobalStats::DumpFormat format){
         m_stats.Dump(fd,format);
         m_stats.DumpAllPorts(fd);
     }
-    
-}
 
+}
 
-void 
+void
 CGlobalTRex::publish_async_data(bool sync_now) {
-     std::string json;
+    std::string json;
 
-     /* refactor to update, dump, and etc. */
-     if (sync_now) {
-         update_stats();
-         get_stats(m_stats);
-     }
+    /* refactor to update, dump, and etc. */
+    if (sync_now) {
+        update_stats();
+        get_stats(m_stats);
+    }
+
+    m_stats.dump_json(json);
+    m_zmq_publisher.publish_json(json);
 
-     m_stats.dump_json(json);
-     m_zmq_publisher.publish_json(json);
+    /* generator json , all cores are the same just sample the first one */
+    m_fl.m_threads_info[0]->m_node_gen.dump_json(json);
+    m_zmq_publisher.publish_json(json);
 
-     /* generator json , all cores are the same just sample the first one */
-     m_fl.m_threads_info[0]->m_node_gen.dump_json(json);
-     m_zmq_publisher.publish_json(json);
 
-        
-     if ( !get_is_stateless() ){
-         dump_template_info(json);
-         m_zmq_publisher.publish_json(json);
-     }
+    if ( !get_is_stateless() ){
+        dump_template_info(json);
+        m_zmq_publisher.publish_json(json);
+    }
 
-     if ( get_is_rx_check_mode() ) {
-         m_mg.rx_check_dump_json(json );
-         m_zmq_publisher.publish_json(json);
-     }
+    if ( get_is_rx_check_mode() ) {
+        m_mg.rx_check_dump_json(json );
+        m_zmq_publisher.publish_json(json);
+    }
 
-     /* backward compatible */
-     m_mg.dump_json(json );
-     m_zmq_publisher.publish_json(json);
+    /* backward compatible */
+    m_mg.dump_json(json );
+    m_zmq_publisher.publish_json(json);
 
-     /* more info */
-     m_mg.dump_json_v2(json );
-     m_zmq_publisher.publish_json(json);
+    /* more info */
+    m_mg.dump_json_v2(json );
+    m_zmq_publisher.publish_json(json);
 
-     if (get_is_stateless()) {
-         if (m_trex_stateless->m_rx_flow_stat.dump_json(json))
-             m_zmq_publisher.publish_json(json);
-     }
+    if (get_is_stateless()) {
+        if (m_trex_stateless->m_rx_flow_stat.dump_json(json))
+            m_zmq_publisher.publish_json(json);
+    }
 }
 
-void 
+void
 CGlobalTRex::publish_async_barrier(uint32_t key) {
     m_zmq_publisher.publish_barrier(key);
 }
 
 int CGlobalTRex::run_in_master() {
-    
-   
     bool was_stopped=false;
 
     if ( get_is_stateless() ) {
@@ -3620,7 +3609,7 @@ int CGlobalTRex::run_in_master() {
             }
         }
 
-        
+
         if (m_io_modes.m_g_mode == CTrexGlobalIoMode::gHELP ) {
             m_io_modes.DumpHelp(stdout);
         }
@@ -3628,17 +3617,17 @@ int CGlobalTRex::run_in_master() {
         dump_stats(stdout,CGlobalStats::dmpTABLE);
 
         if (m_io_modes.m_g_mode == CTrexGlobalIoMode::gNORMAL ) {
-               fprintf (stdout," current time    : %.1f sec  \n",now_sec());
-               float d= CGlobalInfo::m_options.m_duration - now_sec();
-               if (d<0) {
-                       d=0;
-    
-               }
-               fprintf (stdout," test duration   : %.1f sec  \n",d);
+            fprintf (stdout," current time    : %.1f sec  \n",now_sec());
+            float d= CGlobalInfo::m_options.m_duration - now_sec();
+            if (d<0) {
+                d=0;
+
+            }
+            fprintf (stdout," test duration   : %.1f sec  \n",d);
         }
 
 
-        if ( !CGlobalInfo::m_options.is_latency_disabled() ){
+        if ( CGlobalInfo::m_options.is_rx_enabled() ){
             m_mg.update();
 
             if ( m_io_modes.m_g_mode ==  CTrexGlobalIoMode::gNORMAL ){
@@ -3656,28 +3645,25 @@ int CGlobalTRex::run_in_master() {
                     break;
                 }
 
-             if ( get_is_rx_check_mode() ) {
+                if ( get_is_rx_check_mode() ) {
 
-                switch (m_io_modes.m_rc_mode) {
-                case CTrexGlobalIoMode::rcDISABLE:
-                    fprintf(stdout,"\n+Rx Check stats disabled \n");
-                    break;
-                case CTrexGlobalIoMode::rcENABLE:
-                    fprintf(stdout,"\n-Rx Check stats enabled \n");
-                    m_mg.DumpShortRxCheck(stdout);
-                    break;
-                case CTrexGlobalIoMode::rcENABLE_Extended:
-                    fprintf(stdout,"\n-Rx Check stats enhanced \n");
-                    m_mg.DumpRxCheck(stdout);
-                    break;
-                }
+                    switch (m_io_modes.m_rc_mode) {
+                    case CTrexGlobalIoMode::rcDISABLE:
+                        fprintf(stdout,"\n+Rx Check stats disabled \n");
+                        break;
+                    case CTrexGlobalIoMode::rcENABLE:
+                        fprintf(stdout,"\n-Rx Check stats enabled \n");
+                        m_mg.DumpShortRxCheck(stdout);
+                        break;
+                    case CTrexGlobalIoMode::rcENABLE_Extended:
+                        fprintf(stdout,"\n-Rx Check stats enhanced \n");
+                        m_mg.DumpRxCheck(stdout);
+                        break;
+                    }
 
-              }/* ex checked */
+                }
 
             }
-
-          
-
         }
 
         /* publish data */
@@ -3714,10 +3700,11 @@ int CGlobalTRex::run_in_master() {
 
 
 
-int CGlobalTRex::run_in_laterncy_core(void){
-    if ( !CGlobalInfo::m_options.is_latency_disabled() ){
+int CGlobalTRex::run_in_rx_core(void){
+    if ( CGlobalInfo::m_options.is_rx_enabled() ){
         m_mg.start(0);
     }
+    // ??? start stateless rx
     return (0);
 }
 
@@ -3730,8 +3717,8 @@ int CGlobalTRex::stop_core(virtual_thread_id_t virt_core_id){
 int CGlobalTRex::run_in_core(virtual_thread_id_t virt_core_id){
 
     CPreviewMode *lp=&CGlobalInfo::m_options.preview;
-    if ( lp->getSingleCore() && 
-         (virt_core_id==2 ) && 
+    if ( lp->getSingleCore() &&
+         (virt_core_id==2 ) &&
          (lp-> getCores() ==1) ){
         printf(" bypass this core \n");
         m_signal[virt_core_id]=1;
@@ -3770,7 +3757,7 @@ int CGlobalTRex::stop_master(){
 
     CFlowGenListPerThread   * lpt;
     uint64_t total_tx_rx_check=0;
-    
+
     int i;
     for (i=0; i<get_cores_tx(); i++) {
         lpt = m_fl.m_threads_info[i];
@@ -3779,7 +3766,7 @@ int CGlobalTRex::stop_master(){
         erf_vif->DumpCoreStats(stdout);
         erf_vif->DumpIfStats(stdout);
         total_tx_rx_check+=erf_vif->m_stats[CLIENT_SIDE].m_tx_rx_check_pkt+
-                           erf_vif->m_stats[SERVER_SIDE].m_tx_rx_check_pkt;
+            erf_vif->m_stats[SERVER_SIDE].m_tx_rx_check_pkt;
     }
 
     fprintf(stdout," ==================\n");
@@ -3790,7 +3777,7 @@ int CGlobalTRex::stop_master(){
         lpt->m_node_gen.DumpHist(stdout);
         lpt->DumpStats(stdout);
     }
-    if ( !CGlobalInfo::m_options.is_latency_disabled() ){
+    if ( CGlobalInfo::m_options.is_latency_enabled() ){
         fprintf(stdout," ==================\n");
         fprintf(stdout," latency \n");
         fprintf(stdout," ==================\n");
@@ -3800,7 +3787,7 @@ int CGlobalTRex::stop_master(){
         m_mg.DumpRxCheck(stdout);
         m_mg.DumpRxCheckVerification(stdout,total_tx_rx_check);
     }
-    
+
     dump_stats(stdout,CGlobalStats::dmpSTANDARD);
     dump_post_test_stats(stdout);
     m_fl.Delete();
@@ -3858,9 +3845,9 @@ int CGlobalTRex::start_master_statefull() {
     } else {
         m_fl.m_mac_info.set_configured(false);
     }
-    m_expected_pps = m_fl.get_total_pps();     
-    m_expected_cps = 1000.0*m_fl.get_total_kcps();               
+
+    m_expected_pps = m_fl.get_total_pps();
+    m_expected_cps = 1000.0*m_fl.get_total_kcps();
     m_expected_bps = m_fl.get_total_tx_bps();
     if ( m_fl.get_total_repeat_flows() > 2000) {
         /* disable flows cache */
@@ -3872,14 +3859,14 @@ int CGlobalTRex::start_master_statefull() {
     m_mg.set_ip( tg->m_client_pool[0].get_ip_start(),
                  tg->m_server_pool[0].get_ip_start(),
                  tg->m_client_pool[0].getDualMask()
-               );
+                 );
 
     if (  CGlobalInfo::m_options.preview.getVMode() >0 ) {
-      m_fl.DumpCsv(stdout);
-      for (i=0; i<100; i++) {
-        fprintf(stdout,"\n");
-      }
-      fflush(stdout);
+        m_fl.DumpCsv(stdout);
+        for (i=0; i<100; i++) {
+            fprintf(stdout,"\n");
+        }
+        fflush(stdout);
     }
 
     m_fl.generate_p_thread_info(get_cores_tx());
@@ -3924,7 +3911,7 @@ int CPhyEthIF::reset_hw_flow_stats() {
 // reset - If true, reset counter value after reading
 int CPhyEthIF::get_flow_stats(uint64_t *rx_stats, tx_per_flow_t *tx_stats, int min, int max, bool reset) {
     uint32_t diff_stats[MAX_FLOW_STATS];
-    
+
     if (get_ex_drv()->get_rx_stats(this, diff_stats, m_stats.m_fdir_prev_stats, min, max) < 0) {
         return -1;
     }
@@ -3950,7 +3937,7 @@ int CPhyEthIF::get_flow_stats(uint64_t *rx_stats, tx_per_flow_t *tx_stats, int m
             }
         }
     }
-    
+
     return 0;
 }
 
@@ -3972,7 +3959,7 @@ bool CCoreEthIF::process_rx_pkt(pkt_dir_t   dir,
             uint8_t max_ttl = 0xff - get_rx_check_hops();
             uint8_t pkt_ttl = parser.getTTl();
             if ( (pkt_ttl==max_ttl) || (pkt_ttl==(max_ttl-1) ) ) {
-               send=true;
+                send=true;
             }
         }
     }
@@ -3991,15 +3978,15 @@ bool CCoreEthIF::process_rx_pkt(pkt_dir_t   dir,
                 send=false;
             }
 
-            #ifdef LATENCY_QUEUE_TRACE_
+#ifdef LATENCY_QUEUE_TRACE_
             printf("rx to cp --\n");
             rte_pktmbuf_dump(stdout,m, rte_pktmbuf_pkt_len(m));
-            #endif
+#endif
         }else{
             send=false;
         }
     }
-   return (send);
+    return (send);
 }
 
 
@@ -4013,8 +4000,8 @@ static int latency_one_lcore(__attribute__((unused)) void *dummy)
     physical_thread_id_t  phy_id =rte_lcore_id();
 
 
-    if ( lpsock->thread_phy_is_latency( phy_id )  ){
-        g_trex.run_in_laterncy_core();
+    if ( lpsock->thread_phy_is_rx(phy_id) ) {
+        g_trex.run_in_rx_core();
     }else{
 
         if ( lpsock->thread_phy_is_master( phy_id ) ) {
@@ -4026,7 +4013,7 @@ static int latency_one_lcore(__attribute__((unused)) void *dummy)
             g_trex.m_signal[ lpsock->thread_phy_to_virt( phy_id ) ]=1;
         }
     }
-       return 0;
+    return 0;
 }
 
 
@@ -4037,8 +4024,8 @@ static int slave_one_lcore(__attribute__((unused)) void *dummy)
     physical_thread_id_t  phy_id =rte_lcore_id();
 
 
-    if ( lpsock->thread_phy_is_latency( phy_id )  ){
-        g_trex.run_in_laterncy_core();
+    if ( lpsock->thread_phy_is_rx(phy_id) ) {
+        g_trex.run_in_rx_core();
     }else{
         if ( lpsock->thread_phy_is_master( phy_id ) ) {
             g_trex.run_in_master();
@@ -4047,7 +4034,7 @@ static int slave_one_lcore(__attribute__((unused)) void *dummy)
             g_trex.run_in_core( lpsock->thread_phy_to_virt( phy_id ) );
         }
     }
-       return 0;
+    return 0;
 }
 
 
@@ -4061,7 +4048,7 @@ uint32_t get_cores_mask(uint32_t cores,int offset){
     for (i=0; i<(cores-1); i++) {
         res |= mask ;
         mask = mask <<1;
-   }
+    }
     return (res);
 }
 
@@ -4080,7 +4067,7 @@ int update_global_info_from_platform_file(){
 
     CGlobalInfo::m_socket.Create(&cg->m_platform);
 
-    
+
     if (!cg->m_info_exist) {
         /* nothing to do ! */
         return 0;
@@ -4107,8 +4094,8 @@ int update_global_info_from_platform_file(){
 
         int port_size=cg->m_mac_info.size();
 
-        if ( port_size > BP_MAX_PORTS ){
-            port_size = BP_MAX_PORTS;
+        if ( port_size > TREX_MAX_PORTS ){
+            port_size = TREX_MAX_PORTS;
         }
         for (i=0; i<port_size; i++){
             cg->m_mac_info[i].copy_src(( char *)CGlobalInfo::m_options.m_mac_addr[i].u.m_mac.src)   ;
@@ -4127,7 +4114,7 @@ int update_global_info_from_platform_file(){
 
     CGlobalInfo::m_memory_cfg.set(cg->m_memory,mul);
     CGlobalInfo::m_memory_cfg.set_number_of_dp_cors(
-    CGlobalInfo::m_options.get_number_of_dp_cores_needed() );
+                                                    CGlobalInfo::m_options.get_number_of_dp_cores_needed() );
     return (0);
 }
 
@@ -4137,21 +4124,21 @@ int core_mask_calc() {
     uint32_t mask = 0;
     int lcore_id;
 
-       for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
-           if (eal_cpu_detected(lcore_id)) {
-               mask |= (1 << lcore_id);
-           }
-       }
+    for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
+        if (eal_cpu_detected(lcore_id)) {
+            mask |= (1 << lcore_id);
+        }
+    }
 
-       return mask;
+    return mask;
 }
 
 // Return number of set bits in i
 uint32_t num_set_bits(uint32_t i)
 {
-     i = i - ((i >> 1) & 0x55555555);
-     i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
-     return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
+    i = i - ((i >> 1) & 0x55555555);
+    i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
+    return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
 }
 
 // sanity check if the cores we want to use really exist
@@ -4163,17 +4150,17 @@ int core_mask_sanity(uint32_t wanted_core_mask) {
     calc_core_num = num_set_bits(calc_core_mask);
 
     if (wanted_core_num > calc_core_num) {
-       printf("Error: You have %d threads available, but you asked for %d threads.\n", calc_core_num, wanted_core_num);
-       printf("       Calculation is: -c <num>(%d) * dual ports (%d) + 1 master thread %s"
-              , CGlobalInfo::m_options.preview.getCores(), CGlobalInfo::m_options.get_expected_dual_ports()
-              , get_is_latency_thread_enable() ? "+1 latency thread (because of -l flag)\n" : "\n");
-       printf("       Maybe try smaller -c <num>.\n");
-       return -1;
+        printf("Error: You have %d threads available, but you asked for %d threads.\n", calc_core_num, wanted_core_num);
+        printf("       Calculation is: -c <num>(%d) * dual ports (%d) + 1 master thread %s"
+               , CGlobalInfo::m_options.preview.getCores(), CGlobalInfo::m_options.get_expected_dual_ports()
+               , get_is_rx_thread_enabled() ? "+1 latency thread (because of -l flag)\n" : "\n");
+        printf("       Maybe try smaller -c <num>.\n");
+        return -1;
     }
 
     if (wanted_core_mask != (wanted_core_mask & calc_core_mask)) {
-       printf ("Serious error: Something is wrong with the hardware. Wanted core mask is %x. Existing core mask is %x\n", wanted_core_mask, calc_core_mask);
-       return -1;
+        printf ("Serious error: Something is wrong with the hardware. Wanted core mask is %x. Existing core mask is %x\n", wanted_core_mask, calc_core_mask);
+        return -1;
     }
 
     return 0;
@@ -4184,7 +4171,7 @@ int  update_dpdk_args(void){
     CPlatformSocketInfo * lpsock=&CGlobalInfo::m_socket;
     CParserOption * lpop= &CGlobalInfo::m_options;
 
-    lpsock->set_latency_thread_is_enabled(get_is_latency_thread_enable());
+    lpsock->set_rx_thread_is_enabled(get_is_rx_thread_enabled());
     lpsock->set_number_of_threads_per_ports(lpop->preview.getCores() );
     lpsock->set_number_of_dual_ports(lpop->get_expected_dual_ports());
     if ( !lpsock->sanity_check() ){
@@ -4198,7 +4185,7 @@ int  update_dpdk_args(void){
 
     sprintf(global_cores_str,"0x%llx",(unsigned long long)lpsock->get_cores_mask());
     if (core_mask_sanity(strtol(global_cores_str, NULL, 16)) < 0) {
-       return -1;
+        return -1;
     }
 
     /* set the DPDK options */
@@ -4245,7 +4232,7 @@ int  update_dpdk_args(void){
 
     if ( CGlobalInfo::m_options.preview.getVMode() > 0  ) {
         printf("args \n");
-        int i; 
+        int i;
         for (i=0; i<global_dpdk_args_num; i++) {
             printf(" %s \n",global_dpdk_args[i]);
         }
@@ -4303,7 +4290,7 @@ int main_test(int argc , char * argv[]){
     /* It is not a mistake. Give the user higher priorty over the configuration file */
     parse_options(argc, argv, &CGlobalInfo::m_options ,false);
 
-    
+
     if ( CGlobalInfo::m_options.preview.getVMode() > 0){
         CGlobalInfo::m_options.dump(stdout);
         CGlobalInfo::m_memory_cfg.Dump(stdout);
@@ -4321,7 +4308,7 @@ int main_test(int argc , char * argv[]){
         rte_set_log_level(1);
 
     }
-    uid_t uid; 
+    uid_t uid;
     uid = geteuid ();
     if ( uid != 0 ) {
         printf("ERROR you must run with superuser priviliges \n");
@@ -4340,8 +4327,8 @@ int main_test(int argc , char * argv[]){
     }
 
     time_init();
-    
-        /* check if we are in simulation mode */
+
+    /* check if we are in simulation mode */
     if ( CGlobalInfo::m_options.out_file != "" ){
         printf(" t-rex simulation mode into %s \n",CGlobalInfo::m_options.out_file.c_str());
         return ( sim_load_list_of_cap_files(&CGlobalInfo::m_options) );
@@ -4351,17 +4338,17 @@ int main_test(int argc , char * argv[]){
         exit(1);
     }
 
-    if (po->preview.get_is_rx_check_enable() &&  (po->m_rx_check_sampe< get_min_sample_rate()) ) {
-        po->m_rx_check_sampe = get_min_sample_rate();
+    if (po->preview.get_is_rx_check_enable() &&  (po->m_rx_check_sample< get_min_sample_rate()) ) {
+        po->m_rx_check_sample = get_min_sample_rate();
         printf("Warning:rx check sample rate should not be lower than %d. Setting it to %d\n",get_min_sample_rate(),get_min_sample_rate());
     }
 
     /* set dump mode */
     g_trex.m_io_modes.set_mode((CTrexGlobalIoMode::CliDumpMode)CGlobalInfo::m_options.m_io_mode);
 
-    if ( !CGlobalInfo::m_options.is_latency_disabled() 
-         && (CGlobalInfo::m_options.m_latency_prev>0)  ){
-        uint32_t pkts = CGlobalInfo::m_options.m_latency_prev*
+    if ( CGlobalInfo::m_options.is_latency_enabled()
+         && (CGlobalInfo::m_options.m_latency_prev > 0)) {
+        uint32_t pkts = CGlobalInfo::m_options.m_latency_prev *
             CGlobalInfo::m_options.m_latency_rate;
         printf("Start prev latency check- for %d sec \n",CGlobalInfo::m_options.m_latency_prev);
         g_trex.m_mg.start(pkts);
@@ -4417,7 +4404,7 @@ int main_test(int argc , char * argv[]){
 
 //////////////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////////////
-// driver section 
+// driver section
 //////////////////////////////////////////////////////////////////////////////////////////////
 int CTRexExtendedDriverBase::configure_drop_queue(CPhyEthIF * _if) {
     uint8_t port_id=_if->get_rte_port_id();
@@ -4425,16 +4412,16 @@ int CTRexExtendedDriverBase::configure_drop_queue(CPhyEthIF * _if) {
 }
 
 void wait_x_sec(int sec) {
-        int i; 
-        printf(" wait %d sec ", sec);
-        fflush(stdout);
-        for (i=0; i<sec; i++) {
-            delay(1000);
-            printf(".");
-            fflush(stdout);
-        }
-        printf("\n");
+    int i;
+    printf(" wait %d sec ", sec);
+    fflush(stdout);
+    for (i=0; i<sec; i++) {
+        delay(1000);
+        printf(".");
         fflush(stdout);
+    }
+    printf("\n");
+    fflush(stdout);
 }
 
 // in 1G we need to wait if links became ready to soon
@@ -4449,9 +4436,9 @@ int CTRexExtendedDriverBase1G::wait_for_stable_link(){
 
 void CTRexExtendedDriverBase1G::update_configuration(port_cfg_t * cfg){
 
-        cfg->m_tx_conf.tx_thresh.pthresh = TX_PTHRESH_1G;
-        cfg->m_tx_conf.tx_thresh.hthresh = TX_HTHRESH;
-        cfg->m_tx_conf.tx_thresh.wthresh = 0;
+    cfg->m_tx_conf.tx_thresh.pthresh = TX_PTHRESH_1G;
+    cfg->m_tx_conf.tx_thresh.hthresh = TX_HTHRESH;
+    cfg->m_tx_conf.tx_thresh.wthresh = 0;
 }
 
 void CTRexExtendedDriverBase1G::update_global_config_fdir(port_cfg_t * cfg){
@@ -4478,7 +4465,7 @@ int CTRexExtendedDriverBase1G::configure_rx_filter_rules(CPhyEthIF * _if){
 
 int CTRexExtendedDriverBase1G::configure_rx_filter_rules_statefull(CPhyEthIF * _if) {
     uint16_t hops = get_rx_check_hops();
-    uint16_t v4_hops = (hops << 8)&0xff00; 
+    uint16_t v4_hops = (hops << 8)&0xff00;
     uint8_t protocol;
 
     if (CGlobalInfo::m_options.m_l_pkt_mode == 0) {
@@ -4490,82 +4477,82 @@ int CTRexExtendedDriverBase1G::configure_rx_filter_rules_statefull(CPhyEthIF * _
     _if->pci_reg_write( E1000_IMIR(0), 0x00020000);
     _if->pci_reg_write( E1000_IMIREXT(0), 0x00081000);
     _if->pci_reg_write( E1000_TTQF(0),   protocol
-                       | 0x00008100 /* enable */
-                       | 0xE0010000 /* RX queue is 1 */
-                       );
+                        | 0x00008100 /* enable */
+                        | 0xE0010000 /* RX queue is 1 */
+                        );
 
 
-        /* 16  :   12 MAC , (2)0x0800,2      | DW0 , DW1
-                   6 bytes , TTL , PROTO     | DW2=0 , DW3=0x0000FF06
-        */
-        int i;
-        // IPv4: bytes being compared are {TTL, Protocol}
-        uint16_t ff_rules_v4[6]={
-            (uint16_t)(0xFF06 - v4_hops),
-            (uint16_t)(0xFE11 - v4_hops),
-            (uint16_t)(0xFF11 - v4_hops),
-            (uint16_t)(0xFE06 - v4_hops),
-            (uint16_t)(0xFF01 - v4_hops),
-            (uint16_t)(0xFE01 - v4_hops),
-        }  ;
-        // IPv6: bytes being compared are {NextHdr, HopLimit}
-        uint16_t ff_rules_v6[2]={
-            (uint16_t)(0x3CFF - hops),
-            (uint16_t)(0x3CFE - hops),
-        }  ;
-        uint16_t *ff_rules;
-        uint16_t num_rules;
-        uint32_t mask=0;
-        int  rule_id;
+    /* 16  :   12 MAC , (2)0x0800,2      | DW0 , DW1
+       6 bytes , TTL , PROTO     | DW2=0 , DW3=0x0000FF06
+    */
+    int i;
+    // IPv4: bytes being compared are {TTL, Protocol}
+    uint16_t ff_rules_v4[6]={
+        (uint16_t)(0xFF06 - v4_hops),
+        (uint16_t)(0xFE11 - v4_hops),
+        (uint16_t)(0xFF11 - v4_hops),
+        (uint16_t)(0xFE06 - v4_hops),
+        (uint16_t)(0xFF01 - v4_hops),
+        (uint16_t)(0xFE01 - v4_hops),
+    }  ;
+    // IPv6: bytes being compared are {NextHdr, HopLimit}
+    uint16_t ff_rules_v6[2]={
+        (uint16_t)(0x3CFF - hops),
+        (uint16_t)(0x3CFE - hops),
+    }  ;
+    uint16_t *ff_rules;
+    uint16_t num_rules;
+    uint32_t mask=0;
+    int  rule_id;
+
+    if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
+        ff_rules = &ff_rules_v6[0];
+        num_rules = sizeof(ff_rules_v6)/sizeof(ff_rules_v6[0]);
+    }else{
+        ff_rules = &ff_rules_v4[0];
+        num_rules = sizeof(ff_rules_v4)/sizeof(ff_rules_v4[0]);
+    }
 
-        if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
-            ff_rules = &ff_rules_v6[0];
-            num_rules = sizeof(ff_rules_v6)/sizeof(ff_rules_v6[0]);
-        }else{
-            ff_rules = &ff_rules_v4[0];
-            num_rules = sizeof(ff_rules_v4)/sizeof(ff_rules_v4[0]);
+    uint8_t len = 24;
+    for (rule_id=0; rule_id<num_rules; rule_id++ ) {
+        /* clear rule all */
+        for (i=0; i<0xff; i+=4) {
+            _if->pci_reg_write( (E1000_FHFT(rule_id)+i) , 0);
         }
 
-        uint8_t len = 24;
-        for (rule_id=0; rule_id<num_rules; rule_id++ ) {
-            /* clear rule all */
-            for (i=0; i<0xff; i+=4) {
-                _if->pci_reg_write( (E1000_FHFT(rule_id)+i) , 0);
+        if (  CGlobalInfo::m_options.preview.get_vlan_mode_enable() ){
+            len += 8;
+            if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
+                // IPv6 VLAN: NextHdr/HopLimit offset = 0x18
+                _if->pci_reg_write( (E1000_FHFT(rule_id)+(3*16)+0) , PKT_NTOHS(ff_rules[rule_id]) );
+                _if->pci_reg_write( (E1000_FHFT(rule_id)+(3*16)+8) , 0x03); /* MASK */
+            }else{
+                // IPv4 VLAN: TTL/Protocol offset = 0x1A
+                _if->pci_reg_write( (E1000_FHFT(rule_id)+(3*16)+0) , (PKT_NTOHS(ff_rules[rule_id])<<16) );
+                _if->pci_reg_write( (E1000_FHFT(rule_id)+(3*16)+8) , 0x0C); /* MASK */
             }
-
-            if (  CGlobalInfo::m_options.preview.get_vlan_mode_enable() ){
-                len += 8;
-                if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
-                    // IPv6 VLAN: NextHdr/HopLimit offset = 0x18
-                    _if->pci_reg_write( (E1000_FHFT(rule_id)+(3*16)+0) , PKT_NTOHS(ff_rules[rule_id]) );
-                    _if->pci_reg_write( (E1000_FHFT(rule_id)+(3*16)+8) , 0x03); /* MASK */
-                }else{
-                    // IPv4 VLAN: TTL/Protocol offset = 0x1A
-                    _if->pci_reg_write( (E1000_FHFT(rule_id)+(3*16)+0) , (PKT_NTOHS(ff_rules[rule_id])<<16) );
-                    _if->pci_reg_write( (E1000_FHFT(rule_id)+(3*16)+8) , 0x0C); /* MASK */
-                }
+        }else{
+            if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
+                // IPv6: NextHdr/HopLimit offset = 0x14
+                _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16)+4) , PKT_NTOHS(ff_rules[rule_id]) );
+                _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16)+8) , 0x30); /* MASK */
             }else{
-                if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
-                    // IPv6: NextHdr/HopLimit offset = 0x14
-                    _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16)+4) , PKT_NTOHS(ff_rules[rule_id]) );
-                    _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16)+8) , 0x30); /* MASK */
-                }else{
-                    // IPv4: TTL/Protocol offset = 0x16
-                    _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16)+4) , (PKT_NTOHS(ff_rules[rule_id])<<16) );
-                    _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16)+8) , 0xC0); /* MASK */
-                }
+                // IPv4: TTL/Protocol offset = 0x16
+                _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16)+4) , (PKT_NTOHS(ff_rules[rule_id])<<16) );
+                _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16)+8) , 0xC0); /* MASK */
             }
+        }
 
-            // FLEX_PRIO[[18:16] = 1, RQUEUE[10:8] = 1
-            _if->pci_reg_write( (E1000_FHFT(rule_id)+0xFC) , (1<<16) | (1<<8)  | len);
+        // FLEX_PRIO[[18:16] = 1, RQUEUE[10:8] = 1
+        _if->pci_reg_write( (E1000_FHFT(rule_id)+0xFC) , (1<<16) | (1<<8)  | len);
 
-            mask |=(1<<rule_id);
-        }
+        mask |=(1<<rule_id);
+    }
 
-        /* enable all rules */
-        _if->pci_reg_write(E1000_WUFC, (mask<<16) | (1<<14) );
+    /* enable all rules */
+    _if->pci_reg_write(E1000_WUFC, (mask<<16) | (1<<14) );
 
-        return (0);
+    return (0);
 }
 
 // Sadly, DPDK has no support for i350 filters, so we need to implement by writing to registers.
@@ -4584,19 +4571,19 @@ int CTRexExtendedDriverBase1G::configure_rx_filter_rules_stateless(CPhyEthIF * _
             _if->pci_reg_write( (E1000_FHFT(rule_id)+i) , 0);
         }
     }
-    
+
     rule_id = 0;
     // filter for byte 18 of packet (lsb of IP ID) should equal ff
     _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16)) ,  0x00ff0000);
     _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16) + 8) , 0x04); /* MASK */
     // + bytes 12 + 13 (ether type) should indicate IP.
     _if->pci_reg_write( (E1000_FHFT(rule_id)+(1*16) + 4) ,  0x00000008);
-    _if->pci_reg_write( (E1000_FHFT(rule_id)+(1*16) + 8) , 0x30); /* MASK */    
+    _if->pci_reg_write( (E1000_FHFT(rule_id)+(1*16) + 8) , 0x30); /* MASK */
     // FLEX_PRIO[[18:16] = 1, RQUEUE[10:8] = 1
     _if->pci_reg_write( (E1000_FHFT(rule_id) + 0xFC) , (1 << 16) | (1 << 8) | len);
 
     // same like 0, but with vlan. type should be vlan. Inside vlan, should be IP with lsb of IP ID equals 0xff
-    rule_id = 1; 
+    rule_id = 1;
     // filter for byte 22 of packet (msb of IP ID) should equal ff
     _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16) + 4) ,  0x00ff0000);
     _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16) + 8) , 0x40 | 0x03); /* MASK */
@@ -4606,53 +4593,53 @@ int CTRexExtendedDriverBase1G::configure_rx_filter_rules_stateless(CPhyEthIF * _
     // + bytes 16 + 17 (vlan type) should indicate IP.
     _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16) ) ,  0x00000080);
     // Was written together with IP ID filter
-    // _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16) + 8) , 0x03); /* MASK */    
+    // _if->pci_reg_write( (E1000_FHFT(rule_id)+(2*16) + 8) , 0x03); /* MASK */
     // FLEX_PRIO[[18:16] = 1, RQUEUE[10:8] = 1
     _if->pci_reg_write( (E1000_FHFT(rule_id) + 0xFC) , (1 << 16) | (1 << 8) | len);
 
     /* enable rules */
     _if->pci_reg_write(E1000_WUFC, (mask << 16) | (1 << 14) );
-    
+
     return (0);
 }
 
 
-void CTRexExtendedDriverBase1G::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){ 
+void CTRexExtendedDriverBase1G::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){
 
-   stats->ipackets     +=  _if->pci_reg_read(E1000_GPRC) ;
+    stats->ipackets     +=  _if->pci_reg_read(E1000_GPRC) ;
 
-   stats->ibytes       +=  (_if->pci_reg_read(E1000_GORCL) );
-   stats->ibytes       +=  (((uint64_t)_if->pci_reg_read(E1000_GORCH))<<32);
-                        
+    stats->ibytes       +=  (_if->pci_reg_read(E1000_GORCL) );
+    stats->ibytes       +=  (((uint64_t)_if->pci_reg_read(E1000_GORCH))<<32);
 
-   stats->opackets     +=  _if->pci_reg_read(E1000_GPTC);
-   stats->obytes       +=  _if->pci_reg_read(E1000_GOTCL) ;
-   stats->obytes       +=  ( (((uint64_t)_if->pci_reg_read(IXGBE_GOTCH))<<32) );
 
-   stats->f_ipackets   +=  0;
-   stats->f_ibytes     += 0;
+    stats->opackets     +=  _if->pci_reg_read(E1000_GPTC);
+    stats->obytes       +=  _if->pci_reg_read(E1000_GOTCL) ;
+    stats->obytes       +=  ( (((uint64_t)_if->pci_reg_read(IXGBE_GOTCH))<<32) );
 
+    stats->f_ipackets   +=  0;
+    stats->f_ibytes     += 0;
 
-   stats->ierrors      +=  ( _if->pci_reg_read(E1000_RNBC) +
-                             _if->pci_reg_read(E1000_CRCERRS) + 
-                             _if->pci_reg_read(E1000_ALGNERRC ) +
-                             _if->pci_reg_read(E1000_SYMERRS ) +
-                             _if->pci_reg_read(E1000_RXERRC ) +
 
-                             _if->pci_reg_read(E1000_ROC)+
-                             _if->pci_reg_read(E1000_RUC)+ 
-                             _if->pci_reg_read(E1000_RJC) +
+    stats->ierrors      +=  ( _if->pci_reg_read(E1000_RNBC) +
+                              _if->pci_reg_read(E1000_CRCERRS) +
+                              _if->pci_reg_read(E1000_ALGNERRC ) +
+                              _if->pci_reg_read(E1000_SYMERRS ) +
+                              _if->pci_reg_read(E1000_RXERRC ) +
 
-                             _if->pci_reg_read(E1000_XONRXC)+   
-                            _if->pci_reg_read(E1000_XONTXC)+
-                            _if->pci_reg_read(E1000_XOFFRXC)+
-                            _if->pci_reg_read(E1000_XOFFTXC)+
-                            _if->pci_reg_read(E1000_FCRUC)
-                             );
+                              _if->pci_reg_read(E1000_ROC)+
+                              _if->pci_reg_read(E1000_RUC)+
+                              _if->pci_reg_read(E1000_RJC) +
 
-   stats->oerrors      +=  0;
-   stats->imcasts      =  0;
-   stats->rx_nombuf    =  0;
+                              _if->pci_reg_read(E1000_XONRXC)+
+                              _if->pci_reg_read(E1000_XONTXC)+
+                              _if->pci_reg_read(E1000_XOFFRXC)+
+                              _if->pci_reg_read(E1000_XOFFTXC)+
+                              _if->pci_reg_read(E1000_FCRUC)
+                              );
+
+    stats->oerrors      +=  0;
+    stats->imcasts      =  0;
+    stats->rx_nombuf    =  0;
 }
 
 void CTRexExtendedDriverBase1G::clear_extended_stats(CPhyEthIF * _if){
@@ -4675,108 +4662,108 @@ void CTRexExtendedDriverBase10G::update_configuration(port_cfg_t * cfg){
 }
 
 int CTRexExtendedDriverBase10G::configure_rx_filter_rules(CPhyEthIF * _if){
-        uint8_t port_id=_if->get_rte_port_id();
-        uint16_t hops = get_rx_check_hops();
-        uint16_t v4_hops = (hops << 8)&0xff00; 
-
-       /* enable rule 0 SCTP -> queue 1 for latency  */
-       /* 1<<21 means that queue 1 is for SCTP */
-       _if->pci_reg_write(IXGBE_L34T_IMIR(0),(1<<21)); 
-       _if->pci_reg_write(IXGBE_FTQF(0),
-                          IXGBE_FTQF_PROTOCOL_SCTP|
-                          (IXGBE_FTQF_PRIORITY_MASK<<IXGBE_FTQF_PRIORITY_SHIFT)|
-                          ((0x0f)<<IXGBE_FTQF_5TUPLE_MASK_SHIFT)|IXGBE_FTQF_QUEUE_ENABLE);
-
-        // IPv4: bytes being compared are {TTL, Protocol}
-        uint16_t ff_rules_v4[6]={
-            (uint16_t)(0xFF11 - v4_hops),
-            (uint16_t)(0xFE11 - v4_hops),
-            (uint16_t)(0xFF06 - v4_hops),
-            (uint16_t)(0xFE06 - v4_hops),
-            (uint16_t)(0xFF01 - v4_hops),
-            (uint16_t)(0xFE01 - v4_hops),
-        };
-        // IPv6: bytes being compared are {NextHdr, HopLimit}
-        uint16_t ff_rules_v6[6]={
-            (uint16_t)(0x3CFF - hops),
-            (uint16_t)(0x3CFE - hops),
-        };        
+    uint8_t port_id=_if->get_rte_port_id();
+    uint16_t hops = get_rx_check_hops();
+    uint16_t v4_hops = (hops << 8)&0xff00;
+
+    /* enable rule 0 SCTP -> queue 1 for latency  */
+    /* 1<<21 means that queue 1 is for SCTP */
+    _if->pci_reg_write(IXGBE_L34T_IMIR(0),(1<<21));
+    _if->pci_reg_write(IXGBE_FTQF(0),
+                       IXGBE_FTQF_PROTOCOL_SCTP|
+                       (IXGBE_FTQF_PRIORITY_MASK<<IXGBE_FTQF_PRIORITY_SHIFT)|
+                       ((0x0f)<<IXGBE_FTQF_5TUPLE_MASK_SHIFT)|IXGBE_FTQF_QUEUE_ENABLE);
+
+    // IPv4: bytes being compared are {TTL, Protocol}
+    uint16_t ff_rules_v4[6]={
+        (uint16_t)(0xFF11 - v4_hops),
+        (uint16_t)(0xFE11 - v4_hops),
+        (uint16_t)(0xFF06 - v4_hops),
+        (uint16_t)(0xFE06 - v4_hops),
+        (uint16_t)(0xFF01 - v4_hops),
+        (uint16_t)(0xFE01 - v4_hops),
+    };
+    // IPv6: bytes being compared are {NextHdr, HopLimit}
+    uint16_t ff_rules_v6[6]={
+        (uint16_t)(0x3CFF - hops),
+        (uint16_t)(0x3CFE - hops),
+    };
 
-        uint16_t *ff_rules;
-        uint16_t num_rules;
-        int  rule_id;
+    uint16_t *ff_rules;
+    uint16_t num_rules;
+    int  rule_id;
 
+    if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
+        ff_rules = &ff_rules_v6[0];
+        num_rules = sizeof(ff_rules_v6)/sizeof(ff_rules_v6[0]);
+    }else{
+        ff_rules = &ff_rules_v4[0];
+        num_rules = sizeof(ff_rules_v4)/sizeof(ff_rules_v4[0]);
+    }
+
+    for (rule_id=0; rule_id<num_rules; rule_id++ ) {
+        struct rte_eth_fdir_filter fdir_filter;
+        uint16_t ff_rule = ff_rules[rule_id];
+        int res = 0;
+
+        memset(&fdir_filter,0,sizeof(fdir_filter));
+        /* TOS/PROTO */
         if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
-            ff_rules = &ff_rules_v6[0];
-            num_rules = sizeof(ff_rules_v6)/sizeof(ff_rules_v6[0]);
+            fdir_filter.input.flow_type = RTE_ETH_FLOW_NONFRAG_IPV6_OTHER;
         }else{
-            ff_rules = &ff_rules_v4[0];
-            num_rules = sizeof(ff_rules_v4)/sizeof(ff_rules_v4[0]);
+            fdir_filter.input.flow_type = RTE_ETH_FLOW_NONFRAG_IPV4_OTHER;
         }
+        fdir_filter.soft_id = rule_id;
 
-        for (rule_id=0; rule_id<num_rules; rule_id++ ) {
-            struct rte_eth_fdir_filter fdir_filter;
-            uint16_t ff_rule = ff_rules[rule_id];
-            int res = 0;
+        fdir_filter.input.flow_ext.flexbytes[0] = (ff_rule >> 8) & 0xff;
+        fdir_filter.input.flow_ext.flexbytes[1] = ff_rule & 0xff;
+        fdir_filter.action.rx_queue = 1;
+        fdir_filter.action.behavior = RTE_ETH_FDIR_ACCEPT;
+        fdir_filter.action.report_status = RTE_ETH_FDIR_NO_REPORT_STATUS;
+        res = rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR, RTE_ETH_FILTER_ADD, &fdir_filter);
 
-            memset(&fdir_filter,0,sizeof(fdir_filter));
-            /* TOS/PROTO */
-            if (  CGlobalInfo::m_options.preview.get_ipv6_mode_enable() ){
-                fdir_filter.input.flow_type = RTE_ETH_FLOW_NONFRAG_IPV6_OTHER;
-            }else{
-                fdir_filter.input.flow_type = RTE_ETH_FLOW_NONFRAG_IPV4_OTHER;
-            }
-            fdir_filter.soft_id = rule_id;
-            
-            fdir_filter.input.flow_ext.flexbytes[0] = (ff_rule >> 8) & 0xff;
-            fdir_filter.input.flow_ext.flexbytes[1] = ff_rule & 0xff;
-            fdir_filter.action.rx_queue = 1;
-            fdir_filter.action.behavior = RTE_ETH_FDIR_ACCEPT;
-            fdir_filter.action.report_status = RTE_ETH_FDIR_NO_REPORT_STATUS;
-            res = rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR, RTE_ETH_FILTER_ADD, &fdir_filter);
-
-            if (res != 0) {
-                 rte_exit(EXIT_FAILURE, " ERROR rte_eth_dev_filter_ctrl : %d\n",res);
-            }
+        if (res != 0) {
+            rte_exit(EXIT_FAILURE, " ERROR rte_eth_dev_filter_ctrl : %d\n",res);
         }
-        return (0);
+    }
+    return (0);
 }
 
-void CTRexExtendedDriverBase10G::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){ 
+void CTRexExtendedDriverBase10G::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){
 
-   int i;
-   uint64_t t=0;
+    int i;
+    uint64_t t=0;
 
-   if ( !get_is_stateless() ) {
+    if ( !get_is_stateless() ) {
 
         for (i=0; i<8;i++) {
             t+=_if->pci_reg_read(IXGBE_MPC(i));
         }
-   }
+    }
 
-   stats->ipackets     +=  _if->pci_reg_read(IXGBE_GPRC) ;
-   
-   stats->ibytes       +=  (_if->pci_reg_read(IXGBE_GORCL) +(((uint64_t)_if->pci_reg_read(IXGBE_GORCH))<<32));
+    stats->ipackets     +=  _if->pci_reg_read(IXGBE_GPRC) ;
 
+    stats->ibytes       +=  (_if->pci_reg_read(IXGBE_GORCL) +(((uint64_t)_if->pci_reg_read(IXGBE_GORCH))<<32));
 
 
-   stats->opackets     +=  _if->pci_reg_read(IXGBE_GPTC);
-   stats->obytes       +=  (_if->pci_reg_read(IXGBE_GOTCL) +(((uint64_t)_if->pci_reg_read(IXGBE_GOTCH))<<32));
 
-   stats->f_ipackets   +=  _if->pci_reg_read(IXGBE_RXDGPC);
-   stats->f_ibytes     += (_if->pci_reg_read(IXGBE_RXDGBCL) +(((uint64_t)_if->pci_reg_read(IXGBE_RXDGBCH))<<32));
+    stats->opackets     +=  _if->pci_reg_read(IXGBE_GPTC);
+    stats->obytes       +=  (_if->pci_reg_read(IXGBE_GOTCL) +(((uint64_t)_if->pci_reg_read(IXGBE_GOTCH))<<32));
 
+    stats->f_ipackets   +=  _if->pci_reg_read(IXGBE_RXDGPC);
+    stats->f_ibytes     += (_if->pci_reg_read(IXGBE_RXDGBCL) +(((uint64_t)_if->pci_reg_read(IXGBE_RXDGBCH))<<32));
 
-   stats->ierrors      +=  ( _if->pci_reg_read(IXGBE_RLEC) +
-                             _if->pci_reg_read(IXGBE_ERRBC) +
-                             _if->pci_reg_read(IXGBE_CRCERRS) + 
-                             _if->pci_reg_read(IXGBE_ILLERRC ) +
-                             _if->pci_reg_read(IXGBE_ROC)+
-                             _if->pci_reg_read(IXGBE_RUC)+t);
 
-   stats->oerrors      +=  0;
-   stats->imcasts      =  0;
-   stats->rx_nombuf    =  0;
+    stats->ierrors      +=  ( _if->pci_reg_read(IXGBE_RLEC) +
+                              _if->pci_reg_read(IXGBE_ERRBC) +
+                              _if->pci_reg_read(IXGBE_CRCERRS) +
+                              _if->pci_reg_read(IXGBE_ILLERRC ) +
+                              _if->pci_reg_read(IXGBE_ROC)+
+                              _if->pci_reg_read(IXGBE_RUC)+t);
+
+    stats->oerrors      +=  0;
+    stats->imcasts      =  0;
+    stats->rx_nombuf    =  0;
 
 }
 
@@ -4813,8 +4800,8 @@ void CTRexExtendedDriverBase40G::add_del_rules(enum rte_filter_op op, uint8_t po
 
     if ( ret != 0 ){
         rte_exit(EXIT_FAILURE, "rte_eth_dev_filter_supported "
-                "err=%d, port=%u \n",
-              ret, port_id);
+                 "err=%d, port=%u \n",
+                 ret, port_id);
     }
 
     struct rte_eth_fdir_filter filter;
@@ -4825,7 +4812,7 @@ void CTRexExtendedDriverBase40G::add_del_rules(enum rte_filter_op op, uint8_t po
     printf("40g::%s rules: port:%d, type:%d ttl:%d, ip_id:%x, q:%d hw index:%d\n", (op == RTE_ETH_FILTER_ADD) ?  "add" : "del"
            , port_id, type, ttl, ip_id, queue, stat_idx);
 #endif
-    
+
     filter.action.rx_queue = queue;
     filter.action.behavior =RTE_ETH_FDIR_ACCEPT;
     filter.action.report_status =RTE_ETH_FDIR_NO_REPORT_STATUS;
@@ -4856,12 +4843,12 @@ void CTRexExtendedDriverBase40G::add_del_rules(enum rte_filter_op op, uint8_t po
     }
 
     ret=rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR,
-                op, (void*)&filter);
+                                op, (void*)&filter);
 
     if (  ret !=0 ){
         rte_exit(EXIT_FAILURE, "rte_eth_dev_filter_ctrl"
-                "err=%d, port=%u \n",
-              ret, port_id);
+                 "err=%d, port=%u \n",
+                 ret, port_id);
     }
 }
 
@@ -4871,7 +4858,7 @@ void CTRexExtendedDriverBase40G::add_del_rules(enum rte_filter_op op, uint8_t po
 int CTRexExtendedDriverBase40G::add_del_rx_flow_stat_rule(uint8_t port_id, enum rte_filter_op op, uint8_t type, uint16_t proto, uint16_t id) {
     uint32_t rule_id = (port_id % m_if_per_card) * MAX_FLOW_STATS + id;
     uint16_t rte_type = RTE_ETH_FLOW_NONFRAG_IPV4_OTHER;
-    
+
     switch(proto) {
     case IPPROTO_TCP:
         rte_type = RTE_ETH_FLOW_NONFRAG_IPV4_TCP;
@@ -4882,7 +4869,7 @@ int CTRexExtendedDriverBase40G::add_del_rx_flow_stat_rule(uint8_t port_id, enum
     default:
         rte_type = RTE_ETH_FLOW_NONFRAG_IPV4_OTHER;
         break;
-    }    
+    }
     add_del_rules(op, port_id, rte_type, 0, IP_ID_RESERVE_BASE + id, MAIN_DPDK_DATA_Q, rule_id);
     return 0;
 }
@@ -4891,13 +4878,13 @@ int CTRexExtendedDriverBase40G::configure_rx_filter_rules_statfull(CPhyEthIF * _
     uint32_t port_id = _if->get_port_id();
     uint16_t hops = get_rx_check_hops();
     int i;
-    
+
     for (i = 0; i < 2; i++) {
         uint8_t ttl = TTL_RESERVE_DUPLICATE - i - hops;
         add_del_rules(RTE_ETH_FILTER_ADD, port_id, RTE_ETH_FLOW_NONFRAG_IPV4_UDP, ttl, 0, MAIN_DPDK_RX_Q, 0);
         add_del_rules(RTE_ETH_FILTER_ADD, port_id, RTE_ETH_FLOW_NONFRAG_IPV4_TCP, ttl, 0, MAIN_DPDK_RX_Q, 0);
         add_del_rules(RTE_ETH_FILTER_ADD, port_id, RTE_ETH_FLOW_NONFRAG_IPV6_UDP, ttl, 0, MAIN_DPDK_RX_Q, 0);
-        add_del_rules(RTE_ETH_FILTER_ADD, port_id, RTE_ETH_FLOW_NONFRAG_IPV6_TCP, ttl, 0, MAIN_DPDK_RX_Q, 0);        
+        add_del_rules(RTE_ETH_FILTER_ADD, port_id, RTE_ETH_FLOW_NONFRAG_IPV6_TCP, ttl, 0, MAIN_DPDK_RX_Q, 0);
     }
 
     /* Configure rules for latency measurement packets */
@@ -4934,7 +4921,7 @@ int CTRexExtendedDriverBase40G::get_rx_stats(CPhyEthIF * _if, uint32_t *stats, u
         }
         prev_stats[i] = hw_stats[i];
     }
-    
+
     return 0;
 }
 
@@ -4945,7 +4932,7 @@ int CTRexExtendedDriverBase40G::dump_fdir_global_stats(CPhyEthIF * _if, FILE *fd
     uint32_t port_id = _if->get_port_id();
     struct rte_eth_fdir_stats stat;
     int ret;
-    
+
     ret = rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR, RTE_ETH_FILTER_STATS, (void*)&stat);
     if (ret == 0) {
         if (fd)
@@ -4957,38 +4944,38 @@ int CTRexExtendedDriverBase40G::dump_fdir_global_stats(CPhyEthIF * _if, FILE *fd
         return -1;
     }
 }
-    
-void CTRexExtendedDriverBase40G::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){ 
+
+void CTRexExtendedDriverBase40G::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){
 
     struct rte_eth_stats stats1;
     rte_eth_stats_get(_if->get_port_id(), &stats1);
 
 
-   stats->ipackets     =  stats1.ipackets;
-   stats->ibytes       =  stats1.ibytes; 
+    stats->ipackets     =  stats1.ipackets;
+    stats->ibytes       =  stats1.ibytes;
 
-   stats->opackets     =  stats1.opackets;
-   stats->obytes       =  stats1.obytes;
+    stats->opackets     =  stats1.opackets;
+    stats->obytes       =  stats1.obytes;
 
-   stats->f_ipackets   = 0;
-   stats->f_ibytes     = 0;
+    stats->f_ipackets   = 0;
+    stats->f_ibytes     = 0;
 
 
-   stats->ierrors      =  stats1.ierrors + stats1.imissed + stats1.ibadcrc +
-                               stats1.ibadlen      +
-                               stats1.ierrors      +
-                               stats1.oerrors      +
-                               stats1.imcasts      +
-                               stats1.rx_nombuf    +
-                               stats1.tx_pause_xon +
-                               stats1.rx_pause_xon +
-                               stats1.tx_pause_xoff+
-                               stats1.rx_pause_xoff ;
+    stats->ierrors      =  stats1.ierrors + stats1.imissed + stats1.ibadcrc +
+        stats1.ibadlen      +
+        stats1.ierrors      +
+        stats1.oerrors      +
+        stats1.imcasts      +
+        stats1.rx_nombuf    +
+        stats1.tx_pause_xon +
+        stats1.rx_pause_xon +
+        stats1.tx_pause_xoff+
+        stats1.rx_pause_xoff ;
 
 
-   stats->oerrors      =  stats1.oerrors;;
-   stats->imcasts      =  0;
-   stats->rx_nombuf    =  stats1.rx_nombuf;
+    stats->oerrors      =  stats1.oerrors;;
+    stats->imcasts      =  0;
+    stats->rx_nombuf    =  stats1.rx_nombuf;
 
 }
 
@@ -5026,37 +5013,37 @@ int CTRexExtendedDriverBase1GVm::configure_drop_queue(CPhyEthIF * _if){
     return (0);
 }
 
-void CTRexExtendedDriverBase1GVm::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){ 
+void CTRexExtendedDriverBase1GVm::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){
 
     struct rte_eth_stats stats1;
     rte_eth_stats_get(_if->get_port_id(), &stats1);
 
 
-   stats->ipackets     =  stats1.ipackets;
-   stats->ibytes       =  stats1.ibytes; 
+    stats->ipackets     =  stats1.ipackets;
+    stats->ibytes       =  stats1.ibytes;
 
-   stats->opackets     =  stats1.opackets;
-   stats->obytes       =  stats1.obytes;
+    stats->opackets     =  stats1.opackets;
+    stats->obytes       =  stats1.obytes;
 
-   stats->f_ipackets   = 0;
-   stats->f_ibytes     = 0;
+    stats->f_ipackets   = 0;
+    stats->f_ibytes     = 0;
 
 
-   stats->ierrors      =  stats1.ierrors + stats1.imissed + stats1.ibadcrc +
-                               stats1.ibadlen      +
-                               stats1.ierrors      +
-                               stats1.oerrors      +
-                               stats1.imcasts      +
-                               stats1.rx_nombuf    +
-                               stats1.tx_pause_xon +
-                               stats1.rx_pause_xon +
-                               stats1.tx_pause_xoff+
-                               stats1.rx_pause_xoff ;
+    stats->ierrors      =  stats1.ierrors + stats1.imissed + stats1.ibadcrc +
+        stats1.ibadlen      +
+        stats1.ierrors      +
+        stats1.oerrors      +
+        stats1.imcasts      +
+        stats1.rx_nombuf    +
+        stats1.tx_pause_xon +
+        stats1.rx_pause_xon +
+        stats1.tx_pause_xoff+
+        stats1.rx_pause_xoff ;
 
 
-   stats->oerrors      =  stats1.oerrors;;
-   stats->imcasts      =  0;
-   stats->rx_nombuf    =  stats1.rx_nombuf;
+    stats->oerrors      =  stats1.oerrors;;
+    stats->imcasts      =  0;
+    stats->rx_nombuf    =  stats1.rx_nombuf;
 
 }
 
@@ -5069,13 +5056,13 @@ int CTRexExtendedDriverBase1GVm::wait_for_stable_link(){
 
 /**
  * convert chain of mbuf to one big mbuf
- * 
+ *
  * @param m
- * 
- * @return 
+ *
+ * @return
  */
 struct rte_mbuf *  rte_mbuf_convert_to_one_seg(struct rte_mbuf *m){
-       unsigned int len;
+    unsigned int len;
     struct rte_mbuf * r;
     struct rte_mbuf * old_m;
     old_m=m;
@@ -5090,21 +5077,21 @@ struct rte_mbuf *  rte_mbuf_convert_to_one_seg(struct rte_mbuf *m){
     }
     char *p=rte_pktmbuf_append(r,len);
 
-       while ( m ) {
+    while ( m ) {
         len = m->data_len;
         assert(len);
         memcpy(p,(char *)m->buf_addr, len);
         p+=len;
-               m = m->next;
-       }
+        m = m->next;
+    }
     rte_pktmbuf_free(old_m);
     return(r);
 }
 
 /***********************************************************
- * platfrom API object 
- * TODO: REMOVE THIS TO A SEPERATE FILE 
- * 
+ * platfrom API object
+ * TODO: REMOVE THIS TO A SEPERATE FILE
+ *
  **********************************************************/
 void TrexDpdkPlatformApi::get_port_num(uint8_t &port_num) const {
     port_num = g_trex.m_max_ports;
@@ -5128,12 +5115,12 @@ TrexDpdkPlatformApi::get_global_stats(TrexPlatformGlobalStats &stats) const {
     stats.m_stats.m_total_rx_bytes     = trex_stats.m_total_rx_bytes;
 }
 
-void 
+void
 TrexDpdkPlatformApi::get_interface_stats(uint8_t interface_id, TrexPlatformInterfaceStats &stats) const {
 
 }
 
-uint8_t 
+uint8_t
 TrexDpdkPlatformApi::get_dp_core_count() const {
     return CGlobalInfo::m_options.preview.getCores();
 }
@@ -5169,9 +5156,12 @@ TrexDpdkPlatformApi::get_interface_info(uint8_t interface_id, intf_info_st &info
     /* hardware */
     g_trex.m_ports[interface_id].macaddr_get(&rte_mac_addr);
     assert(ETHER_ADDR_LEN == 6);
+    printf("interface %d speed: %d mac:", interface_id, info.speed);
     for (int i = 0; i < 6; i++) {
         info.mac_info.hw_macaddr[i] = rte_mac_addr.addr_bytes[i];
+        printf("%x:", rte_mac_addr.addr_bytes[i]);
     }
+    printf("\n");
 
     /* software */
     uint8_t sw_macaddr[12];
@@ -5180,7 +5170,7 @@ TrexDpdkPlatformApi::get_interface_info(uint8_t interface_id, intf_info_st &info
     for (int i = 0; i < 6; i++) {
         info.mac_info.dst_macaddr[i] = sw_macaddr[i];
         info.mac_info.src_macaddr[i] = sw_macaddr[6 + i];
-        
+
     }
 
     info.numa_node =  g_trex.m_ports[interface_id].m_dev_info.pci_dev->numa_node;
index 1583454..42b9a99 100755 (executable)
@@ -99,8 +99,8 @@ void CPlatformCoresYamlInfo::Dump(FILE *fd){
        fprintf(fd," no platform info \n");
        return;
     }
-    fprintf(fd," master   thread  : %d  \n",m_master_thread);
-    fprintf(fd," latency  thread  : %d  \n",m_latency_thread);
+    fprintf(fd," master   thread  : %d  \n", m_master_thread);
+    fprintf(fd," rx  thread  : %d  \n", m_rx_thread);
     int i;
     for (i=0; i<m_dual_if.size(); i++) {
         printf(" dual_if : %d \n",i);
@@ -124,7 +124,7 @@ void operator >> (const YAML::Node& node, CPlatformDualIfYamlInfo & plat_info) {
 
 void operator >> (const YAML::Node& node, CPlatformCoresYamlInfo & plat_info) {
      node["master_thread_id"] >> plat_info.m_master_thread;
-     node["latency_thread_id"] >> plat_info.m_latency_thread;    
+     node["rx_thread_id"] >> plat_info.m_rx_thread;
 
      const YAML::Node& dual_info = node["dual_if"];
      for(unsigned i=0;i<dual_info.size();i++) {
index e8f93d0..682f33e 100755 (executable)
@@ -141,7 +141,7 @@ public:
     }
     bool             m_is_exists;
     uint32_t         m_master_thread; 
-    uint32_t         m_latency_thread;  
+    uint32_t         m_rx_thread;  
     std::vector <CPlatformDualIfYamlInfo> m_dual_if;
 public:
     void Dump(FILE *fd);
index 7e81ef2..bfaa4dd 100755 (executable)
@@ -388,7 +388,7 @@ void RxCheckManager::handle_packet(CRx_check_header * rxh){
     m_tw.restart_timer(&lf->m_aging_timer_handle,m_cur_time+std::max(rxh->m_aging_sec,(uint16_t)5));
     /* teminate flow if needed */
     if ( lf->is_all_pkts_seen() ){
-            /* handel from termination */
+            /* handle from termination */
             m_tw.stop_timer(&lf->m_aging_timer_handle);
             lf->set_aged_correctly();
             on_flow_end(lf);