dpdk: bump to DPDK v21.11
[vpp.git] / src / plugins / dpdk / device / init.c
index 80d85a8..1d3e061 100644 (file)
@@ -80,36 +80,6 @@ port_type_from_speed_capa (struct rte_eth_dev_info *dev_info)
   return VNET_DPDK_PORT_TYPE_UNKNOWN;
 }
 
-static dpdk_port_type_t
-port_type_from_link_speed (u32 link_speed)
-{
-  switch (link_speed)
-    {
-    case ETH_SPEED_NUM_1G:
-      return VNET_DPDK_PORT_TYPE_ETH_1G;
-    case ETH_SPEED_NUM_2_5G:
-      return VNET_DPDK_PORT_TYPE_ETH_2_5G;
-    case ETH_SPEED_NUM_5G:
-      return VNET_DPDK_PORT_TYPE_ETH_5G;
-    case ETH_SPEED_NUM_10G:
-      return VNET_DPDK_PORT_TYPE_ETH_10G;
-    case ETH_SPEED_NUM_20G:
-      return VNET_DPDK_PORT_TYPE_ETH_20G;
-    case ETH_SPEED_NUM_25G:
-      return VNET_DPDK_PORT_TYPE_ETH_25G;
-    case ETH_SPEED_NUM_40G:
-      return VNET_DPDK_PORT_TYPE_ETH_40G;
-    case ETH_SPEED_NUM_50G:
-      return VNET_DPDK_PORT_TYPE_ETH_50G;
-    case ETH_SPEED_NUM_56G:
-      return VNET_DPDK_PORT_TYPE_ETH_56G;
-    case ETH_SPEED_NUM_100G:
-      return VNET_DPDK_PORT_TYPE_ETH_100G;
-    default:
-      return VNET_DPDK_PORT_TYPE_UNKNOWN;
-    }
-}
-
 static u32
 dpdk_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hi, u32 flags)
 {
@@ -121,14 +91,19 @@ dpdk_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hi, u32 flags)
     {
     case ETHERNET_INTERFACE_FLAG_DEFAULT_L3:
       /* set to L3/non-promisc mode */
-      xd->flags &= ~DPDK_DEVICE_FLAG_PROMISC;
+      dpdk_device_flag_set (xd, DPDK_DEVICE_FLAG_PROMISC, 0);
       break;
     case ETHERNET_INTERFACE_FLAG_ACCEPT_ALL:
-      xd->flags |= DPDK_DEVICE_FLAG_PROMISC;
+      dpdk_device_flag_set (xd, DPDK_DEVICE_FLAG_PROMISC, 1);
       break;
     case ETHERNET_INTERFACE_FLAG_MTU:
-      xd->port_conf.rxmode.max_rx_pkt_len = hi->max_packet_bytes;
-      dpdk_device_setup (xd);
+      if (xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP)
+       rte_eth_dev_stop (xd->port_id);
+      rte_eth_dev_set_mtu (xd->port_id, hi->max_packet_bytes);
+      if (xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP)
+       rte_eth_dev_start (xd->port_id);
+      dpdk_log_debug ("[%u] mtu changed to %u", xd->port_id,
+                     hi->max_packet_bytes);
       return 0;
     default:
       return ~0;
@@ -145,12 +120,6 @@ dpdk_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hi, u32 flags)
   return old;
 }
 
