From 2155c64b103391cc5693ee849ad73d9b35f79903 Mon Sep 17 00:00:00 2001 From: Ido Barnea Date: Thu, 19 Jan 2017 18:09:38 +0200 Subject: Fixed support for i40evf + Refactor of VM drivers Signed-off-by: Ido Barnea --- .../regression/stateless_tests/stl_rx_test.py | 6 + src/main_dpdk.cpp | 332 ++++++--------------- 2 files changed, 104 insertions(+), 234 deletions(-) diff --git a/scripts/automation/regression/stateless_tests/stl_rx_test.py b/scripts/automation/regression/stateless_tests/stl_rx_test.py index a3efa01d..3d4ed977 100644 --- a/scripts/automation/regression/stateless_tests/stl_rx_test.py +++ b/scripts/automation/regression/stateless_tests/stl_rx_test.py @@ -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, diff --git a/src/main_dpdk.cpp b/src/main_dpdk.cpp index 1be84147..51c3197e 100644 --- a/src/main_dpdk.cpp +++ b/src/main_dpdk.cpp @@ -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; ienable_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 * -- cgit 1.2.3-korg