[dpdk-dev] [PATCH 4/4] maintainers: update for e1000

2021-04-27 Thread Jeff Guo
Remove Jeff Guo from the maintainers list of e1000 pmd.

Signed-off-by: Jeff Guo 
---
 MAINTAINERS | 1 -
 1 file changed, 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index b0fbdf2..4732b6e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -674,7 +674,6 @@ F: doc/guides/nics/hinic.rst
 F: doc/guides/nics/features/hinic.ini
 
 Intel e1000
-M: Jeff Guo 
 M: Haiyue Wang 
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/e1000/
-- 
2.7.4



[dpdk-dev] [PATCH 3/4] maintainers: update for ixgbe

2021-04-27 Thread Jeff Guo
Remove Jeff Guo from the maintainers list of ixgbe pmd.

Signed-off-by: Jeff Guo 
---
 MAINTAINERS | 1 -
 1 file changed, 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 7e0e13d..b0fbdf2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -684,7 +684,6 @@ F: doc/guides/nics/features/e1000.ini
 F: doc/guides/nics/features/igb*.ini
 
 Intel ixgbe
-M: Jeff Guo 
 M: Haiyue Wang 
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/ixgbe/
-- 
2.7.4



[dpdk-dev] [PATCH 2/4] maintainers: update for i40e

2021-04-27 Thread Jeff Guo
Remove Jeff Guo from the maintainers list of i40e pmd.

Signed-off-by: Jeff Guo 
---
 MAINTAINERS | 1 -
 1 file changed, 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 9a0c4d2..7e0e13d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -694,7 +694,6 @@ F: doc/guides/nics/features/ixgbe*.ini
 
 Intel i40e
 M: Beilei Xing 
-M: Jeff Guo 
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/i40e/
 F: doc/guides/nics/i40e.rst
-- 
2.7.4



[dpdk-dev] [PATCH 1/4] maintainers: update for igc

2021-04-27 Thread Jeff Guo
Remove Jeff Guo from the maintainers list of igc pmd.

Signed-off-by: Jeff Guo 
---
 MAINTAINERS | 1 -
 1 file changed, 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 44f3d32..9a0c4d2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -726,7 +726,6 @@ F: doc/guides/nics/ice.rst
 F: doc/guides/nics/features/ice.ini
 
 Intel igc
-M: Jeff Guo 
 M: Haiyue Wang 
 T: git://dpdk.org/next/dpdk-next-net-intel
 F: drivers/net/igc/
-- 
2.7.4



[dpdk-dev] [PATCH 0/4] maintainers: update for igc/e1000/ixgbe/i40e

2021-04-27 Thread Jeff Guo
Remove Jeff Guo from the maintainers list of igc/e1000/ixgbe/i40e pmds.

Jeff Guo (4):
  maintainers: update for igc
  maintainers: update for i40e
  maintainers: update for ixgbe
  maintainers: update for e1000

 MAINTAINERS | 4 
 1 file changed, 4 deletions(-)

-- 
2.7.4



[dpdk-dev] [PATCH v6 2/3] net/ice: support RSS hash for IP fragment

2021-04-13 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_generic_flow.c | 21 ++
 drivers/net/ice/ice_generic_flow.h |  6 
 drivers/net/ice/ice_hash.c | 46 --
 3 files changed, 65 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/ice_generic_flow.c 
b/drivers/net/ice/ice_generic_flow.c
index 8704812622..2389bc6637 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -212,6 +212,27 @@ enum rte_flow_item_type pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_IPV6,
RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/ice/ice_generic_flow.h 
b/drivers/net/ice/ice_generic_flow.h
index 9f422e5925..2afe719264 100644
--- a/drivers/net/ice/ice_generic_flow.h
+++ b/drivers/net/ice/ice_generic_flow.h
@@ -52,6 +52,7 @@
 #define ICE_L2TPV3OIP_SESSION_ID   BIT_ULL(43)
 #define ICE_PFCP_SEID  BIT_ULL(42)
 #define ICE_PFCP_S_FIELD   BIT_ULL(41)
+#define ICE_IP_PK_ID   BIT_ULL(40)
 
 /* input set */
 
@@ -69,11 +70,13 @@
 #define ICE_INSET_IPV4_TOS (ICE_PROT_IPV4 | ICE_IP_TOS)
 #define ICE_INSET_IPV4_PROTO   (ICE_PROT_IPV4 | ICE_IP_PROTO)
 #define ICE_INSET_IPV4_TTL (ICE_PROT_IPV4 | ICE_IP_TTL)
+#define ICE_INSET_IPV4_PKID(ICE_PROT_IPV4 | ICE_IP_PK_ID)
 #define ICE_INSET_IPV6_SRC (ICE_PROT_IPV6 | ICE_IP_SRC)
 #define ICE_INSET_IPV6_DST (ICE_PROT_IPV6 | ICE_IP_DST)
 #define ICE_INSET_IPV6_NEXT_HDR(ICE_PROT_IPV6 | ICE_IP_PROTO)
 #define ICE_INSET_IPV6_HOP_LIMIT   (ICE_PROT_IPV6 | ICE_IP_TTL)
 #define ICE_INSET_IPV6_TC  (ICE_PROT_IPV6 | ICE_IP_TOS)
+#define ICE_INSET_IPV6_PKID(ICE_PROT_IPV6 | ICE_IP_PK_ID)
 
 #define ICE_INSET_TCP_SRC_PORT (ICE_PROT_TCP | ICE_SPORT)
 #define ICE_INSET_TCP_DST_PORT (ICE_PROT_TCP | ICE_DPORT)
@@ -202,6 +205,9 @@ extern enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type pattern_eth_ipv6[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c
index e56cdf9941..75b6947625 100644
--- a/drivers/net/ice/ice_hash.c
+++ b/drivers/net/ice/ice_hash.c
@@ -47,8 +47,10 @@
 ETH_RSS_NONFRAG_IPV6_TCP   | \
 ETH_RSS_NONFRAG_IPV6_SCTP)
 
-#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | VALID_RSS_IPV4_L4)
-#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | VALID_RSS_IPV6_L4)
+#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
+VALID_RSS_IPV4_L4)
+#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | \
+VALID_RSS_IPV6_L4)
 #define VALID_RSS_L3   (VALID_RSS_IPV4 | VALID_RSS_IPV6)
 #define VALID_RSS_L4   (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
 
@@ -108,6 +110,7 @@ ice_hash_parse_pattern_action(struct ice_adapter *ad,
 /* Rss configuration template */
 struct ice_rss_hash_cfg ipv4_tmplt = {
ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
ICE_FLOW_SEG_HDR_IPV_OTHER,
ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV4,
ICE_RSS_OUTER_HEADERS,
@@ -146,6 +149,15 @@ struct ice_rss_hash_cfg ipv6_tmplt = {
0
 };
 
+struct ice_rss_hash_cfg ipv6_frag_tmplt = {
+   ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
+   ICE_FLOW_SEG_HDR_IPV_OTHER,
+   ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV6,
+   ICE_RSS_ANY_HEADERS,
+   0
+};
+
 struct

[dpdk-dev] [PATCH v6 1/3] net/ice/base: support IP fragment RSS and FDIR

2021-04-13 Thread Jeff Guo
Add support for IP fragment RSS hash and FDIR according to packet ID.
Separate IP fragment and IP other packet types.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_fdir.c | 50 +++--
 drivers/net/ice/base/ice_fdir.h | 22 ---
 drivers/net/ice/base/ice_flow.c | 50 -
 drivers/net/ice/base/ice_flow.h |  9 --
 drivers/net/ice/base/ice_type.h |  1 +
 5 files changed, 122 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ice/base/ice_fdir.c b/drivers/net/ice/base/ice_fdir.c
index 8f9c0d346b..c1b14783ac 100644
--- a/drivers/net/ice/base/ice_fdir.c
+++ b/drivers/net/ice/base/ice_fdir.c
@@ -518,6 +518,24 @@ static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
+static const u8 ice_fdir_ipv6_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x2C, 0x40, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static const u8 ice_fdir_ipv4_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+   0x00, 0x14, 0x00, 0x00, 0x20, 0x00, 0x40, 0x10,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00
+};
 static const u8 ice_fdir_tcpv6_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
@@ -716,6 +734,16 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
},
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV4,
+   sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
+   sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
+   },
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV6,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   },
{
ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
sizeof(ice_fdir_ipv4_gtpu4_pkt),
@@ -1505,7 +1533,7 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
if (frag)
-   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
+   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
@@ -1808,6 +1836,23 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
  input->ip.v6.proto);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
+  input->ip.v4.src_ip);
+   ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
+  input->ip.v4.dst_ip);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+   ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
+  input->ip.v4.packet_id);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
+   ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
+ input->ip.v4.proto);
+   ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
+   break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
+  input->ip.v6.packet_id);
+   break;
default:
return ICE_ERR_PARAM;
}
@@ -1838,7 +1883,8 @@ ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 
*pkt, bool frag)
  */
 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
 {
-   if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
+   if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
+   flow == ICE_FLTR_PTYPE_FRAG_IPV6)
return true;
else
return false;
diff --git a/drivers/net/ice/base/ice_fdir.h b/drivers/net/ice/base/ice_fdir.h
index 6573f96bc1..2acc1d6f1b 100644
--- a/drivers/net/ice/base/ice_fdir.h
+++ b/drivers/net/ice/base/ice_fdir.h
@@ -43,9 +43,11 @@
 #define ICE_MAC_ETHTYPE_OFFSET 12
 #define ICE

[dpdk-dev] [PATCH v6 0/3] support flow for IP fragment in ICE

2021-04-13 Thread Jeff Guo
Support RSS hash and FDIR for IP fragment packets in ICE PMD.

v6:
fix uninitialize issue
v5:
rebase code.
v4:
correct typo when define fragment
v3:
rebase code and fix some parsing issues.
v2:
add some input check

Jeff Guo (3):
  net/ice/base: support IP fragment RSS and FDIR
  net/ice: support RSS hash for IP fragment
  net/ice: support FDIR for IP fragment packet

 drivers/net/ice/base/ice_fdir.c|  50 +++-
 drivers/net/ice/base/ice_fdir.h|  22 +-
 drivers/net/ice/base/ice_flow.c|  50 +++-
 drivers/net/ice/base/ice_flow.h|   9 ++-
 drivers/net/ice/base/ice_type.h|   1 +
 drivers/net/ice/ice_fdir_filter.c  | 118 ++---
 drivers/net/ice/ice_generic_flow.c |  22 ++
 drivers/net/ice/ice_generic_flow.h |   6 ++
 drivers/net/ice/ice_hash.c |  46 +--
 9 files changed, 294 insertions(+), 30 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v6 3/3] net/ice: support FDIR for IP fragment packet

2021-04-13 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Jeff Guo 
Signed-off-by: Ting Xu 
Reviewed-by: Ting Xu 
---
 drivers/net/ice/ice_fdir_filter.c  | 118 ++---
 drivers/net/ice/ice_generic_flow.c |   1 +
 2 files changed, 107 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ice/ice_fdir_filter.c 
b/drivers/net/ice/ice_fdir_filter.c
index 92e18d59cc..8a01c8c997 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -24,7 +24,7 @@
 #define ICE_FDIR_INSET_ETH_IPV4 (\
ICE_FDIR_INSET_ETH | \
ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_TOS | \
-   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO)
+   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO | ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV4_UDP (\
ICE_FDIR_INSET_ETH_IPV4 | \
@@ -41,7 +41,8 @@
 #define ICE_FDIR_INSET_ETH_IPV6 (\
ICE_INSET_DMAC | \
ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_TC | \
-   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR)
+   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR | \
+   ICE_INSET_IPV6_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV6_UDP (\
ICE_FDIR_INSET_ETH_IPV6 | \
@@ -56,7 +57,8 @@
ICE_INSET_SCTP_SRC_PORT | ICE_INSET_SCTP_DST_PORT)
 
 #define ICE_FDIR_INSET_IPV4 (\
-   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST)
+   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \
+   ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_IPV4_TCP (\
ICE_FDIR_INSET_IPV4 | \
@@ -95,6 +97,7 @@ static struct ice_pattern_match_item ice_fdir_pattern_list[] 
= {
{pattern_eth_ipv4_tcp,  
ICE_FDIR_INSET_ETH_IPV4_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv4_sctp, 
ICE_FDIR_INSET_ETH_IPV4_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6,  
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
+   {pattern_eth_ipv6_frag_ext, 
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_udp,  
ICE_FDIR_INSET_ETH_IPV6_UDP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_tcp,  
ICE_FDIR_INSET_ETH_IPV6_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_sctp, 
ICE_FDIR_INSET_ETH_IPV6_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
@@ -882,11 +885,13 @@ ice_fdir_input_set_parse(uint64_t inset, enum 
ice_flow_field *field)
{ICE_INSET_IPV4_TOS, ICE_FLOW_FIELD_IDX_IPV4_DSCP},
{ICE_INSET_IPV4_TTL, ICE_FLOW_FIELD_IDX_IPV4_TTL},
{ICE_INSET_IPV4_PROTO, ICE_FLOW_FIELD_IDX_IPV4_PROT},
+   {ICE_INSET_IPV4_PKID, ICE_FLOW_FIELD_IDX_IPV4_ID},
{ICE_INSET_IPV6_SRC, ICE_FLOW_FIELD_IDX_IPV6_SA},
{ICE_INSET_IPV6_DST, ICE_FLOW_FIELD_IDX_IPV6_DA},
{ICE_INSET_IPV6_TC, ICE_FLOW_FIELD_IDX_IPV6_DSCP},
{ICE_INSET_IPV6_NEXT_HDR, ICE_FLOW_FIELD_IDX_IPV6_PROT},
{ICE_INSET_IPV6_HOP_LIMIT, ICE_FLOW_FIELD_IDX_IPV6_TTL},
+   {ICE_INSET_IPV6_PKID, ICE_FLOW_FIELD_IDX_IPV6_ID},
{ICE_INSET_TCP_SRC_PORT, ICE_FLOW_FIELD_IDX_TCP_SRC_PORT},
{ICE_INSET_TCP_DST_PORT, ICE_FLOW_FIELD_IDX_TCP_DST_PORT},
{ICE_INSET_UDP_SRC_PORT, ICE_FLOW_FIELD_IDX_UDP_SRC_PORT},
@@ -936,6 +941,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
  ICE_FLOW_SEG_HDR_IPV6 |
@@ -955,6 +964,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
ICE_FLOW_SEG_HDR_IPV4 |
@@ -1599,8 +1612,10 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter 
*ad,
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
enum

[dpdk-dev] [PATCH v5 3/3] net/ice: support FDIR for IP fragment packet

2021-04-13 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Jeff Guo 
Signed-off-by: Ting Xu 
---
 drivers/net/ice/ice_fdir_filter.c  | 116 ++---
 drivers/net/ice/ice_generic_flow.c |   1 +
 2 files changed, 106 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ice/ice_fdir_filter.c 
b/drivers/net/ice/ice_fdir_filter.c
index 92e18d59cc..8158f75f05 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -24,7 +24,7 @@
 #define ICE_FDIR_INSET_ETH_IPV4 (\
ICE_FDIR_INSET_ETH | \
ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_TOS | \
-   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO)
+   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO | ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV4_UDP (\
ICE_FDIR_INSET_ETH_IPV4 | \
@@ -41,7 +41,8 @@
 #define ICE_FDIR_INSET_ETH_IPV6 (\
ICE_INSET_DMAC | \
ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_TC | \
-   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR)
+   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR | \
+   ICE_INSET_IPV6_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV6_UDP (\
ICE_FDIR_INSET_ETH_IPV6 | \
@@ -56,7 +57,8 @@
ICE_INSET_SCTP_SRC_PORT | ICE_INSET_SCTP_DST_PORT)
 
 #define ICE_FDIR_INSET_IPV4 (\
-   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST)
+   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \
+   ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_IPV4_TCP (\
ICE_FDIR_INSET_IPV4 | \
@@ -95,6 +97,7 @@ static struct ice_pattern_match_item ice_fdir_pattern_list[] 
= {
{pattern_eth_ipv4_tcp,  
ICE_FDIR_INSET_ETH_IPV4_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv4_sctp, 
ICE_FDIR_INSET_ETH_IPV4_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6,  
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
+   {pattern_eth_ipv6_frag_ext, 
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_udp,  
ICE_FDIR_INSET_ETH_IPV6_UDP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_tcp,  
ICE_FDIR_INSET_ETH_IPV6_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_sctp, 
ICE_FDIR_INSET_ETH_IPV6_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
@@ -882,11 +885,13 @@ ice_fdir_input_set_parse(uint64_t inset, enum 
ice_flow_field *field)
{ICE_INSET_IPV4_TOS, ICE_FLOW_FIELD_IDX_IPV4_DSCP},
{ICE_INSET_IPV4_TTL, ICE_FLOW_FIELD_IDX_IPV4_TTL},
{ICE_INSET_IPV4_PROTO, ICE_FLOW_FIELD_IDX_IPV4_PROT},
+   {ICE_INSET_IPV4_PKID, ICE_FLOW_FIELD_IDX_IPV4_ID},
{ICE_INSET_IPV6_SRC, ICE_FLOW_FIELD_IDX_IPV6_SA},
{ICE_INSET_IPV6_DST, ICE_FLOW_FIELD_IDX_IPV6_DA},
{ICE_INSET_IPV6_TC, ICE_FLOW_FIELD_IDX_IPV6_DSCP},
{ICE_INSET_IPV6_NEXT_HDR, ICE_FLOW_FIELD_IDX_IPV6_PROT},
{ICE_INSET_IPV6_HOP_LIMIT, ICE_FLOW_FIELD_IDX_IPV6_TTL},
+   {ICE_INSET_IPV6_PKID, ICE_FLOW_FIELD_IDX_IPV6_ID},
{ICE_INSET_TCP_SRC_PORT, ICE_FLOW_FIELD_IDX_TCP_SRC_PORT},
{ICE_INSET_TCP_DST_PORT, ICE_FLOW_FIELD_IDX_TCP_DST_PORT},
{ICE_INSET_UDP_SRC_PORT, ICE_FLOW_FIELD_IDX_UDP_SRC_PORT},
@@ -936,6 +941,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
  ICE_FLOW_SEG_HDR_IPV6 |
@@ -955,6 +964,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
ICE_FLOW_SEG_HDR_IPV4 |
@@ -1599,8 +1612,10 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter 
*ad,
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
enum ice_fdir_tunnel_type tunnel_type

[dpdk-dev] [PATCH v5 1/3] net/ice/base: support IP fragment RSS and FDIR

2021-04-13 Thread Jeff Guo
Add support for IP fragment RSS hash and FDIR according to packet ID.
Separate IP fragment and IP other packet types.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_fdir.c | 50 +++--
 drivers/net/ice/base/ice_fdir.h | 22 ---
 drivers/net/ice/base/ice_flow.c | 50 -
 drivers/net/ice/base/ice_flow.h |  9 --
 drivers/net/ice/base/ice_type.h |  1 +
 5 files changed, 122 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ice/base/ice_fdir.c b/drivers/net/ice/base/ice_fdir.c
index 8f9c0d346b..c1b14783ac 100644
--- a/drivers/net/ice/base/ice_fdir.c
+++ b/drivers/net/ice/base/ice_fdir.c
@@ -518,6 +518,24 @@ static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
+static const u8 ice_fdir_ipv6_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x2C, 0x40, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static const u8 ice_fdir_ipv4_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+   0x00, 0x14, 0x00, 0x00, 0x20, 0x00, 0x40, 0x10,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00
+};
 static const u8 ice_fdir_tcpv6_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
@@ -716,6 +734,16 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
},
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV4,
+   sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
+   sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
+   },
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV6,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   },
{
ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
sizeof(ice_fdir_ipv4_gtpu4_pkt),
@@ -1505,7 +1533,7 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
if (frag)
-   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
+   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
@@ -1808,6 +1836,23 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
  input->ip.v6.proto);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
+  input->ip.v4.src_ip);
+   ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
+  input->ip.v4.dst_ip);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+   ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
+  input->ip.v4.packet_id);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
+   ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
+ input->ip.v4.proto);
+   ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
+   break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
+  input->ip.v6.packet_id);
+   break;
default:
return ICE_ERR_PARAM;
}
@@ -1838,7 +1883,8 @@ ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 
*pkt, bool frag)
  */
 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
 {
-   if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
+   if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
+   flow == ICE_FLTR_PTYPE_FRAG_IPV6)
return true;
else
return false;
diff --git a/drivers/net/ice/base/ice_fdir.h b/drivers/net/ice/base/ice_fdir.h
index 6573f96bc1..2acc1d6f1b 100644
--- a/drivers/net/ice/base/ice_fdir.h
+++ b/drivers/net/ice/base/ice_fdir.h
@@ -43,9 +43,11 @@
 #define ICE_MAC_ETHTYPE_OFFSET 12
 #define ICE

[dpdk-dev] [PATCH v5 0/3] support flow for IP fragment in ICE

2021-04-13 Thread Jeff Guo
Support RSS hash and FDIR for IP fragment packets in ICE PMD.

v5:
rebase code.
v4:
correct typo when define fragment
v3:
rebase code and fix some parsing issues.
v2:
add some input check

Jeff Guo (3):
  net/ice/base: support IP fragment RSS and FDIR
  net/ice: support RSS hash for IP fragment
  net/ice: support FDIR for IP fragment packet

 drivers/net/ice/base/ice_fdir.c|  50 -
 drivers/net/ice/base/ice_fdir.h|  22 +-
 drivers/net/ice/base/ice_flow.c|  50 -
 drivers/net/ice/base/ice_flow.h|   9 ++-
 drivers/net/ice/base/ice_type.h|   1 +
 drivers/net/ice/ice_fdir_filter.c  | 116 ++---
 drivers/net/ice/ice_generic_flow.c |  22 ++
 drivers/net/ice/ice_generic_flow.h |   6 ++
 drivers/net/ice/ice_hash.c |  46 ++--
 9 files changed, 293 insertions(+), 29 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v5 2/3] net/ice: support RSS hash for IP fragment

2021-04-13 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_generic_flow.c | 21 ++
 drivers/net/ice/ice_generic_flow.h |  6 
 drivers/net/ice/ice_hash.c | 46 --
 3 files changed, 65 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/ice_generic_flow.c 
b/drivers/net/ice/ice_generic_flow.c
index 8704812622..2389bc6637 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -212,6 +212,27 @@ enum rte_flow_item_type pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_IPV6,
RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/ice/ice_generic_flow.h 
b/drivers/net/ice/ice_generic_flow.h
index 9f422e5925..2afe719264 100644
--- a/drivers/net/ice/ice_generic_flow.h
+++ b/drivers/net/ice/ice_generic_flow.h
@@ -52,6 +52,7 @@
 #define ICE_L2TPV3OIP_SESSION_ID   BIT_ULL(43)
 #define ICE_PFCP_SEID  BIT_ULL(42)
 #define ICE_PFCP_S_FIELD   BIT_ULL(41)
+#define ICE_IP_PK_ID   BIT_ULL(40)
 
 /* input set */
 
@@ -69,11 +70,13 @@
 #define ICE_INSET_IPV4_TOS (ICE_PROT_IPV4 | ICE_IP_TOS)
 #define ICE_INSET_IPV4_PROTO   (ICE_PROT_IPV4 | ICE_IP_PROTO)
 #define ICE_INSET_IPV4_TTL (ICE_PROT_IPV4 | ICE_IP_TTL)
+#define ICE_INSET_IPV4_PKID(ICE_PROT_IPV4 | ICE_IP_PK_ID)
 #define ICE_INSET_IPV6_SRC (ICE_PROT_IPV6 | ICE_IP_SRC)
 #define ICE_INSET_IPV6_DST (ICE_PROT_IPV6 | ICE_IP_DST)
 #define ICE_INSET_IPV6_NEXT_HDR(ICE_PROT_IPV6 | ICE_IP_PROTO)
 #define ICE_INSET_IPV6_HOP_LIMIT   (ICE_PROT_IPV6 | ICE_IP_TTL)
 #define ICE_INSET_IPV6_TC  (ICE_PROT_IPV6 | ICE_IP_TOS)
+#define ICE_INSET_IPV6_PKID(ICE_PROT_IPV6 | ICE_IP_PK_ID)
 
 #define ICE_INSET_TCP_SRC_PORT (ICE_PROT_TCP | ICE_SPORT)
 #define ICE_INSET_TCP_DST_PORT (ICE_PROT_TCP | ICE_DPORT)
@@ -202,6 +205,9 @@ extern enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type pattern_eth_ipv6[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c
index e56cdf9941..75b6947625 100644
--- a/drivers/net/ice/ice_hash.c
+++ b/drivers/net/ice/ice_hash.c
@@ -47,8 +47,10 @@
 ETH_RSS_NONFRAG_IPV6_TCP   | \
 ETH_RSS_NONFRAG_IPV6_SCTP)
 
-#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | VALID_RSS_IPV4_L4)
-#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | VALID_RSS_IPV6_L4)
+#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
+VALID_RSS_IPV4_L4)
+#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | \
+VALID_RSS_IPV6_L4)
 #define VALID_RSS_L3   (VALID_RSS_IPV4 | VALID_RSS_IPV6)
 #define VALID_RSS_L4   (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
 
@@ -108,6 +110,7 @@ ice_hash_parse_pattern_action(struct ice_adapter *ad,
 /* Rss configuration template */
 struct ice_rss_hash_cfg ipv4_tmplt = {
ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
ICE_FLOW_SEG_HDR_IPV_OTHER,
ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV4,
ICE_RSS_OUTER_HEADERS,
@@ -146,6 +149,15 @@ struct ice_rss_hash_cfg ipv6_tmplt = {
0
 };
 
+struct ice_rss_hash_cfg ipv6_frag_tmplt = {
+   ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
+   ICE_FLOW_SEG_HDR_IPV_OTHER,
+   ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV6,
+   ICE_RSS_ANY_HEADERS,
+   0
+};
+
 struct

[dpdk-dev] [PATCH v4 1/3] net/ice/base: support IP fragment RSS and FDIR

2021-04-13 Thread Jeff Guo
Add support for IP fragment RSS hash and FDIR according to packet ID.
Separate IP fragment and IP other packet types.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_fdir.c | 50 +++--
 drivers/net/ice/base/ice_fdir.h | 22 ---
 drivers/net/ice/base/ice_flow.c | 50 -
 drivers/net/ice/base/ice_flow.h |  5 +++-
 drivers/net/ice/base/ice_type.h |  1 +
 5 files changed, 120 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/base/ice_fdir.c b/drivers/net/ice/base/ice_fdir.c
index 2b39c13127..a9a14b7445 100644
--- a/drivers/net/ice/base/ice_fdir.c
+++ b/drivers/net/ice/base/ice_fdir.c
@@ -518,6 +518,24 @@ static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
+static const u8 ice_fdir_ipv6_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x2C, 0x40, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static const u8 ice_fdir_ipv4_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+   0x00, 0x14, 0x00, 0x00, 0x20, 0x00, 0x40, 0x10,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00
+};
 static const u8 ice_fdir_tcpv6_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
@@ -716,6 +734,16 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
},
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV4,
+   sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
+   sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
+   },
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV6,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   },
{
ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
sizeof(ice_fdir_ipv4_gtpu4_pkt),
@@ -1505,7 +1533,7 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
if (frag)
-   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
+   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
@@ -1808,6 +1836,23 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
  input->ip.v6.proto);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
+  input->ip.v4.src_ip);
+   ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
+  input->ip.v4.dst_ip);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+   ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
+  input->ip.v4.packet_id);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
+   ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
+ input->ip.v4.proto);
+   ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
+   break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
+  input->ip.v6.packet_id);
+   break;
default:
return ICE_ERR_PARAM;
}
@@ -1838,7 +1883,8 @@ ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 
*pkt, bool frag)
  */
 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
 {
-   if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
+   if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
+   flow == ICE_FLTR_PTYPE_FRAG_IPV6)
return true;
else
return false;
diff --git a/drivers/net/ice/base/ice_fdir.h b/drivers/net/ice/base/ice_fdir.h
index 6573f96bc1..2acc1d6f1b 100644
--- a/drivers/net/ice/base/ice_fdir.h
+++ b/drivers/net/ice/base/ice_fdir.h
@@ -43,9 +43,11 @@
 #define ICE_MAC_ETHTYPE_OFFSET 12
 #define ICE

[dpdk-dev] [PATCH v4 3/3] net/ice: support FDIR for IP fragment packet

2021-04-13 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Jeff Guo 
Signed-off-by: Ting Xu 
---
 drivers/net/ice/ice_fdir_filter.c  | 116 ++---
 drivers/net/ice/ice_generic_flow.c |   1 +
 2 files changed, 106 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ice/ice_fdir_filter.c 
b/drivers/net/ice/ice_fdir_filter.c
index 92e18d59cc..8158f75f05 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -24,7 +24,7 @@
 #define ICE_FDIR_INSET_ETH_IPV4 (\
ICE_FDIR_INSET_ETH | \
ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_TOS | \
-   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO)
+   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO | ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV4_UDP (\
ICE_FDIR_INSET_ETH_IPV4 | \
@@ -41,7 +41,8 @@
 #define ICE_FDIR_INSET_ETH_IPV6 (\
ICE_INSET_DMAC | \
ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_TC | \
-   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR)
+   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR | \
+   ICE_INSET_IPV6_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV6_UDP (\
ICE_FDIR_INSET_ETH_IPV6 | \
@@ -56,7 +57,8 @@
ICE_INSET_SCTP_SRC_PORT | ICE_INSET_SCTP_DST_PORT)
 
 #define ICE_FDIR_INSET_IPV4 (\
-   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST)
+   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \
+   ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_IPV4_TCP (\
ICE_FDIR_INSET_IPV4 | \
@@ -95,6 +97,7 @@ static struct ice_pattern_match_item ice_fdir_pattern_list[] 
= {
{pattern_eth_ipv4_tcp,  
ICE_FDIR_INSET_ETH_IPV4_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv4_sctp, 
ICE_FDIR_INSET_ETH_IPV4_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6,  
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
+   {pattern_eth_ipv6_frag_ext, 
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_udp,  
ICE_FDIR_INSET_ETH_IPV6_UDP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_tcp,  
ICE_FDIR_INSET_ETH_IPV6_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_sctp, 
ICE_FDIR_INSET_ETH_IPV6_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
@@ -882,11 +885,13 @@ ice_fdir_input_set_parse(uint64_t inset, enum 
ice_flow_field *field)
{ICE_INSET_IPV4_TOS, ICE_FLOW_FIELD_IDX_IPV4_DSCP},
{ICE_INSET_IPV4_TTL, ICE_FLOW_FIELD_IDX_IPV4_TTL},
{ICE_INSET_IPV4_PROTO, ICE_FLOW_FIELD_IDX_IPV4_PROT},
+   {ICE_INSET_IPV4_PKID, ICE_FLOW_FIELD_IDX_IPV4_ID},
{ICE_INSET_IPV6_SRC, ICE_FLOW_FIELD_IDX_IPV6_SA},
{ICE_INSET_IPV6_DST, ICE_FLOW_FIELD_IDX_IPV6_DA},
{ICE_INSET_IPV6_TC, ICE_FLOW_FIELD_IDX_IPV6_DSCP},
{ICE_INSET_IPV6_NEXT_HDR, ICE_FLOW_FIELD_IDX_IPV6_PROT},
{ICE_INSET_IPV6_HOP_LIMIT, ICE_FLOW_FIELD_IDX_IPV6_TTL},
+   {ICE_INSET_IPV6_PKID, ICE_FLOW_FIELD_IDX_IPV6_ID},
{ICE_INSET_TCP_SRC_PORT, ICE_FLOW_FIELD_IDX_TCP_SRC_PORT},
{ICE_INSET_TCP_DST_PORT, ICE_FLOW_FIELD_IDX_TCP_DST_PORT},
{ICE_INSET_UDP_SRC_PORT, ICE_FLOW_FIELD_IDX_UDP_SRC_PORT},
@@ -936,6 +941,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
  ICE_FLOW_SEG_HDR_IPV6 |
@@ -955,6 +964,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
ICE_FLOW_SEG_HDR_IPV4 |
@@ -1599,8 +1612,10 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter 
*ad,
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
enum ice_fdir_tunnel_type tunnel_type

[dpdk-dev] [PATCH v4 2/3] net/ice: support RSS hash for IP fragment

2021-04-13 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_generic_flow.c | 21 +
 drivers/net/ice/ice_generic_flow.h |  6 
 drivers/net/ice/ice_hash.c | 48 +-
 3 files changed, 67 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/ice_generic_flow.c 
b/drivers/net/ice/ice_generic_flow.c
index 8704812622..2389bc6637 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -212,6 +212,27 @@ enum rte_flow_item_type pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_IPV6,
RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/ice/ice_generic_flow.h 
b/drivers/net/ice/ice_generic_flow.h
index 9f422e5925..2afe719264 100644
--- a/drivers/net/ice/ice_generic_flow.h
+++ b/drivers/net/ice/ice_generic_flow.h
@@ -52,6 +52,7 @@
 #define ICE_L2TPV3OIP_SESSION_ID   BIT_ULL(43)
 #define ICE_PFCP_SEID  BIT_ULL(42)
 #define ICE_PFCP_S_FIELD   BIT_ULL(41)
+#define ICE_IP_PK_ID   BIT_ULL(40)
 
 /* input set */
 
@@ -69,11 +70,13 @@
 #define ICE_INSET_IPV4_TOS (ICE_PROT_IPV4 | ICE_IP_TOS)
 #define ICE_INSET_IPV4_PROTO   (ICE_PROT_IPV4 | ICE_IP_PROTO)
 #define ICE_INSET_IPV4_TTL (ICE_PROT_IPV4 | ICE_IP_TTL)
+#define ICE_INSET_IPV4_PKID(ICE_PROT_IPV4 | ICE_IP_PK_ID)
 #define ICE_INSET_IPV6_SRC (ICE_PROT_IPV6 | ICE_IP_SRC)
 #define ICE_INSET_IPV6_DST (ICE_PROT_IPV6 | ICE_IP_DST)
 #define ICE_INSET_IPV6_NEXT_HDR(ICE_PROT_IPV6 | ICE_IP_PROTO)
 #define ICE_INSET_IPV6_HOP_LIMIT   (ICE_PROT_IPV6 | ICE_IP_TTL)
 #define ICE_INSET_IPV6_TC  (ICE_PROT_IPV6 | ICE_IP_TOS)
+#define ICE_INSET_IPV6_PKID(ICE_PROT_IPV6 | ICE_IP_PK_ID)
 
 #define ICE_INSET_TCP_SRC_PORT (ICE_PROT_TCP | ICE_SPORT)
 #define ICE_INSET_TCP_DST_PORT (ICE_PROT_TCP | ICE_DPORT)
@@ -202,6 +205,9 @@ extern enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type pattern_eth_ipv6[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c
index 7d7e7052da..9df20df550 100644
--- a/drivers/net/ice/ice_hash.c
+++ b/drivers/net/ice/ice_hash.c
@@ -47,8 +47,10 @@
 ETH_RSS_NONFRAG_IPV6_TCP   | \
 ETH_RSS_NONFRAG_IPV6_SCTP)
 
-#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | VALID_RSS_IPV4_L4)
-#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | VALID_RSS_IPV6_L4)
+#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
+VALID_RSS_IPV4_L4)
+#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | \
+VALID_RSS_IPV6_L4)
 #define VALID_RSS_L3   (VALID_RSS_IPV4 | VALID_RSS_IPV6)
 #define VALID_RSS_L4   (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
 
@@ -108,6 +110,7 @@ ice_hash_parse_pattern_action(struct ice_adapter *ad,
 /* Rss configuration template */
 struct ice_rss_hash_cfg ipv4_tmplt = {
ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
ICE_FLOW_SEG_HDR_IPV_OTHER,
ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV4,
ICE_RSS_OUTER_HEADERS,
@@ -146,6 +149,15 @@ struct ice_rss_hash_cfg ipv6_tmplt = {
0
 };
 
+struct ice_rss_hash_cfg ipv6_frag_tmplt = {
+   ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
+   ICE_FLOW_SEG_HDR_IPV_OTHER,
+   ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV6,
+   ICE_RSS_ANY_HEADERS,
+   0
+};
+
 struct

[dpdk-dev] [PATCH v4 0/3] support flow for IP fragment in ICE

2021-04-13 Thread Jeff Guo
Support RSS hash and FDIR for IP fragment packets in ICE PMD.

v4:
correct typo when define fragment
v3:
rebase code and fix some parsing issues.
v2:
add some input check

Jeff Guo (3):
  net/ice/base: support IP fragment RSS and FDIR
  net/ice: support RSS hash for IP fragment
  net/ice: support FDIR for IP fragment packet

 drivers/net/ice/base/ice_fdir.c|  50 -
 drivers/net/ice/base/ice_fdir.h|  22 +-
 drivers/net/ice/base/ice_flow.c|  50 -
 drivers/net/ice/base/ice_flow.h|   5 +-
 drivers/net/ice/base/ice_type.h|   1 +
 drivers/net/ice/ice_fdir_filter.c  | 116 ++---
 drivers/net/ice/ice_generic_flow.c |  22 ++
 drivers/net/ice/ice_generic_flow.h |   6 ++
 drivers/net/ice/ice_hash.c |  48 ++--
 9 files changed, 293 insertions(+), 27 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v4 3/4] net/iavf: support RSS hash for IP fragment

2021-04-13 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_generic_flow.c | 24 
 drivers/net/iavf/iavf_generic_flow.h |  3 +
 drivers/net/iavf/iavf_hash.c | 83 
 3 files changed, 100 insertions(+), 10 deletions(-)

diff --git a/drivers/net/iavf/iavf_generic_flow.c 
b/drivers/net/iavf/iavf_generic_flow.c
index 8635ff83ca..242bb4abc5 100644
--- a/drivers/net/iavf/iavf_generic_flow.c
+++ b/drivers/net/iavf/iavf_generic_flow.c
@@ -219,6 +219,30 @@ enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_END,
 };
 
+enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/iavf/iavf_generic_flow.h 
b/drivers/net/iavf/iavf_generic_flow.h
index 005eeb3553..32932557ca 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -203,6 +203,9 @@ extern enum rte_flow_item_type 
iavf_pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type iavf_pattern_eth_ipv6[];
 extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index d8d22f8009..5d3d62839b 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -112,6 +112,10 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED} }
 
