[Intel-wired-lan] [PATCH S48 v3 04/14] ice: Add more advanced protocol support in flow filter
Kirsher, Jeffrey T
jeffrey.t.kirsher at intel.com
Fri Jul 3 04:58:45 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 04/14] ice: Add more advanced
> protocol support in flow filter
>
> The patch add more protocol support in flow filter, these include PPPoE,
> L2TPv3, GTP, PFCP, ESP and AH.
>
> Signed-off-by: Ting Xu <ting.xu at intel.com>
> Signed-off-by: Yahui Cao <yahui.cao at intel.com>
> Signed-off-by: Qi Zhang <qi.z.zhang at intel.com>
> ---
> drivers/net/ethernet/intel/ice/ice_flow.c | 272
> ++++++++++++++++++++-
> drivers/net/ethernet/intel/ice/ice_flow.h | 128 +++++++++-
> drivers/net/ethernet/intel/ice/ice_protocol_type.h | 4 +
> 3 files changed, 398 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_flow.c
> b/drivers/net/ethernet/intel/ice/ice_flow.c
> index 0afe3c55eff9..094e1ec82cb6 100644
> --- a/drivers/net/ethernet/intel/ice/ice_flow.c
> +++ b/drivers/net/ethernet/intel/ice/ice_flow.c
> @@ -96,6 +96,37 @@ struct ice_flow_field_info
> ice_flds_info[ICE_FLOW_FIELD_IDX_MAX] = {
> /* ICE_FLOW_FIELD_IDX_GRE_KEYID */
> ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_GRE, 12,
> sizeof_field(struct gre_full_hdr, key)),
> + /* GTP */
> + /* ICE_FLOW_FIELD_IDX_GTPC_TEID */
> + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_GTPC_TEID, 12,
> sizeof(__be32)),
> + /* ICE_FLOW_FIELD_IDX_GTPU_IP_TEID */
> + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_GTPU_IP, 12,
> sizeof(__be32)),
> + /* ICE_FLOW_FIELD_IDX_GTPU_EH_TEID */
> + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_GTPU_EH, 12,
> sizeof(__be32)),
> + /* ICE_FLOW_FIELD_IDX_GTPU_EH_QFI */
> + ICE_FLOW_FLD_INFO_MSK(ICE_FLOW_SEG_HDR_GTPU_EH, 22,
> sizeof(__be16), 0x3f00),
> + /* ICE_FLOW_FIELD_IDX_GTPU_UP_TEID */
> + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_GTPU_UP, 12,
> sizeof(__be32)),
> + /* ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID */
> + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_GTPU_DWN, 12,
> sizeof(__be32)),
> + /* PPPOE */
> + /* ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID */
> + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_PPPOE, 2, sizeof(__be16)),
> + /* PFCP */
> + /* ICE_FLOW_FIELD_IDX_PFCP_SEID */
> + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_PFCP_SESSION, 12,
> sizeof(__be64)),
> + /* L2TPV3 */
> + /* ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID */
> + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_L2TPV3, 0,
> sizeof(__be32)),
> + /* ESP */
> + /* ICE_FLOW_FIELD_IDX_ESP_SPI */
> + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ESP, 0, sizeof(__be32)),
> + /* AH */
> + /* ICE_FLOW_FIELD_IDX_AH_SPI */
> + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_AH, 4, sizeof(__be32)),
> + /* NAT_T_ESP */
> + /* ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI */
> + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_NAT_T_ESP, 8,
> sizeof(__be32)),
> };
>
> /* Bitmaps indicating relevant packet types for a particular protocol header
> @@ -128,6 +159,8 @@ static const u32 ice_ptypes_macvlan_il[] = {
> /* Packet types for packets with an Outer/First/Single IPv4 header */ static
> const u32 ice_ptypes_ipv4_ofos[] = {
> 0x1DC00000, 0x04000800, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000155, 0x00000000, 0x00000000,
> + 0x00000000, 0x000FC000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000, @@ -141,7 +174,7
> @@ static const u32 ice_ptypes_ipv4_ofos[] = { static const u32
> ice_ptypes_ipv4_il[] = {
> 0xE0000000, 0xB807700E, 0x80000003, 0xE01DC03B,
> 0x0000000E, 0x00000000, 0x00000000, 0x00000000,
> - 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x001FF800, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000, @@ -152,6 +185,8
> @@ static const u32 ice_ptypes_ipv4_il[] = {
> /* Packet types for packets with an Outer/First/Single IPv6 header */ static
> const u32 ice_ptypes_ipv6_ofos[] = {
> 0x00000000, 0x00000000, 0x77000000, 0x10002000,
> + 0x00000000, 0x000002AA, 0x00000000, 0x00000000,
> + 0x00000000, 0x03F00000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000, @@ -165,7 +200,7
> @@ static const u32 ice_ptypes_ipv6_ofos[] = { static const u32
> ice_ptypes_ipv6_il[] = {
> 0x00000000, 0x03B80770, 0x000001DC, 0x0EE00000,
> 0x00000770, 0x00000000, 0x00000000, 0x00000000,
> - 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x7FE00000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000, @@ -191,7 +226,7
> @@ static const u32 ice_ptypes_arp_of[] = { static const u32
> ice_ptypes_udp_il[] = {
> 0x81000000, 0x20204040, 0x04000010, 0x80810102,
> 0x00000040, 0x00000000, 0x00000000, 0x00000000,
> - 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00410000, 0x90842000, 0x00000007,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000, @@ -203,7 +238,7
> @@ static const u32 ice_ptypes_udp_il[] = { static const u32
> ice_ptypes_tcp_il[] = {
> 0x04000000, 0x80810102, 0x10000040, 0x02040408,
> 0x00000102, 0x00000000, 0x00000000, 0x00000000,
> - 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00820000, 0x21084000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000, @@ -215,6 +250,7
> @@ static const u32 ice_ptypes_tcp_il[] = { static const u32
> ice_ptypes_sctp_il[] = {
> 0x08000000, 0x01020204, 0x20000081, 0x04080810,
> 0x00000204, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x01040000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> 0x00000000, 0x00000000, 0x00000000, 0x00000000, @@ -270,6
> +306,125 @@ static const u32 ice_ptypes_mac_il[] = {
> 0x00000000, 0x00000000, 0x00000000, 0x00000000, };
>
> +/* Packet types for GTPC */
> +static const u32 ice_ptypes_gtpc[] = {
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000180, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000, };
> +
> +/* Packet types for GTPC with TEID */
> +static const u32 ice_ptypes_gtpc_tid[] = {
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000060, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000, };
> +
> +static const u32 ice_ptypes_gtpu[] = {
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x7FFFFE00, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000, };
> +
> +/* Packet types for pppoe */
> +static const u32 ice_ptypes_pppoe[] = {
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x03ffe000, 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 PFCP NODE header */ static const u32
> +ice_ptypes_pfcp_node[] = {
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x80000000, 0x00000002,
> + 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 PFCP SESSION header */ static const
> +u32 ice_ptypes_pfcp_session[] = {
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000005,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000, };
> +
> +/* Packet types for l2tpv3 */
> +static const u32 ice_ptypes_l2tpv3[] = {
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000300,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000, };
> +
> +/* Packet types for esp */
> +static const u32 ice_ptypes_esp[] = {
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000003, 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 ah */
> +static const u32 ice_ptypes_ah[] = {
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x0000000C, 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 NAT_T ESP header */ static const u32
> +ice_ptypes_nat_t_esp[] = {
> + 0x00000000, 0x00000000, 0x00000000, 0x00000000,
> + 0x00000000, 0x00000030, 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, };
> +
> /* Manage parameters and info. used during the creation of a flow profile */
> struct ice_flow_prof_params {
> enum ice_block blk;
> @@ -286,6 +441,15 @@ struct ice_flow_prof_params {
> DECLARE_BITMAP(ptypes, ICE_FLOW_PTYPE_MAX); };
>
> +#define ICE_FLOW_RSS_HDRS_INNER_MASK \
> + (ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_GTPC | \
> + ICE_FLOW_SEG_HDR_GTPC_TEID | ICE_FLOW_SEG_HDR_GTPU | \
> + ICE_FLOW_SEG_HDR_PFCP_SESSION | ICE_FLOW_SEG_HDR_L2TPV3 |
> \
> + ICE_FLOW_SEG_HDR_ESP | ICE_FLOW_SEG_HDR_AH | \
> + ICE_FLOW_SEG_HDR_NAT_T_ESP)
> +
> +#define ICE_FLOW_SEG_HDRS_L2_MASK \
> + (ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_VLAN)
> #define ICE_FLOW_SEG_HDRS_L3_MASK \
> (ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV6 | \
> ICE_FLOW_SEG_HDR_ARP)
> @@ -420,6 +584,16 @@ ice_flow_proc_seg_hdrs(struct ice_flow_prof_params
> *params)
> ICE_FLOW_PTYPE_MAX);
> }
>
> + if (hdrs & ICE_FLOW_SEG_HDR_PPPOE) {
> + src = (const unsigned long *)ice_ptypes_pppoe;
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + } else {
> + src = (const unsigned long *)ice_ptypes_pppoe;
> + bitmap_andnot(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + }
> +
> if (hdrs & ICE_FLOW_SEG_HDR_UDP) {
> src = (const unsigned long *)ice_ptypes_udp_il;
> bitmap_and(params->ptypes, params->ptypes, src, @@
> -445,6 +619,66 @@ ice_flow_proc_seg_hdrs(struct ice_flow_prof_params
> *params)
> bitmap_and(params->ptypes, params->ptypes,
> src, ICE_FLOW_PTYPE_MAX);
> }
> + } else if (hdrs & ICE_FLOW_SEG_HDR_GTPC) {
> + src = (const unsigned long *)ice_ptypes_gtpc;
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + } else if (hdrs & ICE_FLOW_SEG_HDR_GTPC_TEID) {
> + src = (const unsigned long *)ice_ptypes_gtpc_tid;
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + } else if (hdrs & ICE_FLOW_SEG_HDR_GTPU_DWN) {
> + src = (const unsigned long *)ice_ptypes_gtpu;
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + } else if (hdrs & ICE_FLOW_SEG_HDR_GTPU_UP) {
> + src = (const unsigned long *)ice_ptypes_gtpu;
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + } else if (hdrs & ICE_FLOW_SEG_HDR_GTPU_EH) {
> + src = (const unsigned long *)ice_ptypes_gtpu;
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + } else if (hdrs & ICE_FLOW_SEG_HDR_GTPU_IP) {
> + src = (const unsigned long *)ice_ptypes_gtpu;
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + } else if (hdrs & ICE_FLOW_SEG_HDR_L2TPV3) {
> + src = (const unsigned long *)ice_ptypes_l2tpv3;
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + } else if (hdrs & ICE_FLOW_SEG_HDR_ESP) {
> + src = (const unsigned long *)ice_ptypes_esp;
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + } else if (hdrs & ICE_FLOW_SEG_HDR_AH) {
> + src = (const unsigned long *)ice_ptypes_ah;
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + } else if (hdrs & ICE_FLOW_SEG_HDR_NAT_T_ESP) {
> + src = (const unsigned long *)ice_ptypes_nat_t_esp;
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + }
> +
> + if (hdrs & ICE_FLOW_SEG_HDR_PFCP) {
> + if (hdrs & ICE_FLOW_SEG_HDR_PFCP_NODE)
> + src =
> + (const unsigned long *)ice_ptypes_pfcp_node;
The above 2 lines do not need to be wrapped.
> + else
> + src =
> + (const unsigned long *)ice_ptypes_pfcp_session;
Here as well, no need to wrap
> +
> + bitmap_and(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> + } else {
> + src = (const unsigned long *)ice_ptypes_pfcp_node;
> + bitmap_andnot(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> +
> + src = (const unsigned long *)ice_ptypes_pfcp_session;
> + bitmap_andnot(params->ptypes, params->ptypes, src,
> + ICE_FLOW_PTYPE_MAX);
> }
> }
>
> @@ -553,6 +787,33 @@ ice_flow_xtract_fld(struct ice_hw *hw, struct
> ice_flow_prof_params *params,
> case ICE_FLOW_FIELD_IDX_SCTP_DST_PORT:
> prot_id = ICE_PROT_SCTP_IL;
> break;
> + case ICE_FLOW_FIELD_IDX_GTPC_TEID:
> + case ICE_FLOW_FIELD_IDX_GTPU_IP_TEID:
> + case ICE_FLOW_FIELD_IDX_GTPU_UP_TEID:
> + case ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID:
> + case ICE_FLOW_FIELD_IDX_GTPU_EH_TEID:
> + case ICE_FLOW_FIELD_IDX_GTPU_EH_QFI:
> + /* GTP is accessed through UDP OF protocol */
> + prot_id = ICE_PROT_UDP_OF;
> + break;
> + case ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID:
> + prot_id = ICE_PROT_PPPOE;
> + break;
> + case ICE_FLOW_FIELD_IDX_PFCP_SEID:
> + prot_id = ICE_PROT_UDP_IL_OR_S;
> + break;
> + case ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID:
> + prot_id = ICE_PROT_L2TPV3;
> + break;
> + case ICE_FLOW_FIELD_IDX_ESP_SPI:
> + prot_id = ICE_PROT_ESP_F;
> + break;
> + case ICE_FLOW_FIELD_IDX_AH_SPI:
> + prot_id = ICE_PROT_ESP_2;
> + break;
> + case ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI:
> + prot_id = ICE_PROT_UDP_IL_OR_S;
> + break;
> case ICE_FLOW_FIELD_IDX_ARP_SIP:
> case ICE_FLOW_FIELD_IDX_ARP_DIP:
> case ICE_FLOW_FIELD_IDX_ARP_SHA:
> @@ -1388,7 +1649,8 @@ 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)
> + if (segs->hdrs & ~ICE_FLOW_RSS_SEG_HDR_VAL_MASKS &
> + ~ICE_FLOW_RSS_HDRS_INNER_MASK)
> 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 9eaafd5e50e0..04690669dfd7 100644
> --- a/drivers/net/ethernet/intel/ice/ice_flow.h
> +++ b/drivers/net/ethernet/intel/ice/ice_flow.h
> @@ -30,6 +30,80 @@
> #define ICE_HASH_UDP_IPV4 (ICE_FLOW_HASH_IPV4 |
> ICE_FLOW_HASH_UDP_PORT)
> #define ICE_HASH_UDP_IPV6 (ICE_FLOW_HASH_IPV6 |
> ICE_FLOW_HASH_UDP_PORT)
>
> +#define ICE_FLOW_HASH_GTP_TEID \
> + (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID))
> +
> +#define ICE_FLOW_HASH_GTP_IPV4_TEID \
> + (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_TEID) #define
> +ICE_FLOW_HASH_GTP_IPV6_TEID \
> + (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_TEID)
> +
> +#define ICE_FLOW_HASH_GTP_U_TEID \
> + (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID))
> +
> +#define ICE_FLOW_HASH_GTP_U_IPV4_TEID \
> + (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_TEID) #define
> +ICE_FLOW_HASH_GTP_U_IPV6_TEID \
> + (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_TEID)
> +
> +#define ICE_FLOW_HASH_GTP_U_EH_TEID \
> + (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_TEID))
> +
> +#define ICE_FLOW_HASH_GTP_U_EH_QFI \
> + (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_QFI))
> +
> +#define ICE_FLOW_HASH_GTP_U_IPV4_EH \
> + (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_GTP_U_EH_TEID | \
> + ICE_FLOW_HASH_GTP_U_EH_QFI)
> +#define ICE_FLOW_HASH_GTP_U_IPV6_EH \
> + (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_GTP_U_EH_TEID | \
> + ICE_FLOW_HASH_GTP_U_EH_QFI)
> +
> +#define ICE_FLOW_HASH_PPPOE_SESS_ID \
> + (BIT_ULL(ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID))
> +
> +#define ICE_FLOW_HASH_PPPOE_SESS_ID_ETH \
> + (ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_PPPOE_SESS_ID) #define
> +ICE_FLOW_HASH_PPPOE_TCP_ID \
> + (ICE_FLOW_HASH_TCP_PORT | ICE_FLOW_HASH_PPPOE_SESS_ID)
> #define
> +ICE_FLOW_HASH_PPPOE_UDP_ID \
> + (ICE_FLOW_HASH_UDP_PORT | ICE_FLOW_HASH_PPPOE_SESS_ID)
> +
> +#define ICE_FLOW_HASH_PFCP_SEID \
> + (BIT_ULL(ICE_FLOW_FIELD_IDX_PFCP_SEID))
> +#define ICE_FLOW_HASH_PFCP_IPV4_SEID \
> + (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_PFCP_SEID) #define
> +ICE_FLOW_HASH_PFCP_IPV6_SEID \
> + (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_PFCP_SEID)
> +
> +#define ICE_FLOW_HASH_L2TPV3_SESS_ID \
> + (BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID))
> +#define ICE_FLOW_HASH_L2TPV3_IPV4_SESS_ID \
> + (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_L2TPV3_SESS_ID) #define
> +ICE_FLOW_HASH_L2TPV3_IPV6_SESS_ID \
> + (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_L2TPV3_SESS_ID)
> +
> +#define ICE_FLOW_HASH_ESP_SPI \
> + (BIT_ULL(ICE_FLOW_FIELD_IDX_ESP_SPI))
> +#define ICE_FLOW_HASH_ESP_IPV4_SPI \
> + (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_ESP_SPI) #define
> +ICE_FLOW_HASH_ESP_IPV6_SPI \
> + (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_ESP_SPI)
> +
> +#define ICE_FLOW_HASH_AH_SPI \
> + (BIT_ULL(ICE_FLOW_FIELD_IDX_AH_SPI))
> +#define ICE_FLOW_HASH_AH_IPV4_SPI \
> + (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_AH_SPI) #define
> +ICE_FLOW_HASH_AH_IPV6_SPI \
> + (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_AH_SPI)
> +
> +#define ICE_FLOW_HASH_NAT_T_ESP_SPI \
> + (BIT_ULL(ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI))
> +#define ICE_FLOW_HASH_NAT_T_ESP_IPV4_SPI \
> + (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_NAT_T_ESP_SPI) #define
> +ICE_FLOW_HASH_NAT_T_ESP_IPV6_SPI \
> + (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_NAT_T_ESP_SPI)
> +
> /* Protocol header fields within a packet segment. A segment consists of one
> or
> * more protocol headers that make up a logical group of protocol headers.
> Each
> * logical group of protocol headers encapsulates or is encapsulated using/by
> @@ -48,8 +122,37 @@ enum ice_flow_seg_hdr {
> ICE_FLOW_SEG_HDR_UDP = 0x00000080,
> ICE_FLOW_SEG_HDR_SCTP = 0x00000100,
> ICE_FLOW_SEG_HDR_GRE = 0x00000200,
> + ICE_FLOW_SEG_HDR_GTPC = 0x00000400,
> + ICE_FLOW_SEG_HDR_GTPC_TEID = 0x00000800,
> + ICE_FLOW_SEG_HDR_GTPU_IP = 0x00001000,
> + ICE_FLOW_SEG_HDR_GTPU_EH = 0x00002000,
> + ICE_FLOW_SEG_HDR_GTPU_DWN = 0x00004000,
> + ICE_FLOW_SEG_HDR_GTPU_UP = 0x00008000,
> + ICE_FLOW_SEG_HDR_PPPOE = 0x00010000,
> + ICE_FLOW_SEG_HDR_PFCP_NODE = 0x00020000,
> + ICE_FLOW_SEG_HDR_PFCP_SESSION = 0x00040000,
> + ICE_FLOW_SEG_HDR_L2TPV3 = 0x00080000,
> + ICE_FLOW_SEG_HDR_ESP = 0x00100000,
> + ICE_FLOW_SEG_HDR_AH = 0x00200000,
> + ICE_FLOW_SEG_HDR_NAT_T_ESP = 0x00400000,
> };
>
> +/* These segements all have the same PTYPES, but are otherwise
> +distinguished by
> + * the value of the gtp_eh_pdu and gtp_eh_pdu_link flags:
> + *
> + * gtp_eh_pdu gtp_eh_pdu_link
> + * ICE_FLOW_SEG_HDR_GTPU_IP 0 0
> + * ICE_FLOW_SEG_HDR_GTPU_EH 1 don't care
> + * ICE_FLOW_SEG_HDR_GTPU_DWN 1 0
> + * 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 | \
> + ICE_FLOW_SEG_HDR_PFCP_SESSION)
> +
> enum ice_flow_field {
> /* L2 */
> ICE_FLOW_FIELD_IDX_ETH_DA,
> @@ -87,7 +190,30 @@ enum ice_flow_field {
> ICE_FLOW_FIELD_IDX_ICMP_CODE,
> /* GRE */
> ICE_FLOW_FIELD_IDX_GRE_KEYID,
> - /* The total number of enums must not exceed 64 */
> + /* GTPC_TEID */
> + ICE_FLOW_FIELD_IDX_GTPC_TEID,
> + /* GTPU_IP */
> + ICE_FLOW_FIELD_IDX_GTPU_IP_TEID,
> + /* GTPU_EH */
> + ICE_FLOW_FIELD_IDX_GTPU_EH_TEID,
> + ICE_FLOW_FIELD_IDX_GTPU_EH_QFI,
> + /* GTPU_UP */
> + ICE_FLOW_FIELD_IDX_GTPU_UP_TEID,
> + /* GTPU_DWN */
> + ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID,
> + /* PPPOE */
> + ICE_FLOW_FIELD_IDX_PPPOE_SESS_ID,
> + /* PFCP */
> + ICE_FLOW_FIELD_IDX_PFCP_SEID,
> + /* L2TPV3 */
> + ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID,
> + /* ESP */
> + ICE_FLOW_FIELD_IDX_ESP_SPI,
> + /* AH */
> + ICE_FLOW_FIELD_IDX_AH_SPI,
> + /* NAT_T ESP */
> + ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI,
> + /* The total number of enums must not exceed 64 */
> ICE_FLOW_FIELD_IDX_MAX
> };
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_protocol_type.h
> b/drivers/net/ethernet/intel/ice/ice_protocol_type.h
> index fac5f15a692c..199aa5b71540 100644
> --- a/drivers/net/ethernet/intel/ice/ice_protocol_type.h
> +++ b/drivers/net/ethernet/intel/ice/ice_protocol_type.h
> @@ -24,9 +24,13 @@ enum ice_prot_id {
> ICE_PROT_UDP_OF = 52,
> ICE_PROT_UDP_IL_OR_S = 53,
> ICE_PROT_GRE_OF = 64,
> + ICE_PROT_ESP_F = 88,
> + ICE_PROT_ESP_2 = 89,
> ICE_PROT_SCTP_IL = 96,
> ICE_PROT_ICMP_IL = 98,
> ICE_PROT_ICMPV6_IL = 100,
> + ICE_PROT_PPPOE = 103,
> + ICE_PROT_L2TPV3 = 104,
> ICE_PROT_ARP_OF = 118,
> ICE_PROT_META_ID = 255, /* when offset == metadata */
> ICE_PROT_INVALID = 255 /* when offset == ICE_FV_OFFSET_INVAL
> */
> --
> 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