net/ice: enable flow redirect on switch
[dpdk.git] / drivers / net / iavf / iavf_rxtx.c
index 22d7bb6..9eccb7c 100644 (file)
@@ -24,9 +24,6 @@
 #include <rte_ip.h>
 #include <rte_net.h>
 
-#include "iavf_log.h"
-#include "base/iavf_prototype.h"
-#include "base/iavf_type.h"
 #include "iavf.h"
 #include "iavf_rxtx.h"
 
@@ -92,18 +89,17 @@ check_tx_thresh(uint16_t nb_desc, uint16_t tx_rs_thresh,
        return 0;
 }
 
-#ifdef RTE_LIBRTE_IAVF_INC_VECTOR
 static inline bool
 check_rx_vec_allow(struct iavf_rx_queue *rxq)
 {
        if (rxq->rx_free_thresh >= IAVF_VPMD_RX_MAX_BURST &&
            rxq->nb_rx_desc % rxq->rx_free_thresh == 0) {
                PMD_INIT_LOG(DEBUG, "Vector Rx can be enabled on this rxq.");
-               return TRUE;
+               return true;
        }
 
        PMD_INIT_LOG(DEBUG, "Vector Rx cannot be enabled on this rxq.");
-       return FALSE;
+       return false;
 }
 
 static inline bool
@@ -113,30 +109,29 @@ check_tx_vec_allow(struct iavf_tx_queue *txq)
            txq->rs_thresh >= IAVF_VPMD_TX_MAX_BURST &&
            txq->rs_thresh <= IAVF_VPMD_TX_MAX_FREE_BUF) {
                PMD_INIT_LOG(DEBUG, "Vector tx can be enabled on this txq.");
-               return TRUE;
+               return true;
        }
        PMD_INIT_LOG(DEBUG, "Vector Tx cannot be enabled on this txq.");
-       return FALSE;
+       return false;
 }
-#endif
 
 static inline bool
 check_rx_bulk_allow(struct iavf_rx_queue *rxq)
 {
-       int ret = TRUE;
+       int ret = true;
 
        if (!(rxq->rx_free_thresh >= IAVF_RX_MAX_BURST)) {
                PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions: "
                             "rxq->rx_free_thresh=%d, "
                             "IAVF_RX_MAX_BURST=%d",
                             rxq->rx_free_thresh, IAVF_RX_MAX_BURST);
-               ret = FALSE;
+               ret = false;
        } else if (rxq->nb_rx_desc % rxq->rx_free_thresh != 0) {
                PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions: "
                             "rxq->nb_rx_desc=%d, "
                             "rxq->rx_free_thresh=%d",
                             rxq->nb_rx_desc, rxq->rx_free_thresh);
-               ret = FALSE;
+               ret = false;
        }
        return ret;
 }
@@ -308,6 +303,9 @@ iavf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
        struct iavf_hw *hw = IAVF_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct iavf_adapter *ad =
                IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+       struct iavf_info *vf =
+               IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
+       struct iavf_vsi *vsi = &vf->vsi;
        struct iavf_rx_queue *rxq;
        const struct rte_memzone *mz;
        uint32_t ring_size;
@@ -356,6 +354,7 @@ iavf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
        rxq->crc_len = 0; /* crc stripping by default */
        rxq->rx_deferred_start = rx_conf->rx_deferred_start;
        rxq->rx_hdr_len = 0;
+       rxq->vsi = vsi;
 
        len = rte_pktmbuf_data_room_size(rxq->mp) - RTE_PKTMBUF_HEADROOM;
        rxq->rx_buf_len = RTE_ALIGN(len, (1 << IAVF_RXQ_CTX_DBUFF_SHIFT));
@@ -395,12 +394,12 @@ iavf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
 
        rxq->mz = mz;
        reset_rx_queue(rxq);
-       rxq->q_set = TRUE;
+       rxq->q_set = true;
        dev->data->rx_queues[queue_idx] = rxq;
        rxq->qrx_tail = hw->hw_addr + IAVF_QRX_TAIL1(rxq->queue_id);
        rxq->ops = &def_rxq_ops;
 
