@@ -84,6 +84,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;
@@ -106,7 +106,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;
@@ -122,6 +122,19 @@ typedef struct {
uint32_t headroom;
uint32_t tailroom;
+ /* Fields used to support packet references */
+ uint32_t unshared_len;
+ /* Next pkt_hdr in reference chain */
+ struct odp_packet_hdr_t *ref_hdr;
+ /* Offset into next pkt_hdr that ref was created at */
+ uint32_t ref_offset;
+ /* frame_len in next pkt_hdr at time ref was created. This
+ * allows original offset to be maintained when base pkt len
+ * is changed */
+ uint32_t ref_len;
+ /* Incremented on refs, decremented on frees. */
+ odp_atomic_u32_t ref_count;
+
/*
* Members below are not initialized by packet_init()
*/
@@ -33,6 +33,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),