diff mbox series

[10/10] linux-gen: packet: inline flag functions

Message ID 1486384684-14761-11-git-send-email-petri.savolainen@linaro.org
State Superseded
Headers show
Series Packet function inline | expand

Commit Message

Petri Savolainen Feb. 6, 2017, 12:38 p.m. UTC
Added first inlined packet flag functions. Functions are allways used
inlined within the implementation. Applications see inlined
versions only when ABI compatibility is disabled.

Signed-off-by: Petri Savolainen <petri.savolainen@linaro.org>

---
 platform/linux-generic/Makefile.am                 |  2 +
 .../linux-generic/include/odp/api/packet_flags.h   | 11 +--
 .../include/odp/api/plat/packet_flag_inlines.h     | 90 ++++++++++++++++++++++
 .../include/odp/api/plat/packet_flag_inlines_api.h | 41 ++++++++++
 .../include/odp/api/plat/packet_types.h            | 52 +++++++++++++
 .../linux-generic/include/odp_packet_internal.h    | 55 +------------
 platform/linux-generic/odp_packet.c                |  4 +-
 platform/linux-generic/odp_packet_flags.c          | 41 ++--------
 8 files changed, 201 insertions(+), 95 deletions(-)
 create mode 100644 platform/linux-generic/include/odp/api/plat/packet_flag_inlines.h
 create mode 100644 platform/linux-generic/include/odp/api/plat/packet_flag_inlines_api.h

-- 
2.8.1
diff mbox series

Patch

diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am
index 812b22c..335b267 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -78,6 +78,8 @@  odpapiplatinclude_HEADERS = \
 		  $(srcdir)/include/odp/api/plat/crypto_types.h \
 		  $(srcdir)/include/odp/api/plat/event_types.h \
 		  $(srcdir)/include/odp/api/plat/init_types.h \
+		  $(srcdir)/include/odp/api/plat/packet_flag_inlines.h \
+		  $(srcdir)/include/odp/api/plat/packet_flag_inlines_api.h \
 		  $(srcdir)/include/odp/api/plat/packet_inlines.h \
 		  $(srcdir)/include/odp/api/plat/packet_inlines_api.h \
 		  $(srcdir)/include/odp/api/plat/packet_types.h \
