MTU: Software interface / Per-protocol MTU support
[vpp.git] / src / plugins / dpdk / device / init.c
index 2232b89..461bae0 100644 (file)
@@ -315,9 +315,16 @@ dpdk_lib_init (dpdk_main_t * dm)
       if (pci_dev)
        {
          struct rte_eth_dev_info di = { 0 };
+         struct rte_pci_device *next_pci_dev;
          rte_eth_dev_info_get (i + 1, &di);
-         if (pci_dev && pci_addr.as_u32 != last_pci_addr.as_u32 &&
-             memcmp (&pci_dev->addr, &pci_dev->addr,
+#if RTE_VERSION < RTE_VERSION_NUM(18, 5, 0, 0)
+         next_pci_dev = di.pci_dev;
+#else
+         next_pci_dev = di.device ? RTE_DEV_TO_PCI (di.device) : 0;
+#endif
+         if (pci_dev && next_pci_dev &&
+             pci_addr.as_u32 != last_pci_addr.as_u32 &&
+             memcmp (&pci_dev->addr, &next_pci_dev->addr,
                      sizeof (struct rte_pci_addr)) == 0)
            {
              xd->interface_name_suffix = format (0, "0");
@@ -503,6 +510,11 @@ dpdk_lib_init (dpdk_main_t * dm)
              xd->port_type = VNET_DPDK_PORT_TYPE_ETH_VF;
              break;
 
+           case VNET_DPDK_PMD_FAILSAFE:
+             xd->port_type = VNET_DPDK_PORT_TYPE_FAILSAFE;
+             xd->port_conf.intr_conf.lsc = 1;
+             break;
+
            default:
              xd->port_type = VNET_DPDK_PORT_TYPE_UNKNOWN;
            }
@@ -632,6 +644,26 @@ dpdk_lib_init (dpdk_main_t * dm)
                }
            }
        }
+
+      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 (i, &dev_mtu))
+           {
+             mtu = dev_mtu;
+             max_rx_frame = mtu + sizeof (ethernet_header_t);
+
+             if (xd->port_conf.rxmode.hw_strip_crc)
+               {
+                 max_rx_frame += 4;
+               }
+           }
+       }
+
       /*Set port rxmode config */
       xd->port_conf.rxmode.max_rx_pkt_len = max_rx_frame;
 
@@ -715,8 +747,8 @@ dpdk_lib_init (dpdk_main_t * dm)
        }
 
       if (hi)
-       hi->max_l3_packet_bytes[VLIB_RX] = hi->max_l3_packet_bytes[VLIB_TX] =
-         xd->port_conf.rxmode.max_rx_pkt_len - sizeof (ethernet_header_t);
+       hi->max_packet_bytes = xd->port_conf.rxmode.max_rx_pkt_len
+         - sizeof (ethernet_header_t);
       else
        clib_warning ("hi NULL");
 
@@ -1608,9 +1640,6 @@ dpdk_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
 
                    /* Init l3 packet size allowed on bonded interface */
                    bhi->max_packet_bytes = ETHERNET_MAX_PACKET_BYTES;
-                   bhi->max_l3_packet_bytes[VLIB_RX] =
-                     bhi->max_l3_packet_bytes[VLIB_TX] =
-                     ETHERNET_MAX_PACKET_BYTES - sizeof (ethernet_header_t);
                    while (nlink >= 1)
                      {         /* for all slave links */
                        int slave = slink[--nlink];
@@ -1649,11 +1678,9 @@ dpdk_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
                        clib_memcpy (shi->hw_address, addr, 6);
                        clib_memcpy (sei->address, addr, 6);
                        /* Set l3 packet size allowed as the lowest of slave */
-                       if (bhi->max_l3_packet_bytes[VLIB_RX] >
-                           shi->max_l3_packet_bytes[VLIB_RX])
-                         bhi->max_l3_packet_bytes[VLIB_RX] =
-                           bhi->max_l3_packet_bytes[VLIB_TX] =
-                           shi->max_l3_packet_bytes[VLIB_RX];
+                       if (bhi->max_packet_bytes > shi->max_packet_bytes)
+                         bhi->max_packet_bytes = bhi->max_packet_bytes;
+
                        /* Set max packet size allowed as the lowest of slave */
                        if (bhi->max_packet_bytes > shi->max_packet_bytes)
                          bhi->max_packet_bytes = shi->max_packet_bytes;