-static int
-dpdk_port_crc_strip_enabled (dpdk_device_t * xd)
-{
-  return !(xd->port_conf.rxmode.offloads & DEV_RX_OFFLOAD_KEEP_CRC);
-}
-
 /* The function check_l3cache helps check if Level 3 cache exists or not on current CPUs
   return value 1: exist.
   return value 0: not exist.
@@ -192,23 +161,12 @@ check_l3cache ()
   return 0;
 }
 
-static void
-dpdk_enable_l4_csum_offload (dpdk_device_t * xd)
-{
-  xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
-  xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
-  xd->flags |= DPDK_DEVICE_FLAG_TX_OFFLOAD |
-    DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM;
-}
-
 static clib_error_t *
 dpdk_lib_init (dpdk_main_t * dm)
 {
   vnet_main_t *vnm = vnet_get_main ();
   u32 nports;
-  u32 mtu, max_rx_frame;
   u16 port_id;
-  clib_error_t *error;
   vlib_main_t *vm = vlib_get_main ();
   vlib_thread_main_t *tm = vlib_get_thread_main ();
   vnet_device_main_t *vdm = &vnet_device_main;
@@ -217,7 +175,6 @@ dpdk_lib_init (dpdk_main_t * dm)
   dpdk_device_t *xd;
   vlib_pci_addr_t last_pci_addr;
   u32 last_pci_addr_port = 0;
-  u8 af_packet_instance_num = 0;
   last_pci_addr.as_u32 = ~0;
 
   nports = rte_eth_dev_count_avail ();
@@ -245,6 +202,8 @@ dpdk_lib_init (dpdk_main_t * dm)
   dm->default_port_conf.n_tx_desc = DPDK_NB_TX_DESC_DEFAULT;
   dm->default_port_conf.n_rx_queues = 1;
   dm->default_port_conf.n_tx_queues = tm->n_vlib_mains;
+  dm->default_port_conf.rss_hf = ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP;
+  dm->default_port_conf.max_lro_pkt_size = DPDK_MAX_LRO_SIZE_DEFAULT;
 
   if ((clib_mem_get_default_hugepage_size () == 2 << 20) &&
       check_l3cache () == 0)
@@ -258,6 +217,7 @@ dpdk_lib_init (dpdk_main_t * dm)
       struct rte_vmbus_device *vmbus_dev;
       dpdk_portid_t next_port_id;
       dpdk_device_config_t *devconf = 0;
+      vnet_eth_interface_registration_t eir = {};
       vlib_pci_addr_t pci_addr;
       vlib_vmbus_addr_t vmbus_addr;
       uword *p = 0;
@@ -362,61 +322,8 @@ dpdk_lib_init (dpdk_main_t * dm)
       else
        last_pci_addr.as_u32 = ~0;
 
-      clib_memcpy (&xd->tx_conf, &di.default_txconf,
-                  sizeof (struct rte_eth_txconf));
-
-      if (di.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM)
-       {
-         xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_IPV4_CKSUM;
-         xd->flags |= DPDK_DEVICE_FLAG_RX_IP4_CKSUM;
-       }
-
-      if (xd->conf.enable_tcp_udp_checksum)
-       {
-         if (di.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM)
-           xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_UDP_CKSUM;
-         if (di.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM)
-           xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_TCP_CKSUM;
-         if (di.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM)
-           xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
-
-         if (xd->conf.enable_outer_checksum_offload)
-           {
-             if (di.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
-               xd->port_conf.txmode.offloads |=
-                 DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
-             if (di.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM)
-               xd->port_conf.txmode.offloads |=
-                 DEV_TX_OFFLOAD_OUTER_UDP_CKSUM;
-           }
-       }
-
-      if (xd->conf.enable_lro)
-       {
-         if (di.rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO)
-           {
-             xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_TCP_LRO;
-             if (devconf->max_lro_pkt_size)
-               xd->port_conf.rxmode.max_lro_pkt_size =
-                 devconf->max_lro_pkt_size;
-             else
-               xd->port_conf.rxmode.max_lro_pkt_size =
-                 DPDK_MAX_LRO_SIZE_DEFAULT;
-           }
-       }
-      if (xd->conf.no_multi_seg)
-       {
-         xd->port_conf.txmode.offloads &= ~DEV_TX_OFFLOAD_MULTI_SEGS;
-         xd->port_conf.rxmode.offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
-         xd->port_conf.rxmode.offloads &= ~DEV_RX_OFFLOAD_SCATTER;
-       }
-      else
-       {
-         xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_MULTI_SEGS;
-         xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
-         xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_SCATTER;
-         xd->flags |= DPDK_DEVICE_FLAG_MAYBE_MULTISEG;
-       }
+      if (devconf->max_lro_pkt_size)
+       xd->conf.max_lro_pkt_size = devconf->max_lro_pkt_size;
 
       xd->conf.n_tx_queues = clib_min (di.max_tx_queues, xd->conf.n_tx_queues);
 
@@ -428,24 +335,25 @@ dpdk_lib_init (dpdk_main_t * dm)
          di.max_rx_queues >= devconf->num_rx_queues)
        {
          xd->conf.n_rx_queues = devconf->num_rx_queues;
-         xd->port_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;
-         if (devconf->rss_fn == 0)
-           xd->port_conf.rx_adv_conf.rss_conf.rss_hf =
-             ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP;
-         else
+         if (devconf->rss_fn)
            {
              u64 unsupported_bits;
-             xd->port_conf.rx_adv_conf.rss_conf.rss_hf = devconf->rss_fn;
-             unsupported_bits = xd->port_conf.rx_adv_conf.rss_conf.rss_hf;
+             xd->conf.rss_hf = devconf->rss_fn;
+             unsupported_bits = xd->conf.rss_hf;
              unsupported_bits &= ~di.flow_type_rss_offloads;
              if (unsupported_bits)
                dpdk_log_warn ("Unsupported RSS hash functions: %U",
                               format_dpdk_rss_hf_name, unsupported_bits);
            }
-         xd->port_conf.rx_adv_conf.rss_conf.rss_hf &=
-           di.flow_type_rss_offloads;
+         xd->conf.rss_hf &= di.flow_type_rss_offloads;
        }
 
+      if (devconf->num_rx_desc)
+       xd->conf.n_rx_desc = devconf->num_rx_desc;
+
+      if (devconf->num_tx_desc)
+       xd->conf.n_tx_desc = devconf->num_tx_desc;
+
       vec_validate_aligned (xd->rx_queues, xd->conf.n_rx_queues - 1,
                            CLIB_CACHE_LINE_BYTES);
 
@@ -473,125 +381,70 @@ dpdk_lib_init (dpdk_main_t * dm)
            {
              /* Drivers with valid speed_capa set */
            case VNET_DPDK_PMD_I40E:
