ethdev: support L2 tunnel operations
authorWenzhuo Lu <wenzhuo.lu@intel.com>
Fri, 11 Mar 2016 01:10:08 +0000 (09:10 +0800)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Fri, 11 Mar 2016 22:25:57 +0000 (23:25 +0100)
Add functions to support l2 tunnel configuration and operations.
1, L2 tunnel ether type modification.
   It means modifying the ether type of a specific type of tunnel.
   So the packet with this ether type will be parsed as this type
   of tunnel.
2, Enabling/disabling l2 tunnel support.
   It means enabling/disabling the ability of parsing the specific
   type of tunnel. This ability should be enabled before we enable
   filtering, forwarding, offloading for this specific type of
   tunnel.
3, Insertion and stripping for l2 tunnel tag.
4, Forwarding the packets to a pool based on l2 tunnel tag.

Only support e-tag tunnel now.

Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
Acked-by: Shaopeng He <shaopeng.he@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>
Tested-by: Yong Liu <yong.liu@intel.com>
lib/librte_ether/rte_eth_ctrl.h
lib/librte_ether/rte_ethdev.c
lib/librte_ether/rte_ethdev.h
lib/librte_ether/rte_ether_version.map

index d433e0b..4c79bd3 100644 (file)
@@ -89,6 +89,7 @@ enum rte_filter_type {
        RTE_ETH_FILTER_TUNNEL,
        RTE_ETH_FILTER_FDIR,
        RTE_ETH_FILTER_HASH,
+       RTE_ETH_FILTER_L2_TUNNEL,
        RTE_ETH_FILTER_MAX
 };
 
@@ -244,6 +245,7 @@ enum rte_eth_tunnel_type {
        RTE_TUNNEL_TYPE_GENEVE,
        RTE_TUNNEL_TYPE_TEREDO,
        RTE_TUNNEL_TYPE_NVGRE,
+       RTE_L2_TUNNEL_TYPE_E_TAG,
        RTE_TUNNEL_TYPE_MAX,
 };
 
@@ -813,6 +815,17 @@ struct rte_eth_hash_filter_info {
        } info;
 };
 
+/**
+ * l2 tunnel configuration.
+ */
+struct rte_eth_l2_tunnel_conf {
+       enum rte_eth_tunnel_type l2_tunnel_type;
+       uint16_t ether_type; /* ether type in l2 header */
+       uint32_t tunnel_id; /* port tag id for e-tag */
+       uint16_t vf_id; /* VF id for tag insertion */
+       uint32_t pool; /* destination pool for tag based forwarding */
+};
+
 #ifdef __cplusplus
 }
 #endif
index 82e06c3..030a877 100644 (file)
@@ -3248,3 +3248,57 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, struct rte_pci_device *pci_de
        eth_dev->data->numa_node = pci_dev->numa_node;
        eth_dev->data->drv_name = pci_dev->driver->name;
 }
+
+int
+rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
+                                   struct rte_eth_l2_tunnel_conf *l2_tunnel)
+{
+       struct rte_eth_dev *dev;
+
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+       if (l2_tunnel == NULL) {
+               RTE_PMD_DEBUG_TRACE("Invalid l2_tunnel parameter\n");
+               return -EINVAL;
+       }
+
+       if (l2_tunnel->l2_tunnel_type >= RTE_TUNNEL_TYPE_MAX) {
+               RTE_PMD_DEBUG_TRACE("Invalid tunnel type\n");
+               return -EINVAL;
+       }
+
+       dev = &rte_eth_devices[port_id];
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->l2_tunnel_eth_type_conf,
+                               -ENOTSUP);
+       return (*dev->dev_ops->l2_tunnel_eth_type_conf)(dev, l2_tunnel);
+}
+
+int
+rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
+                                 struct rte_eth_l2_tunnel_conf *l2_tunnel,
+                                 uint32_t mask,
+                                 uint8_t en)
+{
+       struct rte_eth_dev *dev;
+
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+
+       if (l2_tunnel == NULL) {
+               RTE_PMD_DEBUG_TRACE("Invalid l2_tunnel parameter\n");
+               return -EINVAL;
+       }
+
+       if (l2_tunnel->l2_tunnel_type >= RTE_TUNNEL_TYPE_MAX) {
+               RTE_PMD_DEBUG_TRACE("Invalid tunnel type.\n");
+               return -EINVAL;
+       }
+
+       if (mask == 0) {
+               RTE_PMD_DEBUG_TRACE("Mask should have a value.\n");
+               return -EINVAL;
+       }
+
+       dev = &rte_eth_devices[port_id];
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->l2_tunnel_offload_set,
+                               -ENOTSUP);
+       return (*dev->dev_ops->l2_tunnel_offload_set)(dev, l2_tunnel, mask, en);
+}
index 9a3a202..bf3519d 100644 (file)
@@ -968,6 +968,19 @@ TAILQ_HEAD(rte_eth_dev_cb_list, rte_eth_dev_callback);
        } \
 } while (0)
 
