* [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 [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 [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 [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 [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 [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 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 [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
* [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 [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 [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 a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).