-             xd->flags |= DPDK_DEVICE_FLAG_INT_UNMASKABLE;
+             dpdk_device_flag_set (xd, DPDK_DEVICE_FLAG_INT_UNMASKABLE, 1);
              /* fall through */
            case VNET_DPDK_PMD_E1000EM:
            case VNET_DPDK_PMD_IGB:
            case VNET_DPDK_PMD_IGC:
            case VNET_DPDK_PMD_IXGBE:
            case VNET_DPDK_PMD_ICE:
-             xd->port_type = port_type_from_speed_capa (&di);
              xd->supported_flow_actions =
                VNET_FLOW_ACTION_MARK | VNET_FLOW_ACTION_REDIRECT_TO_NODE |
                VNET_FLOW_ACTION_REDIRECT_TO_QUEUE |
                VNET_FLOW_ACTION_BUFFER_ADVANCE | VNET_FLOW_ACTION_COUNT |
                VNET_FLOW_ACTION_DROP | VNET_FLOW_ACTION_RSS;
-
-             if (xd->conf.no_tx_checksum_offload == 0)
-               {
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
-                 xd->flags |= DPDK_DEVICE_FLAG_TX_OFFLOAD |
-                              DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM;
-               }
-
-             xd->port_conf.intr_conf.rxq = 1;
-             break;
+             dpdk_device_flag_set (xd, DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM, 1);
+             xd->conf.enable_rxq_int = 1;
+             /* fall through */
            case VNET_DPDK_PMD_MLX5:
