misc: fix coverity warnings
[vpp.git] / src / plugins / dpdk / device / init.c
index 5a6262c..2922ed3 100644 (file)
@@ -199,6 +199,15 @@ 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)
 {
@@ -214,29 +223,9 @@ dpdk_lib_init (dpdk_main_t * dm)
   dpdk_device_t *xd;
   vlib_pci_addr_t last_pci_addr;
   u32 last_pci_addr_port = 0;
-  vlib_thread_registration_t *tr_hqos;
-  uword *p_hqos;
-
-  u32 next_hqos_cpu = 0;
   u8 af_packet_instance_num = 0;
   last_pci_addr.as_u32 = ~0;
 
-  dm->hqos_cpu_first_index = 0;
-  dm->hqos_cpu_count = 0;
-
-  /* find out which cpus will be used for I/O TX */
-  p_hqos = hash_get_mem (tm->thread_registrations_by_name, "hqos-threads");
-  tr_hqos = p_hqos ? (vlib_thread_registration_t *) p_hqos[0] : 0;
-
-  if (tr_hqos && tr_hqos->count > 0)
-    {
-      dm->hqos_cpu_first_index = tr_hqos->first_index;
-      dm->hqos_cpu_count = tr_hqos->count;
-    }
-
-  vec_validate_aligned (dm->devices_by_hqos_cpu, tm->n_vlib_mains - 1,
-                       CLIB_CACHE_LINE_BYTES);
-
   nports = rte_eth_dev_count_avail ();
 
   if (nports < 1)
@@ -315,8 +304,14 @@ dpdk_lib_init (dpdk_main_t * dm)
       else
        devconf = &dm->conf->default_devconf;
 
+      /* Handle representor devices that share the same PCI ID */
+      if (dev_info.switch_info.domain_id != RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID)
+        {
+          if (dev_info.switch_info.port_id != (uint16_t)-1)
+            xd->interface_name_suffix = format (0, "%d", dev_info.switch_info.port_id);
+        }
       /* Handle interface naming for devices with multiple ports sharing same PCI ID */
-      if (pci_dev &&
+      else if (pci_dev &&
          ((next_port_id = rte_eth_find_next (i + 1)) != RTE_MAX_ETHPORTS))
        {
          struct rte_eth_dev_info di = { 0 };
@@ -354,6 +349,14 @@ dpdk_lib_init (dpdk_main_t * dm)
          xd->flags |= DPDK_DEVICE_FLAG_RX_IP4_CKSUM;
        }
 
+      if (dm->conf->enable_tcp_udp_checksum)
+       {
+         if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM)
+           xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_UDP_CKSUM;
+         if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM)
+           xd->port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_TCP_CKSUM;
+       }
+
       if (dm->conf->no_multi_seg)
        {
          xd->port_conf.txmode.offloads &= ~DEV_TX_OFFLOAD_MULTI_SEGS;
@@ -473,6 +476,25 @@ dpdk_lib_init (dpdk_main_t * dm)
                }
              break;
 
+             /* iAVF */
+           case VNET_DPDK_PMD_IAVF:
+        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;
+
+             if (dm->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;
+               }
+              break;
+
            case VNET_DPDK_PMD_THUNDERX:
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
 
@@ -496,6 +518,8 @@ dpdk_lib_init (dpdk_main_t * dm)
              /* Cisco VIC */
            case VNET_DPDK_PMD_ENIC:
              xd->port_type = port_type_from_link_speed (l.link_speed);
+             if (dm->conf->enable_tcp_udp_checksum)
+               dpdk_enable_l4_csum_offload (xd);
              break;
 
              /* Intel Red Rock Canyon */
@@ -505,6 +529,7 @@ dpdk_lib_init (dpdk_main_t * dm)
 
              /* virtio */
            case VNET_DPDK_PMD_VIRTIO:
+             xd->port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_1G;
              xd->nb_rx_desc = DPDK_NB_RX_DESC_VIRTIO;
              xd->nb_tx_desc = DPDK_NB_TX_DESC_VIRTIO;
@@ -596,38 +621,6 @@ dpdk_lib_init (dpdk_main_t * dm)
       /* assign interface to input thread */
       int q;
 
-      if (devconf->hqos_enabled)
-       {
-         xd->flags |= DPDK_DEVICE_FLAG_HQOS;
-
-         int cpu;
-         if (devconf->hqos.hqos_thread_valid)
-           {
-             if (devconf->hqos.hqos_thread >= dm->hqos_cpu_count)
-               return clib_error_return (0, "invalid HQoS thread index");
-
-             cpu = dm->hqos_cpu_first_index + devconf->hqos.hqos_thread;
-           }
-         else
-           {
-             if (dm->hqos_cpu_count == 0)
-               return clib_error_return (0, "no HQoS threads available");
-
-             cpu = dm->hqos_cpu_first_index + next_hqos_cpu;
-
-             next_hqos_cpu++;
-             if (next_hqos_cpu == dm->hqos_cpu_count)
-               next_hqos_cpu = 0;
-
-             devconf->hqos.hqos_thread_valid = 1;
-             devconf->hqos.hqos_thread = cpu;
-           }
-
-         dpdk_device_and_queue_t *dq;
-         vec_add2 (dm->devices_by_hqos_cpu[cpu], dq, 1);
-         dq->device = xd->device_index;
-         dq->queue_id = 0;
-       }
 
       error = ethernet_register_interface
        (dm->vnet_main, dpdk_device_class.index, xd->device_index,
@@ -770,14 +763,6 @@ dpdk_lib_init (dpdk_main_t * dm)
                      format_dpdk_device_name, i,
                      format_dpdk_device_errors, xd);
 
