rte_mbuf_t * utl_rte_pktmbuf_add_after(rte_mbuf_t *m1,rte_mbuf_t *m2){ utl_rte_pktmbuf_check(m1); utl_rte_pktmbuf_check(m2); rte_mbuf_refcnt_update(m2,1); m1->next=m2; m1->pkt_len += m2->data_len; m1->nb_segs = m2->nb_segs + 1; return (m1); }
void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *md) { rte_mbuf_refcnt_update(md, 1); mi->buf_addr = md->buf_addr; mi->buf_len = md->buf_len; mi->data_off = md->data_off; mi->next = NULL; mi->pkt_len = mi->data_len; mi->nb_segs = 1; }
void rte_pktmbuf_free_seg(rte_mbuf_t *m){ utl_rte_pktmbuf_check(m); uint32_t old=sanb_atomic_dec2zero32(&m->refcnt_reserved); if (old == 1) { struct rte_mbuf *md = RTE_MBUF_FROM_BADDR(m->buf_addr); if ( md != m ) { rte_pktmbuf_detach(m); if (rte_mbuf_refcnt_update(md, -1) == 0) free(md); } free(m); } }
uint16_t rte_mbuf_refcnt_update_export(struct rte_mbuf* m, int16_t value) { return rte_mbuf_refcnt_update(m, value); }