Although currently only the gtpu inner hash be enabled while not the gtpu outer hash, but the outer protocol still needed to co-exist with inner protocol when configure the gtpu inner hash rule, that would allow the gtpu innner hash support for the different outer protocols.
Signed-off-by: Jeff Guo <jia....@intel.com> --- drivers/net/iavf/iavf_hash.c | 183 +++++++++++++++++++++++++++-------- 1 file changed, 143 insertions(+), 40 deletions(-) diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c index ff77d7135..ba0411dff 100644 --- a/drivers/net/iavf/iavf_hash.c +++ b/drivers/net/iavf/iavf_hash.c @@ -134,6 +134,7 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad, #define TUNNEL_LEVEL_OUTER 0 #define TUNNEL_LEVEL_INNER 1 +#define TUNNEL_LEVEL_OUTER_AND_INNER 2 /* proto_hdrs template */ struct virtchnl_proto_hdrs outer_ipv4_tmplt = { @@ -256,6 +257,54 @@ struct virtchnl_proto_hdrs ipv6_pfcp_tmplt = { TUNNEL_LEVEL_OUTER, 2, {proto_hdr_ipv6, proto_hdr_pfcp} }; +struct virtchnl_proto_hdrs outer_ipv4_udp_inner_ipv4_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 3, {proto_hdr_ipv4, proto_hdr_udp, proto_hdr_ipv4} +}; + +struct virtchnl_proto_hdrs outer_ipv4_udp_inner_ipv4_udp_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 4, {proto_hdr_ipv4, proto_hdr_udp, proto_hdr_ipv4, proto_hdr_udp} +}; + +struct virtchnl_proto_hdrs outer_ipv4_udp_inner_ipv4_tcp_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 4, {proto_hdr_ipv4, proto_hdr_udp, proto_hdr_ipv4, proto_hdr_tcp} +}; + +struct virtchnl_proto_hdrs outer_ipv4_udp_inner_ipv6_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 3, {proto_hdr_ipv4, proto_hdr_udp, proto_hdr_ipv6} +}; + +struct virtchnl_proto_hdrs outer_ipv4_udp_inner_ipv6_udp_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 4, {proto_hdr_ipv4, proto_hdr_udp, proto_hdr_ipv6, proto_hdr_udp} +}; + +struct virtchnl_proto_hdrs outer_ipv4_udp_inner_ipv6_tcp_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 4, {proto_hdr_ipv4, proto_hdr_udp, proto_hdr_ipv6, proto_hdr_tcp} +}; + +struct virtchnl_proto_hdrs outer_ipv6_udp_inner_ipv4_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 3, {proto_hdr_ipv6, proto_hdr_udp, proto_hdr_ipv4} +}; + +struct virtchnl_proto_hdrs outer_ipv6_udp_inner_ipv4_udp_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 4, {proto_hdr_ipv6, proto_hdr_udp, proto_hdr_ipv4, proto_hdr_udp} +}; + +struct virtchnl_proto_hdrs outer_ipv6_udp_inner_ipv4_tcp_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 4, {proto_hdr_ipv6, proto_hdr_udp, proto_hdr_ipv4, proto_hdr_tcp} +}; + +struct virtchnl_proto_hdrs outer_ipv6_udp_inner_ipv6_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 3, {proto_hdr_ipv6, proto_hdr_udp, proto_hdr_ipv6} +}; + +struct virtchnl_proto_hdrs outer_ipv6_udp_inner_ipv6_udp_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 4, {proto_hdr_ipv6, proto_hdr_udp, proto_hdr_ipv6, proto_hdr_udp} +}; + +struct virtchnl_proto_hdrs outer_ipv6_udp_inner_ipv6_tcp_tmplt = { + TUNNEL_LEVEL_OUTER_AND_INNER, 4, {proto_hdr_ipv6, proto_hdr_udp, proto_hdr_ipv6, proto_hdr_tcp} +}; + /* rss type super set */ /* IPv4 outer */ @@ -308,20 +357,50 @@ struct virtchnl_proto_hdrs ipv6_pfcp_tmplt = { ETH_RSS_NONFRAG_IPV6_TCP) #define IAVF_RSS_TYPE_INNER_IPV6_SCTP (ETH_RSS_IPV6 | \ ETH_RSS_NONFRAG_IPV6_SCTP) -/* GTPU IPv4 */ -#define IAVF_RSS_TYPE_GTPU_IPV4 (IAVF_RSS_TYPE_INNER_IPV4 | \ - ETH_RSS_GTPU) -#define IAVF_RSS_TYPE_GTPU_IPV4_UDP (IAVF_RSS_TYPE_INNER_IPV4_UDP | \ - ETH_RSS_GTPU) -#define IAVF_RSS_TYPE_GTPU_IPV4_TCP (IAVF_RSS_TYPE_INNER_IPV4_TCP | \ +/* GTPU outer IPv4 inner IPv4 */ +#define IAVF_RSS_TYPE_IPV4_GTPU_IPV4 (IAVF_RSS_TYPE_OUTER_IPV4 | \ + IAVF_RSS_TYPE_INNER_IPV4 | \ ETH_RSS_GTPU) -/* GTPU IPv6 */ -#define IAVF_RSS_TYPE_GTPU_IPV6 (IAVF_RSS_TYPE_INNER_IPV6 | \ +#define IAVF_RSS_TYPE_IPV4_GTPU_IPV4_UDP (IAVF_RSS_TYPE_OUTER_IPV4 | \ + IAVF_RSS_TYPE_INNER_IPV4_UDP | \ + ETH_RSS_GTPU) +#define IAVF_RSS_TYPE_IPV4_GTPU_IPV4_TCP (IAVF_RSS_TYPE_OUTER_IPV4 | \ + IAVF_RSS_TYPE_INNER_IPV4_TCP | \ + ETH_RSS_GTPU) + +/* GTPU outer IPv4 inner IPv6 */ +#define IAVF_RSS_TYPE_IPV4_GTPU_IPV6 (IAVF_RSS_TYPE_OUTER_IPV4 | \ + IAVF_RSS_TYPE_INNER_IPV6 | \ ETH_RSS_GTPU) -#define IAVF_RSS_TYPE_GTPU_IPV6_UDP (IAVF_RSS_TYPE_INNER_IPV6_UDP | \ +#define IAVF_RSS_TYPE_IPV4_GTPU_IPV6_UDP (IAVF_RSS_TYPE_OUTER_IPV4 | \ + IAVF_RSS_TYPE_INNER_IPV6_UDP | \ + ETH_RSS_GTPU) +#define IAVF_RSS_TYPE_IPV4_GTPU_IPV6_TCP (IAVF_RSS_TYPE_OUTER_IPV4 | \ + IAVF_RSS_TYPE_INNER_IPV6_TCP | \ + ETH_RSS_GTPU) + +/* GTPU outer IPv6 inner IPv4 */ +#define IAVF_RSS_TYPE_IPV6_GTPU_IPV4 (IAVF_RSS_TYPE_OUTER_IPV6 | \ + IAVF_RSS_TYPE_INNER_IPV4 | \ ETH_RSS_GTPU) -#define IAVF_RSS_TYPE_GTPU_IPV6_TCP (IAVF_RSS_TYPE_INNER_IPV6_TCP | \ +#define IAVF_RSS_TYPE_IPV6_GTPU_IPV4_UDP (IAVF_RSS_TYPE_OUTER_IPV6 | \ + IAVF_RSS_TYPE_INNER_IPV4_UDP | \ + ETH_RSS_GTPU) +#define IAVF_RSS_TYPE_IPV6_GTPU_IPV4_TCP (IAVF_RSS_TYPE_OUTER_IPV6 | \ + IAVF_RSS_TYPE_INNER_IPV4_TCP | \ + ETH_RSS_GTPU) + +/* GTPU outer IPv6 inner IPv6 */ +#define IAVF_RSS_TYPE_IPV6_GTPU_IPV6 (IAVF_RSS_TYPE_OUTER_IPV6 | \ + IAVF_RSS_TYPE_INNER_IPV6 | \ ETH_RSS_GTPU) +#define IAVF_RSS_TYPE_IPV6_GTPU_IPV6_UDP (IAVF_RSS_TYPE_OUTER_IPV6 | \ + IAVF_RSS_TYPE_INNER_IPV6_UDP | \ + ETH_RSS_GTPU) +#define IAVF_RSS_TYPE_IPV6_GTPU_IPV6_TCP (IAVF_RSS_TYPE_OUTER_IPV6 | \ + IAVF_RSS_TYPE_INNER_IPV6_TCP | \ + ETH_RSS_GTPU) + /* ESP, AH, L2TPV3 and PFCP */ #define IAVF_RSS_TYPE_IPV4_ESP (ETH_RSS_ESP | ETH_RSS_IPV4) #define IAVF_RSS_TYPE_IPV4_AH (ETH_RSS_AH | ETH_RSS_IPV4) @@ -348,18 +427,18 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = { {iavf_pattern_eth_vlan_ipv4_udp, IAVF_RSS_TYPE_VLAN_IPV4_UDP, &outer_ipv4_udp_tmplt}, {iavf_pattern_eth_vlan_ipv4_tcp, IAVF_RSS_TYPE_VLAN_IPV4_TCP, &outer_ipv4_tcp_tmplt}, {iavf_pattern_eth_vlan_ipv4_sctp, IAVF_RSS_TYPE_VLAN_IPV4_SCTP, &outer_ipv4_sctp_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &inner_ipv4_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &inner_ipv4_udp_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &inner_ipv4_tcp_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &inner_ipv4_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &inner_ipv4_udp_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &inner_ipv4_tcp_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &inner_ipv4_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &inner_ipv4_udp_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &inner_ipv4_tcp_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_eh_ipv4, IAVF_RSS_TYPE_GTPU_IPV4, &inner_ipv4_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_eh_ipv4_udp, IAVF_RSS_TYPE_GTPU_IPV4_UDP, &inner_ipv4_udp_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_eh_ipv4_tcp, IAVF_RSS_TYPE_GTPU_IPV4_TCP, &inner_ipv4_tcp_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_ipv4, IAVF_RSS_TYPE_IPV4_GTPU_IPV4, &outer_ipv4_udp_inner_ipv4_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_ipv4_udp, IAVF_RSS_TYPE_IPV4_GTPU_IPV4_UDP, &outer_ipv4_udp_inner_ipv4_udp_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_ipv4_tcp, IAVF_RSS_TYPE_IPV4_GTPU_IPV4_TCP, &outer_ipv4_udp_inner_ipv4_tcp_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_ipv4, IAVF_RSS_TYPE_IPV6_GTPU_IPV4, &outer_ipv6_udp_inner_ipv4_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_ipv4_udp, IAVF_RSS_TYPE_IPV6_GTPU_IPV4_UDP, &inner_ipv4_udp_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_ipv4_tcp, IAVF_RSS_TYPE_IPV6_GTPU_IPV4_TCP, &inner_ipv4_tcp_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_RSS_TYPE_IPV4_GTPU_IPV4, &outer_ipv4_udp_inner_ipv4_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_RSS_TYPE_IPV4_GTPU_IPV4_UDP, &outer_ipv4_udp_inner_ipv4_udp_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_RSS_TYPE_IPV4_GTPU_IPV4_TCP, &outer_ipv4_udp_inner_ipv4_tcp_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_eh_ipv4, IAVF_RSS_TYPE_IPV6_GTPU_IPV4, &inner_ipv4_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_eh_ipv4_udp, IAVF_RSS_TYPE_IPV6_GTPU_IPV4_UDP, &inner_ipv4_udp_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_eh_ipv4_tcp, IAVF_RSS_TYPE_IPV6_GTPU_IPV4_TCP, &inner_ipv4_tcp_tmplt}, {iavf_pattern_eth_ipv4_esp, IAVF_RSS_TYPE_IPV4_ESP, &ipv4_esp_tmplt}, {iavf_pattern_eth_ipv4_udp_esp, IAVF_RSS_TYPE_IPV4_ESP, &ipv4_udp_esp_tmplt}, {iavf_pattern_eth_ipv4_ah, IAVF_RSS_TYPE_IPV4_AH, &ipv4_ah_tmplt}, @@ -374,18 +453,18 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = { {iavf_pattern_eth_vlan_ipv6_udp, IAVF_RSS_TYPE_VLAN_IPV6_UDP, &outer_ipv6_udp_tmplt}, {iavf_pattern_eth_vlan_ipv6_tcp, IAVF_RSS_TYPE_VLAN_IPV6_TCP, &outer_ipv6_tcp_tmplt}, {iavf_pattern_eth_vlan_ipv6_sctp, IAVF_RSS_TYPE_VLAN_IPV6_SCTP, &outer_ipv6_sctp_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &inner_ipv6_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &inner_ipv6_udp_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &inner_ipv6_tcp_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &inner_ipv6_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &inner_ipv6_udp_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &inner_ipv6_tcp_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_eh_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &inner_ipv6_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_eh_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &inner_ipv6_udp_tmplt}, - {iavf_pattern_eth_ipv4_gtpu_eh_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &inner_ipv6_tcp_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_eh_ipv6, IAVF_RSS_TYPE_GTPU_IPV6, &inner_ipv6_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_eh_ipv6_udp, IAVF_RSS_TYPE_GTPU_IPV6_UDP, &inner_ipv6_udp_tmplt}, - {iavf_pattern_eth_ipv6_gtpu_eh_ipv6_tcp, IAVF_RSS_TYPE_GTPU_IPV6_TCP, &inner_ipv6_tcp_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_ipv6, IAVF_RSS_TYPE_IPV4_GTPU_IPV6, &outer_ipv4_udp_inner_ipv6_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_ipv6_udp, IAVF_RSS_TYPE_IPV4_GTPU_IPV6_UDP, &outer_ipv4_udp_inner_ipv6_udp_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_ipv6_tcp, IAVF_RSS_TYPE_IPV4_GTPU_IPV6_TCP, &outer_ipv4_udp_inner_ipv6_tcp_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_ipv6, IAVF_RSS_TYPE_IPV6_GTPU_IPV6, &inner_ipv6_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_ipv6_udp, IAVF_RSS_TYPE_IPV6_GTPU_IPV6_UDP, &inner_ipv6_udp_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_ipv6_tcp, IAVF_RSS_TYPE_IPV6_GTPU_IPV6_TCP, &inner_ipv6_tcp_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_eh_ipv6, IAVF_RSS_TYPE_IPV4_GTPU_IPV6, &outer_ipv4_udp_inner_ipv6_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_eh_ipv6_udp, IAVF_RSS_TYPE_IPV4_GTPU_IPV6_UDP, &outer_ipv4_udp_inner_ipv6_udp_tmplt}, + {iavf_pattern_eth_ipv4_gtpu_eh_ipv6_tcp, IAVF_RSS_TYPE_IPV4_GTPU_IPV6_TCP, &outer_ipv4_udp_inner_ipv6_tcp_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_eh_ipv6, IAVF_RSS_TYPE_IPV6_GTPU_IPV6, &inner_ipv6_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_eh_ipv6_udp, IAVF_RSS_TYPE_IPV6_GTPU_IPV6_UDP, &inner_ipv6_udp_tmplt}, + {iavf_pattern_eth_ipv6_gtpu_eh_ipv6_tcp, IAVF_RSS_TYPE_IPV6_GTPU_IPV6_TCP, &inner_ipv6_tcp_tmplt}, {iavf_pattern_eth_ipv6_esp, IAVF_RSS_TYPE_IPV6_ESP, &ipv6_esp_tmplt}, {iavf_pattern_eth_ipv6_udp_esp, IAVF_RSS_TYPE_IPV6_ESP, &ipv6_udp_esp_tmplt}, {iavf_pattern_eth_ipv6_ah, IAVF_RSS_TYPE_IPV6_AH, &ipv6_ah_tmplt}, @@ -668,18 +747,42 @@ iavf_refine_proto_hdrs_l234(struct virtchnl_proto_hdrs *proto_hdrs, /* refine proto hdrs base on gtpu rss type */ static void -iavf_refine_proto_hdrs_gtpu(struct virtchnl_proto_hdrs *proto_hdrs, - uint64_t rss_type) +iavf_refine_proto_hdrs_gtpu(struct virtchnl_proto_hdrs *proto_hdrs) { struct virtchnl_proto_hdr *hdr; + bool is_inner_ipv4 = false; + bool is_inner_ipv6 = false; + bool is_inner_udp = false; + bool is_inner_tcp = false; int i; - if (!(rss_type & ETH_RSS_GTPU)) - return; - for (i = 0; i < proto_hdrs->count; i++) { hdr = &proto_hdrs->proto_hdr[i]; switch (hdr->type) { + case VIRTCHNL_PROTO_HDR_IPV4: + if (!is_inner_ipv4) { + hdr->field_selector = 0; + is_inner_ipv4 = true; + } + break; + case VIRTCHNL_PROTO_HDR_IPV6: + if (!is_inner_ipv6) { + hdr->field_selector = 0; + is_inner_ipv6 = true; + } + break; + case VIRTCHNL_PROTO_HDR_UDP: + if (!is_inner_udp) { + hdr->field_selector = 0; + is_inner_udp = true; + } + break; + case VIRTCHNL_PROTO_HDR_TCP: + if (!is_inner_tcp) { + hdr->field_selector = 0; + is_inner_tcp = true; + } + break; case VIRTCHNL_PROTO_HDR_GTPU_IP: VIRTCHNL_ADD_PROTO_HDR_FIELD(hdr, VIRTCHNL_PROTO_HDR_GTPU_IP_TEID); @@ -730,7 +833,7 @@ static void iavf_refine_proto_hdrs(struct virtchnl_proto_hdrs *proto_hdrs, { iavf_refine_proto_hdrs_l234(proto_hdrs, rss_type); iavf_refine_proto_hdrs_by_pattern(proto_hdrs, phint); - iavf_refine_proto_hdrs_gtpu(proto_hdrs, rss_type); + iavf_refine_proto_hdrs_gtpu(proto_hdrs); } static uint64_t invalid_rss_comb[] = { -- 2.20.1