> +
> +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

Reply via email to