+#define proto_hdr_ipv6_frag { \
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG, \
+   FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG_PKID), {BUFF_NOUSED} }
+
 #define proto_hdr_ipv6_with_prot { \
VIRTCHNL_PROTO_HDR_IPV6, \
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
@@ -190,6 +194,12 @@ struct virtchnl_proto_hdrs outer_ipv6_tmplt = {
{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6}
 };
 
+struct virtchnl_proto_hdrs outer_ipv6_frag_tmplt = {
+   TUNNEL_LEVEL_OUTER, 5,
+   {proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
+proto_hdr_ipv6, proto_hdr_ipv6_frag}
+};
+
 struct virtchnl_proto_hdrs outer_ipv6_udp_tmplt = {
TUNNEL_LEVEL_OUTER, 5,
{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
@@ -303,7 +313,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 /* rss type super set */
 
 /* IPv4 outer */
-#define IAVF_RSS_TYPE_OUTER_IPV4   (ETH_RSS_ETH | ETH_RSS_IPV4)
+#define IAVF_RSS_TYPE_OUTER_IPV4   (ETH_RSS_ETH | ETH_RSS_IPV4 | \
+ETH_RSS_FRAG_IPV4)
 #define IAVF_RSS_TYPE_OUTER_IPV4_UDP   (IAVF_RSS_TYPE_OUTER_IPV4 | \
 ETH_RSS_NONFRAG_IPV4_UDP)
 #define IAVF_RSS_TYPE_OUTER_IPV4_TCP   (IAVF_RSS_TYPE_OUTER_IPV4 | \
@@ -312,6 +323,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 ETH_RSS_NONFRAG_IPV4_SCTP)
 /* IPv6 outer */
 #define IAVF_RSS_TYPE_OUTER_IPV6   (ETH_RSS_ETH | ETH_RSS_IPV6)
+#define IAVF_RSS_TYPE_OUTER_IPV6_FRAG  (IAVF_RSS_TYPE_OUTER_IPV6 | \
+ETH_RSS_FRAG_IPV6)
 #define IAVF_RSS_TYPE_OUTER_IPV6_UDP   (IAVF_RSS_TYPE_OUTER_IPV6 | \
 ETH_RSS_NONFRAG_IPV6_UDP)
 #define IAVF_RSS_TYPE_OUTER_IPV6_TCP   (IAVF_RSS_TYPE_OUTER_IPV6 | \
@@ -330,6 +343,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 /* VLAN IPv6 */
 #define IAVF_RSS_TYPE_VLAN_IPV6(IAVF_RSS_TYPE_OUTER_IPV6 | \
 ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
+#define IAVF_RSS_TYPE_VLAN_IPV6_FRAG   (IAVF_RSS_TYPE_OUTER_IPV6_FRAG

[dpdk-dev] [PATCH v4 1/4] app/testpmd: add packet id for IP fragment

2021-04-13 Thread Jeff Guo
Add the new items to support the flow configuration for IP fragment
packets.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 app/test-pmd/cmdline_flow.c | 21 -
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index fb7a3a8bd3..46ae342b85 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -166,6 +166,7 @@ enum index {
ITEM_VLAN_HAS_MORE_VLAN,
ITEM_IPV4,
ITEM_IPV4_TOS,
+   ITEM_IPV4_ID,
ITEM_IPV4_FRAGMENT_OFFSET,
ITEM_IPV4_TTL,
ITEM_IPV4_PROTO,
@@ -236,6 +237,7 @@ enum index {
ITEM_IPV6_FRAG_EXT,
ITEM_IPV6_FRAG_EXT_NEXT_HDR,
ITEM_IPV6_FRAG_EXT_FRAG_DATA,
+   ITEM_IPV6_FRAG_EXT_ID,
ITEM_ICMP6,
ITEM_ICMP6_TYPE,
ITEM_ICMP6_CODE,
@@ -1028,6 +1030,7 @@ static const enum index item_vlan[] = {
 
 static const enum index item_ipv4[] = {
ITEM_IPV4_TOS,
+   ITEM_IPV4_ID,
ITEM_IPV4_FRAGMENT_OFFSET,
ITEM_IPV4_TTL,
ITEM_IPV4_PROTO,
@@ -1164,6 +1167,7 @@ static const enum index item_ipv6_ext[] = {
 static const enum index item_ipv6_frag_ext[] = {
ITEM_IPV6_FRAG_EXT_NEXT_HDR,
ITEM_IPV6_FRAG_EXT_FRAG_DATA,
+   ITEM_IPV6_FRAG_EXT_ID,
ITEM_NEXT,
ZERO,
 };
@@ -2466,6 +2470,13 @@ static const struct token token_list[] = {
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv4,
 hdr.type_of_service)),
},
+   [ITEM_IPV4_ID] = {
+   .name = "packet_id",
+   .help = "fragment packet id",
+   .next = NEXT(item_ipv4, NEXT_ENTRY(UNSIGNED), item_param),
+   .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv4,
+hdr.packet_id)),
+   },
[ITEM_IPV4_FRAGMENT_OFFSET] = {
.name = "fragment_offset",
.help = "fragmentation flags and fragment offset",
@@ -2969,12 +2980,20 @@ static const struct token token_list[] = {
},
[ITEM_IPV6_FRAG_EXT_FRAG_DATA] = {
.name = "frag_data",
-   .help = "Fragment flags and offset",
+   .help = "fragment flags and offset",
.next = NEXT(item_ipv6_frag_ext, NEXT_ENTRY(UNSIGNED),
 item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv6_frag_ext,
 hdr.frag_data)),
},
+   [ITEM_IPV6_FRAG_EXT_ID] = {
+   .name = "packet_id",
+   .help = "fragment packet id",
+   .next = NEXT(item_ipv6_frag_ext, NEXT_ENTRY(UNSIGNED),
+item_param),
+   .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv6_frag_ext,
+hdr.id)),
+   },
[ITEM_ICMP6] = {
.name = "icmp6",
.help = "match any ICMPv6 header",
-- 
2.20.1



[dpdk-dev] [PATCH v4 4/4] net/iavf: support FDIR for IP fragment packet

2021-04-13 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_fdir.c | 386 ++-
 drivers/net/iavf/iavf_generic_flow.h |   5 +
 2 files changed, 267 insertions(+), 124 deletions(-)

diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index 62f032985a..f238a83c84 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -34,7 +34,7 @@
 #define IAVF_FDIR_INSET_ETH_IPV4 (\
IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
IAVF_INSET_IPV4_PROTO | IAVF_INSET_IPV4_TOS | \
-   IAVF_INSET_IPV4_TTL)
+   IAVF_INSET_IPV4_TTL | IAVF_INSET_IPV4_ID)
 
 #define IAVF_FDIR_INSET_ETH_IPV4_UDP (\
IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
@@ -56,6 +56,9 @@
IAVF_INSET_IPV6_NEXT_HDR | IAVF_INSET_IPV6_TC | \
IAVF_INSET_IPV6_HOP_LIMIT)
 
+#define IAVF_FDIR_INSET_ETH_IPV6_FRAG_EXT (\
+   IAVF_INSET_IPV6_ID)
+
 #define IAVF_FDIR_INSET_ETH_IPV6_UDP (\
IAVF_INSET_IPV6_SRC | IAVF_INSET_IPV6_DST | \
IAVF_INSET_IPV6_TC | IAVF_INSET_IPV6_HOP_LIMIT | \
@@ -143,6 +146,7 @@ static struct iavf_pattern_match_item iavf_fdir_pattern[] = 
{
{iavf_pattern_eth_ipv4_tcp,  IAVF_FDIR_INSET_ETH_IPV4_TCP,  
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4_sctp, IAVF_FDIR_INSET_ETH_IPV4_SCTP, 
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6,  IAVF_FDIR_INSET_ETH_IPV6,  
IAVF_INSET_NONE},
+   {iavf_pattern_eth_ipv6_frag_ext,
IAVF_FDIR_INSET_ETH_IPV6_FRAG_EXT,  IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_udp,  IAVF_FDIR_INSET_ETH_IPV6_UDP,  
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_tcp,  IAVF_FDIR_INSET_ETH_IPV6_TCP,  
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_sctp, IAVF_FDIR_INSET_ETH_IPV6_SCTP, 
IAVF_INSET_NONE},
@@ -543,6 +547,29 @@ iavf_fdir_refine_input_set(const uint64_t input_set,
}
 }
 
+static void
+iavf_fdir_add_fragment_hdr(struct virtchnl_proto_hdrs *hdrs, int layer)
+{
+   struct virtchnl_proto_hdr *hdr1;
+   struct virtchnl_proto_hdr *hdr2;
+   int i;
+
+   if (layer < 0 || layer > hdrs->count)
+   return;
+
+   /* shift headers layer */
+   for (i = hdrs->count; i >= layer; i--) {
+   hdr1 = &hdrs->proto_hdr[i];
+   hdr2 = &hdrs->proto_hdr[i - 1];
+   *hdr1 = *hdr2;
+   }
+
+   /* adding dummy fragment header */
+   hdr1 = &hdrs->proto_hdr[layer];
+   VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4_FRAG);
+   hdrs->count = ++layer;
+}
+
 static int
 iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
const struct rte_flow_item pattern[],
@@ -550,12 +577,15 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
struct rte_flow_error *error,
struct iavf_fdir_conf *filter)
 {
-   const struct rte_flow_item *item = pattern;
-   enum rte_flow_item_type item_type;
+   struct virtchnl_proto_hdrs *hdrs =
+   &filter->add_fltr.rule_cfg.proto_hdrs;
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
const struct rte_flow_item_eth *eth_spec, *eth_mask;
-   const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_mask;
+   const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_last, *ipv4_mask;
const struct rte_flow_item_ipv6 *ipv6_spec, *ipv6_mask;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_spec;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_last;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_mask;
const struct rte_flow_item_udp *udp_spec, *udp_mask;
const struct rte_flow_item_tcp *tcp_spec, *tcp_mask;
const struct rte_flow_item_sctp *sctp_spec, *sctp_mask;
@@ -566,15 +596,15 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
const struct rte_flow_item_ah *ah_spec, *ah_mask;
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 *item = pattern;
+   struct virtchnl_proto_hdr *hdr, *hdr1 = NULL;
struct rte_ecpri_common_hdr ecpri_common;
uint64_t input_set = IAVF_INSET_NONE;
-
+   enum rte_flow_item_type item_type;
enum rte_flow_item_type next_type;
+   uint8_t tun_inner = 0;
uint16_t ether_type;
-
-   u8 tun_inner = 0;
int layer = 0;
-   struct virtchnl_proto_hdr *hdr;
 
uint8_t  ipv6_addr_mask[16] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
@@ -582,26 +612,28 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
};
 
for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
-   if (ite

[dpdk-dev] [PATCH v4 2/4] common/iavf: add proto header for IP fragment

2021-04-13 Thread Jeff Guo
Add new virtchnl protocol header type and fields for IP fragment packets
to support RSS hash and FDIR.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/common/iavf/virtchnl.h | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/drivers/common/iavf/virtchnl.h b/drivers/common/iavf/virtchnl.h
index 6b99e170f0..e3eb767d66 100644
--- a/drivers/common/iavf/virtchnl.h
+++ b/drivers/common/iavf/virtchnl.h
@@ -1415,7 +1415,9 @@ enum virtchnl_proto_hdr_type {
VIRTCHNL_PROTO_HDR_S_VLAN,
VIRTCHNL_PROTO_HDR_C_VLAN,
VIRTCHNL_PROTO_HDR_IPV4,
+   VIRTCHNL_PROTO_HDR_IPV4_FRAG,
VIRTCHNL_PROTO_HDR_IPV6,
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG,
VIRTCHNL_PROTO_HDR_TCP,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_SCTP,
@@ -1452,6 +1454,8 @@ enum virtchnl_proto_hdr_field {
VIRTCHNL_PROTO_HDR_IPV4_DSCP,
VIRTCHNL_PROTO_HDR_IPV4_TTL,
VIRTCHNL_PROTO_HDR_IPV4_PROT,
+   VIRTCHNL_PROTO_HDR_IPV4_FRAG_PKID =
+   PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV4_FRAG),
/* IPV6 */
VIRTCHNL_PROTO_HDR_IPV6_SRC =
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6),
@@ -1472,6 +1476,9 @@ enum virtchnl_proto_hdr_field {
VIRTCHNL_PROTO_HDR_IPV6_PREFIX64_DST,
VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_SRC,
VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_DST,
+   /* IPv6 Extension Header Fragment */
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG_PKID =
+   PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG),
/* TCP */
VIRTCHNL_PROTO_HDR_TCP_SRC_PORT =
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_TCP),
-- 
2.20.1



[dpdk-dev] [PATCH v4 0/4] support flow for IP fragment in IAVF

2021-04-13 Thread Jeff Guo
support flow for IP fragment in IAVF

v4:
add some part which should not be deleted
v3:
rebase code and fix some parsing issues
v2:
refine some input check

Jeff Guo (4):
  app/testpmd: add packet id for IP fragment
  common/iavf: add proto header for IP fragment
  net/iavf: support RSS hash for IP fragment
  net/iavf: support FDIR for IP fragment packet

 app/test-pmd/cmdline_flow.c  |  21 +-
 drivers/common/iavf/virtchnl.h   |   7 +
 drivers/net/iavf/iavf_fdir.c | 386 ++-
 drivers/net/iavf/iavf_generic_flow.c |  24 ++
 drivers/net/iavf/iavf_generic_flow.h |   8 +
 drivers/net/iavf/iavf_hash.c |  83 +-
 6 files changed, 394 insertions(+), 135 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v4 2/3] net/ice: support RSS hash for IP fragment

2021-04-13 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_generic_flow.c | 21 +
 drivers/net/ice/ice_generic_flow.h |  6 
 drivers/net/ice/ice_hash.c | 48 +-
 3 files changed, 67 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/ice_generic_flow.c 
b/drivers/net/ice/ice_generic_flow.c
index 8704812622..2389bc6637 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -212,6 +212,27 @@ enum rte_flow_item_type pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_IPV6,
RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/ice/ice_generic_flow.h 
b/drivers/net/ice/ice_generic_flow.h
index 9f422e5925..2afe719264 100644
--- a/drivers/net/ice/ice_generic_flow.h
+++ b/drivers/net/ice/ice_generic_flow.h
@@ -52,6 +52,7 @@
 #define ICE_L2TPV3OIP_SESSION_ID   BIT_ULL(43)
 #define ICE_PFCP_SEID  BIT_ULL(42)
 #define ICE_PFCP_S_FIELD   BIT_ULL(41)
+#define ICE_IP_PK_ID   BIT_ULL(40)
 
 /* input set */
 
@@ -69,11 +70,13 @@
 #define ICE_INSET_IPV4_TOS (ICE_PROT_IPV4 | ICE_IP_TOS)
 #define ICE_INSET_IPV4_PROTO   (ICE_PROT_IPV4 | ICE_IP_PROTO)
 #define ICE_INSET_IPV4_TTL (ICE_PROT_IPV4 | ICE_IP_TTL)
+#define ICE_INSET_IPV4_PKID(ICE_PROT_IPV4 | ICE_IP_PK_ID)
 #define ICE_INSET_IPV6_SRC (ICE_PROT_IPV6 | ICE_IP_SRC)
 #define ICE_INSET_IPV6_DST (ICE_PROT_IPV6 | ICE_IP_DST)
 #define ICE_INSET_IPV6_NEXT_HDR(ICE_PROT_IPV6 | ICE_IP_PROTO)
 #define ICE_INSET_IPV6_HOP_LIMIT   (ICE_PROT_IPV6 | ICE_IP_TTL)
 #define ICE_INSET_IPV6_TC  (ICE_PROT_IPV6 | ICE_IP_TOS)
+#define ICE_INSET_IPV6_PKID(ICE_PROT_IPV6 | ICE_IP_PK_ID)
 
 #define ICE_INSET_TCP_SRC_PORT (ICE_PROT_TCP | ICE_SPORT)
 #define ICE_INSET_TCP_DST_PORT (ICE_PROT_TCP | ICE_DPORT)
@@ -202,6 +205,9 @@ extern enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type pattern_eth_ipv6[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c
index 7d7e7052da..9df20df550 100644
--- a/drivers/net/ice/ice_hash.c
+++ b/drivers/net/ice/ice_hash.c
@@ -47,8 +47,10 @@
 ETH_RSS_NONFRAG_IPV6_TCP   | \
 ETH_RSS_NONFRAG_IPV6_SCTP)
 
-#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | VALID_RSS_IPV4_L4)
-#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | VALID_RSS_IPV6_L4)
+#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
+VALID_RSS_IPV4_L4)
+#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | \
+VALID_RSS_IPV6_L4)
 #define VALID_RSS_L3   (VALID_RSS_IPV4 | VALID_RSS_IPV6)
 #define VALID_RSS_L4   (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
 
@@ -108,6 +110,7 @@ ice_hash_parse_pattern_action(struct ice_adapter *ad,
 /* Rss configuration template */
 struct ice_rss_hash_cfg ipv4_tmplt = {
ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
ICE_FLOW_SEG_HDR_IPV_OTHER,
ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV4,
ICE_RSS_OUTER_HEADERS,
@@ -146,6 +149,15 @@ struct ice_rss_hash_cfg ipv6_tmplt = {
0
 };
 
+struct ice_rss_hash_cfg ipv6_frag_tmplt = {
+   ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
+   ICE_FLOW_SEG_HDR_IPV_OTHER,
+   ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV6,
+   ICE_RSS_ANY_HEADERS,
+   0
+};
+
 struct

[dpdk-dev] [PATCH v4 3/3] net/ice: support FDIR for IP fragment packet

2021-04-13 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Jeff Guo 
Signed-off-by: Ting Xu 
---
 drivers/net/ice/base/ice_fdir.c|   4 +-
 drivers/net/ice/ice_fdir_filter.c  | 116 ++---
 drivers/net/ice/ice_generic_flow.c |   1 +
 3 files changed, 108 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ice/base/ice_fdir.c b/drivers/net/ice/base/ice_fdir.c
index 0eb7cdd729..a9a14b7445 100644
--- a/drivers/net/ice/base/ice_fdir.c
+++ b/drivers/net/ice/base/ice_fdir.c
@@ -736,8 +736,8 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
},
{
ICE_FLTR_PTYPE_FRAG_IPV4,
-   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
-   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
+   sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
+   sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
},
{
ICE_FLTR_PTYPE_FRAG_IPV6,
diff --git a/drivers/net/ice/ice_fdir_filter.c 
b/drivers/net/ice/ice_fdir_filter.c
index 92e18d59cc..8158f75f05 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -24,7 +24,7 @@
 #define ICE_FDIR_INSET_ETH_IPV4 (\
ICE_FDIR_INSET_ETH | \
ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_TOS | \
-   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO)
+   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO | ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV4_UDP (\
ICE_FDIR_INSET_ETH_IPV4 | \
@@ -41,7 +41,8 @@
 #define ICE_FDIR_INSET_ETH_IPV6 (\
ICE_INSET_DMAC | \
ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_TC | \
-   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR)
+   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR | \
+   ICE_INSET_IPV6_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV6_UDP (\
ICE_FDIR_INSET_ETH_IPV6 | \
@@ -56,7 +57,8 @@
ICE_INSET_SCTP_SRC_PORT | ICE_INSET_SCTP_DST_PORT)
 
 #define ICE_FDIR_INSET_IPV4 (\
-   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST)
+   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \
+   ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_IPV4_TCP (\
ICE_FDIR_INSET_IPV4 | \
@@ -95,6 +97,7 @@ static struct ice_pattern_match_item ice_fdir_pattern_list[] 
= {
{pattern_eth_ipv4_tcp,  
ICE_FDIR_INSET_ETH_IPV4_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv4_sctp, 
ICE_FDIR_INSET_ETH_IPV4_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6,  
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
+   {pattern_eth_ipv6_frag_ext, 
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_udp,  
ICE_FDIR_INSET_ETH_IPV6_UDP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_tcp,  
ICE_FDIR_INSET_ETH_IPV6_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_sctp, 
ICE_FDIR_INSET_ETH_IPV6_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
@@ -882,11 +885,13 @@ ice_fdir_input_set_parse(uint64_t inset, enum 
ice_flow_field *field)
{ICE_INSET_IPV4_TOS, ICE_FLOW_FIELD_IDX_IPV4_DSCP},
{ICE_INSET_IPV4_TTL, ICE_FLOW_FIELD_IDX_IPV4_TTL},
{ICE_INSET_IPV4_PROTO, ICE_FLOW_FIELD_IDX_IPV4_PROT},
+   {ICE_INSET_IPV4_PKID, ICE_FLOW_FIELD_IDX_IPV4_ID},
{ICE_INSET_IPV6_SRC, ICE_FLOW_FIELD_IDX_IPV6_SA},
{ICE_INSET_IPV6_DST, ICE_FLOW_FIELD_IDX_IPV6_DA},
{ICE_INSET_IPV6_TC, ICE_FLOW_FIELD_IDX_IPV6_DSCP},
{ICE_INSET_IPV6_NEXT_HDR, ICE_FLOW_FIELD_IDX_IPV6_PROT},
{ICE_INSET_IPV6_HOP_LIMIT, ICE_FLOW_FIELD_IDX_IPV6_TTL},
+   {ICE_INSET_IPV6_PKID, ICE_FLOW_FIELD_IDX_IPV6_ID},
{ICE_INSET_TCP_SRC_PORT, ICE_FLOW_FIELD_IDX_TCP_SRC_PORT},
{ICE_INSET_TCP_DST_PORT, ICE_FLOW_FIELD_IDX_TCP_DST_PORT},
{ICE_INSET_UDP_SRC_PORT, ICE_FLOW_FIELD_IDX_UDP_SRC_PORT},
@@ -936,6 +941,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
  ICE_FLOW_SEG_HDR_IPV6 |
@@ -955,6 +964,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct

[dpdk-dev] [PATCH v4 1/3] net/ice/base: support IP fragment RSS and FDIR

2021-04-13 Thread Jeff Guo
Add support for IP fragment RSS hash and FDIR according to packet ID.
Separate IP fragment and IP other packet types.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_fdir.c | 50 +++--
 drivers/net/ice/base/ice_fdir.h | 22 ---
 drivers/net/ice/base/ice_flow.c | 50 -
 drivers/net/ice/base/ice_flow.h |  5 +++-
 drivers/net/ice/base/ice_type.h |  1 +
 5 files changed, 120 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/base/ice_fdir.c b/drivers/net/ice/base/ice_fdir.c
index 2b39c13127..0eb7cdd729 100644
--- a/drivers/net/ice/base/ice_fdir.c
+++ b/drivers/net/ice/base/ice_fdir.c
@@ -518,6 +518,24 @@ static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
+static const u8 ice_fdir_ipv6_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x2C, 0x40, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static const u8 ice_fdir_ipv4_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+   0x00, 0x14, 0x00, 0x00, 0x20, 0x00, 0x40, 0x10,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00
+};
 static const u8 ice_fdir_tcpv6_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
@@ -716,6 +734,16 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
},
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV4,
+   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
+   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
+   },
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV6,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   },
{
ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
sizeof(ice_fdir_ipv4_gtpu4_pkt),
@@ -1505,7 +1533,7 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
if (frag)
-   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
+   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
@@ -1808,6 +1836,23 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
  input->ip.v6.proto);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
+  input->ip.v4.src_ip);
+   ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
+  input->ip.v4.dst_ip);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+   ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
+  input->ip.v4.packet_id);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
+   ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
+ input->ip.v4.proto);
+   ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
+   break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
+  input->ip.v6.packet_id);
+   break;
default:
return ICE_ERR_PARAM;
}
@@ -1838,7 +1883,8 @@ ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 
*pkt, bool frag)
  */
 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
 {
-   if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
+   if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
+   flow == ICE_FLTR_PTYPE_FRAG_IPV6)
return true;
else
return false;
diff --git a/drivers/net/ice/base/ice_fdir.h b/drivers/net/ice/base/ice_fdir.h
index 6573f96bc1..2acc1d6f1b 100644
--- a/drivers/net/ice/base/ice_fdir.h
+++ b/drivers/net/ice/base/ice_fdir.h
@@ -43,9 +43,11 @@
 #define ICE_MAC_ETHTYPE_OFFSET 12
 #define ICE_IPV4_TOS_OFFSET

[dpdk-dev] [PATCH v4 0/3] support flow for IP fragment in ICE

2021-04-13 Thread Jeff Guo
Support RSS hash and FDIR for IP fragment packets in ICE PMD.

v4:
correct typo when define fragment
v3:
rebase code and fix some parsing issues.
v2:
add some input check

Jeff Guo (3):
  net/ice/base: support IP fragment RSS and FDIR
  net/ice: support RSS hash for IP fragment
  net/ice: support FDIR for IP fragment packet

 drivers/net/ice/base/ice_fdir.c|  50 -
 drivers/net/ice/base/ice_fdir.h|  22 +-
 drivers/net/ice/base/ice_flow.c|  50 -
 drivers/net/ice/base/ice_flow.h|   5 +-
 drivers/net/ice/base/ice_type.h|   1 +
 drivers/net/ice/ice_fdir_filter.c  | 116 ++---
 drivers/net/ice/ice_generic_flow.c |  22 ++
 drivers/net/ice/ice_generic_flow.h |   6 ++
 drivers/net/ice/ice_hash.c |  48 ++--
 9 files changed, 293 insertions(+), 27 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v3 4/4] net/iavf: support FDIR for IP fragment packet

2021-04-11 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_fdir.c | 376 ++-
 drivers/net/iavf/iavf_generic_flow.h |   5 +
 2 files changed, 257 insertions(+), 124 deletions(-)

diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index 62f032985a..f6db4f5ac8 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -34,7 +34,7 @@
 #define IAVF_FDIR_INSET_ETH_IPV4 (\
IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
IAVF_INSET_IPV4_PROTO | IAVF_INSET_IPV4_TOS | \
-   IAVF_INSET_IPV4_TTL)
+   IAVF_INSET_IPV4_TTL | IAVF_INSET_IPV4_ID)
 
 #define IAVF_FDIR_INSET_ETH_IPV4_UDP (\
IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
@@ -56,6 +56,9 @@
IAVF_INSET_IPV6_NEXT_HDR | IAVF_INSET_IPV6_TC | \
IAVF_INSET_IPV6_HOP_LIMIT)
 
+#define IAVF_FDIR_INSET_ETH_IPV6_FRAG_EXT (\
+   IAVF_INSET_IPV6_ID)
+
 #define IAVF_FDIR_INSET_ETH_IPV6_UDP (\
IAVF_INSET_IPV6_SRC | IAVF_INSET_IPV6_DST | \
IAVF_INSET_IPV6_TC | IAVF_INSET_IPV6_HOP_LIMIT | \
@@ -143,6 +146,7 @@ static struct iavf_pattern_match_item iavf_fdir_pattern[] = 
{
{iavf_pattern_eth_ipv4_tcp,  IAVF_FDIR_INSET_ETH_IPV4_TCP,  
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4_sctp, IAVF_FDIR_INSET_ETH_IPV4_SCTP, 
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6,  IAVF_FDIR_INSET_ETH_IPV6,  
IAVF_INSET_NONE},
+   {iavf_pattern_eth_ipv6_frag_ext,
IAVF_FDIR_INSET_ETH_IPV6_FRAG_EXT,  IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_udp,  IAVF_FDIR_INSET_ETH_IPV6_UDP,  
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_tcp,  IAVF_FDIR_INSET_ETH_IPV6_TCP,  
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_sctp, IAVF_FDIR_INSET_ETH_IPV6_SCTP, 
IAVF_INSET_NONE},
@@ -543,6 +547,29 @@ iavf_fdir_refine_input_set(const uint64_t input_set,
}
 }
 
+static void
+iavf_fdir_add_fragment_hdr(struct virtchnl_proto_hdrs *hdrs, int layer)
+{
+   struct virtchnl_proto_hdr *hdr1;
+   struct virtchnl_proto_hdr *hdr2;
+   int i;
+
+   if (layer < 0 || layer > hdrs->count)
+   return;
+
+   /* shift headers layer */
+   for (i = hdrs->count; i >= layer; i--) {
+   hdr1 = &hdrs->proto_hdr[i];
+   hdr2 = &hdrs->proto_hdr[i - 1];
+   *hdr1 = *hdr2;
+   }
+
+   /* adding dummy fragment header */
+   hdr1 = &hdrs->proto_hdr[layer];
+   VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4_FRAG);
+   hdrs->count = ++layer;
+}
+
 static int
 iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
const struct rte_flow_item pattern[],
@@ -550,12 +577,15 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
struct rte_flow_error *error,
struct iavf_fdir_conf *filter)
 {
-   const struct rte_flow_item *item = pattern;
-   enum rte_flow_item_type item_type;
+   struct virtchnl_proto_hdrs *hdrs =
+   &filter->add_fltr.rule_cfg.proto_hdrs;
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
const struct rte_flow_item_eth *eth_spec, *eth_mask;
-   const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_mask;
+   const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_last, *ipv4_mask;
const struct rte_flow_item_ipv6 *ipv6_spec, *ipv6_mask;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_spec;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_last;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_mask;
const struct rte_flow_item_udp *udp_spec, *udp_mask;
const struct rte_flow_item_tcp *tcp_spec, *tcp_mask;
const struct rte_flow_item_sctp *sctp_spec, *sctp_mask;
@@ -566,15 +596,15 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
const struct rte_flow_item_ah *ah_spec, *ah_mask;
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 *item = pattern;
+   struct virtchnl_proto_hdr *hdr, *hdr1 = NULL;
struct rte_ecpri_common_hdr ecpri_common;
uint64_t input_set = IAVF_INSET_NONE;
-
+   enum rte_flow_item_type item_type;
enum rte_flow_item_type next_type;
+   uint8_t tun_inner = 0;
uint16_t ether_type;
-
-   u8 tun_inner = 0;
int layer = 0;
-   struct virtchnl_proto_hdr *hdr;
 
uint8_t  ipv6_addr_mask[16] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
@@ -582,26 +612,28 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
};
 
for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
-   if (ite

[dpdk-dev] [PATCH v3 3/4] net/iavf: support RSS hash for IP fragment

2021-04-11 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_generic_flow.c | 24 
 drivers/net/iavf/iavf_generic_flow.h |  3 +
 drivers/net/iavf/iavf_hash.c | 83 
 3 files changed, 100 insertions(+), 10 deletions(-)

diff --git a/drivers/net/iavf/iavf_generic_flow.c 
b/drivers/net/iavf/iavf_generic_flow.c
index 8635ff83ca..242bb4abc5 100644
--- a/drivers/net/iavf/iavf_generic_flow.c
+++ b/drivers/net/iavf/iavf_generic_flow.c
@@ -219,6 +219,30 @@ enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_END,
 };
 
+enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/iavf/iavf_generic_flow.h 
b/drivers/net/iavf/iavf_generic_flow.h
index 005eeb3553..32932557ca 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -203,6 +203,9 @@ extern enum rte_flow_item_type 
iavf_pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type iavf_pattern_eth_ipv6[];
 extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index d8d22f8009..5d3d62839b 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -112,6 +112,10 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED} }
 
+#define proto_hdr_ipv6_frag { \
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG, \
+   FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG_PKID), {BUFF_NOUSED} }
+
 #define proto_hdr_ipv6_with_prot { \
VIRTCHNL_PROTO_HDR_IPV6, \
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
@@ -190,6 +194,12 @@ struct virtchnl_proto_hdrs outer_ipv6_tmplt = {
{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6}
 };
 
