@@ -19,6 +19,7 @@ extern "C" {
#include <odp/api/align.h>
#include <odp/api/debug.h>
+#include <odp_debug_internal.h>
#include <odp_buffer_internal.h>
#include <odp_pool_internal.h>
#include <odp_buffer_inlines.h>
@@ -217,7 +218,10 @@ static inline void packet_ref_count_set(odp_packet_hdr_t *pkt_hdr, uint32_t n)
static inline void packet_set_len(odp_packet_hdr_t *pkt_hdr, uint32_t len)
{
+ ODP_ASSERT(packet_ref_count(pkt_hdr) == 1);
+
pkt_hdr->frame_len = len;
+ pkt_hdr->unshared_len = len;
}
static inline int packet_parse_l2_not_done(packet_parser_t *prs)
@@ -138,6 +138,7 @@ static inline void push_head(odp_packet_hdr_t *pkt_hdr, uint32_t len)
{
pkt_hdr->headroom -= len;
pkt_hdr->frame_len += len;
+ pkt_hdr->unshared_len += len;
pkt_hdr->buf_hdr.seg[0].data -= len;
pkt_hdr->buf_hdr.seg[0].len += len;
}
@@ -146,6 +147,7 @@ static inline void pull_head(odp_packet_hdr_t *pkt_hdr, uint32_t len)
{
pkt_hdr->headroom += len;
pkt_hdr->frame_len -= len;
+ pkt_hdr->unshared_len -= len;
pkt_hdr->buf_hdr.seg[0].data += len;
pkt_hdr->buf_hdr.seg[0].len -= len;
}
@@ -156,6 +158,7 @@ static inline void push_tail(odp_packet_hdr_t *pkt_hdr, uint32_t len)
pkt_hdr->tailroom -= len;
pkt_hdr->frame_len += len;
+ pkt_hdr->unshared_len += len;
pkt_hdr->buf_hdr.seg[last].len += len;
}
@@ -163,8 +166,11 @@ static inline void pull_tail(odp_packet_hdr_t *pkt_hdr, uint32_t len)
{
int last = pkt_hdr->buf_hdr.segcount - 1;
+ ODP_ASSERT(packet_ref_count(pkt_hdr) == 1);
+
pkt_hdr->tailroom += len;
pkt_hdr->frame_len -= len;
+ pkt_hdr->unshared_len -= len;
pkt_hdr->buf_hdr.seg[last].len -= len;
}
@@ -192,6 +198,10 @@ static inline void packet_seg_copy_md(odp_packet_hdr_t *dst,
dst->buf_hdr.uarea_addr = src->buf_hdr.uarea_addr;
dst->buf_hdr.uarea_size = src->buf_hdr.uarea_size;
+ /* reference related metadata */
+ dst->ref_len = src->ref_len;
+ dst->unshared_len = src->unshared_len;
+
/* segmentation data is not copied:
* buf_hdr.seg[]
* buf_hdr.segcount
@@ -433,9 +443,10 @@ static inline odp_packet_hdr_t *add_segments(odp_packet_hdr_t *pkt_hdr,
new_hdr->buf_hdr.seg[0].len = seg_len;
packet_seg_copy_md(new_hdr, pkt_hdr);
- new_hdr->frame_len = pkt_hdr->frame_len + len;
- new_hdr->headroom = pool->headroom + offset;
- new_hdr->tailroom = pkt_hdr->tailroom;
+ new_hdr->frame_len = pkt_hdr->frame_len + len;
+ new_hdr->unshared_len = pkt_hdr->unshared_len + len;
+ new_hdr->headroom = pool->headroom + offset;
+ new_hdr->tailroom = pkt_hdr->tailroom;
pkt_hdr = new_hdr;
} else {
@@ -448,8 +459,9 @@ static inline odp_packet_hdr_t *add_segments(odp_packet_hdr_t *pkt_hdr,
last = packet_last_seg(pkt_hdr);
pkt_hdr->buf_hdr.seg[last].len = seg_len;
- pkt_hdr->frame_len += len;
- pkt_hdr->tailroom = pool->tailroom + offset;
+ pkt_hdr->frame_len += len;
+ pkt_hdr->unshared_len += len;
+ pkt_hdr->tailroom = pool->tailroom + offset;
}
return pkt_hdr;
@@ -487,9 +499,10 @@ static inline odp_packet_hdr_t *free_segments(odp_packet_hdr_t *pkt_hdr,
packet_seg_copy_md(new_hdr, pkt_hdr);
/* Tailroom not changed */
- new_hdr->tailroom = pkt_hdr->tailroom;
- new_hdr->headroom = seg_headroom(new_hdr, 0);
- new_hdr->frame_len = pkt_hdr->frame_len - free_len;
+ new_hdr->tailroom = pkt_hdr->tailroom;
+ new_hdr->headroom = seg_headroom(new_hdr, 0);
+ new_hdr->frame_len = pkt_hdr->frame_len - free_len;
+ new_hdr->unshared_len = pkt_hdr->unshared_len - free_len;
pull_head(new_hdr, pull_len);
@@ -504,6 +517,7 @@ static inline odp_packet_hdr_t *free_segments(odp_packet_hdr_t *pkt_hdr,
* of the metadata. */
pkt_hdr->buf_hdr.segcount = num_remain;
pkt_hdr->frame_len -= free_len;
+ pkt_hdr->unshared_len -= free_len;
pkt_hdr->tailroom = seg_tailroom(pkt_hdr, num_remain - 1);
pull_tail(pkt_hdr, pull_len);
@@ -971,6 +985,7 @@ int odp_packet_extend_head(odp_packet_t *pkt, uint32_t len,
pkt_hdr->buf_hdr.segcount = segs;
pkt_hdr->frame_len = frame_len;
+ pkt_hdr->unshared_len = frame_len;
pkt_hdr->headroom = offset + pool->headroom;
pkt_hdr->tailroom = pool->tailroom;
@@ -1012,6 +1027,8 @@ void *odp_packet_pull_head(odp_packet_t pkt, uint32_t len)
if (len > pkt_hdr->frame_len)
return NULL;
+ ODP_ASSERT(len <= pkt_hdr->unshared_len);
+
pull_head(pkt_hdr, len);
return packet_data(pkt_hdr);
}
@@ -1387,6 +1404,8 @@ int odp_packet_add_data(odp_packet_t *pkt_ptr, uint32_t offset, uint32_t len)
if (offset > pktlen)
return -1;
+ ODP_ASSERT(odp_packet_unshared_len(*pkt_ptr) >= offset);
+
newpkt = odp_packet_alloc(pkt_hdr->buf_hdr.pool_hdl, pktlen + len);
if (newpkt == ODP_PACKET_INVALID)
@@ -1506,8 +1525,9 @@ int odp_packet_concat(odp_packet_t *dst, odp_packet_t src)
add_all_segs(dst_hdr, src_hdr);
- dst_hdr->frame_len = dst_len + src_len;
- dst_hdr->tailroom = src_hdr->tailroom;
+ dst_hdr->frame_len = dst_len + src_len;
+ dst_hdr->unshared_len = dst_len + src_len;
+ dst_hdr->tailroom = src_hdr->tailroom;
/* Data was not moved in memory */
return 0;
@@ -1520,6 +1540,7 @@ int odp_packet_split(odp_packet_t *pkt, uint32_t len, odp_packet_t *tail)
if (len >= pktlen || tail == NULL)
return -1;
+ ODP_ASSERT(odp_packet_unshared_len(*pkt) >= len);
*tail = odp_packet_copy_part(*pkt, len, pktlen - len,
odp_packet_pool(*pkt));
@@ -1605,6 +1626,8 @@ int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
if (offset + len > pkt_hdr->frame_len)
return -1;
+ ODP_ASSERT(odp_packet_unshared_len(pkt) >= offset + len);
+
while (len > 0) {
mapaddr = packet_map(pkt_hdr, offset, &seglen, NULL);
cpylen = len > seglen ? seglen : len;
Add code to initialize and maintain unshared_len packet metadata Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org> --- .../linux-generic/include/odp_packet_internal.h | 4 ++ platform/linux-generic/odp_packet.c | 43 +++++++++++++++++----- 2 files changed, 37 insertions(+), 10 deletions(-) -- 2.5.0