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:
parent
4e4dc21e45
commit
608cd0a5e2
@ -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);
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
};
|
};
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user