In order to set ether type of VLAN for single VLAN, inner
and outer VLAN, the VLAN type as an input parameter is added
to 'rte_eth_dev_set_vlan_ether_type()'.
In addition, corresponding changes in e1000, ixgbe and i40e
are also added.

Signed-off-by: Helin Zhang <helin.zhang at intel.com>
Acked-by: Wenzhuo Lu <wenzhuo.lu at intel.com>
---
 app/test-pmd/cmdline.c                      | 30 +++++++----
 app/test-pmd/config.c                       |  9 ++--
 app/test-pmd/testpmd.h                      |  3 +-
 doc/guides/rel_notes/release_16_04.rst      |  5 ++
 doc/guides/testpmd_app_ug/testpmd_funcs.rst | 11 +---
 drivers/net/e1000/igb_ethdev.c              | 27 +++++++---
 drivers/net/i40e/i40e_ethdev.c              | 79 +++++++++++++++++++++++++++--
 drivers/net/ixgbe/ixgbe_ethdev.c            | 25 +++++++--
 lib/librte_ether/rte_ethdev.c               |  7 +--
 lib/librte_ether/rte_ethdev.h               | 21 ++++++--
 lib/librte_ether/rte_ether_version.map      |  7 +++
 11 files changed, 179 insertions(+), 45 deletions(-)

v5:
 - Removed the versioning mechanism, as ABI broken is already
   there allowed.

v4:
 - Updated the doc of testpmd guide.

v3:
 - Used versioning mechanism to avoid ABI issue.
 - Re-organized the patch set.

v2:
 - Used RTE_NEXT_ABI to avoid ABI change issue.
 - Reworked the announcement of ABI change for release 16.07.

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 52e9f5f..1eeb8a8 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -277,8 +277,8 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "    Set the VLAN QinQ (extended queue in queue)"
                        " on a port.\n\n"

-                       "vlan set tpid (value) (port_id)\n"
-                       "    Set the outer VLAN TPID for Packet Filtering on"
+                       "vlan set (inner|outer) tpid (value) (port_id)\n"
+                       "    Set the VLAN TPID for Packet Filtering on"
                        " a port\n\n"

                        "rx_vlan add (vlan_id|all) (port_id)\n"
@@ -297,10 +297,6 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "    Remove a vlan_id, to the set of VLAN identifiers"
                        "filtered for VF(s) from port_id.\n\n"

-                       "rx_vlan set tpid (value) (port_id)\n"
-                       "    Set the outer VLAN TPID for Packet Filtering on"
-                       " a port\n\n"
-
                        "tunnel_filter add (port_id) (outer_mac) (inner_mac) 
(ip_addr) "
                        "(inner_vlan) (vxlan|nvgre) (filter_type) (tenant_id) 
(queue_id)\n"
                        "   add a tunnel filter of a port.\n\n"