+struct virtchnl_proto_hdrs outer_ipv6_frag_tmplt = {
+   TUNNEL_LEVEL_OUTER, 5,
+   {proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
+proto_hdr_ipv6, proto_hdr_ipv6_frag}
+};
+
 struct virtchnl_proto_hdrs outer_ipv6_udp_tmplt = {
TUNNEL_LEVEL_OUTER, 5,
{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
@@ -303,7 +313,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 /* rss type super set */
 
 /* IPv4 outer */
-#define IAVF_RSS_TYPE_OUTER_IPV4   (ETH_RSS_ETH | ETH_RSS_IPV4)
+#define IAVF_RSS_TYPE_OUTER_IPV4   (ETH_RSS_ETH | ETH_RSS_IPV4 | \
+ETH_RSS_FRAG_IPV4)
 #define IAVF_RSS_TYPE_OUTER_IPV4_UDP   (IAVF_RSS_TYPE_OUTER_IPV4 | \
 ETH_RSS_NONFRAG_IPV4_UDP)
 #define IAVF_RSS_TYPE_OUTER_IPV4_TCP   (IAVF_RSS_TYPE_OUTER_IPV4 | \
@@ -312,6 +323,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 ETH_RSS_NONFRAG_IPV4_SCTP)
 /* IPv6 outer */
 #define IAVF_RSS_TYPE_OUTER_IPV6   (ETH_RSS_ETH | ETH_RSS_IPV6)
+#define IAVF_RSS_TYPE_OUTER_IPV6_FRAG  (IAVF_RSS_TYPE_OUTER_IPV6 | \
+ETH_RSS_FRAG_IPV6)
 #define IAVF_RSS_TYPE_OUTER_IPV6_UDP   (IAVF_RSS_TYPE_OUTER_IPV6 | \
 ETH_RSS_NONFRAG_IPV6_UDP)
 #define IAVF_RSS_TYPE_OUTER_IPV6_TCP   (IAVF_RSS_TYPE_OUTER_IPV6 | \
@@ -330,6 +343,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 /* VLAN IPv6 */
 #define IAVF_RSS_TYPE_VLAN_IPV6(IAVF_RSS_TYPE_OUTER_IPV6 | \
 ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
+#define IAVF_RSS_TYPE_VLAN_IPV6_FRAG   (IAVF_RSS_TYPE_OUTER_IPV6_FRAG

[dpdk-dev] [PATCH v3 2/4] common/iavf: add proto header for IP fragment

2021-04-11 Thread Jeff Guo
Add new virtchnl protocol header type and fields for IP fragment packets
to support RSS hash and FDIR.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/common/iavf/virtchnl.h | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/drivers/common/iavf/virtchnl.h b/drivers/common/iavf/virtchnl.h
index 6b99e170f0..e3eb767d66 100644
--- a/drivers/common/iavf/virtchnl.h
+++ b/drivers/common/iavf/virtchnl.h
@@ -1415,7 +1415,9 @@ enum virtchnl_proto_hdr_type {
VIRTCHNL_PROTO_HDR_S_VLAN,
VIRTCHNL_PROTO_HDR_C_VLAN,
VIRTCHNL_PROTO_HDR_IPV4,
+   VIRTCHNL_PROTO_HDR_IPV4_FRAG,
VIRTCHNL_PROTO_HDR_IPV6,
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG,
VIRTCHNL_PROTO_HDR_TCP,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_SCTP,
@@ -1452,6 +1454,8 @@ enum virtchnl_proto_hdr_field {
VIRTCHNL_PROTO_HDR_IPV4_DSCP,
VIRTCHNL_PROTO_HDR_IPV4_TTL,
VIRTCHNL_PROTO_HDR_IPV4_PROT,
+   VIRTCHNL_PROTO_HDR_IPV4_FRAG_PKID =
+   PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV4_FRAG),
/* IPV6 */
VIRTCHNL_PROTO_HDR_IPV6_SRC =
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6),
@@ -1472,6 +1476,9 @@ enum virtchnl_proto_hdr_field {
VIRTCHNL_PROTO_HDR_IPV6_PREFIX64_DST,
VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_SRC,
VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_DST,
+   /* IPv6 Extension Header Fragment */
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG_PKID =
+   PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG),
/* TCP */
VIRTCHNL_PROTO_HDR_TCP_SRC_PORT =
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_TCP),
-- 
2.20.1



[dpdk-dev] [PATCH v3 1/4] app/testpmd: add packet id for IP fragment

2021-04-11 Thread Jeff Guo
Add the new items to support the flow configuration for IP fragment
packets.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 app/test-pmd/cmdline_flow.c | 21 -
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index fb7a3a8bd3..46ae342b85 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -166,6 +166,7 @@ enum index {
ITEM_VLAN_HAS_MORE_VLAN,
ITEM_IPV4,
ITEM_IPV4_TOS,
+   ITEM_IPV4_ID,
ITEM_IPV4_FRAGMENT_OFFSET,
ITEM_IPV4_TTL,
ITEM_IPV4_PROTO,
@@ -236,6 +237,7 @@ enum index {
ITEM_IPV6_FRAG_EXT,
ITEM_IPV6_FRAG_EXT_NEXT_HDR,
ITEM_IPV6_FRAG_EXT_FRAG_DATA,
+   ITEM_IPV6_FRAG_EXT_ID,
ITEM_ICMP6,
ITEM_ICMP6_TYPE,
ITEM_ICMP6_CODE,
@@ -1028,6 +1030,7 @@ static const enum index item_vlan[] = {
 
 static const enum index item_ipv4[] = {
ITEM_IPV4_TOS,
+   ITEM_IPV4_ID,
ITEM_IPV4_FRAGMENT_OFFSET,
ITEM_IPV4_TTL,
ITEM_IPV4_PROTO,
@@ -1164,6 +1167,7 @@ static const enum index item_ipv6_ext[] = {
 static const enum index item_ipv6_frag_ext[] = {
ITEM_IPV6_FRAG_EXT_NEXT_HDR,
ITEM_IPV6_FRAG_EXT_FRAG_DATA,
+   ITEM_IPV6_FRAG_EXT_ID,
ITEM_NEXT,
ZERO,
 };
@@ -2466,6 +2470,13 @@ static const struct token token_list[] = {
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv4,
 hdr.type_of_service)),
},
+   [ITEM_IPV4_ID] = {
+   .name = "packet_id",
+   .help = "fragment packet id",
+   .next = NEXT(item_ipv4, NEXT_ENTRY(UNSIGNED), item_param),
+   .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv4,
+hdr.packet_id)),
+   },
[ITEM_IPV4_FRAGMENT_OFFSET] = {
.name = "fragment_offset",
.help = "fragmentation flags and fragment offset",
@@ -2969,12 +2980,20 @@ static const struct token token_list[] = {
},
[ITEM_IPV6_FRAG_EXT_FRAG_DATA] = {
.name = "frag_data",
-   .help = "Fragment flags and offset",
+   .help = "fragment flags and offset",
.next = NEXT(item_ipv6_frag_ext, NEXT_ENTRY(UNSIGNED),
 item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv6_frag_ext,
 hdr.frag_data)),
},
+   [ITEM_IPV6_FRAG_EXT_ID] = {
+   .name = "packet_id",
+   .help = "fragment packet id",
+   .next = NEXT(item_ipv6_frag_ext, NEXT_ENTRY(UNSIGNED),
+item_param),
+   .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv6_frag_ext,
+hdr.id)),
+   },
[ITEM_ICMP6] = {
.name = "icmp6",
.help = "match any ICMPv6 header",
-- 
2.20.1



[dpdk-dev] [PATCH v3 0/4] support flow for IP fragment in IAVF

2021-04-11 Thread Jeff Guo
support flow for IP fragment in IAVF

v3:
rebase code and fix some parsing issues
v2:
refine some input check

Jeff Guo (4):
  app/testpmd: add packet id for IP fragment
  common/iavf: add proto header for IP fragment
  net/iavf: support RSS hash for IP fragment
  net/iavf: support FDIR for IP fragment packet

 app/test-pmd/cmdline_flow.c  |  21 +-
 drivers/common/iavf/virtchnl.h   |   7 +
 drivers/net/iavf/iavf_fdir.c | 376 ++-
 drivers/net/iavf/iavf_generic_flow.c |  24 ++
 drivers/net/iavf/iavf_generic_flow.h |   8 +
 drivers/net/iavf/iavf_hash.c |  83 +-
 6 files changed, 384 insertions(+), 135 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v3 3/3] net/ice: support FDIR for IP fragment packet

2021-04-11 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Jeff Guo 
Signed-off-by: Ting Xu 
---
 drivers/net/ice/ice_fdir_filter.c  | 116 ++---
 drivers/net/ice/ice_generic_flow.c |   1 +
 2 files changed, 106 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ice/ice_fdir_filter.c 
b/drivers/net/ice/ice_fdir_filter.c
index 92e18d59cc..8158f75f05 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -24,7 +24,7 @@
 #define ICE_FDIR_INSET_ETH_IPV4 (\
ICE_FDIR_INSET_ETH | \
ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_TOS | \
-   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO)
+   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO | ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV4_UDP (\
ICE_FDIR_INSET_ETH_IPV4 | \
@@ -41,7 +41,8 @@
 #define ICE_FDIR_INSET_ETH_IPV6 (\
ICE_INSET_DMAC | \
ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_TC | \
-   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR)
+   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR | \
+   ICE_INSET_IPV6_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV6_UDP (\
ICE_FDIR_INSET_ETH_IPV6 | \
@@ -56,7 +57,8 @@
ICE_INSET_SCTP_SRC_PORT | ICE_INSET_SCTP_DST_PORT)
 
 #define ICE_FDIR_INSET_IPV4 (\
-   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST)
+   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \
+   ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_IPV4_TCP (\
ICE_FDIR_INSET_IPV4 | \
@@ -95,6 +97,7 @@ static struct ice_pattern_match_item ice_fdir_pattern_list[] 
= {
{pattern_eth_ipv4_tcp,  
ICE_FDIR_INSET_ETH_IPV4_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv4_sctp, 
ICE_FDIR_INSET_ETH_IPV4_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6,  
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
+   {pattern_eth_ipv6_frag_ext, 
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_udp,  
ICE_FDIR_INSET_ETH_IPV6_UDP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_tcp,  
ICE_FDIR_INSET_ETH_IPV6_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_sctp, 
ICE_FDIR_INSET_ETH_IPV6_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
@@ -882,11 +885,13 @@ ice_fdir_input_set_parse(uint64_t inset, enum 
ice_flow_field *field)
{ICE_INSET_IPV4_TOS, ICE_FLOW_FIELD_IDX_IPV4_DSCP},
{ICE_INSET_IPV4_TTL, ICE_FLOW_FIELD_IDX_IPV4_TTL},
{ICE_INSET_IPV4_PROTO, ICE_FLOW_FIELD_IDX_IPV4_PROT},
+   {ICE_INSET_IPV4_PKID, ICE_FLOW_FIELD_IDX_IPV4_ID},
{ICE_INSET_IPV6_SRC, ICE_FLOW_FIELD_IDX_IPV6_SA},
{ICE_INSET_IPV6_DST, ICE_FLOW_FIELD_IDX_IPV6_DA},
{ICE_INSET_IPV6_TC, ICE_FLOW_FIELD_IDX_IPV6_DSCP},
{ICE_INSET_IPV6_NEXT_HDR, ICE_FLOW_FIELD_IDX_IPV6_PROT},
{ICE_INSET_IPV6_HOP_LIMIT, ICE_FLOW_FIELD_IDX_IPV6_TTL},
+   {ICE_INSET_IPV6_PKID, ICE_FLOW_FIELD_IDX_IPV6_ID},
{ICE_INSET_TCP_SRC_PORT, ICE_FLOW_FIELD_IDX_TCP_SRC_PORT},
{ICE_INSET_TCP_DST_PORT, ICE_FLOW_FIELD_IDX_TCP_DST_PORT},
{ICE_INSET_UDP_SRC_PORT, ICE_FLOW_FIELD_IDX_UDP_SRC_PORT},
@@ -936,6 +941,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
  ICE_FLOW_SEG_HDR_IPV6 |
@@ -955,6 +964,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
ICE_FLOW_SEG_HDR_IPV4 |
@@ -1599,8 +1612,10 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter 
*ad,
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
enum ice_fdir_tunnel_type tunnel_type

[dpdk-dev] [PATCH v3 2/3] net/ice: support RSS hash for IP fragment

2021-04-11 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_generic_flow.c | 21 +
 drivers/net/ice/ice_generic_flow.h |  6 
 drivers/net/ice/ice_hash.c | 48 +-
 3 files changed, 67 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/ice_generic_flow.c 
b/drivers/net/ice/ice_generic_flow.c
index 8704812622..2389bc6637 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -212,6 +212,27 @@ enum rte_flow_item_type pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_IPV6,
RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/ice/ice_generic_flow.h 
b/drivers/net/ice/ice_generic_flow.h
index 9f422e5925..2afe719264 100644
--- a/drivers/net/ice/ice_generic_flow.h
+++ b/drivers/net/ice/ice_generic_flow.h
@@ -52,6 +52,7 @@
 #define ICE_L2TPV3OIP_SESSION_ID   BIT_ULL(43)
 #define ICE_PFCP_SEID  BIT_ULL(42)
 #define ICE_PFCP_S_FIELD   BIT_ULL(41)
+#define ICE_IP_PK_ID   BIT_ULL(40)
 
 /* input set */
 
@@ -69,11 +70,13 @@
 #define ICE_INSET_IPV4_TOS (ICE_PROT_IPV4 | ICE_IP_TOS)
 #define ICE_INSET_IPV4_PROTO   (ICE_PROT_IPV4 | ICE_IP_PROTO)
 #define ICE_INSET_IPV4_TTL (ICE_PROT_IPV4 | ICE_IP_TTL)
+#define ICE_INSET_IPV4_PKID(ICE_PROT_IPV4 | ICE_IP_PK_ID)
 #define ICE_INSET_IPV6_SRC (ICE_PROT_IPV6 | ICE_IP_SRC)
 #define ICE_INSET_IPV6_DST (ICE_PROT_IPV6 | ICE_IP_DST)
 #define ICE_INSET_IPV6_NEXT_HDR(ICE_PROT_IPV6 | ICE_IP_PROTO)
 #define ICE_INSET_IPV6_HOP_LIMIT   (ICE_PROT_IPV6 | ICE_IP_TTL)
 #define ICE_INSET_IPV6_TC  (ICE_PROT_IPV6 | ICE_IP_TOS)
+#define ICE_INSET_IPV6_PKID(ICE_PROT_IPV6 | ICE_IP_PK_ID)
 
 #define ICE_INSET_TCP_SRC_PORT (ICE_PROT_TCP | ICE_SPORT)
 #define ICE_INSET_TCP_DST_PORT (ICE_PROT_TCP | ICE_DPORT)
@@ -202,6 +205,9 @@ extern enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type pattern_eth_ipv6[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c
index 7d7e7052da..9df20df550 100644
--- a/drivers/net/ice/ice_hash.c
+++ b/drivers/net/ice/ice_hash.c
@@ -47,8 +47,10 @@
 ETH_RSS_NONFRAG_IPV6_TCP   | \
 ETH_RSS_NONFRAG_IPV6_SCTP)
 
-#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | VALID_RSS_IPV4_L4)
-#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | VALID_RSS_IPV6_L4)
+#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
+VALID_RSS_IPV4_L4)
+#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | \
+VALID_RSS_IPV6_L4)
 #define VALID_RSS_L3   (VALID_RSS_IPV4 | VALID_RSS_IPV6)
 #define VALID_RSS_L4   (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
 
@@ -108,6 +110,7 @@ ice_hash_parse_pattern_action(struct ice_adapter *ad,
 /* Rss configuration template */
 struct ice_rss_hash_cfg ipv4_tmplt = {
ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
ICE_FLOW_SEG_HDR_IPV_OTHER,
ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV4,
ICE_RSS_OUTER_HEADERS,
@@ -146,6 +149,15 @@ struct ice_rss_hash_cfg ipv6_tmplt = {
0
 };
 
+struct ice_rss_hash_cfg ipv6_frag_tmplt = {
+   ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
+   ICE_FLOW_SEG_HDR_IPV_OTHER,
+   ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV6,
+   ICE_RSS_ANY_HEADERS,
+   0
+};
+
 struct

[dpdk-dev] [PATCH v3 1/3] net/ice/base: support IP fragment RSS and FDIR

2021-04-11 Thread Jeff Guo
Add support for IP fragment RSS hash and FDIR according to packet ID.
Separate IP fragment and IP other packet types.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_fdir.c | 50 +++--
 drivers/net/ice/base/ice_fdir.h | 22 ---
 drivers/net/ice/base/ice_flow.c | 50 -
 drivers/net/ice/base/ice_flow.h |  5 +++-
 drivers/net/ice/base/ice_type.h |  1 +
 5 files changed, 120 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/base/ice_fdir.c b/drivers/net/ice/base/ice_fdir.c
index 2b39c13127..0eb7cdd729 100644
--- a/drivers/net/ice/base/ice_fdir.c
+++ b/drivers/net/ice/base/ice_fdir.c
@@ -518,6 +518,24 @@ static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
+static const u8 ice_fdir_ipv6_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x2C, 0x40, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static const u8 ice_fdir_ipv4_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+   0x00, 0x14, 0x00, 0x00, 0x20, 0x00, 0x40, 0x10,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00
+};
 static const u8 ice_fdir_tcpv6_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
@@ -716,6 +734,16 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
},
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV4,
+   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
+   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
+   },
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV6,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   },
{
ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
sizeof(ice_fdir_ipv4_gtpu4_pkt),
@@ -1505,7 +1533,7 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
if (frag)
-   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
+   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
@@ -1808,6 +1836,23 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
  input->ip.v6.proto);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
+  input->ip.v4.src_ip);
+   ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
+  input->ip.v4.dst_ip);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+   ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
+  input->ip.v4.packet_id);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
+   ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
+ input->ip.v4.proto);
+   ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
+   break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
+  input->ip.v6.packet_id);
+   break;
default:
return ICE_ERR_PARAM;
}
@@ -1838,7 +1883,8 @@ ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 
*pkt, bool frag)
  */
 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
 {
-   if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
+   if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
+   flow == ICE_FLTR_PTYPE_FRAG_IPV6)
return true;
else
return false;
diff --git a/drivers/net/ice/base/ice_fdir.h b/drivers/net/ice/base/ice_fdir.h
index 6573f96bc1..2acc1d6f1b 100644
--- a/drivers/net/ice/base/ice_fdir.h
+++ b/drivers/net/ice/base/ice_fdir.h
@@ -43,9 +43,11 @@
 #define ICE_MAC_ETHTYPE_OFFSET 12
 #define ICE_IPV4_TOS_OFFSET

[dpdk-dev] [PATCH v3 0/3] support flow for IP fragment in ICE

2021-04-11 Thread Jeff Guo
Support RSS hash and FDIR for IP fragment packets in ICE PMD.

v3:
rebase code and fix some parsing issues.
v2:
add some input check

Jeff Guo (3):
  net/ice/base: support IP fragment RSS and FDIR
  net/ice: support RSS hash for IP fragment
  net/ice: support FDIR for IP fragment packet

 drivers/net/ice/base/ice_fdir.c|  50 -
 drivers/net/ice/base/ice_fdir.h|  22 +-
 drivers/net/ice/base/ice_flow.c|  50 -
 drivers/net/ice/base/ice_flow.h|   5 +-
 drivers/net/ice/base/ice_type.h|   1 +
 drivers/net/ice/ice_fdir_filter.c  | 116 ++---
 drivers/net/ice/ice_generic_flow.c |  22 ++
 drivers/net/ice/ice_generic_flow.h |   6 ++
 drivers/net/ice/ice_hash.c |  48 ++--
 9 files changed, 293 insertions(+), 27 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v3 0/3] support flow for IP fragment in ICE

2021-04-10 Thread Jeff Guo
Support RSS hash and FDIR for IP fragment packets in ICE PMD.

v3:
rebase code and fix some parsing issues.
v2:
add some input check

Jeff Guo (3):
  net/ice/base: support IP fragment RSS and FDIR
  net/ice: support RSS hash for IP fragment
  net/ice: support FDIR for IP fragment packet

 drivers/net/ice/base/ice_fdir.c|  50 -
 drivers/net/ice/base/ice_fdir.h|  22 +-
 drivers/net/ice/base/ice_flow.c|  50 -
 drivers/net/ice/base/ice_flow.h|   5 +-
 drivers/net/ice/base/ice_type.h|   1 +
 drivers/net/ice/ice_fdir_filter.c  | 116 ++---
 drivers/net/ice/ice_generic_flow.c |  22 ++
 drivers/net/ice/ice_generic_flow.h |   6 ++
 drivers/net/ice/ice_hash.c |  48 ++--
 9 files changed, 293 insertions(+), 27 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v3 3/3] net/ice: support FDIR for IP fragment packet

2021-04-10 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Jeff Guo 
Signed-off-by: Ting Xu 
---
 drivers/net/ice/ice_fdir_filter.c  | 116 ++---
 drivers/net/ice/ice_generic_flow.c |   1 +
 2 files changed, 106 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ice/ice_fdir_filter.c 
b/drivers/net/ice/ice_fdir_filter.c
index 92e18d59cc..093c83ed0c 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -24,7 +24,7 @@
 #define ICE_FDIR_INSET_ETH_IPV4 (\
ICE_FDIR_INSET_ETH | \
ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_TOS | \
-   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO)
+   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO | ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV4_UDP (\
ICE_FDIR_INSET_ETH_IPV4 | \
@@ -41,7 +41,8 @@
 #define ICE_FDIR_INSET_ETH_IPV6 (\
ICE_INSET_DMAC | \
ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_TC | \
-   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR)
+   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR | \
+   ICE_INSET_IPV6_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV6_UDP (\
ICE_FDIR_INSET_ETH_IPV6 | \
@@ -56,7 +57,8 @@
ICE_INSET_SCTP_SRC_PORT | ICE_INSET_SCTP_DST_PORT)
 
 #define ICE_FDIR_INSET_IPV4 (\
-   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST)
+   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \
+   ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_IPV4_TCP (\
ICE_FDIR_INSET_IPV4 | \
@@ -95,6 +97,7 @@ static struct ice_pattern_match_item ice_fdir_pattern_list[] 
= {
{pattern_eth_ipv4_tcp,  
ICE_FDIR_INSET_ETH_IPV4_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv4_sctp, 
ICE_FDIR_INSET_ETH_IPV4_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6,  
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
+   {pattern_eth_ipv6_frag_ext, 
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_udp,  
ICE_FDIR_INSET_ETH_IPV6_UDP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_tcp,  
ICE_FDIR_INSET_ETH_IPV6_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_sctp, 
ICE_FDIR_INSET_ETH_IPV6_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
@@ -882,11 +885,13 @@ ice_fdir_input_set_parse(uint64_t inset, enum 
ice_flow_field *field)
{ICE_INSET_IPV4_TOS, ICE_FLOW_FIELD_IDX_IPV4_DSCP},
{ICE_INSET_IPV4_TTL, ICE_FLOW_FIELD_IDX_IPV4_TTL},
{ICE_INSET_IPV4_PROTO, ICE_FLOW_FIELD_IDX_IPV4_PROT},
+   {ICE_INSET_IPV4_PKID, ICE_FLOW_FIELD_IDX_IPV4_ID},
{ICE_INSET_IPV6_SRC, ICE_FLOW_FIELD_IDX_IPV6_SA},
{ICE_INSET_IPV6_DST, ICE_FLOW_FIELD_IDX_IPV6_DA},
{ICE_INSET_IPV6_TC, ICE_FLOW_FIELD_IDX_IPV6_DSCP},
{ICE_INSET_IPV6_NEXT_HDR, ICE_FLOW_FIELD_IDX_IPV6_PROT},
{ICE_INSET_IPV6_HOP_LIMIT, ICE_FLOW_FIELD_IDX_IPV6_TTL},
+   {ICE_INSET_IPV6_PKID, ICE_FLOW_FIELD_IDX_IPV6_ID},
{ICE_INSET_TCP_SRC_PORT, ICE_FLOW_FIELD_IDX_TCP_SRC_PORT},
{ICE_INSET_TCP_DST_PORT, ICE_FLOW_FIELD_IDX_TCP_DST_PORT},
{ICE_INSET_UDP_SRC_PORT, ICE_FLOW_FIELD_IDX_UDP_SRC_PORT},
@@ -936,6 +941,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
  ICE_FLOW_SEG_HDR_IPV6 |
@@ -955,6 +964,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
ICE_FLOW_SEG_HDR_IPV4 |
@@ -1599,8 +1612,10 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter 
*ad,
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
enum ice_fdir_tunnel_type tunnel_type

[dpdk-dev] [PATCH v3 2/3] net/ice: support RSS hash for IP fragment

2021-04-10 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_generic_flow.c | 21 +
 drivers/net/ice/ice_generic_flow.h |  6 
 drivers/net/ice/ice_hash.c | 48 +-
 3 files changed, 67 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/ice_generic_flow.c 
b/drivers/net/ice/ice_generic_flow.c
index 8704812622..2389bc6637 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -212,6 +212,27 @@ enum rte_flow_item_type pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_IPV6,
RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/ice/ice_generic_flow.h 
b/drivers/net/ice/ice_generic_flow.h
index 9f422e5925..2afe719264 100644
--- a/drivers/net/ice/ice_generic_flow.h
+++ b/drivers/net/ice/ice_generic_flow.h
@@ -52,6 +52,7 @@
 #define ICE_L2TPV3OIP_SESSION_ID   BIT_ULL(43)
 #define ICE_PFCP_SEID  BIT_ULL(42)
 #define ICE_PFCP_S_FIELD   BIT_ULL(41)
+#define ICE_IP_PK_ID   BIT_ULL(40)
 
 /* input set */
 
@@ -69,11 +70,13 @@
 #define ICE_INSET_IPV4_TOS (ICE_PROT_IPV4 | ICE_IP_TOS)
 #define ICE_INSET_IPV4_PROTO   (ICE_PROT_IPV4 | ICE_IP_PROTO)
 #define ICE_INSET_IPV4_TTL (ICE_PROT_IPV4 | ICE_IP_TTL)
+#define ICE_INSET_IPV4_PKID(ICE_PROT_IPV4 | ICE_IP_PK_ID)
 #define ICE_INSET_IPV6_SRC (ICE_PROT_IPV6 | ICE_IP_SRC)
 #define ICE_INSET_IPV6_DST (ICE_PROT_IPV6 | ICE_IP_DST)
 #define ICE_INSET_IPV6_NEXT_HDR(ICE_PROT_IPV6 | ICE_IP_PROTO)
 #define ICE_INSET_IPV6_HOP_LIMIT   (ICE_PROT_IPV6 | ICE_IP_TTL)
 #define ICE_INSET_IPV6_TC  (ICE_PROT_IPV6 | ICE_IP_TOS)
+#define ICE_INSET_IPV6_PKID(ICE_PROT_IPV6 | ICE_IP_PK_ID)
 
 #define ICE_INSET_TCP_SRC_PORT (ICE_PROT_TCP | ICE_SPORT)
 #define ICE_INSET_TCP_DST_PORT (ICE_PROT_TCP | ICE_DPORT)
@@ -202,6 +205,9 @@ extern enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type pattern_eth_ipv6[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c
index 7d7e7052da..9df20df550 100644
--- a/drivers/net/ice/ice_hash.c
+++ b/drivers/net/ice/ice_hash.c
@@ -47,8 +47,10 @@
 ETH_RSS_NONFRAG_IPV6_TCP   | \
 ETH_RSS_NONFRAG_IPV6_SCTP)
 
-#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | VALID_RSS_IPV4_L4)
-#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | VALID_RSS_IPV6_L4)
+#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
+VALID_RSS_IPV4_L4)
+#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | \
+VALID_RSS_IPV6_L4)
 #define VALID_RSS_L3   (VALID_RSS_IPV4 | VALID_RSS_IPV6)
 #define VALID_RSS_L4   (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
 
@@ -108,6 +110,7 @@ ice_hash_parse_pattern_action(struct ice_adapter *ad,
 /* Rss configuration template */
 struct ice_rss_hash_cfg ipv4_tmplt = {
ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
ICE_FLOW_SEG_HDR_IPV_OTHER,
ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV4,
ICE_RSS_OUTER_HEADERS,
@@ -146,6 +149,15 @@ struct ice_rss_hash_cfg ipv6_tmplt = {
0
 };
 
+struct ice_rss_hash_cfg ipv6_frag_tmplt = {
+   ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
+   ICE_FLOW_SEG_HDR_IPV_OTHER,
+   ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV6,
+   ICE_RSS_ANY_HEADERS,
+   0
+};
+
 struct

[dpdk-dev] [PATCH v3 1/3] net/ice/base: support IP fragment RSS and FDIR

2021-04-10 Thread Jeff Guo
Add support for IP fragment RSS hash and FDIR according to packet ID.
Separate IP fragment and IP other packet types.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_fdir.c | 50 +++--
 drivers/net/ice/base/ice_fdir.h | 22 ---
 drivers/net/ice/base/ice_flow.c | 50 -
 drivers/net/ice/base/ice_flow.h |  5 +++-
 drivers/net/ice/base/ice_type.h |  1 +
 5 files changed, 120 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/base/ice_fdir.c b/drivers/net/ice/base/ice_fdir.c
index 2b39c13127..0eb7cdd729 100644
--- a/drivers/net/ice/base/ice_fdir.c
+++ b/drivers/net/ice/base/ice_fdir.c
@@ -518,6 +518,24 @@ static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
+static const u8 ice_fdir_ipv6_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x2C, 0x40, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static const u8 ice_fdir_ipv4_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+   0x00, 0x14, 0x00, 0x00, 0x20, 0x00, 0x40, 0x10,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00
+};
 static const u8 ice_fdir_tcpv6_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
@@ -716,6 +734,16 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
},
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV4,
+   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
+   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
+   },
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV6,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   },
{
ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
sizeof(ice_fdir_ipv4_gtpu4_pkt),
@@ -1505,7 +1533,7 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
if (frag)
-   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
+   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
@@ -1808,6 +1836,23 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
  input->ip.v6.proto);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
+  input->ip.v4.src_ip);
+   ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
+  input->ip.v4.dst_ip);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+   ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
+  input->ip.v4.packet_id);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
+   ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
+ input->ip.v4.proto);
+   ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
+   break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
+  input->ip.v6.packet_id);
+   break;
default:
return ICE_ERR_PARAM;
}
@@ -1838,7 +1883,8 @@ ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 
*pkt, bool frag)
  */
 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
 {
-   if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
+   if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
+   flow == ICE_FLTR_PTYPE_FRAG_IPV6)
return true;
else
return false;
diff --git a/drivers/net/ice/base/ice_fdir.h b/drivers/net/ice/base/ice_fdir.h
index 6573f96bc1..2acc1d6f1b 100644
--- a/drivers/net/ice/base/ice_fdir.h
+++ b/drivers/net/ice/base/ice_fdir.h
@@ -43,9 +43,11 @@
 #define ICE_MAC_ETHTYPE_OFFSET 12
 #define ICE_IPV4_TOS_OFFSET

[dpdk-dev] [PATCH v3 0/3] support flow for IP fragment in ICE

2021-04-10 Thread Jeff Guo
Support RSS hash and FDIR for IP fragment packets in ICE PMD.

v3:
rebase code and fix some parsing issues.
v2:
add some input check

Jeff Guo (3):
  net/ice/base: support IP fragment RSS and FDIR
  net/ice: support RSS hash for IP fragment
  net/ice: support FDIR for IP fragment packet

 drivers/net/ice/base/ice_fdir.c|  50 -
 drivers/net/ice/base/ice_fdir.h|  22 +-
 drivers/net/ice/base/ice_flow.c|  50 -
 drivers/net/ice/base/ice_flow.h|   5 +-
 drivers/net/ice/base/ice_type.h|   1 +
 drivers/net/ice/ice_fdir_filter.c  | 116 ++---
 drivers/net/ice/ice_generic_flow.c |  22 ++
 drivers/net/ice/ice_generic_flow.h |   6 ++
 drivers/net/ice/ice_hash.c |  48 ++--
 9 files changed, 293 insertions(+), 27 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v3 4/4] net/iavf: support FDIR for IP fragment packet

2021-04-10 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_fdir.c | 376 ++-
 drivers/net/iavf/iavf_generic_flow.h |   5 +
 2 files changed, 257 insertions(+), 124 deletions(-)

diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index 62f032985a..64c169f8c4 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -34,7 +34,7 @@
 #define IAVF_FDIR_INSET_ETH_IPV4 (\
IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
IAVF_INSET_IPV4_PROTO | IAVF_INSET_IPV4_TOS | \
-   IAVF_INSET_IPV4_TTL)
+   IAVF_INSET_IPV4_TTL | IAVF_INSET_IPV4_ID)
 
 #define IAVF_FDIR_INSET_ETH_IPV4_UDP (\
IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
@@ -56,6 +56,9 @@
IAVF_INSET_IPV6_NEXT_HDR | IAVF_INSET_IPV6_TC | \
IAVF_INSET_IPV6_HOP_LIMIT)
 
+#define IAVF_FDIR_INSET_ETH_IPV6_FRAG_EXT (\
+   IAVF_INSET_IPV6_ID)
+
 #define IAVF_FDIR_INSET_ETH_IPV6_UDP (\
IAVF_INSET_IPV6_SRC | IAVF_INSET_IPV6_DST | \
IAVF_INSET_IPV6_TC | IAVF_INSET_IPV6_HOP_LIMIT | \
@@ -143,6 +146,7 @@ static struct iavf_pattern_match_item iavf_fdir_pattern[] = 
{
{iavf_pattern_eth_ipv4_tcp,  IAVF_FDIR_INSET_ETH_IPV4_TCP,  
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4_sctp, IAVF_FDIR_INSET_ETH_IPV4_SCTP, 
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6,  IAVF_FDIR_INSET_ETH_IPV6,  
IAVF_INSET_NONE},
+   {iavf_pattern_eth_ipv6_frag_ext,
IAVF_FDIR_INSET_ETH_IPV6_FRAG_EXT,  IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_udp,  IAVF_FDIR_INSET_ETH_IPV6_UDP,  
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_tcp,  IAVF_FDIR_INSET_ETH_IPV6_TCP,  
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_sctp, IAVF_FDIR_INSET_ETH_IPV6_SCTP, 
IAVF_INSET_NONE},
@@ -543,6 +547,29 @@ iavf_fdir_refine_input_set(const uint64_t input_set,
}
 }
 
+static void
+iavf_fdir_add_fragment_hdr(struct virtchnl_proto_hdrs *hdrs, int layer)
+{
+   struct virtchnl_proto_hdr *hdr1;
+   struct virtchnl_proto_hdr *hdr2;
+   int i;
+
+   if (layer < 0 || layer > hdrs->count)
+   return;
+
+   /* shift headers layer */
+   for (i = hdrs->count; i >= layer; i--) {
+   hdr1 = &hdrs->proto_hdr[i];
+   hdr2 = &hdrs->proto_hdr[i - 1];
+   *hdr1 = *hdr2;
+   }
+
+   /* adding dummy fragment header */
+   hdr1 = &hdrs->proto_hdr[layer];
+   VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4_FRAG);
+   hdrs->count = ++layer;
+}
+
 static int
 iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
