[API-NEXT,v3,12/14] linux-gen: use packet l4 type rather than individual input flags

Message ID 1518008409-31750-13-git-send-email-odpbot@yandex.ru
State New
Headers show
Series
  • Packet L3/L4 type implementation and API extension
Related show

Commit Message

Github ODP bot Feb. 7, 2018, 1 p.m.
From: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>


Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>

---
/** Email created from pull request 457 (lumag:packet-types)
 ** https://github.com/Linaro/odp/pull/457
 ** Patch: https://github.com/Linaro/odp/pull/457.patch
 ** Base sha: e1175d5a69c65bb465022c9f1381c40fdb5c4069
 ** Merge commit sha: 86fcf3650d33f5dd82712dda131fb8ca66a3bdf8
 **/
 .../include/odp/api/plat/packet_inline_types.h     |  7 ----
 .../include/odp_classification_inlines.h           | 15 ++++---
 .../linux-generic/include/odp_packet_internal.h    | 10 +++++
 platform/linux-generic/odp_classification.c        |  8 ++--
 platform/linux-generic/odp_packet.c                | 16 ++-----
 platform/linux-generic/odp_packet_flags.c          | 49 ++++++++++++++++++----
 6 files changed, 68 insertions(+), 37 deletions(-)

Patch

diff --git a/platform/linux-generic/include/odp/api/plat/packet_inline_types.h b/platform/linux-generic/include/odp/api/plat/packet_inline_types.h
index fb54e6402..008a06bff 100644
--- a/platform/linux-generic/include/odp/api/plat/packet_inline_types.h
+++ b/platform/linux-generic/include/odp/api/plat/packet_inline_types.h
@@ -80,14 +80,7 @@  typedef union {
 
 		uint64_t ipsec:1;     /* IPSec packet. Required by the
 					   odp_packet_has_ipsec_set() func. */
-		uint64_t ipsec_ah:1;  /* IPSec authentication header */
-		uint64_t ipsec_esp:1; /* IPSec encapsulating security
-					   payload */
-		uint64_t udp:1;       /* UDP */
-		uint64_t tcp:1;       /* TCP */
 		uint64_t tcpopt:1;    /* TCP options present */
-		uint64_t sctp:1;      /* SCTP */
-		uint64_t icmp:1;      /* ICMP */
 
 		uint64_t color:2;     /* Packet color for traffic mgmt */
 		uint64_t nodrop:1;    /* Drop eligibility status */
diff --git a/platform/linux-generic/include/odp_classification_inlines.h b/platform/linux-generic/include/odp_classification_inlines.h
index f9462e976..4d6472355 100644
--- a/platform/linux-generic/include/odp_classification_inlines.h
+++ b/platform/linux-generic/include/odp_classification_inlines.h
@@ -102,7 +102,8 @@  static inline int verify_pmr_tcp_sport(const uint8_t *pkt_addr,
 {
 	uint16_t sport;
 	const _odp_tcphdr_t *tcp;
-	if (!pkt_hdr->p.input_flags.tcp)
+
+	if (!packet_hdr_has_tcp(pkt_hdr))
 		return 0;
 	tcp = (const _odp_tcphdr_t *)(pkt_addr + pkt_hdr->p.l4_offset);
 	sport = _odp_be_to_cpu_16(tcp->src_port);
@@ -118,7 +119,8 @@  static inline int verify_pmr_tcp_dport(const uint8_t *pkt_addr,
 {
 	uint16_t dport;
 	const _odp_tcphdr_t *tcp;
-	if (!pkt_hdr->p.input_flags.tcp)
+
+	if (!packet_hdr_has_tcp(pkt_hdr))
 		return 0;
 	tcp = (const _odp_tcphdr_t *)(pkt_addr + pkt_hdr->p.l4_offset);
 	dport = _odp_be_to_cpu_16(tcp->dst_port);
@@ -134,7 +136,8 @@  static inline int verify_pmr_udp_dport(const uint8_t *pkt_addr,
 {
 	uint16_t dport;
 	const _odp_udphdr_t *udp;
-	if (!pkt_hdr->p.input_flags.udp)
+
+	if (!packet_hdr_has_udp(pkt_hdr))
 		return 0;
 	udp = (const _odp_udphdr_t *)(pkt_addr + pkt_hdr->p.l4_offset);
 	dport = _odp_be_to_cpu_16(udp->dst_port);
@@ -151,7 +154,7 @@  static inline int verify_pmr_udp_sport(const uint8_t *pkt_addr,
 	uint16_t sport;
 	const _odp_udphdr_t *udp;
 
-	if (!pkt_hdr->p.input_flags.udp)
+	if (!packet_hdr_has_udp(pkt_hdr))
 		return 0;
 	udp = (const _odp_udphdr_t *)(pkt_addr + pkt_hdr->p.l4_offset);
 	sport = _odp_be_to_cpu_16(udp->src_port);
@@ -291,11 +294,11 @@  static inline int verify_pmr_ipsec_spi(const uint8_t *pkt_addr,
 
 	pkt_addr += pkt_hdr->p.l4_offset;
 
-	if (pkt_hdr->p.input_flags.ipsec_ah) {
+	if (pkt_hdr->p.input_flags.l4_type == ODP_PROTO_L4_TYPE_AH) {
 		const _odp_ahhdr_t *ahhdr = (const _odp_ahhdr_t *)pkt_addr;
 
 		spi = _odp_be_to_cpu_32(ahhdr->spi);
-	} else if (pkt_hdr->p.input_flags.ipsec_esp) {
+	} else if (pkt_hdr->p.input_flags.l4_type == ODP_PROTO_L4_TYPE_ESP) {
 		const _odp_esphdr_t *esphdr = (const _odp_esphdr_t *)pkt_addr;
 
 		spi = _odp_be_to_cpu_32(esphdr->spi);
diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h
index 59cb9ded9..9ef11c677 100644
--- a/platform/linux-generic/include/odp_packet_internal.h
+++ b/platform/linux-generic/include/odp_packet_internal.h
@@ -291,6 +291,16 @@  static inline int packet_hdr_has_ipv6(odp_packet_hdr_t *pkt_hdr)
 	return pkt_hdr->p.input_flags.l3_type == ODP_PROTO_L3_TYPE_IPV6;
 }
 
+static inline int packet_hdr_has_tcp(odp_packet_hdr_t *pkt_hdr)
+{
+	return pkt_hdr->p.input_flags.l4_type == ODP_PROTO_L4_TYPE_TCP;
+}
+
+static inline int packet_hdr_has_udp(odp_packet_hdr_t *pkt_hdr)
+{
+	return pkt_hdr->p.input_flags.l4_type == ODP_PROTO_L4_TYPE_UDP;
+}
+
 static inline void packet_set_ts(odp_packet_hdr_t *pkt_hdr, odp_time_t *ts)
 {
 	if (ts != NULL) {
diff --git a/platform/linux-generic/odp_classification.c b/platform/linux-generic/odp_classification.c
index 5147db137..6937ac4b2 100644
--- a/platform/linux-generic/odp_classification.c
+++ b/platform/linux-generic/odp_classification.c
@@ -1036,14 +1036,14 @@  static uint32_t packet_rss_hash(odp_packet_hdr_t *pkt_hdr,
 			tuple_len += 2;
 		}
 
-		if (pkt_hdr->p.input_flags.tcp && hash_proto.tcp) {
+		if (packet_hdr_has_tcp(pkt_hdr) && hash_proto.tcp) {
 			/* add tcp */
 			tcp = (const _odp_tcphdr_t *)(base +
 			       pkt_hdr->p.l4_offset);
 			tuple.v4.sport = tcp->src_port;
 			tuple.v4.dport = tcp->dst_port;
 			tuple_len += 1;
-		} else if (pkt_hdr->p.input_flags.udp && hash_proto.udp) {
+		} else if (packet_hdr_has_udp(pkt_hdr) && hash_proto.udp) {
 			/* add udp */
 			udp = (const _odp_udphdr_t *)(base +
 			       pkt_hdr->p.l4_offset);
@@ -1059,13 +1059,13 @@  static uint32_t packet_rss_hash(odp_packet_hdr_t *pkt_hdr,
 			thash_load_ipv6_addr(ipv6, &tuple);
 			tuple_len += 8;
 		}
-		if (pkt_hdr->p.input_flags.tcp && hash_proto.tcp) {
+		if (packet_hdr_has_tcp(pkt_hdr) && hash_proto.tcp) {
 			tcp = (const _odp_tcphdr_t *)(base +
 			       pkt_hdr->p.l4_offset);
 			tuple.v6.sport = tcp->src_port;
 			tuple.v6.dport = tcp->dst_port;
 			tuple_len += 1;
-		} else if (pkt_hdr->p.input_flags.udp && hash_proto.udp) {
+		} else if (packet_hdr_has_udp(pkt_hdr) && hash_proto.udp) {
 			/* add udp */
 			udp = (const _odp_udphdr_t *)(base +
 			       pkt_hdr->p.l4_offset);
diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c
index 14ed13bca..cc6ab008f 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -2228,10 +2228,11 @@  int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr,
 	/* Parse Layer 4 headers */
 	switch (ip_proto) {
 	case _ODP_IPPROTO_ICMPV4:
-	/* Fall through */
+		/* Do nothing */
+		break;
 
 	case _ODP_IPPROTO_ICMPV6:
-		prs->input_flags.icmp = 1;
+		/* Do nothing */
 		break;
 
 	case _ODP_IPPROTO_IPIP:
@@ -2241,29 +2242,25 @@  int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr,
 	case _ODP_IPPROTO_TCP:
 		if (odp_unlikely(offset + _ODP_TCPHDR_LEN > seg_len))
 			return -1;
-		prs->input_flags.tcp = 1;
 		parse_tcp(prs, &parseptr, NULL);
 		break;
 
 	case _ODP_IPPROTO_UDP:
 		if (odp_unlikely(offset + _ODP_UDPHDR_LEN > seg_len))
 			return -1;
-		prs->input_flags.udp = 1;
 		parse_udp(prs, &parseptr, NULL);
 		break;
 
 	case _ODP_IPPROTO_AH:
 		prs->input_flags.ipsec = 1;
-		prs->input_flags.ipsec_ah = 1;
 		break;
 
 	case _ODP_IPPROTO_ESP:
 		prs->input_flags.ipsec = 1;
-		prs->input_flags.ipsec_esp = 1;
 		break;
 
 	case _ODP_IPPROTO_SCTP:
-		prs->input_flags.sctp = 1;
+		/* Do nothing */
 		break;
 
 	default:
@@ -2573,9 +2570,4 @@  void odp_packet_l4_type_set(odp_packet_t pkt, odp_proto_l4_type_t val)
 	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
 
 	pkt_hdr->p.input_flags.l4_type = val;
-	pkt_hdr->p.input_flags.tcp = (val == ODP_PROTO_L4_TYPE_TCP);
-	pkt_hdr->p.input_flags.udp = (val == ODP_PROTO_L4_TYPE_UDP);
-	pkt_hdr->p.input_flags.sctp = (val == ODP_PROTO_L4_TYPE_SCTP);
-	pkt_hdr->p.input_flags.icmp = (val == ODP_PROTO_L4_TYPE_ICMPV4) ||
-				      (val == ODP_PROTO_L4_TYPE_ICMPV6);
 }
diff --git a/platform/linux-generic/odp_packet_flags.c b/platform/linux-generic/odp_packet_flags.c
index ab34d0950..ce140e600 100644
--- a/platform/linux-generic/odp_packet_flags.c
+++ b/platform/linux-generic/odp_packet_flags.c
@@ -129,22 +129,31 @@  int odp_packet_has_ipsec(odp_packet_t pkt)
 
 int odp_packet_has_udp(odp_packet_t pkt)
 {
-	retflag(pkt, input_flags.udp);
+	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+	return pkt_hdr->p.input_flags.l4_type == ODP_PROTO_L4_TYPE_UDP;
 }
 
 int odp_packet_has_tcp(odp_packet_t pkt)
 {
-	retflag(pkt, input_flags.tcp);
+	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+	return pkt_hdr->p.input_flags.l4_type == ODP_PROTO_L4_TYPE_TCP;
 }
 
 int odp_packet_has_sctp(odp_packet_t pkt)
 {
-	retflag(pkt, input_flags.sctp);
+	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+	return pkt_hdr->p.input_flags.l4_type == ODP_PROTO_L4_TYPE_SCTP;
 }
 
 int odp_packet_has_icmp(odp_packet_t pkt)
 {
-	retflag(pkt, input_flags.icmp);
+	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+	return pkt_hdr->p.input_flags.l4_type == ODP_PROTO_L4_TYPE_ICMPV4 ||
+	       pkt_hdr->p.input_flags.l4_type == ODP_PROTO_L4_TYPE_ICMPV6;
 }
 
 odp_packet_color_t odp_packet_color(odp_packet_t pkt)
@@ -287,22 +296,46 @@  void odp_packet_has_ipsec_set(odp_packet_t pkt, int val)
 
 void odp_packet_has_udp_set(odp_packet_t pkt, int val)
 {
-	setflag(pkt, input_flags.udp, val);
+	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+	if (val)
+		odp_packet_l4_type_set(pkt, ODP_PROTO_L4_TYPE_UDP);
+	else if (pkt_hdr->p.input_flags.l3_type == ODP_PROTO_L4_TYPE_UDP)
+		odp_packet_l4_type_set(pkt, ODP_PROTO_L4_TYPE_NONE);
 }
 
 void odp_packet_has_tcp_set(odp_packet_t pkt, int val)
 {
-	setflag(pkt, input_flags.tcp, val);
+	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+	if (val)
+		odp_packet_l4_type_set(pkt, ODP_PROTO_L4_TYPE_TCP);
+	else if (pkt_hdr->p.input_flags.l3_type == ODP_PROTO_L4_TYPE_TCP)
+		odp_packet_l4_type_set(pkt, ODP_PROTO_L4_TYPE_NONE);
 }
 
 void odp_packet_has_sctp_set(odp_packet_t pkt, int val)
 {
-	setflag(pkt, input_flags.sctp, val);
+	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+	if (val)
+		odp_packet_l4_type_set(pkt, ODP_PROTO_L4_TYPE_SCTP);
+	else if (pkt_hdr->p.input_flags.l3_type == ODP_PROTO_L4_TYPE_SCTP)
+		odp_packet_l4_type_set(pkt, ODP_PROTO_L4_TYPE_NONE);
 }
 
 void odp_packet_has_icmp_set(odp_packet_t pkt, int val)
 {
-	setflag(pkt, input_flags.icmp, val);
+	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+
+	if (val && odp_packet_has_ipv6(pkt))
+		odp_packet_l4_type_set(pkt, ODP_PROTO_L4_TYPE_ICMPV6);
+	else if (val)
+		odp_packet_l4_type_set(pkt, ODP_PROTO_L4_TYPE_ICMPV4);
+	else if (pkt_hdr->p.input_flags.l3_type == ODP_PROTO_L4_TYPE_ICMPV4)
+		odp_packet_l4_type_set(pkt, ODP_PROTO_L4_TYPE_NONE);
+	else if (pkt_hdr->p.input_flags.l3_type == ODP_PROTO_L4_TYPE_ICMPV6)
+		odp_packet_l4_type_set(pkt, ODP_PROTO_L4_TYPE_NONE);
 }
 
 void odp_packet_has_flow_hash_clr(odp_packet_t pkt)