net/ice: support UDP tunnelling port
authorQiming Yang <qiming.yang@intel.com>
Mon, 1 Jul 2019 08:32:31 +0000 (16:32 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 3 Jul 2019 10:57:30 +0000 (12:57 +0200)
Enabled UDP tunnel port add and delete functions.

Signed-off-by: Qiming Yang <qiming.yang@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
doc/guides/rel_notes/release_19_08.rst
drivers/net/ice/ice_ethdev.c

index ccbacb6..1392a4d 100644 (file)
@@ -94,6 +94,7 @@ New Features
 
   * Enabled Tx outer/inner L3/L4 checksum offload.
   * Enabled generic filter framework and supported switch filter.
+  * Supported UDP tunnel port add.
 
 * **Updated Solarflare network PMD.**
 
index 28065eb..9ce730c 100644 (file)
@@ -88,6 +88,10 @@ static int ice_dev_filter_ctrl(struct rte_eth_dev *dev,
                        enum rte_filter_type filter_type,
                        enum rte_filter_op filter_op,
                        void *arg);
+static int ice_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+                       struct rte_eth_udp_tunnel *udp_tunnel);
+static int ice_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+                       struct rte_eth_udp_tunnel *udp_tunnel);
 
 static const struct rte_pci_id pci_id_ice_map[] = {
        { RTE_PCI_DEVICE(ICE_INTEL_VENDOR_ID, ICE_DEV_ID_E810C_BACKPLANE) },
@@ -147,6 +151,8 @@ static const struct eth_dev_ops ice_eth_dev_ops = {
        .xstats_get_names             = ice_xstats_get_names,
        .xstats_reset                 = ice_stats_reset,
        .filter_ctrl                  = ice_dev_filter_ctrl,
+       .udp_tunnel_port_add          = ice_dev_udp_tunnel_port_add,
+       .udp_tunnel_port_del          = ice_dev_udp_tunnel_port_del,
 };
 
 /* store statistics names and its offset in stats structure */
@@ -3666,6 +3672,54 @@ ice_dev_filter_ctrl(struct rte_eth_dev *dev,
        return ret;
 }
 
+/* Add UDP tunneling port */
+static int
+ice_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+                            struct rte_eth_udp_tunnel *udp_tunnel)
+{
+       int ret = 0;
+       struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+       if (udp_tunnel == NULL)
+               return -EINVAL;
+
+       switch (udp_tunnel->prot_type) {
+       case RTE_TUNNEL_TYPE_VXLAN:
+               ret = ice_create_tunnel(hw, TNL_VXLAN, udp_tunnel->udp_port);
+               break;
+       default:
+               PMD_DRV_LOG(ERR, "Invalid tunnel type");
+               ret = -EINVAL;
+               break;
+       }
+
+       return ret;
+}
+
+/* Delete UDP tunneling port */
+static int
+ice_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+                            struct rte_eth_udp_tunnel *udp_tunnel)
+{
+       int ret = 0;
+       struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+       if (udp_tunnel == NULL)
+               return -EINVAL;
+
+       switch (udp_tunnel->prot_type) {
+       case RTE_TUNNEL_TYPE_VXLAN:
+               ret = ice_destroy_tunnel(hw, udp_tunnel->udp_port, 0);
+               break;
+       default:
+               PMD_DRV_LOG(ERR, "Invalid tunnel type");
+               ret = -EINVAL;
+               break;
+       }
+
+       return ret;
+}
+
 static int
 ice_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
              struct rte_pci_device *pci_dev)