net/ice/base: support RSS IPv6 prefix
[dpdk.git] / drivers / net / ice / base / ice_flow.h
index 326ff6f..6e42571 100644 (file)
@@ -1,11 +1,13 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2001-2019
+ * Copyright(c) 2001-2020 Intel Corporation
  */
 
 #ifndef _ICE_FLOW_H_
 #define _ICE_FLOW_H_
 
 #include "ice_flex_type.h"
+#include "ice_acl.h"
+
 #define ICE_IPV4_MAKE_PREFIX_MASK(prefix) ((u32)(~0) << (32 - (prefix)))
 #define ICE_FLOW_PROF_ID_INVAL         0xfffffffffffffffful
 #define ICE_FLOW_PROF_ID_BYPASS                0
 #define ICE_FLOW_HASH_IPV6     \
        (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | \
         BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA))
+#define ICE_FLOW_HASH_IPV6_PRE32       \
+       (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) | \
+        BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA))
+#define ICE_FLOW_HASH_IPV6_PRE48       \
+       (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) | \
+        BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA))
+#define ICE_FLOW_HASH_IPV6_PRE64       \
+       (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) | \
+        BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA))
 #define ICE_FLOW_HASH_TCP_PORT \
        (BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) | \
         BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT))
 #define ICE_HASH_SCTP_IPV4     (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_SCTP_PORT)
 #define ICE_HASH_SCTP_IPV6     (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_SCTP_PORT)
 
