net/ice/base: support eCPRI over UDP type 0 flow
authorQi Zhang <qi.z.zhang@intel.com>
Tue, 15 Dec 2020 05:25:04 +0000 (13:25 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 8 Jan 2021 15:03:06 +0000 (16:03 +0100)
This patch adds extracting field for flow type eCPRI over UDP message
type 0 and field PC_ID which is used for FDIR/RSS packet steering.

Signed-off-by: Yahui Cao <yahui.cao@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Qiming Yang <qiming.yang@intel.com>
drivers/net/ice/base/ice_fdir.c
drivers/net/ice/base/ice_fdir.h
drivers/net/ice/base/ice_flex_pipe.c
drivers/net/ice/base/ice_flex_type.h
drivers/net/ice/base/ice_flow.c
drivers/net/ice/base/ice_flow.h
drivers/net/ice/base/ice_type.h

index 98369b1..aa34075 100644 (file)
@@ -312,6 +312,16 @@ static const u8 ice_fdir_ecpri_tp0_pkt[] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
+static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+       0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
 static const u8 ice_fdir_tcpv6_pkt[] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
@@ -646,6 +656,13 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
                sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
                sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
        },
+       {
+               ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0,
+               sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
+               ice_fdir_ipv4_udp_ecpri_tp0_pkt,
+               sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
+               ice_fdir_ipv4_udp_ecpri_tp0_pkt,
+       },
        {
                ICE_FLTR_PTYPE_NONF_IPV6_TCP,
                sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
@@ -997,6 +1014,33 @@ static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
        ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
 }
 
+/**
+ * ice_fdir_get_open_tunnel_port
+ * @hw: pointer to the hardware structure
+ * @flow: flow ptype
+ * @port: returns open port
+ *
+ * returns an open tunnel port specified for this flow type
+ */
+static enum ice_status
+ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow,
+                             u16 *port)
+{
+       switch (flow) {
+       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
+               /* eCPRI tunnel */
+               if (!ice_get_open_tunnel_port(hw, TNL_ECPRI, port))
+                       return ICE_ERR_DOES_NOT_EXIST;
+               break;
+       default:
+               if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, port) &&
+                   !ice_get_open_tunnel_port(hw, TNL_GENEVE, port))
+                       return ICE_ERR_DOES_NOT_EXIST;
+       }
+
+       return ICE_SUCCESS;
+}
+
 /**
  * ice_fdir_get_gen_prgm_pkt - generate a training packet
  * @hw: pointer to the hardware structure
@@ -1058,8 +1102,12 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
                           ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
                loc = pkt;
        } else {
-               if (!ice_get_open_tunnel_port(hw, TNL_ALL, &tnl_port))
-                       return ICE_ERR_DOES_NOT_EXIST;
+               enum ice_status ret;
+
+               ret = ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port);
+               if (ret)
+                       return ret;
+
                if (!ice_fdir_pkt[idx].tun_pkt)
                        return ICE_ERR_PARAM;
                ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
@@ -1254,6 +1302,11 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
                ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET,
                                   input->ecpri_data.pc_id);
                break;
+       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
+               /* Use pkt instead of loc, since PC_ID is in outer part */
+               ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET,
+                                  input->ecpri_data.pc_id);
+               break;
        case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
                                         input->ip.v6.src_ip);
index a0ec519..e138639 100644 (file)
@@ -57,6 +57,7 @@
 #define ICE_IPV6_NAT_T_ESP_SPI_OFFSET  62
 #define ICE_IPV4_VXLAN_VNI_OFFSET      45
 #define ICE_ECPRI_TP0_PC_ID_OFFSET     18
+#define ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET                    46
 
 #define ICE_FDIR_MAX_FLTRS             16384
 
index e511b50..96aed3b 100644 (file)
@@ -13,6 +13,7 @@
 static const struct ice_tunnel_type_scan tnls[] = {
        { TNL_VXLAN,            "TNL_VXLAN_PF" },
        { TNL_GENEVE,           "TNL_GENEVE_PF" },
+       { TNL_ECPRI,            "TNL_UDP_ECPRI_PF" },
        { TNL_LAST,             "" }
 };
 