-             if (xd->conf.no_tx_checksum_offload == 0)
-               {
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
-                 xd->flags |= DPDK_DEVICE_FLAG_TX_OFFLOAD |
-                              DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM;
-               }
-             xd->port_type = port_type_from_speed_capa (&di);
-             break;
            case VNET_DPDK_PMD_CXGBE:
            case VNET_DPDK_PMD_MLX4:
            case VNET_DPDK_PMD_QEDE:
            case VNET_DPDK_PMD_BNXT:
+           case VNET_DPDK_PMD_ENIC:
              xd->port_type = port_type_from_speed_capa (&di);
              break;
 
              /* SR-IOV VFs */
            case VNET_DPDK_PMD_I40EVF:
-             xd->flags |= DPDK_DEVICE_FLAG_INT_UNMASKABLE;
+             dpdk_device_flag_set (xd, DPDK_DEVICE_FLAG_INT_UNMASKABLE, 1);
              /* fall through */
            case VNET_DPDK_PMD_IGBVF:
            case VNET_DPDK_PMD_IXGBEVF:
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
-             if (xd->conf.no_tx_checksum_offload == 0)
-               {
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
-                 xd->flags |= DPDK_DEVICE_FLAG_TX_OFFLOAD |
-                              DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM;
-               }
+             dpdk_device_flag_set (xd, DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM, 1);
              /* DPDK bug in multiqueue... */
              /* xd->port_conf.intr_conf.rxq = 1; */
              break;
 
              /* iAVF */
            case VNET_DPDK_PMD_IAVF:
-             xd->flags |= DPDK_DEVICE_FLAG_INT_UNMASKABLE;
+             dpdk_device_flag_set (xd, DPDK_DEVICE_FLAG_INT_UNMASKABLE, 1);
+             dpdk_device_flag_set (xd, DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM, 1);
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
              xd->supported_flow_actions =
                VNET_FLOW_ACTION_MARK | VNET_FLOW_ACTION_REDIRECT_TO_NODE |
                VNET_FLOW_ACTION_REDIRECT_TO_QUEUE |
                VNET_FLOW_ACTION_BUFFER_ADVANCE | VNET_FLOW_ACTION_COUNT |
                VNET_FLOW_ACTION_DROP | VNET_FLOW_ACTION_RSS;
-
-             if (xd->conf.no_tx_checksum_offload == 0)
-               {
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
-                 xd->flags |= DPDK_DEVICE_FLAG_TX_OFFLOAD |
-                              DPDK_DEVICE_FLAG_INTEL_PHDR_CKSUM;
-               }
              /* DPDK bug in multiqueue... */
              /* xd->port_conf.intr_conf.rxq = 1; */
              break;
 
            case VNET_DPDK_PMD_THUNDERX:
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
-
-             if (xd->conf.no_tx_checksum_offload == 0)
-               {
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
-                 xd->flags |= DPDK_DEVICE_FLAG_TX_OFFLOAD;
-               }
              break;
 
            case VNET_DPDK_PMD_ENA:
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
-             xd->port_conf.rxmode.offloads &= ~DEV_RX_OFFLOAD_SCATTER;
-             xd->port_conf.intr_conf.rxq = 1;
-             if (xd->conf.no_tx_checksum_offload == 0)
-               {
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
-                 xd->flags |= DPDK_DEVICE_FLAG_TX_OFFLOAD;
-               }
+             xd->conf.disable_rx_scatter = 1;
+             xd->conf.enable_rxq_int = 1;
              break;
 
            case VNET_DPDK_PMD_DPAA2:
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_10G;
              break;
 
