[Intel-wired-lan] [PATCH S48 v3 06/14] ice: enhanced IPV4 and IPV6 flow filter

Kirsher, Jeffrey T jeffrey.t.kirsher at intel.com
Fri Jul 3 05:02:30 UTC 2020


> -----Original Message-----
> From: Intel-wired-lan <intel-wired-lan-bounces at osuosl.org> On Behalf Of Qi
> Zhang
> Sent: Thursday, July 2, 2020 15:58
> To: intel-wired-lan at lists.osuosl.org
> Cc: Zhang, Qi Z <qi.z.zhang at intel.com>
> Subject: [Intel-wired-lan] [PATCH S48 v3 06/14] ice: enhanced IPV4 and IPV6
> flow filter
> 
> Seperate IPv4 and IPv6 ptype bit mask table into 2 tables:
> Without or without L4 protocols.
> 
> When a flow filter without any l4 type is specified, the
> ICE_FLOW_SEG_HDR_IPV_OTHER flag can be used to describe if user want to
> create a IP rule target for all IP packet or just IP packet without l4 header.
> 
> Signed-off-by: Dan Nowlin <dan.nowlin at intel.com>
> Signed-off-by: Qi Zhang <qi.z.zhang at intel.com>
> ---
>  drivers/net/ethernet/intel/ice/ice_flow.c | 113
> ++++++++++++++++++++++++++++--
>  drivers/net/ethernet/intel/ice/ice_flow.h |   4 ++
>  2 files changed, 113 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_flow.c
> b/drivers/net/ethernet/intel/ice/ice_flow.c
> index ba11b9e98f85..f7eeb31f8b22 100644
> --- a/drivers/net/ethernet/intel/ice/ice_flow.c
> +++ b/drivers/net/ethernet/intel/ice/ice_flow.c
> @@ -156,7 +156,9 @@ static const u32 ice_ptypes_macvlan_il[] = {
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,  };
> 
> -/* Packet types for packets with an Outer/First/Single IPv4 header */
> +/* Packet types for packets with an Outer/First/Single IPv4 header,
> +does NOT
> + * include IPV4 other PTYPEs
> + */
>  static const u32 ice_ptypes_ipv4_ofos[] = {
>  	0x1DC00000, 0x04000800, 0x00000000, 0x00000000,
>  	0x00000000, 0x00000155, 0x00000000, 0x00000000, @@ -166,6
> +168,18 @@ static const u32 ice_ptypes_ipv4_ofos[] = {
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +};
> +
> +/* Packet types for packets with an Outer/First/Single IPv4 header,
> +includes
> + * IPV4 other PTYPEs
> + */
> +static const u32 ice_ptypes_ipv4_ofos_all[] = {
> +	0x1DC00000, 0x04000800, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000155, 0x00000000, 0x00000000,
> +	0x00000000, 0x000FC000, 0x83E0F800, 0x00000101,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,  }; @@ -182,7
> +196,9 @@ static const u32 ice_ptypes_ipv4_il[] = {
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,  };
> 
> -/* Packet types for packets with an Outer/First/Single IPv6 header */
> +/* Packet types for packets with an Outer/First/Single IPv6 header,
> +does NOT
> + * include IVP6 other PTYPEs
> + */
>  static const u32 ice_ptypes_ipv6_ofos[] = {
>  	0x00000000, 0x00000000, 0x77000000, 0x10002000,
>  	0x00000000, 0x000002AA, 0x00000000, 0x00000000, @@ -192,6
> +208,18 @@ static const u32 ice_ptypes_ipv6_ofos[] = {
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +};
> +
> +/* Packet types for packets with an Outer/First/Single IPv6 header,
> +includes
> + * IPV6 other PTYPEs
> + */
> +static const u32 ice_ptypes_ipv6_ofos_all[] = {
> +	0x00000000, 0x00000000, 0x77000000, 0x10002000,
> +	0x00000000, 0x000002AA, 0x00000000, 0x00000000,
> +	0x00080F00, 0x03F00000, 0x7C1F0000, 0x00000206,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,  }; @@ -208,6
> +236,54 @@ static const u32 ice_ptypes_ipv6_il[] = {
>  	0x00000000, 0x00000000, 0x00000000, 0x00000000,  };
> 
> +/* Packet types for packets with an Outer/First/Single IPv4 header - no
> +L4 */ static const u32 ice_ipv4_ofos_no_l4[] = {
> +	0x10C00000, 0x04000800, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000, };
> +
> +/* Packet types for packets with an Innermost/Last IPv4 header - no L4
> +*/ static const u32 ice_ipv4_il_no_l4[] = {
> +	0x60000000, 0x18043008, 0x80000002, 0x6010c021,
> +	0x00000008, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000, };
> +
> +/* Packet types for packets with an Outer/First/Single IPv6 header - no
> +L4 */ static const u32 ice_ipv6_ofos_no_l4[] = {
> +	0x00000000, 0x00000000, 0x43000000, 0x10002000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000, };
> +
> +/* Packet types for packets with an Innermost/Last IPv6 header - no L4
> +*/ static const u32 ice_ipv6_il_no_l4[] = {
> +	0x00000000, 0x02180430, 0x0000010c, 0x086010c0,
> +	0x00000430, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +	0x00000000, 0x00000000, 0x00000000, 0x00000000, };
> +
>  /* Packet types for packets with an Outermost/First ARP header */  static
> const u32 ice_ptypes_arp_of[] = {
>  	0x00000800, 0x00000000, 0x00000000, 0x00000000, @@ -529,6 +605,9
> @@ struct ice_flow_prof_params {
>  #define ICE_FLOW_SEG_HDRS_L4_MASK	\
>  	(ICE_FLOW_SEG_HDR_ICMP | ICE_FLOW_SEG_HDR_TCP |
> ICE_FLOW_SEG_HDR_UDP | \
>  	 ICE_FLOW_SEG_HDR_SCTP)
> +/* mask for L4 protocols that are NOT part of IPV4/6 OTHER PTYPE groups
> */
> +#define ICE_FLOW_SEG_HDRS_L4_MASK_NO_OTHER	\
> +	(ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_UDP |
> ICE_FLOW_SEG_HDR_SCTP)
> 
>  /**
>   * ice_flow_val_hdrs - validates packet segments for valid protocol headers
> @@ -645,11 +724,37 @@ ice_flow_proc_seg_hdrs(struct ice_flow_prof_params
> *params)
>  				   ICE_FLOW_PTYPE_MAX);
>  		}
> 
> -		if (hdrs & ICE_FLOW_SEG_HDR_IPV4) {
> +		if ((hdrs & ICE_FLOW_SEG_HDR_IPV4) &&
> +		    (hdrs & ICE_FLOW_SEG_HDR_IPV_OTHER)) {
> +			src = i ?
> +				(const unsigned long *)ice_ptypes_ipv4_il :
> +				(const unsigned long *)ice_ptypes_ipv4_ofos_all;
 
More wrapping issues in the above three lines

> +			bitmap_and(params->ptypes, params->ptypes, src,
> +				   ICE_FLOW_PTYPE_MAX);
> +		} else if ((hdrs & ICE_FLOW_SEG_HDR_IPV6) &&
> +			   (hdrs & ICE_FLOW_SEG_HDR_IPV_OTHER)) {
> +			src = i ?
> +				(const unsigned long *)ice_ptypes_ipv6_il :
> +				(const unsigned long *)ice_ptypes_ipv6_ofos_all;

Here as well

> +			bitmap_and(params->ptypes, params->ptypes, src,
> +				   ICE_FLOW_PTYPE_MAX);
> +		} else if ((hdrs & ICE_FLOW_SEG_HDR_IPV4) &&
> +			   !(hdrs & ICE_FLOW_SEG_HDRS_L4_MASK_NO_OTHER))
> {
> +			src = !i ? (const unsigned long *)ice_ipv4_ofos_no_l4 :
> +				(const unsigned long *)ice_ipv4_il_no_l4;
> +			bitmap_and(params->ptypes, params->ptypes, src,
> +				   ICE_FLOW_PTYPE_MAX);
> +		} else if (hdrs & ICE_FLOW_SEG_HDR_IPV4) {
>  			src = !i ? (const unsigned long *)ice_ptypes_ipv4_ofos :
>  				(const unsigned long *)ice_ptypes_ipv4_il;
>  			bitmap_and(params->ptypes, params->ptypes, src,
>  				   ICE_FLOW_PTYPE_MAX);
> +		} else if ((hdrs & ICE_FLOW_SEG_HDR_IPV6) &&
> +			   !(hdrs & ICE_FLOW_SEG_HDRS_L4_MASK_NO_OTHER))
> {
> +			src = !i ? (const unsigned long *)ice_ipv6_ofos_no_l4 :
> +				(const unsigned long *)ice_ipv6_il_no_l4;
> +			bitmap_and(params->ptypes, params->ptypes, src,
> +				   ICE_FLOW_PTYPE_MAX);
>  		} else if (hdrs & ICE_FLOW_SEG_HDR_IPV6) {
>  			src = !i ? (const unsigned long *)ice_ptypes_ipv6_ofos :
>  				(const unsigned long *)ice_ptypes_ipv6_il; @@ -
> 1736,7 +1841,7 @@ ice_flow_set_rss_seg_info(struct ice_flow_seg_info *segs,
> u64 hash_fields,
>  	ICE_FLOW_SET_HDRS(segs, flow_hdr);
> 
>  	if (segs->hdrs & ~ICE_FLOW_RSS_SEG_HDR_VAL_MASKS &
> -	    ~ICE_FLOW_RSS_HDRS_INNER_MASK)
> +	    ~ICE_FLOW_RSS_HDRS_INNER_MASK &
> ~ICE_FLOW_SEG_HDR_IPV_OTHER)
>  		return ICE_ERR_PARAM;
> 
>  	val = (u64)(segs->hdrs & ICE_FLOW_RSS_SEG_HDR_L3_MASKS); diff --
> git a/drivers/net/ethernet/intel/ice/ice_flow.h
> b/drivers/net/ethernet/intel/ice/ice_flow.h
> index 04690669dfd7..68d1ec7cf8fd 100644
> --- a/drivers/net/ethernet/intel/ice/ice_flow.h
> +++ b/drivers/net/ethernet/intel/ice/ice_flow.h
> @@ -135,6 +135,10 @@ enum ice_flow_seg_hdr {
>  	ICE_FLOW_SEG_HDR_ESP		= 0x00100000,
>  	ICE_FLOW_SEG_HDR_AH		= 0x00200000,
>  	ICE_FLOW_SEG_HDR_NAT_T_ESP	= 0x00400000,
> +	/* The following is an additive bit for ICE_FLOW_SEG_HDR_IPV4 and
> +	 * ICE_FLOW_SEG_HDR_IPV6 which include the IPV4 other PTYPEs
> +	 */
> +	ICE_FLOW_SEG_HDR_IPV_OTHER	= 0x20000000,
>  };
> 
>  /* These segements all have the same PTYPES, but are otherwise distinguished
> by
> --
> 2.13.6
> 
> _______________________________________________
> Intel-wired-lan mailing list
> Intel-wired-lan at osuosl.org
> https://lists.osuosl.org/mailman/listinfo/intel-wired-lan


More information about the Intel-wired-lan mailing list