@@ -2747,6 +2743,7 @@ cmdline_parse_inst_t cmd_rx_vlan_filter_all = {
 struct cmd_vlan_offload_result {
        cmdline_fixed_string_t vlan;
        cmdline_fixed_string_t set;
+       cmdline_fixed_string_t vlan_type;
        cmdline_fixed_string_t what;
        cmdline_fixed_string_t on;
        cmdline_fixed_string_t port_id;
@@ -2847,6 +2844,7 @@ cmdline_parse_inst_t cmd_vlan_offload = {
 struct cmd_vlan_tpid_result {
        cmdline_fixed_string_t vlan;
        cmdline_fixed_string_t set;
+       cmdline_fixed_string_t vlan_type;
        cmdline_fixed_string_t what;
        uint16_t tp_id;
        uint8_t port_id;
@@ -2858,8 +2856,17 @@ cmd_vlan_tpid_parsed(void *parsed_result,
                          __attribute__((unused)) void *data)
 {
        struct cmd_vlan_tpid_result *res = parsed_result;
-       vlan_tpid_set(res->port_id, res->tp_id);
-       return;
+       enum rte_vlan_type vlan_type;
+
+       if (!strcmp(res->vlan_type, "inner"))
+               vlan_type = ETH_VLAN_TYPE_INNER;
+       else if (!strcmp(res->vlan_type, "outer"))
+               vlan_type = ETH_VLAN_TYPE_OUTER;
+       else {
+               printf("Unknown vlan type\n");
+               return;
+       }
+       vlan_tpid_set(res->port_id, vlan_type, res->tp_id);
 }

 cmdline_parse_token_string_t cmd_vlan_tpid_vlan =
@@ -2868,6 +2875,9 @@ cmdline_parse_token_string_t cmd_vlan_tpid_vlan =
 cmdline_parse_token_string_t cmd_vlan_tpid_set =
        TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result,
                                 set, "set");
+cmdline_parse_token_string_t cmd_vlan_type =
+       TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result,
+                                vlan_type, "inner#outer");
 cmdline_parse_token_string_t cmd_vlan_tpid_what =
        TOKEN_STRING_INITIALIZER(struct cmd_vlan_tpid_result,
                                 what, "tpid");
@@ -2881,10 +2891,12 @@ cmdline_parse_token_num_t cmd_vlan_tpid_portid =
 cmdline_parse_inst_t cmd_vlan_tpid = {
        .f = cmd_vlan_tpid_parsed,
        .data = NULL,
-       .help_str = "set tpid tp_id port_id, set the Outer VLAN Ether type",
+       .help_str = "set inner|outer tpid tp_id port_id, set the VLAN "
+                   "Ether type",
        .tokens = {
                (void *)&cmd_vlan_tpid_vlan,
                (void *)&cmd_vlan_tpid_set,
+               (void *)&cmd_vlan_type,
                (void *)&cmd_vlan_tpid_what,
                (void *)&cmd_vlan_tpid_tpid,
                (void *)&cmd_vlan_tpid_portid,
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 0062484..5bb09a5 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -1821,19 +1821,20 @@ rx_vlan_all_filter_set(portid_t port_id, int on)
 }

 void
-vlan_tpid_set(portid_t port_id, uint16_t tp_id)
+vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type, uint16_t tp_id)
 {
        int diag;
+
        if (port_id_is_invalid(port_id, ENABLED_WARN))
                return;

-       diag = rte_eth_dev_set_vlan_ether_type(port_id, tp_id);
+       diag = rte_eth_dev_set_vlan_ether_type(port_id, vlan_type, tp_id);
        if (diag == 0)
                return;

-       printf("tx_vlan_tpid_set(port_pi=%d, tpid=%d) failed "
+       printf("tx_vlan_tpid_set(port_pi=%d, vlan_type=%d, tpid=%d) failed "
               "diag=%d\n",
-              port_id, tp_id, diag);
+              port_id, vlan_type, tp_id, diag);
 }

 void
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index b618998..0f72ca1 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -508,7 +508,8 @@ void rx_vlan_filter_set(portid_t port_id, int on);
 void rx_vlan_all_filter_set(portid_t port_id, int on);
 int rx_vft_set(portid_t port_id, uint16_t vlan_id, int on);
 void vlan_extend_set(portid_t port_id, int on);
-void vlan_tpid_set(portid_t port_id, uint16_t tp_id);
+void vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type,
+                  uint16_t tp_id);
 void tx_vlan_set(portid_t port_id, uint16_t vlan_id);
 void tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer);
 void tx_vlan_reset(portid_t port_id);
diff --git a/doc/guides/rel_notes/release_16_04.rst 
b/doc/guides/rel_notes/release_16_04.rst
index 7c09fef..077f67b 100644
--- a/doc/guides/rel_notes/release_16_04.rst
+++ b/doc/guides/rel_notes/release_16_04.rst
@@ -125,6 +125,8 @@ This section should contain new features added in this 
release. Sample format:

   Af_packet device can now be detached using API, like other PMD devices.

+* **Added modifying ether type of both single and double VLAN for i40e**
+

 Resolved Issues
 ---------------
@@ -256,6 +258,9 @@ This section should contain API changes. Sample format:
 * Af_packet device init function is no longer public. Device should be attached
   with API.

+* Add one more parameter for ethdev public interface
+  of ``rte_eth_dev_set_vlan_ether_type``.
+

 ABI Changes
 -----------
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst 
b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index a520cc5..e2b2224 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -498,9 +498,9 @@ Set the VLAN QinQ (extended queue in queue) on for a port::
 vlan set tpid
 ~~~~~~~~~~~~~

-Set the outer VLAN TPID for packet filtering on a port::
+Set the inner or outer VLAN TPID for packet filtering on a port::

-   testpmd> vlan set tpid (value) (port_id)
+   testpmd> vlan set (inner|outer) tpid (value) (port_id)

 .. note::

