> +
> +odp_packet_t odp_packet_add_data(odp_packet_t pkt, uint32_t offset,
> + uint32_t len)
> +{
> + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
> + uint32_t pktlen = pkt_hdr->frame_len;
> + odp_packet_t newpkt;
> +
> + if (offset > pktlen)
> + return ODP_PACKET_INVALID;
> +
> + newpkt = odp_packet_alloc(pkt_hdr->buf_hdr.pool_hdl, pktlen + len);
> +
> + if (newpkt != ODP_PACKET_INVALID) {
> + if (_odp_packet_copy_to_packet(pkt, 0,
> + newpkt, 0, offset) != 0 ||
> + _odp_packet_copy_to_packet(pkt, offset, newpkt,
> + offset + len,
> + pktlen - offset) != 0) {
> + odp_packet_free(newpkt);
> + newpkt = ODP_PACKET_INVALID;
> + } else {
> + odp_packet_hdr_t *new_hdr = odp_packet_hdr(newpkt);
> + new_hdr->buf_hdr.buf_u64 = pkt_hdr->buf_hdr.buf_u64;
> + odp_atomic_store_u32(
> + &new_hdr->buf_hdr.ref_count,
> + odp_atomic_load_u32(
> + &pkt_hdr->buf_hdr.ref_count));
> + _odp_packet_parse(newpkt);
The intention of the call is to modify existing packet and maybe return a new
handle to the same packet. Metadata should be preserved (similar to push/pull
application is responsible to update offsets). There's no need to parse packet
again (== overwrite metadata that app may have modified already).
> + odp_packet_free(pkt);
> + }
> + }
> +
> + return newpkt;
> +}
> +
> +odp_packet_t odp_packet_rem_data(odp_packet_t pkt, uint32_t offset,
> + uint32_t len)
> +{
> + odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
> + uint32_t pktlen = pkt_hdr->frame_len;
> + odp_packet_t newpkt;
> +
> + if (offset > pktlen || offset + len > pktlen)
> + return ODP_PACKET_INVALID;
> +
> + newpkt = odp_packet_alloc(pkt_hdr->buf_hdr.pool_hdl, pktlen - len);
> +
> + if (newpkt != ODP_PACKET_INVALID) {
> + if (_odp_packet_copy_to_packet(pkt, 0,
> + newpkt, 0, offset) != 0 ||
> + _odp_packet_copy_to_packet(pkt, offset + len,
> + newpkt, offset,
> + pktlen - offset - len) != 0) {
> + odp_packet_free(newpkt);
> + newpkt = ODP_PACKET_INVALID;
> + } else {
> + odp_packet_hdr_t *new_hdr = odp_packet_hdr(newpkt);
> + new_hdr->buf_hdr.buf_u64 = pkt_hdr->buf_hdr.buf_u64;
> + odp_atomic_store_u32(
> + &new_hdr->buf_hdr.ref_count,
> + odp_atomic_load_u32(
> + &pkt_hdr->buf_hdr.ref_count));
> + _odp_packet_parse(newpkt);
Same thing.
-Petri
> + odp_packet_free(pkt);
> + }
> + }
> +
> + return newpkt;
> +}
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp