net/ice: fix VXLAN flow rule creation error
PATCH 1/1 net/ice: fix VXLAN flow rule creation error
From: Dapeng Yu <[email protected]>
In original implementation, error returned when creating VXLAN flow rule with SCTP or TCP as layer 4 protocol of inner segment.
There are several root causes for the error:
1. ice_fdir_input_set_hdrs() set ICE_FLOW_SEG_HDR_UDP into protocol header flag of inner segment of VXLAN FDIR rule, even if it shall be ICE_FLOW_SEG_HDR_TCP or ICE_FLOW_SEG_HDR_SCTP
2. ice_fdir_udp4_vxlan_pkt[] is not adapted to the TCP and SCTP protocol. Its length cannot hold TCP header, only UDP protocol was supported in original implementation
3. flow type: ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN hides the flow type of inner segment of VXLAN FDIR rule, then further causes function:ice_fdir_get_gen_prgm_pkt() cannot write correct protocol id into inner segment of training packet.
This patch fixes those defects described above.
--- drivers/net/ice/base/ice_fdir.c | 33 ++++++++++++++++++-- drivers/net/ice/base/ice_type.h | 4 +++ drivers/net/ice/ice_fdir_filter.c | 50 +++++++++++++++++++++++++++---- 3 files changed, 79 insertions(+), 8 deletions(-)
drivers/net/ice/base/ice_fdir.c +30 -3
@@ -51,10 +51,11 @@ static const u8 ice_fdir_udp4_vxlan_pkt[] = {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 , +0x45 ,0x00 ,0x00 ,0x28 ,0x00 ,0x00 ,0x40 ,0x00 , +0x40 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , - 0x00, 0x00, 0x00, 0x00, +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , + 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
@@ -1023,6 +1024,26 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {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_IPV4_UDP_VXLAN_IPV4_UDP , +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_IPV4_UDP_VXLAN_IPV4_TCP , +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_IPV4_UDP_VXLAN_IPV4_SCTP , +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_IPV4_UDP_VXLAN_IPV4_OTHER , +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,
@@ -1583,6 +1604,10 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,ice_pkt_insert_mac_addr (loc, input->ext_data.dst_mac);break ;case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN : +case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_UDP : +case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_TCP : +case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_SCTP : +case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_OTHER :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,
@@ -1602,6 +1627,8 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input, 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_u8 (loc,ICE_IPV4_PROTO_OFFSET , + input->ip.v4.proto);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 ;
drivers/net/ice/base/ice_type.h +4 -0
@@ -353,6 +353,10 @@ enum ice_fltr_ptype {ICE_FLTR_PTYPE_NONF_IPV6_SCTP ,ICE_FLTR_PTYPE_NONF_IPV6_OTHER ,ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN , +ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_UDP , +ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_TCP , +ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_SCTP , +ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_OTHER , ICE_FLTR_PTYPE_MAX, };
drivers/net/ice/ice_fdir_filter.c +45 -5
98 lines not on this page · raw message
Signature · 1 line
2.27.0