const struct rte_flow_item pattern[],
@@ -550,12 +577,15 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
struct rte_flow_error *error,
struct iavf_fdir_conf *filter)
 {
-   const struct rte_flow_item *item = pattern;
-   enum rte_flow_item_type item_type;
+   struct virtchnl_proto_hdrs *hdrs =
+   &filter->add_fltr.rule_cfg.proto_hdrs;
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
const struct rte_flow_item_eth *eth_spec, *eth_mask;
-   const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_mask;
+   const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_last, *ipv4_mask;
const struct rte_flow_item_ipv6 *ipv6_spec, *ipv6_mask;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_spec;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_last;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_mask;
const struct rte_flow_item_udp *udp_spec, *udp_mask;
const struct rte_flow_item_tcp *tcp_spec, *tcp_mask;
const struct rte_flow_item_sctp *sctp_spec, *sctp_mask;
@@ -566,15 +596,15 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
const struct rte_flow_item_ah *ah_spec, *ah_mask;
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 *item = pattern;
+   struct virtchnl_proto_hdr *hdr, *hdr1 = NULL;
struct rte_ecpri_common_hdr ecpri_common;
uint64_t input_set = IAVF_INSET_NONE;
-
+   enum rte_flow_item_type item_type;
enum rte_flow_item_type next_type;
+   uint8_t tun_inner = 0;
uint16_t ether_type;
-
-   u8 tun_inner = 0;
int layer = 0;
-   struct virtchnl_proto_hdr *hdr;
 
uint8_t  ipv6_addr_mask[16] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
@@ -582,26 +612,28 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
};
 
for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
-   if (ite

[dpdk-dev] [PATCH v3 1/4] app/testpmd: add packet id for IP fragment

2021-04-10 Thread Jeff Guo
Add the new items to support the flow configuration for IP fragment
packets.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 app/test-pmd/cmdline_flow.c | 21 -
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index fb7a3a8bd3..46ae342b85 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -166,6 +166,7 @@ enum index {
ITEM_VLAN_HAS_MORE_VLAN,
ITEM_IPV4,
ITEM_IPV4_TOS,
+   ITEM_IPV4_ID,
ITEM_IPV4_FRAGMENT_OFFSET,
ITEM_IPV4_TTL,
ITEM_IPV4_PROTO,
@@ -236,6 +237,7 @@ enum index {
ITEM_IPV6_FRAG_EXT,
ITEM_IPV6_FRAG_EXT_NEXT_HDR,
ITEM_IPV6_FRAG_EXT_FRAG_DATA,
+   ITEM_IPV6_FRAG_EXT_ID,
ITEM_ICMP6,
ITEM_ICMP6_TYPE,
ITEM_ICMP6_CODE,
@@ -1028,6 +1030,7 @@ static const enum index item_vlan[] = {
 
 static const enum index item_ipv4[] = {
ITEM_IPV4_TOS,
+   ITEM_IPV4_ID,
ITEM_IPV4_FRAGMENT_OFFSET,
ITEM_IPV4_TTL,
ITEM_IPV4_PROTO,
@@ -1164,6 +1167,7 @@ static const enum index item_ipv6_ext[] = {
 static const enum index item_ipv6_frag_ext[] = {
ITEM_IPV6_FRAG_EXT_NEXT_HDR,
ITEM_IPV6_FRAG_EXT_FRAG_DATA,
+   ITEM_IPV6_FRAG_EXT_ID,
ITEM_NEXT,
ZERO,
 };
@@ -2466,6 +2470,13 @@ static const struct token token_list[] = {
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv4,
 hdr.type_of_service)),
},
+   [ITEM_IPV4_ID] = {
+   .name = "packet_id",
+   .help = "fragment packet id",
+   .next = NEXT(item_ipv4, NEXT_ENTRY(UNSIGNED), item_param),
+   .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv4,
+hdr.packet_id)),
+   },
[ITEM_IPV4_FRAGMENT_OFFSET] = {
.name = "fragment_offset",
.help = "fragmentation flags and fragment offset",
@@ -2969,12 +2980,20 @@ static const struct token token_list[] = {
},
[ITEM_IPV6_FRAG_EXT_FRAG_DATA] = {
.name = "frag_data",
-   .help = "Fragment flags and offset",
+   .help = "fragment flags and offset",
.next = NEXT(item_ipv6_frag_ext, NEXT_ENTRY(UNSIGNED),
 item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv6_frag_ext,
 hdr.frag_data)),
},
+   [ITEM_IPV6_FRAG_EXT_ID] = {
+   .name = "packet_id",
+   .help = "fragment packet id",
+   .next = NEXT(item_ipv6_frag_ext, NEXT_ENTRY(UNSIGNED),
+item_param),
+   .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv6_frag_ext,
+hdr.id)),
+   },
[ITEM_ICMP6] = {
.name = "icmp6",
.help = "match any ICMPv6 header",
-- 
2.20.1



[dpdk-dev] [PATCH v3 3/4] net/iavf: support RSS hash for IP fragment

2021-04-10 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_generic_flow.c | 24 
 drivers/net/iavf/iavf_generic_flow.h |  3 +
 drivers/net/iavf/iavf_hash.c | 83 
 3 files changed, 100 insertions(+), 10 deletions(-)

diff --git a/drivers/net/iavf/iavf_generic_flow.c 
b/drivers/net/iavf/iavf_generic_flow.c
index 8635ff83ca..242bb4abc5 100644
--- a/drivers/net/iavf/iavf_generic_flow.c
+++ b/drivers/net/iavf/iavf_generic_flow.c
@@ -219,6 +219,30 @@ enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_END,
 };
 
+enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/iavf/iavf_generic_flow.h 
b/drivers/net/iavf/iavf_generic_flow.h
index 005eeb3553..32932557ca 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -203,6 +203,9 @@ extern enum rte_flow_item_type 
iavf_pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type iavf_pattern_eth_ipv6[];
 extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index d8d22f8009..5d3d62839b 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -112,6 +112,10 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED} }
 
+#define proto_hdr_ipv6_frag { \
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG, \
+   FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG_PKID), {BUFF_NOUSED} }
+
 #define proto_hdr_ipv6_with_prot { \
VIRTCHNL_PROTO_HDR_IPV6, \
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
@@ -190,6 +194,12 @@ struct virtchnl_proto_hdrs outer_ipv6_tmplt = {
{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6}
 };
 
+struct virtchnl_proto_hdrs outer_ipv6_frag_tmplt = {
+   TUNNEL_LEVEL_OUTER, 5,
+   {proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
+proto_hdr_ipv6, proto_hdr_ipv6_frag}
+};
+
 struct virtchnl_proto_hdrs outer_ipv6_udp_tmplt = {
TUNNEL_LEVEL_OUTER, 5,
{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
@@ -303,7 +313,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 /* rss type super set */
 
 /* IPv4 outer */
-#define IAVF_RSS_TYPE_OUTER_IPV4   (ETH_RSS_ETH | ETH_RSS_IPV4)
+#define IAVF_RSS_TYPE_OUTER_IPV4   (ETH_RSS_ETH | ETH_RSS_IPV4 | \
+ETH_RSS_FRAG_IPV4)
 #define IAVF_RSS_TYPE_OUTER_IPV4_UDP   (IAVF_RSS_TYPE_OUTER_IPV4 | \
 ETH_RSS_NONFRAG_IPV4_UDP)
 #define IAVF_RSS_TYPE_OUTER_IPV4_TCP   (IAVF_RSS_TYPE_OUTER_IPV4 | \
@@ -312,6 +323,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 ETH_RSS_NONFRAG_IPV4_SCTP)
 /* IPv6 outer */
 #define IAVF_RSS_TYPE_OUTER_IPV6   (ETH_RSS_ETH | ETH_RSS_IPV6)
+#define IAVF_RSS_TYPE_OUTER_IPV6_FRAG  (IAVF_RSS_TYPE_OUTER_IPV6 | \
+ETH_RSS_FRAG_IPV6)
 #define IAVF_RSS_TYPE_OUTER_IPV6_UDP   (IAVF_RSS_TYPE_OUTER_IPV6 | \
 ETH_RSS_NONFRAG_IPV6_UDP)
 #define IAVF_RSS_TYPE_OUTER_IPV6_TCP   (IAVF_RSS_TYPE_OUTER_IPV6 | \
@@ -330,6 +343,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 /* VLAN IPv6 */
 #define IAVF_RSS_TYPE_VLAN_IPV6(IAVF_RSS_TYPE_OUTER_IPV6 | \
 ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
+#define IAVF_RSS_TYPE_VLAN_IPV6_FRAG   (IAVF_RSS_TYPE_OUTER_IPV6_FRAG

[dpdk-dev] [PATCH v3 2/4] common/iavf: add proto header for IP fragment

2021-04-10 Thread Jeff Guo
Add new virtchnl protocol header type and fields for IP fragment packets
to support RSS hash and FDIR.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/common/iavf/virtchnl.h | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/drivers/common/iavf/virtchnl.h b/drivers/common/iavf/virtchnl.h
index 6b99e170f0..e3eb767d66 100644
--- a/drivers/common/iavf/virtchnl.h
+++ b/drivers/common/iavf/virtchnl.h
@@ -1415,7 +1415,9 @@ enum virtchnl_proto_hdr_type {
VIRTCHNL_PROTO_HDR_S_VLAN,
VIRTCHNL_PROTO_HDR_C_VLAN,
VIRTCHNL_PROTO_HDR_IPV4,
+   VIRTCHNL_PROTO_HDR_IPV4_FRAG,
VIRTCHNL_PROTO_HDR_IPV6,
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG,
VIRTCHNL_PROTO_HDR_TCP,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_SCTP,
@@ -1452,6 +1454,8 @@ enum virtchnl_proto_hdr_field {
VIRTCHNL_PROTO_HDR_IPV4_DSCP,
VIRTCHNL_PROTO_HDR_IPV4_TTL,
VIRTCHNL_PROTO_HDR_IPV4_PROT,
+   VIRTCHNL_PROTO_HDR_IPV4_FRAG_PKID =
+   PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV4_FRAG),
/* IPV6 */
VIRTCHNL_PROTO_HDR_IPV6_SRC =
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6),
@@ -1472,6 +1476,9 @@ enum virtchnl_proto_hdr_field {
VIRTCHNL_PROTO_HDR_IPV6_PREFIX64_DST,
VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_SRC,
VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_DST,
+   /* IPv6 Extension Header Fragment */
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG_PKID =
+   PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG),
/* TCP */
VIRTCHNL_PROTO_HDR_TCP_SRC_PORT =
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_TCP),
-- 
2.20.1



[dpdk-dev] [PATCH v2 3/3] net/ice: support FDIR for IP fragment packet

2021-03-24 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_fdir_filter.c | 96 +++
 1 file changed, 85 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ice/ice_fdir_filter.c 
b/drivers/net/ice/ice_fdir_filter.c
index 3af5812660..3504d3c6c2 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -24,7 +24,7 @@
 #define ICE_FDIR_INSET_ETH_IPV4 (\
ICE_FDIR_INSET_ETH | \
ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_TOS | \
-   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO)
+   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO | ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV4_UDP (\
ICE_FDIR_INSET_ETH_IPV4 | \
@@ -41,7 +41,8 @@
 #define ICE_FDIR_INSET_ETH_IPV6 (\
ICE_INSET_DMAC | \
ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_TC | \
-   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR)
+   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR | \
+   ICE_INSET_IPV6_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV6_UDP (\
ICE_FDIR_INSET_ETH_IPV6 | \
@@ -56,7 +57,8 @@
ICE_INSET_SCTP_SRC_PORT | ICE_INSET_SCTP_DST_PORT)
 
 #define ICE_FDIR_INSET_IPV4 (\
-   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST)
+   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \
+   ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_IPV4_TCP (\
ICE_FDIR_INSET_IPV4 | \
@@ -72,7 +74,8 @@
 
 #define ICE_FDIR_INSET_ETH_IPV4_VXLAN (\
ICE_FDIR_INSET_ETH | \
-   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST)
+   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \
+   ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_IPV4_GTPU (\
ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_GTPU_TEID)
@@ -95,6 +98,7 @@ static struct ice_pattern_match_item ice_fdir_pattern_list[] 
= {
{pattern_eth_ipv4_tcp,  
ICE_FDIR_INSET_ETH_IPV4_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv4_sctp, 
ICE_FDIR_INSET_ETH_IPV4_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6,  
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
+   {pattern_eth_ipv6_frag_ext, 
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_udp,  
ICE_FDIR_INSET_ETH_IPV6_UDP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_tcp,  
ICE_FDIR_INSET_ETH_IPV6_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_sctp, 
ICE_FDIR_INSET_ETH_IPV6_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
@@ -882,11 +886,13 @@ ice_fdir_input_set_parse(uint64_t inset, enum 
ice_flow_field *field)
{ICE_INSET_IPV4_TOS, ICE_FLOW_FIELD_IDX_IPV4_DSCP},
{ICE_INSET_IPV4_TTL, ICE_FLOW_FIELD_IDX_IPV4_TTL},
{ICE_INSET_IPV4_PROTO, ICE_FLOW_FIELD_IDX_IPV4_PROT},
+   {ICE_INSET_IPV4_PKID, ICE_FLOW_FIELD_IDX_IPV4_ID},
{ICE_INSET_IPV6_SRC, ICE_FLOW_FIELD_IDX_IPV6_SA},
{ICE_INSET_IPV6_DST, ICE_FLOW_FIELD_IDX_IPV6_DA},
{ICE_INSET_IPV6_TC, ICE_FLOW_FIELD_IDX_IPV6_DSCP},
{ICE_INSET_IPV6_NEXT_HDR, ICE_FLOW_FIELD_IDX_IPV6_PROT},
{ICE_INSET_IPV6_HOP_LIMIT, ICE_FLOW_FIELD_IDX_IPV6_TTL},
+   {ICE_INSET_IPV6_PKID, ICE_FLOW_FIELD_IDX_IPV6_ID},
{ICE_INSET_TCP_SRC_PORT, ICE_FLOW_FIELD_IDX_TCP_SRC_PORT},
{ICE_INSET_TCP_DST_PORT, ICE_FLOW_FIELD_IDX_TCP_DST_PORT},
{ICE_INSET_UDP_SRC_PORT, ICE_FLOW_FIELD_IDX_UDP_SRC_PORT},
@@ -935,6 +941,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
  ICE_FLOW_SEG_HDR_IPV6 |
@@ -951,6 +961,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6

[dpdk-dev] [PATCH v2 2/3] net/ice: support RSS hash for IP fragment

2021-03-24 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_generic_flow.c | 21 +
 drivers/net/ice/ice_generic_flow.h |  6 
 drivers/net/ice/ice_hash.c | 48 +-
 3 files changed, 67 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/ice_generic_flow.c 
b/drivers/net/ice/ice_generic_flow.c
index 8704812622..2389bc6637 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -212,6 +212,27 @@ enum rte_flow_item_type pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_IPV6,
RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/ice/ice_generic_flow.h 
b/drivers/net/ice/ice_generic_flow.h
index 9f422e5925..2afe719264 100644
--- a/drivers/net/ice/ice_generic_flow.h
+++ b/drivers/net/ice/ice_generic_flow.h
@@ -52,6 +52,7 @@
 #define ICE_L2TPV3OIP_SESSION_ID   BIT_ULL(43)
 #define ICE_PFCP_SEID  BIT_ULL(42)
 #define ICE_PFCP_S_FIELD   BIT_ULL(41)
+#define ICE_IP_PK_ID   BIT_ULL(40)
 
 /* input set */
 
@@ -69,11 +70,13 @@
 #define ICE_INSET_IPV4_TOS (ICE_PROT_IPV4 | ICE_IP_TOS)
 #define ICE_INSET_IPV4_PROTO   (ICE_PROT_IPV4 | ICE_IP_PROTO)
 #define ICE_INSET_IPV4_TTL (ICE_PROT_IPV4 | ICE_IP_TTL)
+#define ICE_INSET_IPV4_PKID(ICE_PROT_IPV4 | ICE_IP_PK_ID)
 #define ICE_INSET_IPV6_SRC (ICE_PROT_IPV6 | ICE_IP_SRC)
 #define ICE_INSET_IPV6_DST (ICE_PROT_IPV6 | ICE_IP_DST)
 #define ICE_INSET_IPV6_NEXT_HDR(ICE_PROT_IPV6 | ICE_IP_PROTO)
 #define ICE_INSET_IPV6_HOP_LIMIT   (ICE_PROT_IPV6 | ICE_IP_TTL)
 #define ICE_INSET_IPV6_TC  (ICE_PROT_IPV6 | ICE_IP_TOS)
+#define ICE_INSET_IPV6_PKID(ICE_PROT_IPV6 | ICE_IP_PK_ID)
 
 #define ICE_INSET_TCP_SRC_PORT (ICE_PROT_TCP | ICE_SPORT)
 #define ICE_INSET_TCP_DST_PORT (ICE_PROT_TCP | ICE_DPORT)
@@ -202,6 +205,9 @@ extern enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type pattern_eth_ipv6[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c
index 58a0c18d09..b3ed9b219c 100644
--- a/drivers/net/ice/ice_hash.c
+++ b/drivers/net/ice/ice_hash.c
@@ -47,8 +47,10 @@
 ETH_RSS_NONFRAG_IPV6_TCP   | \
 ETH_RSS_NONFRAG_IPV6_SCTP)
 
-#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | VALID_RSS_IPV4_L4)
-#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | VALID_RSS_IPV6_L4)
+#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
+VALID_RSS_IPV4_L4)
+#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | \
+VALID_RSS_IPV6_L4)
 #define VALID_RSS_L3   (VALID_RSS_IPV4 | VALID_RSS_IPV6)
 #define VALID_RSS_L4   (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
 
@@ -108,6 +110,7 @@ ice_hash_parse_pattern_action(struct ice_adapter *ad,
 /* Rss configuration template */
 struct ice_rss_hash_cfg ipv4_tmplt = {
ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
ICE_FLOW_SEG_HDR_IPV_OTHER,
ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV4,
ICE_RSS_ANY_HEADERS,
@@ -146,6 +149,15 @@ struct ice_rss_hash_cfg ipv6_tmplt = {
0
 };
 
+struct ice_rss_hash_cfg ipv6_frag_tmplt = {
+   ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
+   ICE_FLOW_SEG_HDR_IPV_OTHER,
+   ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV6,
+   ICE_RSS_ANY_HEADERS,
+   0
+};
+
 struct ice_rss_hash_cfg

[dpdk-dev] [PATCH v2 1/3] net/ice/base: support IP fragment RSS and FDIR

2021-03-24 Thread Jeff Guo
Add support for IP fragment RSS hash and FDIR according to packet ID.
Separate IP fragment and IP other packet types.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_fdir.c | 50 +++--
 drivers/net/ice/base/ice_fdir.h | 22 ---
 drivers/net/ice/base/ice_flow.c | 50 -
 drivers/net/ice/base/ice_flow.h |  5 +++-
 drivers/net/ice/base/ice_type.h |  1 +
 5 files changed, 120 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/base/ice_fdir.c b/drivers/net/ice/base/ice_fdir.c
index 2b39c13127..0eb7cdd729 100644
--- a/drivers/net/ice/base/ice_fdir.c
+++ b/drivers/net/ice/base/ice_fdir.c
@@ -518,6 +518,24 @@ static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
+static const u8 ice_fdir_ipv6_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x2C, 0x40, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static const u8 ice_fdir_ipv4_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+   0x00, 0x14, 0x00, 0x00, 0x20, 0x00, 0x40, 0x10,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00
+};
 static const u8 ice_fdir_tcpv6_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
@@ -716,6 +734,16 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
},
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV4,
+   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
+   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
+   },
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV6,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   },
{
ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
sizeof(ice_fdir_ipv4_gtpu4_pkt),
@@ -1505,7 +1533,7 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
if (frag)
-   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
+   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
@@ -1808,6 +1836,23 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
  input->ip.v6.proto);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
+  input->ip.v4.src_ip);
+   ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
+  input->ip.v4.dst_ip);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+   ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
+  input->ip.v4.packet_id);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
+   ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
+ input->ip.v4.proto);
+   ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
+   break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
+  input->ip.v6.packet_id);
+   break;
default:
return ICE_ERR_PARAM;
}
@@ -1838,7 +1883,8 @@ ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 
*pkt, bool frag)
  */
 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
 {
-   if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
+   if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
+   flow == ICE_FLTR_PTYPE_FRAG_IPV6)
return true;
else
return false;
diff --git a/drivers/net/ice/base/ice_fdir.h b/drivers/net/ice/base/ice_fdir.h
index 6573f96bc1..2acc1d6f1b 100644
--- a/drivers/net/ice/base/ice_fdir.h
+++ b/drivers/net/ice/base/ice_fdir.h
@@ -43,9 +43,11 @@
 #define ICE_MAC_ETHTYPE_OFFSET 12
 #define ICE_IPV4_TOS_OFFSET

[dpdk-dev] [PATCH v2 0/3] support flow for IP fragment in ICE

2021-03-24 Thread Jeff Guo
Support RSS hash and FDIR for IP fragment packets in ICE PMD.

v2:
add some input check

Jeff Guo (3):
  net/ice/base: support IP fragment RSS and FDIR
  net/ice: support RSS hash for IP fragment
  net/ice: support FDIR for IP fragment packet

 drivers/net/ice/base/ice_fdir.c| 50 +++-
 drivers/net/ice/base/ice_fdir.h| 22 +--
 drivers/net/ice/base/ice_flow.c| 50 +++-
 drivers/net/ice/base/ice_flow.h|  5 +-
 drivers/net/ice/base/ice_type.h|  1 +
 drivers/net/ice/ice_fdir_filter.c  | 96 ++
 drivers/net/ice/ice_generic_flow.c | 21 +++
 drivers/net/ice/ice_generic_flow.h |  6 ++
 drivers/net/ice/ice_hash.c | 48 ---
 9 files changed, 272 insertions(+), 27 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v2 4/4] net/iavf: support FDIR for IP fragment packet

2021-03-24 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_fdir.c | 296 ++-
 drivers/net/iavf/iavf_generic_flow.h |   5 +
 2 files changed, 209 insertions(+), 92 deletions(-)

diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index 459c09f6fb..df8d1d431e 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -34,7 +34,7 @@
 #define IAVF_FDIR_INSET_ETH_IPV4 (\
IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
IAVF_INSET_IPV4_PROTO | IAVF_INSET_IPV4_TOS | \
-   IAVF_INSET_IPV4_TTL)
+   IAVF_INSET_IPV4_TTL | IAVF_INSET_IPV4_ID)
 
 #define IAVF_FDIR_INSET_ETH_IPV4_UDP (\
IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
@@ -56,6 +56,9 @@
IAVF_INSET_IPV6_NEXT_HDR | IAVF_INSET_IPV6_TC | \
IAVF_INSET_IPV6_HOP_LIMIT)
 
+#define IAVF_FDIR_INSET_ETH_IPV6_FRAG_EXT (\
+   IAVF_INSET_IPV6_ID)
+
 #define IAVF_FDIR_INSET_ETH_IPV6_UDP (\
IAVF_INSET_IPV6_SRC | IAVF_INSET_IPV6_DST | \
IAVF_INSET_IPV6_TC | IAVF_INSET_IPV6_HOP_LIMIT | \
@@ -113,10 +116,12 @@
 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},
+   {iavf_pattern_eth_ipv4, IAVF_FDIR_INSET_ETH_IPV4,   
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4_udp, IAVF_FDIR_INSET_ETH_IPV4_UDP,   
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4_tcp, IAVF_FDIR_INSET_ETH_IPV4_TCP,   
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4_sctp,IAVF_FDIR_INSET_ETH_IPV4_SCTP,  
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6, IAVF_FDIR_INSET_ETH_IPV6,   
IAVF_INSET_NONE},
+   {iavf_pattern_eth_ipv6_frag_ext,
IAVF_FDIR_INSET_ETH_IPV6_FRAG_EXT,  IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_udp, IAVF_FDIR_INSET_ETH_IPV6_UDP,   
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_tcp, IAVF_FDIR_INSET_ETH_IPV6_TCP,   
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_sctp,IAVF_FDIR_INSET_ETH_IPV6_SCTP,  
IAVF_INSET_NONE},
@@ -497,12 +502,13 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
 {
struct virtchnl_proto_hdrs *hdrs =
&filter->add_fltr.rule_cfg.proto_hdrs;
-   const struct rte_flow_item *item = pattern;
-   enum rte_flow_item_type item_type;
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
const struct rte_flow_item_eth *eth_spec, *eth_mask;
-   const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_mask;
+   const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_last, *ipv4_mask;
const struct rte_flow_item_ipv6 *ipv6_spec, *ipv6_mask;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_spec;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_last;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_mask;
const struct rte_flow_item_udp *udp_spec, *udp_mask;
const struct rte_flow_item_tcp *tcp_spec, *tcp_mask;
const struct rte_flow_item_sctp *sctp_spec, *sctp_mask;
@@ -513,15 +519,16 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
const struct rte_flow_item_ah *ah_spec, *ah_mask;
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 *item = pattern;
+   struct virtchnl_proto_hdr *hdr, *hdr1 = NULL;
struct rte_ecpri_common_hdr ecpri_common;
uint64_t input_set = IAVF_INSET_NONE;
-   uint8_t proto_id;
-
+   enum rte_flow_item_type item_type;
enum rte_flow_item_type next_type;
+   bool spec_all_pid = false;
uint16_t ether_type;
-
+   uint8_t proto_id;
int layer = 0;
-   struct virtchnl_proto_hdr *hdr;
 
uint8_t  ipv6_addr_mask[16] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
@@ -529,26 +536,28 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
};
 
for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
-   if (item->last) {
+   item_type = item->type;
+
+   if (item->last && (item_type != RTE_FLOW_ITEM_TYPE_IPV4 ||
+  item_type !=
+  RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT)) {
rte_flow_error_set(error, EINVAL,
-   RTE_FLOW_ERROR_TYPE_ITEM, item,
-   "Not support range");
+   

[dpdk-dev] [PATCH v2 3/4] net/iavf: support RSS hash for IP fragment

2021-03-24 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_generic_flow.c | 24 
 drivers/net/iavf/iavf_generic_flow.h |  3 +++
 drivers/net/iavf/iavf_hash.c | 33 +++-
 3 files changed, 54 insertions(+), 6 deletions(-)

diff --git a/drivers/net/iavf/iavf_generic_flow.c 
b/drivers/net/iavf/iavf_generic_flow.c
index 8635ff83ca..242bb4abc5 100644
--- a/drivers/net/iavf/iavf_generic_flow.c
+++ b/drivers/net/iavf/iavf_generic_flow.c
@@ -219,6 +219,30 @@ enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_END,
 };
 
+enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/iavf/iavf_generic_flow.h 
b/drivers/net/iavf/iavf_generic_flow.h
index 0ccf5901b4..ce3d12bcd9 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -172,6 +172,9 @@ extern enum rte_flow_item_type 
iavf_pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type iavf_pattern_eth_ipv6[];
 extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index d8d22f8009..d46529c61e 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -112,6 +112,10 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED} }
 
+#define proto_hdr_ipv6_frag { \
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG, \
+   FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PKID), {BUFF_NOUSED} }
+
 #define proto_hdr_ipv6_with_prot { \
VIRTCHNL_PROTO_HDR_IPV6, \
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
@@ -190,6 +194,12 @@ struct virtchnl_proto_hdrs outer_ipv6_tmplt = {
{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6}
 };
 
+struct virtchnl_proto_hdrs outer_ipv6_frag_tmplt = {
+   TUNNEL_LEVEL_OUTER, 5,
+   {proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
+proto_hdr_ipv6, proto_hdr_ipv6_frag}
+};
+
 struct virtchnl_proto_hdrs outer_ipv6_udp_tmplt = {
TUNNEL_LEVEL_OUTER, 5,
{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
@@ -303,7 +313,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 /* rss type super set */
 
 /* IPv4 outer */
-#define IAVF_RSS_TYPE_OUTER_IPV4   (ETH_RSS_ETH | ETH_RSS_IPV4)
+#define IAVF_RSS_TYPE_OUTER_IPV4   (ETH_RSS_ETH | ETH_RSS_IPV4 | \
+ETH_RSS_FRAG_IPV4)
 #define IAVF_RSS_TYPE_OUTER_IPV4_UDP   (IAVF_RSS_TYPE_OUTER_IPV4 | \
 ETH_RSS_NONFRAG_IPV4_UDP)
 #define IAVF_RSS_TYPE_OUTER_IPV4_TCP   (IAVF_RSS_TYPE_OUTER_IPV4 | \
@@ -312,6 +323,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 ETH_RSS_NONFRAG_IPV4_SCTP)
 /* IPv6 outer */
 #define IAVF_RSS_TYPE_OUTER_IPV6   (ETH_RSS_ETH | ETH_RSS_IPV6)
+#define IAVF_RSS_TYPE_OUTER_IPV6_FRAG  (IAVF_RSS_TYPE_OUTER_IPV6 | \
+ETH_RSS_FRAG_IPV6)
 #define IAVF_RSS_TYPE_OUTER_IPV6_UDP   (IAVF_RSS_TYPE_OUTER_IPV6 | \
 ETH_RSS_NONFRAG_IPV6_UDP)
 #define IAVF_RSS_TYPE_OUTER_IPV6_TCP   (IAVF_RSS_TYPE_OUTER_IPV6 | \
@@ -330,6 +343,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 /* VLAN IPv6 */
 #define IAVF_RSS_TYPE_VLAN_IPV6(IAVF_RSS_TYPE_OUTER_IPV6 | \
 ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
+#define IAVF_RSS_TYPE_VLAN_IPV6_FRAG   (IAVF_RSS_TYPE_OUTER_IPV6_FRAG

[dpdk-dev] [PATCH v2 2/4] common/iavf: add proto header for IP fragment

2021-03-24 Thread Jeff Guo
Add new virtchnl protocol header type and fields for IP fragment packets
to support RSS hash and FDIR.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/common/iavf/virtchnl.h | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/common/iavf/virtchnl.h b/drivers/common/iavf/virtchnl.h
index 6b99e170f0..1042ee7cae 100644
--- a/drivers/common/iavf/virtchnl.h
+++ b/drivers/common/iavf/virtchnl.h
@@ -1415,7 +1415,9 @@ enum virtchnl_proto_hdr_type {
VIRTCHNL_PROTO_HDR_S_VLAN,
VIRTCHNL_PROTO_HDR_C_VLAN,
VIRTCHNL_PROTO_HDR_IPV4,
+   VIRTCHNL_PROTO_HDR_IPV4_FRAG,
VIRTCHNL_PROTO_HDR_IPV6,
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG,
VIRTCHNL_PROTO_HDR_TCP,
VIRTCHNL_PROTO_HDR_UDP,
VIRTCHNL_PROTO_HDR_SCTP,
@@ -1452,6 +1454,7 @@ enum virtchnl_proto_hdr_field {
VIRTCHNL_PROTO_HDR_IPV4_DSCP,
VIRTCHNL_PROTO_HDR_IPV4_TTL,
VIRTCHNL_PROTO_HDR_IPV4_PROT,
+   VIRTCHNL_PROTO_HDR_IPV4_PKID,
/* IPV6 */
VIRTCHNL_PROTO_HDR_IPV6_SRC =
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6),
@@ -1472,6 +1475,9 @@ enum virtchnl_proto_hdr_field {
VIRTCHNL_PROTO_HDR_IPV6_PREFIX64_DST,
VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_SRC,
VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_DST,
+   /* IPv6 Extension Header Fragment */
+   VIRTCHNL_PROTO_HDR_IPV6_PKID =
+   PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG),
/* TCP */
VIRTCHNL_PROTO_HDR_TCP_SRC_PORT =
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_TCP),
-- 
2.20.1



[dpdk-dev] [PATCH v2 1/4] app/testpmd: add packet id for IP fragment

2021-03-24 Thread Jeff Guo
Add the new items to support the flow configuration for IP fragment
packets.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 app/test-pmd/cmdline_flow.c | 21 -
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 49d9f9c043..331a08eec4 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -166,6 +166,7 @@ enum index {
ITEM_VLAN_HAS_MORE_VLAN,
ITEM_IPV4,
ITEM_IPV4_TOS,
+   ITEM_IPV4_ID,
ITEM_IPV4_FRAGMENT_OFFSET,
ITEM_IPV4_TTL,
ITEM_IPV4_PROTO,
@@ -236,6 +237,7 @@ enum index {
ITEM_IPV6_FRAG_EXT,
ITEM_IPV6_FRAG_EXT_NEXT_HDR,
ITEM_IPV6_FRAG_EXT_FRAG_DATA,
+   ITEM_IPV6_FRAG_EXT_ID,
ITEM_ICMP6,
ITEM_ICMP6_TYPE,
ITEM_ICMP6_CODE,
@@ -1026,6 +1028,7 @@ static const enum index item_vlan[] = {
 
 static const enum index item_ipv4[] = {
ITEM_IPV4_TOS,
+   ITEM_IPV4_ID,
ITEM_IPV4_FRAGMENT_OFFSET,
ITEM_IPV4_TTL,
ITEM_IPV4_PROTO,
@@ -1162,6 +1165,7 @@ static const enum index item_ipv6_ext[] = {
 static const enum index item_ipv6_frag_ext[] = {
ITEM_IPV6_FRAG_EXT_NEXT_HDR,
ITEM_IPV6_FRAG_EXT_FRAG_DATA,
+   ITEM_IPV6_FRAG_EXT_ID,
ITEM_NEXT,
ZERO,
 };
@@ -2462,6 +2466,13 @@ static const struct token token_list[] = {
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv4,
 hdr.type_of_service)),
},
+   [ITEM_IPV4_ID] = {
+   .name = "packet_id",
+   .help = "fragment packet id",
+   .next = NEXT(item_ipv4, NEXT_ENTRY(UNSIGNED), item_param),
+   .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv4,
+hdr.packet_id)),
+   },
[ITEM_IPV4_FRAGMENT_OFFSET] = {
.name = "fragment_offset",
.help = "fragmentation flags and fragment offset",
@@ -2965,12 +2976,20 @@ static const struct token token_list[] = {
},
[ITEM_IPV6_FRAG_EXT_FRAG_DATA] = {
.name = "frag_data",
-   .help = "Fragment flags and offset",
+   .help = "fragment flags and offset",
.next = NEXT(item_ipv6_frag_ext, NEXT_ENTRY(UNSIGNED),
 item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv6_frag_ext,
 hdr.frag_data)),
},
+   [ITEM_IPV6_FRAG_EXT_ID] = {
+   .name = "packet_id",
+   .help = "fragment packet id",
+   .next = NEXT(item_ipv6_frag_ext, NEXT_ENTRY(UNSIGNED),
+item_param),
+   .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv6_frag_ext,
+hdr.id)),
+   },
[ITEM_ICMP6] = {
.name = "icmp6",
.help = "match any ICMPv6 header",
-- 
2.20.1



[dpdk-dev] [PATCH v2 0/4] support flow for IP fragment in IAVF

2021-03-24 Thread Jeff Guo
support flow for IP fragment in IAVF

v2:
refine some input check

Jeff Guo (4):
  app/testpmd: add packet id for IP fragment
  common/iavf: add proto header for IP fragment
  net/iavf: support RSS hash for IP fragment
  net/iavf: support FDIR for IP fragment packet

 app/test-pmd/cmdline_flow.c  |  21 +-
 drivers/common/iavf/virtchnl.h   |   6 +
 drivers/net/iavf/iavf_fdir.c | 296 ++-
 drivers/net/iavf/iavf_generic_flow.c |  24 +++
 drivers/net/iavf/iavf_generic_flow.h |   8 +
 drivers/net/iavf/iavf_hash.c |  33 ++-
 6 files changed, 289 insertions(+), 99 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v3] net/iavf: fix FDIR configure

