net/ice/base: support VXLAN VNI field in flow director

Enable VXLAN VNI field in FDIR.

Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Qiming Yang <qiming.yang@intel.com>
This commit is contained in:
Qi Zhang 2020-12-15 12:10:40 +08:00 committed by Ferruh Yigit
parent 4e4dc21e45
commit 608cd0a5e2
5 changed files with 79 additions and 0 deletions

View File

@ -42,6 +42,21 @@ static const u8 ice_fdir_ipv4_pkt[] = {
0x00, 0x00 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[] = { static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
@ -614,6 +629,11 @@ 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,
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_IPV6_TCP, ICE_FLTR_PTYPE_NONF_IPV6_TCP,
sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt, sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
@ -1102,6 +1122,29 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
input->ip.v4.proto); input->ip.v4.proto);
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
break; 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: case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
input->ip.v4.src_ip); input->ip.v4.src_ip);

View File

@ -55,6 +55,7 @@
#define ICE_IPV6_AH_SPI_OFFSET 58 #define ICE_IPV6_AH_SPI_OFFSET 58
#define ICE_IPV4_NAT_T_ESP_SPI_OFFSET 42 #define ICE_IPV4_NAT_T_ESP_SPI_OFFSET 42
#define ICE_IPV6_NAT_T_ESP_SPI_OFFSET 62 #define ICE_IPV6_NAT_T_ESP_SPI_OFFSET 62
#define ICE_IPV4_VXLAN_VNI_OFFSET 45
#define ICE_FDIR_MAX_FLTRS 16384 #define ICE_FDIR_MAX_FLTRS 16384
@ -163,6 +164,10 @@ struct ice_fdir_l2tpv3 {
__be32 session_id; __be32 session_id;
}; };
struct ice_fdir_udp_vxlan {
__be32 vni; /* 8 bits reserved, always be zero */
};
struct ice_fdir_extra { struct ice_fdir_extra {
u8 dst_mac[ETH_ALEN]; /* dest MAC address */ u8 dst_mac[ETH_ALEN]; /* dest MAC address */
u8 src_mac[ETH_ALEN]; /* src MAC address */ u8 src_mac[ETH_ALEN]; /* src MAC address */
@ -190,6 +195,9 @@ struct ice_fdir_fltr {
struct ice_fdir_extra ext_data_outer; struct ice_fdir_extra ext_data_outer;
struct ice_fdir_extra ext_mask_outer; struct ice_fdir_extra ext_mask_outer;
struct ice_fdir_udp_vxlan vxlan_data;
struct ice_fdir_udp_vxlan vxlan_mask;
struct ice_fdir_udp_gtp gtpu_data; struct ice_fdir_udp_gtp gtpu_data;
struct ice_fdir_udp_gtp gtpu_mask; struct ice_fdir_udp_gtp gtpu_mask;

View File

@ -30,6 +30,7 @@
#define ICE_FLOW_FLD_SZ_ESP_SPI 4 #define ICE_FLOW_FLD_SZ_ESP_SPI 4
#define ICE_FLOW_FLD_SZ_AH_SPI 4 #define ICE_FLOW_FLD_SZ_AH_SPI 4
#define ICE_FLOW_FLD_SZ_NAT_T_ESP_SPI 4 #define ICE_FLOW_FLD_SZ_NAT_T_ESP_SPI 4
#define ICE_FLOW_FLD_SZ_VXLAN_VNI 4
/* Describe properties of a protocol header field */ /* Describe properties of a protocol header field */
struct ice_flow_field_info { struct ice_flow_field_info {
@ -189,6 +190,9 @@ struct ice_flow_field_info ice_flds_info[ICE_FLOW_FIELD_IDX_MAX] = {
/* ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI */ /* ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI */
ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_NAT_T_ESP, 8, ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_NAT_T_ESP, 8,
ICE_FLOW_FLD_SZ_NAT_T_ESP_SPI), ICE_FLOW_FLD_SZ_NAT_T_ESP_SPI),
/* ICE_FLOW_FIELD_IDX_VXLAN_VNI */
ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_VXLAN, 12,
ICE_FLOW_FLD_SZ_VXLAN_VNI),
}; };
/* Bitmaps indicating relevant packet types for a particular protocol header /* Bitmaps indicating relevant packet types for a particular protocol header
@ -456,6 +460,18 @@ static const u32 ice_ptypes_gtpc[] = {
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
}; };
/* Packet types for VXLAN with VNI */
static const u32 ice_ptypes_vxlan_vni[] = {
0x00000000, 0xBFBFF800, 0x00EFDFDF, 0xFEFDE000,
0x03BF7F7E, 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 GTPC with TEID */ /* Packet types for GTPC with TEID */
static const u32 ice_ptypes_gtpc_tid[] = { static const u32 ice_ptypes_gtpc_tid[] = {
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
@ -974,6 +990,10 @@ ice_flow_proc_seg_hdrs(struct ice_flow_prof_params *params)
src = (const ice_bitmap_t *)ice_ptypes_nat_t_esp; src = (const ice_bitmap_t *)ice_ptypes_nat_t_esp;
ice_and_bitmap(params->ptypes, params->ptypes, ice_and_bitmap(params->ptypes, params->ptypes,
src, ICE_FLOW_PTYPE_MAX); src, ICE_FLOW_PTYPE_MAX);
} else if (hdrs & ICE_FLOW_SEG_HDR_VXLAN) {
src = (const ice_bitmap_t *)ice_ptypes_vxlan_vni;
ice_and_bitmap(params->ptypes, params->ptypes,
src, ICE_FLOW_PTYPE_MAX);
} }
if (hdrs & ICE_FLOW_SEG_HDR_PFCP) { if (hdrs & ICE_FLOW_SEG_HDR_PFCP) {
@ -1144,6 +1164,7 @@ ice_flow_xtract_fld(struct ice_hw *hw, struct ice_flow_prof_params *params,
case ICE_FLOW_FIELD_IDX_SCTP_DST_PORT: case ICE_FLOW_FIELD_IDX_SCTP_DST_PORT:
prot_id = ICE_PROT_SCTP_IL; prot_id = ICE_PROT_SCTP_IL;
break; break;
case ICE_FLOW_FIELD_IDX_VXLAN_VNI:
case ICE_FLOW_FIELD_IDX_GTPC_TEID: case ICE_FLOW_FIELD_IDX_GTPC_TEID:
case ICE_FLOW_FIELD_IDX_GTPU_IP_TEID: case ICE_FLOW_FIELD_IDX_GTPU_IP_TEID:
case ICE_FLOW_FIELD_IDX_GTPU_UP_TEID: case ICE_FLOW_FIELD_IDX_GTPU_UP_TEID:

View File

@ -72,6 +72,9 @@
#define ICE_HASH_SCTP_IPV6_PRE64 \ #define ICE_HASH_SCTP_IPV6_PRE64 \
(ICE_FLOW_HASH_IPV6_PRE64 | ICE_FLOW_HASH_SCTP_PORT) (ICE_FLOW_HASH_IPV6_PRE64 | ICE_FLOW_HASH_SCTP_PORT)
#define ICE_FLOW_HASH_VXLAN_VNI \
(BIT_ULL(ICE_FLOW_FIELD_IDX_VXLAN_VNI))
#define ICE_FLOW_HASH_GTP_TEID \ #define ICE_FLOW_HASH_GTP_TEID \
(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID)) (BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID))
@ -179,6 +182,7 @@ enum ice_flow_seg_hdr {
ICE_FLOW_SEG_HDR_NAT_T_ESP = 0x00400000, ICE_FLOW_SEG_HDR_NAT_T_ESP = 0x00400000,
ICE_FLOW_SEG_HDR_ETH_NON_IP = 0x00800000, ICE_FLOW_SEG_HDR_ETH_NON_IP = 0x00800000,
ICE_FLOW_SEG_HDR_GTPU_NON_IP = 0x01000000, ICE_FLOW_SEG_HDR_GTPU_NON_IP = 0x01000000,
ICE_FLOW_SEG_HDR_VXLAN = 0x02000000,
/* The following is an additive bit for ICE_FLOW_SEG_HDR_IPV4 and /* 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_IPV6 which include the IPV4 other PTYPEs
*/ */
@ -267,6 +271,8 @@ enum ice_flow_field {
ICE_FLOW_FIELD_IDX_AH_SPI, ICE_FLOW_FIELD_IDX_AH_SPI,
/* NAT_T ESP */ /* NAT_T ESP */
ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI, ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI,
/* VXLAN VNI */
ICE_FLOW_FIELD_IDX_VXLAN_VNI,
/* The total number of enums must not exceed 64 */ /* The total number of enums must not exceed 64 */
ICE_FLOW_FIELD_IDX_MAX ICE_FLOW_FIELD_IDX_MAX
}; };

View File

@ -329,6 +329,7 @@ enum ice_fltr_ptype {
ICE_FLTR_PTYPE_NONF_IPV6_TCP, ICE_FLTR_PTYPE_NONF_IPV6_TCP,
ICE_FLTR_PTYPE_NONF_IPV6_SCTP, ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
ICE_FLTR_PTYPE_NONF_IPV6_OTHER, ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN,
ICE_FLTR_PTYPE_MAX, ICE_FLTR_PTYPE_MAX,
}; };