@@ -540,13 +540,6 @@ Remove a VLAN ID, from the set of VLAN identifiers 
filtered for VF(s) for port I

    testpmd> rx_vlan rm (vlan_id) port (port_id) vf (vf_mask)

-rx_vlan set tpid
-~~~~~~~~~~~~~~~~
-
-Set the outer VLAN TPID for packet filtering on a port::
-
-   testpmd> rx_vlan set tpid (value) (port_id)
-
 tunnel_filter add
 ~~~~~~~~~~~~~~~~~

diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index f889876..9a34d01 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -126,7 +126,9 @@ static int  eth_igb_mtu_set(struct rte_eth_dev *dev, 
uint16_t mtu);

 static int eth_igb_vlan_filter_set(struct rte_eth_dev *dev,
                uint16_t vlan_id, int on);
-static void eth_igb_vlan_tpid_set(struct rte_eth_dev *dev, uint16_t tpid_id);
+static int eth_igb_vlan_tpid_set(struct rte_eth_dev *dev,
+                                enum rte_vlan_type vlan_type,
+                                uint16_t tpid_id);
 static void eth_igb_vlan_offload_set(struct rte_eth_dev *dev, int mask);

 static void igb_vlan_hw_filter_enable(struct rte_eth_dev *dev);
@@ -2193,15 +2195,28 @@ eth_igb_vlan_filter_set(struct rte_eth_dev *dev, 
uint16_t vlan_id, int on)
        return 0;
 }

-static void
-eth_igb_vlan_tpid_set(struct rte_eth_dev *dev, uint16_t tpid)
+static int
+eth_igb_vlan_tpid_set(struct rte_eth_dev *dev,
+                     enum rte_vlan_type vlan_type,
+                     uint16_t tpid)
 {
        struct e1000_hw *hw =
                E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       uint32_t reg = ETHER_TYPE_VLAN ;
+       uint32_t reg = ETHER_TYPE_VLAN;
+       int ret = 0;
+
+       switch (vlan_type) {
+       case ETH_VLAN_TYPE_INNER:
+               reg |= (tpid << 16);
+               E1000_WRITE_REG(hw, E1000_VET, reg);
+               break;
+       default:
+               ret = -EINVAL;
+               PMD_DRV_LOG(ERR, "Unsupported vlan type %d\n", vlan_type);
+               break;
+       }

-       reg |= (tpid << 16);
-       E1000_WRITE_REG(hw, E1000_VET, reg);
+       return ret;
 }

 static void
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 0c87ec1..7605a68 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -266,6 +266,11 @@
 #define I40E_INSET_IPV6_TC_MASK       0x0009F00FUL
 #define I40E_INSET_IPV6_NEXT_HDR_MASK 0x000C00FFUL

+#define I40E_GL_SWT_L2TAGCTRL(_i)             (0x001C0A70 + ((_i) * 4))
+#define I40E_GL_SWT_L2TAGCTRL_ETHERTYPE_SHIFT 16
+#define I40E_GL_SWT_L2TAGCTRL_ETHERTYPE_MASK  \
+       I40E_MASK(0xFFFF, I40E_GL_SWT_L2TAGCTRL_ETHERTYPE_SHIFT)
+
 static int eth_i40e_dev_init(struct rte_eth_dev *eth_dev);
 static int eth_i40e_dev_uninit(struct rte_eth_dev *eth_dev);
 static int i40e_dev_configure(struct rte_eth_dev *dev);
