Fixed support for i40evf + Refactor of VM drivers 78/5278/1
authorIdo Barnea <[email protected]>
Thu, 19 Jan 2017 16:09:38 +0000 (18:09 +0200)
committerIdo Barnea <[email protected]>
Tue, 24 Jan 2017 14:51:59 +0000 (16:51 +0200)
Signed-off-by: Ido Barnea <[email protected]>
scripts/automation/regression/stateless_tests/stl_rx_test.py
src/main_dpdk.cpp

index a3efa01..3d4ed97 100644 (file)
@@ -32,6 +32,12 @@ class STLRX_Test(CStlGeneral_Test):
                         'latency_9k_max_average': 100,
                         'latency_9k_max_latency': 250,
                         },
+                'rte_i40evf_pmd': {
+                        'rate_percent': 80,
+                        'total_pkts': 1000,
+                        'rate_latency': 1,
+                        'latency_9k_enable': False,
+                        },
                 'rte_igb_pmd': {
                         'rate_percent': 80,
                         'total_pkts': 500,
index 1be8414..51c3197 100644 (file)
@@ -133,7 +133,6 @@ static char global_master_id_str[10];
 
 class CTRexExtendedDriverBase {
 public:
-
     /* by default NIC driver adds CRC */
     virtual bool has_crc_added() {
         return true;
@@ -154,6 +153,7 @@ public:
     }
 
     virtual int stop_queue(CPhyEthIF * _if, uint16_t q_num);
+    void get_extended_stats_fixed(CPhyEthIF * _if, CPhyEthIFStats *stats, int fix_i, int fix_o);
     virtual void get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats)=0;
     virtual void clear_extended_stats(CPhyEthIF * _if)=0;
     virtual int  wait_for_stable_link();
@@ -237,10 +237,10 @@ public:
     virtual int set_rcv_all(CPhyEthIF * _if, bool set_on);
 };
 
