Add new fields to the odp_packet_hdr_t used for support of zero-copy
references. Also added are the offsets needed to access them from
inlined functions.

Signed-off-by: Bill Fischofer <[email protected]>
---
 platform/linux-generic/include/odp/api/plat/packet_types.h | 8 ++++++++
 platform/linux-generic/include/odp_packet_internal.h       | 9 ++++++++-
 platform/linux-generic/odp_packet.c                        | 4 ++++
 3 files changed, 20 insertions(+), 1 deletion(-)

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 b8f665d..16e4b46 100644
--- a/platform/linux-generic/include/odp/api/plat/packet_types.h
+++ b/platform/linux-generic/include/odp/api/plat/packet_types.h
@@ -70,6 +70,14 @@ typedef struct _odp_packet_inline_offset_t {
        /** @internal field offset */
        size_t tailroom;
        /** @internal field offset */
+       size_t unshared_len;
+       /** @internal field offset */
+       size_t ref_hdr;
+       /** @internal field offset */
+       size_t ref_offset;
+       /** *internal field offset */
+       size_t ref_len;
+       /** @internal field offset */
        size_t pool;
        /** @internal field offset */
        size_t input;
diff --git a/platform/linux-generic/include/odp_packet_internal.h 
b/platform/linux-generic/include/odp_packet_internal.h
index 589e204..31d46df 100644
--- a/platform/linux-generic/include/odp_packet_internal.h
+++ b/platform/linux-generic/include/odp_packet_internal.h
@@ -119,7 +119,7 @@ typedef struct {
  * packet_init(). Because of this any new fields added must be reviewed for
  * initialization requirements.
  */
-typedef struct {
+typedef struct odp_packet_hdr_t {
        /* common buffer header */
        odp_buffer_hdr_t buf_hdr;
 
@@ -135,6 +135,13 @@ typedef struct {
        uint32_t headroom;
        uint32_t tailroom;
 
+       /* Fields used to support packet references */
+       uint32_t unshared_len;
+       struct odp_packet_hdr_t *ref_hdr;
+       uint32_t ref_offset;
+       uint32_t ref_len;
+       odp_atomic_u32_t ref_count;
+
        /*
         * Members below are not initialized by packet_init()
         */
diff --git a/platform/linux-generic/odp_packet.c 
b/platform/linux-generic/odp_packet.c
index d0f7633..067d0fc 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -31,6 +31,10 @@ const _odp_packet_inline_offset_t _odp_packet_inline 
ODP_ALIGNED_CACHE = {
        .frame_len      = offsetof(odp_packet_hdr_t, frame_len),
        .headroom       = offsetof(odp_packet_hdr_t, headroom),
        .tailroom       = offsetof(odp_packet_hdr_t, tailroom),
+       .unshared_len   = offsetof(odp_packet_hdr_t, unshared_len),
+       .ref_hdr        = offsetof(odp_packet_hdr_t, ref_hdr),
+       .ref_offset     = offsetof(odp_packet_hdr_t, ref_offset),
+       .ref_len        = offsetof(odp_packet_hdr_t, ref_len),
        .pool           = offsetof(odp_packet_hdr_t, buf_hdr.pool_hdl),
        .input          = offsetof(odp_packet_hdr_t, input),
        .segcount       = offsetof(odp_packet_hdr_t, buf_hdr.segcount),
-- 
2.5.0

Reply via email to