From: Wei Zhao Date: Tue, 12 Nov 2019 03:21:55 +0000 (+0800) Subject: net/ice/base: fix switch programming for IPv6 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=9ffb871222a802b6ca0b59181e655308ef902d12;p=dpdk.git net/ice/base: fix switch programming for IPv6 Correct an error in the IPV6 header bitmask used for programming switch rules. Also, change other programming switch headers to use big endian fields in order to make setting these easier. Fixes: 04b8ec1ea807 ("net/ice/base: add protocol structures and defines") Cc: stable@dpdk.org Signed-off-by: Dan Nowlin Signed-off-by: Wei Zhao Signed-off-by: Qi Zhang Acked-by: Xiaolong Ye --- diff --git a/drivers/net/ice/base/ice_protocol_type.h b/drivers/net/ice/base/ice_protocol_type.h index 548c9730af..fdcbb2cad3 100644 --- a/drivers/net/ice/base/ice_protocol_type.h +++ b/drivers/net/ice/base/ice_protocol_type.h @@ -155,38 +155,47 @@ struct ice_ether_hdr { }; struct ice_ethtype_hdr { - u16 ethtype_id; + __be16 ethtype_id; }; struct ice_ether_vlan_hdr { u8 dst_addr[ETH_ALEN]; u8 src_addr[ETH_ALEN]; - u32 vlan_id; + __be32 vlan_id; }; struct ice_vlan_hdr { - u16 vlan; - u16 type; + __be16 vlan; + __be16 type; }; struct ice_ipv4_hdr { u8 version; u8 tos; - u16 total_length; - u16 id; - u16 frag_off; + __be16 total_length; + __be16 id; + __be16 frag_off; u8 time_to_live; u8 protocol; - u16 check; - u32 src_addr; - u32 dst_addr; + __be16 check; + __be32 src_addr; + __be32 dst_addr; +}; + +struct ice_le_ver_tc_flow { + union { + struct { + u32 flow_label : 20; + u32 tc : 8; + u32 version : 4; + } fld; + u32 val; + } u; }; struct ice_ipv6_hdr { - u32 version:4; - u32 tc:8; - u32 flow_label:20; - u16 payload_len; + __be32 be_ver_tc_flow; + __be16 payload_len; u8 next_hdr; u8 hop_limit; u8 src_addr[ICE_IPV6_ADDR_LENGTH]; @@ -194,32 +203,32 @@ struct ice_ipv6_hdr { }; struct ice_sctp_hdr { - u16 src_port; - u16 dst_port; - u32 verification_tag; - u32 check; + __be16 src_port; + __be16 dst_port; + __be32 verification_tag; + __be32 check; }; struct ice_l4_hdr { - u16 src_port; - u16 dst_port; - u16 len; - u16 check; + __be16 src_port; + __be16 dst_port; + __be16 len; + __be16 check; }; struct ice_udp_tnl_hdr { - u16 field; - u16 proto_type; - u32 vni; /* only use lower 24-bits */ + __be16 field; + __be16 proto_type; + __be32 vni; /* only use lower 24-bits */ }; #pragma pack(1) struct ice_udp_gtp_hdr { u8 flags; u8 msg_type; - u16 rsrvd_len; - u32 teid; - u16 rsrvd_seq_nbr; + __be16 rsrvd_len; + __be32 teid; + __be16 rsrvd_seq_nbr; u8 rsrvd_n_pdu_nbr; u8 rsrvd_next_ext; u8 rsvrd_ext_len; @@ -230,17 +239,17 @@ struct ice_udp_gtp_hdr { struct ice_pppoe_hdr { u8 rsrvd_ver_type; - u8 rsrved_code; - u16 session_id; - u16 length; - u16 ppp_prot_id; /* control and data only */ + u8 rsrvd_code; + __be16 session_id; + __be16 length; + __be16 ppp_prot_id; /* control and data only */ }; #pragma pack() struct ice_nvgre { - u16 flags; - u16 protocol; - u32 tni_flow; + __be16 flags; + __be16 protocol; + __be32 tni_flow; }; union ice_prot_hdr { diff --git a/drivers/net/ice/base/ice_switch.c b/drivers/net/ice/base/ice_switch.c index 36da27f781..afa4fe30d4 100644 --- a/drivers/net/ice/base/ice_switch.c +++ b/drivers/net/ice/base/ice_switch.c @@ -5789,19 +5789,6 @@ ice_fill_adv_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt, break; case ICE_IPV6_OFOS: case ICE_IPV6_IL: - /* Based on the same mechanism below, if tc (Traffic - * Class) for IPv6 has mask, it means tc field is set. - * Since tc is only one byte, we have to handle the - * big/little endian issue before it can be inserted. - */ - if (lkups[i].m_u.ipv6_hdr.tc) { - ((u16 *)&lkups[i].h_u)[0] = - (((u16 *)&lkups[i].h_u)[0] << 8) | - (((u16 *)&lkups[i].h_u)[0] >> 8); - ((u16 *)&lkups[i].m_u)[0] = - (((u16 *)&lkups[i].m_u)[0] << 8) | - (((u16 *)&lkups[i].m_u)[0] >> 8); - } len = sizeof(struct ice_ipv6_hdr); break; case ICE_TCP_IL: @@ -5896,7 +5883,7 @@ ice_fill_adv_packet_tun(struct ice_hw *hw, enum ice_sw_tunnel_type tun_type, offset = offsets[i].offset; hdr = (struct ice_l4_hdr *)&pkt[offset]; - hdr->dst_port = open_port << 8 | open_port >> 8; + hdr->dst_port = CPU_TO_BE16(open_port); return ICE_SUCCESS; } diff --git a/drivers/net/ice/ice_switch_filter.c b/drivers/net/ice/ice_switch_filter.c index 2406102ce1..4a9356b317 100644 --- a/drivers/net/ice/ice_switch_filter.c +++ b/drivers/net/ice/ice_switch_filter.c @@ -587,11 +587,16 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], (RTE_IPV6_HDR_TC_MASK)) == rte_cpu_to_be_32 (RTE_IPV6_HDR_TC_MASK)) { - f->tc = (rte_be_to_cpu_32 + struct ice_le_ver_tc_flow vtf; + vtf.u.fld.version = 0; + vtf.u.fld.flow_label = 0; + vtf.u.fld.tc = (rte_be_to_cpu_32 (ipv6_spec->hdr.vtc_flow) & RTE_IPV6_HDR_TC_MASK) >> RTE_IPV6_HDR_TC_SHIFT; - s->tc = UINT8_MAX; + f->be_ver_tc_flow = CPU_TO_BE32(vtf.u.val); + vtf.u.fld.tc = UINT8_MAX; + s->be_ver_tc_flow = CPU_TO_BE32(vtf.u.val); } t++; } else if (!ipv6_spec && !ipv6_mask) {