2021-03-24 Thread Jeff Guo
The configure of TCP/UDP flow item should not affect other flow
configure which not include L4 layer. Fix and clean the protocol header
refinement function.

Fixes: 61abc5f611a0 ("net/iavf: support TCP/UDP flow item without input set")

Signed-off-by: Jeff Guo 
---
v3:
fix some coding error
---
 drivers/net/iavf/iavf_fdir.c | 110 ---
 1 file changed, 50 insertions(+), 60 deletions(-)

diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index 4e864b4b9c..459c09f6fb 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -456,35 +456,16 @@ iavf_fdir_parse_action(struct iavf_adapter *ad,
return 0;
 }
 
-static bool
-iavf_fdir_refine_input_set(const uint64_t input_set,
-  const uint64_t input_set_mask,
-  struct iavf_fdir_conf *filter)
+#defineIAVF_IPPROTO_TCP 6
+#defineIAVF_IPPROTO_UDP 17
+
+static void
+iavf_fdir_refine_proto_hdr(struct virtchnl_proto_hdr *hdr,
+  uint8_t proto_id)
 {
-   struct virtchnl_proto_hdr *hdr, *hdr_last;
struct rte_flow_item_ipv4 ipv4_spec;
struct rte_flow_item_ipv6 ipv6_spec;
-   int last_layer;
-   uint8_t proto_id;
-
-   if (input_set & ~input_set_mask)
-   return false;
-   else if (input_set)
-   return true;
-
-   last_layer = filter->add_fltr.rule_cfg.proto_hdrs.count - 1;
-   /* Last layer of TCP/UDP pattern isn't less than 2. */
-   if (last_layer < 2)
-   return false;
-   hdr_last = &filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[last_layer];
-   if (hdr_last->type == VIRTCHNL_PROTO_HDR_TCP)
-   proto_id = 6;
-   else if (hdr_last->type == VIRTCHNL_PROTO_HDR_UDP)
-   proto_id = 17;
-   else
-   return false;
 
-   hdr = &filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[last_layer - 1];
switch (hdr->type) {
case VIRTCHNL_PROTO_HDR_IPV4:
VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV4, PROT);
@@ -492,17 +473,19 @@ iavf_fdir_refine_input_set(const uint64_t input_set,
ipv4_spec.hdr.next_proto_id = proto_id;
rte_memcpy(hdr->buffer, &ipv4_spec.hdr,
   sizeof(ipv4_spec.hdr));
-   return true;
+   break;
case VIRTCHNL_PROTO_HDR_IPV6:
VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV6, PROT);
memset(&ipv6_spec, 0, sizeof(ipv6_spec));
ipv6_spec.hdr.proto = proto_id;
rte_memcpy(hdr->buffer, &ipv6_spec.hdr,
   sizeof(ipv6_spec.hdr));
-   return true;
+   break;
default:
-   return false;
+   break;
}
+
+   return;
 }
 
 static int
@@ -512,6 +495,8 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
struct rte_flow_error *error,
struct iavf_fdir_conf *filter)
 {
+   struct virtchnl_proto_hdrs *hdrs =
+   &filter->add_fltr.rule_cfg.proto_hdrs;
const struct rte_flow_item *item = pattern;
enum rte_flow_item_type item_type;
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
@@ -530,6 +515,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
const struct rte_flow_item_ecpri *ecpri_spec, *ecpri_mask;
struct rte_ecpri_common_hdr ecpri_common;
uint64_t input_set = IAVF_INSET_NONE;
+   uint8_t proto_id;
 
enum rte_flow_item_type next_type;
uint16_t ether_type;
@@ -557,7 +543,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
eth_mask = item->mask;
next_type = (item + 1)->type;
 
-   hdr = 
&filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[layer];
+   hdr = &hdrs->proto_hdr[layer];
 
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, ETH);
 
@@ -604,7 +590,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
eth_spec, sizeof(struct rte_ether_hdr));
}
 
-   filter->add_fltr.rule_cfg.proto_hdrs.count = ++layer;
+   hdrs->count = ++layer;
break;
 
case RTE_FLOW_ITEM_TYPE_IPV4:
@@ -612,7 +598,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
ipv4_spec = item->spec;
ipv4_mask = item->mask;
 
-   hdr = 
&filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[layer];
+   hdr = &hdrs->proto_hdr[layer];
 
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, IPV4);
 
@@ -655,7 +641,7 @@ iavf_

[dpdk-dev] [PATCH v3] net/iavf: fix FDIR configure

2021-03-24 Thread Jeff Guo
The configure of TCP/UDP flow item should not affact other flow
configure which not include L4 layer. Fix and clean the protocol header
refinement function.

Fixes: 61abc5f611a0 ("net/iavf: support TCP/UDP flow item without input set")

Signed-off-by: Jeff Guo 
---
v3:
fix some coding error
---
 drivers/net/iavf/iavf_fdir.c | 110 ---
 1 file changed, 50 insertions(+), 60 deletions(-)

diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index 4e864b4b9c..459c09f6fb 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -456,35 +456,16 @@ iavf_fdir_parse_action(struct iavf_adapter *ad,
return 0;
 }
 
-static bool
-iavf_fdir_refine_input_set(const uint64_t input_set,
-  const uint64_t input_set_mask,
-  struct iavf_fdir_conf *filter)
+#defineIAVF_IPPROTO_TCP 6
+#defineIAVF_IPPROTO_UDP 17
+
+static void
+iavf_fdir_refine_proto_hdr(struct virtchnl_proto_hdr *hdr,
+  uint8_t proto_id)
 {
-   struct virtchnl_proto_hdr *hdr, *hdr_last;
struct rte_flow_item_ipv4 ipv4_spec;
struct rte_flow_item_ipv6 ipv6_spec;
-   int last_layer;
-   uint8_t proto_id;
-
-   if (input_set & ~input_set_mask)
-   return false;
-   else if (input_set)
-   return true;
-
-   last_layer = filter->add_fltr.rule_cfg.proto_hdrs.count - 1;
-   /* Last layer of TCP/UDP pattern isn't less than 2. */
-   if (last_layer < 2)
-   return false;
-   hdr_last = &filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[last_layer];
-   if (hdr_last->type == VIRTCHNL_PROTO_HDR_TCP)
-   proto_id = 6;
-   else if (hdr_last->type == VIRTCHNL_PROTO_HDR_UDP)
-   proto_id = 17;
-   else
-   return false;
 
-   hdr = &filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[last_layer - 1];
switch (hdr->type) {
case VIRTCHNL_PROTO_HDR_IPV4:
VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV4, PROT);
@@ -492,17 +473,19 @@ iavf_fdir_refine_input_set(const uint64_t input_set,
ipv4_spec.hdr.next_proto_id = proto_id;
rte_memcpy(hdr->buffer, &ipv4_spec.hdr,
   sizeof(ipv4_spec.hdr));
-   return true;
+   break;
case VIRTCHNL_PROTO_HDR_IPV6:
VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV6, PROT);
memset(&ipv6_spec, 0, sizeof(ipv6_spec));
ipv6_spec.hdr.proto = proto_id;
rte_memcpy(hdr->buffer, &ipv6_spec.hdr,
   sizeof(ipv6_spec.hdr));
-   return true;
+   break;
default:
-   return false;
+   break;
}
+
+   return;
 }
 
 static int
@@ -512,6 +495,8 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
struct rte_flow_error *error,
struct iavf_fdir_conf *filter)
 {
+   struct virtchnl_proto_hdrs *hdrs =
+   &filter->add_fltr.rule_cfg.proto_hdrs;
const struct rte_flow_item *item = pattern;
enum rte_flow_item_type item_type;
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
@@ -530,6 +515,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
const struct rte_flow_item_ecpri *ecpri_spec, *ecpri_mask;
struct rte_ecpri_common_hdr ecpri_common;
uint64_t input_set = IAVF_INSET_NONE;
+   uint8_t proto_id;
 
enum rte_flow_item_type next_type;
uint16_t ether_type;
@@ -557,7 +543,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
eth_mask = item->mask;
next_type = (item + 1)->type;
 
-   hdr = 
&filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[layer];
+   hdr = &hdrs->proto_hdr[layer];
 
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, ETH);
 
@@ -604,7 +590,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
eth_spec, sizeof(struct rte_ether_hdr));
}
 
-   filter->add_fltr.rule_cfg.proto_hdrs.count = ++layer;
+   hdrs->count = ++layer;
break;
 
case RTE_FLOW_ITEM_TYPE_IPV4:
@@ -612,7 +598,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
ipv4_spec = item->spec;
ipv4_mask = item->mask;
 
-   hdr = 
&filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[layer];
+   hdr = &hdrs->proto_hdr[layer];
 
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, IPV4);
 
@@ -655,7 +641,7 @@ iavf_

[dpdk-dev] [PATCH v1 3/3] net/ice: support FDIR for IP fragment packet

2021-03-16 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_fdir_filter.c | 87 ++-
 1 file changed, 73 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ice/ice_fdir_filter.c 
b/drivers/net/ice/ice_fdir_filter.c
index 3af5812660..3473c05244 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -24,7 +24,7 @@
 #define ICE_FDIR_INSET_ETH_IPV4 (\
ICE_FDIR_INSET_ETH | \
ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_IPV4_TOS | \
-   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO)
+   ICE_INSET_IPV4_TTL | ICE_INSET_IPV4_PROTO | ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV4_UDP (\
ICE_FDIR_INSET_ETH_IPV4 | \
@@ -41,7 +41,8 @@
 #define ICE_FDIR_INSET_ETH_IPV6 (\
ICE_INSET_DMAC | \
ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | ICE_INSET_IPV6_TC | \
-   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR)
+   ICE_INSET_IPV6_HOP_LIMIT | ICE_INSET_IPV6_NEXT_HDR | \
+   ICE_INSET_IPV6_PKID)
 
 #define ICE_FDIR_INSET_ETH_IPV6_UDP (\
ICE_FDIR_INSET_ETH_IPV6 | \
@@ -56,7 +57,8 @@
ICE_INSET_SCTP_SRC_PORT | ICE_INSET_SCTP_DST_PORT)
 
 #define ICE_FDIR_INSET_IPV4 (\
-   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST)
+   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \
+   ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_IPV4_TCP (\
ICE_FDIR_INSET_IPV4 | \
@@ -72,7 +74,8 @@
 
 #define ICE_FDIR_INSET_ETH_IPV4_VXLAN (\
ICE_FDIR_INSET_ETH | \
-   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST)
+   ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \
+   ICE_INSET_IPV4_PKID)
 
 #define ICE_FDIR_INSET_IPV4_GTPU (\
ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | ICE_INSET_GTPU_TEID)
@@ -95,6 +98,7 @@ static struct ice_pattern_match_item ice_fdir_pattern_list[] 
= {
{pattern_eth_ipv4_tcp,  
ICE_FDIR_INSET_ETH_IPV4_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv4_sctp, 
ICE_FDIR_INSET_ETH_IPV4_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6,  
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
+   {pattern_eth_ipv6_frag_ext, 
ICE_FDIR_INSET_ETH_IPV6,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_udp,  
ICE_FDIR_INSET_ETH_IPV6_UDP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_tcp,  
ICE_FDIR_INSET_ETH_IPV6_TCP,ICE_INSET_NONE, ICE_INSET_NONE},
{pattern_eth_ipv6_sctp, 
ICE_FDIR_INSET_ETH_IPV6_SCTP,   ICE_INSET_NONE, ICE_INSET_NONE},
@@ -882,11 +886,13 @@ ice_fdir_input_set_parse(uint64_t inset, enum 
ice_flow_field *field)
{ICE_INSET_IPV4_TOS, ICE_FLOW_FIELD_IDX_IPV4_DSCP},
{ICE_INSET_IPV4_TTL, ICE_FLOW_FIELD_IDX_IPV4_TTL},
{ICE_INSET_IPV4_PROTO, ICE_FLOW_FIELD_IDX_IPV4_PROT},
+   {ICE_INSET_IPV4_PKID, ICE_FLOW_FIELD_IDX_IPV4_ID},
{ICE_INSET_IPV6_SRC, ICE_FLOW_FIELD_IDX_IPV6_SA},
{ICE_INSET_IPV6_DST, ICE_FLOW_FIELD_IDX_IPV6_DA},
{ICE_INSET_IPV6_TC, ICE_FLOW_FIELD_IDX_IPV6_DSCP},
{ICE_INSET_IPV6_NEXT_HDR, ICE_FLOW_FIELD_IDX_IPV6_PROT},
{ICE_INSET_IPV6_HOP_LIMIT, ICE_FLOW_FIELD_IDX_IPV6_TTL},
+   {ICE_INSET_IPV6_PKID, ICE_FLOW_FIELD_IDX_IPV6_ID},
{ICE_INSET_TCP_SRC_PORT, ICE_FLOW_FIELD_IDX_TCP_SRC_PORT},
{ICE_INSET_TCP_DST_PORT, ICE_FLOW_FIELD_IDX_TCP_DST_PORT},
{ICE_INSET_UDP_SRC_PORT, ICE_FLOW_FIELD_IDX_UDP_SRC_PORT},
@@ -935,6 +941,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
  ICE_FLOW_SEG_HDR_IPV6 |
@@ -951,6 +961,10 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct 
ice_flow_seg_info *seg)
  ICE_FLOW_SEG_HDR_IPV_OTHER);
break;
case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
+   ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
+ ICE_FLOW_SEG_HDR_IPV_FRAG);
+   break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6

[dpdk-dev] [PATCH v1 2/3] net/ice: support RSS hash for IP fragment

2021-03-16 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_generic_flow.c | 21 +
 drivers/net/ice/ice_generic_flow.h |  6 
 drivers/net/ice/ice_hash.c | 48 +-
 3 files changed, 67 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/ice_generic_flow.c 
b/drivers/net/ice/ice_generic_flow.c
index 8704812622..2389bc6637 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -212,6 +212,27 @@ enum rte_flow_item_type pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_IPV6,
RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/ice/ice_generic_flow.h 
b/drivers/net/ice/ice_generic_flow.h
index 9f422e5925..2afe719264 100644
--- a/drivers/net/ice/ice_generic_flow.h
+++ b/drivers/net/ice/ice_generic_flow.h
@@ -52,6 +52,7 @@
 #define ICE_L2TPV3OIP_SESSION_ID   BIT_ULL(43)
 #define ICE_PFCP_SEID  BIT_ULL(42)
 #define ICE_PFCP_S_FIELD   BIT_ULL(41)
+#define ICE_IP_PK_ID   BIT_ULL(40)
 
 /* input set */
 
@@ -69,11 +70,13 @@
 #define ICE_INSET_IPV4_TOS (ICE_PROT_IPV4 | ICE_IP_TOS)
 #define ICE_INSET_IPV4_PROTO   (ICE_PROT_IPV4 | ICE_IP_PROTO)
 #define ICE_INSET_IPV4_TTL (ICE_PROT_IPV4 | ICE_IP_TTL)
+#define ICE_INSET_IPV4_PKID(ICE_PROT_IPV4 | ICE_IP_PK_ID)
 #define ICE_INSET_IPV6_SRC (ICE_PROT_IPV6 | ICE_IP_SRC)
 #define ICE_INSET_IPV6_DST (ICE_PROT_IPV6 | ICE_IP_DST)
 #define ICE_INSET_IPV6_NEXT_HDR(ICE_PROT_IPV6 | ICE_IP_PROTO)
 #define ICE_INSET_IPV6_HOP_LIMIT   (ICE_PROT_IPV6 | ICE_IP_TTL)
 #define ICE_INSET_IPV6_TC  (ICE_PROT_IPV6 | ICE_IP_TOS)
+#define ICE_INSET_IPV6_PKID(ICE_PROT_IPV6 | ICE_IP_PK_ID)
 
 #define ICE_INSET_TCP_SRC_PORT (ICE_PROT_TCP | ICE_SPORT)
 #define ICE_INSET_TCP_DST_PORT (ICE_PROT_TCP | ICE_DPORT)
@@ -202,6 +205,9 @@ extern enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type pattern_eth_ipv6[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c
index 58a0c18d09..b3ed9b219c 100644
--- a/drivers/net/ice/ice_hash.c
+++ b/drivers/net/ice/ice_hash.c
@@ -47,8 +47,10 @@
 ETH_RSS_NONFRAG_IPV6_TCP   | \
 ETH_RSS_NONFRAG_IPV6_SCTP)
 
-#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | VALID_RSS_IPV4_L4)
-#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | VALID_RSS_IPV6_L4)
+#define VALID_RSS_IPV4 (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
+VALID_RSS_IPV4_L4)
+#define VALID_RSS_IPV6 (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | \
+VALID_RSS_IPV6_L4)
 #define VALID_RSS_L3   (VALID_RSS_IPV4 | VALID_RSS_IPV6)
 #define VALID_RSS_L4   (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
 
@@ -108,6 +110,7 @@ ice_hash_parse_pattern_action(struct ice_adapter *ad,
 /* Rss configuration template */
 struct ice_rss_hash_cfg ipv4_tmplt = {
ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
ICE_FLOW_SEG_HDR_IPV_OTHER,
ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV4,
ICE_RSS_ANY_HEADERS,
@@ -146,6 +149,15 @@ struct ice_rss_hash_cfg ipv6_tmplt = {
0
 };
 
+struct ice_rss_hash_cfg ipv6_frag_tmplt = {
+   ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
+   ICE_FLOW_SEG_HDR_IPV_FRAG |
+   ICE_FLOW_SEG_HDR_IPV_OTHER,
+   ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV6,
+   ICE_RSS_ANY_HEADERS,
+   0
+};
+
 struct ice_rss_hash_cfg

[dpdk-dev] [PATCH v1 1/3] net/ice/base: support IP fragment RSS and FDIR

2021-03-16 Thread Jeff Guo
Add support for IP fragment RSS hash and FDIR according to packet ID.
Separate IP fragment and IP other packet types.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_fdir.c | 50 +++--
 drivers/net/ice/base/ice_fdir.h | 22 ---
 drivers/net/ice/base/ice_flow.c | 50 -
 drivers/net/ice/base/ice_flow.h |  5 +++-
 drivers/net/ice/base/ice_type.h |  1 +
 5 files changed, 120 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ice/base/ice_fdir.c b/drivers/net/ice/base/ice_fdir.c
index 2b39c13127..0eb7cdd729 100644
--- a/drivers/net/ice/base/ice_fdir.c
+++ b/drivers/net/ice/base/ice_fdir.c
@@ -518,6 +518,24 @@ static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
+static const u8 ice_fdir_ipv6_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x2C, 0x40, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static const u8 ice_fdir_ipv4_frag_pkt[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+   0x00, 0x14, 0x00, 0x00, 0x20, 0x00, 0x40, 0x10,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00
+};
 static const u8 ice_fdir_tcpv6_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
@@ -716,6 +734,16 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
},
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV4,
+   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
+   sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_frag_pkt,
+   },
+   {
+   ICE_FLTR_PTYPE_FRAG_IPV6,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
+   },
{
ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
sizeof(ice_fdir_ipv4_gtpu4_pkt),
@@ -1505,7 +1533,7 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
if (frag)
-   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
+   loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
break;
case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
@@ -1808,6 +1836,23 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct 
ice_fdir_fltr *input,
  input->ip.v6.proto);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
break;
+   case ICE_FLTR_PTYPE_FRAG_IPV4:
+   ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
+  input->ip.v4.src_ip);
+   ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
+  input->ip.v4.dst_ip);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+   ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
+  input->ip.v4.packet_id);
+   ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
+   ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
+ input->ip.v4.proto);
+   ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
+   break;
+   case ICE_FLTR_PTYPE_FRAG_IPV6:
+   ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
+  input->ip.v6.packet_id);
+   break;
default:
return ICE_ERR_PARAM;
}
@@ -1838,7 +1883,8 @@ ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 
*pkt, bool frag)
  */
 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
 {
-   if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
+   if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
+   flow == ICE_FLTR_PTYPE_FRAG_IPV6)
return true;
else
return false;
diff --git a/drivers/net/ice/base/ice_fdir.h b/drivers/net/ice/base/ice_fdir.h
index 6573f96bc1..2acc1d6f1b 100644
--- a/drivers/net/ice/base/ice_fdir.h
+++ b/drivers/net/ice/base/ice_fdir.h
@@ -43,9 +43,11 @@
 #define ICE_MAC_ETHTYPE_OFFSET 12
 #define ICE_IPV4_TOS_OFFSET

[dpdk-dev] [PATCH v1 0/3] support flow for IP fragment in ICE

2021-03-16 Thread Jeff Guo
Support RSS hash and FDIR for IP fragment packets in ICE PMD.

Jeff Guo (3):
  net/ice/base: support IP fragment RSS and FDIR
  net/ice: support RSS hash for IP fragment
  net/ice: support FDIR for IP fragment packet

 drivers/net/ice/base/ice_fdir.c| 50 -
 drivers/net/ice/base/ice_fdir.h| 22 ++--
 drivers/net/ice/base/ice_flow.c| 50 -
 drivers/net/ice/base/ice_flow.h|  5 +-
 drivers/net/ice/base/ice_type.h|  1 +
 drivers/net/ice/ice_fdir_filter.c  | 87 +-
 drivers/net/ice/ice_generic_flow.c | 21 
 drivers/net/ice/ice_generic_flow.h |  6 +++
 drivers/net/ice/ice_hash.c | 48 ++---
 9 files changed, 260 insertions(+), 30 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v1 4/4] net/iavf: support FDIR for IP fragment packet

2021-03-16 Thread Jeff Guo
New FDIR parsing are added to handle the fragmented IPv4/IPv6 packet.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_fdir.c | 278 ++-
 drivers/net/iavf/iavf_generic_flow.h |   5 +
 2 files changed, 190 insertions(+), 93 deletions(-)

diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index e3f3b5f22a..348d423081 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -34,7 +34,7 @@
 #define IAVF_FDIR_INSET_ETH_IPV4 (\
IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
IAVF_INSET_IPV4_PROTO | IAVF_INSET_IPV4_TOS | \
-   IAVF_INSET_IPV4_TTL)
+   IAVF_INSET_IPV4_TTL | IAVF_INSET_IPV4_ID)
 
 #define IAVF_FDIR_INSET_ETH_IPV4_UDP (\
IAVF_INSET_IPV4_SRC | IAVF_INSET_IPV4_DST | \
@@ -56,6 +56,9 @@
IAVF_INSET_IPV6_NEXT_HDR | IAVF_INSET_IPV6_TC | \
IAVF_INSET_IPV6_HOP_LIMIT)
 
+#define IAVF_FDIR_INSET_ETH_IPV6_FRAG_EXT (\
+   IAVF_INSET_IPV6_ID)
+
 #define IAVF_FDIR_INSET_ETH_IPV6_UDP (\
IAVF_INSET_IPV6_SRC | IAVF_INSET_IPV6_DST | \
IAVF_INSET_IPV6_TC | IAVF_INSET_IPV6_HOP_LIMIT | \
@@ -117,6 +120,7 @@ static struct iavf_pattern_match_item iavf_fdir_pattern[] = 
{
{iavf_pattern_eth_ipv4_tcp, IAVF_FDIR_INSET_ETH_IPV4_TCP,   
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv4_sctp,IAVF_FDIR_INSET_ETH_IPV4_SCTP,  
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6, IAVF_FDIR_INSET_ETH_IPV6,   
IAVF_INSET_NONE},
+   {iavf_pattern_eth_ipv6_frag_ext,
IAVF_FDIR_INSET_ETH_IPV6_FRAG_EXT,  IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_udp, IAVF_FDIR_INSET_ETH_IPV6_UDP,   
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_tcp, IAVF_FDIR_INSET_ETH_IPV6_TCP,   
IAVF_INSET_NONE},
{iavf_pattern_eth_ipv6_sctp,IAVF_FDIR_INSET_ETH_IPV6_SCTP,  
IAVF_INSET_NONE},
@@ -496,12 +500,13 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
struct iavf_fdir_conf *filter)
 {
struct virtchnl_proto_hdrs hdrs = filter->add_fltr.rule_cfg.proto_hdrs;
-   const struct rte_flow_item *item = pattern;
-   enum rte_flow_item_type item_type;
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
const struct rte_flow_item_eth *eth_spec, *eth_mask;
-   const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_mask;
+   const struct rte_flow_item_ipv4 *ipv4_spec, *ipv4_last, *ipv4_mask;
const struct rte_flow_item_ipv6 *ipv6_spec, *ipv6_mask;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_spec;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_last;
+   const struct rte_flow_item_ipv6_frag_ext *ipv6_frag_mask;
const struct rte_flow_item_udp *udp_spec, *udp_mask;
const struct rte_flow_item_tcp *tcp_spec, *tcp_mask;
const struct rte_flow_item_sctp *sctp_spec, *sctp_mask;
@@ -512,15 +517,16 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
const struct rte_flow_item_ah *ah_spec, *ah_mask;
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 *item = pattern;
+   struct virtchnl_proto_hdr *hdr, *hdr1 = NULL;
struct rte_ecpri_common_hdr ecpri_common;
uint64_t input_set = IAVF_INSET_NONE;
-   uint8_t proto_id;
-
+   enum rte_flow_item_type item_type;
enum rte_flow_item_type next_type;
+   bool spec_all_pid = false;
uint16_t ether_type;
-
+   uint8_t proto_id;
int layer = 0;
-   struct virtchnl_proto_hdr *hdr;
 
uint8_t  ipv6_addr_mask[16] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
@@ -528,12 +534,6 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
};
 
for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
-   if (item->last) {
-   rte_flow_error_set(error, EINVAL,
-   RTE_FLOW_ERROR_TYPE_ITEM, item,
-   "Not support range");
-   }
-
item_type = item->type;
 
switch (item_type) {
@@ -542,12 +542,12 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
eth_mask = item->mask;
next_type = (item + 1)->type;
 
-   hdr = &hdrs.proto_hdr[layer];
+   hdr1 = &hdrs.proto_hdr[layer];
 
-   VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, ETH);
+   VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, ETH);
 
if (next_type == RTE_FLOW_ITEM_TYPE_END &&
-   (!eth_spec || !eth_mask)) {
+  

[dpdk-dev] [PATCH v1 3/4] net/iavf: support RSS hash for IP fragment

2021-03-16 Thread Jeff Guo
New pattern and RSS hash flow parsing are added to handle fragmented
IPv4/IPv6  packet.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_generic_flow.c | 24 
 drivers/net/iavf/iavf_generic_flow.h |  3 +++
 drivers/net/iavf/iavf_hash.c | 33 +++-
 3 files changed, 54 insertions(+), 6 deletions(-)

diff --git a/drivers/net/iavf/iavf_generic_flow.c 
b/drivers/net/iavf/iavf_generic_flow.c
index 8635ff83ca..242bb4abc5 100644
--- a/drivers/net/iavf/iavf_generic_flow.c
+++ b/drivers/net/iavf/iavf_generic_flow.c
@@ -219,6 +219,30 @@ enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[] = {
RTE_FLOW_ITEM_TYPE_END,
 };
 
+enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[] = {
+   RTE_FLOW_ITEM_TYPE_ETH,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_VLAN,
+   RTE_FLOW_ITEM_TYPE_IPV6,
+   RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+   RTE_FLOW_ITEM_TYPE_END,
+};
+
 enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[] = {
RTE_FLOW_ITEM_TYPE_ETH,
RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/iavf/iavf_generic_flow.h 
b/drivers/net/iavf/iavf_generic_flow.h
index 0ccf5901b4..ce3d12bcd9 100644
--- a/drivers/net/iavf/iavf_generic_flow.h
+++ b/drivers/net/iavf/iavf_generic_flow.h
@@ -172,6 +172,9 @@ extern enum rte_flow_item_type 
iavf_pattern_eth_qinq_ipv4_icmp[];
 extern enum rte_flow_item_type iavf_pattern_eth_ipv6[];
 extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6[];
 extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6[];
+extern enum rte_flow_item_type iavf_pattern_eth_ipv6_frag_ext[];
+extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_frag_ext[];
+extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_frag_ext[];
 extern enum rte_flow_item_type iavf_pattern_eth_ipv6_udp[];
 extern enum rte_flow_item_type iavf_pattern_eth_vlan_ipv6_udp[];
 extern enum rte_flow_item_type iavf_pattern_eth_qinq_ipv6_udp[];
diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index d8d22f8009..d46529c61e 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -112,6 +112,10 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED} }
 
+#define proto_hdr_ipv6_frag { \
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG, \
+   FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PKID), {BUFF_NOUSED} }
+
 #define proto_hdr_ipv6_with_prot { \
VIRTCHNL_PROTO_HDR_IPV6, \
FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
@@ -190,6 +194,12 @@ struct virtchnl_proto_hdrs outer_ipv6_tmplt = {
{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan, proto_hdr_ipv6}
 };
 
+struct virtchnl_proto_hdrs outer_ipv6_frag_tmplt = {
+   TUNNEL_LEVEL_OUTER, 5,
+   {proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
+proto_hdr_ipv6, proto_hdr_ipv6_frag}
+};
+
 struct virtchnl_proto_hdrs outer_ipv6_udp_tmplt = {
TUNNEL_LEVEL_OUTER, 5,
{proto_hdr_eth, proto_hdr_svlan, proto_hdr_cvlan,
@@ -303,7 +313,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 /* rss type super set */
 
 /* IPv4 outer */
-#define IAVF_RSS_TYPE_OUTER_IPV4   (ETH_RSS_ETH | ETH_RSS_IPV4)
+#define IAVF_RSS_TYPE_OUTER_IPV4   (ETH_RSS_ETH | ETH_RSS_IPV4 | \
+ETH_RSS_FRAG_IPV4)
 #define IAVF_RSS_TYPE_OUTER_IPV4_UDP   (IAVF_RSS_TYPE_OUTER_IPV4 | \
 ETH_RSS_NONFRAG_IPV4_UDP)
 #define IAVF_RSS_TYPE_OUTER_IPV4_TCP   (IAVF_RSS_TYPE_OUTER_IPV4 | \
@@ -312,6 +323,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 ETH_RSS_NONFRAG_IPV4_SCTP)
 /* IPv6 outer */
 #define IAVF_RSS_TYPE_OUTER_IPV6   (ETH_RSS_ETH | ETH_RSS_IPV6)
+#define IAVF_RSS_TYPE_OUTER_IPV6_FRAG  (IAVF_RSS_TYPE_OUTER_IPV6 | \
+ETH_RSS_FRAG_IPV6)
 #define IAVF_RSS_TYPE_OUTER_IPV6_UDP   (IAVF_RSS_TYPE_OUTER_IPV6 | \
 ETH_RSS_NONFRAG_IPV6_UDP)
 #define IAVF_RSS_TYPE_OUTER_IPV6_TCP   (IAVF_RSS_TYPE_OUTER_IPV6 | \
@@ -330,6 +343,8 @@ struct virtchnl_proto_hdrs ipv4_ecpri_tmplt = {
 /* VLAN IPv6 */
 #define IAVF_RSS_TYPE_VLAN_IPV6(IAVF_RSS_TYPE_OUTER_IPV6 | \
 ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
+#define IAVF_RSS_TYPE_VLAN_IPV6_FRAG   (IAVF_RSS_TYPE_OUTER_IPV6_FRAG

[dpdk-dev] [PATCH v1 0/4] support flow for IP fragment in IAVF

2021-03-16 Thread Jeff Guo
Support RSS hash and FDIR for IP fragment packets in IAVF PMD.

Jeff Guo (4):
  app/testpmd: add packet id for IP fragment
  common/iavf: add proto header for IP fragment
  net/iavf: support RSS hash for IP fragment
  net/iavf: support FDIR for IP fragment packet

 app/test-pmd/cmdline_flow.c  |  21 +-
 drivers/common/iavf/virtchnl.h   |   5 +
 drivers/net/iavf/iavf_fdir.c | 278 ++-
 drivers/net/iavf/iavf_generic_flow.c |  24 +++
 drivers/net/iavf/iavf_generic_flow.h |   8 +
 drivers/net/iavf/iavf_hash.c |  33 +++-
 6 files changed, 269 insertions(+), 100 deletions(-)

-- 
2.20.1



[dpdk-dev] [PATCH v1 1/4] app/testpmd: add packet id for IP fragment

2021-03-16 Thread Jeff Guo
Add the new items to support the flow configuration for IP fragment
packets.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 app/test-pmd/cmdline_flow.c | 21 -
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 49d9f9c043..331a08eec4 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -166,6 +166,7 @@ enum index {
ITEM_VLAN_HAS_MORE_VLAN,
ITEM_IPV4,
ITEM_IPV4_TOS,
+   ITEM_IPV4_ID,
ITEM_IPV4_FRAGMENT_OFFSET,
ITEM_IPV4_TTL,
ITEM_IPV4_PROTO,
@@ -236,6 +237,7 @@ enum index {
ITEM_IPV6_FRAG_EXT,
ITEM_IPV6_FRAG_EXT_NEXT_HDR,
ITEM_IPV6_FRAG_EXT_FRAG_DATA,
+   ITEM_IPV6_FRAG_EXT_ID,
ITEM_ICMP6,
ITEM_ICMP6_TYPE,
ITEM_ICMP6_CODE,
@@ -1026,6 +1028,7 @@ static const enum index item_vlan[] = {
 
 static const enum index item_ipv4[] = {
ITEM_IPV4_TOS,
+   ITEM_IPV4_ID,
ITEM_IPV4_FRAGMENT_OFFSET,
ITEM_IPV4_TTL,
ITEM_IPV4_PROTO,
@@ -1162,6 +1165,7 @@ static const enum index item_ipv6_ext[] = {
 static const enum index item_ipv6_frag_ext[] = {
ITEM_IPV6_FRAG_EXT_NEXT_HDR,
ITEM_IPV6_FRAG_EXT_FRAG_DATA,
+   ITEM_IPV6_FRAG_EXT_ID,
ITEM_NEXT,
ZERO,
 };
@@ -2462,6 +2466,13 @@ static const struct token token_list[] = {
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv4,
 hdr.type_of_service)),
},
+   [ITEM_IPV4_ID] = {
+   .name = "packet_id",
+   .help = "fragment packet id",
+   .next = NEXT(item_ipv4, NEXT_ENTRY(UNSIGNED), item_param),
+   .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv4,
+hdr.packet_id)),
+   },
[ITEM_IPV4_FRAGMENT_OFFSET] = {
.name = "fragment_offset",
.help = "fragmentation flags and fragment offset",
@@ -2965,12 +2976,20 @@ static const struct token token_list[] = {
},
[ITEM_IPV6_FRAG_EXT_FRAG_DATA] = {
.name = "frag_data",
-   .help = "Fragment flags and offset",
+   .help = "fragment flags and offset",
.next = NEXT(item_ipv6_frag_ext, NEXT_ENTRY(UNSIGNED),
 item_param),
.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv6_frag_ext,
 hdr.frag_data)),
},
+   [ITEM_IPV6_FRAG_EXT_ID] = {
+   .name = "packet_id",
+   .help = "fragment packet id",
+   .next = NEXT(item_ipv6_frag_ext, NEXT_ENTRY(UNSIGNED),
+item_param),
+   .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_ipv6_frag_ext,
+hdr.id)),
+   },
[ITEM_ICMP6] = {
.name = "icmp6",
.help = "match any ICMPv6 header",
-- 
2.20.1



[dpdk-dev] [PATCH v1 2/4] common/iavf: add proto header for IP fragment

2021-03-16 Thread Jeff Guo
Add new virtchnl protocol header type and fields for IP fragment packets
to support RSS hash and FDIR.

Signed-off-by: Ting Xu 
Signed-off-by: Jeff Guo 
---
 drivers/common/iavf/virtchnl.h | 5 +
 1 file changed, 5 insertions(+)

diff --git a/drivers/common/iavf/virtchnl.h b/drivers/common/iavf/virtchnl.h
index 6b99e170f0..36e60510ca 100644
--- a/drivers/common/iavf/virtchnl.h
+++ b/drivers/common/iavf/virtchnl.h
@@ -1430,6 +1430,7 @@ enum virtchnl_proto_hdr_type {
VIRTCHNL_PROTO_HDR_PFCP,
VIRTCHNL_PROTO_HDR_GTPC,
VIRTCHNL_PROTO_HDR_ECPRI,
+   VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG,
 };
 
 /* Protocol header field within a protocol header. */
@@ -1452,6 +1453,7 @@ enum virtchnl_proto_hdr_field {
VIRTCHNL_PROTO_HDR_IPV4_DSCP,
VIRTCHNL_PROTO_HDR_IPV4_TTL,
VIRTCHNL_PROTO_HDR_IPV4_PROT,
+   VIRTCHNL_PROTO_HDR_IPV4_PKID,
/* IPV6 */
VIRTCHNL_PROTO_HDR_IPV6_SRC =
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6),
@@ -1472,6 +1474,9 @@ enum virtchnl_proto_hdr_field {
VIRTCHNL_PROTO_HDR_IPV6_PREFIX64_DST,
VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_SRC,
VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_DST,
+   /* IPv6 Extension Header Fragment */
+   VIRTCHNL_PROTO_HDR_IPV6_PKID =
+   PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG),
/* TCP */
VIRTCHNL_PROTO_HDR_TCP_SRC_PORT =
PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_TCP),
-- 
2.20.1