-             /* Cisco VIC */
-           case VNET_DPDK_PMD_ENIC:
-             {
-               struct rte_eth_link l;
-               rte_eth_link_get_nowait (port_id, &l);
-               xd->port_type = port_type_from_link_speed (l.link_speed);
-               if (xd->conf.enable_tcp_udp_checksum)
-                 dpdk_enable_l4_csum_offload (xd);
-             }
-             break;
-
              /* Intel Red Rock Canyon */
            case VNET_DPDK_PMD_FM10K:
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_SWITCH;
@@ -599,38 +452,20 @@ dpdk_lib_init (dpdk_main_t * dm)
 
              /* virtio */
            case VNET_DPDK_PMD_VIRTIO:
-             xd->port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
+             xd->conf.disable_rss = 1;
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_1G;
              xd->conf.n_rx_desc = DPDK_NB_RX_DESC_VIRTIO;
              xd->conf.n_tx_desc = DPDK_NB_TX_DESC_VIRTIO;
-             /*
-              * Enable use of RX interrupts if supported.
-              *
-              * There is no device flag or capability for this, so
-              * use the same check that the virtio driver does.
-              */
-             if (pci_dev && rte_intr_cap_multiple (&pci_dev->intr_handle))
-               xd->port_conf.intr_conf.rxq = 1;
+             xd->conf.enable_rxq_int = 1;
              break;
 
              /* vmxnet3 */
            case VNET_DPDK_PMD_VMXNET3:
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_1G;
-             xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_MULTI_SEGS;
-             /* TCP csum offload not working although udp might work. Left
-              * disabled for now */
-             if (0 && (xd->conf.no_tx_checksum_offload == 0))
-               {
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM;
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
-                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
-                 xd->flags |= DPDK_DEVICE_FLAG_TX_OFFLOAD;
-               }
              break;
 
            case VNET_DPDK_PMD_AF_PACKET:
              xd->port_type = VNET_DPDK_PORT_TYPE_AF_PACKET;
-             xd->af_packet_instance_num = af_packet_instance_num++;
              break;
 
            case VNET_DPDK_PMD_VIRTIO_USER:
@@ -647,13 +482,11 @@ dpdk_lib_init (dpdk_main_t * dm)
 
            case VNET_DPDK_PMD_FAILSAFE:
              xd->port_type = VNET_DPDK_PORT_TYPE_FAILSAFE;
-             xd->port_conf.intr_conf.lsc = 1;
+             xd->conf.enable_lsc_int = 1;
              break;
 
            case VNET_DPDK_PMD_NETVSC:
              {
-               struct rte_eth_link l;
-               rte_eth_link_get_nowait (port_id, &l);
                xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
              }
              break;
@@ -683,85 +516,11 @@ dpdk_lib_init (dpdk_main_t * dm)
       /* assign interface to input thread */
       int q;
 
