* [PATCH 0/2] support L2TPv2 for AVF RSS hash and FDIR
@ 2022-02-11 2:21 Jie Wang
2022-02-11 2:21 ` [PATCH 1/2] net/iavf: support L2TPv2 for AVF HASH Jie Wang
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Jie Wang @ 2022-02-11 2:21 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Support IAVF L2TPv2(include PPP over L2tpv2) RSS hash and flow
director. Required to distribute packets based on outer MAC src/dst
address and L2TPv2 session ID.
Support IAVF PPPoL2TPv2oUDP flow director. Required to distribute
packets based on inner IP src+dest address and TCP/UDP src+dest port.
Jie Wang (2):
net/iavf: support L2TPv2 for AVF HASH
net/iavf: support L2TPv2 for AVF FDIR
doc/guides/rel_notes/release_22_03.rst | 9 ++
drivers/net/iavf/iavf.h | 2 +
drivers/net/iavf/iavf_fdir.c | 169 +++++++++++++++++++++----
drivers/net/iavf/iavf_generic_flow.c | 34 +++++
drivers/net/iavf/iavf_generic_flow.h | 10 ++
drivers/net/iavf/iavf_hash.c | 81 +++++++++++-
6 files changed, 273 insertions(+), 32 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/2] net/iavf: support L2TPv2 for AVF HASH
2022-02-11 2:21 [PATCH 0/2] support L2TPv2 for AVF RSS hash and FDIR Jie Wang
@ 2022-02-11 2:21 ` Jie Wang
2022-02-11 2:21 ` [PATCH 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
2022-02-11 7:36 ` [PATCH v2 0/2] support L2TPv2 for AVF RSS hash and FDIR Jie Wang
2 siblings, 0 replies; 15+ messages in thread
From: Jie Wang @ 2022-02-11 2:21 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Add support for PPP over L2TPv2 over UDP protocol and L2TPv2
protocol RSS hash based on outer MAC src/dst address and L2TPv2
session ID.
Patterns are listed below:
eth/ipv4/udp/l2tpv2
eth/ipv4/udp/l2tpv2/ppp
eth/ipv6/udp/l2tpv2
eth/ipv6/udp/l2tpv2/ppp
Signed-off-by: Jie Wang <jie1x.wang@intel.com>
---
doc/guides/rel_notes/release_22_03.rst | 5 ++
drivers/net/iavf/iavf.h | 2 +
drivers/net/iavf/iavf_generic_flow.c | 34 +++++++++++
drivers/net/iavf/iavf_generic_flow.h | 6 ++
drivers/net/iavf/iavf_hash.c | 81 ++++++++++++++++++++++++--
5 files changed, 124 insertions(+), 4 deletions(-)
diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst
index 0f1d3adaf2..6ffd4d7749 100644
--- a/doc/guides/rel_notes/release_22_03.rst
+++ b/doc/guides/rel_notes/release_22_03.rst
@@ -89,6 +89,11 @@ New Features
* Added rte_flow support for matching GENEVE packets.
* Added rte_flow support for matching eCPRI packets.
+* **Updated Intel iavf driver.**
+
+ * Added L2TPv2(include PPP over L2TPv2) RSS hash distribute packets
+ based on outer MAC src/dst address and L2TPv2 session ID.
+
* **Updated Marvell cnxk crypto PMD.**
* Added SHA256-HMAC support in lookaside protocol (IPsec) for CN10K.
diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
index 0bb5698583..a01d18e61b 100644
--- a/drivers/net/iavf/iavf.h
+++ b/drivers/net/iavf/iavf.h
@@ -93,6 +93,8 @@
#define IAVF_VLAN_TAG_PCP_OFFSET 13
+#define IAVF_L2TPV2_FLAGS_LEN 0x4000
+
struct iavf_adapter;
struct iavf_rx_queue;
struct iavf_tx_queue;
diff --git a/drivers/net/iavf/iavf_generic_flow.c b/drivers/net/iavf/iavf_generic_flow.c
index 2befa125ac..1de4187e67 100644
--- a/drivers/net/iavf/iavf_generic_flow.c
+++ b/drivers/net/iavf/iavf_generic_flow.c
@@ -1611,6 +1611,40 @@ enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_END,
};
+enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV4,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV4,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_PPP,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV6,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV6,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_PPP,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
/* PPPoL2TPv2oUDP */
enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[] = {
RTE_FLOW_ITEM_TYPE_ETH,
diff --git a/drivers/net/iavf/iavf_generic_flow.h b/drivers/net/iavf/iavf_generic_flow.h
index 3681a96b31..107bbc1a23 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -410,6 +410,12 @@ extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_tcp[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_udp[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_udp[];
+/* L2TPv2 */
+extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp[];
+
/* PPPoL2TPv2oUDP */
extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6[];
diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index 5e0888ea68..f35a07653b 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -36,6 +36,7 @@
#define IAVF_PHINT_MID_IPV6 BIT_ULL(8)
/* L2TPv2 */
#define IAVF_PHINT_L2TPV2 BIT_ULL(9)
+#define IAVF_PHINT_L2TPV2_LEN BIT_ULL(10)
#define IAVF_PHINT_GTPU_MSK (IAVF_PHINT_GTPU | \
IAVF_PHINT_GTPU_EH | \
@@ -167,7 +168,9 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ECPRI_PC_RTC_ID), {BUFF_NOUSED} }
#define proto_hdr_l2tpv2 { \
- VIRTCHNL_PROTO_HDR_L2TPV2, 0, {BUFF_NOUSED} }
+ VIRTCHNL_PROTO_HDR_L2TPV2, \
+ FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_SESS_ID) | \
+ FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_LEN_SESS_ID), {BUFF_NOUSED} }
#define proto_hdr_ppp { \
VIRTCHNL_PROTO_HDR_PPP, 0, {BUFF_NOUSED} }
@@ -392,6 +395,40 @@ struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tcp_tmplt = {
proto_hdr_tcp}
};
+struct virtchnl_proto_hdrs ipv4_l2tpv2_tmplt = {
+ TUNNEL_LEVEL_OUTER, 4,
+ {proto_hdr_eth,
+ proto_hdr_ipv4,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2}
+};
+
+struct virtchnl_proto_hdrs ipv6_l2tpv2_tmplt = {
+ TUNNEL_LEVEL_OUTER, 4,
+ {proto_hdr_eth,
+ proto_hdr_ipv6,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2}
+};
+
+struct virtchnl_proto_hdrs ipv4_l2tpv2_ppp_tmplt = {
+ TUNNEL_LEVEL_OUTER, 5,
+ {proto_hdr_eth,
+ proto_hdr_ipv4,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2,
+ proto_hdr_ppp}
+};
+
+struct virtchnl_proto_hdrs ipv6_l2tpv2_ppp_tmplt = {
+ TUNNEL_LEVEL_OUTER, 5,
+ {proto_hdr_eth,
+ proto_hdr_ipv6,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2,
+ proto_hdr_ppp}
+};
+
/* rss type super set */
/* IPv4 outer */
@@ -480,6 +517,9 @@ struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tcp_tmplt = {
#define IAVF_RSS_TYPE_IPV4_PFCP (RTE_ETH_RSS_PFCP | RTE_ETH_RSS_IPV4)
#define IAVF_RSS_TYPE_IPV6_PFCP (RTE_ETH_RSS_PFCP | RTE_ETH_RSS_IPV6)
+/* L2TPv2 */
+#define IAVF_RSS_TYPE_ETH_L2TPV2 (RTE_ETH_RSS_ETH | RTE_ETH_RSS_L2TPV2)
+
/**
* Supported pattern for hash.
* The first member is pattern item type,
@@ -547,6 +587,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
{iavf_pattern_eth_ipv6_gre_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &inner_ipv4_tcp_tmplt},
{iavf_pattern_eth_ipv4_gre_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &inner_ipv4_udp_tmplt},
{iavf_pattern_eth_ipv6_gre_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &inner_ipv4_udp_tmplt},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv4_l2tpv2_tmplt},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv4_l2tpv2_ppp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4, IAVF_RSS_TYPE_INNER_IPV4, &udp_l2tpv2_ppp_ipv4_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &udp_l2tpv2_ppp_ipv4_udp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &udp_l2tpv2_ppp_ipv4_tcp_tmplt},
@@ -614,6 +656,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
{iavf_pattern_eth_ipv6_gre_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &inner_ipv6_tcp_tmplt},
{iavf_pattern_eth_ipv4_gre_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &inner_ipv6_udp_tmplt},
{iavf_pattern_eth_ipv6_gre_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &inner_ipv6_udp_tmplt},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv6_l2tpv2_tmplt},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv6_l2tpv2_ppp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6, IAVF_RSS_TYPE_INNER_IPV6, &udp_l2tpv2_ppp_ipv6_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &udp_l2tpv2_ppp_ipv6_udp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &udp_l2tpv2_ppp_ipv6_tcp_tmplt},
@@ -744,6 +788,8 @@ iavf_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
const struct rte_flow_item_gtp_psc *psc;
const struct rte_flow_item_ecpri *ecpri;
struct rte_ecpri_common_hdr ecpri_common;
+ const struct rte_flow_item_l2tpv2 *l2tpv2;
+ uint16_t flags_version;
for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
if (item->last) {
@@ -802,7 +848,18 @@ iavf_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
*phint |= IAVF_PHINT_GRE;
break;
case RTE_FLOW_ITEM_TYPE_L2TPV2:
- *phint |= IAVF_PHINT_L2TPV2;
+ l2tpv2 = item->spec;
+
+ if (l2tpv2) {
+ flags_version =
+ rte_be_to_cpu_16(l2tpv2->hdr.common.flags_version);
+ if (flags_version & IAVF_L2TPV2_FLAGS_LEN)
+ *phint |= IAVF_PHINT_L2TPV2_LEN;
+ else
+ *phint |= IAVF_PHINT_L2TPV2;
+ } else {
+ *phint |= IAVF_PHINT_L2TPV2;
+ }
break;
default:
break;
@@ -1024,6 +1081,10 @@ iavf_refine_proto_hdrs_l234(struct virtchnl_proto_hdrs *proto_hdrs,
if (!(rss_type & RTE_ETH_RSS_ECPRI))
hdr->field_selector = 0;
break;
+ case VIRTCHNL_PROTO_HDR_L2TPV2:
+ if (!(rss_type & RTE_ETH_RSS_L2TPV2))
+ hdr->field_selector = 0;
+ break;
default:
break;
}
@@ -1130,10 +1191,10 @@ static void
iavf_refine_proto_hdrs_l2tpv2(struct virtchnl_proto_hdrs *proto_hdrs,
uint64_t phint)
{
- struct virtchnl_proto_hdr *hdr1;
+ struct virtchnl_proto_hdr *hdr, *hdr1;
int i;
- if (!(phint & IAVF_PHINT_L2TPV2))
+ if (!(phint & IAVF_PHINT_L2TPV2) && !(phint & IAVF_PHINT_L2TPV2_LEN))
return;
if (proto_hdrs->tunnel_level == TUNNEL_LEVEL_INNER) {
@@ -1150,7 +1211,19 @@ iavf_refine_proto_hdrs_l2tpv2(struct virtchnl_proto_hdrs *proto_hdrs,
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4);
else if (phint & IAVF_PHINT_OUTER_IPV6)
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV6);
+ } else {
+ for (i = 0; i < proto_hdrs->count; i++) {
+ hdr = &proto_hdrs->proto_hdr[i];
+ if (hdr->type == VIRTCHNL_PROTO_HDR_L2TPV2) {
+ if (phint & IAVF_PHINT_L2TPV2) {
+ REFINE_PROTO_FLD(DEL, L2TPV2_LEN_SESS_ID);
+ } else if (phint & IAVF_PHINT_L2TPV2_LEN) {
+ REFINE_PROTO_FLD(DEL, L2TPV2_SESS_ID);
+ }
+ }
+ }
}
+
}
static void iavf_refine_proto_hdrs(struct virtchnl_proto_hdrs *proto_hdrs,
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/2] net/iavf: support L2TPv2 for AVF FDIR
2022-02-11 2:21 [PATCH 0/2] support L2TPv2 for AVF RSS hash and FDIR Jie Wang
2022-02-11 2:21 ` [PATCH 1/2] net/iavf: support L2TPv2 for AVF HASH Jie Wang
@ 2022-02-11 2:21 ` Jie Wang
2022-02-11 7:36 ` [PATCH v2 0/2] support L2TPv2 for AVF RSS hash and FDIR Jie Wang
2 siblings, 0 replies; 15+ messages in thread
From: Jie Wang @ 2022-02-11 2:21 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Add support for L2TPv2(include PPP over L2TPv2) protocols FDIR
based on outer MAC src/dst address and L2TPv2 session ID.
Add support for PPPoL2TPv2oUDP protocols FDIR based on inner IP
src/dst address and UDP/TCP src/dst port.
Patterns are listed below:
eth/ipv4(6)/udp/l2tpv2
eth/ipv4(6)/udp/l2tpv2/ppp
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)/udp
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)/tcp
Signed-off-by: Jie Wang <jie1x.wang@intel.com>
---
doc/guides/rel_notes/release_22_03.rst | 4 +
drivers/net/iavf/iavf_fdir.c | 169 +++++++++++++++++++++----
drivers/net/iavf/iavf_generic_flow.h | 4 +
3 files changed, 149 insertions(+), 28 deletions(-)
diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst
index 6ffd4d7749..c4707d94fb 100644
--- a/doc/guides/rel_notes/release_22_03.rst
+++ b/doc/guides/rel_notes/release_22_03.rst
@@ -93,6 +93,10 @@ New Features
* Added L2TPv2(include PPP over L2TPv2) RSS hash distribute packets
based on outer MAC src/dst address and L2TPv2 session ID.
+ * Added L2TPv2(include PPP over L2TPv2) FDIR distribute packets
+ based on outer MAC src/dst address and L2TPv2 session ID.
+ * Added PPPoL2TPv2oUDP FDIR distribute packets based on inner IP
+ src/dst address and UDP/TCP src/dst port.
* **Updated Marvell cnxk crypto PMD.**
diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index b63aaca91d..e9a3566c0d 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -168,6 +168,31 @@
IAVF_FDIR_INSET_GRE_IPV6 | IAVF_INSET_TUN_UDP_SRC_PORT | \
IAVF_INSET_TUN_UDP_DST_PORT)
+#define IAVF_FDIR_INSET_L2TPV2 (\
+ IAVF_INSET_SMAC | IAVF_INSET_DMAC | IAVF_INSET_L2TPV2)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 (\
+ IAVF_INSET_TUN_IPV4_SRC | IAVF_INSET_TUN_IPV4_DST)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 | IAVF_INSET_TUN_UDP_SRC_PORT | \
+ IAVF_INSET_TUN_UDP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 | IAVF_INSET_TUN_TCP_SRC_PORT | \
+ IAVF_INSET_TUN_TCP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 (\
+ IAVF_INSET_TUN_IPV6_SRC | IAVF_INSET_TUN_IPV6_DST)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 | IAVF_INSET_TUN_UDP_SRC_PORT | \
+ IAVF_INSET_TUN_UDP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 | IAVF_INSET_TUN_TCP_SRC_PORT | \
+ IAVF_INSET_TUN_TCP_DST_PORT)
+
static struct iavf_pattern_match_item iavf_fdir_pattern[] = {
{iavf_pattern_ethertype, IAVF_FDIR_INSET_ETH, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4, IAVF_FDIR_INSET_ETH_IPV4, IAVF_INSET_NONE},
@@ -275,6 +300,23 @@ static struct iavf_pattern_match_item iavf_fdir_pattern[] = {
{iavf_pattern_eth_ipv6_gre_ipv6, IAVF_FDIR_INSET_GRE_IPV6, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_gre_ipv6_tcp, IAVF_FDIR_INSET_GRE_IPV6_TCP, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_gre_ipv6_udp, IAVF_FDIR_INSET_GRE_IPV6_UDP, IAVF_INSET_NONE},
+
+ {iavf_pattern_eth_ipv4_udp_l2tpv2, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP, IAVF_INSET_NONE},
};
static struct iavf_flow_parser iavf_fdir_parser;
@@ -694,6 +736,8 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
const struct rte_flow_item_pfcp *pfcp_spec, *pfcp_mask;
const struct rte_flow_item_ecpri *ecpri_spec, *ecpri_mask;
const struct rte_flow_item_gre *gre_spec, *gre_mask;
+ const struct rte_flow_item_l2tpv2 *l2tpv2_spec, *l2tpv2_mask;
+ const struct rte_flow_item_ppp *ppp_spec, *ppp_mask;
const struct rte_flow_item *item = pattern;
struct virtchnl_proto_hdr *hdr, *hdr1 = NULL;
struct rte_ecpri_common_hdr ecpri_common;
@@ -701,7 +745,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
enum rte_flow_item_type item_type;
enum rte_flow_item_type next_type;
uint8_t tun_inner = 0;
- uint16_t ether_type;
+ uint16_t ether_type, flags_version;
int layer = 0;
uint8_t ipv6_addr_mask[16] = {
@@ -739,37 +783,41 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
}
if (eth_spec && eth_mask) {
- if (!rte_is_zero_ether_addr(ð_mask->src) ||
- !rte_is_zero_ether_addr(ð_mask->dst)) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM, item,
- "Invalid MAC_addr mask.");
- return -rte_errno;
+ if (!rte_is_zero_ether_addr(ð_mask->dst)) {
+ input_set |= IAVF_INSET_DMAC;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1,
+ ETH,
+ DST);
+ } else if (!rte_is_zero_ether_addr(ð_mask->src)) {
+ input_set |= IAVF_INSET_SMAC;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1,
+ ETH,
+ SRC);
}
- }
- if (eth_spec && eth_mask && eth_mask->type) {
- if (eth_mask->type != RTE_BE16(0xffff)) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM,
- item, "Invalid type mask.");
- return -rte_errno;
+ if (eth_mask->type) {
+ if (eth_mask->type != RTE_BE16(0xffff)) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item, "Invalid type mask.");
+ return -rte_errno;
+ }
+
+ ether_type = rte_be_to_cpu_16(eth_spec->type);
+ if (ether_type == RTE_ETHER_TYPE_IPV4 ||
+ ether_type == RTE_ETHER_TYPE_IPV6) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "Unsupported ether_type.");
+ return -rte_errno;
+ }
+
+ input_set |= IAVF_INSET_ETHERTYPE;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1, ETH,
+ ETHERTYPE);
}
- ether_type = rte_be_to_cpu_16(eth_spec->type);
- if (ether_type == RTE_ETHER_TYPE_IPV4 ||
- ether_type == RTE_ETHER_TYPE_IPV6) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM,
- item,
- "Unsupported ether_type.");
- return -rte_errno;
- }
-
- input_set |= IAVF_INSET_ETHERTYPE;
- VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1, ETH,
- ETHERTYPE);
-
rte_memcpy(hdr1->buffer, eth_spec,
sizeof(struct rte_ether_hdr));
}
@@ -1319,6 +1367,71 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
hdrs->count = ++layer;
break;
+ case RTE_FLOW_ITEM_TYPE_L2TPV2:
+ l2tpv2_spec = item->spec;
+ l2tpv2_mask = item->mask;
+
+ hdr = &hdrs->proto_hdr[layer];
+
+ VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, L2TPV2);
+
+ if (l2tpv2_spec && l2tpv2_mask) {
+ flags_version =
+ rte_be_to_cpu_16(l2tpv2_spec->hdr.common.flags_version);
+ if ((flags_version == RTE_L2TPV2_MSG_TYPE_CONTROL &&
+ l2tpv2_mask->hdr.type3.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA &&
+ l2tpv2_mask->hdr.type7.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L &&
+ l2tpv2_mask->hdr.type6.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_S &&
+ l2tpv2_mask->hdr.type5.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_O &&
+ l2tpv2_mask->hdr.type4.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_S &&
+ l2tpv2_mask->hdr.type3.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_O &&
+ l2tpv2_mask->hdr.type2.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_S_O &&
+ l2tpv2_mask->hdr.type1.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_S_O &&
+ l2tpv2_mask->hdr.type0.session_id == UINT16_MAX)) {
+ input_set |= IAVF_L2TPV2_SESSION_ID;
+ if (flags_version & IAVF_L2TPV2_FLAGS_LEN)
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr,
+ L2TPV2,
+ LEN_SESS_ID);
+ else
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr,
+ L2TPV2,
+ SESS_ID);
+ }
+
+ rte_memcpy(hdr->buffer, l2tpv2_spec,
+ sizeof(*l2tpv2_spec));
+ }
+
+ tun_inner = 1;
+
+ hdrs->count = ++layer;
+ break;
+
+ case RTE_FLOW_ITEM_TYPE_PPP:
+ ppp_spec = item->spec;
+ ppp_mask = item->mask;
+
+ hdr = &hdrs->proto_hdr[layer];
+
+ VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, PPP);
+
+ if (ppp_spec && ppp_mask) {
+ rte_memcpy(hdr->buffer, ppp_spec,
+ sizeof(*ppp_spec));
+ }
+
+ hdrs->count = ++layer;
+ break;
+
case RTE_FLOW_ITEM_TYPE_VOID:
break;
diff --git a/drivers/net/iavf/iavf_generic_flow.h b/drivers/net/iavf/iavf_generic_flow.h
index 107bbc1a23..f6af176073 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -35,6 +35,7 @@
#define IAVF_PROT_L2TPV3OIP (1ULL << 24)
#define IAVF_PROT_PFCP (1ULL << 25)
#define IAVF_PROT_ECPRI (1ULL << 26)
+#define IAVF_PROT_L2TPV2 (1ULL << 27)
/* field */
@@ -62,6 +63,7 @@
#define IAVF_PFCP_SEID (1ULL << 43)
#define IAVF_ECPRI_PC_RTC_ID (1ULL << 42)
#define IAVF_IP_PKID (1ULL << 41)
+#define IAVF_L2TPV2_SESSION_ID (1ULL << 40)
/* input set */
@@ -175,6 +177,8 @@
(IAVF_PROT_PFCP | IAVF_PFCP_S_FIELD | IAVF_PFCP_SEID)
#define IAVF_INSET_ECPRI \
(IAVF_PROT_ECPRI | IAVF_ECPRI_PC_RTC_ID)
+#define IAVF_INSET_L2TPV2 \
+ (IAVF_PROT_L2TPV2 | IAVF_L2TPV2_SESSION_ID)
/* empty pattern */
extern enum rte_flow_item_type iavf_pattern_empty[];
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 0/2] support L2TPv2 for AVF RSS hash and FDIR
2022-02-11 2:21 [PATCH 0/2] support L2TPv2 for AVF RSS hash and FDIR Jie Wang
2022-02-11 2:21 ` [PATCH 1/2] net/iavf: support L2TPv2 for AVF HASH Jie Wang
2022-02-11 2:21 ` [PATCH 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
@ 2022-02-11 7:36 ` Jie Wang
2022-02-11 7:36 ` [PATCH v2 1/2] net/iavf: support L2TPv2 for AVF HASH Jie Wang
` (2 more replies)
2 siblings, 3 replies; 15+ messages in thread
From: Jie Wang @ 2022-02-11 7:36 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Support IAVF L2TPv2(include PPP over L2tpv2) RSS hash and flow
director. Required to distribute packets based on outer MAC src/dst
address and L2TPv2 session ID.
Support IAVF PPPoL2TPv2oUDP flow director. Required to distribute
packets based on inner IP src+dest address and TCP/UDP src+dest port.
---
v2: upadte release notes.
Jie Wang (2):
net/iavf: support L2TPv2 for AVF HASH
net/iavf: support L2TPv2 for AVF FDIR
doc/guides/rel_notes/release_22_03.rst | 9 ++
doc/guides/rel_notes/release_22_03.rst.rej | 12 ++
drivers/net/iavf/iavf.h | 2 +
drivers/net/iavf/iavf_fdir.c | 169 +++++++++++++++++----
drivers/net/iavf/iavf_generic_flow.c | 34 +++++
drivers/net/iavf/iavf_generic_flow.h | 10 ++
drivers/net/iavf/iavf_hash.c | 81 +++++++++-
7 files changed, 285 insertions(+), 32 deletions(-)
create mode 100644 doc/guides/rel_notes/release_22_03.rst.rej
--
2.25.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 1/2] net/iavf: support L2TPv2 for AVF HASH
2022-02-11 7:36 ` [PATCH v2 0/2] support L2TPv2 for AVF RSS hash and FDIR Jie Wang
@ 2022-02-11 7:36 ` Jie Wang
2022-02-11 7:36 ` [PATCH v2 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
2022-02-11 8:09 ` [PATCH v3 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
2 siblings, 0 replies; 15+ messages in thread
From: Jie Wang @ 2022-02-11 7:36 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Add support for PPP over L2TPv2 over UDP protocol and L2TPv2
protocol RSS hash based on outer MAC src/dst address and L2TPv2
session ID.
Patterns are listed below:
eth/ipv4/udp/l2tpv2
eth/ipv4/udp/l2tpv2/ppp
eth/ipv6/udp/l2tpv2
eth/ipv6/udp/l2tpv2/ppp
Signed-off-by: Jie Wang <jie1x.wang@intel.com>
---
doc/guides/rel_notes/release_22_03.rst | 5 ++
drivers/net/iavf/iavf.h | 2 +
drivers/net/iavf/iavf_generic_flow.c | 34 +++++++++++
drivers/net/iavf/iavf_generic_flow.h | 6 ++
drivers/net/iavf/iavf_hash.c | 81 ++++++++++++++++++++++++--
5 files changed, 124 insertions(+), 4 deletions(-)
diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst
index 0f1d3adaf2..b3a01699d8 100644
--- a/doc/guides/rel_notes/release_22_03.rst
+++ b/doc/guides/rel_notes/release_22_03.rst
@@ -89,6 +89,11 @@ New Features
* Added rte_flow support for matching GENEVE packets.
* Added rte_flow support for matching eCPRI packets.
+* **Updated Intel iavf driver.**
+
+ * Added L2TPv2(include PPP over L2TPv2) RSS support based on outer
+ src/dst MAC address and L2TPv2 session ID.
+
* **Updated Marvell cnxk crypto PMD.**
* Added SHA256-HMAC support in lookaside protocol (IPsec) for CN10K.
diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
index 0bb5698583..a01d18e61b 100644
--- a/drivers/net/iavf/iavf.h
+++ b/drivers/net/iavf/iavf.h
@@ -93,6 +93,8 @@
#define IAVF_VLAN_TAG_PCP_OFFSET 13
+#define IAVF_L2TPV2_FLAGS_LEN 0x4000
+
struct iavf_adapter;
struct iavf_rx_queue;
struct iavf_tx_queue;
diff --git a/drivers/net/iavf/iavf_generic_flow.c b/drivers/net/iavf/iavf_generic_flow.c
index 2befa125ac..1de4187e67 100644
--- a/drivers/net/iavf/iavf_generic_flow.c
+++ b/drivers/net/iavf/iavf_generic_flow.c
@@ -1611,6 +1611,40 @@ enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_END,
};
+enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV4,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV4,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_PPP,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV6,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV6,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_PPP,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
/* PPPoL2TPv2oUDP */
enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[] = {
RTE_FLOW_ITEM_TYPE_ETH,
diff --git a/drivers/net/iavf/iavf_generic_flow.h b/drivers/net/iavf/iavf_generic_flow.h
index 3681a96b31..107bbc1a23 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -410,6 +410,12 @@ extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_tcp[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_udp[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_udp[];
+/* L2TPv2 */
+extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp[];
+
/* PPPoL2TPv2oUDP */
extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6[];
diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index 5e0888ea68..f35a07653b 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -36,6 +36,7 @@
#define IAVF_PHINT_MID_IPV6 BIT_ULL(8)
/* L2TPv2 */
#define IAVF_PHINT_L2TPV2 BIT_ULL(9)
+#define IAVF_PHINT_L2TPV2_LEN BIT_ULL(10)
#define IAVF_PHINT_GTPU_MSK (IAVF_PHINT_GTPU | \
IAVF_PHINT_GTPU_EH | \
@@ -167,7 +168,9 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ECPRI_PC_RTC_ID), {BUFF_NOUSED} }
#define proto_hdr_l2tpv2 { \
- VIRTCHNL_PROTO_HDR_L2TPV2, 0, {BUFF_NOUSED} }
+ VIRTCHNL_PROTO_HDR_L2TPV2, \
+ FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_SESS_ID) | \
+ FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_LEN_SESS_ID), {BUFF_NOUSED} }
#define proto_hdr_ppp { \
VIRTCHNL_PROTO_HDR_PPP, 0, {BUFF_NOUSED} }
@@ -392,6 +395,40 @@ struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tcp_tmplt = {
proto_hdr_tcp}
};
+struct virtchnl_proto_hdrs ipv4_l2tpv2_tmplt = {
+ TUNNEL_LEVEL_OUTER, 4,
+ {proto_hdr_eth,
+ proto_hdr_ipv4,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2}
+};
+
+struct virtchnl_proto_hdrs ipv6_l2tpv2_tmplt = {
+ TUNNEL_LEVEL_OUTER, 4,
+ {proto_hdr_eth,
+ proto_hdr_ipv6,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2}
+};
+
+struct virtchnl_proto_hdrs ipv4_l2tpv2_ppp_tmplt = {
+ TUNNEL_LEVEL_OUTER, 5,
+ {proto_hdr_eth,
+ proto_hdr_ipv4,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2,
+ proto_hdr_ppp}
+};
+
+struct virtchnl_proto_hdrs ipv6_l2tpv2_ppp_tmplt = {
+ TUNNEL_LEVEL_OUTER, 5,
+ {proto_hdr_eth,
+ proto_hdr_ipv6,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2,
+ proto_hdr_ppp}
+};
+
/* rss type super set */
/* IPv4 outer */
@@ -480,6 +517,9 @@ struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tcp_tmplt = {
#define IAVF_RSS_TYPE_IPV4_PFCP (RTE_ETH_RSS_PFCP | RTE_ETH_RSS_IPV4)
#define IAVF_RSS_TYPE_IPV6_PFCP (RTE_ETH_RSS_PFCP | RTE_ETH_RSS_IPV6)
+/* L2TPv2 */
+#define IAVF_RSS_TYPE_ETH_L2TPV2 (RTE_ETH_RSS_ETH | RTE_ETH_RSS_L2TPV2)
+
/**
* Supported pattern for hash.
* The first member is pattern item type,
@@ -547,6 +587,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
{iavf_pattern_eth_ipv6_gre_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &inner_ipv4_tcp_tmplt},
{iavf_pattern_eth_ipv4_gre_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &inner_ipv4_udp_tmplt},
{iavf_pattern_eth_ipv6_gre_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &inner_ipv4_udp_tmplt},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv4_l2tpv2_tmplt},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv4_l2tpv2_ppp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4, IAVF_RSS_TYPE_INNER_IPV4, &udp_l2tpv2_ppp_ipv4_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &udp_l2tpv2_ppp_ipv4_udp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &udp_l2tpv2_ppp_ipv4_tcp_tmplt},
@@ -614,6 +656,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
{iavf_pattern_eth_ipv6_gre_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &inner_ipv6_tcp_tmplt},
{iavf_pattern_eth_ipv4_gre_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &inner_ipv6_udp_tmplt},
{iavf_pattern_eth_ipv6_gre_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &inner_ipv6_udp_tmplt},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv6_l2tpv2_tmplt},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv6_l2tpv2_ppp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6, IAVF_RSS_TYPE_INNER_IPV6, &udp_l2tpv2_ppp_ipv6_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &udp_l2tpv2_ppp_ipv6_udp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &udp_l2tpv2_ppp_ipv6_tcp_tmplt},
@@ -744,6 +788,8 @@ iavf_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
const struct rte_flow_item_gtp_psc *psc;
const struct rte_flow_item_ecpri *ecpri;
struct rte_ecpri_common_hdr ecpri_common;
+ const struct rte_flow_item_l2tpv2 *l2tpv2;
+ uint16_t flags_version;
for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
if (item->last) {
@@ -802,7 +848,18 @@ iavf_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
*phint |= IAVF_PHINT_GRE;
break;
case RTE_FLOW_ITEM_TYPE_L2TPV2:
- *phint |= IAVF_PHINT_L2TPV2;
+ l2tpv2 = item->spec;
+
+ if (l2tpv2) {
+ flags_version =
+ rte_be_to_cpu_16(l2tpv2->hdr.common.flags_version);
+ if (flags_version & IAVF_L2TPV2_FLAGS_LEN)
+ *phint |= IAVF_PHINT_L2TPV2_LEN;
+ else
+ *phint |= IAVF_PHINT_L2TPV2;
+ } else {
+ *phint |= IAVF_PHINT_L2TPV2;
+ }
break;
default:
break;
@@ -1024,6 +1081,10 @@ iavf_refine_proto_hdrs_l234(struct virtchnl_proto_hdrs *proto_hdrs,
if (!(rss_type & RTE_ETH_RSS_ECPRI))
hdr->field_selector = 0;
break;
+ case VIRTCHNL_PROTO_HDR_L2TPV2:
+ if (!(rss_type & RTE_ETH_RSS_L2TPV2))
+ hdr->field_selector = 0;
+ break;
default:
break;
}
@@ -1130,10 +1191,10 @@ static void
iavf_refine_proto_hdrs_l2tpv2(struct virtchnl_proto_hdrs *proto_hdrs,
uint64_t phint)
{
- struct virtchnl_proto_hdr *hdr1;
+ struct virtchnl_proto_hdr *hdr, *hdr1;
int i;
- if (!(phint & IAVF_PHINT_L2TPV2))
+ if (!(phint & IAVF_PHINT_L2TPV2) && !(phint & IAVF_PHINT_L2TPV2_LEN))
return;
if (proto_hdrs->tunnel_level == TUNNEL_LEVEL_INNER) {
@@ -1150,7 +1211,19 @@ iavf_refine_proto_hdrs_l2tpv2(struct virtchnl_proto_hdrs *proto_hdrs,
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4);
else if (phint & IAVF_PHINT_OUTER_IPV6)
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV6);
+ } else {
+ for (i = 0; i < proto_hdrs->count; i++) {
+ hdr = &proto_hdrs->proto_hdr[i];
+ if (hdr->type == VIRTCHNL_PROTO_HDR_L2TPV2) {
+ if (phint & IAVF_PHINT_L2TPV2) {
+ REFINE_PROTO_FLD(DEL, L2TPV2_LEN_SESS_ID);
+ } else if (phint & IAVF_PHINT_L2TPV2_LEN) {
+ REFINE_PROTO_FLD(DEL, L2TPV2_SESS_ID);
+ }
+ }
+ }
}
+
}
static void iavf_refine_proto_hdrs(struct virtchnl_proto_hdrs *proto_hdrs,
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 2/2] net/iavf: support L2TPv2 for AVF FDIR
2022-02-11 7:36 ` [PATCH v2 0/2] support L2TPv2 for AVF RSS hash and FDIR Jie Wang
2022-02-11 7:36 ` [PATCH v2 1/2] net/iavf: support L2TPv2 for AVF HASH Jie Wang
@ 2022-02-11 7:36 ` Jie Wang
2022-02-11 8:09 ` [PATCH v3 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
2 siblings, 0 replies; 15+ messages in thread
From: Jie Wang @ 2022-02-11 7:36 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Add support for L2TPv2(include PPP over L2TPv2) protocols FDIR
based on outer MAC src/dst address and L2TPv2 session ID.
Add support for PPPoL2TPv2oUDP protocols FDIR based on inner IP
src/dst address and UDP/TCP src/dst port.
Patterns are listed below:
eth/ipv4(6)/udp/l2tpv2
eth/ipv4(6)/udp/l2tpv2/ppp
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)/udp
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)/tcp
Signed-off-by: Jie Wang <jie1x.wang@intel.com>
---
doc/guides/rel_notes/release_22_03.rst | 4 +
doc/guides/rel_notes/release_22_03.rst.rej | 12 ++
drivers/net/iavf/iavf_fdir.c | 169 +++++++++++++++++----
drivers/net/iavf/iavf_generic_flow.h | 4 +
4 files changed, 161 insertions(+), 28 deletions(-)
create mode 100644 doc/guides/rel_notes/release_22_03.rst.rej
diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst
index b3a01699d8..ef8acb2f0b 100644
--- a/doc/guides/rel_notes/release_22_03.rst
+++ b/doc/guides/rel_notes/release_22_03.rst
@@ -93,6 +93,10 @@ New Features
* Added L2TPv2(include PPP over L2TPv2) RSS support based on outer
src/dst MAC address and L2TPv2 session ID.
+ * Added L2TPv2(include PPP over L2TPv2) FDIR support based on outer
+ src/dst MAC address and L2TPv2 session ID.
+ * Added PPPoL2TPv2oUDP FDIR distribute packets based on inner IP
+ src/dst address and UDP/TCP src/dst port.
* **Updated Marvell cnxk crypto PMD.**
diff --git a/doc/guides/rel_notes/release_22_03.rst.rej b/doc/guides/rel_notes/release_22_03.rst.rej
new file mode 100644
index 0000000000..bdb9ed5991
--- /dev/null
+++ b/doc/guides/rel_notes/release_22_03.rst.rej
@@ -0,0 +1,12 @@
+diff a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst (rejected hunks)
+@@ -93,6 +93,10 @@ New Features
+
+ * Added L2TPv2(include PPP over L2TPv2) RSS hash distribute packets
+ based on outer MAC src/dst address and L2TPv2 session ID.
++ * Added L2TPv2(include PPP over L2TPv2) FDIR distribute packets
++ based on outer MAC src/dst address and L2TPv2 session ID.
++ * Added PPPoL2TPv2oUDP FDIR distribute packets based on inner IP
++ src/dst address and UDP/TCP src/dst port.
+
+ * **Updated Marvell cnxk crypto PMD.**
+
diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index b63aaca91d..e9a3566c0d 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -168,6 +168,31 @@
IAVF_FDIR_INSET_GRE_IPV6 | IAVF_INSET_TUN_UDP_SRC_PORT | \
IAVF_INSET_TUN_UDP_DST_PORT)
+#define IAVF_FDIR_INSET_L2TPV2 (\
+ IAVF_INSET_SMAC | IAVF_INSET_DMAC | IAVF_INSET_L2TPV2)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 (\
+ IAVF_INSET_TUN_IPV4_SRC | IAVF_INSET_TUN_IPV4_DST)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 | IAVF_INSET_TUN_UDP_SRC_PORT | \
+ IAVF_INSET_TUN_UDP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 | IAVF_INSET_TUN_TCP_SRC_PORT | \
+ IAVF_INSET_TUN_TCP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 (\
+ IAVF_INSET_TUN_IPV6_SRC | IAVF_INSET_TUN_IPV6_DST)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 | IAVF_INSET_TUN_UDP_SRC_PORT | \
+ IAVF_INSET_TUN_UDP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 | IAVF_INSET_TUN_TCP_SRC_PORT | \
+ IAVF_INSET_TUN_TCP_DST_PORT)
+
static struct iavf_pattern_match_item iavf_fdir_pattern[] = {
{iavf_pattern_ethertype, IAVF_FDIR_INSET_ETH, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4, IAVF_FDIR_INSET_ETH_IPV4, IAVF_INSET_NONE},
@@ -275,6 +300,23 @@ static struct iavf_pattern_match_item iavf_fdir_pattern[] = {
{iavf_pattern_eth_ipv6_gre_ipv6, IAVF_FDIR_INSET_GRE_IPV6, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_gre_ipv6_tcp, IAVF_FDIR_INSET_GRE_IPV6_TCP, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_gre_ipv6_udp, IAVF_FDIR_INSET_GRE_IPV6_UDP, IAVF_INSET_NONE},
+
+ {iavf_pattern_eth_ipv4_udp_l2tpv2, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP, IAVF_INSET_NONE},
};
static struct iavf_flow_parser iavf_fdir_parser;
@@ -694,6 +736,8 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
const struct rte_flow_item_pfcp *pfcp_spec, *pfcp_mask;
const struct rte_flow_item_ecpri *ecpri_spec, *ecpri_mask;
const struct rte_flow_item_gre *gre_spec, *gre_mask;
+ const struct rte_flow_item_l2tpv2 *l2tpv2_spec, *l2tpv2_mask;
+ const struct rte_flow_item_ppp *ppp_spec, *ppp_mask;
const struct rte_flow_item *item = pattern;
struct virtchnl_proto_hdr *hdr, *hdr1 = NULL;
struct rte_ecpri_common_hdr ecpri_common;
@@ -701,7 +745,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
enum rte_flow_item_type item_type;
enum rte_flow_item_type next_type;
uint8_t tun_inner = 0;
- uint16_t ether_type;
+ uint16_t ether_type, flags_version;
int layer = 0;
uint8_t ipv6_addr_mask[16] = {
@@ -739,37 +783,41 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
}
if (eth_spec && eth_mask) {
- if (!rte_is_zero_ether_addr(ð_mask->src) ||
- !rte_is_zero_ether_addr(ð_mask->dst)) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM, item,
- "Invalid MAC_addr mask.");
- return -rte_errno;
+ if (!rte_is_zero_ether_addr(ð_mask->dst)) {
+ input_set |= IAVF_INSET_DMAC;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1,
+ ETH,
+ DST);
+ } else if (!rte_is_zero_ether_addr(ð_mask->src)) {
+ input_set |= IAVF_INSET_SMAC;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1,
+ ETH,
+ SRC);
}
- }
- if (eth_spec && eth_mask && eth_mask->type) {
- if (eth_mask->type != RTE_BE16(0xffff)) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM,
- item, "Invalid type mask.");
- return -rte_errno;
+ if (eth_mask->type) {
+ if (eth_mask->type != RTE_BE16(0xffff)) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item, "Invalid type mask.");
+ return -rte_errno;
+ }
+
+ ether_type = rte_be_to_cpu_16(eth_spec->type);
+ if (ether_type == RTE_ETHER_TYPE_IPV4 ||
+ ether_type == RTE_ETHER_TYPE_IPV6) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "Unsupported ether_type.");
+ return -rte_errno;
+ }
+
+ input_set |= IAVF_INSET_ETHERTYPE;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1, ETH,
+ ETHERTYPE);
}
- ether_type = rte_be_to_cpu_16(eth_spec->type);
- if (ether_type == RTE_ETHER_TYPE_IPV4 ||
- ether_type == RTE_ETHER_TYPE_IPV6) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM,
- item,
- "Unsupported ether_type.");
- return -rte_errno;
- }
-
- input_set |= IAVF_INSET_ETHERTYPE;
- VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1, ETH,
- ETHERTYPE);
-
rte_memcpy(hdr1->buffer, eth_spec,
sizeof(struct rte_ether_hdr));
}
@@ -1319,6 +1367,71 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
hdrs->count = ++layer;
break;
+ case RTE_FLOW_ITEM_TYPE_L2TPV2:
+ l2tpv2_spec = item->spec;
+ l2tpv2_mask = item->mask;
+
+ hdr = &hdrs->proto_hdr[layer];
+
+ VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, L2TPV2);
+
+ if (l2tpv2_spec && l2tpv2_mask) {
+ flags_version =
+ rte_be_to_cpu_16(l2tpv2_spec->hdr.common.flags_version);
+ if ((flags_version == RTE_L2TPV2_MSG_TYPE_CONTROL &&
+ l2tpv2_mask->hdr.type3.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA &&
+ l2tpv2_mask->hdr.type7.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L &&
+ l2tpv2_mask->hdr.type6.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_S &&
+ l2tpv2_mask->hdr.type5.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_O &&
+ l2tpv2_mask->hdr.type4.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_S &&
+ l2tpv2_mask->hdr.type3.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_O &&
+ l2tpv2_mask->hdr.type2.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_S_O &&
+ l2tpv2_mask->hdr.type1.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_S_O &&
+ l2tpv2_mask->hdr.type0.session_id == UINT16_MAX)) {
+ input_set |= IAVF_L2TPV2_SESSION_ID;
+ if (flags_version & IAVF_L2TPV2_FLAGS_LEN)
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr,
+ L2TPV2,
+ LEN_SESS_ID);
+ else
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr,
+ L2TPV2,
+ SESS_ID);
+ }
+
+ rte_memcpy(hdr->buffer, l2tpv2_spec,
+ sizeof(*l2tpv2_spec));
+ }
+
+ tun_inner = 1;
+
+ hdrs->count = ++layer;
+ break;
+
+ case RTE_FLOW_ITEM_TYPE_PPP:
+ ppp_spec = item->spec;
+ ppp_mask = item->mask;
+
+ hdr = &hdrs->proto_hdr[layer];
+
+ VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, PPP);
+
+ if (ppp_spec && ppp_mask) {
+ rte_memcpy(hdr->buffer, ppp_spec,
+ sizeof(*ppp_spec));
+ }
+
+ hdrs->count = ++layer;
+ break;
+
case RTE_FLOW_ITEM_TYPE_VOID:
break;
diff --git a/drivers/net/iavf/iavf_generic_flow.h b/drivers/net/iavf/iavf_generic_flow.h
index 107bbc1a23..f6af176073 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -35,6 +35,7 @@
#define IAVF_PROT_L2TPV3OIP (1ULL << 24)
#define IAVF_PROT_PFCP (1ULL << 25)
#define IAVF_PROT_ECPRI (1ULL << 26)
+#define IAVF_PROT_L2TPV2 (1ULL << 27)
/* field */
@@ -62,6 +63,7 @@
#define IAVF_PFCP_SEID (1ULL << 43)
#define IAVF_ECPRI_PC_RTC_ID (1ULL << 42)
#define IAVF_IP_PKID (1ULL << 41)
+#define IAVF_L2TPV2_SESSION_ID (1ULL << 40)
/* input set */
@@ -175,6 +177,8 @@
(IAVF_PROT_PFCP | IAVF_PFCP_S_FIELD | IAVF_PFCP_SEID)
#define IAVF_INSET_ECPRI \
(IAVF_PROT_ECPRI | IAVF_ECPRI_PC_RTC_ID)
+#define IAVF_INSET_L2TPV2 \
+ (IAVF_PROT_L2TPV2 | IAVF_L2TPV2_SESSION_ID)
/* empty pattern */
extern enum rte_flow_item_type iavf_pattern_empty[];
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 0/2] support L2TPv2 for AVF RSS and FDIR
2022-02-11 7:36 ` [PATCH v2 0/2] support L2TPv2 for AVF RSS hash and FDIR Jie Wang
2022-02-11 7:36 ` [PATCH v2 1/2] net/iavf: support L2TPv2 for AVF HASH Jie Wang
2022-02-11 7:36 ` [PATCH v2 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
@ 2022-02-11 8:09 ` Jie Wang
2022-02-11 8:09 ` [PATCH v3 1/2] net/iavf: support L2TPv2 for AVF RSS Jie Wang
` (2 more replies)
2 siblings, 3 replies; 15+ messages in thread
From: Jie Wang @ 2022-02-11 8:09 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Support L2TPv2(include PPP over L2tpv2) for AVF RSS and FDIR based on
outer MAC src/dst address and L2TPv2 session ID.
Support PPPoL2TPv2oUDP for AVF FDIR based on inner IP src/dst address
and TCP/UDP src/dst port.
---
v3: update commit log and release notes.
v2: upadte release notes.
Jie Wang (2):
net/iavf: support L2TPv2 for AVF RSS
net/iavf: support L2TPv2 for AVF FDIR
doc/guides/rel_notes/release_22_03.rst | 9 ++
drivers/net/iavf/iavf.h | 2 +
drivers/net/iavf/iavf_fdir.c | 169 +++++++++++++++++++++----
drivers/net/iavf/iavf_generic_flow.c | 34 +++++
drivers/net/iavf/iavf_generic_flow.h | 10 ++
drivers/net/iavf/iavf_hash.c | 81 +++++++++++-
6 files changed, 273 insertions(+), 32 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 1/2] net/iavf: support L2TPv2 for AVF RSS
2022-02-11 8:09 ` [PATCH v3 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
@ 2022-02-11 8:09 ` Jie Wang
2022-02-15 2:00 ` Xing, Beilei
2022-02-11 8:09 ` [PATCH v3 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
2022-02-15 8:25 ` [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
2 siblings, 1 reply; 15+ messages in thread
From: Jie Wang @ 2022-02-11 8:09 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Add support for L2TPv2(include PPP over L2TPv2) protocols RSS based
on outer MAC src/dst address and L2TPv2 session ID.
Patterns are listed below:
eth/ipv4/udp/l2tpv2
eth/ipv4/udp/l2tpv2/ppp
eth/ipv6/udp/l2tpv2
eth/ipv6/udp/l2tpv2/ppp
Signed-off-by: Jie Wang <jie1x.wang@intel.com>
---
doc/guides/rel_notes/release_22_03.rst | 5 ++
drivers/net/iavf/iavf.h | 2 +
drivers/net/iavf/iavf_generic_flow.c | 34 +++++++++++
drivers/net/iavf/iavf_generic_flow.h | 6 ++
drivers/net/iavf/iavf_hash.c | 81 ++++++++++++++++++++++++--
5 files changed, 124 insertions(+), 4 deletions(-)
diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst
index 0f1d3adaf2..a8097c5ed4 100644
--- a/doc/guides/rel_notes/release_22_03.rst
+++ b/doc/guides/rel_notes/release_22_03.rst
@@ -89,6 +89,11 @@ New Features
* Added rte_flow support for matching GENEVE packets.
* Added rte_flow support for matching eCPRI packets.
+* **Updated Intel iavf driver.**
+
+ * Added L2TPv2(include PPP over L2TPv2) RSS support based on outer
+ MAC src/dst address and L2TPv2 session ID.
+
* **Updated Marvell cnxk crypto PMD.**
* Added SHA256-HMAC support in lookaside protocol (IPsec) for CN10K.
diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
index 0bb5698583..a01d18e61b 100644
--- a/drivers/net/iavf/iavf.h
+++ b/drivers/net/iavf/iavf.h
@@ -93,6 +93,8 @@
#define IAVF_VLAN_TAG_PCP_OFFSET 13
+#define IAVF_L2TPV2_FLAGS_LEN 0x4000
+
struct iavf_adapter;
struct iavf_rx_queue;
struct iavf_tx_queue;
diff --git a/drivers/net/iavf/iavf_generic_flow.c b/drivers/net/iavf/iavf_generic_flow.c
index 2befa125ac..1de4187e67 100644
--- a/drivers/net/iavf/iavf_generic_flow.c
+++ b/drivers/net/iavf/iavf_generic_flow.c
@@ -1611,6 +1611,40 @@ enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_END,
};
+enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV4,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV4,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_PPP,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV6,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV6,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_PPP,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
/* PPPoL2TPv2oUDP */
enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[] = {
RTE_FLOW_ITEM_TYPE_ETH,
diff --git a/drivers/net/iavf/iavf_generic_flow.h b/drivers/net/iavf/iavf_generic_flow.h
index 3681a96b31..107bbc1a23 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -410,6 +410,12 @@ extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_tcp[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_udp[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_udp[];
+/* L2TPv2 */
+extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp[];
+
/* PPPoL2TPv2oUDP */
extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6[];
diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index 5e0888ea68..f35a07653b 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -36,6 +36,7 @@
#define IAVF_PHINT_MID_IPV6 BIT_ULL(8)
/* L2TPv2 */
#define IAVF_PHINT_L2TPV2 BIT_ULL(9)
+#define IAVF_PHINT_L2TPV2_LEN BIT_ULL(10)
#define IAVF_PHINT_GTPU_MSK (IAVF_PHINT_GTPU | \
IAVF_PHINT_GTPU_EH | \
@@ -167,7 +168,9 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ECPRI_PC_RTC_ID), {BUFF_NOUSED} }
#define proto_hdr_l2tpv2 { \
- VIRTCHNL_PROTO_HDR_L2TPV2, 0, {BUFF_NOUSED} }
+ VIRTCHNL_PROTO_HDR_L2TPV2, \
+ FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_SESS_ID) | \
+ FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_LEN_SESS_ID), {BUFF_NOUSED} }
#define proto_hdr_ppp { \
VIRTCHNL_PROTO_HDR_PPP, 0, {BUFF_NOUSED} }
@@ -392,6 +395,40 @@ struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tcp_tmplt = {
proto_hdr_tcp}
};
+struct virtchnl_proto_hdrs ipv4_l2tpv2_tmplt = {
+ TUNNEL_LEVEL_OUTER, 4,
+ {proto_hdr_eth,
+ proto_hdr_ipv4,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2}
+};
+
+struct virtchnl_proto_hdrs ipv6_l2tpv2_tmplt = {
+ TUNNEL_LEVEL_OUTER, 4,
+ {proto_hdr_eth,
+ proto_hdr_ipv6,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2}
+};
+
+struct virtchnl_proto_hdrs ipv4_l2tpv2_ppp_tmplt = {
+ TUNNEL_LEVEL_OUTER, 5,
+ {proto_hdr_eth,
+ proto_hdr_ipv4,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2,
+ proto_hdr_ppp}
+};
+
+struct virtchnl_proto_hdrs ipv6_l2tpv2_ppp_tmplt = {
+ TUNNEL_LEVEL_OUTER, 5,
+ {proto_hdr_eth,
+ proto_hdr_ipv6,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2,
+ proto_hdr_ppp}
+};
+
/* rss type super set */
/* IPv4 outer */
@@ -480,6 +517,9 @@ struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tcp_tmplt = {
#define IAVF_RSS_TYPE_IPV4_PFCP (RTE_ETH_RSS_PFCP | RTE_ETH_RSS_IPV4)
#define IAVF_RSS_TYPE_IPV6_PFCP (RTE_ETH_RSS_PFCP | RTE_ETH_RSS_IPV6)
+/* L2TPv2 */
+#define IAVF_RSS_TYPE_ETH_L2TPV2 (RTE_ETH_RSS_ETH | RTE_ETH_RSS_L2TPV2)
+
/**
* Supported pattern for hash.
* The first member is pattern item type,
@@ -547,6 +587,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
{iavf_pattern_eth_ipv6_gre_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &inner_ipv4_tcp_tmplt},
{iavf_pattern_eth_ipv4_gre_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &inner_ipv4_udp_tmplt},
{iavf_pattern_eth_ipv6_gre_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &inner_ipv4_udp_tmplt},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv4_l2tpv2_tmplt},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv4_l2tpv2_ppp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4, IAVF_RSS_TYPE_INNER_IPV4, &udp_l2tpv2_ppp_ipv4_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &udp_l2tpv2_ppp_ipv4_udp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &udp_l2tpv2_ppp_ipv4_tcp_tmplt},
@@ -614,6 +656,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
{iavf_pattern_eth_ipv6_gre_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &inner_ipv6_tcp_tmplt},
{iavf_pattern_eth_ipv4_gre_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &inner_ipv6_udp_tmplt},
{iavf_pattern_eth_ipv6_gre_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &inner_ipv6_udp_tmplt},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv6_l2tpv2_tmplt},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv6_l2tpv2_ppp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6, IAVF_RSS_TYPE_INNER_IPV6, &udp_l2tpv2_ppp_ipv6_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &udp_l2tpv2_ppp_ipv6_udp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &udp_l2tpv2_ppp_ipv6_tcp_tmplt},
@@ -744,6 +788,8 @@ iavf_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
const struct rte_flow_item_gtp_psc *psc;
const struct rte_flow_item_ecpri *ecpri;
struct rte_ecpri_common_hdr ecpri_common;
+ const struct rte_flow_item_l2tpv2 *l2tpv2;
+ uint16_t flags_version;
for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
if (item->last) {
@@ -802,7 +848,18 @@ iavf_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
*phint |= IAVF_PHINT_GRE;
break;
case RTE_FLOW_ITEM_TYPE_L2TPV2:
- *phint |= IAVF_PHINT_L2TPV2;
+ l2tpv2 = item->spec;
+
+ if (l2tpv2) {
+ flags_version =
+ rte_be_to_cpu_16(l2tpv2->hdr.common.flags_version);
+ if (flags_version & IAVF_L2TPV2_FLAGS_LEN)
+ *phint |= IAVF_PHINT_L2TPV2_LEN;
+ else
+ *phint |= IAVF_PHINT_L2TPV2;
+ } else {
+ *phint |= IAVF_PHINT_L2TPV2;
+ }
break;
default:
break;
@@ -1024,6 +1081,10 @@ iavf_refine_proto_hdrs_l234(struct virtchnl_proto_hdrs *proto_hdrs,
if (!(rss_type & RTE_ETH_RSS_ECPRI))
hdr->field_selector = 0;
break;
+ case VIRTCHNL_PROTO_HDR_L2TPV2:
+ if (!(rss_type & RTE_ETH_RSS_L2TPV2))
+ hdr->field_selector = 0;
+ break;
default:
break;
}
@@ -1130,10 +1191,10 @@ static void
iavf_refine_proto_hdrs_l2tpv2(struct virtchnl_proto_hdrs *proto_hdrs,
uint64_t phint)
{
- struct virtchnl_proto_hdr *hdr1;
+ struct virtchnl_proto_hdr *hdr, *hdr1;
int i;
- if (!(phint & IAVF_PHINT_L2TPV2))
+ if (!(phint & IAVF_PHINT_L2TPV2) && !(phint & IAVF_PHINT_L2TPV2_LEN))
return;
if (proto_hdrs->tunnel_level == TUNNEL_LEVEL_INNER) {
@@ -1150,7 +1211,19 @@ iavf_refine_proto_hdrs_l2tpv2(struct virtchnl_proto_hdrs *proto_hdrs,
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4);
else if (phint & IAVF_PHINT_OUTER_IPV6)
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV6);
+ } else {
+ for (i = 0; i < proto_hdrs->count; i++) {
+ hdr = &proto_hdrs->proto_hdr[i];
+ if (hdr->type == VIRTCHNL_PROTO_HDR_L2TPV2) {
+ if (phint & IAVF_PHINT_L2TPV2) {
+ REFINE_PROTO_FLD(DEL, L2TPV2_LEN_SESS_ID);
+ } else if (phint & IAVF_PHINT_L2TPV2_LEN) {
+ REFINE_PROTO_FLD(DEL, L2TPV2_SESS_ID);
+ }
+ }
+ }
}
+
}
static void iavf_refine_proto_hdrs(struct virtchnl_proto_hdrs *proto_hdrs,
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 2/2] net/iavf: support L2TPv2 for AVF FDIR
2022-02-11 8:09 ` [PATCH v3 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
2022-02-11 8:09 ` [PATCH v3 1/2] net/iavf: support L2TPv2 for AVF RSS Jie Wang
@ 2022-02-11 8:09 ` Jie Wang
2022-02-11 8:14 ` Xing, Beilei
2022-02-15 8:25 ` [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
2 siblings, 1 reply; 15+ messages in thread
From: Jie Wang @ 2022-02-11 8:09 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Add support for L2TPv2(include PPP over L2TPv2) protocols FDIR
based on outer MAC src/dst address and L2TPv2 session ID.
Add support for PPPoL2TPv2oUDP protocols FDIR based on inner IP
src/dst address and UDP/TCP src/dst port.
Patterns are listed below:
eth/ipv4(6)/udp/l2tpv2
eth/ipv4(6)/udp/l2tpv2/ppp
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)/udp
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)/tcp
Signed-off-by: Jie Wang <jie1x.wang@intel.com>
---
doc/guides/rel_notes/release_22_03.rst | 4 +
drivers/net/iavf/iavf_fdir.c | 169 +++++++++++++++++++++----
drivers/net/iavf/iavf_generic_flow.h | 4 +
3 files changed, 149 insertions(+), 28 deletions(-)
diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst
index a8097c5ed4..9c9e13fe1e 100644
--- a/doc/guides/rel_notes/release_22_03.rst
+++ b/doc/guides/rel_notes/release_22_03.rst
@@ -93,6 +93,10 @@ New Features
* Added L2TPv2(include PPP over L2TPv2) RSS support based on outer
MAC src/dst address and L2TPv2 session ID.
+ * Added L2TPv2(include PPP over L2TPv2) FDIR support based on outer
+ MAC src/dst address and L2TPv2 session ID.
+ * Added PPPoL2TPv2oUDP FDIR distribute packets based on inner IP
+ src/dst address and UDP/TCP src/dst port.
* **Updated Marvell cnxk crypto PMD.**
diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index b63aaca91d..e9a3566c0d 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -168,6 +168,31 @@
IAVF_FDIR_INSET_GRE_IPV6 | IAVF_INSET_TUN_UDP_SRC_PORT | \
IAVF_INSET_TUN_UDP_DST_PORT)
+#define IAVF_FDIR_INSET_L2TPV2 (\
+ IAVF_INSET_SMAC | IAVF_INSET_DMAC | IAVF_INSET_L2TPV2)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 (\
+ IAVF_INSET_TUN_IPV4_SRC | IAVF_INSET_TUN_IPV4_DST)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 | IAVF_INSET_TUN_UDP_SRC_PORT | \
+ IAVF_INSET_TUN_UDP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 | IAVF_INSET_TUN_TCP_SRC_PORT | \
+ IAVF_INSET_TUN_TCP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 (\
+ IAVF_INSET_TUN_IPV6_SRC | IAVF_INSET_TUN_IPV6_DST)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 | IAVF_INSET_TUN_UDP_SRC_PORT | \
+ IAVF_INSET_TUN_UDP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 | IAVF_INSET_TUN_TCP_SRC_PORT | \
+ IAVF_INSET_TUN_TCP_DST_PORT)
+
static struct iavf_pattern_match_item iavf_fdir_pattern[] = {
{iavf_pattern_ethertype, IAVF_FDIR_INSET_ETH, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4, IAVF_FDIR_INSET_ETH_IPV4, IAVF_INSET_NONE},
@@ -275,6 +300,23 @@ static struct iavf_pattern_match_item iavf_fdir_pattern[] = {
{iavf_pattern_eth_ipv6_gre_ipv6, IAVF_FDIR_INSET_GRE_IPV6, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_gre_ipv6_tcp, IAVF_FDIR_INSET_GRE_IPV6_TCP, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_gre_ipv6_udp, IAVF_FDIR_INSET_GRE_IPV6_UDP, IAVF_INSET_NONE},
+
+ {iavf_pattern_eth_ipv4_udp_l2tpv2, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP, IAVF_INSET_NONE},
};
static struct iavf_flow_parser iavf_fdir_parser;
@@ -694,6 +736,8 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
const struct rte_flow_item_pfcp *pfcp_spec, *pfcp_mask;
const struct rte_flow_item_ecpri *ecpri_spec, *ecpri_mask;
const struct rte_flow_item_gre *gre_spec, *gre_mask;
+ const struct rte_flow_item_l2tpv2 *l2tpv2_spec, *l2tpv2_mask;
+ const struct rte_flow_item_ppp *ppp_spec, *ppp_mask;
const struct rte_flow_item *item = pattern;
struct virtchnl_proto_hdr *hdr, *hdr1 = NULL;
struct rte_ecpri_common_hdr ecpri_common;
@@ -701,7 +745,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
enum rte_flow_item_type item_type;
enum rte_flow_item_type next_type;
uint8_t tun_inner = 0;
- uint16_t ether_type;
+ uint16_t ether_type, flags_version;
int layer = 0;
uint8_t ipv6_addr_mask[16] = {
@@ -739,37 +783,41 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
}
if (eth_spec && eth_mask) {
- if (!rte_is_zero_ether_addr(ð_mask->src) ||
- !rte_is_zero_ether_addr(ð_mask->dst)) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM, item,
- "Invalid MAC_addr mask.");
- return -rte_errno;
+ if (!rte_is_zero_ether_addr(ð_mask->dst)) {
+ input_set |= IAVF_INSET_DMAC;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1,
+ ETH,
+ DST);
+ } else if (!rte_is_zero_ether_addr(ð_mask->src)) {
+ input_set |= IAVF_INSET_SMAC;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1,
+ ETH,
+ SRC);
}
- }
- if (eth_spec && eth_mask && eth_mask->type) {
- if (eth_mask->type != RTE_BE16(0xffff)) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM,
- item, "Invalid type mask.");
- return -rte_errno;
+ if (eth_mask->type) {
+ if (eth_mask->type != RTE_BE16(0xffff)) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item, "Invalid type mask.");
+ return -rte_errno;
+ }
+
+ ether_type = rte_be_to_cpu_16(eth_spec->type);
+ if (ether_type == RTE_ETHER_TYPE_IPV4 ||
+ ether_type == RTE_ETHER_TYPE_IPV6) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "Unsupported ether_type.");
+ return -rte_errno;
+ }
+
+ input_set |= IAVF_INSET_ETHERTYPE;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1, ETH,
+ ETHERTYPE);
}
- ether_type = rte_be_to_cpu_16(eth_spec->type);
- if (ether_type == RTE_ETHER_TYPE_IPV4 ||
- ether_type == RTE_ETHER_TYPE_IPV6) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM,
- item,
- "Unsupported ether_type.");
- return -rte_errno;
- }
-
- input_set |= IAVF_INSET_ETHERTYPE;
- VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1, ETH,
- ETHERTYPE);
-
rte_memcpy(hdr1->buffer, eth_spec,
sizeof(struct rte_ether_hdr));
}
@@ -1319,6 +1367,71 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
hdrs->count = ++layer;
break;
+ case RTE_FLOW_ITEM_TYPE_L2TPV2:
+ l2tpv2_spec = item->spec;
+ l2tpv2_mask = item->mask;
+
+ hdr = &hdrs->proto_hdr[layer];
+
+ VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, L2TPV2);
+
+ if (l2tpv2_spec && l2tpv2_mask) {
+ flags_version =
+ rte_be_to_cpu_16(l2tpv2_spec->hdr.common.flags_version);
+ if ((flags_version == RTE_L2TPV2_MSG_TYPE_CONTROL &&
+ l2tpv2_mask->hdr.type3.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA &&
+ l2tpv2_mask->hdr.type7.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L &&
+ l2tpv2_mask->hdr.type6.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_S &&
+ l2tpv2_mask->hdr.type5.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_O &&
+ l2tpv2_mask->hdr.type4.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_S &&
+ l2tpv2_mask->hdr.type3.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_O &&
+ l2tpv2_mask->hdr.type2.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_S_O &&
+ l2tpv2_mask->hdr.type1.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_S_O &&
+ l2tpv2_mask->hdr.type0.session_id == UINT16_MAX)) {
+ input_set |= IAVF_L2TPV2_SESSION_ID;
+ if (flags_version & IAVF_L2TPV2_FLAGS_LEN)
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr,
+ L2TPV2,
+ LEN_SESS_ID);
+ else
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr,
+ L2TPV2,
+ SESS_ID);
+ }
+
+ rte_memcpy(hdr->buffer, l2tpv2_spec,
+ sizeof(*l2tpv2_spec));
+ }
+
+ tun_inner = 1;
+
+ hdrs->count = ++layer;
+ break;
+
+ case RTE_FLOW_ITEM_TYPE_PPP:
+ ppp_spec = item->spec;
+ ppp_mask = item->mask;
+
+ hdr = &hdrs->proto_hdr[layer];
+
+ VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, PPP);
+
+ if (ppp_spec && ppp_mask) {
+ rte_memcpy(hdr->buffer, ppp_spec,
+ sizeof(*ppp_spec));
+ }
+
+ hdrs->count = ++layer;
+ break;
+
case RTE_FLOW_ITEM_TYPE_VOID:
break;
diff --git a/drivers/net/iavf/iavf_generic_flow.h b/drivers/net/iavf/iavf_generic_flow.h
index 107bbc1a23..f6af176073 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -35,6 +35,7 @@
#define IAVF_PROT_L2TPV3OIP (1ULL << 24)
#define IAVF_PROT_PFCP (1ULL << 25)
#define IAVF_PROT_ECPRI (1ULL << 26)
+#define IAVF_PROT_L2TPV2 (1ULL << 27)
/* field */
@@ -62,6 +63,7 @@
#define IAVF_PFCP_SEID (1ULL << 43)
#define IAVF_ECPRI_PC_RTC_ID (1ULL << 42)
#define IAVF_IP_PKID (1ULL << 41)
+#define IAVF_L2TPV2_SESSION_ID (1ULL << 40)
/* input set */
@@ -175,6 +177,8 @@
(IAVF_PROT_PFCP | IAVF_PFCP_S_FIELD | IAVF_PFCP_SEID)
#define IAVF_INSET_ECPRI \
(IAVF_PROT_ECPRI | IAVF_ECPRI_PC_RTC_ID)
+#define IAVF_INSET_L2TPV2 \
+ (IAVF_PROT_L2TPV2 | IAVF_L2TPV2_SESSION_ID)
/* empty pattern */
extern enum rte_flow_item_type iavf_pattern_empty[];
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* RE: [PATCH v3 2/2] net/iavf: support L2TPv2 for AVF FDIR
2022-02-11 8:09 ` [PATCH v3 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
@ 2022-02-11 8:14 ` Xing, Beilei
0 siblings, 0 replies; 15+ messages in thread
From: Xing, Beilei @ 2022-02-11 8:14 UTC (permalink / raw)
To: Wang, Jie1X, dev; +Cc: Yang, SteveX, Wu, Jingjing, Zhang, Qi Z
> -----Original Message-----
> From: Wang, Jie1X <jie1x.wang@intel.com>
> Sent: Friday, February 11, 2022 4:09 PM
> To: dev@dpdk.org
> Cc: Yang, SteveX <stevex.yang@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Xing, Beilei <beilei.xing@intel.com>; Zhang, Qi Z
> <qi.z.zhang@intel.com>; Wang, Jie1X <jie1x.wang@intel.com>
> Subject: [PATCH v3 2/2] net/iavf: support L2TPv2 for AVF FDIR
>
> Add support for L2TPv2(include PPP over L2TPv2) protocols FDIR based on outer
> MAC src/dst address and L2TPv2 session ID.
>
> Add support for PPPoL2TPv2oUDP protocols FDIR based on inner IP src/dst
> address and UDP/TCP src/dst port.
>
> Patterns are listed below:
> eth/ipv4(6)/udp/l2tpv2
> eth/ipv4(6)/udp/l2tpv2/ppp
>
> eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)
> eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)/udp
> eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)/tcp
>
> Signed-off-by: Jie Wang <jie1x.wang@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH v3 1/2] net/iavf: support L2TPv2 for AVF RSS
2022-02-11 8:09 ` [PATCH v3 1/2] net/iavf: support L2TPv2 for AVF RSS Jie Wang
@ 2022-02-15 2:00 ` Xing, Beilei
0 siblings, 0 replies; 15+ messages in thread
From: Xing, Beilei @ 2022-02-15 2:00 UTC (permalink / raw)
To: Wang, Jie1X, dev; +Cc: Yang, SteveX, Wu, Jingjing, Zhang, Qi Z
> -----Original Message-----
> From: Wang, Jie1X <jie1x.wang@intel.com>
> Sent: Friday, February 11, 2022 4:09 PM
> To: dev@dpdk.org
> Cc: Yang, SteveX <stevex.yang@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Xing, Beilei <beilei.xing@intel.com>; Zhang, Qi Z
> <qi.z.zhang@intel.com>; Wang, Jie1X <jie1x.wang@intel.com>
> Subject: [PATCH v3 1/2] net/iavf: support L2TPv2 for AVF RSS
>
> Add support for L2TPv2(include PPP over L2TPv2) protocols RSS based on
> outer MAC src/dst address and L2TPv2 session ID.
>
> Patterns are listed below:
> eth/ipv4/udp/l2tpv2
> eth/ipv4/udp/l2tpv2/ppp
> eth/ipv6/udp/l2tpv2
> eth/ipv6/udp/l2tpv2/ppp
>
> Signed-off-by: Jie Wang <jie1x.wang@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR
2022-02-11 8:09 ` [PATCH v3 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
2022-02-11 8:09 ` [PATCH v3 1/2] net/iavf: support L2TPv2 for AVF RSS Jie Wang
2022-02-11 8:09 ` [PATCH v3 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
@ 2022-02-15 8:25 ` Jie Wang
2022-02-15 8:25 ` [PATCH v4 1/2] net/iavf: support L2TPv2 for AVF RSS Jie Wang
` (2 more replies)
2 siblings, 3 replies; 15+ messages in thread
From: Jie Wang @ 2022-02-15 8:25 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Support L2TPv2(include PPP over L2tpv2) for AVF RSS and FDIR based on
outer MAC src/dst address and L2TPv2 session ID.
Support PPPoL2TPv2oUDP for AVF FDIR based on inner IP src/dst address
and TCP/UDP src/dst port.
---
v4: rebase main branch.
v3: update commit log and release notes.
v2: upadte release notes.
Jie Wang (2):
net/iavf: support L2TPv2 for AVF RSS
net/iavf: support L2TPv2 for AVF FDIR
doc/guides/rel_notes/release_22_03.rst | 9 ++
drivers/net/iavf/iavf.h | 2 +
drivers/net/iavf/iavf_fdir.c | 169 +++++++++++++++++++++----
drivers/net/iavf/iavf_generic_flow.c | 34 +++++
drivers/net/iavf/iavf_generic_flow.h | 10 ++
drivers/net/iavf/iavf_hash.c | 81 +++++++++++-
6 files changed, 273 insertions(+), 32 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 1/2] net/iavf: support L2TPv2 for AVF RSS
2022-02-15 8:25 ` [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
@ 2022-02-15 8:25 ` Jie Wang
2022-02-15 8:25 ` [PATCH v4 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
2022-02-15 8:28 ` [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR Zhang, Qi Z
2 siblings, 0 replies; 15+ messages in thread
From: Jie Wang @ 2022-02-15 8:25 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Add support for L2TPv2(include PPP over L2TPv2) protocols RSS based
on outer MAC src/dst address and L2TPv2 session ID.
Patterns are listed below:
eth/ipv4/udp/l2tpv2
eth/ipv4/udp/l2tpv2/ppp
eth/ipv6/udp/l2tpv2
eth/ipv6/udp/l2tpv2/ppp
Signed-off-by: Jie Wang <jie1x.wang@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
---
doc/guides/rel_notes/release_22_03.rst | 5 ++
drivers/net/iavf/iavf.h | 2 +
drivers/net/iavf/iavf_generic_flow.c | 34 +++++++++++
drivers/net/iavf/iavf_generic_flow.h | 6 ++
drivers/net/iavf/iavf_hash.c | 81 ++++++++++++++++++++++++--
5 files changed, 124 insertions(+), 4 deletions(-)
diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst
index ff3095d742..223b91a200 100644
--- a/doc/guides/rel_notes/release_22_03.rst
+++ b/doc/guides/rel_notes/release_22_03.rst
@@ -109,6 +109,11 @@ New Features
* Added rte_flow support for matching GENEVE packets.
* Added rte_flow support for matching eCPRI packets.
+* **Updated Intel iavf driver.**
+
+ * Added L2TPv2(include PPP over L2TPv2) RSS support based on outer
+ MAC src/dst address and L2TPv2 session ID.
+
* **Updated Wangxun ngbe driver.**
* Added support for devices of custom PHY interfaces.
diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
index 0bb5698583..a01d18e61b 100644
--- a/drivers/net/iavf/iavf.h
+++ b/drivers/net/iavf/iavf.h
@@ -93,6 +93,8 @@
#define IAVF_VLAN_TAG_PCP_OFFSET 13
+#define IAVF_L2TPV2_FLAGS_LEN 0x4000
+
struct iavf_adapter;
struct iavf_rx_queue;
struct iavf_tx_queue;
diff --git a/drivers/net/iavf/iavf_generic_flow.c b/drivers/net/iavf/iavf_generic_flow.c
index 2befa125ac..1de4187e67 100644
--- a/drivers/net/iavf/iavf_generic_flow.c
+++ b/drivers/net/iavf/iavf_generic_flow.c
@@ -1611,6 +1611,40 @@ enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_END,
};
+enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV4,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV4,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_PPP,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV6,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp[] = {
+ RTE_FLOW_ITEM_TYPE_ETH,
+ RTE_FLOW_ITEM_TYPE_IPV6,
+ RTE_FLOW_ITEM_TYPE_UDP,
+ RTE_FLOW_ITEM_TYPE_L2TPV2,
+ RTE_FLOW_ITEM_TYPE_PPP,
+ RTE_FLOW_ITEM_TYPE_END,
+};
+
/* PPPoL2TPv2oUDP */
enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[] = {
RTE_FLOW_ITEM_TYPE_ETH,
diff --git a/drivers/net/iavf/iavf_generic_flow.h b/drivers/net/iavf/iavf_generic_flow.h
index 3681a96b31..107bbc1a23 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -410,6 +410,12 @@ extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_tcp[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv4_udp[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_udp[];
+/* L2TPv2 */
+extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp[];
+
/* PPPoL2TPv2oUDP */
extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[];
extern enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6[];
diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index 5e0888ea68..f35a07653b 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -36,6 +36,7 @@
#define IAVF_PHINT_MID_IPV6 BIT_ULL(8)
/* L2TPv2 */
#define IAVF_PHINT_L2TPV2 BIT_ULL(9)
+#define IAVF_PHINT_L2TPV2_LEN BIT_ULL(10)
#define IAVF_PHINT_GTPU_MSK (IAVF_PHINT_GTPU | \
IAVF_PHINT_GTPU_EH | \
@@ -167,7 +168,9 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ECPRI_PC_RTC_ID), {BUFF_NOUSED} }
#define proto_hdr_l2tpv2 { \
- VIRTCHNL_PROTO_HDR_L2TPV2, 0, {BUFF_NOUSED} }
+ VIRTCHNL_PROTO_HDR_L2TPV2, \
+ FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_SESS_ID) | \
+ FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_LEN_SESS_ID), {BUFF_NOUSED} }
#define proto_hdr_ppp { \
VIRTCHNL_PROTO_HDR_PPP, 0, {BUFF_NOUSED} }
@@ -392,6 +395,40 @@ struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tcp_tmplt = {
proto_hdr_tcp}
};
+struct virtchnl_proto_hdrs ipv4_l2tpv2_tmplt = {
+ TUNNEL_LEVEL_OUTER, 4,
+ {proto_hdr_eth,
+ proto_hdr_ipv4,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2}
+};
+
+struct virtchnl_proto_hdrs ipv6_l2tpv2_tmplt = {
+ TUNNEL_LEVEL_OUTER, 4,
+ {proto_hdr_eth,
+ proto_hdr_ipv6,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2}
+};
+
+struct virtchnl_proto_hdrs ipv4_l2tpv2_ppp_tmplt = {
+ TUNNEL_LEVEL_OUTER, 5,
+ {proto_hdr_eth,
+ proto_hdr_ipv4,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2,
+ proto_hdr_ppp}
+};
+
+struct virtchnl_proto_hdrs ipv6_l2tpv2_ppp_tmplt = {
+ TUNNEL_LEVEL_OUTER, 5,
+ {proto_hdr_eth,
+ proto_hdr_ipv6,
+ proto_hdr_udp,
+ proto_hdr_l2tpv2,
+ proto_hdr_ppp}
+};
+
/* rss type super set */
/* IPv4 outer */
@@ -480,6 +517,9 @@ struct virtchnl_proto_hdrs udp_l2tpv2_ppp_ipv6_tcp_tmplt = {
#define IAVF_RSS_TYPE_IPV4_PFCP (RTE_ETH_RSS_PFCP | RTE_ETH_RSS_IPV4)
#define IAVF_RSS_TYPE_IPV6_PFCP (RTE_ETH_RSS_PFCP | RTE_ETH_RSS_IPV6)
+/* L2TPv2 */
+#define IAVF_RSS_TYPE_ETH_L2TPV2 (RTE_ETH_RSS_ETH | RTE_ETH_RSS_L2TPV2)
+
/**
* Supported pattern for hash.
* The first member is pattern item type,
@@ -547,6 +587,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
{iavf_pattern_eth_ipv6_gre_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &inner_ipv4_tcp_tmplt},
{iavf_pattern_eth_ipv4_gre_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &inner_ipv4_udp_tmplt},
{iavf_pattern_eth_ipv6_gre_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &inner_ipv4_udp_tmplt},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv4_l2tpv2_tmplt},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv4_l2tpv2_ppp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4, IAVF_RSS_TYPE_INNER_IPV4, &udp_l2tpv2_ppp_ipv4_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp, IAVF_RSS_TYPE_INNER_IPV4_UDP, &udp_l2tpv2_ppp_ipv4_udp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp, IAVF_RSS_TYPE_INNER_IPV4_TCP, &udp_l2tpv2_ppp_ipv4_tcp_tmplt},
@@ -614,6 +656,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
{iavf_pattern_eth_ipv6_gre_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &inner_ipv6_tcp_tmplt},
{iavf_pattern_eth_ipv4_gre_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &inner_ipv6_udp_tmplt},
{iavf_pattern_eth_ipv6_gre_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &inner_ipv6_udp_tmplt},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv6_l2tpv2_tmplt},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp, IAVF_RSS_TYPE_ETH_L2TPV2, &ipv6_l2tpv2_ppp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6, IAVF_RSS_TYPE_INNER_IPV6, &udp_l2tpv2_ppp_ipv6_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp, IAVF_RSS_TYPE_INNER_IPV6_UDP, &udp_l2tpv2_ppp_ipv6_udp_tmplt},
{iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp, IAVF_RSS_TYPE_INNER_IPV6_TCP, &udp_l2tpv2_ppp_ipv6_tcp_tmplt},
@@ -744,6 +788,8 @@ iavf_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
const struct rte_flow_item_gtp_psc *psc;
const struct rte_flow_item_ecpri *ecpri;
struct rte_ecpri_common_hdr ecpri_common;
+ const struct rte_flow_item_l2tpv2 *l2tpv2;
+ uint16_t flags_version;
for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
if (item->last) {
@@ -802,7 +848,18 @@ iavf_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
*phint |= IAVF_PHINT_GRE;
break;
case RTE_FLOW_ITEM_TYPE_L2TPV2:
- *phint |= IAVF_PHINT_L2TPV2;
+ l2tpv2 = item->spec;
+
+ if (l2tpv2) {
+ flags_version =
+ rte_be_to_cpu_16(l2tpv2->hdr.common.flags_version);
+ if (flags_version & IAVF_L2TPV2_FLAGS_LEN)
+ *phint |= IAVF_PHINT_L2TPV2_LEN;
+ else
+ *phint |= IAVF_PHINT_L2TPV2;
+ } else {
+ *phint |= IAVF_PHINT_L2TPV2;
+ }
break;
default:
break;
@@ -1024,6 +1081,10 @@ iavf_refine_proto_hdrs_l234(struct virtchnl_proto_hdrs *proto_hdrs,
if (!(rss_type & RTE_ETH_RSS_ECPRI))
hdr->field_selector = 0;
break;
+ case VIRTCHNL_PROTO_HDR_L2TPV2:
+ if (!(rss_type & RTE_ETH_RSS_L2TPV2))
+ hdr->field_selector = 0;
+ break;
default:
break;
}
@@ -1130,10 +1191,10 @@ static void
iavf_refine_proto_hdrs_l2tpv2(struct virtchnl_proto_hdrs *proto_hdrs,
uint64_t phint)
{
- struct virtchnl_proto_hdr *hdr1;
+ struct virtchnl_proto_hdr *hdr, *hdr1;
int i;
- if (!(phint & IAVF_PHINT_L2TPV2))
+ if (!(phint & IAVF_PHINT_L2TPV2) && !(phint & IAVF_PHINT_L2TPV2_LEN))
return;
if (proto_hdrs->tunnel_level == TUNNEL_LEVEL_INNER) {
@@ -1150,7 +1211,19 @@ iavf_refine_proto_hdrs_l2tpv2(struct virtchnl_proto_hdrs *proto_hdrs,
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4);
else if (phint & IAVF_PHINT_OUTER_IPV6)
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV6);
+ } else {
+ for (i = 0; i < proto_hdrs->count; i++) {
+ hdr = &proto_hdrs->proto_hdr[i];
+ if (hdr->type == VIRTCHNL_PROTO_HDR_L2TPV2) {
+ if (phint & IAVF_PHINT_L2TPV2) {
+ REFINE_PROTO_FLD(DEL, L2TPV2_LEN_SESS_ID);
+ } else if (phint & IAVF_PHINT_L2TPV2_LEN) {
+ REFINE_PROTO_FLD(DEL, L2TPV2_SESS_ID);
+ }
+ }
+ }
}
+
}
static void iavf_refine_proto_hdrs(struct virtchnl_proto_hdrs *proto_hdrs,
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 2/2] net/iavf: support L2TPv2 for AVF FDIR
2022-02-15 8:25 ` [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
2022-02-15 8:25 ` [PATCH v4 1/2] net/iavf: support L2TPv2 for AVF RSS Jie Wang
@ 2022-02-15 8:25 ` Jie Wang
2022-02-15 8:28 ` [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR Zhang, Qi Z
2 siblings, 0 replies; 15+ messages in thread
From: Jie Wang @ 2022-02-15 8:25 UTC (permalink / raw)
To: dev; +Cc: stevex.yang, jingjing.wu, beilei.xing, qi.z.zhang, Jie Wang
Add support for L2TPv2(include PPP over L2TPv2) protocols FDIR
based on outer MAC src/dst address and L2TPv2 session ID.
Add support for PPPoL2TPv2oUDP protocols FDIR based on inner IP
src/dst address and UDP/TCP src/dst port.
Patterns are listed below:
eth/ipv4(6)/udp/l2tpv2
eth/ipv4(6)/udp/l2tpv2/ppp
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)/udp
eth/ipv4(6)/udp/l2tpv2/ppp/ipv4(6)/tcp
Signed-off-by: Jie Wang <jie1x.wang@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
---
doc/guides/rel_notes/release_22_03.rst | 4 +
drivers/net/iavf/iavf_fdir.c | 169 +++++++++++++++++++++----
drivers/net/iavf/iavf_generic_flow.h | 4 +
3 files changed, 149 insertions(+), 28 deletions(-)
diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst
index 223b91a200..41923f50e6 100644
--- a/doc/guides/rel_notes/release_22_03.rst
+++ b/doc/guides/rel_notes/release_22_03.rst
@@ -113,6 +113,10 @@ New Features
* Added L2TPv2(include PPP over L2TPv2) RSS support based on outer
MAC src/dst address and L2TPv2 session ID.
+ * Added L2TPv2(include PPP over L2TPv2) FDIR support based on outer
+ MAC src/dst address and L2TPv2 session ID.
+ * Added PPPoL2TPv2oUDP FDIR distribute packets based on inner IP
+ src/dst address and UDP/TCP src/dst port.
* **Updated Wangxun ngbe driver.**
diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index b63aaca91d..e9a3566c0d 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -168,6 +168,31 @@
IAVF_FDIR_INSET_GRE_IPV6 | IAVF_INSET_TUN_UDP_SRC_PORT | \
IAVF_INSET_TUN_UDP_DST_PORT)
+#define IAVF_FDIR_INSET_L2TPV2 (\
+ IAVF_INSET_SMAC | IAVF_INSET_DMAC | IAVF_INSET_L2TPV2)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 (\
+ IAVF_INSET_TUN_IPV4_SRC | IAVF_INSET_TUN_IPV4_DST)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 | IAVF_INSET_TUN_UDP_SRC_PORT | \
+ IAVF_INSET_TUN_UDP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV4 | IAVF_INSET_TUN_TCP_SRC_PORT | \
+ IAVF_INSET_TUN_TCP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 (\
+ IAVF_INSET_TUN_IPV6_SRC | IAVF_INSET_TUN_IPV6_DST)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 | IAVF_INSET_TUN_UDP_SRC_PORT | \
+ IAVF_INSET_TUN_UDP_DST_PORT)
+
+#define IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP (\
+ IAVF_FDIR_INSET_L2TPV2_PPP_IPV6 | IAVF_INSET_TUN_TCP_SRC_PORT | \
+ IAVF_INSET_TUN_TCP_DST_PORT)
+
static struct iavf_pattern_match_item iavf_fdir_pattern[] = {
{iavf_pattern_ethertype, IAVF_FDIR_INSET_ETH, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4, IAVF_FDIR_INSET_ETH_IPV4, IAVF_INSET_NONE},
@@ -275,6 +300,23 @@ static struct iavf_pattern_match_item iavf_fdir_pattern[] = {
{iavf_pattern_eth_ipv6_gre_ipv6, IAVF_FDIR_INSET_GRE_IPV6, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_gre_ipv6_tcp, IAVF_FDIR_INSET_GRE_IPV6_TCP, IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_gre_ipv6_udp, IAVF_FDIR_INSET_GRE_IPV6_UDP, IAVF_INSET_NONE},
+
+ {iavf_pattern_eth_ipv4_udp_l2tpv2, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp, IAVF_FDIR_INSET_L2TPV2, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv4_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV4_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv6_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_udp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_UDP, IAVF_INSET_NONE},
+ {iavf_pattern_eth_ipv6_udp_l2tpv2_ppp_ipv6_tcp, IAVF_FDIR_INSET_L2TPV2_PPP_IPV6_TCP, IAVF_INSET_NONE},
};
static struct iavf_flow_parser iavf_fdir_parser;
@@ -694,6 +736,8 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
const struct rte_flow_item_pfcp *pfcp_spec, *pfcp_mask;
const struct rte_flow_item_ecpri *ecpri_spec, *ecpri_mask;
const struct rte_flow_item_gre *gre_spec, *gre_mask;
+ const struct rte_flow_item_l2tpv2 *l2tpv2_spec, *l2tpv2_mask;
+ const struct rte_flow_item_ppp *ppp_spec, *ppp_mask;
const struct rte_flow_item *item = pattern;
struct virtchnl_proto_hdr *hdr, *hdr1 = NULL;
struct rte_ecpri_common_hdr ecpri_common;
@@ -701,7 +745,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
enum rte_flow_item_type item_type;
enum rte_flow_item_type next_type;
uint8_t tun_inner = 0;
- uint16_t ether_type;
+ uint16_t ether_type, flags_version;
int layer = 0;
uint8_t ipv6_addr_mask[16] = {
@@ -739,37 +783,41 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
}
if (eth_spec && eth_mask) {
- if (!rte_is_zero_ether_addr(ð_mask->src) ||
- !rte_is_zero_ether_addr(ð_mask->dst)) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM, item,
- "Invalid MAC_addr mask.");
- return -rte_errno;
+ if (!rte_is_zero_ether_addr(ð_mask->dst)) {
+ input_set |= IAVF_INSET_DMAC;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1,
+ ETH,
+ DST);
+ } else if (!rte_is_zero_ether_addr(ð_mask->src)) {
+ input_set |= IAVF_INSET_SMAC;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1,
+ ETH,
+ SRC);
}
- }
- if (eth_spec && eth_mask && eth_mask->type) {
- if (eth_mask->type != RTE_BE16(0xffff)) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM,
- item, "Invalid type mask.");
- return -rte_errno;
+ if (eth_mask->type) {
+ if (eth_mask->type != RTE_BE16(0xffff)) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item, "Invalid type mask.");
+ return -rte_errno;
+ }
+
+ ether_type = rte_be_to_cpu_16(eth_spec->type);
+ if (ether_type == RTE_ETHER_TYPE_IPV4 ||
+ ether_type == RTE_ETHER_TYPE_IPV6) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_ITEM,
+ item,
+ "Unsupported ether_type.");
+ return -rte_errno;
+ }
+
+ input_set |= IAVF_INSET_ETHERTYPE;
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1, ETH,
+ ETHERTYPE);
}
- ether_type = rte_be_to_cpu_16(eth_spec->type);
- if (ether_type == RTE_ETHER_TYPE_IPV4 ||
- ether_type == RTE_ETHER_TYPE_IPV6) {
- rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM,
- item,
- "Unsupported ether_type.");
- return -rte_errno;
- }
-
- input_set |= IAVF_INSET_ETHERTYPE;
- VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr1, ETH,
- ETHERTYPE);
-
rte_memcpy(hdr1->buffer, eth_spec,
sizeof(struct rte_ether_hdr));
}
@@ -1319,6 +1367,71 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
hdrs->count = ++layer;
break;
+ case RTE_FLOW_ITEM_TYPE_L2TPV2:
+ l2tpv2_spec = item->spec;
+ l2tpv2_mask = item->mask;
+
+ hdr = &hdrs->proto_hdr[layer];
+
+ VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, L2TPV2);
+
+ if (l2tpv2_spec && l2tpv2_mask) {
+ flags_version =
+ rte_be_to_cpu_16(l2tpv2_spec->hdr.common.flags_version);
+ if ((flags_version == RTE_L2TPV2_MSG_TYPE_CONTROL &&
+ l2tpv2_mask->hdr.type3.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA &&
+ l2tpv2_mask->hdr.type7.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L &&
+ l2tpv2_mask->hdr.type6.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_S &&
+ l2tpv2_mask->hdr.type5.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_O &&
+ l2tpv2_mask->hdr.type4.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_S &&
+ l2tpv2_mask->hdr.type3.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_O &&
+ l2tpv2_mask->hdr.type2.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_S_O &&
+ l2tpv2_mask->hdr.type1.session_id == UINT16_MAX) ||
+ (flags_version == RTE_L2TPV2_MSG_TYPE_DATA_L_S_O &&
+ l2tpv2_mask->hdr.type0.session_id == UINT16_MAX)) {
+ input_set |= IAVF_L2TPV2_SESSION_ID;
+ if (flags_version & IAVF_L2TPV2_FLAGS_LEN)
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr,
+ L2TPV2,
+ LEN_SESS_ID);
+ else
+ VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr,
+ L2TPV2,
+ SESS_ID);
+ }
+
+ rte_memcpy(hdr->buffer, l2tpv2_spec,
+ sizeof(*l2tpv2_spec));
+ }
+
+ tun_inner = 1;
+
+ hdrs->count = ++layer;
+ break;
+
+ case RTE_FLOW_ITEM_TYPE_PPP:
+ ppp_spec = item->spec;
+ ppp_mask = item->mask;
+
+ hdr = &hdrs->proto_hdr[layer];
+
+ VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, PPP);
+
+ if (ppp_spec && ppp_mask) {
+ rte_memcpy(hdr->buffer, ppp_spec,
+ sizeof(*ppp_spec));
+ }
+
+ hdrs->count = ++layer;
+ break;
+
case RTE_FLOW_ITEM_TYPE_VOID:
break;
diff --git a/drivers/net/iavf/iavf_generic_flow.h b/drivers/net/iavf/iavf_generic_flow.h
index 107bbc1a23..f6af176073 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -35,6 +35,7 @@
#define IAVF_PROT_L2TPV3OIP (1ULL << 24)
#define IAVF_PROT_PFCP (1ULL << 25)
#define IAVF_PROT_ECPRI (1ULL << 26)
+#define IAVF_PROT_L2TPV2 (1ULL << 27)
/* field */
@@ -62,6 +63,7 @@
#define IAVF_PFCP_SEID (1ULL << 43)
#define IAVF_ECPRI_PC_RTC_ID (1ULL << 42)
#define IAVF_IP_PKID (1ULL << 41)
+#define IAVF_L2TPV2_SESSION_ID (1ULL << 40)
/* input set */
@@ -175,6 +177,8 @@
(IAVF_PROT_PFCP | IAVF_PFCP_S_FIELD | IAVF_PFCP_SEID)
#define IAVF_INSET_ECPRI \
(IAVF_PROT_ECPRI | IAVF_ECPRI_PC_RTC_ID)
+#define IAVF_INSET_L2TPV2 \
+ (IAVF_PROT_L2TPV2 | IAVF_L2TPV2_SESSION_ID)
/* empty pattern */
extern enum rte_flow_item_type iavf_pattern_empty[];
--
2.25.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* RE: [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR
2022-02-15 8:25 ` [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
2022-02-15 8:25 ` [PATCH v4 1/2] net/iavf: support L2TPv2 for AVF RSS Jie Wang
2022-02-15 8:25 ` [PATCH v4 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
@ 2022-02-15 8:28 ` Zhang, Qi Z
2 siblings, 0 replies; 15+ messages in thread
From: Zhang, Qi Z @ 2022-02-15 8:28 UTC (permalink / raw)
To: Wang, Jie1X, dev; +Cc: Yang, SteveX, Wu, Jingjing, Xing, Beilei
> -----Original Message-----
> From: Wang, Jie1X <jie1x.wang@intel.com>
> Sent: Tuesday, February 15, 2022 4:26 PM
> To: dev@dpdk.org
> Cc: Yang, SteveX <stevex.yang@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Xing, Beilei <beilei.xing@intel.com>; Zhang, Qi Z
> <qi.z.zhang@intel.com>; Wang, Jie1X <jie1x.wang@intel.com>
> Subject: [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR
>
> Support L2TPv2(include PPP over L2tpv2) for AVF RSS and FDIR based on outer
> MAC src/dst address and L2TPv2 session ID.
>
> Support PPPoL2TPv2oUDP for AVF FDIR based on inner IP src/dst address and
> TCP/UDP src/dst port.
>
> ---
> v4: rebase main branch.
> v3: update commit log and release notes.
> v2: upadte release notes.
>
> Jie Wang (2):
> net/iavf: support L2TPv2 for AVF RSS
> net/iavf: support L2TPv2 for AVF FDIR
>
> doc/guides/rel_notes/release_22_03.rst | 9 ++
> drivers/net/iavf/iavf.h | 2 +
> drivers/net/iavf/iavf_fdir.c | 169 +++++++++++++++++++++----
> drivers/net/iavf/iavf_generic_flow.c | 34 +++++
> drivers/net/iavf/iavf_generic_flow.h | 10 ++
> drivers/net/iavf/iavf_hash.c | 81 +++++++++++-
> 6 files changed, 273 insertions(+), 32 deletions(-)
>
> --
> 2.25.1
Applied to dpdk-next-net-intel.
Thanks
Qi
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2022-02-15 8:28 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-11 2:21 [PATCH 0/2] support L2TPv2 for AVF RSS hash and FDIR Jie Wang
2022-02-11 2:21 ` [PATCH 1/2] net/iavf: support L2TPv2 for AVF HASH Jie Wang
2022-02-11 2:21 ` [PATCH 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
2022-02-11 7:36 ` [PATCH v2 0/2] support L2TPv2 for AVF RSS hash and FDIR Jie Wang
2022-02-11 7:36 ` [PATCH v2 1/2] net/iavf: support L2TPv2 for AVF HASH Jie Wang
2022-02-11 7:36 ` [PATCH v2 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
2022-02-11 8:09 ` [PATCH v3 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
2022-02-11 8:09 ` [PATCH v3 1/2] net/iavf: support L2TPv2 for AVF RSS Jie Wang
2022-02-15 2:00 ` Xing, Beilei
2022-02-11 8:09 ` [PATCH v3 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
2022-02-11 8:14 ` Xing, Beilei
2022-02-15 8:25 ` [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR Jie Wang
2022-02-15 8:25 ` [PATCH v4 1/2] net/iavf: support L2TPv2 for AVF RSS Jie Wang
2022-02-15 8:25 ` [PATCH v4 2/2] net/iavf: support L2TPv2 for AVF FDIR Jie Wang
2022-02-15 8:28 ` [PATCH v4 0/2] support L2TPv2 for AVF RSS and FDIR Zhang, Qi Z
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.