net/ice/base: refactor structure field
[dpdk.git] / drivers / net / ice / base / ice_fdir.c
index aea388f..aa34075 100644 (file)
@@ -42,6 +42,21 @@ static const u8 ice_fdir_ipv4_pkt[] = {
        0x00, 0x00
 };
 
+static const u8 ice_fdir_udp4_vxlan_pkt[] = {
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+       0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
+       0x00, 0x00, 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,
+};
+
 static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
@@ -290,6 +305,23 @@ static const u8 ice_fdir_non_ip_l2_pkt[] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 };
 
+static const u8 ice_fdir_ecpri_tp0_pkt[] = {
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0xAE, 0xFE, 0x10, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       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,
@@ -614,6 +646,23 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
                sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
                sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
        },
+       {
+               ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN,
+               sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
+               sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
+       },
+       {
+               ICE_FLTR_PTYPE_NONF_ECPRI_TP0,
+               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,
@@ -965,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
@@ -1026,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,
@@ -1057,6 +1137,14 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
                        loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
                break;
        case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
+               ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
+               ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
+                                       input->ext_data_outer.src_mac);
+               ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
+                                  input->ip_outer.v4.dst_ip);
+               ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
+                                  input->ip_outer.v4.src_ip);
+               ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
                                   input->ip.v4.src_ip);
                ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
@@ -1094,6 +1182,29 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
                                  input->ip.v4.proto);
                ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
                break;
+       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
+               ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
+               ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac);
+               ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
+                                  input->ip_outer.v4.dst_ip);
+               ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
+                                  input->ip_outer.v4.src_ip);
+               ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
+               ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
+                                  input->vxlan_data.vni);
+               ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
+                                  input->ip.v4.src_ip);
+               ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
+                                  input->ip.v4.src_port);
+               ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
+                                  input->ip.v4.dst_ip);
+               ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
+                                  input->ip.v4.dst_port);
+               ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+               ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
+               ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
+               ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
+               break;
        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
                                   input->ip.v4.src_ip);
@@ -1187,6 +1298,15 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
                ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
                                   input->ext_data.ether_type);
                break;
+       case ICE_FLTR_PTYPE_NONF_ECPRI_TP0:
+               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);