-      error = ethernet_register_interface (
-       vnm, dpdk_device_class.index, xd->device_index,
-       /* ethernet address */ addr, &xd->hw_if_index, dpdk_flag_change);
-      if (error)
-       return error;
-
-      /*
-       * Ensure default mtu is not > the mtu read from the hardware.
-       * Otherwise rte_eth_dev_configure() will fail and the port will
-       * not be available.
-       * Calculate max_frame_size and mtu supported by NIC
-       */
-      if (ETHERNET_MAX_PACKET_BYTES > di.max_rx_pktlen)
-       {
-         /*
-          * This device does not support the platforms's max frame
-          * size. Use it's advertised mru instead.
-          */
-         max_rx_frame = di.max_rx_pktlen;
-         mtu = di.max_rx_pktlen - sizeof (ethernet_header_t);
-       }
-      else
-       {
-         /* VPP treats MTU and max_rx_pktlen both equal to
-          * ETHERNET_MAX_PACKET_BYTES, if dev_info.max_rx_pktlen >=
-          * ETHERNET_MAX_PACKET_BYTES + sizeof(ethernet_header_t)
-          */
-         if (di.max_rx_pktlen >=
-             (ETHERNET_MAX_PACKET_BYTES + sizeof (ethernet_header_t)))
-           {
-             mtu = ETHERNET_MAX_PACKET_BYTES;
-             max_rx_frame = ETHERNET_MAX_PACKET_BYTES;
-
-             /*
-              * Some platforms do not account for Ethernet FCS (4 bytes) in
-              * MTU calculations. To interop with them increase mru but only
-              * if the device's settings can support it.
-              */
-             if (dpdk_port_crc_strip_enabled (xd) &&
-                 (di.max_rx_pktlen >= (ETHERNET_MAX_PACKET_BYTES +
-                                       sizeof (ethernet_header_t) + 4)))
-               {
-                 max_rx_frame += 4;
-               }
-           }
-         else
-           {
-             max_rx_frame = ETHERNET_MAX_PACKET_BYTES;
-             mtu = ETHERNET_MAX_PACKET_BYTES - sizeof (ethernet_header_t);
-
-             if (dpdk_port_crc_strip_enabled (xd) &&
-                 (di.max_rx_pktlen >= (ETHERNET_MAX_PACKET_BYTES + 4)))
-               {
-                 max_rx_frame += 4;
-               }
-           }
-       }
-
-      if (xd->pmd == VNET_DPDK_PMD_FAILSAFE)
-       {
-         /* failsafe device numerables are reported with active device only,
-          * need to query the mtu for current device setup to overwrite
-          * reported value.
-          */
-         uint16_t dev_mtu;
-         if (!rte_eth_dev_get_mtu (port_id, &dev_mtu))
-           {
-             mtu = dev_mtu;
-             max_rx_frame = mtu + sizeof (ethernet_header_t);
-
-             if (dpdk_port_crc_strip_enabled (xd))
-               {
-                 max_rx_frame += 4;
-               }
-           }
-       }
-
-      /*Set port rxmode config */
-      xd->port_conf.rxmode.max_rx_pkt_len = max_rx_frame;
+      eir.dev_class_index = dpdk_device_class.index;
+      eir.dev_instance = xd->device_index;
+      eir.address = addr;
+      eir.cb.flag_change = dpdk_flag_change;
+      xd->hw_if_index = vnet_eth_register_interface (vnm, &eir);
 
       sw = vnet_get_hw_sw_interface (vnm, xd->hw_if_index);
       xd->sw_if_index = sw->sw_if_index;
@@ -786,58 +545,30 @@ dpdk_lib_init (dpdk_main_t * dm)
              vnm, xd->hw_if_index, q, VNET_HW_IF_RXQ_THREAD_ANY);
          }
 
-      vnet_hw_if_update_runtime_data (vnm, xd->hw_if_index);
 
       /*Get vnet hardware interface */
       hi = vnet_get_hw_interface (vnm, xd->hw_if_index);
 
-      /*Override default max_packet_bytes and max_supported_bytes set in
-       * ethernet_register_interface() above*/
       if (hi)
        {
-         hi->max_packet_bytes = mtu;
-         hi->max_supported_packet_bytes = max_rx_frame;
          hi->numa_node = xd->cpu_socket;
 
          /* Indicate ability to support L3 DMAC filtering and
           * initialize interface to L3 non-promisc mode */
-         hi->caps |= VNET_HW_IF_CAP_MAC_FILTER;
          ethernet_set_flags (vnm, xd->hw_if_index,
                              ETHERNET_INTERFACE_FLAG_DEFAULT_L3);
        }
 
