[01/32] net/ngbe: add packet type

Message ID 20210908083758.312055-2-jiawenwu@trustnetic.com (mailing list archive)
State Changes Requested, archived
Delegated to: Ferruh Yigit
Headers
Series net/ngbe: add many features |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Jiawen Wu Sept. 8, 2021, 8:37 a.m. UTC
  Add packet type marco definition and convert ptype to ptid.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
---
 doc/guides/nics/features/ngbe.ini |   1 +
 doc/guides/nics/ngbe.rst          |   1 +
 drivers/net/ngbe/meson.build      |   1 +
 drivers/net/ngbe/ngbe_ethdev.c    |   9 +
 drivers/net/ngbe/ngbe_ethdev.h    |   4 +
 drivers/net/ngbe/ngbe_ptypes.c    | 300 ++++++++++++++++++++++++++++++
 drivers/net/ngbe/ngbe_ptypes.h    | 240 ++++++++++++++++++++++++
 drivers/net/ngbe/ngbe_rxtx.c      |  16 ++
 drivers/net/ngbe/ngbe_rxtx.h      |   2 +
 9 files changed, 574 insertions(+)
 create mode 100644 drivers/net/ngbe/ngbe_ptypes.c
 create mode 100644 drivers/net/ngbe/ngbe_ptypes.h
  

Comments

Ferruh Yigit Sept. 15, 2021, 4:47 p.m. UTC | #1
On 9/8/2021 9:37 AM, Jiawen Wu wrote:
> Add packet type marco definition and convert ptype to ptid.
> 
> Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
> ---
>  doc/guides/nics/features/ngbe.ini |   1 +
>  doc/guides/nics/ngbe.rst          |   1 +
>  drivers/net/ngbe/meson.build      |   1 +
>  drivers/net/ngbe/ngbe_ethdev.c    |   9 +
>  drivers/net/ngbe/ngbe_ethdev.h    |   4 +
>  drivers/net/ngbe/ngbe_ptypes.c    | 300 ++++++++++++++++++++++++++++++
>  drivers/net/ngbe/ngbe_ptypes.h    | 240 ++++++++++++++++++++++++
>  drivers/net/ngbe/ngbe_rxtx.c      |  16 ++
>  drivers/net/ngbe/ngbe_rxtx.h      |   2 +
>  9 files changed, 574 insertions(+)
>  create mode 100644 drivers/net/ngbe/ngbe_ptypes.c
>  create mode 100644 drivers/net/ngbe/ngbe_ptypes.h
> 
> diff --git a/doc/guides/nics/features/ngbe.ini b/doc/guides/nics/features/ngbe.ini
> index 08d5f1b0dc..8b7588184a 100644
> --- a/doc/guides/nics/features/ngbe.ini
> +++ b/doc/guides/nics/features/ngbe.ini
> @@ -8,6 +8,7 @@ Speed capabilities   = Y
>  Link status          = Y
>  Link status event    = Y
>  Queue start/stop     = Y
> +Packet type parsing  = Y

"Packet type parsing" also requires to support
'rte_eth_dev_get_supported_ptypes()' & 'rte_eth_dev_set_ptypes()' APIs.

Current implementation seems parses the packet type and updates mbuf field for
it but doesn't support above APIs, can you please add them too? There is already
'ngbe_dev_supported_ptypes_get()' function but dev_ops seems not set.

<...>