index 08db7f2..62cc81b 100644 (file)
@@ -516,6 +516,7 @@ struct ice_pkg_enum {
 enum ice_tunnel_type {
        TNL_VXLAN = 0,
        TNL_GENEVE,
+       TNL_ECPRI,
        TNL_GTP,
        TNL_LAST = 0xFF,
        TNL_ALL = 0xFF,
index eebb328..15b4306 100644 (file)
@@ -198,6 +198,10 @@ struct ice_flow_field_info ice_flds_info[ICE_FLOW_FIELD_IDX_MAX] = {
        /* ICE_FLOW_FIELD_IDX_ECPRI_TP0_PC_ID */
        ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ECPRI_TP0, 4,
                          ICE_FLOW_FLD_SZ_ECPRI_TP0_PC_ID),
+       /* UDP_ECPRI_TP0 */
+       /* ICE_FLOW_FIELD_IDX_UDP_ECPRI_TP0_PC_ID */
+       ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_UDP_ECPRI_TP0, 12,
+                         ICE_FLOW_FLD_SZ_ECPRI_TP0_PC_ID),
 };
 
 /* Bitmaps indicating relevant packet types for a particular protocol header
@@ -207,7 +211,7 @@ struct ice_flow_field_info ice_flds_info[ICE_FLOW_FIELD_IDX_MAX] = {
 static const u32 ice_ptypes_mac_ofos[] = {
        0xFDC00846, 0xBFBF7F7E, 0xF70001DF, 0xFEFDFDFB,
        0x0000077E, 0x000003FF, 0x00000000, 0x00000000,
-       0x00400000, 0x03FFF000, 0xFFFFFFE0, 0x00000707,
+       0x00400000, 0x03FFF000, 0xFFFFFFE0, 0x00100707,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
@@ -233,7 +237,7 @@ static const u32 ice_ptypes_macvlan_il[] = {
 static const u32 ice_ptypes_ipv4_ofos[] = {
        0x1DC00000, 0x24000800, 0x00000000, 0x00000000,
        0x00000000, 0x00000155, 0x00000000, 0x00000000,
-       0x00000000, 0x000FC000, 0x000002A0, 0x00000000,
+       0x00000000, 0x000FC000, 0x000002A0, 0x00100000,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
@@ -259,7 +263,7 @@ static const u32 ice_ptypes_ipv4_ofos_all[] = {
 static const u32 ice_ptypes_ipv4_il[] = {
        0xE0000000, 0xB807700E, 0x80000003, 0xE01DC03B,
        0x0000000E, 0x00000000, 0x00000000, 0x00000000,
-       0x00000000, 0x00000000, 0x001FF800, 0x00000000,
+       0x00000000, 0x00000000, 0x001FF800, 0x00100000,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
@@ -373,7 +377,7 @@ static const u32 ice_ptypes_arp_of[] = {
 static const u32 ice_ptypes_udp_il[] = {
        0x81000000, 0x20204040, 0x04000010, 0x80810102,
        0x00000040, 0x00000000, 0x00000000, 0x00000000,
-       0x00000000, 0x00410000, 0x908427E0, 0x00000007,
+       0x00000000, 0x00410000, 0x908427E0, 0x00100007,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
@@ -710,6 +714,17 @@ static const u32 ice_ptypes_ecpri_tp0[] = {
        0x00000000, 0x00000000, 0x00000000, 0x00000000,
 };
 
+static const u32 ice_ptypes_udp_ecpri_tp0[] = {
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00100000,
+       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;
@@ -735,7 +750,7 @@ struct ice_flow_prof_params {
        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 | ICE_FLOW_SEG_HDR_GTPU_NON_IP | \
-       ICE_FLOW_SEG_HDR_ECPRI_TP0)
+       ICE_FLOW_SEG_HDR_ECPRI_TP0 | ICE_FLOW_SEG_HDR_UDP_ECPRI_TP0)
 
 #define ICE_FLOW_SEG_HDRS_L2_MASK      \
        (ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_VLAN)
@@ -1011,6 +1026,10 @@ ice_flow_proc_seg_hdrs(struct ice_flow_prof_params *params)
                        src = (const ice_bitmap_t *)ice_ptypes_vxlan_vni;
                        ice_and_bitmap(params->ptypes, params->ptypes,
                                       src, ICE_FLOW_PTYPE_MAX);
+               } else if (hdrs & ICE_FLOW_SEG_HDR_UDP_ECPRI_TP0) {
+                       src = (const ice_bitmap_t *)ice_ptypes_udp_ecpri_tp0;
+                       ice_and_bitmap(params->ptypes, params->ptypes,
+                                      src, ICE_FLOW_PTYPE_MAX);
                }
 
                if (hdrs & ICE_FLOW_SEG_HDR_PFCP) {
@@ -1212,6 +1231,9 @@ ice_flow_xtract_fld(struct ice_hw *hw, struct ice_flow_prof_params *params,
        case ICE_FLOW_FIELD_IDX_ECPRI_TP0_PC_ID:
                prot_id = ICE_PROT_ECPRI;
                break;
+       case ICE_FLOW_FIELD_IDX_UDP_ECPRI_TP0_PC_ID:
+               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:
index eb63f67..6d02252 100644 (file)
@@ -184,6 +184,7 @@ enum ice_flow_seg_hdr {
        ICE_FLOW_SEG_HDR_GTPU_NON_IP    = 0x01000000,
        ICE_FLOW_SEG_HDR_VXLAN          = 0x02000000,
        ICE_FLOW_SEG_HDR_ECPRI_TP0      = 0x04000000,
+       ICE_FLOW_SEG_HDR_UDP_ECPRI_TP0  = 0x08000000,
        /* The following is an additive bit for ICE_FLOW_SEG_HDR_IPV4 and
         * ICE_FLOW_SEG_HDR_IPV6 which include the IPV4 other PTYPEs
         */
@@ -276,6 +277,8 @@ enum ice_flow_field {
        ICE_FLOW_FIELD_IDX_VXLAN_VNI,
        /* ECPRI_TP0 */
        ICE_FLOW_FIELD_IDX_ECPRI_TP0_PC_ID,
+       /* UDP_ECPRI_TP0 */
+       ICE_FLOW_FIELD_IDX_UDP_ECPRI_TP0_PC_ID,
         /* The total number of enums must not exceed 64 */
        ICE_FLOW_FIELD_IDX_MAX
 };
index 4321916..bb2cfd0 100644 (file)
@@ -325,6 +325,7 @@ enum ice_fltr_ptype {
        ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
        ICE_FLTR_PTYPE_NON_IP_L2,
        ICE_FLTR_PTYPE_NONF_ECPRI_TP0,
+       ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0,
        ICE_FLTR_PTYPE_FRAG_IPV4,
        ICE_FLTR_PTYPE_NONF_IPV6_UDP,
        ICE_FLTR_PTYPE_NONF_IPV6_TCP,