]> git.droids-corp.org - dpdk.git/commitdiff
net/ice: fix RSS for GTPU
authorQi Zhang <qi.z.zhang@intel.com>
Wed, 13 May 2020 12:11:44 +0000 (20:11 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 19 May 2020 15:12:16 +0000 (17:12 +0200)
All supported pattern for GTPU include extend header:
pattern_eth_ipv4_gtpu_eh_ipv4
pattern_eth_ipv4_gtpu_eh_ipv4_udp
pattern_eth_ipv4_gtpu_eh_ipv4_tcp

So the RSS rule should only take effect on GTPU packet that contains
extend header. The patch fix above issue and also allow inner l4 port
as input set.

Fixes: c08a72c79c7f ("net/ice: fix pattern name of GTPU with extension header")
Cc: stable@dpdk.org
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Qiming Yang <qiming.yang@intel.com>
Tested-by: Simei Su <simei.su@intel.com>
drivers/net/ice/base/ice_flow.c
drivers/net/ice/base/ice_flow.h
drivers/net/ice/ice_hash.c

index 08e646b04eb26dd989165200a075cbfb1f1ae0d6..e741f59400379c5137453794759d815b23f7da31 100644 (file)
@@ -694,11 +694,41 @@ ice_flow_proc_seg_hdrs(struct ice_flow_prof_params *params)
                                (const ice_bitmap_t *)ice_ptypes_ipv4_il;
                        ice_and_bitmap(params->ptypes, params->ptypes, src,
                                       ICE_FLOW_PTYPE_MAX);
+                       if (hdrs & ICE_FLOW_SEG_HDR_UDP) {
+                               src = (const ice_bitmap_t *)ice_ptypes_udp_il;
+                               ice_and_bitmap(params->ptypes,
+                                               params->ptypes, src,
+                                              ICE_FLOW_PTYPE_MAX);
+                       } else if (hdrs & ICE_FLOW_SEG_HDR_TCP) {
+                               ice_and_bitmap(params->ptypes, params->ptypes,
+                                              (const ice_bitmap_t *)
+                                              ice_ptypes_tcp_il,
+                                              ICE_FLOW_PTYPE_MAX);
+                       } else if (hdrs & ICE_FLOW_SEG_HDR_SCTP) {
+                               src = (const ice_bitmap_t *)ice_ptypes_sctp_il;
+                               ice_and_bitmap(params->ptypes, params->ptypes,
+                                              src, ICE_FLOW_PTYPE_MAX);
+                       }
                } else if (hdrs & ICE_FLOW_SEG_HDR_IPV6) {
                        src = !i ? (const ice_bitmap_t *)ice_ptypes_ipv6_ofos :
                                (const ice_bitmap_t *)ice_ptypes_ipv6_il;
                        ice_and_bitmap(params->ptypes, params->ptypes, src,
                                       ICE_FLOW_PTYPE_MAX);
+                       if (hdrs & ICE_FLOW_SEG_HDR_UDP) {
+                               src = (const ice_bitmap_t *)ice_ptypes_udp_il;
+                               ice_and_bitmap(params->ptypes,
+                                               params->ptypes, src,
+                                              ICE_FLOW_PTYPE_MAX);
+                       } else if (hdrs & ICE_FLOW_SEG_HDR_TCP) {
+                               ice_and_bitmap(params->ptypes, params->ptypes,
+                                              (const ice_bitmap_t *)
+                                              ice_ptypes_tcp_il,
+                                              ICE_FLOW_PTYPE_MAX);
+                       } else if (hdrs & ICE_FLOW_SEG_HDR_SCTP) {
+                               src = (const ice_bitmap_t *)ice_ptypes_sctp_il;
+                               ice_and_bitmap(params->ptypes, params->ptypes,
+                                              src, ICE_FLOW_PTYPE_MAX);
+                       }
                }
 
                if (hdrs & ICE_FLOW_SEG_HDR_ICMP) {
@@ -706,18 +736,6 @@ ice_flow_proc_seg_hdrs(struct ice_flow_prof_params *params)
                                (const ice_bitmap_t *)ice_ptypes_icmp_il;
                        ice_and_bitmap(params->ptypes, params->ptypes, src,
                                       ICE_FLOW_PTYPE_MAX);
-               } else if (hdrs & ICE_FLOW_SEG_HDR_UDP) {
-                       src = (const ice_bitmap_t *)ice_ptypes_udp_il;
-                       ice_and_bitmap(params->ptypes, params->ptypes, src,
-                                      ICE_FLOW_PTYPE_MAX);
-               } else if (hdrs & ICE_FLOW_SEG_HDR_TCP) {
-                       ice_and_bitmap(params->ptypes, params->ptypes,
-                                      (const ice_bitmap_t *)ice_ptypes_tcp_il,
-                                      ICE_FLOW_PTYPE_MAX);
-               } else if (hdrs & ICE_FLOW_SEG_HDR_SCTP) {
-                       src = (const ice_bitmap_t *)ice_ptypes_sctp_il;
-                       ice_and_bitmap(params->ptypes, params->ptypes, src,
-                                      ICE_FLOW_PTYPE_MAX);
                } else if (hdrs & ICE_FLOW_SEG_HDR_GRE) {
                        if (!i) {
                                src = (const ice_bitmap_t *)ice_ptypes_gre_of;
index 3897d8b8842ba7e8bea67c512a3d28dc90b11248..c8a0483e38e36e4115a245023f19be9e84c53291 100644 (file)
@@ -160,6 +160,7 @@ enum ice_flow_seg_hdr {
  * ICE_FLOW_SEG_HDR_GTPU_UP           1              1
  */
 #define ICE_FLOW_SEG_HDR_GTPU (ICE_FLOW_SEG_HDR_GTPU_IP | \
+                              ICE_FLOW_SEG_HDR_GTPU_EH | \
                               ICE_FLOW_SEG_HDR_GTPU_DWN | \
                               ICE_FLOW_SEG_HDR_GTPU_UP)
 #define ICE_FLOW_SEG_HDR_PFCP (ICE_FLOW_SEG_HDR_PFCP_NODE | \
index 72c8ddc9a88f4fac7bcb570340d438cd0d5db086..11435cbfbe978c67b2f2e2ed1975e096e3ef40a0 100644 (file)
@@ -95,7 +95,7 @@ struct rss_type_match_hdr hint_7 = {
 struct rss_type_match_hdr hint_8 = {
        ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP};
 struct rss_type_match_hdr hint_9 = {
-       ICE_FLOW_SEG_HDR_GTPU_IP,       ETH_RSS_IPV4};
+       ICE_FLOW_SEG_HDR_GTPU_EH, ETH_RSS_IPV4};
 struct rss_type_match_hdr hint_10 = {
        ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_IPV4};
 struct rss_type_match_hdr hint_11 = {
@@ -104,6 +104,10 @@ struct rss_type_match_hdr hint_12 = {
        ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_NONFRAG_IPV4_TCP};
 struct rss_type_match_hdr hint_13 = {
        ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_NONFRAG_IPV4_SCTP};
+struct rss_type_match_hdr hint_14 = {
+       ICE_FLOW_SEG_HDR_GTPU_EH, ETH_RSS_NONFRAG_IPV4_UDP};
+struct rss_type_match_hdr hint_15 = {
+       ICE_FLOW_SEG_HDR_GTPU_EH, ETH_RSS_NONFRAG_IPV4_TCP};
 
 /* Supported pattern for os default package. */
 static struct ice_pattern_match_item ice_hash_pattern_list_os[] = {
@@ -130,8 +134,8 @@ static struct ice_pattern_match_item ice_hash_pattern_list_comms[] = {
        {pattern_eth_ipv6_sctp,             ICE_INSET_NONE,  &hint_8},
        {pattern_empty,                     ICE_INSET_NONE,  &hint_0},
        {pattern_eth_ipv4_gtpu_eh_ipv4,     ICE_INSET_NONE,  &hint_9},
-       {pattern_eth_ipv4_gtpu_eh_ipv4_udp, ICE_INSET_NONE,  &hint_9},
-       {pattern_eth_ipv4_gtpu_eh_ipv4_tcp, ICE_INSET_NONE,  &hint_9},
+       {pattern_eth_ipv4_gtpu_eh_ipv4_udp, ICE_INSET_NONE,  &hint_14},
+       {pattern_eth_ipv4_gtpu_eh_ipv4_tcp, ICE_INSET_NONE,  &hint_15},
        {pattern_eth_pppoes_ipv4,           ICE_INSET_NONE,  &hint_10},
        {pattern_eth_pppoes_ipv4_udp,       ICE_INSET_NONE,  &hint_11},
        {pattern_eth_pppoes_ipv4_tcp,       ICE_INSET_NONE,  &hint_12},