+/**
+ * l2 tunnel configuration.
+ */
+
+/**< l2 tunnel enable mask */
+#define ETH_L2_TUNNEL_ENABLE_MASK       0x00000001
+/**< l2 tunnel insertion mask */
+#define ETH_L2_TUNNEL_INSERTION_MASK    0x00000002
+/**< l2 tunnel stripping mask */
+#define ETH_L2_TUNNEL_STRIPPING_MASK    0x00000004
+/**< l2 tunnel forwarding mask */
+#define ETH_L2_TUNNEL_FORWARDING_MASK   0x00000008
+
 /*
  * Definitions of all functions exported by an Ethernet driver through the
  * the generic structure of type *eth_dev_ops* supplied in the *rte_eth_dev*
@@ -1272,6 +1285,17 @@ typedef int (*eth_set_eeprom_t)(struct rte_eth_dev *dev,
                                struct rte_dev_eeprom_info *info);
 /**< @internal Program eeprom data  */
 
+typedef int (*eth_l2_tunnel_eth_type_conf_t)
+       (struct rte_eth_dev *dev, struct rte_eth_l2_tunnel_conf *l2_tunnel);
+/**< @internal config l2 tunnel ether type */
+
+typedef int (*eth_l2_tunnel_offload_set_t)
+       (struct rte_eth_dev *dev,
+        struct rte_eth_l2_tunnel_conf *l2_tunnel,
+        uint32_t mask,
+        uint8_t en);
+/**< @internal enable/disable the l2 tunnel offload functions */
+
 #ifdef RTE_NIC_BYPASS
 
 enum {
@@ -1454,6 +1478,10 @@ struct eth_dev_ops {
        eth_timesync_read_time timesync_read_time;
        /** Set the device clock time. */
        eth_timesync_write_time timesync_write_time;
+       /** Config ether type of l2 tunnel */
+       eth_l2_tunnel_eth_type_conf_t l2_tunnel_eth_type_conf;
+       /** Enable/disable l2 tunnel offload functions */
+       eth_l2_tunnel_offload_set_t l2_tunnel_offload_set;
 };
 
 /**
@@ -4099,6 +4127,53 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name,
                         uint16_t queue_id, size_t size,
                         unsigned align, int socket_id);
 
+/**
+ * Config l2 tunnel ether type of an Ethernet device for filtering specific
+ * tunnel packets by ether type.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param l2_tunnel
+ *   l2 tunnel configuration.
+ *
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if port identifier is invalid.
+ *   - (-ENOTSUP) if hardware doesn't support tunnel type.
+ */
+int
+rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
+                                   struct rte_eth_l2_tunnel_conf *l2_tunnel);
+
+/**
+ * Enable/disable l2 tunnel offload functions. Include,
+ * 1, The ability of parsing a type of l2 tunnel of an Ethernet device.
+ *    Filtering, forwarding and offloading this type of tunnel packets depend on
+ *    this ability.
+ * 2, Stripping the l2 tunnel tag.
+ * 3, Insertion of the l2 tunnel tag.
+ * 4, Forwarding the packets based on the l2 tunnel tag.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param l2_tunnel
+ *   l2 tunnel parameters.
+ * @param mask
+ *   Indicate the offload function.
+ * @param en
+ *   Enable or disable this function.
+ *
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if port identifier is invalid.
+ *   - (-ENOTSUP) if hardware doesn't support tunnel type.
+ */
+int
+rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
+                                 struct rte_eth_l2_tunnel_conf *l2_tunnel,
+                                 uint32_t mask,
+                                 uint8_t en);
+
 #ifdef __cplusplus
 }
 #endif
index 2f4762c..ecc2187 100644 (file)
@@ -121,6 +121,8 @@ DPDK_2.2 {
 DPDK_16.04 {
        global:
 
+       rte_eth_dev_l2_tunnel_eth_type_conf;
+       rte_eth_dev_l2_tunnel_offload_set;
        rte_eth_dev_set_vlan_ether_type;
        rte_eth_tx_buffer_count_callback;
        rte_eth_tx_buffer_drop_callback;