dpdk: allow interface name to be specified from startup.conf
[vpp.git] / src / plugins / dpdk / device / init.c
index c130dbc..6cde041 100644 (file)
@@ -320,10 +320,6 @@ dpdk_lib_init (dpdk_main_t * dm)
                        pci_addr.as_u32);
        }
 
-      if (p)
-       devconf = pool_elt_at_index (dm->conf->dev_confs, p[0]);
-      else
-       devconf = &dm->conf->default_devconf;
 
       /* Create vnet interface */
       vec_add2_aligned (dm->devices, xd, 1, CLIB_CACHE_LINE_BYTES);
@@ -331,6 +327,14 @@ dpdk_lib_init (dpdk_main_t * dm)
       xd->nb_tx_desc = DPDK_NB_TX_DESC_DEFAULT;
       xd->cpu_socket = (i8) rte_eth_dev_socket_id (i);
 
+      if (p)
+       {
+         devconf = pool_elt_at_index (dm->conf->dev_confs, p[0]);
+         xd->name = devconf->name;
+       }
+      else
+       devconf = &dm->conf->default_devconf;
+
       /* Handle interface naming for devices with multiple ports sharing same PCI ID */
       if (pci_dev)
        {
@@ -363,6 +367,12 @@ dpdk_lib_init (dpdk_main_t * dm)
       clib_memcpy (&xd->tx_conf, &dev_info.default_txconf,
                   sizeof (struct rte_eth_txconf));
 
+      if (dev_info.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 (dm->conf->no_multi_seg)
        {
 #if RTE_VERSION < RTE_VERSION_NUM(18, 8, 0, 0)
@@ -500,6 +510,19 @@ dpdk_lib_init (dpdk_main_t * dm)
 #elif RTE_VERSION < RTE_VERSION_NUM(18, 11, 0, 0)
              xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
 #endif
+
+             if (dm->conf->no_tx_checksum_offload == 0)
+               {
+#if RTE_VERSION < RTE_VERSION_NUM(18, 8, 0, 0)
+                 xd->tx_conf.txq_flags &= ~(ETH_TXQ_FLAGS_NOXSUMUDP |
+                                                    ETH_TXQ_FLAGS_NOXSUMTCP);
+#else
+                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+                 xd->port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+#endif
+                 xd->flags |=
+                   DPDK_DEVICE_FLAG_TX_OFFLOAD;
+               }
              break;
 
            case VNET_DPDK_PMD_ENA:
@@ -1009,6 +1032,8 @@ dpdk_device_config (dpdk_config_main_t * conf, vlib_pci_addr_t pci_addr,
        ;
       else if (unformat (input, "num-tx-desc %u", &devconf->num_tx_desc))
        ;
+      else if (unformat (input, "name %s", &devconf->name))
+       ;
       else if (unformat (input, "workers %U", unformat_bitmap_list,
                         &devconf->workers))
        ;
@@ -1584,54 +1609,10 @@ dpdk_update_link_state (dpdk_device_t * xd, f64 now)
          break;
        }
     }
-  if (hw_flags_chg || (xd->link.link_speed != prev_link.link_speed))
-    {
-      hw_flags_chg = 1;
-      switch (xd->link.link_speed)
-       {
-       case ETH_SPEED_NUM_10M:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_10M;
-         break;
-       case ETH_SPEED_NUM_100M:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_100M;
-         break;
-       case ETH_SPEED_NUM_1G:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_1G;
-         break;
-       case ETH_SPEED_NUM_2_5G:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_2_5G;
-         break;
-       case ETH_SPEED_NUM_5G:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_5G;
-         break;
-       case ETH_SPEED_NUM_10G:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_10G;
-         break;
-       case ETH_SPEED_NUM_20G:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_20G;
-         break;
-       case ETH_SPEED_NUM_25G:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_25G;
-         break;
-       case ETH_SPEED_NUM_40G:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_40G;
-         break;
-       case ETH_SPEED_NUM_50G:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_50G;
-         break;
-       case ETH_SPEED_NUM_56G:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_56G;
-         break;
-       case ETH_SPEED_NUM_100G:
-         hw_flags |= VNET_HW_INTERFACE_FLAG_SPEED_100G;
-         break;
-       case 0:
-         break;
-       default:
-         dpdk_log_warn ("unknown link speed %d", xd->link.link_speed);
-         break;
-       }
-    }
+  if (xd->link.link_speed != prev_link.link_speed)
+    vnet_hw_interface_set_link_speed (vnm, xd->hw_if_index,
+                                     xd->link.link_speed * 1000);
+
   if (hw_flags_chg)
     {
       if (LINK_STATE_ELOGS)
@@ -1849,10 +1830,10 @@ dpdk_init (vlib_main_t * vm)
   vec_add1 (dm->conf->eal_init_args, (u8 *) "vnet");
 
   /* Default vlib_buffer_t flags, DISABLES tcp/udp checksumming... */
-  dm->buffer_flags_template =
-    (VLIB_BUFFER_TOTAL_LENGTH_VALID | VLIB_BUFFER_EXT_HDR_VALID
-     | VNET_BUFFER_F_L4_CHECKSUM_COMPUTED |
-     VNET_BUFFER_F_L4_CHECKSUM_CORRECT | VNET_BUFFER_F_L2_HDR_OFFSET_VALID);
+  dm->buffer_flags_template = (VLIB_BUFFER_TOTAL_LENGTH_VALID |
+                              VLIB_BUFFER_EXT_HDR_VALID |
+                              VNET_BUFFER_F_L4_CHECKSUM_COMPUTED |
+                              VNET_BUFFER_F_L4_CHECKSUM_CORRECT);
 
   dm->stat_poll_interval = DPDK_STATS_POLL_INTERVAL;
   dm->link_state_poll_interval = DPDK_LINK_POLL_INTERVAL;