net/ngbe: support packet type query

Add packet type macro definition and convert ptype to ptid.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
This commit is contained in:
Jiawen Wu 2021-10-21 17:49:58 +08:00 committed by Ferruh Yigit
parent 599ef84add
commit f6aef1dacf
9 changed files with 531 additions and 0 deletions

View File

@ -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

View File

@ -11,6 +11,7 @@ for Wangxun 1 Gigabit Ethernet NICs.
Features
--------
- Packet type information
- Link state information

View File

@ -215,6 +215,10 @@ New Features
Virtio hash reporting is yet to be added.
* Added power monitor support in virtio PMD.
* **Updated Wangxun ngbe driver.**
* Added packet type on RxTx.
* **Updated Marvell cnxk crypto PMD.**
* Added AES-CBC SHA1-HMAC support in lookaside protocol (IPsec) for CN10K.

View File

@ -12,6 +12,7 @@ objs = [base_objs]
sources = files(
'ngbe_ethdev.c',
'ngbe_ptypes.c',
'ngbe_rxtx.c',
)

View File

@ -662,6 +662,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,
@ -1145,6 +1154,7 @@ static const struct eth_dev_ops ngbe_eth_dev_ops = {
.dev_close = ngbe_dev_close,
.dev_reset = ngbe_dev_reset,
.link_update = ngbe_dev_link_update,
.dev_supported_ptypes_get = ngbe_dev_supported_ptypes_get,
.rx_queue_start = ngbe_dev_rx_queue_start,
.rx_queue_stop = ngbe_dev_rx_queue_stop,
.tx_queue_start = ngbe_dev_tx_queue_start,

View File

@ -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_ */

View File

@ -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;
}

View File

@ -0,0 +1,195 @@
/* 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;
};
#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_ */

View File

@ -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,
NGBE_PTID_MASK);
/*
* Store the mbuf address into the next entry of the array
* of returned packets.