[dpdk-dev] [PATCH v2] net/iavf: fix FDIR configure

2021-03-16 Thread Jeff Guo
The configure of TCP/UDP flow item should not affact other flow
configure which not include L4 layer. Fix and clean the protocol header
refinement function.

Fixes: 61abc5f611a0 ("net/iavf: support TCP/UDP flow item without input set")

Signed-off-by: Jeff Guo 
---
v2:
fix coding style issue
---
 drivers/net/iavf/iavf_fdir.c | 109 ---
 1 file changed, 49 insertions(+), 60 deletions(-)

diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index 4e864b4b9c..e3f3b5f22a 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -456,35 +456,16 @@ iavf_fdir_parse_action(struct iavf_adapter *ad,
return 0;
 }
 
-static bool
-iavf_fdir_refine_input_set(const uint64_t input_set,
-  const uint64_t input_set_mask,
-  struct iavf_fdir_conf *filter)
+#defineIAVF_IPPROTO_TCP 6
+#defineIAVF_IPPROTO_UDP 17
+
+static void
+iavf_fdir_refine_proto_hdr(struct virtchnl_proto_hdr *hdr,
+  uint8_t proto_id)
 {
-   struct virtchnl_proto_hdr *hdr, *hdr_last;
struct rte_flow_item_ipv4 ipv4_spec;
struct rte_flow_item_ipv6 ipv6_spec;
-   int last_layer;
-   uint8_t proto_id;
-
-   if (input_set & ~input_set_mask)
-   return false;
-   else if (input_set)
-   return true;
-
-   last_layer = filter->add_fltr.rule_cfg.proto_hdrs.count - 1;
-   /* Last layer of TCP/UDP pattern isn't less than 2. */
-   if (last_layer < 2)
-   return false;
-   hdr_last = &filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[last_layer];
-   if (hdr_last->type == VIRTCHNL_PROTO_HDR_TCP)
-   proto_id = 6;
-   else if (hdr_last->type == VIRTCHNL_PROTO_HDR_UDP)
-   proto_id = 17;
-   else
-   return false;
 
-   hdr = &filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[last_layer - 1];
switch (hdr->type) {
case VIRTCHNL_PROTO_HDR_IPV4:
VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV4, PROT);
@@ -492,17 +473,19 @@ iavf_fdir_refine_input_set(const uint64_t input_set,
ipv4_spec.hdr.next_proto_id = proto_id;
rte_memcpy(hdr->buffer, &ipv4_spec.hdr,
   sizeof(ipv4_spec.hdr));
-   return true;
+   break;
case VIRTCHNL_PROTO_HDR_IPV6:
VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV6, PROT);
memset(&ipv6_spec, 0, sizeof(ipv6_spec));
ipv6_spec.hdr.proto = proto_id;
rte_memcpy(hdr->buffer, &ipv6_spec.hdr,
   sizeof(ipv6_spec.hdr));
-   return true;
+   break;
default:
-   return false;
+   break;
}
+
+   return;
 }
 
 static int
@@ -512,6 +495,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
struct rte_flow_error *error,
struct iavf_fdir_conf *filter)
 {
+   struct virtchnl_proto_hdrs hdrs = filter->add_fltr.rule_cfg.proto_hdrs;
const struct rte_flow_item *item = pattern;
enum rte_flow_item_type item_type;
enum rte_flow_item_type l3 = RTE_FLOW_ITEM_TYPE_END;
@@ -530,6 +514,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
const struct rte_flow_item_ecpri *ecpri_spec, *ecpri_mask;
struct rte_ecpri_common_hdr ecpri_common;
uint64_t input_set = IAVF_INSET_NONE;
+   uint8_t proto_id;
 
enum rte_flow_item_type next_type;
uint16_t ether_type;
@@ -557,7 +542,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
eth_mask = item->mask;
next_type = (item + 1)->type;
 
-   hdr = 
&filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[layer];
+   hdr = &hdrs.proto_hdr[layer];
 
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, ETH);
 
@@ -604,7 +589,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
eth_spec, sizeof(struct rte_ether_hdr));
}
 
-   filter->add_fltr.rule_cfg.proto_hdrs.count = ++layer;
+   hdrs.count = ++layer;
break;
 
case RTE_FLOW_ITEM_TYPE_IPV4:
@@ -612,7 +597,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
ipv4_spec = item->spec;
ipv4_mask = item->mask;
 
-   hdr = 
&filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[layer];
+   hdr = &hdrs.proto_hdr[layer];
 
VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, IPV4);
 
@@ -655,7 +640,7 @@ iavf_fdir_parse_pa

[dpdk-dev] [PATCH v1] net/iavf: fix FDIR configure

2021-03-11 Thread Jeff Guo
The refine configure of TCP/UDP flow item should not affact other flow
configure which not include L4 layer. Fix and clean the refinement
function.

Fixes: 61abc5f611a0 ("net/iavf: support TCP/UDP flow item without input set")

Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_fdir.c | 54 +---
 1 file changed, 20 insertions(+), 34 deletions(-)

diff --git a/drivers/net/iavf/iavf_fdir.c b/drivers/net/iavf/iavf_fdir.c
index 4e864b4b9c..d057fc515d 100644
--- a/drivers/net/iavf/iavf_fdir.c
+++ b/drivers/net/iavf/iavf_fdir.c
@@ -456,35 +456,16 @@ iavf_fdir_parse_action(struct iavf_adapter *ad,
return 0;
 }
 
-static bool
-iavf_fdir_refine_input_set(const uint64_t input_set,
-  const uint64_t input_set_mask,
-  struct iavf_fdir_conf *filter)
+#defineIAVF_IPPROTO_TCP 6
+#defineIAVF_IPPROTO_UDP 17
+
+static void
+iavf_fdir_refine_proto_hdr(struct virtchnl_proto_hdr *hdr,
+  uint8_t proto_id)
 {
-   struct virtchnl_proto_hdr *hdr, *hdr_last;
struct rte_flow_item_ipv4 ipv4_spec;
struct rte_flow_item_ipv6 ipv6_spec;
-   int last_layer;
-   uint8_t proto_id;
-
-   if (input_set & ~input_set_mask)
-   return false;
-   else if (input_set)
-   return true;
-
-   last_layer = filter->add_fltr.rule_cfg.proto_hdrs.count - 1;
-   /* Last layer of TCP/UDP pattern isn't less than 2. */
-   if (last_layer < 2)
-   return false;
-   hdr_last = &filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[last_layer];
-   if (hdr_last->type == VIRTCHNL_PROTO_HDR_TCP)
-   proto_id = 6;
-   else if (hdr_last->type == VIRTCHNL_PROTO_HDR_UDP)
-   proto_id = 17;
-   else
-   return false;
 
-   hdr = &filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[last_layer - 1];
switch (hdr->type) {
case VIRTCHNL_PROTO_HDR_IPV4:
VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV4, PROT);
@@ -492,17 +473,19 @@ iavf_fdir_refine_input_set(const uint64_t input_set,
ipv4_spec.hdr.next_proto_id = proto_id;
rte_memcpy(hdr->buffer, &ipv4_spec.hdr,
   sizeof(ipv4_spec.hdr));
-   return true;
+   break;
case VIRTCHNL_PROTO_HDR_IPV6:
VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV6, PROT);
memset(&ipv6_spec, 0, sizeof(ipv6_spec));
ipv6_spec.hdr.proto = proto_id;
rte_memcpy(hdr->buffer, &ipv6_spec.hdr,
   sizeof(ipv6_spec.hdr));
-   return true;
+   break;
default:
-   return false;
+   break;
}
+
+   return;
 }
 
 static int
@@ -530,6 +513,7 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
const struct rte_flow_item_ecpri *ecpri_spec, *ecpri_mask;
struct rte_ecpri_common_hdr ecpri_common;
uint64_t input_set = IAVF_INSET_NONE;
+   uint8_t proto_id;
 
enum rte_flow_item_type next_type;
uint16_t ether_type;
@@ -746,6 +730,9 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
sizeof(udp_spec->hdr));
}
 
+   proto_id = IAVF_IPPROTO_UDP;
+   
iavf_fdir_refine_proto_hdr(&filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[layer
 - 1], proto_id);
+
filter->add_fltr.rule_cfg.proto_hdrs.count = ++layer;
break;
 
@@ -790,6 +777,9 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
sizeof(tcp_spec->hdr));
}
 
+   proto_id = IAVF_IPPROTO_TCP;
+   
iavf_fdir_refine_proto_hdr(&filter->add_fltr.rule_cfg.proto_hdrs.proto_hdr[layer
 - 1], proto_id);
+
filter->add_fltr.rule_cfg.proto_hdrs.count = ++layer;
break;
 
@@ -1016,12 +1006,8 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter 
*ad,
return -rte_errno;
}
 
-   if (!iavf_fdir_refine_input_set(input_set, input_set_mask, filter)) {
-   rte_flow_error_set(error, EINVAL,
-  RTE_FLOW_ERROR_TYPE_ITEM_SPEC, pattern,
-  "Invalid input set");
-   return -rte_errno;
-   }
+   if (input_set & ~input_set_mask)
+   return -EINVAL;
 
filter->input_set = input_set;
 
-- 
2.20.1



[dpdk-dev] [dpdk-dev v1] net/ice: fix flow rule checking

2021-01-19 Thread Jeff Guo
Add empty item into the pattern mapping list when checking the ptype is
supported or not, since we do support the NUll pattern for rte flow in
ice pmd.

Fixes: 68b6240ee9f0 ("net/ice: refactor packet type parsing")

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_generic_flow.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ice/ice_generic_flow.c 
b/drivers/net/ice/ice_generic_flow.c
index 454650f6ac..c4496dbbe1 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -2151,6 +2151,7 @@ static struct ice_ptype_match ice_ptype_map[] = {
{pattern_eth_ipv4_nvgre_eth_ipv4,   
ICE_MAC_IPV4_TUN_IPV4_PAY},
{pattern_eth_ipv4_nvgre_eth_ipv4_udp,   
ICE_MAC_IPV4_TUN_IPV4_UDP_PAY},
{pattern_eth_ipv4_nvgre_eth_ipv4_tcp,   
ICE_MAC_IPV4_TUN_IPV4_TCP},
+   {pattern_empty, 0},
 };
 
 static bool
-- 
2.20.1



[dpdk-dev] [dpdk-dev v5] net/ice: enable eCPRI tunnel port configure in dcf

2021-01-18 Thread Jeff Guo
Add eCPRI tunnel port add and rm ops to configure eCPRI UDP tunnel port
in dcf.

Signed-off-by: Jeff Guo 
---
v5:
rebase patch

v4:
add doc
---
 doc/guides/rel_notes/release_21_02.rst | 12 +
 drivers/net/ice/ice_dcf_ethdev.c   | 67 ++
 2 files changed, 79 insertions(+)

diff --git a/doc/guides/rel_notes/release_21_02.rst 
b/doc/guides/rel_notes/release_21_02.rst
index 78ec2758e2..6b7870779f 100644
--- a/doc/guides/rel_notes/release_21_02.rst
+++ b/doc/guides/rel_notes/release_21_02.rst
@@ -106,6 +106,18 @@ New Features
 
   * Added Double VLAN support for DCF switch QinQ filtering.
 
+* **Updated the Intel ice driver.**
+
+  Updated the Intel ice driver with new features and improvements, including:
+
+  * Added support for UDP dynamic port assignment for eCPRI protocol feature.
+
+* **Updated Intel iavf driver.**
+
+  Updated iavf PMD with new features and improvements, including:
+
+  * Added support for FDIR/RSS packet steering for flow type eCPRI protocol 
features.
+
 
 Removed Items
 -
diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
index d46734a57b..04e42d322a 100644
--- a/drivers/net/ice/ice_dcf_ethdev.c
+++ b/drivers/net/ice/ice_dcf_ethdev.c
@@ -26,6 +26,13 @@
 #include "ice_dcf_ethdev.h"
 #include "ice_rxtx.h"
 
+static int
+ice_dcf_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel);
+static int
+ice_dcf_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel);
+
 static uint16_t
 ice_dcf_recv_pkts(__rte_unused void *rx_queue,
  __rte_unused struct rte_mbuf **bufs,
@@ -870,6 +877,64 @@ ice_dcf_link_update(__rte_unused struct rte_eth_dev *dev,
return 0;
 }
 
+/* Add UDP tunneling port */
+static int
+ice_dcf_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel)
+{
+   struct ice_dcf_adapter *adapter = dev->data->dev_private;
+   struct ice_adapter *parent_adapter = &adapter->parent;
+   struct ice_hw *parent_hw = &parent_adapter->hw;
+   int ret = 0;
+
+   if (!udp_tunnel)
+   return -EINVAL;
+
+   switch (udp_tunnel->prot_type) {
+   case RTE_TUNNEL_TYPE_VXLAN:
+   ret = ice_create_tunnel(parent_hw, TNL_VXLAN,
+   udp_tunnel->udp_port);
+   break;
+   case RTE_TUNNEL_TYPE_ECPRI:
+   ret = ice_create_tunnel(parent_hw, TNL_ECPRI,
+   udp_tunnel->udp_port);
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "Invalid tunnel type");
+   ret = -EINVAL;
+   break;
+   }
+
+   return ret;
+}
+
+/* Delete UDP tunneling port */
+static int
+ice_dcf_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel)
+{
+   struct ice_dcf_adapter *adapter = dev->data->dev_private;
+   struct ice_adapter *parent_adapter = &adapter->parent;
+   struct ice_hw *parent_hw = &parent_adapter->hw;
+   int ret = 0;
+
+   if (!udp_tunnel)
+   return -EINVAL;
+
+   switch (udp_tunnel->prot_type) {
+   case RTE_TUNNEL_TYPE_VXLAN:
+   case RTE_TUNNEL_TYPE_ECPRI:
+   ret = ice_destroy_tunnel(parent_hw, udp_tunnel->udp_port, 0);
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "Invalid tunnel type");
+   ret = -EINVAL;
+   break;
+   }
+
+   return ret;
+}
+
 static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
.dev_start   = ice_dcf_dev_start,
.dev_stop= ice_dcf_dev_stop,
@@ -892,6 +957,8 @@ static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
.allmulticast_enable = ice_dcf_dev_allmulticast_enable,
.allmulticast_disable= ice_dcf_dev_allmulticast_disable,
.filter_ctrl = ice_dcf_dev_filter_ctrl,
+   .udp_tunnel_port_add = ice_dcf_dev_udp_tunnel_port_add,
+   .udp_tunnel_port_del = ice_dcf_dev_udp_tunnel_port_del,
 };
 
 static int
-- 
2.20.1



[dpdk-dev] [dpdk-dev v4] net/ice: enable eCPRI tunnel port configure in dcf

2021-01-18 Thread Jeff Guo
Add eCPRI tunnel port add and rm ops to configure eCPRI UDP tunnel port
in dcf.

Signed-off-by: Jeff Guo 
---
 doc/guides/rel_notes/release_21_02.rst | 12 +
 drivers/net/ice/ice_dcf_ethdev.c   | 67 ++
 2 files changed, 79 insertions(+)

diff --git a/doc/guides/rel_notes/release_21_02.rst 
b/doc/guides/rel_notes/release_21_02.rst
index 3bb0b9a9ed..c84f0bfad9 100644
--- a/doc/guides/rel_notes/release_21_02.rst
+++ b/doc/guides/rel_notes/release_21_02.rst
@@ -72,6 +72,18 @@ New Features
 
   * Added inner UDP/IPv4 support for VXLAN IPv4 GSO.
 
+* **Updated the Intel ice driver.**
+
+  Updated the Intel ice driver with new features and improvements, including:
+
+  * Added support for UDP dynamic port assignment for eCPRI protocol feature.
+
+* **Updated Intel iavf driver.**
+
+  Updated iavf PMD with new features and improvements, including:
+
+  * Added support for FDIR/RSS packet steering for flow type eCPRI protocol 
features.
+
 
 Removed Items
 -
diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
index a9e78064d4..c8357f5054 100644
--- a/drivers/net/ice/ice_dcf_ethdev.c
+++ b/drivers/net/ice/ice_dcf_ethdev.c
@@ -26,6 +26,13 @@
 #include "ice_dcf_ethdev.h"
 #include "ice_rxtx.h"
 
+static int
+ice_dcf_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel);
+static int
+ice_dcf_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel);
+
 static uint16_t
 ice_dcf_recv_pkts(__rte_unused void *rx_queue,
  __rte_unused struct rte_mbuf **bufs,
@@ -870,6 +877,64 @@ ice_dcf_link_update(__rte_unused struct rte_eth_dev *dev,
return 0;
 }
 
+/* Add UDP tunneling port */
+static int
+ice_dcf_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel)
+{
+   struct ice_dcf_adapter *adapter = dev->data->dev_private;
+   struct ice_adapter *parent_adapter = &adapter->parent;
+   struct ice_hw *parent_hw = &parent_adapter->hw;
+   int ret = 0;
+
+   if (!udp_tunnel)
+   return -EINVAL;
+
+   switch (udp_tunnel->prot_type) {
+   case RTE_TUNNEL_TYPE_VXLAN:
+   ret = ice_create_tunnel(parent_hw, TNL_VXLAN,
+   udp_tunnel->udp_port);
+   break;
+   case RTE_TUNNEL_TYPE_ECPRI:
+   ret = ice_create_tunnel(parent_hw, TNL_ECPRI,
+   udp_tunnel->udp_port);
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "Invalid tunnel type");
+   ret = -EINVAL;
+   break;
+   }
+
+   return ret;
+}
+
+/* Delete UDP tunneling port */
+static int
+ice_dcf_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel)
+{
+   struct ice_dcf_adapter *adapter = dev->data->dev_private;
+   struct ice_adapter *parent_adapter = &adapter->parent;
+   struct ice_hw *parent_hw = &parent_adapter->hw;
+   int ret = 0;
+
+   if (!udp_tunnel)
+   return -EINVAL;
+
+   switch (udp_tunnel->prot_type) {
+   case RTE_TUNNEL_TYPE_VXLAN:
+   case RTE_TUNNEL_TYPE_ECPRI:
+   ret = ice_destroy_tunnel(parent_hw, udp_tunnel->udp_port, 0);
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "Invalid tunnel type");
+   ret = -EINVAL;
+   break;
+   }
+
+   return ret;
+}
+
 static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
.dev_start   = ice_dcf_dev_start,
.dev_stop= ice_dcf_dev_stop,
@@ -892,6 +957,8 @@ static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
.allmulticast_enable = ice_dcf_dev_allmulticast_enable,
.allmulticast_disable= ice_dcf_dev_allmulticast_disable,
.filter_ctrl = ice_dcf_dev_filter_ctrl,
+   .udp_tunnel_port_add = ice_dcf_dev_udp_tunnel_port_add,
+   .udp_tunnel_port_del = ice_dcf_dev_udp_tunnel_port_del,
 };
 
 static int
-- 
2.20.1



[dpdk-dev] [dpdk-dev v4] net/ice: enable eCPRI tunnel port configure in dcf

2021-01-18 Thread Jeff Guo
Add eCPRI tunnel port add and rm ops to configure eCPRI UDP tunnel port
in dcf.

Signed-off-by: Jeff Guo 
---
 doc/guides/rel_notes/release_21_02.rst | 12 +
 drivers/net/ice/ice_dcf_ethdev.c   | 67 ++
 2 files changed, 79 insertions(+)

diff --git a/doc/guides/rel_notes/release_21_02.rst 
b/doc/guides/rel_notes/release_21_02.rst
index 3bb0b9a9ed..c84f0bfad9 100644
--- a/doc/guides/rel_notes/release_21_02.rst
+++ b/doc/guides/rel_notes/release_21_02.rst
@@ -72,6 +72,18 @@ New Features
 
   * Added inner UDP/IPv4 support for VXLAN IPv4 GSO.
 
+* **Updated the Intel ice driver.**
+
+  Updated the Intel ice driver with new features and improvements, including:
+
+  * Added support for UDP dynamic port assignment for eCPRI protocol feature.
+
+* **Updated Intel iavf driver.**
+
+  Updated iavf PMD with new features and improvements, including:
+
+  * Added support for FDIR/RSS packet steering for flow type eCPRI protocol 
features.
+
 
 Removed Items
 -
diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
index a9e78064d4..c8357f5054 100644
--- a/drivers/net/ice/ice_dcf_ethdev.c
+++ b/drivers/net/ice/ice_dcf_ethdev.c
@@ -26,6 +26,13 @@
 #include "ice_dcf_ethdev.h"
 #include "ice_rxtx.h"
 
+static int
+ice_dcf_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel);
+static int
+ice_dcf_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel);
+
 static uint16_t
 ice_dcf_recv_pkts(__rte_unused void *rx_queue,
  __rte_unused struct rte_mbuf **bufs,
@@ -870,6 +877,64 @@ ice_dcf_link_update(__rte_unused struct rte_eth_dev *dev,
return 0;
 }
 
+/* Add UDP tunneling port */
+static int
+ice_dcf_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel)
+{
+   struct ice_dcf_adapter *adapter = dev->data->dev_private;
+   struct ice_adapter *parent_adapter = &adapter->parent;
+   struct ice_hw *parent_hw = &parent_adapter->hw;
+   int ret = 0;
+
+   if (!udp_tunnel)
+   return -EINVAL;
+
+   switch (udp_tunnel->prot_type) {
+   case RTE_TUNNEL_TYPE_VXLAN:
+   ret = ice_create_tunnel(parent_hw, TNL_VXLAN,
+   udp_tunnel->udp_port);
+   break;
+   case RTE_TUNNEL_TYPE_ECPRI:
+   ret = ice_create_tunnel(parent_hw, TNL_ECPRI,
+   udp_tunnel->udp_port);
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "Invalid tunnel type");
+   ret = -EINVAL;
+   break;
+   }
+
+   return ret;
+}
+
+/* Delete UDP tunneling port */
+static int
+ice_dcf_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel)
+{
+   struct ice_dcf_adapter *adapter = dev->data->dev_private;
+   struct ice_adapter *parent_adapter = &adapter->parent;
+   struct ice_hw *parent_hw = &parent_adapter->hw;
+   int ret = 0;
+
+   if (!udp_tunnel)
+   return -EINVAL;
+
+   switch (udp_tunnel->prot_type) {
+   case RTE_TUNNEL_TYPE_VXLAN:
+   case RTE_TUNNEL_TYPE_ECPRI:
+   ret = ice_destroy_tunnel(parent_hw, udp_tunnel->udp_port, 0);
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "Invalid tunnel type");
+   ret = -EINVAL;
+   break;
+   }
+
+   return ret;
+}
+
 static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
.dev_start   = ice_dcf_dev_start,
.dev_stop= ice_dcf_dev_stop,
@@ -892,6 +957,8 @@ static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
.allmulticast_enable = ice_dcf_dev_allmulticast_enable,
.allmulticast_disable= ice_dcf_dev_allmulticast_disable,
.filter_ctrl = ice_dcf_dev_filter_ctrl,
+   .udp_tunnel_port_add = ice_dcf_dev_udp_tunnel_port_add,
+   .udp_tunnel_port_del = ice_dcf_dev_udp_tunnel_port_del,
 };
 
 static int
-- 
2.20.1



[dpdk-dev] [dpdk-dev v1] doc: update eCPRI protocol support

2021-01-18 Thread Jeff Guo
Add eCPRI protocol flow features to ice pmd and iavf pmd.

Signed-off-by: Jeff Guo 
---
 doc/guides/rel_notes/release_21_02.rst | 12 
 1 file changed, 12 insertions(+)

diff --git a/doc/guides/rel_notes/release_21_02.rst 
b/doc/guides/rel_notes/release_21_02.rst
index 3bb0b9a9ed..c84f0bfad9 100644
--- a/doc/guides/rel_notes/release_21_02.rst
+++ b/doc/guides/rel_notes/release_21_02.rst
@@ -72,6 +72,18 @@ New Features
 
   * Added inner UDP/IPv4 support for VXLAN IPv4 GSO.
 
+* **Updated the Intel ice driver.**
+
+  Updated the Intel ice driver with new features and improvements, including:
+
+  * Added support for UDP dynamic port assignment for eCPRI protocol feature.
+
+* **Updated Intel iavf driver.**
+
+  Updated iavf PMD with new features and improvements, including:
+
+  * Added support for FDIR/RSS packet steering for flow type eCPRI protocol 
features.
+
 
 Removed Items
 -
-- 
2.20.1



[dpdk-dev] [dpdk-dev v5 2/2] app/testpmd: add new UDP tunnel port for eCPRI

2021-01-14 Thread Jeff Guo
Add new UDP tunnel port params for eCPRI configuration, the command
as below:

testpmd> port config 0 udp_tunnel_port add ecpri 6789
testpmd> port config 0 udp_tunnel_port rm ecpri 6789

Signed-off-by: Jeff Guo 
---
 app/test-pmd/cmdline.c  | 9 ++---
 doc/guides/testpmd_app_ug/testpmd_funcs.rst | 2 +-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 2ccbaa039e..596dd239fe 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -845,7 +845,7 @@ static void cmd_help_long_parsed(void *parsed_result,
"fdir_inset|fdir_flx_inset clear all"
"Clear RSS|FDIR|FDIR_FLX input set completely for 
some pctype\n\n"
 
-   "port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve (udp_port)\n\n"
+   "port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve|ecpri (udp_port)\n\n"
"Add/remove UDP tunnel port for tunneling 
offload\n\n"
 
"port config  rx_offload vlan_strip|"
@@ -9175,6 +9175,8 @@ cmd_cfg_tunnel_udp_port_parsed(void *parsed_result,
tunnel_udp.prot_type = RTE_TUNNEL_TYPE_GENEVE;
} else if (!strcmp(res->tunnel_type, "vxlan-gpe")) {
tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN_GPE;
+   } else if (!strcmp(res->tunnel_type, "ecpri")) {
+   tunnel_udp.prot_type = RTE_TUNNEL_TYPE_ECPRI;
} else {
printf("Invalid tunnel type\n");
return;
@@ -9209,7 +9211,7 @@ cmdline_parse_token_string_t 
cmd_config_tunnel_udp_port_action =
 "add#rm");
 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_tunnel_type =
TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, tunnel_type,
-"vxlan#geneve#vxlan-gpe");
+"vxlan#geneve#vxlan-gpe#ecpri");
 cmdline_parse_token_num_t cmd_config_tunnel_udp_port_value =
TOKEN_NUM_INITIALIZER(struct cmd_config_tunnel_udp_port, udp_port,
  RTE_UINT16);