@@ -292,7 +297,9 @@ static void i40e_dev_info_get(struct rte_eth_dev *dev,
 static int i40e_vlan_filter_set(struct rte_eth_dev *dev,
                                uint16_t vlan_id,
                                int on);
-static void i40e_vlan_tpid_set(struct rte_eth_dev *dev, uint16_t tpid);
+static int i40e_vlan_tpid_set(struct rte_eth_dev *dev,
+                             enum rte_vlan_type vlan_type,
+                             uint16_t tpid);
 static void i40e_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void i40e_vlan_strip_queue_set(struct rte_eth_dev *dev,
                                      uint16_t queue,
@@ -865,6 +872,20 @@ eth_i40e_dev_init(struct rte_eth_dev *dev)
        hw->fc.requested_mode = I40E_FC_NONE;
        i40e_set_fc(hw, &aq_fail, TRUE);

+       /* Set the global registers with default ether type value */
+       ret = i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_OUTER, ETHER_TYPE_VLAN);
+       if (ret != I40E_SUCCESS) {
+               PMD_INIT_LOG(ERR, "Failed to set the default outer "
+                            "VLAN ether type");
+               goto err_setup_pf_switch;
+       }
+       ret = i40e_vlan_tpid_set(dev, ETH_VLAN_TYPE_INNER, ETHER_TYPE_VLAN);
+       if (ret != I40E_SUCCESS) {
+               PMD_INIT_LOG(ERR, "Failed to set the default outer "
+                            "VLAN ether type");
+               goto err_setup_pf_switch;
+       }
+
        /* PF setup, which includes VSI setup */
        ret = i40e_pf_setup(pf);
        if (ret) {
@@ -2312,11 +2333,59 @@ i40e_vlan_filter_set(struct rte_eth_dev *dev, uint16_t 
vlan_id, int on)
                return i40e_vsi_delete_vlan(vsi, vlan_id);
 }

-static void
-i40e_vlan_tpid_set(__rte_unused struct rte_eth_dev *dev,
-                  __rte_unused uint16_t tpid)
+static int
+i40e_vlan_tpid_set(struct rte_eth_dev *dev,
+                  enum rte_vlan_type vlan_type,
+                  uint16_t tpid)
 {
-       PMD_INIT_FUNC_TRACE();
+       struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       uint64_t reg_r = 0, reg_w = 0;
+       uint16_t reg_id = 0;
+       int ret = 0;
+
+       switch (vlan_type) {
+       case ETH_VLAN_TYPE_OUTER:
+               reg_id = 2;
+               break;
+       case ETH_VLAN_TYPE_INNER:
+               reg_id = 3;
+               break;
+       default:
+               ret = -EINVAL;
+               PMD_DRV_LOG(ERR, "Unsupported vlan type %d", vlan_type);
+               return ret;
+       }
+       ret = i40e_aq_debug_read_register(hw, I40E_GL_SWT_L2TAGCTRL(reg_id),
+                                         &reg_r, NULL);
+       if (ret != I40E_SUCCESS) {
+               PMD_DRV_LOG(ERR, "Fail to debug read from "
+                           "I40E_GL_SWT_L2TAGCTRL[%d]", reg_id);
+               ret = -EIO;
+               return ret;
+       }
+       PMD_DRV_LOG(DEBUG, "Debug read from I40E_GL_SWT_L2TAGCTRL[%d]: "
+                   "0x%08"PRIx64"", reg_id, reg_r);
+
+       reg_w = reg_r & (~(I40E_GL_SWT_L2TAGCTRL_ETHERTYPE_MASK));
+       reg_w |= ((uint64_t)tpid << I40E_GL_SWT_L2TAGCTRL_ETHERTYPE_SHIFT);
+       if (reg_r == reg_w) {
+               ret = 0;
+               PMD_DRV_LOG(DEBUG, "No need to write");
+               return ret;
+       }
+
+       ret = i40e_aq_debug_write_register(hw, I40E_GL_SWT_L2TAGCTRL(reg_id),
+                                          reg_w, NULL);
+       if (ret != I40E_SUCCESS) {
+               ret = -EIO;
+               PMD_DRV_LOG(ERR, "Fail to debug write to "
+                           "I40E_GL_SWT_L2TAGCTRL[%d]", reg_id);
+               return ret;
+       }
+       PMD_DRV_LOG(DEBUG, "Debug write 0x%08"PRIx64" to "
+                   "I40E_GL_SWT_L2TAGCTRL[%d]", reg_w, reg_id);
+
+       return ret;
 }

 static void
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index a9a1583..0dc050d 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -178,7 +178,9 @@ static int ixgbe_dev_mtu_set(struct rte_eth_dev *dev, 
uint16_t mtu);

 static int ixgbe_vlan_filter_set(struct rte_eth_dev *dev,
                uint16_t vlan_id, int on);
-static void ixgbe_vlan_tpid_set(struct rte_eth_dev *dev, uint16_t tpid_id);
+static int ixgbe_vlan_tpid_set(struct rte_eth_dev *dev,
+                              enum rte_vlan_type vlan_type,
+                              uint16_t tpid_id);
 static void ixgbe_vlan_hw_strip_bitmap_set(struct rte_eth_dev *dev,
                uint16_t queue, bool on);
 static void ixgbe_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue,
@@ -1542,14 +1544,27 @@ ixgbe_vlan_strip_queue_set(struct rte_eth_dev *dev, 
uint16_t queue, int on)
                ixgbe_vlan_hw_strip_disable(dev, queue);
 }