+#define ICE_HASH_TCP_IPV6_PRE32         \
+       (ICE_FLOW_HASH_IPV6_PRE32 | ICE_FLOW_HASH_TCP_PORT)
+#define ICE_HASH_UDP_IPV6_PRE32         \
+       (ICE_FLOW_HASH_IPV6_PRE32 | ICE_FLOW_HASH_UDP_PORT)
+#define ICE_HASH_SCTP_IPV6_PRE32 \
+       (ICE_FLOW_HASH_IPV6_PRE32 | ICE_FLOW_HASH_SCTP_PORT)
+#define ICE_HASH_TCP_IPV6_PRE48         \
+       (ICE_FLOW_HASH_IPV6_PRE48 | ICE_FLOW_HASH_TCP_PORT)
+#define ICE_HASH_UDP_IPV6_PRE48         \
+       (ICE_FLOW_HASH_IPV6_PRE48 | ICE_FLOW_HASH_UDP_PORT)
+#define ICE_HASH_SCTP_IPV6_PRE48 \
+       (ICE_FLOW_HASH_IPV6_PRE48 | ICE_FLOW_HASH_SCTP_PORT)
+#define ICE_HASH_TCP_IPV6_PRE64         \
+       (ICE_FLOW_HASH_IPV6_PRE64 | ICE_FLOW_HASH_TCP_PORT)
+#define ICE_HASH_UDP_IPV6_PRE64         \
+       (ICE_FLOW_HASH_IPV6_PRE64 | ICE_FLOW_HASH_UDP_PORT)
+#define ICE_HASH_SCTP_IPV6_PRE64 \
+       (ICE_FLOW_HASH_IPV6_PRE64 | ICE_FLOW_HASH_SCTP_PORT)
+
 #define ICE_FLOW_HASH_GTP_TEID \
        (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_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_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
@@ -89,9 +167,17 @@ enum ice_flow_seg_hdr {
        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_DWN       = 0x00002000,
-       ICE_FLOW_SEG_HDR_GTPU_UP        = 0x00004000,
-       ICE_FLOW_SEG_HDR_PPPOE          = 0x00008000,
+       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,
+       ICE_FLOW_SEG_HDR_ETH_NON_IP     = 0x00800000,
 };
 
 /* These segements all have the same PTYPES, but are otherwise distinguished by
@@ -99,12 +185,16 @@ enum ice_flow_seg_hdr {
  *
  *                                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 */
@@ -114,13 +204,22 @@ enum ice_flow_field {
        ICE_FLOW_FIELD_IDX_C_VLAN,
        ICE_FLOW_FIELD_IDX_ETH_TYPE,
        /* L3 */
-       ICE_FLOW_FIELD_IDX_IP_DSCP,
-       ICE_FLOW_FIELD_IDX_IP_TTL,
-       ICE_FLOW_FIELD_IDX_IP_PROT,
+       ICE_FLOW_FIELD_IDX_IPV4_DSCP,
+       ICE_FLOW_FIELD_IDX_IPV6_DSCP,
+       ICE_FLOW_FIELD_IDX_IPV4_TTL,
+       ICE_FLOW_FIELD_IDX_IPV4_PROT,
+       ICE_FLOW_FIELD_IDX_IPV6_TTL,
+       ICE_FLOW_FIELD_IDX_IPV6_PROT,
        ICE_FLOW_FIELD_IDX_IPV4_SA,
        ICE_FLOW_FIELD_IDX_IPV4_DA,
        ICE_FLOW_FIELD_IDX_IPV6_SA,
        ICE_FLOW_FIELD_IDX_IPV6_DA,
+       ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA,
+       ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA,
+       ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA,
+       ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA,
+       ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA,
+       ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA,
        /* L4 */
        ICE_FLOW_FIELD_IDX_TCP_SRC_PORT,
        ICE_FLOW_FIELD_IDX_TCP_DST_PORT,
@@ -144,12 +243,25 @@ enum ice_flow_field {
        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
 };
@@ -166,6 +278,7 @@ enum ice_flow_avf_hdr_field {
        ICE_AVF_FLOW_FIELD_IPV4_SCTP,
        ICE_AVF_FLOW_FIELD_IPV4_OTHER,
        ICE_AVF_FLOW_FIELD_FRAG_IPV4,
+       /* Values 37-38 are reserved */
        ICE_AVF_FLOW_FIELD_UNICAST_IPV6_UDP     = 39,
        ICE_AVF_FLOW_FIELD_MULTICAST_IPV6_UDP,
        ICE_AVF_FLOW_FIELD_IPV6_UDP,
@@ -232,6 +345,7 @@ struct ice_flow_seg_xtrct {
        u16 off;        /* Starting offset of the field in header in bytes */
        u8 idx;         /* Index of FV entry used */
        u8 disp;        /* Displacement of field in bits fr. FV entry's start */
+       u16 mask;       /* Mask for field */
 };
 
 enum ice_flow_fld_match_type {
@@ -260,8 +374,8 @@ struct ice_flow_fld_info {
 };
 
 struct ice_flow_seg_fld_raw {
-       int off;        /* Offset from the start of the segment */
        struct ice_flow_fld_info info;
+       u16 off;        /* Offset from the start of the segment */
 };
 
 struct ice_flow_seg_info {
@@ -285,9 +399,14 @@ struct ice_flow_entry {
        struct ice_flow_action *acts;
        /* Flow entry's content */
        void *entry;
+       /* Range buffer (For ACL only) */
+       struct ice_aqc_acl_profile_ranges *range_buf;
        enum ice_flow_priority priority;
        u16 vsi_handle;
        u16 entry_sz;
+       /* Entry index in the ACL's scenario */
+       u16 scen_entry_idx;
+#define ICE_FLOW_ACL_MAX_NUM_ACT       2
        u8 acts_cnt;
 };
 
@@ -313,6 +432,7 @@ struct ice_flow_prof {
 
        union {
                /* struct sw_recipe */
+               struct ice_acl_scen *scen;
                /* struct fd */
                u32 data;
                /* Symmetric Hash for RSS */
@@ -358,6 +478,7 @@ enum ice_flow_action_type {
 struct ice_flow_action {
        enum ice_flow_action_type type;
        union {
+               struct ice_acl_act_entry acl_act;
                u32 dummy;
        } data;
 };
@@ -385,7 +506,8 @@ ice_flow_add_entry(struct ice_hw *hw, enum ice_block blk, u64 prof_id,
                   u64 entry_id, u16 vsi, enum ice_flow_priority prio,
                   void *data, struct ice_flow_action *acts, u8 acts_cnt,
                   u64 *entry_h);
-enum ice_status ice_flow_rem_entry(struct ice_hw *hw, u64 entry_h);
+enum ice_status
+ice_flow_rem_entry(struct ice_hw *hw, enum ice_block blk, u64 entry_h);
 void
 ice_flow_set_fld(struct ice_flow_seg_info *seg, enum ice_flow_field fld,
                 u16 val_loc, u16 mask_loc, u16 last_loc, bool range);