-class CTRexExtendedDriverBase1GVm : public CTRexExtendedDriverBase {
+class CTRexExtendedDriverVirtio : public CTRexExtendedDriverBase {
 
 public:
-    CTRexExtendedDriverBase1GVm(){
+    CTRexExtendedDriverVirtio() {
         /* we are working in mode that we have 1 queue for rx and one queue for tx*/
         CGlobalInfo::m_options.preview.set_vm_one_queue_enable(true);
     }
@@ -254,12 +254,10 @@ public:
     }
 
     static CTRexExtendedDriverBase * create(){
-        return ( new CTRexExtendedDriverBase1GVm() );
+        return ( new CTRexExtendedDriverVirtio() );
     }
 
-    virtual void update_global_config_fdir(port_cfg_t * cfg){
-
-    }
+    virtual void update_global_config_fdir(port_cfg_t * cfg) {}
 
     virtual int get_min_sample_rate(void){
         return ( RX_CHECK_MIX_SAMPLE_RATE_1G);
@@ -288,49 +286,53 @@ public:
     virtual int set_rcv_all(CPhyEthIF * _if, bool set_on) {return 0;}
 };
 
-
-class CTRexExtendedDriverBaseVmxnet3 : public CTRexExtendedDriverBase1GVm {
+class CTRexExtendedDriverVmxnet3 : public CTRexExtendedDriverVirtio {
 public:
-    static CTRexExtendedDriverBase * create(){
-        return ( new CTRexExtendedDriverBaseVmxnet3() );
+    CTRexExtendedDriverVmxnet3(){
+        /* we are working in mode in which we have 1 queue for rx and one queue for tx*/
+        CGlobalInfo::m_options.preview.set_vm_one_queue_enable(true);
     }
 
-    virtual void get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats);
+    static CTRexExtendedDriverBase * create() {
+        return ( new CTRexExtendedDriverVmxnet3() );
+    }
+
+    virtual void update_configuration(port_cfg_t * cfg);
 };
 
-class CTRexExtendedDriverBaseVirtio : public CTRexExtendedDriverBase1GVm {
+class CTRexExtendedDriverI40evf : public CTRexExtendedDriverVirtio {
 public:
-    static CTRexExtendedDriverBase * create(){
-        return ( new CTRexExtendedDriverBaseVmxnet3() );
+    CTRexExtendedDriverI40evf(){
+        /* we are working in mode in which we have 1 queue for rx and one queue for tx*/
+        CGlobalInfo::m_options.preview.set_vm_one_queue_enable(true);
+    }
+    virtual void get_extended_stats(CPhyEthIF * _if, CPhyEthIFStats *stats) {
+        get_extended_stats_fixed(_if, stats, 0, 4);
     }
 
-    virtual void get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats);
+    virtual void update_configuration(port_cfg_t * cfg);
+    static CTRexExtendedDriverBase * create() {
+        return ( new CTRexExtendedDriverI40evf() );
+    }
 };
 
-
-
-class CTRexExtendedDriverVf : public CTRexExtendedDriverBase1GVm {
+class CTRexExtendedDriverIxgbevf : public CTRexExtendedDriverI40evf {
 
 public:
-    CTRexExtendedDriverVf(){
-        /* we are working in mode in which we have we have 1 queue for rx and one queue for tx*/
+    CTRexExtendedDriverIxgbevf(){
+        /* we are working in mode in which we have 1 queue for rx and one queue for tx*/
         CGlobalInfo::m_options.preview.set_vm_one_queue_enable(true);
     }
     virtual void get_extended_stats(CPhyEthIF * _if, CPhyEthIFStats *stats) {
-        uint64_t prev_ipackets = stats->ipackets;
-        uint64_t prev_opackets = stats->opackets;
-
-        CTRexExtendedDriverBase1GVm::get_extended_stats(_if, stats);
-        // Since this driver report byte counts without Ethernet FCS (4 bytes), we need to fix the reported numbers
-        stats->ibytes += (stats->ipackets - prev_ipackets) * 4;
-        stats->obytes += (stats->opackets - prev_opackets) * 4;
+        get_extended_stats_fixed(_if, stats, 4, 4);
     }
-    static CTRexExtendedDriverBase * create(){
-        return ( new CTRexExtendedDriverVf() );
+
+    static CTRexExtendedDriverBase * create() {
+        return ( new CTRexExtendedDriverIxgbevf() );
     }
 };
 
-class CTRexExtendedDriverBaseE1000 : public CTRexExtendedDriverBase1GVm {
+class CTRexExtendedDriverBaseE1000 : public CTRexExtendedDriverVirtio {
     CTRexExtendedDriverBaseE1000() {
         // E1000 driver is only relevant in VM in our case
         CGlobalInfo::m_options.preview.set_vm_one_queue_enable(true);
@@ -617,11 +619,11 @@ private:
         register_driver(std::string("net_mlx5"),CTRexExtendedDriverBaseMlnx5G::create);
 
         /* virtual devices */
-        register_driver(std::string("rte_em_pmd"),CTRexExtendedDriverBaseE1000::create);
-        register_driver(std::string("rte_vmxnet3_pmd"),CTRexExtendedDriverBaseVmxnet3::create);
-        register_driver(std::string("rte_virtio_pmd"),CTRexExtendedDriverBaseVirtio::create);
-        register_driver(std::string("rte_ixgbevf_pmd"),CTRexExtendedDriverVf::create);
-        register_driver(std::string("rte_i40evf_pmd"),CTRexExtendedDriverVf::create);
+        register_driver(std::string("rte_em_pmd"), CTRexExtendedDriverBaseE1000::create);
+        register_driver(std::string("rte_vmxnet3_pmd"), CTRexExtendedDriverVmxnet3::create);
+        register_driver(std::string("rte_virtio_pmd"), CTRexExtendedDriverVirtio::create);
+        register_driver(std::string("rte_i40evf_pmd"), CTRexExtendedDriverI40evf::create);
+        register_driver(std::string("rte_ixgbevf_pmd"), CTRexExtendedDriverIxgbevf::create);
 
         m_driver_was_set=false;
         m_drv=0;
@@ -3715,6 +3717,7 @@ void CGlobalTRex::rx_sl_configure(void) {
 
 int  CGlobalTRex::ixgbe_start(void){
     int i;
+    
     for (i=0; i<m_max_ports; i++) {
         socket_id_t socket_id = CGlobalInfo::m_socket.port_to_socket((port_id_t)i);
         assert(CGlobalInfo::m_mem_pool[socket_id].m_mbuf_pool_2048);
@@ -3723,14 +3726,14 @@ int  CGlobalTRex::ixgbe_start(void){
         uint16_t rx_rss = get_ex_drv()->enable_rss_drop_workaround();
 
         if ( get_vm_one_queue_enable() ) {
-            /* VMXNET3 does claim to support 16K but somehow does not work */
-            /* reduce to 2000 */
             m_port_cfg.m_port_conf.rxmode.max_rx_pkt_len = 2000;
             /* In VM case, there is one tx q and one rx q */
             _if->configure(1, 1, &m_port_cfg.m_port_conf);
             // Only 1 rx queue, so use it for everything
             m_rx_core_tx_q_id = 0;
             _if->set_rx_queue(0);
+            // We usually have less memory in VM, so don't use the 9k pool. This means that large packets will
+            // be received in chain of few mbufs
             _if->rx_queue_setup(0, RTE_TEST_RX_DESC_VM_DEFAULT, socket_id, &m_port_cfg.m_rx_conf,
                                 CGlobalInfo::m_mem_pool[socket_id].m_mbuf_pool_2048);
             // 1 TX queue in VM case
@@ -5921,6 +5924,35 @@ CFlowStatParser *CTRexExtendedDriverBase::get_flow_stat_parser() {
     return parser;
 }
 
+void CTRexExtendedDriverBase::get_extended_stats_fixed(CPhyEthIF * _if, CPhyEthIFStats *stats, int fix_i, int fix_o) {
+    struct rte_eth_stats stats1;
+    struct rte_eth_stats *prev_stats = &stats->m_prev_stats;
+    rte_eth_stats_get(_if->get_port_id(), &stats1);
+
+    stats->ipackets   += stats1.ipackets - prev_stats->ipackets;
+    // Some drivers report input byte counts without Ethernet FCS (4 bytes), we need to fix the reported numbers
+    stats->ibytes += stats1.ibytes - prev_stats->ibytes + (stats1.ipackets - prev_stats->ipackets) * fix_i;
+    stats->opackets   += stats1.opackets - prev_stats->opackets;
+    // Some drivers report output byte counts without Ethernet FCS (4 bytes), we need to fix the reported numbers
+    stats->obytes += stats1.obytes - prev_stats->obytes + (stats1.opackets - prev_stats->opackets) * fix_o;
+    stats->f_ipackets += 0;
+    stats->f_ibytes   += 0;
+    stats->ierrors    += stats1.imissed + stats1.ierrors + stats1.rx_nombuf
+        - prev_stats->imissed - prev_stats->ierrors - prev_stats->rx_nombuf;
+    stats->oerrors    += stats1.oerrors - prev_stats->oerrors;
+    stats->imcasts    += 0;
+    stats->rx_nombuf  += stats1.rx_nombuf - prev_stats->rx_nombuf;
+
+    prev_stats->ipackets = stats1.ipackets;
+    prev_stats->ibytes = stats1.ibytes;
+    prev_stats->opackets = stats1.opackets;
+    prev_stats->obytes = stats1.obytes;
+    prev_stats->imissed = stats1.imissed;
+    prev_stats->oerrors = stats1.oerrors;
+    prev_stats->ierrors = stats1.ierrors;
+    prev_stats->rx_nombuf = stats1.rx_nombuf;
+}
+
 // in 1G we need to wait if links became ready to soon
 void CTRexExtendedDriverBase1G::wait_after_link_up(){
     wait_x_sec(6 + CGlobalInfo::m_options.m_wait_before_traffic);
@@ -6701,31 +6733,7 @@ int CTRexExtendedDriverBase40G::dump_fdir_global_stats(CPhyEthIF * _if, FILE *fd
 }
 
 void CTRexExtendedDriverBase40G::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats) {
-    struct rte_eth_stats stats1;
-    struct rte_eth_stats *prev_stats = &stats->m_prev_stats;
-    rte_eth_stats_get(_if->get_port_id(), &stats1);
-
-    stats->ipackets += stats1.ipackets - prev_stats->ipackets;
-    stats->ibytes   += stats1.ibytes - prev_stats->ibytes;
-    stats->opackets += stats1.opackets - prev_stats->opackets;
-    // Since this driver report obytes count without Ethernet FCS (4 bytes), we need to fix the reported numbers
-    stats->obytes   += stats1.obytes - prev_stats->obytes + (stats1.opackets - prev_stats->opackets) * 4;
-    stats->f_ipackets += 0;
-    stats->f_ibytes   += 0;
-    stats->ierrors    += stats1.imissed + stats1.ierrors + stats1.rx_nombuf
-        - prev_stats->imissed - prev_stats->ierrors - prev_stats->rx_nombuf;
-    stats->oerrors    += stats1.oerrors - prev_stats->oerrors;
-    stats->imcasts    += 0;
-    stats->rx_nombuf  += stats1.rx_nombuf - prev_stats->rx_nombuf;
-
-    prev_stats->ipackets = stats1.ipackets;
-    prev_stats->ibytes = stats1.ibytes;
-    prev_stats->opackets = stats1.opackets;
-    prev_stats->obytes = stats1.obytes;
-    prev_stats->imissed = stats1.imissed;
-    prev_stats->oerrors = stats1.oerrors;
-    prev_stats->ierrors = stats1.ierrors;
-    prev_stats->rx_nombuf = stats1.rx_nombuf;
+    get_extended_stats_fixed(_if, stats, 0, 4);
 }
 
 int CTRexExtendedDriverBase40G::wait_for_stable_link(){
@@ -6945,33 +6953,7 @@ int CTRexExtendedDriverBaseMlnx5G::dump_fdir_global_stats(CPhyEthIF * _if, FILE
 }
 
 void CTRexExtendedDriverBaseMlnx5G::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){
-
-    struct rte_eth_stats stats1;
-    struct rte_eth_stats *prev_stats = &stats->m_prev_stats;
-    rte_eth_stats_get(_if->get_port_id(), &stats1);
-
-    stats->ipackets += stats1.ipackets - prev_stats->ipackets;
-    stats->ibytes   += stats1.ibytes - prev_stats->ibytes +
-        + (stats1.ipackets << 2) - (prev_stats->ipackets << 2);
-    stats->opackets += stats1.opackets - prev_stats->opackets;
-    stats->obytes   += stats1.obytes - prev_stats->obytes
-        + (stats1.opackets << 2) - (prev_stats->opackets << 2);
-    stats->f_ipackets += 0;
-    stats->f_ibytes   += 0;
-    stats->ierrors    += stats1.imissed + stats1.ierrors + stats1.rx_nombuf
-        - prev_stats->imissed - prev_stats->ierrors - prev_stats->rx_nombuf;
-    stats->oerrors    += stats1.oerrors - prev_stats->oerrors;
-    stats->imcasts    += 0;
-    stats->rx_nombuf  += stats1.rx_nombuf - prev_stats->rx_nombuf;
-
-    prev_stats->ipackets = stats1.ipackets;
-    prev_stats->ibytes = stats1.ibytes;
-    prev_stats->opackets = stats1.opackets;
-    prev_stats->obytes = stats1.obytes;
-    prev_stats->imissed = stats1.imissed;
-    prev_stats->oerrors = stats1.oerrors;
-    prev_stats->ierrors = stats1.ierrors;
-    prev_stats->rx_nombuf = stats1.rx_nombuf;
+        get_extended_stats_fixed(_if, stats, 4, 4);
 }
 
 int CTRexExtendedDriverBaseMlnx5G::wait_for_stable_link(){
@@ -7108,31 +7090,8 @@ void CTRexExtendedDriverBaseVIC::clear_extended_stats(CPhyEthIF * _if){
 }
 
 void CTRexExtendedDriverBaseVIC::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats) {
-    struct rte_eth_stats stats1;
-    struct rte_eth_stats *prev_stats = &stats->m_prev_stats;
-    rte_eth_stats_get(_if->get_port_id(), &stats1);
-
-    stats->ipackets += stats1.ipackets - prev_stats->ipackets;
-    stats->ibytes   += stats1.ibytes - prev_stats->ibytes
-         - ((stats1.ipackets << 2) - (prev_stats->ipackets << 2));
-    stats->opackets += stats1.opackets - prev_stats->opackets;
-    stats->obytes   += stats1.obytes - prev_stats->obytes;
-    stats->f_ipackets += 0;
-    stats->f_ibytes   += 0;
-    stats->ierrors    += stats1.imissed + stats1.ierrors + stats1.rx_nombuf
-        - prev_stats->imissed - prev_stats->ierrors - prev_stats->rx_nombuf;
-    stats->oerrors    += stats1.oerrors - prev_stats->oerrors;
-    stats->imcasts    += 0;
-    stats->rx_nombuf  += stats1.rx_nombuf - prev_stats->rx_nombuf;
-
-    prev_stats->ipackets = stats1.ipackets;
-    prev_stats->ibytes = stats1.ibytes;
-    prev_stats->opackets = stats1.opackets;
-    prev_stats->obytes = stats1.obytes;
-    prev_stats->imissed = stats1.imissed;
-    prev_stats->oerrors = stats1.oerrors;
-    prev_stats->ierrors = stats1.ierrors;
-    prev_stats->rx_nombuf = stats1.rx_nombuf;
+    // In VIC, we need to reduce 4 bytes from the amount reported for each incoming packet
+    get_extended_stats_fixed(_if, stats, -4, 0);
 }
 
 int CTRexExtendedDriverBaseVIC::verify_fw_ver(int port_id) {
@@ -7190,151 +7149,56 @@ CFlowStatParser *CTRexExtendedDriverBaseVIC::get_flow_stat_parser() {
 
 
 /////////////////////////////////////////////////////////////////////////////////////
-
-
-void CTRexExtendedDriverBase1GVm::update_configuration(port_cfg_t * cfg){
-    struct rte_eth_dev_info dev_info;
-    rte_eth_dev_info_get((uint8_t) 0,&dev_info);
-
+void CTRexExtendedDriverVirtio::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.txq_flags=dev_info.default_txconf.txq_flags;
-
+    // must have this, otherwise the driver fail at init
+    cfg->m_tx_conf.txq_flags |= ETH_TXQ_FLAGS_NOXSUMS;
 }
 
-
-int CTRexExtendedDriverBase1GVm::configure_rx_filter_rules(CPhyEthIF * _if){
+int CTRexExtendedDriverVirtio::configure_rx_filter_rules(CPhyEthIF * _if){
     return (0);
 }
 
-void CTRexExtendedDriverBase1GVm::clear_extended_stats(CPhyEthIF * _if){
-
+void CTRexExtendedDriverVirtio::clear_extended_stats(CPhyEthIF * _if){
     rte_eth_stats_reset(_if->get_port_id());
-
 }
 
-int CTRexExtendedDriverBase1GVm::stop_queue(CPhyEthIF * _if, uint16_t q_num) {
+int CTRexExtendedDriverVirtio::stop_queue(CPhyEthIF * _if, uint16_t q_num) {
     return (0);
 }
 
 void CTRexExtendedDriverBaseE1000::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){
-    struct rte_eth_stats stats1;
-    struct rte_eth_stats *prev_stats = &stats->m_prev_stats;
-    rte_eth_stats_get(_if->get_port_id(), &stats1);
-
-    stats->ipackets   += stats1.ipackets - prev_stats->ipackets;
-    stats->ibytes     += stats1.ibytes - prev_stats->ibytes ;
-    stats->opackets   += stats1.opackets - prev_stats->opackets;
-    stats->obytes     += stats1.obytes - prev_stats->obytes + (stats1.opackets - prev_stats->opackets) * 4;
-    stats->f_ipackets += 0;
-    stats->f_ibytes   += 0;
-    stats->ierrors    += stats1.imissed + stats1.ierrors + stats1.rx_nombuf
-        - prev_stats->imissed - prev_stats->ierrors - prev_stats->rx_nombuf;
-    stats->oerrors    += stats1.oerrors - prev_stats->oerrors;
-    stats->imcasts    += 0;
-    stats->rx_nombuf  += stats1.rx_nombuf - prev_stats->rx_nombuf;
-
-    prev_stats->ipackets = stats1.ipackets;
-    prev_stats->ibytes = stats1.ibytes;
-    prev_stats->opackets = stats1.opackets;
-    prev_stats->obytes = stats1.obytes;
-    prev_stats->imissed = stats1.imissed;
-    prev_stats->oerrors = stats1.oerrors;
-    prev_stats->ierrors = stats1.ierrors;
-    prev_stats->rx_nombuf = stats1.rx_nombuf;
+    get_extended_stats_fixed(_if, stats, 0, 4);
 }
 
-
-void CTRexExtendedDriverBaseVirtio::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){
-    struct rte_eth_stats stats1;
-    struct rte_eth_stats *prev_stats = &stats->m_prev_stats;
-    rte_eth_stats_get(_if->get_port_id(), &stats1);
-
-    stats->ipackets   += stats1.ipackets - prev_stats->ipackets;
-    stats->ibytes     += stats1.ibytes - prev_stats->ibytes +(stats1.ipackets - prev_stats->ipackets) * 4;
-    stats->opackets   += stats1.opackets - prev_stats->opackets;
-    stats->obytes     += stats1.obytes - prev_stats->obytes + (stats1.opackets - prev_stats->opackets) * 4;
-    stats->f_ipackets += 0;
-    stats->f_ibytes   += 0;
-    stats->ierrors    += stats1.imissed + stats1.ierrors + stats1.rx_nombuf
-        - prev_stats->imissed - prev_stats->ierrors - prev_stats->rx_nombuf;
-    stats->oerrors    += stats1.oerrors - prev_stats->oerrors;
-    stats->imcasts    += 0;
-    stats->rx_nombuf  += stats1.rx_nombuf - prev_stats->rx_nombuf;
-
-    prev_stats->ipackets = stats1.ipackets;
-    prev_stats->ibytes = stats1.ibytes;
-    prev_stats->opackets = stats1.opackets;
-    prev_stats->obytes = stats1.obytes;
-    prev_stats->imissed = stats1.imissed;
-    prev_stats->oerrors = stats1.oerrors;
-    prev_stats->ierrors = stats1.ierrors;
-    prev_stats->rx_nombuf = stats1.rx_nombuf;
+void CTRexExtendedDriverVirtio::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats) {
+    get_extended_stats_fixed(_if, stats, 4, 4);
 }
 
-void CTRexExtendedDriverBaseVmxnet3::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){
-    struct rte_eth_stats stats1;
-    struct rte_eth_stats *prev_stats = &stats->m_prev_stats;
-    rte_eth_stats_get(_if->get_port_id(), &stats1);
-
-    stats->ipackets   += stats1.ipackets - prev_stats->ipackets;
-    stats->ibytes     += stats1.ibytes - prev_stats->ibytes +(stats1.ipackets - prev_stats->ipackets) * 4;
-    stats->opackets   += stats1.opackets - prev_stats->opackets;
-    stats->obytes     += stats1.obytes - prev_stats->obytes + (stats1.opackets - prev_stats->opackets) * 4;
-    stats->f_ipackets += 0;
-    stats->f_ibytes   += 0;
-    stats->ierrors    += stats1.imissed + stats1.ierrors + stats1.rx_nombuf
-        - prev_stats->imissed - prev_stats->ierrors - prev_stats->rx_nombuf;
-    stats->oerrors    += stats1.oerrors - prev_stats->oerrors;
-    stats->imcasts    += 0;
-    stats->rx_nombuf  += stats1.rx_nombuf - prev_stats->rx_nombuf;
-
-    prev_stats->ipackets = stats1.ipackets;
-    prev_stats->ibytes = stats1.ibytes;
-    prev_stats->opackets = stats1.opackets;
-    prev_stats->obytes = stats1.obytes;
-    prev_stats->imissed = stats1.imissed;
-    prev_stats->oerrors = stats1.oerrors;
-    prev_stats->ierrors = stats1.ierrors;
-    prev_stats->rx_nombuf = stats1.rx_nombuf;
+int CTRexExtendedDriverVirtio::wait_for_stable_link(){
+    wait_x_sec(CGlobalInfo::m_options.m_wait_before_traffic);
+    return (0);
 }
 
-
-void CTRexExtendedDriverBase1GVm::get_extended_stats(CPhyEthIF * _if,CPhyEthIFStats *stats){
-    struct rte_eth_stats stats1;
-    struct rte_eth_stats *prev_stats = &stats->m_prev_stats;
-    rte_eth_stats_get(_if->get_port_id(), &stats1);
-
-    stats->ipackets   += stats1.ipackets - prev_stats->ipackets;
-    stats->ibytes     += stats1.ibytes - prev_stats->ibytes;
-    stats->opackets   += stats1.opackets - prev_stats->opackets;
-    stats->obytes     += stats1.obytes - prev_stats->obytes;
-    stats->f_ipackets += 0;
-    stats->f_ibytes   += 0;
-    stats->ierrors    += stats1.imissed + stats1.ierrors + stats1.rx_nombuf
-        - prev_stats->imissed - prev_stats->ierrors - prev_stats->rx_nombuf;
-    stats->oerrors    += stats1.oerrors - prev_stats->oerrors;
-    stats->imcasts    += 0;
-    stats->rx_nombuf  += stats1.rx_nombuf - prev_stats->rx_nombuf;
-
-    prev_stats->ipackets = stats1.ipackets;
-    prev_stats->ibytes = stats1.ibytes;
-    prev_stats->opackets = stats1.opackets;
-    prev_stats->obytes = stats1.obytes;
-    prev_stats->imissed = stats1.imissed;
-    prev_stats->oerrors = stats1.oerrors;
-    prev_stats->ierrors = stats1.ierrors;
-    prev_stats->rx_nombuf = stats1.rx_nombuf;
+/////////////////////////////////////////////////////////// VMxnet3
+void CTRexExtendedDriverVmxnet3::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;
+    // must have this, otherwise the driver fail at init
+    cfg->m_tx_conf.txq_flags |= ETH_TXQ_FLAGS_NOXSUMSCTP;
 }
 
-int CTRexExtendedDriverBase1GVm::wait_for_stable_link(){
-    wait_x_sec(CGlobalInfo::m_options.m_wait_before_traffic);
-    return (0);
+///////////////////////////////////////////////////////// VF
+void CTRexExtendedDriverI40evf::update_configuration(port_cfg_t * cfg) {
+    cfg->m_tx_conf.tx_thresh.pthresh = TX_PTHRESH;
+    cfg->m_tx_conf.tx_thresh.hthresh = TX_HTHRESH;
+    cfg->m_tx_conf.tx_thresh.wthresh = TX_WTHRESH;
 }
 
 
-
 /**
  * convert chain of mbuf to one big mbuf
  *