-static void
-ixgbe_vlan_tpid_set(struct rte_eth_dev *dev, uint16_t tpid)
+static int
+ixgbe_vlan_tpid_set(struct rte_eth_dev *dev,
+                   enum rte_vlan_type vlan_type,
+                   uint16_t tpid)
 {
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       int ret = 0;
+
+       switch (vlan_type) {
+       case ETH_VLAN_TYPE_INNER:
+               /* Only the high 16-bits is valid */
+               IXGBE_WRITE_REG(hw, IXGBE_EXVET, tpid << 16);
+               break;
+       default:
+               ret = -EINVAL;
+               PMD_DRV_LOG(ERR, "Unsupported vlan type %d\n", vlan_type);
+               break;
+       }

-       /* Only the high 16-bits is valid */
-       IXGBE_WRITE_REG(hw, IXGBE_EXVET, tpid << 16);
+       return ret;
 }

 void
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index a6e83c1..dedb36a 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1697,16 +1697,17 @@ rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, 
uint16_t rx_queue_id, int o
 }

 int
-rte_eth_dev_set_vlan_ether_type(uint8_t port_id, uint16_t tpid)
+rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
+                               enum rte_vlan_type vlan_type,
+                               uint16_t tpid)
 {
        struct rte_eth_dev *dev;

        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_tpid_set, -ENOTSUP);
-       (*dev->dev_ops->vlan_tpid_set)(dev, tpid);

-       return 0;
+       return (*dev->dev_ops->vlan_tpid_set)(dev, vlan_type, tpid);
 }

 int
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index e2893ba..bc3f42e 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -351,6 +351,17 @@ struct rte_eth_rxmode {
 };

 /**
+ * VLAN types to indicate if it is for single VLAN, inner VLAN or outer VLAN.
+ * Note that single VLAN is treated the same as inner VLAN.
+ */
+enum rte_vlan_type {
+       ETH_VLAN_TYPE_UNKNOWN = 0,
+       ETH_VLAN_TYPE_INNER, /**< Single VLAN, or inner VLAN. */
+       ETH_VLAN_TYPE_OUTER, /**< Outer VLAN. */
+       ETH_VLAN_TYPE_MAX,
+};
+
+/**
  * A structure used to configure the Receive Side Scaling (RSS) feature
  * of an Ethernet port.
  * If not NULL, the *rss_key* pointer of the *rss_conf* structure points
@@ -1076,8 +1087,8 @@ typedef int (*vlan_filter_set_t)(struct rte_eth_dev *dev,
                                  int on);
 /**< @internal filtering of a VLAN Tag Identifier by an Ethernet device. */

-typedef void (*vlan_tpid_set_t)(struct rte_eth_dev *dev,
-                                 uint16_t tpid);
+typedef int (*vlan_tpid_set_t)(struct rte_eth_dev *dev,
+                              enum rte_vlan_type type, uint16_t tpid);
 /**< @internal set the outer VLAN-TPID by an Ethernet device. */

 typedef void (*vlan_offload_set_t)(struct rte_eth_dev *dev, int mask);
@@ -2346,6 +2357,8 @@ int rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, 
uint16_t rx_queue_id,
  *
  * @param port_id
  *   The port identifier of the Ethernet device.
+ * @vlan_type
+ *   The vlan type.
  * @param tag_type
  *   The Tag Protocol ID
  * @return
@@ -2353,7 +2366,9 @@ int rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, 
uint16_t rx_queue_id,
  *   - (-ENOSUP) if hardware-assisted VLAN TPID setup is not supported.
  *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_set_vlan_ether_type(uint8_t port_id, uint16_t tag_type);
+int rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
+                                   enum rte_vlan_type vlan_type,
+                                   uint16_t tag_type);

 /**
  * Set VLAN offload configuration on an Ethernet device
diff --git a/lib/librte_ether/rte_ether_version.map 
b/lib/librte_ether/rte_ether_version.map
index d8db24d..6098de5 100644
--- a/lib/librte_ether/rte_ether_version.map
+++ b/lib/librte_ether/rte_ether_version.map
@@ -117,3 +117,10 @@ DPDK_2.2 {

        local: *;
 };
+
+DPDK_16.04 {
+       global:
+
+       rte_eth_dev_set_vlan_ether_type;
+
+} DPDK_2.2;
-- 
2.5.0

Reply via email to