diff --git a/platform/linux-generic/include/odp/api/packet_flags.h b/platform/linux-generic/include/odp/api/packet_flags.h
index 467f5b1..1e55af8 100644
--- a/platform/linux-generic/include/odp/api/packet_flags.h
+++ b/platform/linux-generic/include/odp/api/packet_flags.h
@@ -17,13 +17,10 @@ 
 extern "C" {
 #endif
 
-/** @ingroup odp_packet
- *  @{
- */
-
-/**
- * @}
- */
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 0
+#include <odp/api/plat/packet_flag_inlines.h>
+#endif
 
 #include <odp/api/spec/packet_flags.h>
 
diff --git a/platform/linux-generic/include/odp/api/plat/packet_flag_inlines.h b/platform/linux-generic/include/odp/api/plat/packet_flag_inlines.h
new file mode 100644
index 0000000..2de04c8
--- /dev/null
+++ b/platform/linux-generic/include/odp/api/plat/packet_flag_inlines.h
@@ -0,0 +1,90 @@ 
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * Packet inline functions
+ */
+
+#ifndef _ODP_PLAT_PACKET_FLAG_INLINES_H_
+#define _ODP_PLAT_PACKET_FLAG_INLINES_H_
+
+#include <odp/api/plat/packet_types.h>
+#include <odp/api/hints.h>
+
+/** @internal Inline function offsets */
+extern const _odp_packet_inline_offset_t _odp_packet_inline;
+
+/** @internal Inline function @param pkt @return */
+static inline uint64_t _odp_packet_input_flags(odp_packet_t pkt)
+{
+	return *(uint64_t *)(uintptr_t)((uint8_t *)pkt +
+	       _odp_packet_inline.input_flags);
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_has_l2(odp_packet_t pkt)
+{
+	_odp_packet_input_flags_t flags;
+
+	flags.all = _odp_packet_input_flags(pkt);
+	return flags.l2;
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_has_eth(odp_packet_t pkt)
+{
+	_odp_packet_input_flags_t flags;
+
+	flags.all = _odp_packet_input_flags(pkt);
+	return flags.eth;
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_has_jumbo(odp_packet_t pkt)
+{
+	_odp_packet_input_flags_t flags;
+
+	flags.all = _odp_packet_input_flags(pkt);
+	return flags.jumbo;
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_has_flow_hash(odp_packet_t pkt)
+{
+	_odp_packet_input_flags_t flags;
+
+	flags.all = _odp_packet_input_flags(pkt);
+	return flags.flow_hash;
+}
+
+/** @internal Inline function @param pkt @return */
+static inline int _odp_packet_has_ts(odp_packet_t pkt)
+{
+	_odp_packet_input_flags_t flags;
+
+	flags.all = _odp_packet_input_flags(pkt);
+	return flags.timestamp;
+}
+
+/* Include inlined versions of API functions */
+#include <odp/api/plat/static_inline.h>
+#if ODP_ABI_COMPAT == 0
+
+/** @ingroup odp_packet
+ *  @{
+ */
+
+#include <odp/api/plat/packet_flag_inlines_api.h>
+
+/**
+ * @}
+ */
+
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp/api/plat/packet_flag_inlines_api.h b/platform/linux-generic/include/odp/api/plat/packet_flag_inlines_api.h
new file mode 100644
index 0000000..f4e143a
--- /dev/null
+++ b/platform/linux-generic/include/odp/api/plat/packet_flag_inlines_api.h
@@ -0,0 +1,41 @@ 
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * Packet inline functions
+ */
+
+#ifndef _ODP_PLAT_PACKET_FLAG_INLINES_API_H_
+#define _ODP_PLAT_PACKET_FLAG_INLINES_API_H_
+
+_ODP_INLINE int odp_packet_has_l2(odp_packet_t pkt)
+{
+	return _odp_packet_has_l2(pkt);
+}
+
+_ODP_INLINE int odp_packet_has_eth(odp_packet_t pkt)
+{
+	return _odp_packet_has_eth(pkt);
+}
+
+_ODP_INLINE int odp_packet_has_jumbo(odp_packet_t pkt)
+{
+	return _odp_packet_has_jumbo(pkt);
+}
+
+_ODP_INLINE int odp_packet_has_flow_hash(odp_packet_t pkt)
+{
+	return _odp_packet_has_flow_hash(pkt);
+}
+
+_ODP_INLINE int odp_packet_has_ts(odp_packet_t pkt)
+{
+	return _odp_packet_has_ts(pkt);
+}
+
+#endif
diff --git a/platform/linux-generic/include/odp/api/plat/packet_types.h b/platform/linux-generic/include/odp/api/plat/packet_types.h
index a8530bf..b8f665d 100644
--- a/platform/linux-generic/include/odp/api/plat/packet_types.h
+++ b/platform/linux-generic/include/odp/api/plat/packet_types.h
@@ -85,9 +85,61 @@  typedef struct _odp_packet_inline_offset_t {
 	size_t flow_hash;
 	/** @internal field offset */
 	size_t timestamp;
+	/** @internal field offset */
+	size_t input_flags;
 
 } _odp_packet_inline_offset_t;
 
+/** @internal Packet input & protocol flags */
+typedef union {
+	/** All input flags */
+	uint64_t all;
+
+	struct {
+		uint64_t parsed_l2:1; /**< L2 parsed */
+		uint64_t dst_queue:1; /**< Dst queue present */
+
+		uint64_t flow_hash:1; /**< Flow hash present */
+		uint64_t timestamp:1; /**< Timestamp present */
+
+		uint64_t l2:1;        /**< known L2 protocol present */
+		uint64_t l3:1;        /**< known L3 protocol present */
+		uint64_t l4:1;        /**< known L4 protocol present */
+
+		uint64_t eth:1;       /**< Ethernet */
+		uint64_t eth_bcast:1; /**< Ethernet broadcast */
+		uint64_t eth_mcast:1; /**< Ethernet multicast */
+		uint64_t jumbo:1;     /**< Jumbo frame */
+		uint64_t vlan:1;      /**< VLAN hdr found */
+		uint64_t vlan_qinq:1; /**< Stacked VLAN found, QinQ */
+
+		uint64_t snap:1;      /**< SNAP */
+		uint64_t arp:1;       /**< ARP */
+
+		uint64_t ipv4:1;      /**< IPv4 */
+		uint64_t ipv6:1;      /**< IPv6 */
+		uint64_t ip_bcast:1;  /**< IP broadcast */
+		uint64_t ip_mcast:1;  /**< IP multicast */
+		uint64_t ipfrag:1;    /**< IP fragment */
+		uint64_t ipopt:1;     /**< IP optional headers */
+
+		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 */
+	};
+
+} _odp_packet_input_flags_t;
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h
index 9e3b9fe..8fa6b57 100644
--- a/platform/linux-generic/include/odp_packet_internal.h
+++ b/platform/linux-generic/include/odp_packet_internal.h
@@ -26,62 +26,13 @@  extern "C" {
 #include <odp/api/packet_io.h>
 #include <odp/api/crypto.h>
 #include <odp_crypto_internal.h>
+#include <odp/api/plat/packet_types.h>
 
 /** Minimum segment length expected by packet_parse_common() */
 #define PACKET_PARSE_SEG_LEN 96
 
-/**
- * Packet input & protocol flags
- */
-typedef union {
-	/* All input flags */
-	uint64_t all;
-
-	struct {
-		uint64_t parsed_l2:1; /**< L2 parsed */
-		uint64_t dst_queue:1; /**< Dst queue present */
-
-		uint64_t flow_hash:1; /**< Flow hash present */
-		uint64_t timestamp:1; /**< Timestamp present */
-
-		uint64_t l2:1;        /**< known L2 protocol present */
-		uint64_t l3:1;        /**< known L3 protocol present */
-		uint64_t l4:1;        /**< known L4 protocol present */
-
-		uint64_t eth:1;       /**< Ethernet */
-		uint64_t eth_bcast:1; /**< Ethernet broadcast */
-		uint64_t eth_mcast:1; /**< Ethernet multicast */
-		uint64_t jumbo:1;     /**< Jumbo frame */
-		uint64_t vlan:1;      /**< VLAN hdr found */
-		uint64_t vlan_qinq:1; /**< Stacked VLAN found, QinQ */
-
-		uint64_t snap:1;      /**< SNAP */
-		uint64_t arp:1;       /**< ARP */
-
-		uint64_t ipv4:1;      /**< IPv4 */
-		uint64_t ipv6:1;      /**< IPv6 */
-		uint64_t ip_bcast:1;  /**< IP broadcast */
-		uint64_t ip_mcast:1;  /**< IP multicast */
-		uint64_t ipfrag:1;    /**< IP fragment */
-		uint64_t ipopt:1;     /**< IP optional headers */
-
-		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 */
-	};
-} input_flags_t;
 
-ODP_STATIC_ASSERT(sizeof(input_flags_t) == sizeof(uint64_t),
+ODP_STATIC_ASSERT(sizeof(_odp_packet_input_flags_t) == sizeof(uint64_t),
 		  "INPUT_FLAGS_SIZE_ERROR");
 
 /**
@@ -144,7 +95,7 @@  typedef enum {
  * Packet parser metadata
  */
 typedef struct {
-	input_flags_t  input_flags;
+	_odp_packet_input_flags_t  input_flags;
 	error_flags_t  error_flags;
 	output_flags_t output_flags;
 
diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c
index b316ade..3d9f544 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -38,7 +38,9 @@  const _odp_packet_inline_offset_t _odp_packet_inline ODP_ALIGNED_CACHE = {
 	.user_area      = offsetof(odp_packet_hdr_t, buf_hdr.uarea_addr),
 	.user_area_size = offsetof(odp_packet_hdr_t, buf_hdr.uarea_size),
 	.flow_hash      = offsetof(odp_packet_hdr_t, flow_hash),
-	.timestamp      = offsetof(odp_packet_hdr_t, timestamp)
+	.timestamp      = offsetof(odp_packet_hdr_t, timestamp),
+	.input_flags    = offsetof(odp_packet_hdr_t, p.input_flags)
+
 };
 
 static inline odp_packet_hdr_t *packet_hdr(odp_packet_t pkt)
diff --git a/platform/linux-generic/odp_packet_flags.c b/platform/linux-generic/odp_packet_flags.c
index 798fa11..ea9a227 100644
--- a/platform/linux-generic/odp_packet_flags.c
+++ b/platform/linux-generic/odp_packet_flags.c
@@ -4,6 +4,7 @@ 
  * SPDX-License-Identifier:     BSD-3-Clause
  */
 
+#include <odp/api/plat/packet_flag_inlines.h>
 #include <odp/api/packet_flags.h>
 #include <odp_packet_internal.h>
 
@@ -32,13 +33,6 @@  int odp_packet_has_error(odp_packet_t pkt)
 
 /* Get Input Flags */
 
-int odp_packet_has_l2(odp_packet_t pkt)
-{
-	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
-	return pkt_hdr->p.input_flags.l2;
-}
-
 int odp_packet_has_l2_error(odp_packet_t pkt)
 {
 	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
@@ -79,13 +73,6 @@  int odp_packet_has_l4_error(odp_packet_t pkt)
 	return pkt_hdr->p.error_flags.tcp_err | pkt_hdr->p.error_flags.udp_err;
 }
 
-int odp_packet_has_eth(odp_packet_t pkt)
-{
-	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
-	return pkt_hdr->p.input_flags.eth;
-}
-
 int odp_packet_has_eth_bcast(odp_packet_t pkt)
 {
 	retflag(pkt, input_flags.eth_bcast, LAYER_L2);
@@ -96,13 +83,6 @@  int odp_packet_has_eth_mcast(odp_packet_t pkt)
 	retflag(pkt, input_flags.eth_mcast, LAYER_L2);
 }
 
-int odp_packet_has_jumbo(odp_packet_t pkt)
-{
-	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
-	return pkt_hdr->p.input_flags.jumbo;
-}
-
 int odp_packet_has_vlan(odp_packet_t pkt)
 {
 	retflag(pkt, input_flags.vlan, LAYER_L2);
@@ -173,20 +153,6 @@  int odp_packet_has_icmp(odp_packet_t pkt)
 	retflag(pkt, input_flags.icmp, LAYER_L4);
 }
 
-int odp_packet_has_flow_hash(odp_packet_t pkt)
-{
-	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
-	return pkt_hdr->p.input_flags.flow_hash;
-}
-
-int odp_packet_has_ts(odp_packet_t pkt)
-{
-	odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
-
-	return pkt_hdr->p.input_flags.timestamp;
-}
-
 odp_packet_color_t odp_packet_color(odp_packet_t pkt)
 {
 	retflag(pkt, input_flags.color, LAYER_ALL);
@@ -352,3 +318,8 @@  void odp_packet_has_ts_clr(odp_packet_t pkt)
 
 	pkt_hdr->p.input_flags.timestamp = 0;
 }
+
+/* Include non-inlined versions of API functions */
+#if ODP_ABI_COMPAT == 1
+#include <odp/api/plat/packet_flag_inlines_api.h>
+#endif