-      if (xd->conf.no_tx_checksum_offload == 0)
-       if (xd->flags & DPDK_DEVICE_FLAG_TX_OFFLOAD && hi != NULL)
-         {
-           hi->caps |= VNET_HW_IF_CAP_TX_IP4_CKSUM |
-                       VNET_HW_IF_CAP_TX_TCP_CKSUM |
-                       VNET_HW_IF_CAP_TX_UDP_CKSUM;
-           if (xd->conf.enable_outer_checksum_offload)
-             {
-               hi->caps |= VNET_HW_IF_CAP_TX_IP4_OUTER_CKSUM |
-                           VNET_HW_IF_CAP_TX_UDP_OUTER_CKSUM;
-             }
-         }
-      if (devconf->tso == DPDK_DEVICE_TSO_ON && hi != NULL)
+      if (devconf->tso == DPDK_DEVICE_TSO_ON)
        {
          /*tcp_udp checksum must be enabled*/
-         if ((xd->conf.enable_tcp_udp_checksum) &&
-             (hi->caps & VNET_HW_IF_CAP_TX_CKSUM))
-           {
-             hi->caps |= VNET_HW_IF_CAP_TCP_GSO;
-             xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_TSO;
-
-             if (xd->conf.enable_outer_checksum_offload &&
-                 (di.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
-               {
-                 xd->port_conf.txmode.offloads |=
-                   DEV_TX_OFFLOAD_VXLAN_TNL_TSO;
-                 hi->caps |= VNET_HW_IF_CAP_VXLAN_TNL_GSO;
-               }
-           }
+         if (xd->conf.enable_tcp_udp_checksum == 0)
+           dpdk_log_warn ("[%u] TCP/UDP checksum offload must be enabled",
+                          xd->port_id);
+         else if ((di.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0)
+           dpdk_log_warn ("[%u] TSO not supported by device", xd->port_id);
          else
-           clib_warning ("%s: TCP/UDP checksum offload must be enabled",
-                         hi->name);
+           xd->conf.enable_tso = 1;
        }
 
       dpdk_device_setup (xd);
@@ -856,19 +587,11 @@ dpdk_lib_init (dpdk_main_t * dm)
        dpdk_log_err ("setup failed for device %U. Errors:\n  %U",
                      format_dpdk_device_name, port_id,
                      format_dpdk_device_errors, xd);
-
-      if (hi)
-       hi->max_packet_bytes =
-         xd->port_conf.rxmode.max_rx_pkt_len - sizeof (ethernet_header_t);
-      else
-       dpdk_log_warn ("hi NULL");
-
-      if (xd->conf.no_multi_seg)
-       mtu = mtu > ETHER_MAX_LEN ? ETHER_MAX_LEN : mtu;
-
-      rte_eth_dev_set_mtu (xd->port_id, mtu);
     }
 
+  for (int i = 0; i < vec_len (dm->devices); i++)
+    vnet_hw_if_update_runtime_data (vnm, dm->devices[i].hw_if_index);
+
   return 0;
 }
 
@@ -1297,7 +1020,19 @@ dpdk_log_read_ready (clib_file_t * uf)
 
   while (unformat_user (&input, unformat_line, &line))
     {
-      dpdk_log_notice ("%v", line);
+      int skip = 0;
+      vec_add1 (line, 0);
+
+      /* unfortunatelly DPDK polutes log with this error messages
+       * even when we pass --in-memory which means no secondary process */
+      if (strstr ((char *) line, "WARNING! Base virtual address hint"))
+       skip = 1;
+      else if (strstr ((char *) line, "This may cause issues with mapping "
+                                     "memory into secondary processes"))
+       skip = 1;
+      vec_pop (line);
+      if (!skip)
+       dpdk_log_notice ("%v", line);
       vec_free (line);
     }
 
@@ -1353,13 +1088,13 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
            dm->default_port_conf.enable_outer_checksum_offload = 1;
        }
       else if (unformat (input, "no-tx-checksum-offload"))
-       dm->default_port_conf.no_tx_checksum_offload = 1;
+       dm->default_port_conf.disable_tx_checksum_offload = 1;
 
       else if (unformat (input, "decimal-interface-names"))
        conf->interface_name_format_decimal = 1;
 
       else if (unformat (input, "no-multi-seg"))
-       dm->default_port_conf.no_multi_seg = 1;
+       dm->default_port_conf.disable_multi_seg = 1;
       else if (unformat (input, "enable-lro"))
        dm->default_port_conf.enable_lro = 1;
       else if (unformat (input, "max-simd-bitwidth %U",