@@ -9217,7 +9219,8 @@ cmdline_parse_token_num_t 
cmd_config_tunnel_udp_port_value =
 cmdline_parse_inst_t cmd_cfg_tunnel_udp_port = {
.f = cmd_cfg_tunnel_udp_port_parsed,
.data = NULL,
-   .help_str = "port config  udp_tunnel_port add|rm 
vxlan|geneve|vxlan-gpe ",
+   .help_str = "port config  udp_tunnel_port add|rm vxlan|"
+   "geneve|vxlan-gpe|ecpri ",
.tokens = {
(void *)&cmd_config_tunnel_udp_port_port,
(void *)&cmd_config_tunnel_udp_port_config,
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst 
b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 9be450066e..842ac42ce6 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -2375,7 +2375,7 @@ port config udp_tunnel_port
 
 Add/remove UDP tunnel port for VXLAN/GENEVE tunneling protocols::
 
-testpmd> port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve|vxlan-gpe (udp_port)
+testpmd> port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve|vxlan-gpe|ecpri (udp_port)
 
 port config tx_metadata
 ~~~
-- 
2.20.1



[dpdk-dev] [dpdk-dev v5 1/2] ethdev: add new tunnel type for eCPRI

2021-01-14 Thread Jeff Guo
Add type of RTE_TUNNEL_TYPE_ECPRI into the enum of ethdev tunnel type.

Signed-off-by: Jeff Guo 
Reviewed-by: Qi Zhang 
Reviewed-by: Ferruh Yigit 
---
 doc/guides/rel_notes/release_21_02.rst | 15 ++-
 lib/librte_ethdev/rte_ethdev.h |  1 +
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/release_21_02.rst 
b/doc/guides/rel_notes/release_21_02.rst
index b1bb2d8679..80f71be8e6 100644
--- a/doc/guides/rel_notes/release_21_02.rst
+++ b/doc/guides/rel_notes/release_21_02.rst
@@ -61,6 +61,18 @@ New Features
 
   * Added support for Stingray2 device.
 
+* **Updated the Intel ice driver.**
+
+  Updated the Intel ice driver with new features and improvements, including:
+
+  * Added support for UDP dynamic port assignment for eCPRI protocol configure 
feature.
+
+* **Updated Intel iavf driver.**
+
+  Updated iavf PMD with new features and improvements, including:
+
+  * Added support for FDIR/RSS packet steering for flow type eCPRI protocol 
features.
+
 
 Removed Items
 -
@@ -110,7 +122,8 @@ ABI Changes
Also, make sure to start the actual text at the margin.
===
 
-* No ABI change that would break compatibility with 20.11.
+* ethdev: the structure ``rte_eth_tunnel_type`` has added one parameter
+  ``RTE_TUNNEL_TYPE_ECPRI`` for eCPRI UDP port configuration.
 
 
 Known Issues
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index f5f8919186..2cbce958cf 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -1219,6 +1219,7 @@ enum rte_eth_tunnel_type {
RTE_TUNNEL_TYPE_IP_IN_GRE,
RTE_L2_TUNNEL_TYPE_E_TAG,
RTE_TUNNEL_TYPE_VXLAN_GPE,
+   RTE_TUNNEL_TYPE_ECPRI,
RTE_TUNNEL_TYPE_MAX,
 };
 
-- 
2.20.1



[dpdk-dev] [dpdk-dev v5 0/2] add new UDP tunnel port configure for eCPRI

2021-01-14 Thread Jeff Guo
Add new UDP tunnel port configure for eCPRI protocol features

v5:
fix a coding style issue.

v4:
add doc in release note for all related eCPRI features.

v3:
seperate the patch set and add some document

Jeff Guo (2):
  ethdev: add new tunnel type for eCPRI
  app/testpmd: add new UDP tunnel port for eCPRI

 app/test-pmd/cmdline.c  |  9 ++---
 doc/guides/rel_notes/release_21_02.rst  | 15 ++-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  2 +-
 lib/librte_ethdev/rte_ethdev.h  |  1 +
 4 files changed, 22 insertions(+), 5 deletions(-)

-- 
2.20.1



[dpdk-dev] [dpdk-dev v4 2/2] app/testpmd: add new UDP tunnel port for eCPRI

2021-01-14 Thread Jeff Guo
Add new UDP tunnel port params for eCPRI configuration, the command
as below:

testpmd> port config 0 udp_tunnel_port add ecpri 6789
testpmd> port config 0 udp_tunnel_port rm ecpri 6789

Signed-off-by: Jeff Guo 
---
 app/test-pmd/cmdline.c  | 9 ++---
 doc/guides/testpmd_app_ug/testpmd_funcs.rst | 2 +-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 2ccbaa039e..596dd239fe 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -845,7 +845,7 @@ static void cmd_help_long_parsed(void *parsed_result,
"fdir_inset|fdir_flx_inset clear all"
"Clear RSS|FDIR|FDIR_FLX input set completely for 
some pctype\n\n"
 
-   "port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve (udp_port)\n\n"
+   "port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve|ecpri (udp_port)\n\n"
"Add/remove UDP tunnel port for tunneling 
offload\n\n"
 
"port config  rx_offload vlan_strip|"
@@ -9175,6 +9175,8 @@ cmd_cfg_tunnel_udp_port_parsed(void *parsed_result,
tunnel_udp.prot_type = RTE_TUNNEL_TYPE_GENEVE;
} else if (!strcmp(res->tunnel_type, "vxlan-gpe")) {
tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN_GPE;
+   } else if (!strcmp(res->tunnel_type, "ecpri")) {
+   tunnel_udp.prot_type = RTE_TUNNEL_TYPE_ECPRI;
} else {
printf("Invalid tunnel type\n");
return;
@@ -9209,7 +9211,7 @@ cmdline_parse_token_string_t 
cmd_config_tunnel_udp_port_action =
 "add#rm");
 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_tunnel_type =
TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, tunnel_type,
-"vxlan#geneve#vxlan-gpe");
+"vxlan#geneve#vxlan-gpe#ecpri");
 cmdline_parse_token_num_t cmd_config_tunnel_udp_port_value =
TOKEN_NUM_INITIALIZER(struct cmd_config_tunnel_udp_port, udp_port,
  RTE_UINT16);
@@ -9217,7 +9219,8 @@ cmdline_parse_token_num_t 
cmd_config_tunnel_udp_port_value =
 cmdline_parse_inst_t cmd_cfg_tunnel_udp_port = {
.f = cmd_cfg_tunnel_udp_port_parsed,
.data = NULL,
-   .help_str = "port config  udp_tunnel_port add|rm 
vxlan|geneve|vxlan-gpe ",
+   .help_str = "port config  udp_tunnel_port add|rm vxlan|"
+   "geneve|vxlan-gpe|ecpri ",
.tokens = {
(void *)&cmd_config_tunnel_udp_port_port,
(void *)&cmd_config_tunnel_udp_port_config,
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst 
b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 9be450066e..842ac42ce6 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -2375,7 +2375,7 @@ port config udp_tunnel_port
 
 Add/remove UDP tunnel port for VXLAN/GENEVE tunneling protocols::
 
-testpmd> port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve|vxlan-gpe (udp_port)
+testpmd> port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve|vxlan-gpe|ecpri (udp_port)
 
 port config tx_metadata
 ~~~
-- 
2.20.1



[dpdk-dev] [dpdk-dev v4 1/2] ethdev: add new tunnel type for eCPRI

2021-01-14 Thread Jeff Guo
Add type of RTE_TUNNEL_TYPE_ECPRI into the enum of ethdev tunnel type.

Signed-off-by: Jeff Guo 
Reviewed-by: Qi Zhang 
Reviewed-by: Ferruh Yigit 
---
 doc/guides/rel_notes/release_21_02.rst | 15 ++-
 lib/librte_ethdev/rte_ethdev.h |  1 +
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/release_21_02.rst 
b/doc/guides/rel_notes/release_21_02.rst
index b1bb2d8679..2de6afdb85 100644
--- a/doc/guides/rel_notes/release_21_02.rst
+++ b/doc/guides/rel_notes/release_21_02.rst
@@ -61,6 +61,18 @@ New Features
 
   * Added support for Stingray2 device.
 
+* **Updated the Intel ice driver.**
+
+  Updated the Intel ice driver with new features and improvements, including:
+
+  * Added support for UDP dynamic port assignment for eCPRI protocol configure 
feature. 
+
+* **Updated Intel iavf driver.**
+
+  Updated iavf PMD with new features and improvements, including:
+
+  * Added support for FDIR/RSS packet steering for flow type eCPRI protocol 
features.
+
 
 Removed Items
 -
@@ -110,7 +122,8 @@ ABI Changes
Also, make sure to start the actual text at the margin.
===
 
-* No ABI change that would break compatibility with 20.11.
+* ethdev: the structure ``rte_eth_tunnel_type`` has added one parameter
+  ``RTE_TUNNEL_TYPE_ECPRI`` for eCPRI UDP port configuration.
 
 
 Known Issues
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index f5f8919186..2cbce958cf 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -1219,6 +1219,7 @@ enum rte_eth_tunnel_type {
RTE_TUNNEL_TYPE_IP_IN_GRE,
RTE_L2_TUNNEL_TYPE_E_TAG,
RTE_TUNNEL_TYPE_VXLAN_GPE,
+   RTE_TUNNEL_TYPE_ECPRI,
RTE_TUNNEL_TYPE_MAX,
 };
 
-- 
2.20.1



[dpdk-dev] [dpdk-dev v4 0/2] add new UDP tunnel port configure for eCPRI

2021-01-14 Thread Jeff Guo
Add new UDP tunnel port configure for eCPRI protocol features

v4:
add doc in release note for all related eCPRI features.

v3:
seperate the patch set and add some document

Jeff Guo (2):
  ethdev: add new tunnel type for eCPRI
  app/testpmd: add new UDP tunnel port for eCPRI

 app/test-pmd/cmdline.c  |  9 ++---
 doc/guides/rel_notes/release_21_02.rst  | 15 ++-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  2 +-
 lib/librte_ethdev/rte_ethdev.h  |  1 +
 4 files changed, 22 insertions(+), 5 deletions(-)

-- 
2.20.1



[dpdk-dev] [dpdk-dev v3 2/2] app/testpmd: add new UDP tunnel port for ecpri

2021-01-14 Thread Jeff Guo
Add new UDP tunnel port params for ecpri configuration, the command
as below:

testpmd> port config 0 udp_tunnel_port add ecpri 6789
testpmd> port config 0 udp_tunnel_port rm ecpri 6789

Signed-off-by: Jeff Guo 
---
 app/test-pmd/cmdline.c  | 9 ++---
 doc/guides/testpmd_app_ug/testpmd_funcs.rst | 2 +-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 2ccbaa039e..596dd239fe 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -845,7 +845,7 @@ static void cmd_help_long_parsed(void *parsed_result,
"fdir_inset|fdir_flx_inset clear all"
"Clear RSS|FDIR|FDIR_FLX input set completely for 
some pctype\n\n"
 
-   "port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve (udp_port)\n\n"
+   "port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve|ecpri (udp_port)\n\n"
"Add/remove UDP tunnel port for tunneling 
offload\n\n"
 
"port config  rx_offload vlan_strip|"
@@ -9175,6 +9175,8 @@ cmd_cfg_tunnel_udp_port_parsed(void *parsed_result,
tunnel_udp.prot_type = RTE_TUNNEL_TYPE_GENEVE;
} else if (!strcmp(res->tunnel_type, "vxlan-gpe")) {
tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN_GPE;
+   } else if (!strcmp(res->tunnel_type, "ecpri")) {
+   tunnel_udp.prot_type = RTE_TUNNEL_TYPE_ECPRI;
} else {
printf("Invalid tunnel type\n");
return;
@@ -9209,7 +9211,7 @@ cmdline_parse_token_string_t 
cmd_config_tunnel_udp_port_action =
 "add#rm");
 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_tunnel_type =
TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, tunnel_type,
-"vxlan#geneve#vxlan-gpe");
+"vxlan#geneve#vxlan-gpe#ecpri");
 cmdline_parse_token_num_t cmd_config_tunnel_udp_port_value =
TOKEN_NUM_INITIALIZER(struct cmd_config_tunnel_udp_port, udp_port,
  RTE_UINT16);
@@ -9217,7 +9219,8 @@ cmdline_parse_token_num_t 
cmd_config_tunnel_udp_port_value =
 cmdline_parse_inst_t cmd_cfg_tunnel_udp_port = {
.f = cmd_cfg_tunnel_udp_port_parsed,
.data = NULL,
-   .help_str = "port config  udp_tunnel_port add|rm 
vxlan|geneve|vxlan-gpe ",
+   .help_str = "port config  udp_tunnel_port add|rm vxlan|"
+   "geneve|vxlan-gpe|ecpri ",
.tokens = {
(void *)&cmd_config_tunnel_udp_port_port,
(void *)&cmd_config_tunnel_udp_port_config,
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst 
b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 9be450066e..842ac42ce6 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -2375,7 +2375,7 @@ port config udp_tunnel_port
 
 Add/remove UDP tunnel port for VXLAN/GENEVE tunneling protocols::
 
-testpmd> port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve|vxlan-gpe (udp_port)
+testpmd> port config (port_id) udp_tunnel_port add|rm 
vxlan|geneve|vxlan-gpe|ecpri (udp_port)
 
 port config tx_metadata
 ~~~
-- 
2.20.1



[dpdk-dev] [dpdk-dev v3 1/2] ethdev: add new tunnel type for ecpri

2021-01-14 Thread Jeff Guo
Add type of RTE_TUNNEL_TYPE_ECPRI into the enum of ethdev tunnel type.

Signed-off-by: Jeff Guo 
Reviewed-by: Qi Zhang 
Reviewed-by: Ferruh Yigit 
---
 doc/guides/rel_notes/release_21_02.rst | 3 ++-
 lib/librte_ethdev/rte_ethdev.h | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/release_21_02.rst 
b/doc/guides/rel_notes/release_21_02.rst
index b1bb2d8679..e5168d1312 100644
--- a/doc/guides/rel_notes/release_21_02.rst
+++ b/doc/guides/rel_notes/release_21_02.rst
@@ -110,7 +110,8 @@ ABI Changes
Also, make sure to start the actual text at the margin.
===
 
-* No ABI change that would break compatibility with 20.11.
+* ethdev: the structure ``rte_eth_tunnel_type`` has added one parameter
+  ``RTE_TUNNEL_TYPE_ECPRI`` for ecpri UDP port configuration.
 
 
 Known Issues
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index f5f8919186..2cbce958cf 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -1219,6 +1219,7 @@ enum rte_eth_tunnel_type {
RTE_TUNNEL_TYPE_IP_IN_GRE,
RTE_L2_TUNNEL_TYPE_E_TAG,
RTE_TUNNEL_TYPE_VXLAN_GPE,
+   RTE_TUNNEL_TYPE_ECPRI,
RTE_TUNNEL_TYPE_MAX,
 };
 
-- 
2.20.1



[dpdk-dev] [dpdk-dev v3 0/2] add new UDP tunnel port for ecpri

2021-01-14 Thread Jeff Guo
v3:
seperate the patch set and add some document

Jeff Guo (2):
  ethdev: add new tunnel type for ecpri
  app/testpmd: add new UDP tunnel port for ecpri

 app/test-pmd/cmdline.c  | 9 ++---
 doc/guides/rel_notes/release_21_02.rst  | 3 ++-
 doc/guides/testpmd_app_ug/testpmd_funcs.rst | 2 +-
 lib/librte_ethdev/rte_ethdev.h  | 1 +
 4 files changed, 10 insertions(+), 5 deletions(-)

-- 
2.20.1



[dpdk-dev] [dpdk-dev v3 3/3] net/ice: enable ecpri tunnel port configure in dcf

2021-01-13 Thread Jeff Guo
Add ecpri tunnel port add and rm ops to configure ecpri udp tunnel port
in dcf.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_dcf_ethdev.c | 67 
 1 file changed, 67 insertions(+)

diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
index a9e78064d4..c8357f5054 100644
--- a/drivers/net/ice/ice_dcf_ethdev.c
+++ b/drivers/net/ice/ice_dcf_ethdev.c
@@ -26,6 +26,13 @@
 #include "ice_dcf_ethdev.h"
 #include "ice_rxtx.h"
 
+static int
+ice_dcf_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel);
+static int
+ice_dcf_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel);
+
 static uint16_t
 ice_dcf_recv_pkts(__rte_unused void *rx_queue,
  __rte_unused struct rte_mbuf **bufs,
@@ -870,6 +877,64 @@ ice_dcf_link_update(__rte_unused struct rte_eth_dev *dev,
return 0;
 }
 
+/* Add UDP tunneling port */
+static int
+ice_dcf_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel)
+{
+   struct ice_dcf_adapter *adapter = dev->data->dev_private;
+   struct ice_adapter *parent_adapter = &adapter->parent;
+   struct ice_hw *parent_hw = &parent_adapter->hw;
+   int ret = 0;
+
+   if (!udp_tunnel)
+   return -EINVAL;
+
+   switch (udp_tunnel->prot_type) {
+   case RTE_TUNNEL_TYPE_VXLAN:
+   ret = ice_create_tunnel(parent_hw, TNL_VXLAN,
+   udp_tunnel->udp_port);
+   break;
+   case RTE_TUNNEL_TYPE_ECPRI:
+   ret = ice_create_tunnel(parent_hw, TNL_ECPRI,
+   udp_tunnel->udp_port);
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "Invalid tunnel type");
+   ret = -EINVAL;
+   break;
+   }
+
+   return ret;
+}
+
+/* Delete UDP tunneling port */
+static int
+ice_dcf_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel)
+{
+   struct ice_dcf_adapter *adapter = dev->data->dev_private;
+   struct ice_adapter *parent_adapter = &adapter->parent;
+   struct ice_hw *parent_hw = &parent_adapter->hw;
+   int ret = 0;
+
+   if (!udp_tunnel)
+   return -EINVAL;
+
+   switch (udp_tunnel->prot_type) {
+   case RTE_TUNNEL_TYPE_VXLAN:
+   case RTE_TUNNEL_TYPE_ECPRI:
+   ret = ice_destroy_tunnel(parent_hw, udp_tunnel->udp_port, 0);
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "Invalid tunnel type");
+   ret = -EINVAL;
+   break;
+   }
+
+   return ret;
+}
+
 static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
.dev_start   = ice_dcf_dev_start,
.dev_stop= ice_dcf_dev_stop,
@@ -892,6 +957,8 @@ static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
.allmulticast_enable = ice_dcf_dev_allmulticast_enable,
.allmulticast_disable= ice_dcf_dev_allmulticast_disable,
.filter_ctrl = ice_dcf_dev_filter_ctrl,
+   .udp_tunnel_port_add = ice_dcf_dev_udp_tunnel_port_add,
+   .udp_tunnel_port_del = ice_dcf_dev_udp_tunnel_port_del,
 };
 
 static int
-- 
2.20.1



[dpdk-dev] [dpdk-dev v3 2/3] net/iavf: add PTYPE mapping for ecpri

2021-01-13 Thread Jeff Guo
Until the new ecpri PTYPE be added into the RTE lib, just mapping ecpri
to the PTYPE of RTE_PTYPE_L4_UDP in iavf pmd.

Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_rxtx.c | 44 
 1 file changed, 44 insertions(+)

diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c
index d53d7b9840..1ddbad0f1f 100644
--- a/drivers/net/iavf/iavf_rxtx.c
+++ b/drivers/net/iavf/iavf_rxtx.c
@@ -3197,6 +3197,50 @@ iavf_get_default_ptype_table(void)
RTE_PTYPE_TUNNEL_GTPU |
RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
RTE_PTYPE_INNER_L4_ICMP,
+
+   /* IPv4 --> UDP ECPRI */
+   [372] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [373] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [374] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [375] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [376] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [377] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [378] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [379] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [380] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [381] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+
+   /* IPV6 --> UDP ECPRI */
+   [382] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [383] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [384] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [385] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [386] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [387] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [388] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [389] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [390] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [391] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
/* All others reserved */
};
 
-- 
2.20.1



[dpdk-dev] [dpdk-dev v3 1/3] net/ice: add PTYPE mapping for ecpri

2021-01-13 Thread Jeff Guo
Until the new ecpri PTYPE be added into the RTE lib, just mapping ecpri
to the PTYPE of RTE_PTYPE_L4_UDP in ice pmd.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_rxtx.c | 44 ++
 1 file changed, 44 insertions(+)

diff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c
index d052bd0f1b..95be6f6791 100644
--- a/drivers/net/ice/ice_rxtx.c
+++ b/drivers/net/ice/ice_rxtx.c
@@ -3880,6 +3880,50 @@ ice_get_default_pkt_type(uint16_t ptype)
RTE_PTYPE_TUNNEL_GTPU |
RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
RTE_PTYPE_INNER_L4_ICMP,
+
+   /* IPv4 --> UDP ECPRI */
+   [372] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [373] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [374] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [375] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [376] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [377] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [378] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [379] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [380] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [381] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+
+   /* IPV6 --> UDP ECPRI */
+   [382] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [383] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [384] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [385] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [386] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [387] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [388] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [389] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [390] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [391] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
/* All others reserved */
};
 
-- 
2.20.1



[dpdk-dev] [dpdk-dev v3 0/3] enable UDP ecpri configure in dcf

2021-01-13 Thread Jeff Guo
Enabling ecpri UDP tunnel port configure in dcf.

v3:
seperate patch set.

v2:
refactor PTYPE parsing and add related sharecode patch separate patch set

Jeff Guo (3):
  net/ice: add PTYPE mapping for ecpri
  net/iavf: add PTYPE mapping for ecpri
  net/ice: enable ecpri tunnel port configure in dcf

 drivers/net/iavf/iavf_rxtx.c | 44 +
 drivers/net/ice/ice_dcf_ethdev.c | 67 
 drivers/net/ice/ice_rxtx.c   | 44 +
 3 files changed, 155 insertions(+)

-- 
2.20.1



[dpdk-dev] [dpdk-dev v4 2/2] net/ice: refactor PTYPE parsing

2021-01-12 Thread Jeff Guo
If the capability of a PTYPE within a specific package could be
negotiated, no need to maintain a different PTYPE list for each
type of the package when parsing PTYPE. So refactor the PTYPE
parsing mechanism for each flow engines.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_acl_filter.c|   3 +-
 drivers/net/ice/ice_fdir_filter.c   |  63 ++---
 drivers/net/ice/ice_generic_flow.c  | 132 --
 drivers/net/ice/ice_generic_flow.h  |   9 +-
 drivers/net/ice/ice_hash.c  |  51 ++
 drivers/net/ice/ice_switch_filter.c | 139 
 6 files changed, 165 insertions(+), 232 deletions(-)

diff --git a/drivers/net/ice/ice_acl_filter.c b/drivers/net/ice/ice_acl_filter.c
index f7dbe53574..363ce68318 100644
--- a/drivers/net/ice/ice_acl_filter.c
+++ b/drivers/net/ice/ice_acl_filter.c
@@ -914,7 +914,8 @@ ice_acl_parse(struct ice_adapter *ad,
int ret;
 
memset(filter, 0, sizeof(*filter));
-   item = ice_search_pattern_match_item(pattern, array, array_len, error);
+   item = ice_search_pattern_match_item(ad, pattern, array, array_len,
+error);
if (!item)
return -rte_errno;
 
diff --git a/drivers/net/ice/ice_fdir_filter.c 
b/drivers/net/ice/ice_fdir_filter.c
index 175abcdd5c..ce6aa09d3d 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -84,34 +84,7 @@
ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | \
ICE_INSET_GTPU_TEID | ICE_INSET_GTPU_QFI)
 
-static struct ice_pattern_match_item ice_fdir_pattern_os[] = {
-   {pattern_eth_ipv4, ICE_FDIR_INSET_ETH_IPV4,  
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp, ICE_FDIR_INSET_ETH_IPV4_UDP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv4_tcp, ICE_FDIR_INSET_ETH_IPV4_TCP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv4_sctp,ICE_FDIR_INSET_ETH_IPV4_SCTP, 
ICE_INSET_NONE},
-   {pattern_eth_ipv6, ICE_FDIR_INSET_ETH_IPV6,  
ICE_INSET_NONE},
-   {pattern_eth_ipv6_udp, ICE_FDIR_INSET_ETH_IPV6_UDP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv6_tcp, ICE_FDIR_INSET_ETH_IPV6_TCP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv6_sctp,ICE_FDIR_INSET_ETH_IPV6_SCTP, 
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4,
-  ICE_FDIR_INSET_VXLAN_IPV4,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4_udp,
-  ICE_FDIR_INSET_VXLAN_IPV4_UDP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4_tcp,
-  ICE_FDIR_INSET_VXLAN_IPV4_TCP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4_sctp,
-  ICE_FDIR_INSET_VXLAN_IPV4_SCTP,   
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4,
-  ICE_FDIR_INSET_VXLAN_IPV4,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp,
-  ICE_FDIR_INSET_VXLAN_IPV4_UDP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp,
-  ICE_FDIR_INSET_VXLAN_IPV4_TCP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp,
-  ICE_FDIR_INSET_VXLAN_IPV4_SCTP,   
ICE_INSET_NONE},
-};
-
-static struct ice_pattern_match_item ice_fdir_pattern_comms[] = {
+static struct ice_pattern_match_item ice_fdir_pattern_list[] = {
{pattern_ethertype,ICE_FDIR_INSET_ETH,   
ICE_INSET_NONE},
{pattern_eth_ipv4, ICE_FDIR_INSET_ETH_IPV4,  
ICE_INSET_NONE},
{pattern_eth_ipv4_udp, ICE_FDIR_INSET_ETH_IPV4_UDP,  
ICE_INSET_NONE},
@@ -143,8 +116,7 @@ static struct ice_pattern_match_item 
ice_fdir_pattern_comms[] = {
{pattern_eth_ipv6_gtpu_eh, ICE_FDIR_INSET_IPV6_GTPU_EH,  
ICE_INSET_NONE},
 };
 
-static struct ice_flow_parser ice_fdir_parser_os;
-static struct ice_flow_parser ice_fdir_parser_comms;
+static struct ice_flow_parser ice_fdir_parser;
 
 static int
 ice_fdir_is_tunnel_profile(enum ice_fdir_tunnel_type tunnel_type);
@@ -,12 +1083,7 @@ ice_fdir_init(struct ice_adapter *ad)
if (ret)
return ret;
 
-   if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS)
-   parser = &ice_fdir_parser_comms;
-   else if (ad->active_pkg_type == ICE_PKG_TYPE_OS_DEFAULT)
-   parser = &ice_fdir_parser_os;
-   else
-   return -EINVAL;
+   parser = &ice_fdir_parser;
 
return ice_register_parser(parser, ad);
 }
@@ -1124,16 +1091,13 @@ ice_fdir_init(struct ice_adapter *ad)
 static void
 ice_fdir_uninit(struct ice_adapter *ad)
 {
-   struct ic

[dpdk-dev] [dpdk-dev v4 1/2] net/ice/base: add PTYPE value

2021-01-12 Thread Jeff Guo
Add some macros for some PType value.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_flex_type.h | 189 +--
 1 file changed, 150 insertions(+), 39 deletions(-)

diff --git a/drivers/net/ice/base/ice_flex_type.h 
b/drivers/net/ice/base/ice_flex_type.h
index ad620f7892..c7f92b9150 100644
--- a/drivers/net/ice/base/ice_flex_type.h
+++ b/drivers/net/ice/base/ice_flex_type.h
@@ -267,45 +267,156 @@ enum ice_sect {
 };
 
 /* Packet Type (PTYPE) values */
-#define ICE_PTYPE_MAC_PAY  1
-#define ICE_PTYPE_IPV4FRAG_PAY 22
-#define ICE_PTYPE_IPV4_PAY 23
-#define ICE_PTYPE_IPV4_UDP_PAY 24
-#define ICE_PTYPE_IPV4_TCP_PAY 26
-#define ICE_PTYPE_IPV4_SCTP_PAY27
-#define ICE_PTYPE_IPV4_ICMP_PAY28
-#define ICE_PTYPE_IPV6FRAG_PAY 88
-#define ICE_PTYPE_IPV6_PAY 89
-#define ICE_PTYPE_IPV6_UDP_PAY 90
-#define ICE_PTYPE_IPV6_TCP_PAY 92
-#define ICE_PTYPE_IPV6_SCTP_PAY93
-#define ICE_PTYPE_IPV6_ICMP_PAY94
-#define ICE_MAC_IPV4_GTPC_TEID 325
-#define ICE_MAC_IPV6_GTPC_TEID 326
-#define ICE_MAC_IPV4_GTPC  327
-#define ICE_MAC_IPV6_GTPC  328
-#define ICE_MAC_IPV4_GTPU  329
-#define ICE_MAC_IPV6_GTPU  330
-#define ICE_MAC_IPV4_GTPU_IPV4_FRAG331
-#define ICE_MAC_IPV4_GTPU_IPV4_PAY 332
-#define ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY 333
-#define ICE_MAC_IPV4_GTPU_IPV4_TCP 334
-#define ICE_MAC_IPV4_GTPU_IPV4_ICMP335
-#define ICE_MAC_IPV6_GTPU_IPV4_FRAG336
-#define ICE_MAC_IPV6_GTPU_IPV4_PAY 337
-#define ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY 338
-#define ICE_MAC_IPV6_GTPU_IPV4_TCP 339
-#define ICE_MAC_IPV6_GTPU_IPV4_ICMP340
-#define ICE_MAC_IPV4_GTPU_IPV6_FRAG341
-#define ICE_MAC_IPV4_GTPU_IPV6_PAY 342
-#define ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY 343
-#define ICE_MAC_IPV4_GTPU_IPV6_TCP 344
-#define ICE_MAC_IPV4_GTPU_IPV6_ICMPV6  345
-#define ICE_MAC_IPV6_GTPU_IPV6_FRAG346
-#define ICE_MAC_IPV6_GTPU_IPV6_PAY 347
-#define ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY 348
-#define ICE_MAC_IPV6_GTPU_IPV6_TCP 349
-#define ICE_MAC_IPV6_GTPU_IPV6_ICMPV6  350
+#define ICE_PTYPE_MAC_PAY  1
+#define ICE_MAC_PTP2
+#define ICE_MAC_LLDP   6
+#define ICE_MAC_ARP11
+#define ICE_PTYPE_IPV4FRAG_PAY 22
+#define ICE_PTYPE_IPV4_PAY 23
+#define ICE_PTYPE_IPV4_UDP_PAY 24
+#define ICE_PTYPE_IPV4_TCP_PAY 26
+#define ICE_PTYPE_IPV4_SCTP_PAY27
+#define ICE_PTYPE_IPV4_ICMP_PAY28
+#define ICE_MAC_IPV4_IPV4_FRAG 29
+#define ICE_MAC_IPV4_IPV4_PAY  30
+#define ICE_MAC_IPV4_IPV4_UDP_PAY  31
+#define ICE_MAC_IPV4_IPV4_TCP  33
+#define ICE_MAC_IPV4_IPV4_SCTP 34
+#define ICE_MAC_IPV4_IPV4_ICMP 35
+#define ICE_MAC_IPV4_IPV6_FRAG 36
+#define ICE_MAC_IPV4_IPV6_PAY  37
+#define ICE_MAC_IPV4_IPV6_UDP_PAY  38
+#define ICE_MAC_IPV4_IPV6_TCP  40
+#define ICE_MAC_IPV4_IPV6_SCTP 41
+#define ICE_MAC_IPV4_IPV6_ICMPV6   42
+#define ICE_MAC_IPV4_TUN_PAY   43
+#define ICE_MAC_IPV4_TUN_IPV4_FRAG 44
+#define ICE_MAC_IPV4_TUN_IPV4_PAY  45
+#define ICE_MAC_IPV4_TUN_IPV4_UDP_PAY  46
+#define ICE_MAC_IPV4_TUN_IPV4_TCP  48
+#define ICE_MAC_IPV4_TUN_IPV4_SCTP 49
+#define ICE_MAC_IPV4_TUN_IPV4_ICMP 50
+#define ICE_MAC_IPV4_TUN_IPV6_FRAG 51
+#define ICE_MAC_IPV4_TUN_IPV6_PAY  52
+#define ICE_MAC_IPV4_TUN_IPV6_UDP_PAY  53
+#define ICE_MAC_IPV4_TUN_IPV6_TCP  55
+#define ICE_MAC_IPV4_TUN_IPV6_SCTP 56
+#define ICE_MAC_IPV4_TUN_IPV6_ICMPV6   57
+#define ICE_MAC_IPV4_TUN_ICE_MAC_PAY   58
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_FRAG 59
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_PAY  60
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_UDP_PAY  61
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_TCP  63
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_SCTP 64
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_ICMP 65
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_FRAG 66
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_PAY  67
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_UDP_PAY  68
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_TCP  70
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_SCTP 71
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_ICMPV6   72
+#define ICE_PTYPE_IPV6FRAG_PAY 88
+#define ICE_PTYPE_IPV6_PAY 89
+#define ICE_PTYPE_IPV6_UDP_PAY 90
+#define ICE_PTYPE_IPV6_TCP_PAY 92
+#define ICE_PTYPE_IPV6_SCTP_PAY93
+#define ICE_PTYPE_IPV6_ICMP_PAY

[dpdk-dev] [dpdk-dev v4 0/2] net/ice: refactor PTYPE parsing

2021-01-12 Thread Jeff Guo
If the capability of a PTYPE within a specific package could be
negotiated, no need to maintain a different PTYPE list for each
type of the package when parsing PTYPE. So refactor the PTYPE
parsing mechanism for each flow engines.

v4:
rebase patch and add some more PTYPE macros

v3:
separate the patch set from the ecpri configure patch set

Jeff Guo (2):
  net/ice/base: add PTYPE value
  net/ice: refactor PTYPE parsing

 drivers/net/ice/base/ice_flex_type.h | 189 +--
 drivers/net/ice/ice_acl_filter.c |   3 +-
 drivers/net/ice/ice_fdir_filter.c|  63 ++---
 drivers/net/ice/ice_generic_flow.c   | 132 +--
 drivers/net/ice/ice_generic_flow.h   |   9 +-
 drivers/net/ice/ice_hash.c   |  51 ++--
 drivers/net/ice/ice_switch_filter.c  | 139 +++-
 7 files changed, 315 insertions(+), 271 deletions(-)

-- 
2.20.1



[dpdk-dev] [dpdk-dev v3 3/3] net/ice: refactor PTYPE parsing

2021-01-12 Thread Jeff Guo
If the capability of a PTYPE within a specific package could be
negotiated, no need to maintain a different PTYPE list for each
type of the package when parsing PTYPE. So refactor the PTYPE
parsing mechanism for each flow engines.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_acl_filter.c|   3 +-
 drivers/net/ice/ice_fdir_filter.c   |  63 ++---
 drivers/net/ice/ice_generic_flow.c  | 132 --
 drivers/net/ice/ice_generic_flow.h  |   9 +-
 drivers/net/ice/ice_hash.c  |  47 ++
 drivers/net/ice/ice_switch_filter.c | 139 
 6 files changed, 165 insertions(+), 228 deletions(-)

diff --git a/drivers/net/ice/ice_acl_filter.c b/drivers/net/ice/ice_acl_filter.c
index f7dbe53574..363ce68318 100644
--- a/drivers/net/ice/ice_acl_filter.c
+++ b/drivers/net/ice/ice_acl_filter.c
@@ -914,7 +914,8 @@ ice_acl_parse(struct ice_adapter *ad,
int ret;
 
memset(filter, 0, sizeof(*filter));
-   item = ice_search_pattern_match_item(pattern, array, array_len, error);
+   item = ice_search_pattern_match_item(ad, pattern, array, array_len,
+error);
if (!item)
return -rte_errno;
 
diff --git a/drivers/net/ice/ice_fdir_filter.c 
b/drivers/net/ice/ice_fdir_filter.c
index 175abcdd5c..ce6aa09d3d 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -84,34 +84,7 @@
ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | \
ICE_INSET_GTPU_TEID | ICE_INSET_GTPU_QFI)
 
-static struct ice_pattern_match_item ice_fdir_pattern_os[] = {
-   {pattern_eth_ipv4, ICE_FDIR_INSET_ETH_IPV4,  
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp, ICE_FDIR_INSET_ETH_IPV4_UDP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv4_tcp, ICE_FDIR_INSET_ETH_IPV4_TCP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv4_sctp,ICE_FDIR_INSET_ETH_IPV4_SCTP, 
ICE_INSET_NONE},
-   {pattern_eth_ipv6, ICE_FDIR_INSET_ETH_IPV6,  
ICE_INSET_NONE},
-   {pattern_eth_ipv6_udp, ICE_FDIR_INSET_ETH_IPV6_UDP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv6_tcp, ICE_FDIR_INSET_ETH_IPV6_TCP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv6_sctp,ICE_FDIR_INSET_ETH_IPV6_SCTP, 
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4,
-  ICE_FDIR_INSET_VXLAN_IPV4,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4_udp,
-  ICE_FDIR_INSET_VXLAN_IPV4_UDP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4_tcp,
-  ICE_FDIR_INSET_VXLAN_IPV4_TCP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4_sctp,
-  ICE_FDIR_INSET_VXLAN_IPV4_SCTP,   
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4,
-  ICE_FDIR_INSET_VXLAN_IPV4,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp,
-  ICE_FDIR_INSET_VXLAN_IPV4_UDP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp,
-  ICE_FDIR_INSET_VXLAN_IPV4_TCP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp,
-  ICE_FDIR_INSET_VXLAN_IPV4_SCTP,   
ICE_INSET_NONE},
-};
-
-static struct ice_pattern_match_item ice_fdir_pattern_comms[] = {
+static struct ice_pattern_match_item ice_fdir_pattern_list[] = {
{pattern_ethertype,ICE_FDIR_INSET_ETH,   
ICE_INSET_NONE},
{pattern_eth_ipv4, ICE_FDIR_INSET_ETH_IPV4,  
ICE_INSET_NONE},
{pattern_eth_ipv4_udp, ICE_FDIR_INSET_ETH_IPV4_UDP,  
ICE_INSET_NONE},
@@ -143,8 +116,7 @@ static struct ice_pattern_match_item 
ice_fdir_pattern_comms[] = {
{pattern_eth_ipv6_gtpu_eh, ICE_FDIR_INSET_IPV6_GTPU_EH,  
ICE_INSET_NONE},
 };
 
-static struct ice_flow_parser ice_fdir_parser_os;
-static struct ice_flow_parser ice_fdir_parser_comms;
+static struct ice_flow_parser ice_fdir_parser;
 
 static int
 ice_fdir_is_tunnel_profile(enum ice_fdir_tunnel_type tunnel_type);
@@ -,12 +1083,7 @@ ice_fdir_init(struct ice_adapter *ad)
if (ret)
return ret;
 
-   if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS)
-   parser = &ice_fdir_parser_comms;
-   else if (ad->active_pkg_type == ICE_PKG_TYPE_OS_DEFAULT)
-   parser = &ice_fdir_parser_os;
-   else
-   return -EINVAL;
+   parser = &ice_fdir_parser;
 
return ice_register_parser(parser, ad);
 }
@@ -1124,16 +1091,13 @@ ice_fdir_init(struct ice_adapter *ad)
 static void
 ice_fdir_uninit(struct ice_adapter *ad)
 {
-   struct ic

[dpdk-dev] [dpdk-dev v3 2/3] net/ice/base: add PTYPE value

2021-01-12 Thread Jeff Guo
Add some macros for some PType value.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_flex_type.h | 138 +++
 1 file changed, 99 insertions(+), 39 deletions(-)

diff --git a/drivers/net/ice/base/ice_flex_type.h 
b/drivers/net/ice/base/ice_flex_type.h
index 9b9503b3ba..da408ec49c 100644
--- a/drivers/net/ice/base/ice_flex_type.h
+++ b/drivers/net/ice/base/ice_flex_type.h
@@ -267,45 +267,105 @@ enum ice_sect {
 };
 
 /* Packet Type (PTYPE) values */
-#define ICE_PTYPE_MAC_PAY  1
-#define ICE_PTYPE_IPV4FRAG_PAY 22
-#define ICE_PTYPE_IPV4_PAY 23
-#define ICE_PTYPE_IPV4_UDP_PAY 24
-#define ICE_PTYPE_IPV4_TCP_PAY 26
-#define ICE_PTYPE_IPV4_SCTP_PAY27
-#define ICE_PTYPE_IPV4_ICMP_PAY28
-#define ICE_PTYPE_IPV6FRAG_PAY 88
-#define ICE_PTYPE_IPV6_PAY 89
-#define ICE_PTYPE_IPV6_UDP_PAY 90
-#define ICE_PTYPE_IPV6_TCP_PAY 92
-#define ICE_PTYPE_IPV6_SCTP_PAY93
-#define ICE_PTYPE_IPV6_ICMP_PAY94
-#define ICE_MAC_IPV4_GTPC_TEID 325
-#define ICE_MAC_IPV6_GTPC_TEID 326
-#define ICE_MAC_IPV4_GTPC  327
-#define ICE_MAC_IPV6_GTPC  328
-#define ICE_MAC_IPV4_GTPU  329
-#define ICE_MAC_IPV6_GTPU  330
-#define ICE_MAC_IPV4_GTPU_IPV4_FRAG331
-#define ICE_MAC_IPV4_GTPU_IPV4_PAY 332
-#define ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY 333
-#define ICE_MAC_IPV4_GTPU_IPV4_TCP 334
-#define ICE_MAC_IPV4_GTPU_IPV4_ICMP335
-#define ICE_MAC_IPV6_GTPU_IPV4_FRAG336
-#define ICE_MAC_IPV6_GTPU_IPV4_PAY 337
-#define ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY 338
-#define ICE_MAC_IPV6_GTPU_IPV4_TCP 339
-#define ICE_MAC_IPV6_GTPU_IPV4_ICMP340
-#define ICE_MAC_IPV4_GTPU_IPV6_FRAG341
-#define ICE_MAC_IPV4_GTPU_IPV6_PAY 342
-#define ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY 343
-#define ICE_MAC_IPV4_GTPU_IPV6_TCP 344
-#define ICE_MAC_IPV4_GTPU_IPV6_ICMPV6  345
-#define ICE_MAC_IPV6_GTPU_IPV6_FRAG346
-#define ICE_MAC_IPV6_GTPU_IPV6_PAY 347
-#define ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY 348
-#define ICE_MAC_IPV6_GTPU_IPV6_TCP 349
-#define ICE_MAC_IPV6_GTPU_IPV6_ICMPV6  350
+#define ICE_PTYPE_MAC_PAY  1
+#define ICE_MAC_PTP2
+#define ICE_MAC_LLDP   6
+#define ICE_MAC_ARP11
+#define ICE_PTYPE_IPV4FRAG_PAY 22
+#define ICE_PTYPE_IPV4_PAY 23
+#define ICE_PTYPE_IPV4_UDP_PAY 24
+#define ICE_PTYPE_IPV4_TCP_PAY 26
+#define ICE_PTYPE_IPV4_SCTP_PAY27
+#define ICE_PTYPE_IPV4_ICMP_PAY28
+#define ICE_MAC_IPV4_TUN_PAY   43
+#define ICE_MAC_IPV4_TUN_IPV4_FRAG 44
+#define ICE_MAC_IPV4_TUN_IPV4_PAY  45
+#define ICE_MAC_IPV4_TUN_IPV4_UDP_PAY  46
+#define ICE_MAC_IPV4_TUN_IPV4_TCP  48
+#define ICE_MAC_IPV4_TUN_IPV4_SCTP 49
+#define ICE_MAC_IPV4_TUN_IPV4_ICMP 50
+#define ICE_MAC_IPV4_TUN_IPV6_FRAG 51
+#define ICE_MAC_IPV4_TUN_IPV6_PAY  52
+#define ICE_MAC_IPV4_TUN_IPV6_UDP_PAY  53
+#define ICE_MAC_IPV4_TUN_IPV6_TCP  55
+#define ICE_MAC_IPV4_TUN_IPV6_SCTP 56
+#define ICE_MAC_IPV4_TUN_IPV6_ICMPV6   57
+#define ICE_MAC_IPV4_TUN_ICE_MAC_PAY   58
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_FRAG 59
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_PAY  60
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_UDP_PAY  61
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_TCP  63
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_SCTP 64
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV4_ICMP 65
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_FRAG 66
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_PAY  67
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_UDP_PAY  68
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_TCP  70
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_SCTP 71
+#define ICE_MAC_IPV4_TUN_ICE_MAC_IPV6_ICMPV6   72
+#define ICE_PTYPE_IPV6FRAG_PAY 88
+#define ICE_PTYPE_IPV6_PAY 89
+#define ICE_PTYPE_IPV6_UDP_PAY 90
+#define ICE_PTYPE_IPV6_TCP_PAY 92
+#define ICE_PTYPE_IPV6_SCTP_PAY93
+#define ICE_PTYPE_IPV6_ICMP_PAY94
+#define ICE_MAC_IPV4_ESP   160
+#define ICE_MAC_IPV6_ESP   161
+#define ICE_MAC_IPV4_AH162
+#define ICE_MAC_IPV6_AH163
+#define ICE_MAC_IPV4_NAT_T_ESP 164
+#define ICE_MAC_IPV6_NAT_T_ESP 165
+#define ICE_MAC_IPV4_NAT_T_IKE 166
+#define ICE_MAC_IPV6_NAT_T_IKE 167
+#define ICE_MAC_IPV4_NAT_T_KEEP168
+#define ICE_MAC_IPV6_NAT_T_KEEP169
+#define ICE_MAC_PPPOD_PAY  300

[dpdk-dev] [dpdk-dev v3 1/3] net/ice/base: add package PTYPE enable information

2021-01-12 Thread Jeff Guo
Scan the 'Marker PType TCAM' session to retrieve the Rx parser PTYPE
enable information from the current package.

Signed-off-by: Haiyue Wang 
Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_flex_pipe.c | 79 
 drivers/net/ice/base/ice_flex_pipe.h |  3 ++
 drivers/net/ice/base/ice_flex_type.h | 19 +++
 drivers/net/ice/base/ice_type.h  |  1 +
 4 files changed, 102 insertions(+)

diff --git a/drivers/net/ice/base/ice_flex_pipe.c 
b/drivers/net/ice/base/ice_flex_pipe.c
index 96aed3b795..96628ae5dc 100644
--- a/drivers/net/ice/base/ice_flex_pipe.c
+++ b/drivers/net/ice/base/ice_flex_pipe.c
@@ -316,6 +316,84 @@ ice_pkg_enum_entry(struct ice_seg *ice_seg, struct 
ice_pkg_enum *state,
return entry;
 }
 
+/**
+ * ice_hw_ptype_ena - check if the PTYPE is enabled or not
+ * @hw: pointer to the HW structure
+ * @ptype: the hardware PTYPE
+ */
+bool ice_hw_ptype_ena(struct ice_hw *hw, u16 ptype)
+{
+   return ptype < ICE_FLOW_PTYPE_MAX &&
+  ice_is_bit_set(hw->hw_ptype, ptype);
+}
+
+/**
+ * ice_marker_ptype_tcam_handler
+ * @sect_type: section type
+ * @section: pointer to section
+ * @index: index of the Marker PType TCAM entry to be returned
+ * @offset: pointer to receive absolute offset, always 0 for ptype TCAM 
sections
+ *
+ * This is a callback function that can be passed to ice_pkg_enum_entry.
+ * Handles enumeration of individual Marker PType TCAM entries.
+ */
+static void *
+ice_marker_ptype_tcam_handler(u32 sect_type, void *section, u32 index,
+ u32 *offset)
+{
+   struct ice_marker_ptype_tcam_section *marker_ptype;
+
+   if (!section)
+   return NULL;
+
+   if (sect_type != ICE_SID_RXPARSER_MARKER_PTYPE)
+   return NULL;
+
+   if (index > ICE_MAX_MARKER_PTYPE_TCAMS_IN_BUF)
+   return NULL;
+
+   if (offset)
+   *offset = 0;
+
+   marker_ptype = (struct ice_marker_ptype_tcam_section *)section;
+
+   if (index >= LE16_TO_CPU(marker_ptype->count))
+   return NULL;
+
+   return marker_ptype->tcam + index;
+}
+
+/**
+ * ice_fill_hw_ptype - fill the enabled PTYPE bit information
+ * @hw: pointer to the HW structure
+ */
+static void
+ice_fill_hw_ptype(struct ice_hw *hw)
+{
+   struct ice_marker_ptype_tcam_entry *tcam;
+   struct ice_seg *seg = hw->seg;
+   struct ice_pkg_enum state;
+
+   ice_zero_bitmap(hw->hw_ptype, ICE_FLOW_PTYPE_MAX);
+   if (!seg)
+   return;
+
+   ice_memset(&state, 0, sizeof(state), ICE_NONDMA_MEM);
+
+   do {
+   tcam = (struct ice_marker_ptype_tcam_entry *)
+   ice_pkg_enum_entry(seg, &state,
+  ICE_SID_RXPARSER_MARKER_PTYPE, NULL,
+  ice_marker_ptype_tcam_handler);
+   if (tcam &&
+   LE16_TO_CPU(tcam->addr) < ICE_MARKER_PTYPE_TCAM_ADDR_MAX &&
+   LE16_TO_CPU(tcam->ptype) < ICE_FLOW_PTYPE_MAX)
+   ice_set_bit(LE16_TO_CPU(tcam->ptype), hw->hw_ptype);
+
+   seg = NULL;
+   } while (tcam);
+}
+
 /**
  * ice_boost_tcam_handler
  * @sect_type: section type
@@ -1541,6 +1619,7 @@ enum ice_status ice_init_pkg(struct ice_hw *hw, u8 *buf, 
u32 len)
 */
ice_init_pkg_regs(hw);
ice_fill_blk_tbls(hw);
+   ice_fill_hw_ptype(hw);
ice_get_prof_index_max(hw);
} else {
ice_debug(hw, ICE_DBG_INIT, "package load failed, %d\n",
diff --git a/drivers/net/ice/base/ice_flex_pipe.h 
b/drivers/net/ice/base/ice_flex_pipe.h
index d4679cc940..066ff95e13 100644
--- a/drivers/net/ice/base/ice_flex_pipe.h
+++ b/drivers/net/ice/base/ice_flex_pipe.h
@@ -54,6 +54,9 @@ bool ice_tunnel_port_in_use(struct ice_hw *hw, u16 port, u16 
*index);
 bool
 ice_tunnel_get_type(struct ice_hw *hw, u16 port, enum ice_tunnel_type *type);
 
+/* RX parser PType functions */
+bool ice_hw_ptype_ena(struct ice_hw *hw, u16 ptype);
+
 /* XLT2/VSI group functions */
 enum ice_status
 ice_vsig_find_vsi(struct ice_hw *hw, enum ice_block blk, u16 vsi, u16 *vsig);
diff --git a/drivers/net/ice/base/ice_flex_type.h 
b/drivers/net/ice/base/ice_flex_type.h
index 62cc81b49c..9b9503b3ba 100644
--- a/drivers/net/ice/base/ice_flex_type.h
+++ b/drivers/net/ice/base/ice_flex_type.h
@@ -472,6 +472,25 @@ struct ice_boost_tcam_section {
sizeof(struct ice_boost_tcam_entry), \
sizeof(struct ice_boost_tcam_entry))
 
+/* package Marker PType TCAM entry */
+struct ice_marker_ptype_tcam_entry {
+#define ICE_MARKER_PTYPE_TCAM_ADDR_MAX 1024
+   __le16 addr;
+   __le16 ptype;
+   u8 keys[20];
+};
+
+struct ice_marker_ptype_tcam_section {
+   __le16 count;
+   __le16 reserved;
+   struct ice_marker_ptype_tcam_entry tcam

[dpdk-dev] [dpdk-dev v3 0/3] net/ice: refactor PTYPE parsing

2021-01-12 Thread Jeff Guo
If the capability of a PTYPE within a specific package could be
negotiated, no need to maintain a different PTYPE list for each
type of the package when parsing PTYPE. So refactor the PTYPE
parsing mechanism for each flow engines.

v3:
separate the patch set from the ecpri configure patch set

Jeff Guo (3):
  net/ice/base: add package PTYPE enable information
  net/ice/base: add PTYPE value
  net/ice: refactor PTYPE parsing

 drivers/net/ice/base/ice_flex_pipe.c |  79 ++
 drivers/net/ice/base/ice_flex_pipe.h |   3 +
 drivers/net/ice/base/ice_flex_type.h | 157 ---
 drivers/net/ice/base/ice_type.h  |   1 +
 drivers/net/ice/ice_acl_filter.c |   3 +-
 drivers/net/ice/ice_fdir_filter.c|  63 ++-
 drivers/net/ice/ice_generic_flow.c   | 132 --
 drivers/net/ice/ice_generic_flow.h   |   9 +-
 drivers/net/ice/ice_hash.c   |  47 ++--
 drivers/net/ice/ice_switch_filter.c  | 139 +++-
 10 files changed, 366 insertions(+), 267 deletions(-)

-- 
2.20.1



[dpdk-dev] [dpdk-dev v2 6/6] net/ice: enable ecpri tunnel port configure in dcf

2020-12-23 Thread Jeff Guo
Add ecpri tunnel port add and rm ops to configure ecpri udp tunnel port
in dcf.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_dcf_ethdev.c | 67 
 1 file changed, 67 insertions(+)

diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
index b0b2ecb0d6..08265db79f 100644
--- a/drivers/net/ice/ice_dcf_ethdev.c
+++ b/drivers/net/ice/ice_dcf_ethdev.c
@@ -26,6 +26,13 @@
 #include "ice_dcf_ethdev.h"
 #include "ice_rxtx.h"
 
+static int
+ice_dcf_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel);
+static int
+ice_dcf_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel);
+
 static uint16_t
 ice_dcf_recv_pkts(__rte_unused void *rx_queue,
  __rte_unused struct rte_mbuf **bufs,
@@ -870,6 +877,64 @@ ice_dcf_link_update(__rte_unused struct rte_eth_dev *dev,
return 0;
 }
 
+/* Add UDP tunneling port */
+static int
+ice_dcf_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel)
+{
+   struct ice_dcf_adapter *adapter = dev->data->dev_private;
+   struct ice_adapter *parent_adapter = &adapter->parent;
+   struct ice_hw *parent_hw = &parent_adapter->hw;
+   int ret = 0;
+
+   if (!udp_tunnel)
+   return -EINVAL;
+
+   switch (udp_tunnel->prot_type) {
+   case RTE_TUNNEL_TYPE_VXLAN:
+   ret = ice_create_tunnel(parent_hw, TNL_VXLAN,
+   udp_tunnel->udp_port);
+   break;
+   case RTE_TUNNEL_TYPE_ECPRI:
+   ret = ice_create_tunnel(parent_hw, TNL_ECPRI,
+   udp_tunnel->udp_port);
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "Invalid tunnel type");
+   ret = -EINVAL;
+   break;
+   }
+
+   return ret;
+}
+
+/* Delete UDP tunneling port */
+static int
+ice_dcf_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
+   struct rte_eth_udp_tunnel *udp_tunnel)
+{
+   struct ice_dcf_adapter *adapter = dev->data->dev_private;
+   struct ice_adapter *parent_adapter = &adapter->parent;
+   struct ice_hw *parent_hw = &parent_adapter->hw;
+   int ret = 0;
+
+   if (!udp_tunnel)
+   return -EINVAL;
+
+   switch (udp_tunnel->prot_type) {
+   case RTE_TUNNEL_TYPE_VXLAN:
+   case RTE_TUNNEL_TYPE_ECPRI:
+   ret = ice_destroy_tunnel(parent_hw, udp_tunnel->udp_port, 0);
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "Invalid tunnel type");
+   ret = -EINVAL;
+   break;
+   }
+
+   return ret;
+}
+
 static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
