From patchwork Thu Oct 21 09:49:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiawen Wu X-Patchwork-Id: 102543 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A4C1FA0547; Thu, 21 Oct 2021 11:50:35 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6E3B4410E2; Thu, 21 Oct 2021 11:50:35 +0200 (CEST) Received: from smtpbguseast2.qq.com (smtpbguseast2.qq.com [54.204.34.130]) by mails.dpdk.org (Postfix) with ESMTP id D4013410E2 for ; Thu, 21 Oct 2021 11:50:33 +0200 (CEST) X-QQ-mid: bizesmtp38t1634809829tbe4f1o1 Received: from jiawenwu.trustnetic.com (unknown [183.129.236.74]) by esmtp6.qq.com (ESMTP) with id ; Thu, 21 Oct 2021 17:50:28 +0800 (CST) X-QQ-SSF: 01400000000000E0I000000A0000000 X-QQ-FEAT: YSwSv5UBo8gwpJlI4LH53gx1l8KOuJq6zM2RcwcRA47AG3+rzTApTlFtAIbx/ X/7eRYnahDfHNJ5oolawaMdxqA+G4V7VskcSH+DiG2UfMbd9LMG44gRjU1nmg3oQVMozRNp k5Vj3jyTCekiKXZ2wU4IBXyfabpMOONEqDWjmumvIz2Y3QmdVqlraMzNBzy/p/4JR239FyB lTkC89hCn7/aOTqOvZfvryYygJdo5sZiZbdhlvrY+IczARVpoSKRbKk0Ss81WmEMrOdGJIM 8QH6gpCQobcdLFqAEWaN6C3e6SA4w+YFkSLtA+vRErrtSHPuEiPG5zyMTXGDrl3yB0SJBsQ 0cV/Gni/Ct1H5OXMeR1ze4beaMCfXm5odrrerLZkLcxtQ2rEYs= X-QQ-GoodBg: 2 From: Jiawen Wu To: dev@dpdk.org Cc: Jiawen Wu Date: Thu, 21 Oct 2021 17:49:58 +0800 Message-Id: <20211021095023.18288-2-jiawenwu@trustnetic.com> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20211021095023.18288-1-jiawenwu@trustnetic.com> References: <20211021095023.18288-1-jiawenwu@trustnetic.com> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:trustnetic.com:qybgforeign:qybgforeign1 X-QQ-Bgrelay: 1 Subject: [dpdk-dev] [PATCH v2 01/26] net/ngbe: add packet type X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add packet type marco definition and convert ptype to ptid. Signed-off-by: Jiawen Wu --- doc/guides/nics/features/ngbe.ini | 1 + doc/guides/nics/ngbe.rst | 1 + doc/guides/rel_notes/release_21_11.rst | 4 + drivers/net/ngbe/meson.build | 1 + drivers/net/ngbe/ngbe_ethdev.c | 10 + drivers/net/ngbe/ngbe_ethdev.h | 4 + drivers/net/ngbe/ngbe_ptypes.c | 300 +++++++++++++++++++++++++ drivers/net/ngbe/ngbe_ptypes.h | 195 ++++++++++++++++ drivers/net/ngbe/ngbe_rxtx.c | 15 ++ 9 files changed, 531 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 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/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index d5435a64aa..8be52954e0 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -145,6 +145,10 @@ New Features Added support for more comprehensive CRC options. +* **Updated Wangxun ngbe driver.** + + * Added packet type on RxTx. + * **Added multi-process support for testpmd.** Added command-line options to specify total number of processes and 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..fb21603601 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, @@ -1148,6 +1157,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, diff --git a/drivers/net/ngbe/ngbe_ethdev.h b/drivers/net/ngbe/ngbe_ethdev.h index c039e7dcc3..7f4534208e 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 +#include + +#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..16635e3390 --- /dev/null +++ b/drivers/net/ngbe/ngbe_ptypes.h @@ -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_ */ diff --git a/drivers/net/ngbe/ngbe_rxtx.c b/drivers/net/ngbe/ngbe_rxtx.c index d508015bd2..5f63890a45 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, + NGBE_PTID_MASK); + /* * Store the mbuf address into the next entry of the array * of returned packets.