> +++ b/drivers/net/ngbe/ngbe_ptypes.c
> @@ -0,0 +1,300 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd.
> + */
> +
> +#include <rte_mbuf.h>
> +#include <rte_memory.h>
> +
> +#include "base/ngbe_type.h"
> +#include "ngbe_ptypes.h"
> +
> +/* The ngbe_ptype_lookup is used to convert from the 8-bit ptid in the
> + * hardware to a bit-field that can be used by SW to more easily determine the
> + * packet type.
> + *
> + * Macros are used to shorten the table lines and make this table human
> + * readable.
> + *
> + * We store the PTYPE in the top byte of the bit field - this is just so that
> + * we can check that the table doesn't have a row missing, as the index into
> + * the table should be the PTYPE.
> + */
> +#define TPTE(ptid, l2, l3, l4, tun, el2, el3, el4) \
> +	[ptid] = (RTE_PTYPE_L2_##l2 | \
> +		RTE_PTYPE_L3_##l3 | \
> +		RTE_PTYPE_L4_##l4 | \
> +		RTE_PTYPE_TUNNEL_##tun | \
> +		RTE_PTYPE_INNER_L2_##el2 | \
> +		RTE_PTYPE_INNER_L3_##el3 | \
> +		RTE_PTYPE_INNER_L4_##el4)
> +
> +#define RTE_PTYPE_L2_NONE               0
> +#define RTE_PTYPE_L3_NONE               0
> +#define RTE_PTYPE_L4_NONE               0
> +#define RTE_PTYPE_TUNNEL_NONE           0
> +#define RTE_PTYPE_INNER_L2_NONE         0
> +#define RTE_PTYPE_INNER_L3_NONE         0
> +#define RTE_PTYPE_INNER_L4_NONE         0

Why you are defining new PTYPEs? If these are for driver internal you can drop
the 'RTE_' prefix.

<...>

> +
> +#ifndef RTE_PTYPE_UNKNOWN
> +#define RTE_PTYPE_UNKNOWN                   0x00000000
> +#define RTE_PTYPE_L2_ETHER                  0x00000001
> +#define RTE_PTYPE_L2_ETHER_TIMESYNC         0x00000002
> +#define RTE_PTYPE_L2_ETHER_ARP              0x00000003
> +#define RTE_PTYPE_L2_ETHER_LLDP             0x00000004
> +#define RTE_PTYPE_L2_ETHER_NSH              0x00000005
> +#define RTE_PTYPE_L2_ETHER_FCOE             0x00000009
> +#define RTE_PTYPE_L3_IPV4                   0x00000010
> +#define RTE_PTYPE_L3_IPV4_EXT               0x00000030
> +#define RTE_PTYPE_L3_IPV6                   0x00000040
> +#define RTE_PTYPE_L3_IPV4_EXT_UNKNOWN       0x00000090
> +#define RTE_PTYPE_L3_IPV6_EXT               0x000000c0
> +#define RTE_PTYPE_L3_IPV6_EXT_UNKNOWN       0x000000e0
> +#define RTE_PTYPE_L4_TCP                    0x00000100
> +#define RTE_PTYPE_L4_UDP                    0x00000200
> +#define RTE_PTYPE_L4_FRAG                   0x00000300
> +#define RTE_PTYPE_L4_SCTP                   0x00000400
> +#define RTE_PTYPE_L4_ICMP                   0x00000500
> +#define RTE_PTYPE_L4_NONFRAG                0x00000600
> +#define RTE_PTYPE_TUNNEL_IP                 0x00001000
> +#define RTE_PTYPE_TUNNEL_GRE                0x00002000
> +#define RTE_PTYPE_TUNNEL_VXLAN              0x00003000
> +#define RTE_PTYPE_TUNNEL_NVGRE              0x00004000
> +#define RTE_PTYPE_TUNNEL_GENEVE             0x00005000
> +#define RTE_PTYPE_TUNNEL_GRENAT             0x00006000
> +#define RTE_PTYPE_INNER_L2_ETHER            0x00010000
> +#define RTE_PTYPE_INNER_L2_ETHER_VLAN       0x00020000
> +#define RTE_PTYPE_INNER_L3_IPV4             0x00100000
> +#define RTE_PTYPE_INNER_L3_IPV4_EXT         0x00200000
> +#define RTE_PTYPE_INNER_L3_IPV6             0x00300000
> +#define RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN 0x00400000
> +#define RTE_PTYPE_INNER_L3_IPV6_EXT         0x00500000
> +#define RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN 0x00600000
> +#define RTE_PTYPE_INNER_L4_TCP              0x01000000
> +#define RTE_PTYPE_INNER_L4_UDP              0x02000000
> +#define RTE_PTYPE_INNER_L4_FRAG             0x03000000
> +#define RTE_PTYPE_INNER_L4_SCTP             0x04000000
> +#define RTE_PTYPE_INNER_L4_ICMP             0x05000000
> +#define RTE_PTYPE_INNER_L4_NONFRAG          0x06000000
> +#endif /* !RTE_PTYPE_UNKNOWN */

These are already defined in the mbuf public header, why there are defined again?

<...>

> @@ -378,6 +389,10 @@ ngbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
>  		rxm->data_len = pkt_len;
>  		rxm->port = rxq->port_id;
>  
> +		pkt_info = rte_le_to_cpu_32(rxd.qw0.dw0);
> +		rxm->packet_type = ngbe_rxd_pkt_info_to_pkt_type(pkt_info,
> +						       rxq->pkt_type_mask);
> +
>  		/*
>  		 * Store the mbuf address into the next entry of the array
>  		 * of returned packets.
> @@ -799,6 +814,7 @@ ngbe_dev_rx_queue_setup(struct rte_eth_dev *dev,
>  	rxq->port_id = dev->data->port_id;
>  	rxq->drop_en = rx_conf->rx_drop_en;
>  	rxq->rx_deferred_start = rx_conf->rx_deferred_start;
> +	rxq->pkt_type_mask = NGBE_PTID_MASK;

What is the use of the 'pkt_type_mask', it seems it is a fixed value, why
keeping it per queue?
  
Jiawen Wu Sept. 22, 2021, 8:01 a.m. UTC | #2
On September 16, 2021 12:48 AM, Ferruh Yigit wrote:
> On 9/8/2021 9:37 AM, Jiawen Wu wrote:
> > Add packet type marco definition and convert ptype to ptid.
> >
> > Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
> > ---
> >  doc/guides/nics/features/ngbe.ini |   1 +
> >  doc/guides/nics/ngbe.rst          |   1 +
> >  drivers/net/ngbe/meson.build      |   1 +
> >  drivers/net/ngbe/ngbe_ethdev.c    |   9 +
> >  drivers/net/ngbe/ngbe_ethdev.h    |   4 +
> >  drivers/net/ngbe/ngbe_ptypes.c    | 300
> ++++++++++++++++++++++++++++++
> >  drivers/net/ngbe/ngbe_ptypes.h    | 240 ++++++++++++++++++++++++
> >  drivers/net/ngbe/ngbe_rxtx.c      |  16 ++
> >  drivers/net/ngbe/ngbe_rxtx.h      |   2 +
> >  9 files changed, 574 insertions(+)
> >  create mode 100644 drivers/net/ngbe/ngbe_ptypes.c  create mode
> 100644
> > drivers/net/ngbe/ngbe_ptypes.h
> >
> > diff --git a/doc/guides/nics/features/ngbe.ini
> > b/doc/guides/nics/features/ngbe.ini
> > index 08d5f1b0dc..8b7588184a 100644
> > --- a/doc/guides/nics/features/ngbe.ini
> > +++ b/doc/guides/nics/features/ngbe.ini
> > @@ -8,6 +8,7 @@ Speed capabilities   = Y
> >  Link status          = Y
> >  Link status event    = Y
> >  Queue start/stop     = Y
> > +Packet type parsing  = Y
> 
> "Packet type parsing" also requires to support
> 'rte_eth_dev_get_supported_ptypes()' & 'rte_eth_dev_set_ptypes()' APIs.
> 
> Current implementation seems parses the packet type and updates mbuf field
> for it but doesn't support above APIs, can you please add them too? There is
> already 'ngbe_dev_supported_ptypes_get()' function but dev_ops seems not
> set.
> 

Oops.., I forgot it.

> <...>
> 
> > +++ b/drivers/net/ngbe/ngbe_ptypes.c
> > @@ -0,0 +1,300 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause
> > + * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd.
> > + */
> > +
> > +#include <rte_mbuf.h>
> > +#include <rte_memory.h>
> > +
> > +#include "base/ngbe_type.h"
> > +#include "ngbe_ptypes.h"
> > +
> > +/* The ngbe_ptype_lookup is used to convert from the 8-bit ptid in
> > +the
> > + * hardware to a bit-field that can be used by SW to more easily
> > +determine the
> > + * packet type.
> > + *
> > + * Macros are used to shorten the table lines and make this table
> > +human
> > + * readable.
> > + *
> > + * We store the PTYPE in the top byte of the bit field - this is just
> > +so that
> > + * we can check that the table doesn't have a row missing, as the
> > +index into
> > + * the table should be the PTYPE.
> > + */
> > +#define TPTE(ptid, l2, l3, l4, tun, el2, el3, el4) \
> > +	[ptid] = (RTE_PTYPE_L2_##l2 | \
> > +		RTE_PTYPE_L3_##l3 | \
> > +		RTE_PTYPE_L4_##l4 | \
> > +		RTE_PTYPE_TUNNEL_##tun | \
> > +		RTE_PTYPE_INNER_L2_##el2 | \
> > +		RTE_PTYPE_INNER_L3_##el3 | \
> > +		RTE_PTYPE_INNER_L4_##el4)
> > +
> > +#define RTE_PTYPE_L2_NONE               0
> > +#define RTE_PTYPE_L3_NONE               0
> > +#define RTE_PTYPE_L4_NONE               0
> > +#define RTE_PTYPE_TUNNEL_NONE           0
> > +#define RTE_PTYPE_INNER_L2_NONE         0
> > +#define RTE_PTYPE_INNER_L3_NONE         0
> > +#define RTE_PTYPE_INNER_L4_NONE         0
> 
> Why you are defining new PTYPEs? If these are for driver internal you can drop
> the 'RTE_' prefix.
> 

I just want to use short macros, to make the lookup table readable.
So it needs 'RTE_' prefix here, to be compatible with other RTE mbuf packet types.

> <...>
> 
> > +
> > +#ifndef RTE_PTYPE_UNKNOWN
> > +#define RTE_PTYPE_UNKNOWN                   0x00000000
> > +#define RTE_PTYPE_L2_ETHER                  0x00000001
> > +#define RTE_PTYPE_L2_ETHER_TIMESYNC         0x00000002
> > +#define RTE_PTYPE_L2_ETHER_ARP              0x00000003
> > +#define RTE_PTYPE_L2_ETHER_LLDP             0x00000004
> > +#define RTE_PTYPE_L2_ETHER_NSH              0x00000005
> > +#define RTE_PTYPE_L2_ETHER_FCOE             0x00000009
> > +#define RTE_PTYPE_L3_IPV4                   0x00000010
> > +#define RTE_PTYPE_L3_IPV4_EXT               0x00000030
> > +#define RTE_PTYPE_L3_IPV6                   0x00000040
> > +#define RTE_PTYPE_L3_IPV4_EXT_UNKNOWN       0x00000090
> > +#define RTE_PTYPE_L3_IPV6_EXT               0x000000c0
> > +#define RTE_PTYPE_L3_IPV6_EXT_UNKNOWN       0x000000e0
> > +#define RTE_PTYPE_L4_TCP                    0x00000100
> > +#define RTE_PTYPE_L4_UDP                    0x00000200
> > +#define RTE_PTYPE_L4_FRAG                   0x00000300
> > +#define RTE_PTYPE_L4_SCTP                   0x00000400
> > +#define RTE_PTYPE_L4_ICMP                   0x00000500
> > +#define RTE_PTYPE_L4_NONFRAG                0x00000600
> > +#define RTE_PTYPE_TUNNEL_IP                 0x00001000
> > +#define RTE_PTYPE_TUNNEL_GRE                0x00002000
> > +#define RTE_PTYPE_TUNNEL_VXLAN              0x00003000
> > +#define RTE_PTYPE_TUNNEL_NVGRE              0x00004000
> > +#define RTE_PTYPE_TUNNEL_GENEVE             0x00005000
> > +#define RTE_PTYPE_TUNNEL_GRENAT             0x00006000
> > +#define RTE_PTYPE_INNER_L2_ETHER            0x00010000
> > +#define RTE_PTYPE_INNER_L2_ETHER_VLAN       0x00020000
> > +#define RTE_PTYPE_INNER_L3_IPV4             0x00100000
> > +#define RTE_PTYPE_INNER_L3_IPV4_EXT         0x00200000
> > +#define RTE_PTYPE_INNER_L3_IPV6             0x00300000
> > +#define RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN 0x00400000
> > +#define RTE_PTYPE_INNER_L3_IPV6_EXT         0x00500000
> > +#define RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN 0x00600000
> > +#define RTE_PTYPE_INNER_L4_TCP              0x01000000
> > +#define RTE_PTYPE_INNER_L4_UDP              0x02000000
> > +#define RTE_PTYPE_INNER_L4_FRAG             0x03000000
> > +#define RTE_PTYPE_INNER_L4_SCTP             0x04000000
> > +#define RTE_PTYPE_INNER_L4_ICMP             0x05000000
> > +#define RTE_PTYPE_INNER_L4_NONFRAG          0x06000000
> > +#endif /* !RTE_PTYPE_UNKNOWN */
> 
> These are already defined in the mbuf public header, why there are defined
> again?
> 

These can be removed directly. They were written previously for version compatibility.

> <...>
> 
> > @@ -378,6 +389,10 @@ ngbe_recv_pkts(void *rx_queue, struct rte_mbuf
> **rx_pkts,
> >  		rxm->data_len = pkt_len;
> >  		rxm->port = rxq->port_id;
> >
> > +		pkt_info = rte_le_to_cpu_32(rxd.qw0.dw0);
> > +		rxm->packet_type = ngbe_rxd_pkt_info_to_pkt_type(pkt_info,
> > +						       rxq->pkt_type_mask);
> > +
> >  		/*
> >  		 * Store the mbuf address into the next entry of the array
> >  		 * of returned packets.
> > @@ -799,6 +814,7 @@ ngbe_dev_rx_queue_setup(struct rte_eth_dev *dev,
> >  	rxq->port_id = dev->data->port_id;
> >  	rxq->drop_en = rx_conf->rx_drop_en;
> >  	rxq->rx_deferred_start = rx_conf->rx_deferred_start;
> > +	rxq->pkt_type_mask = NGBE_PTID_MASK;
> 
> What is the use of the 'pkt_type_mask', it seems it is a fixed value, why keeping
> it per queue?
  

Patch

diff --git a/doc/guides/nics/features/ngbe.ini b/doc/guides/nics/features/ngbe.ini
index 08d5f1b0dc..8b7588184a 100644
--- a/doc/guides/nics/features/ngbe.ini
+++ b/doc/guides/nics/features/ngbe.ini
@@ -8,6 +8,7 @@  Speed capabilities   = Y
 Link status          = Y
 Link status event    = Y
 Queue start/stop     = Y
+Packet type parsing  = Y
 Multiprocess aware   = Y
 Linux                = Y
 ARMv8                = Y
diff --git a/doc/guides/nics/ngbe.rst b/doc/guides/nics/ngbe.rst
index 3ba3bb755f..d044397cd5 100644
--- a/doc/guides/nics/ngbe.rst
+++ b/doc/guides/nics/ngbe.rst
@@ -11,6 +11,7 @@  for Wangxun 1 Gigabit Ethernet NICs.
 Features
 --------
 
+- Packet type information
 - Link state information
 
 
diff --git a/drivers/net/ngbe/meson.build b/drivers/net/ngbe/meson.build
index 815ef4da23..05f94fe7d6 100644
--- a/drivers/net/ngbe/meson.build
+++ b/drivers/net/ngbe/meson.build
@@ -12,6 +12,7 @@  objs = [base_objs]
 
 sources = files(
         'ngbe_ethdev.c',
+        'ngbe_ptypes.c',
         'ngbe_rxtx.c',
 )
 
diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c
index 3b5c6615ad..4388d93560 100644
--- a/drivers/net/ngbe/ngbe_ethdev.c
+++ b/drivers/net/ngbe/ngbe_ethdev.c
@@ -667,6 +667,15 @@  ngbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	return 0;
 }
 
+const uint32_t *
+ngbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)
+{
+	if (dev->rx_pkt_burst == ngbe_recv_pkts)
+		return ngbe_get_supported_ptypes();
+
+	return NULL;
+}
+
 /* return 0 means link status changed, -1 means not changed */
 int
 ngbe_dev_link_update_share(struct rte_eth_dev *dev,
diff --git a/drivers/net/ngbe/ngbe_ethdev.h b/drivers/net/ngbe/ngbe_ethdev.h
index 7fb72f3f1f..486c6c3839 100644
--- a/drivers/net/ngbe/ngbe_ethdev.h
+++ b/drivers/net/ngbe/ngbe_ethdev.h
@@ -6,6 +6,8 @@ 
 #ifndef _NGBE_ETHDEV_H_
 #define _NGBE_ETHDEV_H_
 
+#include "ngbe_ptypes.h"
+
 /* need update link, bit flag */
 #define NGBE_FLAG_NEED_LINK_UPDATE  ((uint32_t)(1 << 0))
 #define NGBE_FLAG_MAILBOX           ((uint32_t)(1 << 1))
@@ -131,4 +133,6 @@  ngbe_dev_link_update_share(struct rte_eth_dev *dev,
 #define NGBE_DEFAULT_TX_HTHRESH      0
 #define NGBE_DEFAULT_TX_WTHRESH      0
 
+const uint32_t *ngbe_dev_supported_ptypes_get(struct rte_eth_dev *dev);
+
 #endif /* _NGBE_ETHDEV_H_ */
diff --git a/drivers/net/ngbe/ngbe_ptypes.c b/drivers/net/ngbe/ngbe_ptypes.c
new file mode 100644
index 0000000000..d6d82105c9
--- /dev/null
+++ b/drivers/net/ngbe/ngbe_ptypes.c
@@ -0,0 +1,300 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd.
+ */
+
+#include <rte_mbuf.h>
+#include <rte_memory.h>
+
+#include "base/ngbe_type.h"
+#include "ngbe_ptypes.h"
+
+/* The ngbe_ptype_lookup is used to convert from the 8-bit ptid in the
+ * hardware to a bit-field that can be used by SW to more easily determine the
+ * packet type.
+ *
+ * Macros are used to shorten the table lines and make this table human
+ * readable.
+ *
+ * We store the PTYPE in the top byte of the bit field - this is just so that
+ * we can check that the table doesn't have a row missing, as the index into
+ * the table should be the PTYPE.
+ */
+#define TPTE(ptid, l2, l3, l4, tun, el2, el3, el4) \
+	[ptid] = (RTE_PTYPE_L2_##l2 | \
+		RTE_PTYPE_L3_##l3 | \
+		RTE_PTYPE_L4_##l4 | \
+		RTE_PTYPE_TUNNEL_##tun | \
+		RTE_PTYPE_INNER_L2_##el2 | \
+		RTE_PTYPE_INNER_L3_##el3 | \
+		RTE_PTYPE_INNER_L4_##el4)
+
+#define RTE_PTYPE_L2_NONE               0
+#define RTE_PTYPE_L3_NONE               0
+#define RTE_PTYPE_L4_NONE               0
+#define RTE_PTYPE_TUNNEL_NONE           0
+#define RTE_PTYPE_INNER_L2_NONE         0
+#define RTE_PTYPE_INNER_L3_NONE         0
+#define RTE_PTYPE_INNER_L4_NONE         0
+
+static u32 ngbe_ptype_lookup[NGBE_PTID_MAX] __rte_cache_aligned = {
+	/* L2:0-3 L3:4-7 L4:8-11 TUN:12-15 EL2:16-19 EL3:20-23 EL2:24-27 */
+	/* L2: ETH */
+	TPTE(0x10, ETHER,          NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x11, ETHER,          NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x12, ETHER_TIMESYNC, NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x13, ETHER_FIP,      NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x14, ETHER_LLDP,     NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x15, ETHER_CNM,      NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x16, ETHER_EAPOL,    NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x17, ETHER_ARP,      NONE, NONE, NONE, NONE, NONE, NONE),
+	/* L2: Ethertype Filter */
+	TPTE(0x18, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x19, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x1A, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x1B, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x1C, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x1D, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x1E, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
+	TPTE(0x1F, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
+	/* L3: IP */
+	TPTE(0x20, ETHER, IPV4, NONFRAG, NONE, NONE, NONE, NONE),
+	TPTE(0x21, ETHER, IPV4, FRAG,    NONE, NONE, NONE, NONE),
+	TPTE(0x22, ETHER, IPV4, NONFRAG, NONE, NONE, NONE, NONE),
+	TPTE(0x23, ETHER, IPV4, UDP,     NONE, NONE, NONE, NONE),
+	TPTE(0x24, ETHER, IPV4, TCP,     NONE, NONE, NONE, NONE),
+	TPTE(0x25, ETHER, IPV4, SCTP,    NONE, NONE, NONE, NONE),
+	TPTE(0x29, ETHER, IPV6, FRAG,    NONE, NONE, NONE, NONE),
+	TPTE(0x2A, ETHER, IPV6, NONFRAG, NONE, NONE, NONE, NONE),
+	TPTE(0x2B, ETHER, IPV6, UDP,     NONE, NONE, NONE, NONE),
+	TPTE(0x2C, ETHER, IPV6, TCP,     NONE, NONE, NONE, NONE),
+	TPTE(0x2D, ETHER, IPV6, SCTP,    NONE, NONE, NONE, NONE),
+	/* IPv4 -> IPv4/IPv6 */
+	TPTE(0x81, ETHER, IPV4, NONE, IP, NONE, IPV4, FRAG),
+	TPTE(0x82, ETHER, IPV4, NONE, IP, NONE, IPV4, NONFRAG),
+	TPTE(0x83, ETHER, IPV4, NONE, IP, NONE, IPV4, UDP),
+	TPTE(0x84, ETHER, IPV4, NONE, IP, NONE, IPV4, TCP),
+	TPTE(0x85, ETHER, IPV4, NONE, IP, NONE, IPV4, SCTP),
+	TPTE(0x89, ETHER, IPV4, NONE, IP, NONE, IPV6, FRAG),
+	TPTE(0x8A, ETHER, IPV4, NONE, IP, NONE, IPV6, NONFRAG),
+	TPTE(0x8B, ETHER, IPV4, NONE, IP, NONE, IPV6, UDP),
+	TPTE(0x8C, ETHER, IPV4, NONE, IP, NONE, IPV6, TCP),
+	TPTE(0x8D, ETHER, IPV4, NONE, IP, NONE, IPV6, SCTP),
+	/* IPv6 -> IPv4/IPv6 */
+	TPTE(0xC1, ETHER, IPV6, NONE, IP, NONE, IPV4, FRAG),
+	TPTE(0xC2, ETHER, IPV6, NONE, IP, NONE, IPV4, NONFRAG),
+	TPTE(0xC3, ETHER, IPV6, NONE, IP, NONE, IPV4, UDP),
+	TPTE(0xC4, ETHER, IPV6, NONE, IP, NONE, IPV4, TCP),
+	TPTE(0xC5, ETHER, IPV6, NONE, IP, NONE, IPV4, SCTP),
+	TPTE(0xC9, ETHER, IPV6, NONE, IP, NONE, IPV6, FRAG),
+	TPTE(0xCA, ETHER, IPV6, NONE, IP, NONE, IPV6, NONFRAG),
+	TPTE(0xCB, ETHER, IPV6, NONE, IP, NONE, IPV6, UDP),
+	TPTE(0xCC, ETHER, IPV6, NONE, IP, NONE, IPV6, TCP),
+	TPTE(0xCD, ETHER, IPV6, NONE, IP, NONE, IPV6, SCTP),
+};
+
+u32 *ngbe_get_supported_ptypes(void)
+{
+	static u32 ptypes[] = {
+		/* For non-vec functions,
+		 * refers to ngbe_rxd_pkt_info_to_pkt_type();
+		 */
+		RTE_PTYPE_L2_ETHER,
+		RTE_PTYPE_L3_IPV4,
+		RTE_PTYPE_L3_IPV4_EXT,
+		RTE_PTYPE_L3_IPV6,
+		RTE_PTYPE_L3_IPV6_EXT,
+		RTE_PTYPE_L4_SCTP,
+		RTE_PTYPE_L4_TCP,
+		RTE_PTYPE_L4_UDP,
+		RTE_PTYPE_TUNNEL_IP,
+		RTE_PTYPE_INNER_L3_IPV6,
+		RTE_PTYPE_INNER_L3_IPV6_EXT,
+		RTE_PTYPE_INNER_L4_TCP,
+		RTE_PTYPE_INNER_L4_UDP,
+		RTE_PTYPE_UNKNOWN
+	};
+
+	return ptypes;
+}
+
+static inline u8
+ngbe_encode_ptype_mac(u32 ptype)
+{
+	u8 ptid;
+
+	ptid = NGBE_PTID_PKT_MAC;
+
+	switch (ptype & RTE_PTYPE_L2_MASK) {
+	case RTE_PTYPE_UNKNOWN:
+		break;
+	case RTE_PTYPE_L2_ETHER_TIMESYNC:
+		ptid |= NGBE_PTID_TYP_TS;
+		break;
+	case RTE_PTYPE_L2_ETHER_ARP:
+		ptid |= NGBE_PTID_TYP_ARP;
+		break;
+	case RTE_PTYPE_L2_ETHER_LLDP:
+		ptid |= NGBE_PTID_TYP_LLDP;
+		break;
+	default:
+		ptid |= NGBE_PTID_TYP_MAC;
+		break;
+	}
+
+	return ptid;
+}
+
+static inline u8
+ngbe_encode_ptype_ip(u32 ptype)
+{
+	u8 ptid;
+
+	ptid = NGBE_PTID_PKT_IP;
+
+	switch (ptype & RTE_PTYPE_L3_MASK) {
+	case RTE_PTYPE_L3_IPV4:
+	case RTE_PTYPE_L3_IPV4_EXT:
+	case RTE_PTYPE_L3_IPV4_EXT_UNKNOWN:
+		break;
+	case RTE_PTYPE_L3_IPV6:
+	case RTE_PTYPE_L3_IPV6_EXT:
+	case RTE_PTYPE_L3_IPV6_EXT_UNKNOWN:
+		ptid |= NGBE_PTID_PKT_IPV6;
+		break;
+	default:
+		return ngbe_encode_ptype_mac(ptype);
+	}
+
+	switch (ptype & RTE_PTYPE_L4_MASK) {
+	case RTE_PTYPE_L4_TCP:
+		ptid |= NGBE_PTID_TYP_TCP;
+		break;
+	case RTE_PTYPE_L4_UDP:
+		ptid |= NGBE_PTID_TYP_UDP;
+		break;
+	case RTE_PTYPE_L4_SCTP:
+		ptid |= NGBE_PTID_TYP_SCTP;
+		break;
+	case RTE_PTYPE_L4_FRAG:
+		ptid |= NGBE_PTID_TYP_IPFRAG;
+		break;
+	default:
+		ptid |= NGBE_PTID_TYP_IPDATA;
+		break;
+	}
+
+	return ptid;
+}
+
+static inline u8
+ngbe_encode_ptype_tunnel(u32 ptype)
+{
+	u8 ptid;
+
+	ptid = NGBE_PTID_PKT_TUN;
+
+	switch (ptype & RTE_PTYPE_L3_MASK) {
+	case RTE_PTYPE_L3_IPV4:
+	case RTE_PTYPE_L3_IPV4_EXT:
+	case RTE_PTYPE_L3_IPV4_EXT_UNKNOWN:
+		break;
+	case RTE_PTYPE_L3_IPV6:
+	case RTE_PTYPE_L3_IPV6_EXT:
+	case RTE_PTYPE_L3_IPV6_EXT_UNKNOWN:
+		ptid |= NGBE_PTID_TUN_IPV6;
+		break;
+	default:
+		return ngbe_encode_ptype_ip(ptype);
+	}
+
+	/* VXLAN/GRE/Teredo/VXLAN-GPE are not supported in EM */
+	switch (ptype & RTE_PTYPE_TUNNEL_MASK) {
+	case RTE_PTYPE_TUNNEL_IP:
+		ptid |= NGBE_PTID_TUN_EI;
+		break;
+	case RTE_PTYPE_TUNNEL_GRE:
+	case RTE_PTYPE_TUNNEL_VXLAN_GPE:
+		ptid |= NGBE_PTID_TUN_EIG;
+		break;
+	case RTE_PTYPE_TUNNEL_VXLAN:
+	case RTE_PTYPE_TUNNEL_NVGRE:
+	case RTE_PTYPE_TUNNEL_GENEVE:
+	case RTE_PTYPE_TUNNEL_GRENAT:
+		break;
+	default:
+		return ptid;
+	}
+
+	switch (ptype & RTE_PTYPE_INNER_L2_MASK) {
+	case RTE_PTYPE_INNER_L2_ETHER:
+		ptid |= NGBE_PTID_TUN_EIGM;
+		break;
+	case RTE_PTYPE_INNER_L2_ETHER_VLAN:
+		ptid |= NGBE_PTID_TUN_EIGMV;
+		break;
+	case RTE_PTYPE_INNER_L2_ETHER_QINQ:
+		ptid |= NGBE_PTID_TUN_EIGMV;
+		break;
+	default:
+		break;
+	}
+
+	switch (ptype & RTE_PTYPE_INNER_L3_MASK) {
+	case RTE_PTYPE_INNER_L3_IPV4:
+	case RTE_PTYPE_INNER_L3_IPV4_EXT:
+	case RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN:
+		break;
+	case RTE_PTYPE_INNER_L3_IPV6:
+	case RTE_PTYPE_INNER_L3_IPV6_EXT:
+	case RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN:
+		ptid |= NGBE_PTID_PKT_IPV6;
+		break;
+	default:
+		return ptid;
+	}
+
+	switch (ptype & RTE_PTYPE_INNER_L4_MASK) {
+	case RTE_PTYPE_INNER_L4_TCP:
+		ptid |= NGBE_PTID_TYP_TCP;
+		break;
+	case RTE_PTYPE_INNER_L4_UDP:
+		ptid |= NGBE_PTID_TYP_UDP;
+		break;
+	case RTE_PTYPE_INNER_L4_SCTP:
+		ptid |= NGBE_PTID_TYP_SCTP;
+		break;
+	case RTE_PTYPE_INNER_L4_FRAG:
+		ptid |= NGBE_PTID_TYP_IPFRAG;
+		break;
+	default:
+		ptid |= NGBE_PTID_TYP_IPDATA;
+		break;
+	}
+
+	return ptid;
+}
+
+u32 ngbe_decode_ptype(u8 ptid)
+{
+	if (-1 != ngbe_etflt_id(ptid))
+		return RTE_PTYPE_UNKNOWN;
+
+	return ngbe_ptype_lookup[ptid];
+}
+
+u8 ngbe_encode_ptype(u32 ptype)
+{
+	u8 ptid = 0;
+
+	if (ptype & RTE_PTYPE_TUNNEL_MASK)
+		ptid = ngbe_encode_ptype_tunnel(ptype);
+	else if (ptype & RTE_PTYPE_L3_MASK)
+		ptid = ngbe_encode_ptype_ip(ptype);
+	else if (ptype & RTE_PTYPE_L2_MASK)
+		ptid = ngbe_encode_ptype_mac(ptype);
+	else
+		ptid = NGBE_PTID_NULL;
+
+	return ptid;
+}
+
diff --git a/drivers/net/ngbe/ngbe_ptypes.h b/drivers/net/ngbe/ngbe_ptypes.h
new file mode 100644
index 0000000000..2ac33d814b
--- /dev/null
+++ b/drivers/net/ngbe/ngbe_ptypes.h
@@ -0,0 +1,240 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd.
+ */
+
+#ifndef _NGBE_PTYPE_H_
+#define _NGBE_PTYPE_H_
+
+/**
+ * PTID(Packet Type Identifier, 8bits)
+ * - Bit 3:0 detailed types.
+ * - Bit 5:4 basic types.
+ * - Bit 7:6 tunnel types.
+ **/
+#define NGBE_PTID_NULL                 0
+#define NGBE_PTID_MAX                  256
+#define NGBE_PTID_MASK                 0xFF
+#define NGBE_PTID_MASK_TUNNEL          0x7F
+
+/* TUN */
+#define NGBE_PTID_TUN_IPV6             0x40
+#define NGBE_PTID_TUN_EI               0x00 /* IP */
+#define NGBE_PTID_TUN_EIG              0x10 /* IP+GRE */
+#define NGBE_PTID_TUN_EIGM             0x20 /* IP+GRE+MAC */
+#define NGBE_PTID_TUN_EIGMV            0x30 /* IP+GRE+MAC+VLAN */
+
+/* PKT for !TUN */
+#define NGBE_PTID_PKT_TUN             (0x80)
+#define NGBE_PTID_PKT_MAC             (0x10)
+#define NGBE_PTID_PKT_IP              (0x20)
+
+/* TYP for PKT=mac */
+#define NGBE_PTID_TYP_MAC             (0x01)
+#define NGBE_PTID_TYP_TS              (0x02) /* time sync */
+#define NGBE_PTID_TYP_FIP             (0x03)
+#define NGBE_PTID_TYP_LLDP            (0x04)
+#define NGBE_PTID_TYP_CNM             (0x05)
+#define NGBE_PTID_TYP_EAPOL           (0x06)
+#define NGBE_PTID_TYP_ARP             (0x07)
+#define NGBE_PTID_TYP_ETF             (0x08)
+
+/* TYP for PKT=ip */
+#define NGBE_PTID_PKT_IPV6            (0x08)
+#define NGBE_PTID_TYP_IPFRAG          (0x01)
+#define NGBE_PTID_TYP_IPDATA          (0x02)
+#define NGBE_PTID_TYP_UDP             (0x03)
+#define NGBE_PTID_TYP_TCP             (0x04)
+#define NGBE_PTID_TYP_SCTP            (0x05)
+
+/* packet type non-ip values */
+enum ngbe_l2_ptids {
+	NGBE_PTID_L2_ABORTED = (NGBE_PTID_PKT_MAC),
+	NGBE_PTID_L2_MAC = (NGBE_PTID_PKT_MAC | NGBE_PTID_TYP_MAC),
+	NGBE_PTID_L2_TMST = (NGBE_PTID_PKT_MAC | NGBE_PTID_TYP_TS),
+	NGBE_PTID_L2_FIP = (NGBE_PTID_PKT_MAC | NGBE_PTID_TYP_FIP),
+	NGBE_PTID_L2_LLDP = (NGBE_PTID_PKT_MAC | NGBE_PTID_TYP_LLDP),
+	NGBE_PTID_L2_CNM = (NGBE_PTID_PKT_MAC | NGBE_PTID_TYP_CNM),
+	NGBE_PTID_L2_EAPOL = (NGBE_PTID_PKT_MAC | NGBE_PTID_TYP_EAPOL),
+	NGBE_PTID_L2_ARP = (NGBE_PTID_PKT_MAC | NGBE_PTID_TYP_ARP),
+
+	NGBE_PTID_L2_IPV4_FRAG = (NGBE_PTID_PKT_IP | NGBE_PTID_TYP_IPFRAG),
+	NGBE_PTID_L2_IPV4 = (NGBE_PTID_PKT_IP | NGBE_PTID_TYP_IPDATA),
+	NGBE_PTID_L2_IPV4_UDP = (NGBE_PTID_PKT_IP | NGBE_PTID_TYP_UDP),
+	NGBE_PTID_L2_IPV4_TCP = (NGBE_PTID_PKT_IP | NGBE_PTID_TYP_TCP),
+	NGBE_PTID_L2_IPV4_SCTP = (NGBE_PTID_PKT_IP | NGBE_PTID_TYP_SCTP),
+	NGBE_PTID_L2_IPV6_FRAG = (NGBE_PTID_PKT_IP | NGBE_PTID_PKT_IPV6 |
+			NGBE_PTID_TYP_IPFRAG),
+	NGBE_PTID_L2_IPV6 = (NGBE_PTID_PKT_IP | NGBE_PTID_PKT_IPV6 |
+			NGBE_PTID_TYP_IPDATA),
+	NGBE_PTID_L2_IPV6_UDP = (NGBE_PTID_PKT_IP | NGBE_PTID_PKT_IPV6 |
+			NGBE_PTID_TYP_UDP),
+	NGBE_PTID_L2_IPV6_TCP = (NGBE_PTID_PKT_IP | NGBE_PTID_PKT_IPV6 |
+			NGBE_PTID_TYP_TCP),
+	NGBE_PTID_L2_IPV6_SCTP = (NGBE_PTID_PKT_IP | NGBE_PTID_PKT_IPV6 |
+			NGBE_PTID_TYP_SCTP),
+
+	NGBE_PTID_L2_TUN4_MAC = (NGBE_PTID_PKT_TUN |
+			NGBE_PTID_TUN_EIGM),
+	NGBE_PTID_L2_TUN6_MAC = (NGBE_PTID_PKT_TUN |
+			NGBE_PTID_TUN_IPV6 | NGBE_PTID_TUN_EIGM),
+};
+
+
+/*
+ * PTYPE(Packet Type, 32bits)
+ * - Bit 3:0 is for L2 types.
+ * - Bit 7:4 is for L3 or outer L3 (for tunneling case) types.
+ * - Bit 11:8 is for L4 or outer L4 (for tunneling case) types.
+ * - Bit 15:12 is for tunnel types.
+ * - Bit 19:16 is for inner L2 types.
+ * - Bit 23:20 is for inner L3 types.
+ * - Bit 27:24 is for inner L4 types.
+ * - Bit 31:28 is reserved.
+ * please ref to rte_mbuf.h: rte_mbuf.packet_type
+ */
+struct rte_ngbe_ptype {
+	u32 l2:4;  /* outer mac */
+	u32 l3:4;  /* outer internet protocol */
+	u32 l4:4;  /* outer transport protocol */
+	u32 tun:4; /* tunnel protocol */
+
+	u32 el2:4; /* inner mac */
+	u32 el3:4; /* inner internet protocol */
+	u32 el4:4; /* inner transport protocol */
+	u32 rsv:3;
+	u32 known:1;
+};
+
+#ifndef RTE_PTYPE_UNKNOWN
+#define RTE_PTYPE_UNKNOWN                   0x00000000
+#define RTE_PTYPE_L2_ETHER                  0x00000001
+#define RTE_PTYPE_L2_ETHER_TIMESYNC         0x00000002
+#define RTE_PTYPE_L2_ETHER_ARP              0x00000003
+#define RTE_PTYPE_L2_ETHER_LLDP             0x00000004
+#define RTE_PTYPE_L2_ETHER_NSH              0x00000005
+#define RTE_PTYPE_L2_ETHER_FCOE             0x00000009
+#define RTE_PTYPE_L3_IPV4                   0x00000010
+#define RTE_PTYPE_L3_IPV4_EXT               0x00000030
+#define RTE_PTYPE_L3_IPV6                   0x00000040
+#define RTE_PTYPE_L3_IPV4_EXT_UNKNOWN       0x00000090
+#define RTE_PTYPE_L3_IPV6_EXT               0x000000c0
+#define RTE_PTYPE_L3_IPV6_EXT_UNKNOWN       0x000000e0
+#define RTE_PTYPE_L4_TCP                    0x00000100
+#define RTE_PTYPE_L4_UDP                    0x00000200
+#define RTE_PTYPE_L4_FRAG                   0x00000300
+#define RTE_PTYPE_L4_SCTP                   0x00000400
+#define RTE_PTYPE_L4_ICMP                   0x00000500
+#define RTE_PTYPE_L4_NONFRAG                0x00000600
+#define RTE_PTYPE_TUNNEL_IP                 0x00001000
+#define RTE_PTYPE_TUNNEL_GRE                0x00002000
+#define RTE_PTYPE_TUNNEL_VXLAN              0x00003000
+#define RTE_PTYPE_TUNNEL_NVGRE              0x00004000
+#define RTE_PTYPE_TUNNEL_GENEVE             0x00005000
+#define RTE_PTYPE_TUNNEL_GRENAT             0x00006000
+#define RTE_PTYPE_INNER_L2_ETHER            0x00010000
+#define RTE_PTYPE_INNER_L2_ETHER_VLAN       0x00020000
+#define RTE_PTYPE_INNER_L3_IPV4             0x00100000
+#define RTE_PTYPE_INNER_L3_IPV4_EXT         0x00200000
+#define RTE_PTYPE_INNER_L3_IPV6             0x00300000
+#define RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN 0x00400000
+#define RTE_PTYPE_INNER_L3_IPV6_EXT         0x00500000
+#define RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN 0x00600000
+#define RTE_PTYPE_INNER_L4_TCP              0x01000000
+#define RTE_PTYPE_INNER_L4_UDP              0x02000000
+#define RTE_PTYPE_INNER_L4_FRAG             0x03000000
+#define RTE_PTYPE_INNER_L4_SCTP             0x04000000
+#define RTE_PTYPE_INNER_L4_ICMP             0x05000000
+#define RTE_PTYPE_INNER_L4_NONFRAG          0x06000000
+#endif /* !RTE_PTYPE_UNKNOWN */
+#define RTE_PTYPE_L3_IPV4u                  RTE_PTYPE_L3_IPV4_EXT_UNKNOWN
+#define RTE_PTYPE_L3_IPV6u                  RTE_PTYPE_L3_IPV6_EXT_UNKNOWN
+#define RTE_PTYPE_INNER_L3_IPV4u            RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN
+#define RTE_PTYPE_INNER_L3_IPV6u            RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN
+#define RTE_PTYPE_L2_ETHER_FIP              RTE_PTYPE_L2_ETHER
+#define RTE_PTYPE_L2_ETHER_CNM              RTE_PTYPE_L2_ETHER
+#define RTE_PTYPE_L2_ETHER_EAPOL            RTE_PTYPE_L2_ETHER
+#define RTE_PTYPE_L2_ETHER_FILTER           RTE_PTYPE_L2_ETHER
+
+u32 *ngbe_get_supported_ptypes(void);
+u32 ngbe_decode_ptype(u8 ptid);
+u8 ngbe_encode_ptype(u32 ptype);
+
+/**
+ * PT(Packet Type, 32bits)
+ * - Bit 3:0 is for L2 types.
+ * - Bit 7:4 is for L3 or outer L3 (for tunneling case) types.
+ * - Bit 11:8 is for L4 or outer L4 (for tunneling case) types.
+ * - Bit 15:12 is for tunnel types.
+ * - Bit 19:16 is for inner L2 types.
+ * - Bit 23:20 is for inner L3 types.
+ * - Bit 27:24 is for inner L4 types.
+ * - Bit 31:28 is reserved.
+ * PT is a more accurate version of PTYPE
+ **/
+#define NGBE_PT_ETHER                   0x00
+#define NGBE_PT_IPV4                    0x01
+#define NGBE_PT_IPV4_TCP                0x11
+#define NGBE_PT_IPV4_UDP                0x21
+#define NGBE_PT_IPV4_SCTP               0x41
+#define NGBE_PT_IPV4_EXT                0x03
+#define NGBE_PT_IPV4_EXT_TCP            0x13
+#define NGBE_PT_IPV4_EXT_UDP            0x23
+#define NGBE_PT_IPV4_EXT_SCTP           0x43
+#define NGBE_PT_IPV6                    0x04
+#define NGBE_PT_IPV6_TCP                0x14
+#define NGBE_PT_IPV6_UDP                0x24
+#define NGBE_PT_IPV6_SCTP               0x44
+#define NGBE_PT_IPV6_EXT                0x0C
+#define NGBE_PT_IPV6_EXT_TCP            0x1C
+#define NGBE_PT_IPV6_EXT_UDP            0x2C
+#define NGBE_PT_IPV6_EXT_SCTP           0x4C
+#define NGBE_PT_IPV4_IPV6               0x05
+#define NGBE_PT_IPV4_IPV6_TCP           0x15
+#define NGBE_PT_IPV4_IPV6_UDP           0x25
+#define NGBE_PT_IPV4_IPV6_SCTP          0x45
+#define NGBE_PT_IPV4_EXT_IPV6           0x07
+#define NGBE_PT_IPV4_EXT_IPV6_TCP       0x17
+#define NGBE_PT_IPV4_EXT_IPV6_UDP       0x27
+#define NGBE_PT_IPV4_EXT_IPV6_SCTP      0x47
+#define NGBE_PT_IPV4_IPV6_EXT           0x0D
+#define NGBE_PT_IPV4_IPV6_EXT_TCP       0x1D
+#define NGBE_PT_IPV4_IPV6_EXT_UDP       0x2D
+#define NGBE_PT_IPV4_IPV6_EXT_SCTP      0x4D
+#define NGBE_PT_IPV4_EXT_IPV6_EXT       0x0F
+#define NGBE_PT_IPV4_EXT_IPV6_EXT_TCP   0x1F
+#define NGBE_PT_IPV4_EXT_IPV6_EXT_UDP   0x2F
+#define NGBE_PT_IPV4_EXT_IPV6_EXT_SCTP  0x4F
+
+#define NGBE_PT_MAX    256
+
+/* ether type filter list: one static filter per filter consumer. This is
+ *                 to avoid filter collisions later. Add new filters
+ *                 here!!
+ *      EAPOL 802.1x (0x888e): Filter 0
+ *      FCoE (0x8906):   Filter 2
+ *      1588 (0x88f7):   Filter 3
+ *      FIP  (0x8914):   Filter 4
+ *      LLDP (0x88CC):   Filter 5
+ *      LACP (0x8809):   Filter 6
+ *      FC   (0x8808):   Filter 7
+ */
+#define NGBE_ETF_ID_EAPOL        0
+#define NGBE_ETF_ID_FCOE         2
+#define NGBE_ETF_ID_1588         3
+#define NGBE_ETF_ID_FIP          4
+#define NGBE_ETF_ID_LLDP         5
+#define NGBE_ETF_ID_LACP         6
+#define NGBE_ETF_ID_FC           7
+#define NGBE_ETF_ID_MAX          8
+
+#define NGBE_PTID_ETF_MIN  0x18
+#define NGBE_PTID_ETF_MAX  0x1F
+static inline int ngbe_etflt_id(u8 ptid)
+{
+	if (ptid >= NGBE_PTID_ETF_MIN && ptid <= NGBE_PTID_ETF_MAX)
+		return ptid - NGBE_PTID_ETF_MIN;
+	else
+		return -1;
+}
+
+#endif /* _NGBE_PTYPE_H_ */
diff --git a/drivers/net/ngbe/ngbe_rxtx.c b/drivers/net/ngbe/ngbe_rxtx.c
index 5c06e0d550..a3ef0f7577 100644
--- a/drivers/net/ngbe/ngbe_rxtx.c
+++ b/drivers/net/ngbe/ngbe_rxtx.c
@@ -253,6 +253,16 @@  ngbe_xmit_pkts_simple(void *tx_queue, struct rte_mbuf **tx_pkts,
  *  Rx functions
  *
  **********************************************************************/
+static inline uint32_t
+ngbe_rxd_pkt_info_to_pkt_type(uint32_t pkt_info, uint16_t ptid_mask)
+{
+	uint16_t ptid = NGBE_RXD_PTID(pkt_info);
+
+	ptid &= ptid_mask;
+
+	return ngbe_decode_ptype(ptid);
+}
+
 uint16_t
 ngbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		uint16_t nb_pkts)
@@ -267,6 +277,7 @@  ngbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 	struct ngbe_rx_desc rxd;
 	uint64_t dma_addr;
 	uint32_t staterr;
+	uint32_t pkt_info;
 	uint16_t pkt_len;
 	uint16_t rx_id;
 	uint16_t nb_rx;
@@ -378,6 +389,10 @@  ngbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		rxm->data_len = pkt_len;
 		rxm->port = rxq->port_id;
 
+		pkt_info = rte_le_to_cpu_32(rxd.qw0.dw0);
+		rxm->packet_type = ngbe_rxd_pkt_info_to_pkt_type(pkt_info,
+						       rxq->pkt_type_mask);
+
 		/*
 		 * Store the mbuf address into the next entry of the array
 		 * of returned packets.
@@ -799,6 +814,7 @@  ngbe_dev_rx_queue_setup(struct rte_eth_dev *dev,
 	rxq->port_id = dev->data->port_id;
 	rxq->drop_en = rx_conf->rx_drop_en;
 	rxq->rx_deferred_start = rx_conf->rx_deferred_start;
+	rxq->pkt_type_mask = NGBE_PTID_MASK;
 
 	/*
 	 * Allocate Rx ring hardware descriptors. A memzone large enough to
diff --git a/drivers/net/ngbe/ngbe_rxtx.h b/drivers/net/ngbe/ngbe_rxtx.h
index a89d59e06b..788d684def 100644
--- a/drivers/net/ngbe/ngbe_rxtx.h
+++ b/drivers/net/ngbe/ngbe_rxtx.h
@@ -238,6 +238,8 @@  struct ngbe_rx_queue {
 	uint16_t        rx_free_thresh; /**< max free Rx desc to hold */
 	uint16_t        queue_id; /**< RX queue index */
 	uint16_t        reg_idx;  /**< RX queue register index */
+	/** Packet type mask for different NICs */
+	uint16_t        pkt_type_mask;
 	uint16_t        port_id;  /**< Device port identifier */
 	uint8_t         drop_en;  /**< If not 0, set SRRCTL.Drop_En */
 	uint8_t         rx_deferred_start; /**< not in global dev start */