-      if (devconf->hqos_enabled)
-       {
-         clib_error_t *rv;
-         rv = dpdk_port_setup_hqos (xd, &devconf->hqos);
-         if (rv)
-           return rv;
-       }
-
       /*
        * A note on Cisco VIC (PMD_ENIC) and VLAN:
        *
@@ -958,16 +943,21 @@ dpdk_bind_devices_to_uio (dpdk_config_main_t * conf)
     /* Cavium FastlinQ QL41000 Series */
     else if (d->vendor_id == 0x1077 && d->device_id >= 0x8070 && d->device_id <= 0x8090)
       ;
-    /* Mellanox mlx4 */
+    /* Mellanox CX3, CX3VF */
     else if (d->vendor_id == 0x15b3 && d->device_id >= 0x1003 && d->device_id <= 0x1004)
       {
         continue;
       }
-    /* Mellanox mlx5 */
+    /* Mellanox CX4, CX4VF, CX4LX, CX4LXVF, CX5, CX5VF, CX5EX, CX5EXVF */
     else if (d->vendor_id == 0x15b3 && d->device_id >= 0x1013 && d->device_id <= 0x101a)
       {
         continue;
       }
+    /* Mellanox CX6, CX6VF, CX6DX, CX6DXVF */
+    else if (d->vendor_id == 0x15b3 && d->device_id >= 0x101b && d->device_id <= 0x101e)
+      {
+        continue;
+      }
     /* Broadcom NetXtreme S, and E series only */
     else if (d->vendor_id == 0x14e4 &&
        ((d->device_id >= 0x16c0 &&
@@ -1060,11 +1050,7 @@ dpdk_device_config (dpdk_config_main_t * conf, vlib_pci_addr_t pci_addr,
     }
 
   devconf->pci_addr.as_u32 = pci_addr.as_u32;
-  devconf->hqos_enabled = 0;
   devconf->tso = DPDK_DEVICE_TSO_DEFAULT;
-#if 0
-  dpdk_device_config_hqos_default (&devconf->hqos);
-#endif
 
   if (!input)
     return 0;
@@ -1097,19 +1083,6 @@ dpdk_device_config (dpdk_config_main_t * conf, vlib_pci_addr_t pci_addr,
        devconf->vlan_strip_offload = DPDK_DEVICE_VLAN_STRIP_OFF;
       else if (unformat (input, "vlan-strip-offload on"))
        devconf->vlan_strip_offload = DPDK_DEVICE_VLAN_STRIP_ON;
-      else
-       if (unformat
-           (input, "hqos %U", unformat_vlib_cli_sub_input, &sub_input))
-       {
-         devconf->hqos_enabled = 1;
-         error = unformat_hqos (&sub_input, &devconf->hqos);
-         if (error)
-           break;
-       }
-      else if (unformat (input, "hqos"))
-       {
-         devconf->hqos_enabled = 1;
-       }
       else if (unformat (input, "tso on"))
        {
          devconf->tso = DPDK_DEVICE_TSO_ON;
@@ -1118,6 +1091,8 @@ dpdk_device_config (dpdk_config_main_t * conf, vlib_pci_addr_t pci_addr,
        {
          devconf->tso = DPDK_DEVICE_TSO_OFF;
        }
+      else if (unformat (input, "devargs %s", &devconf->devargs))
+       ;
       else
        {
          error = clib_error_return (0, "unknown input `%U'",
@@ -1428,21 +1403,31 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input)
        /* copy tso config from default device */
        _(tso)
 
+       /* copy tso config from default device */
+       _(devargs)
+
     /* add DPDK EAL whitelist/blacklist entry */
     if (num_whitelisted > 0 && devconf->is_blacklisted == 0)
-      {
-       tmp = format (0, "-w%c", 0);
-       vec_add1 (conf->eal_init_args, tmp);
-       tmp = format (0, "%U%c", format_vlib_pci_addr, &devconf->pci_addr, 0);
-       vec_add1 (conf->eal_init_args, tmp);
-      }
+    {
+         tmp = format (0, "-w%c", 0);
+         vec_add1 (conf->eal_init_args, tmp);
+         if (devconf->devargs)
+         {
+           tmp = format (0, "%U,%s", format_vlib_pci_addr, &devconf->pci_addr, devconf->devargs, 0);
+         }
+         else
+         {
+           tmp = format (0, "%U%c", format_vlib_pci_addr, &devconf->pci_addr, 0);
+         }
+         vec_add1 (conf->eal_init_args, tmp);
+    }
     else if (num_whitelisted == 0 && devconf->is_blacklisted != 0)
-      {
-       tmp = format (0, "-b%c", 0);
-       vec_add1 (conf->eal_init_args, tmp);
-       tmp = format (0, "%U%c", format_vlib_pci_addr, &devconf->pci_addr, 0);
-       vec_add1 (conf->eal_init_args, tmp);
-      }
+    {
+         tmp = format (0, "-b%c", 0);
+         vec_add1 (conf->eal_init_args, tmp);
+         tmp = format (0, "%U%c", format_vlib_pci_addr, &devconf->pci_addr, 0);
+         vec_add1 (conf->eal_init_args, tmp);
+    }
   }));
   /* *INDENT-ON* */