.dev_start   = ice_dcf_dev_start,
.dev_stop= ice_dcf_dev_stop,
@@ -892,6 +957,8 @@ static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
.allmulticast_enable = ice_dcf_dev_allmulticast_enable,
.allmulticast_disable= ice_dcf_dev_allmulticast_disable,
.filter_ctrl = ice_dcf_dev_filter_ctrl,
+   .udp_tunnel_port_add = ice_dcf_dev_udp_tunnel_port_add,
+   .udp_tunnel_port_del = ice_dcf_dev_udp_tunnel_port_del,
 };
 
 static int
-- 
2.20.1



[dpdk-dev] [dpdk-dev v2 5/6] net/iavf: add PTYPE mapping for ecpri

2020-12-23 Thread Jeff Guo
Until the new ecpri PTYPE be added into the RTE lib, just mapping ecpri
to the PTYPE of RTE_PTYPE_L4_UDP in iavf pmd.

Signed-off-by: Jeff Guo 
---
 drivers/net/iavf/iavf_rxtx.c | 44 
 1 file changed, 44 insertions(+)

diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c
index 21d508b3f4..2800dd6250 100644
--- a/drivers/net/iavf/iavf_rxtx.c
+++ b/drivers/net/iavf/iavf_rxtx.c
@@ -3193,6 +3193,50 @@ iavf_get_default_ptype_table(void)
RTE_PTYPE_TUNNEL_GTPU |
RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
RTE_PTYPE_INNER_L4_ICMP,
+
+   /* IPv4 --> UDP ECPRI */
+   [372] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [373] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [374] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [375] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [376] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [377] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [378] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [379] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [380] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [381] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+
+   /* IPV6 --> UDP ECPRI */
+   [382] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [383] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [384] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [385] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [386] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [387] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [388] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [389] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [390] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [391] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
/* All others reserved */
};
 
-- 
2.20.1



[dpdk-dev] [dpdk-dev v2 4/6] net/ice: add PTYPE mapping for ecpri

2020-12-23 Thread Jeff Guo
Until the new ecpri PTYPE be added into the RTE lib, just mapping ecpri
to the PTYPE of RTE_PTYPE_L4_UDP in ice pmd.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_rxtx.c | 44 ++
 1 file changed, 44 insertions(+)

diff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c
index d052bd0f1b..95be6f6791 100644
--- a/drivers/net/ice/ice_rxtx.c
+++ b/drivers/net/ice/ice_rxtx.c
@@ -3880,6 +3880,50 @@ ice_get_default_pkt_type(uint16_t ptype)
RTE_PTYPE_TUNNEL_GTPU |
RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
RTE_PTYPE_INNER_L4_ICMP,
+
+   /* IPv4 --> UDP ECPRI */
+   [372] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [373] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [374] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [375] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [376] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [377] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [378] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [379] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [380] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [381] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+
+   /* IPV6 --> UDP ECPRI */
+   [382] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [383] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [384] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [385] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [386] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [387] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [388] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [389] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [390] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
+   [391] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+   RTE_PTYPE_L4_UDP,
/* All others reserved */
};
 
-- 
2.20.1



[dpdk-dev] [dpdk-dev v2 3/6] net/ice/base: add new UDP tunnel type for ecpri

2020-12-23 Thread Jeff Guo
Add new UDP tunnel type for ecpri.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_flex_pipe.c | 1 +
 drivers/net/ice/base/ice_flex_type.h | 1 +
 2 files changed, 2 insertions(+)

diff --git a/drivers/net/ice/base/ice_flex_pipe.c 
b/drivers/net/ice/base/ice_flex_pipe.c
index 987bea5623..31a4695343 100644
--- a/drivers/net/ice/base/ice_flex_pipe.c
+++ b/drivers/net/ice/base/ice_flex_pipe.c
@@ -13,6 +13,7 @@
 static const struct ice_tunnel_type_scan tnls[] = {
{ TNL_VXLAN,"TNL_VXLAN_PF" },
{ TNL_GENEVE,   "TNL_GENEVE_PF" },
+   { TNL_ECPRI,"TNL_UDP_ECPRI_PF" },
{ TNL_LAST, "" }
 };
 
diff --git a/drivers/net/ice/base/ice_flex_type.h 
b/drivers/net/ice/base/ice_flex_type.h
index 9213856ac1..f75a1005f3 100644
--- a/drivers/net/ice/base/ice_flex_type.h
+++ b/drivers/net/ice/base/ice_flex_type.h
@@ -535,6 +535,7 @@ struct ice_pkg_enum {
 enum ice_tunnel_type {
TNL_VXLAN = 0,
TNL_GENEVE,
+   TNL_ECPRI,
TNL_LAST = 0xFF,
TNL_ALL = 0xFF,
 };
-- 
2.20.1



[dpdk-dev] [dpdk-dev v2 1/6] net/ice/base: add package PTYPE enable information

2020-12-23 Thread Jeff Guo
Scan the 'Marker PType TCAM' session to retrieve the Rx parser PTYPE
enable information from the current package.

Signed-off-by: Haiyue Wang 
Signed-off-by: Jeff Guo 
---
 drivers/net/ice/base/ice_flex_pipe.c | 79 
 drivers/net/ice/base/ice_flex_pipe.h |  3 ++
 drivers/net/ice/base/ice_flex_type.h | 19 +++
 drivers/net/ice/base/ice_type.h  |  1 +
 4 files changed, 102 insertions(+)

diff --git a/drivers/net/ice/base/ice_flex_pipe.c 
b/drivers/net/ice/base/ice_flex_pipe.c
index 7594df1696..987bea5623 100644
--- a/drivers/net/ice/base/ice_flex_pipe.c
+++ b/drivers/net/ice/base/ice_flex_pipe.c
@@ -315,6 +315,84 @@ ice_pkg_enum_entry(struct ice_seg *ice_seg, struct 
ice_pkg_enum *state,
return entry;
 }
 
+/**
+ * ice_hw_ptype_ena - check if the PTYPE is enabled or not
+ * @hw: pointer to the HW structure
+ * @ptype: the hardware PTYPE
+ */
+bool ice_hw_ptype_ena(struct ice_hw *hw, u16 ptype)
+{
+   return ptype < ICE_FLOW_PTYPE_MAX &&
+  ice_is_bit_set(hw->hw_ptype, ptype);
+}
+
+/**
+ * ice_marker_ptype_tcam_handler
+ * @sect_type: section type
+ * @section: pointer to section
+ * @index: index of the Marker PType TCAM entry to be returned
+ * @offset: pointer to receive absolute offset, always 0 for ptype TCAM 
sections
+ *
+ * This is a callback function that can be passed to ice_pkg_enum_entry.
+ * Handles enumeration of individual Marker PType TCAM entries.
+ */
+static void *
+ice_marker_ptype_tcam_handler(u32 sect_type, void *section, u32 index,
+ u32 *offset)
+{
+   struct ice_marker_ptype_tcam_section *marker_ptype;
+
+   if (!section)
+   return NULL;
+
+   if (sect_type != ICE_SID_RXPARSER_MARKER_PTYPE)
+   return NULL;
+
+   if (index > ICE_MAX_MARKER_PTYPE_TCAMS_IN_BUF)
+   return NULL;
+
+   if (offset)
+   *offset = 0;
+
+   marker_ptype = (struct ice_marker_ptype_tcam_section *)section;
+
+   if (index >= LE16_TO_CPU(marker_ptype->count))
+   return NULL;
+
+   return marker_ptype->tcam + index;
+}
+
+/**
+ * ice_fill_hw_ptype - fill the enabled PTYPE bit information
+ * @hw: pointer to the HW structure
+ */
+static void
+ice_fill_hw_ptype(struct ice_hw *hw)
+{
+   struct ice_marker_ptype_tcam_entry *tcam;
+   struct ice_seg *seg = hw->seg;
+   struct ice_pkg_enum state;
+
+   ice_zero_bitmap(hw->hw_ptype, ICE_FLOW_PTYPE_MAX);
+   if (!seg)
+   return;
+
+   ice_memset(&state, 0, sizeof(state), ICE_NONDMA_MEM);
+
+   do {
+   tcam = (struct ice_marker_ptype_tcam_entry *)
+   ice_pkg_enum_entry(seg, &state,
+  ICE_SID_RXPARSER_MARKER_PTYPE, NULL,
+  ice_marker_ptype_tcam_handler);
+   if (tcam &&
+   LE16_TO_CPU(tcam->addr) < ICE_MARKER_PTYPE_TCAM_ADDR_MAX &&
+   LE16_TO_CPU(tcam->ptype) < ICE_FLOW_PTYPE_MAX)
+   ice_set_bit(LE16_TO_CPU(tcam->ptype), hw->hw_ptype);
+
+   seg = NULL;
+   } while (tcam);
+}
+
 /**
  * ice_boost_tcam_handler
  * @sect_type: section type
@@ -1511,6 +1589,7 @@ enum ice_status ice_init_pkg(struct ice_hw *hw, u8 *buf, 
u32 len)
 */
ice_init_pkg_regs(hw);
ice_fill_blk_tbls(hw);
+   ice_fill_hw_ptype(hw);
ice_get_prof_index_max(hw);
} else {
ice_debug(hw, ICE_DBG_INIT, "package load failed, %d\n",
diff --git a/drivers/net/ice/base/ice_flex_pipe.h 
b/drivers/net/ice/base/ice_flex_pipe.h
index 214c7a2837..66965d0975 100644
--- a/drivers/net/ice/base/ice_flex_pipe.h
+++ b/drivers/net/ice/base/ice_flex_pipe.h
@@ -48,6 +48,9 @@ bool ice_tunnel_port_in_use(struct ice_hw *hw, u16 port, u16 
*index);
 bool
 ice_tunnel_get_type(struct ice_hw *hw, u16 port, enum ice_tunnel_type *type);
 
+/* RX parser PType functions */
+bool ice_hw_ptype_ena(struct ice_hw *hw, u16 ptype);
+
 /* XLT2/VSI group functions */
 enum ice_status
 ice_vsig_find_vsi(struct ice_hw *hw, enum ice_block blk, u16 vsi, u16 *vsig);
diff --git a/drivers/net/ice/base/ice_flex_type.h 
b/drivers/net/ice/base/ice_flex_type.h
index 1dd57baccd..9213856ac1 100644
--- a/drivers/net/ice/base/ice_flex_type.h
+++ b/drivers/net/ice/base/ice_flex_type.h
@@ -472,6 +472,25 @@ struct ice_boost_tcam_section {
sizeof(struct ice_boost_tcam_entry), \
sizeof(struct ice_boost_tcam_entry))
 
+/* package Marker PType TCAM entry */
+struct ice_marker_ptype_tcam_entry {
+#define ICE_MARKER_PTYPE_TCAM_ADDR_MAX 1024
+   __le16 addr;
+   __le16 ptype;
+   u8 keys[20];
+};
+
+struct ice_marker_ptype_tcam_section {
+   __le16 count;
+   __le16 reserved;
+   struct ice_marker_ptype_tcam_entry tcam

[dpdk-dev] [dpdk-dev v2 0/6] enable UDP ecpri configure in dcf

2020-12-23 Thread Jeff Guo
Enabling ecpri UDP tunnel port configure in dcf.

v2:
refactor PTYPE parsing and add related sharecode patch
separate patch set

Jeff Guo (6):
  net/ice/base: add package PTYPE enable information
  net/ice: refactor package type parsing
  net/ice/base: add new UDP tunnel type for ecpri
  net/ice: add PTYPE mapping for ecpri
  net/iavf: add PTYPE mapping for ecpri
  net/ice: enable ecpri tunnel port configure in dcf

 drivers/net/iavf/iavf_rxtx.c |  44 +
 drivers/net/ice/base/ice_flex_pipe.c |  80 +++
 drivers/net/ice/base/ice_flex_pipe.h |   3 +
 drivers/net/ice/base/ice_flex_type.h |  20 
 drivers/net/ice/base/ice_type.h  |   1 +
 drivers/net/ice/ice_acl_filter.c |   3 +-
 drivers/net/ice/ice_dcf_ethdev.c |  67 +
 drivers/net/ice/ice_fdir_filter.c|  63 ++--
 drivers/net/ice/ice_generic_flow.c   |  27 +-
 drivers/net/ice/ice_generic_flow.h   |   9 +-
 drivers/net/ice/ice_hash.c   |  47 ++---
 drivers/net/ice/ice_rxtx.c   |  44 +
 drivers/net/ice/ice_switch_filter.c  | 139 +++
 13 files changed, 323 insertions(+), 224 deletions(-)

-- 
2.20.1



[dpdk-dev] [dpdk-dev v2 2/6] net/ice: refactor package type parsing

2020-12-23 Thread Jeff Guo
If the PTYPE support of the package could be checked, no need to parse
different PTYPE list for each type of the package. So, refactor the
package type parsing mechanism in each flow engins.

Signed-off-by: Jeff Guo 
---
 drivers/net/ice/ice_acl_filter.c|   3 +-
 drivers/net/ice/ice_fdir_filter.c   |  63 ++---
 drivers/net/ice/ice_generic_flow.c  |  27 +-
 drivers/net/ice/ice_generic_flow.h  |   9 +-
 drivers/net/ice/ice_hash.c  |  47 ++
 drivers/net/ice/ice_switch_filter.c | 139 
 6 files changed, 64 insertions(+), 224 deletions(-)

diff --git a/drivers/net/ice/ice_acl_filter.c b/drivers/net/ice/ice_acl_filter.c
index f7dbe53574..363ce68318 100644
--- a/drivers/net/ice/ice_acl_filter.c
+++ b/drivers/net/ice/ice_acl_filter.c
@@ -914,7 +914,8 @@ ice_acl_parse(struct ice_adapter *ad,
int ret;
 
memset(filter, 0, sizeof(*filter));
-   item = ice_search_pattern_match_item(pattern, array, array_len, error);
+   item = ice_search_pattern_match_item(ad, pattern, array, array_len,
+error);
if (!item)
return -rte_errno;
 
diff --git a/drivers/net/ice/ice_fdir_filter.c 
b/drivers/net/ice/ice_fdir_filter.c
index 175abcdd5c..ce6aa09d3d 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -84,34 +84,7 @@
ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | \
ICE_INSET_GTPU_TEID | ICE_INSET_GTPU_QFI)
 
-static struct ice_pattern_match_item ice_fdir_pattern_os[] = {
-   {pattern_eth_ipv4, ICE_FDIR_INSET_ETH_IPV4,  
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp, ICE_FDIR_INSET_ETH_IPV4_UDP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv4_tcp, ICE_FDIR_INSET_ETH_IPV4_TCP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv4_sctp,ICE_FDIR_INSET_ETH_IPV4_SCTP, 
ICE_INSET_NONE},
-   {pattern_eth_ipv6, ICE_FDIR_INSET_ETH_IPV6,  
ICE_INSET_NONE},
-   {pattern_eth_ipv6_udp, ICE_FDIR_INSET_ETH_IPV6_UDP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv6_tcp, ICE_FDIR_INSET_ETH_IPV6_TCP,  
ICE_INSET_NONE},
-   {pattern_eth_ipv6_sctp,ICE_FDIR_INSET_ETH_IPV6_SCTP, 
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4,
-  ICE_FDIR_INSET_VXLAN_IPV4,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4_udp,
-  ICE_FDIR_INSET_VXLAN_IPV4_UDP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4_tcp,
-  ICE_FDIR_INSET_VXLAN_IPV4_TCP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_ipv4_sctp,
-  ICE_FDIR_INSET_VXLAN_IPV4_SCTP,   
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4,
-  ICE_FDIR_INSET_VXLAN_IPV4,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp,
-  ICE_FDIR_INSET_VXLAN_IPV4_UDP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp,
-  ICE_FDIR_INSET_VXLAN_IPV4_TCP,
ICE_INSET_NONE},
-   {pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp,
-  ICE_FDIR_INSET_VXLAN_IPV4_SCTP,   
ICE_INSET_NONE},
-};
-
-static struct ice_pattern_match_item ice_fdir_pattern_comms[] = {
+static struct ice_pattern_match_item ice_fdir_pattern_list[] = {
{pattern_ethertype,ICE_FDIR_INSET_ETH,   
ICE_INSET_NONE},
{pattern_eth_ipv4, ICE_FDIR_INSET_ETH_IPV4,  
ICE_INSET_NONE},
{pattern_eth_ipv4_udp, ICE_FDIR_INSET_ETH_IPV4_UDP,  
ICE_INSET_NONE},
@@ -143,8 +116,7 @@ static struct ice_pattern_match_item 
ice_fdir_pattern_comms[] = {
{pattern_eth_ipv6_gtpu_eh, ICE_FDIR_INSET_IPV6_GTPU_EH,  
ICE_INSET_NONE},
 };
 
-static struct ice_flow_parser ice_fdir_parser_os;
-static struct ice_flow_parser ice_fdir_parser_comms;
+static struct ice_flow_parser ice_fdir_parser;
 
 static int
 ice_fdir_is_tunnel_profile(enum ice_fdir_tunnel_type tunnel_type);
@@ -,12 +1083,7 @@ ice_fdir_init(struct ice_adapter *ad)
if (ret)
return ret;
 
-   if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS)
-   parser = &ice_fdir_parser_comms;
-   else if (ad->active_pkg_type == ICE_PKG_TYPE_OS_DEFAULT)
-   parser = &ice_fdir_parser_os;
-   else
-   return -EINVAL;
+   parser = &ice_fdir_parser;
 
return ice_register_parser(parser, ad);
 }
@@ -1124,16 +1091,13 @@ ice_fdir_init(struct ice_adapter *ad)
 static void
 ice_fdir_uninit(struct ice_adapter *ad)
 {
-   struct ice_pf *pf = &ad->pf;
struct ice_flow_parser *parser;
+ 

[dpdk-dev] [dpdk-dev v2 2/2] app/testpmd: add new UDP tunnel port for ecpri

2020-12-23 Thread Jeff Guo
Add new UDP tunnel port params for ecpri configuration, the command
as below:

testpmd> port config 0 udp_tunnel_port add ecpri 6789
testpmd> port config 0 udp_tunnel_port rm ecpri 6789

Signed-off-by: Jeff Guo 
---
 app/test-pmd/cmdline.c | 7 +--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 2ccbaa039e..af08e48e2e 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -9175,6 +9175,8 @@ cmd_cfg_tunnel_udp_port_parsed(void *parsed_result,
tunnel_udp.prot_type = RTE_TUNNEL_TYPE_GENEVE;
} else if (!strcmp(res->tunnel_type, "vxlan-gpe")) {
tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN_GPE;
+   } else if (!strcmp(res->tunnel_type, "ecpri")) {
+   tunnel_udp.prot_type = RTE_TUNNEL_TYPE_ECPRI;
} else {
printf("Invalid tunnel type\n");
return;
@@ -9209,7 +9211,7 @@ cmdline_parse_token_string_t 
cmd_config_tunnel_udp_port_action =
 "add#rm");
 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_tunnel_type =
TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, tunnel_type,
-"vxlan#geneve#vxlan-gpe");
+"vxlan#geneve#vxlan-gpe#ecpri");
 cmdline_parse_token_num_t cmd_config_tunnel_udp_port_value =
TOKEN_NUM_INITIALIZER(struct cmd_config_tunnel_udp_port, udp_port,
  RTE_UINT16);
@@ -9217,7 +9219,8 @@ cmdline_parse_token_num_t 
cmd_config_tunnel_udp_port_value =
 cmdline_parse_inst_t cmd_cfg_tunnel_udp_port = {
.f = cmd_cfg_tunnel_udp_port_parsed,
.data = NULL,
-   .help_str = "port config  udp_tunnel_port add|rm 
vxlan|geneve|vxlan-gpe ",
+   .help_str = "port config  udp_tunnel_port add|rm vxlan|"
+   "geneve|vxlan-gpe|ecpri ",
.tokens = {
(void *)&cmd_config_tunnel_udp_port_port,
(void *)&cmd_config_tunnel_udp_port_config,
-- 
2.20.1



[dpdk-dev] [dpdk-dev v2 1/2] ethdev: add new tunnel type for ecpri

2020-12-23 Thread Jeff Guo
Add type of RTE_TUNNEL_TYPE_ECPRI into the enum of ethdev tunnel type.

Signed-off-by: Jeff Guo 
Reviewed-by: Qi Zhang 
---
 lib/librte_ethdev/rte_ethdev.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index f5f8919186..2cbce958cf 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -1219,6 +1219,7 @@ enum rte_eth_tunnel_type {
RTE_TUNNEL_TYPE_IP_IN_GRE,
RTE_L2_TUNNEL_TYPE_E_TAG,
RTE_TUNNEL_TYPE_VXLAN_GPE,
+   RTE_TUNNEL_TYPE_ECPRI,
RTE_TUNNEL_TYPE_MAX,
 };
 
-- 
2.20.1



  1   2   3   4   5   6   7   8   9   >