DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] net/ice/base: correct swtch programming IPV6 header bitmask
@ 2019-11-12  3:21 Wei Zhao
  2019-11-13  2:44 ` Ye Xiaolong
  0 siblings, 1 reply; 3+ messages in thread
From: Wei Zhao @ 2019-11-12  3:21 UTC (permalink / raw)
  To: dev; +Cc: xiaolong.ye, Dan Nowlin, Wei Zhao, Qi Zhang

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")

Signed-off-by: Dan Nowlin <dan.nowlin@intel.com>
Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
---
 drivers/net/ice/base/ice_protocol_type.h | 79 ++++++++++++++++++--------------
 drivers/net/ice/base/ice_switch.c        | 15 +-----
 drivers/net/ice/ice_switch_filter.c      |  9 +++-
 3 files changed, 52 insertions(+), 51 deletions(-)

diff --git a/drivers/net/ice/base/ice_protocol_type.h b/drivers/net/ice/base/ice_protocol_type.h
index 548c973..fdcbb2c 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 36da27f..afa4fe3 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 2406102..4a9356b 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) {
-- 
2.7.5


^ permalink raw reply	[flat|nested] 3+ messages in thread
* [dpdk-dev] [PATCH] net/ice/base: correct swtch programming IPV6 header bitmask
@ 2019-11-12  3:14 Wei Zhao
  0 siblings, 0 replies; 3+ messages in thread
From: Wei Zhao @ 2019-11-12  3:14 UTC (permalink / raw)
  To: dev; +Cc: xiaolong.ye, wei zhao, Qi Zhang

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")

Signed-off-by: wei zhao <wei.zhao1@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
---
 drivers/net/ice/base/ice_protocol_type.h | 79 ++++++++++++++++++--------------
 drivers/net/ice/base/ice_switch.c        | 15 +-----
 drivers/net/ice/ice_switch_filter.c      |  9 +++-
 3 files changed, 52 insertions(+), 51 deletions(-)

diff --git a/drivers/net/ice/base/ice_protocol_type.h b/drivers/net/ice/base/ice_protocol_type.h
index 548c973..fdcbb2c 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 36da27f..dfea470 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 2406102..8839f4e 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) {
-- 
2.7.5


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-11-13  2:48 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-12  3:21 [dpdk-dev] [PATCH] net/ice/base: correct swtch programming IPV6 header bitmask Wei Zhao
2019-11-13  2:44 ` Ye Xiaolong
  -- strict thread matches above, loose matches on Subject: below --
2019-11-12  3:14 Wei Zhao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).