-       if (check_rx_bulk_allow(rxq) == TRUE) {
+       if (check_rx_bulk_allow(rxq) == true) {
                PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions are "
                             "satisfied. Rx Burst Bulk Alloc function will be "
                             "used on port=%d, queue=%d.",
@@ -413,10 +412,9 @@ iavf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
                ad->rx_bulk_alloc_allowed = false;
        }
 
-#ifdef RTE_LIBRTE_IAVF_INC_VECTOR
-       if (check_rx_vec_allow(rxq) == FALSE)
+       if (check_rx_vec_allow(rxq) == false)
                ad->rx_vec_allowed = false;
-#endif
+
        return 0;
 }
 
@@ -506,18 +504,16 @@ iavf_dev_tx_queue_setup(struct rte_eth_dev *dev,
 
        txq->mz = mz;
        reset_tx_queue(txq);
-       txq->q_set = TRUE;
+       txq->q_set = true;
        dev->data->tx_queues[queue_idx] = txq;
        txq->qtx_tail = hw->hw_addr + IAVF_QTX_TAIL1(queue_idx);
        txq->ops = &def_txq_ops;
 
-#ifdef RTE_LIBRTE_IAVF_INC_VECTOR
-       if (check_tx_vec_allow(txq) == FALSE) {
+       if (check_tx_vec_allow(txq) == false) {
                struct iavf_adapter *ad =
                        IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
                ad->tx_vec_allowed = false;
        }
-#endif
 
        return 0;
 }
@@ -551,7 +547,7 @@ iavf_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
        IAVF_WRITE_FLUSH(hw);
 
        /* Ready to switch the queue on */
-       err = iavf_switch_queue(adapter, rx_queue_id, TRUE, TRUE);
+       err = iavf_switch_queue(adapter, rx_queue_id, true, true);
        if (err)
                PMD_DRV_LOG(ERR, "Failed to switch RX queue %u on",
                            rx_queue_id);
@@ -583,7 +579,7 @@ iavf_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
        IAVF_WRITE_FLUSH(hw);
 
        /* Ready to switch the queue on */
-       err = iavf_switch_queue(adapter, tx_queue_id, FALSE, TRUE);
+       err = iavf_switch_queue(adapter, tx_queue_id, false, true);
 
        if (err)
                PMD_DRV_LOG(ERR, "Failed to switch TX queue %u on",
@@ -608,7 +604,7 @@ iavf_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
        if (rx_queue_id >= dev->data->nb_rx_queues)
                return -EINVAL;
 
-       err = iavf_switch_queue(adapter, rx_queue_id, TRUE, FALSE);
+       err = iavf_switch_queue(adapter, rx_queue_id, true, false);
        if (err) {
                PMD_DRV_LOG(ERR, "Failed to switch RX queue %u off",
                            rx_queue_id);
@@ -636,7 +632,7 @@ iavf_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
        if (tx_queue_id >= dev->data->nb_tx_queues)
                return -EINVAL;
 
-       err = iavf_switch_queue(adapter, tx_queue_id, FALSE, FALSE);
+       err = iavf_switch_queue(adapter, tx_queue_id, false, false);
        if (err) {
                PMD_DRV_LOG(ERR, "Failed to switch TX queue %u off",
                            tx_queue_id);
@@ -777,31 +773,14 @@ iavf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
        uint16_t rx_id, nb_hold;
        uint64_t dma_addr;
        uint64_t pkt_flags;
-       static const uint32_t ptype_tbl[UINT8_MAX + 1] __rte_cache_aligned = {
-               /* [0] reserved */
-               [1] = RTE_PTYPE_L2_ETHER,
-               /* [2] - [21] reserved */
-               [22] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_FRAG,
-               [23] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_NONFRAG,
-               [24] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_UDP,
-               /* [25] reserved */
-               [26] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_TCP,
-               [27] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_SCTP,
-               [28] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_ICMP,
-               /* All others reserved */
-       };
+       const uint32_t *ptype_tbl;
 
        nb_rx = 0;
        nb_hold = 0;
        rxq = rx_queue;
        rx_id = rxq->rx_tail;
        rx_ring = rxq->rx_ring;
+       ptype_tbl = rxq->vsi->adapter->ptype_tbl;
 
        while (nb_rx < nb_pkts) {
                rxdp = &rx_ring[rx_id];
@@ -917,25 +896,7 @@ iavf_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 
        volatile union iavf_rx_desc *rx_ring = rxq->rx_ring;
        volatile union iavf_rx_desc *rxdp;
-       static const uint32_t ptype_tbl[UINT8_MAX + 1] __rte_cache_aligned = {
-               /* [0] reserved */
-               [1] = RTE_PTYPE_L2_ETHER,
-               /* [2] - [21] reserved */
-               [22] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_FRAG,
-               [23] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_NONFRAG,
-               [24] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_UDP,
-               /* [25] reserved */
-               [26] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_TCP,
-               [27] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_SCTP,
-               [28] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_ICMP,
-               /* All others reserved */
-       };
+       const uint32_t *ptype_tbl = rxq->vsi->adapter->ptype_tbl;
 
        while (nb_rx < nb_pkts) {
                rxdp = &rx_ring[rx_id];
@@ -1102,25 +1063,7 @@ iavf_rx_scan_hw_ring(struct iavf_rx_queue *rxq)
        int32_t s[IAVF_LOOK_AHEAD], nb_dd;
        int32_t i, j, nb_rx = 0;
        uint64_t pkt_flags;
-       static const uint32_t ptype_tbl[UINT8_MAX + 1] __rte_cache_aligned = {
-               /* [0] reserved */
-               [1] = RTE_PTYPE_L2_ETHER,
-               /* [2] - [21] reserved */
-               [22] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_FRAG,
-               [23] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_NONFRAG,
-               [24] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_UDP,
-               /* [25] reserved */
-               [26] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_TCP,
-               [27] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_SCTP,
-               [28] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
-                       RTE_PTYPE_L4_ICMP,
-               /* All others reserved */
-       };
+       const uint32_t *ptype_tbl = rxq->vsi->adapter->ptype_tbl;
 
        rxdp = &rxq->rx_ring[rxq->rx_tail];
        rxep = &rxq->sw_ring[rxq->rx_tail];
@@ -1666,27 +1609,6 @@ end_of_tx:
        return nb_tx;
 }
 
-static uint16_t
-iavf_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts,
-                 uint16_t nb_pkts)
-{
-       uint16_t nb_tx = 0;
-       struct iavf_tx_queue *txq = (struct iavf_tx_queue *)tx_queue;
-
-       while (nb_pkts) {
-               uint16_t ret, num;
-
-               num = (uint16_t)RTE_MIN(nb_pkts, txq->rs_thresh);
-               ret = iavf_xmit_fixed_burst_vec(tx_queue, &tx_pkts[nb_tx], num);
-               nb_tx += ret;
-               nb_pkts -= ret;
-               if (ret < num)
-                       break;
-       }
-
-       return nb_tx;
-}
-
 /* TX prep functions */
 uint16_t
 iavf_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts,
@@ -1741,26 +1663,43 @@ iavf_set_rx_function(struct rte_eth_dev *dev)
 {
        struct iavf_adapter *adapter =
                IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+#ifdef RTE_ARCH_X86
        struct iavf_rx_queue *rxq;
        int i;
+       bool use_avx2 = false;
 
-       if (adapter->rx_vec_allowed) {
-               if (dev->data->scattered_rx) {
-                       PMD_DRV_LOG(DEBUG, "Using Vector Scattered Rx callback"
-                                   " (port=%d).", dev->data->port_id);
-                       dev->rx_pkt_burst = iavf_recv_scattered_pkts_vec;
-               } else {
-                       PMD_DRV_LOG(DEBUG, "Using Vector Rx callback"
-                                   " (port=%d).", dev->data->port_id);
-                       dev->rx_pkt_burst = iavf_recv_pkts_vec;
-               }
+       if (!iavf_rx_vec_dev_check(dev)) {
                for (i = 0; i < dev->data->nb_rx_queues; i++) {
                        rxq = dev->data->rx_queues[i];
-                       if (!rxq)
-                               continue;
-                       iavf_rxq_vec_setup(rxq);
+                       (void)iavf_rxq_vec_setup(rxq);
+               }
+
+               if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
+                   rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1)
+                       use_avx2 = true;
+
+               if (dev->data->scattered_rx) {
+                       PMD_DRV_LOG(DEBUG,
+                                   "Using %sVector Scattered Rx (port %d).",
+                                   use_avx2 ? "avx2 " : "",
+                                   dev->data->port_id);
+                       dev->rx_pkt_burst = use_avx2 ?
+                                           iavf_recv_scattered_pkts_vec_avx2 :
+                                           iavf_recv_scattered_pkts_vec;
+               } else {
+                       PMD_DRV_LOG(DEBUG, "Using %sVector Rx (port %d).",
+                                   use_avx2 ? "avx2 " : "",
+                                   dev->data->port_id);
+                       dev->rx_pkt_burst = use_avx2 ?
+                                           iavf_recv_pkts_vec_avx2 :
+                                           iavf_recv_pkts_vec;
                }
-       } else if (dev->data->scattered_rx) {
+
+               return;
+       }
+#endif
+
+       if (dev->data->scattered_rx) {
                PMD_DRV_LOG(DEBUG, "Using a Scattered Rx callback (port=%d).",
                            dev->data->port_id);
                dev->rx_pkt_burst = iavf_recv_scattered_pkts;
@@ -1779,28 +1718,39 @@ iavf_set_rx_function(struct rte_eth_dev *dev)
 void
 iavf_set_tx_function(struct rte_eth_dev *dev)
 {
-       struct iavf_adapter *adapter =
-               IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+#ifdef RTE_ARCH_X86
        struct iavf_tx_queue *txq;
        int i;
+       bool use_avx2 = false;
 
-       if (adapter->tx_vec_allowed) {
-               PMD_DRV_LOG(DEBUG, "Using Vector Tx callback (port=%d).",
-                           dev->data->port_id);
-               dev->tx_pkt_burst = iavf_xmit_pkts_vec;
-               dev->tx_pkt_prepare = NULL;
+       if (!iavf_tx_vec_dev_check(dev)) {
                for (i = 0; i < dev->data->nb_tx_queues; i++) {
                        txq = dev->data->tx_queues[i];
                        if (!txq)
                                continue;
                        iavf_txq_vec_setup(txq);
                }
-       } else {
-               PMD_DRV_LOG(DEBUG, "Using Basic Tx callback (port=%d).",
+
+               if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
+                   rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1)
+                       use_avx2 = true;
+
+               PMD_DRV_LOG(DEBUG, "Using %sVector Tx (port %d).",
+                           use_avx2 ? "avx2 " : "",
                            dev->data->port_id);
-               dev->tx_pkt_burst = iavf_xmit_pkts;
-               dev->tx_pkt_prepare = iavf_prep_pkts;
+               dev->tx_pkt_burst = use_avx2 ?
+                                   iavf_xmit_pkts_vec_avx2 :
+                                   iavf_xmit_pkts_vec;
+               dev->tx_pkt_prepare = NULL;
+
+               return;
        }
+#endif
+
+       PMD_DRV_LOG(DEBUG, "Using Basic Tx callback (port=%d).",
+                   dev->data->port_id);
+       dev->tx_pkt_burst = iavf_xmit_pkts;
+       dev->tx_pkt_prepare = iavf_prep_pkts;
 }
 
 void
@@ -1816,7 +1766,7 @@ iavf_dev_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
        qinfo->nb_desc = rxq->nb_rx_desc;
 
        qinfo->conf.rx_free_thresh = rxq->rx_free_thresh;
-       qinfo->conf.rx_drop_en = TRUE;
+       qinfo->conf.rx_drop_en = true;
        qinfo->conf.rx_deferred_start = rxq->rx_deferred_start;
 }
 
@@ -1923,38 +1873,541 @@ iavf_dev_tx_desc_status(void *tx_queue, uint16_t offset)
        return RTE_ETH_TX_DESC_FULL;
 }
 
-__rte_weak uint16_t
-iavf_recv_pkts_vec(__rte_unused void *rx_queue,
-                 __rte_unused struct rte_mbuf **rx_pkts,
-                 __rte_unused uint16_t nb_pkts)
-{
-       return 0;
-}
-
-__rte_weak uint16_t
-iavf_recv_scattered_pkts_vec(__rte_unused void *rx_queue,
-                           __rte_unused struct rte_mbuf **rx_pkts,
-                           __rte_unused uint16_t nb_pkts)
+const uint32_t *
+iavf_get_default_ptype_table(void)
 {
-       return 0;
-}
-
-__rte_weak uint16_t
-iavf_xmit_fixed_burst_vec(__rte_unused void *tx_queue,
-                        __rte_unused struct rte_mbuf **tx_pkts,
-                        __rte_unused uint16_t nb_pkts)
-{
-       return 0;
-}
+       static const uint32_t ptype_tbl[IAVF_MAX_PKT_TYPE]
+               __rte_cache_aligned = {
+               /* L2 types */
+               /* [0] reserved */
+               [1] = RTE_PTYPE_L2_ETHER,
+               [2] = RTE_PTYPE_L2_ETHER_TIMESYNC,
+               /* [3] - [5] reserved */
+               [6] = RTE_PTYPE_L2_ETHER_LLDP,
+               /* [7] - [10] reserved */
+               [11] = RTE_PTYPE_L2_ETHER_ARP,
+               /* [12] - [21] reserved */
+
+               /* Non tunneled IPv4 */
+               [22] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_FRAG,
+               [23] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_NONFRAG,
+               [24] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_UDP,
+               /* [25] reserved */
+               [26] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_TCP,
+               [27] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_SCTP,
+               [28] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_ICMP,
+
+               /* IPv4 --> IPv4 */
+               [29] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_FRAG,
+               [30] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_NONFRAG,
+               [31] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_UDP,
+               /* [32] reserved */
+               [33] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_TCP,
+               [34] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_SCTP,
+               [35] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv4 --> IPv6 */
+               [36] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_FRAG,
+               [37] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_NONFRAG,
+               [38] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_UDP,
+               /* [39] reserved */
+               [40] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_TCP,
+               [41] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_SCTP,
+               [42] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv4 --> GRE/Teredo/VXLAN */
+               [43] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT,
+
+               /* IPv4 --> GRE/Teredo/VXLAN --> IPv4 */
+               [44] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_FRAG,
+               [45] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_NONFRAG,
+               [46] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_UDP,
+               /* [47] reserved */
+               [48] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_TCP,
+               [49] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_SCTP,
+               [50] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv4 --> GRE/Teredo/VXLAN --> IPv6 */
+               [51] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_FRAG,
+               [52] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_NONFRAG,
+               [53] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_UDP,
+               /* [54] reserved */
+               [55] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_TCP,
+               [56] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_SCTP,
+               [57] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv4 --> GRE/Teredo/VXLAN --> MAC */
+               [58] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER,
+
+               /* IPv4 --> GRE/Teredo/VXLAN --> MAC --> IPv4 */
+               [59] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_FRAG,
+               [60] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_NONFRAG,
+               [61] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_UDP,
+               /* [62] reserved */
+               [63] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_TCP,
+               [64] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_SCTP,
+               [65] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv4 --> GRE/Teredo/VXLAN --> MAC --> IPv6 */
+               [66] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_FRAG,
+               [67] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_NONFRAG,
+               [68] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_UDP,
+               /* [69] reserved */
+               [70] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_TCP,
+               [71] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_SCTP,
+               [72] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                      RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_ICMP,
+               /* [73] - [87] reserved */
+
+               /* Non tunneled IPv6 */
+               [88] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_FRAG,
+               [89] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_NONFRAG,
+               [90] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_UDP,
+               /* [91] reserved */
+               [92] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_TCP,
+               [93] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_SCTP,
+               [94] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_L4_ICMP,
+
+               /* IPv6 --> IPv4 */
+               [95] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_FRAG,
+               [96] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_NONFRAG,
+               [97] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_UDP,
+               /* [98] reserved */
+               [99] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                      RTE_PTYPE_TUNNEL_IP |
+                      RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                      RTE_PTYPE_INNER_L4_TCP,
+               [100] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_IP |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_SCTP,
+               [101] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_IP |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv6 --> IPv6 */
+               [102] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_IP |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_FRAG,
+               [103] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_IP |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_NONFRAG,
+               [104] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_IP |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_UDP,
+               /* [105] reserved */
+               [106] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_IP |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_TCP,
+               [107] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_IP |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_SCTP,
+               [108] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_IP |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv6 --> GRE/Teredo/VXLAN */
+               [109] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT,
+
+               /* IPv6 --> GRE/Teredo/VXLAN --> IPv4 */
+               [110] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_FRAG,
+               [111] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_NONFRAG,
+               [112] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_UDP,
+               /* [113] reserved */
+               [114] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_TCP,
+               [115] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_SCTP,
+               [116] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv6 --> GRE/Teredo/VXLAN --> IPv6 */
+               [117] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_FRAG,
+               [118] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_NONFRAG,
+               [119] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_UDP,
+               /* [120] reserved */
+               [121] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_TCP,
+               [122] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_SCTP,
+               [123] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv6 --> GRE/Teredo/VXLAN --> MAC */
+               [124] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER,
+
+               /* IPv6 --> GRE/Teredo/VXLAN --> MAC --> IPv4 */
+               [125] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_FRAG,
+               [126] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_NONFRAG,
+               [127] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_UDP,
+               /* [128] reserved */
+               [129] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_TCP,
+               [130] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_SCTP,
+               [131] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv6 --> GRE/Teredo/VXLAN --> MAC --> IPv6 */
+               [132] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_FRAG,
+               [133] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_NONFRAG,
+               [134] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_UDP,
+               /* [135] reserved */
+               [136] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_TCP,
+               [137] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_SCTP,
+               [138] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GRENAT | RTE_PTYPE_INNER_L2_ETHER |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_ICMP,
+               /* [139] - [299] reserved */
+
+               /* PPPoE */
+               [300] = RTE_PTYPE_L2_ETHER_PPPOE,
+               [301] = RTE_PTYPE_L2_ETHER_PPPOE,
+
+               /* PPPoE --> IPv4 */
+               [302] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_FRAG,
+               [303] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_NONFRAG,
+               [304] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [305] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_TCP,
+               [306] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_SCTP,
+               [307] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_ICMP,
 
-__rte_weak int
-iavf_rxq_vec_setup(__rte_unused struct iavf_rx_queue *rxq)
-{
-       return -1;
-}
+               /* PPPoE --> IPv6 */
+               [308] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_FRAG,
+               [309] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_NONFRAG,
+               [310] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [311] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_TCP,
+               [312] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_SCTP,
+               [313] = RTE_PTYPE_L2_ETHER_PPPOE |
+                       RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_ICMP,
+               /* [314] - [324] reserved */
+
+               /* IPv4/IPv6 --> GTPC/GTPU */
+               [325] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPC,
+               [326] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPC,
+               [327] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPC,
+               [328] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPC,
+               [329] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU,
+               [330] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU,
+
+               /* IPv4 --> GTPU --> IPv4 */
+               [331] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_FRAG,
+               [332] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_NONFRAG,
+               [333] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_UDP,
+               [334] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_TCP,
+               [335] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv6 --> GTPU --> IPv4 */
+               [336] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_FRAG,
+               [337] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_NONFRAG,
+               [338] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_UDP,
+               [339] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_TCP,
+               [340] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv4 --> GTPU --> IPv6 */
+               [341] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_FRAG,
+               [342] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_NONFRAG,
+               [343] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_UDP,
+               [344] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_TCP,
+               [345] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv6 --> GTPU --> IPv6 */
+               [346] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_FRAG,
+               [347] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_NONFRAG,
+               [348] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_UDP,
+               [349] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_TCP,
+               [350] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_TUNNEL_GTPU |
+                       RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_INNER_L4_ICMP,
+               /* All others reserved */
+       };
 
-__rte_weak int
-iavf_txq_vec_setup(__rte_unused struct iavf_tx_queue *txq)
-{
-       return -1;
+       return ptype_tbl;
 }