>-----Original Message----- >From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Stephen Hemminger >Sent: Friday, July 10, 2015 1:38 AM >To: dev at dpdk.org >Cc: Mike Davison <mdavison at brocade.com>; Stephen Hemminger ><shemming at brocade.com> >Subject: [dpdk-dev] [PATCH 1/2] mbuf: Add rte_pktmbuf_copy > >From: Stephen Hemminger <shemming at brocade.com> > >Added rte_pktmbuf_copy() function since copying multi-part >segments is common issue and can be problematic. > >Signed-off-by: Mike Davison <mdavison at brocade.com> >Reviewed-by: Stephen Hemminger <shemming at brocade.com> >--- > lib/librte_mbuf/rte_mbuf.h | 59 >++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 59 insertions(+) > >diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h >index 80419df..f0a543b 100644 >--- a/lib/librte_mbuf/rte_mbuf.h >+++ b/lib/librte_mbuf/rte_mbuf.h >@@ -60,6 +60,7 @@ > #include <rte_atomic.h> > #include <rte_prefetch.h> > #include <rte_branch_prediction.h> >+#include <rte_memcpy.h> > > #ifdef __cplusplus > extern "C" { >@@ -1272,6 +1273,64 @@ static inline int rte_pktmbuf_is_contiguous(const >struct rte_mbuf *m) > return !!(m->nb_segs == 1); > } > >+/* >+ * Creates a copy of the given packet mbuf. >+ * >+ * Walks through all segments of the given packet mbuf, and for each of them: >+ * - Creates a new packet mbuf from the given pool. >+ * - Copy segment to newly created mbuf. >+ * Then updates pkt_len and nb_segs of the new packet mbuf to match values >+ * from the original packet mbuf. >+ * >+ * @param md >+ * The packet mbuf to be copied. >+ * @param mp >+ * The mempool from which the mbufs are allocated. >+ * @return >+ * - The pointer to the new mbuf on success. >+ * - NULL if allocation fails. >+ */ >+static inline struct rte_mbuf *rte_pktmbuf_copy(struct rte_mbuf *md, >+ struct rte_mempool *mp) >+{ >+ struct rte_mbuf *mc = NULL; >+ struct rte_mbuf **prev = &mc; >+ >+ do { >+ struct rte_mbuf *mi; >+ >+ mi = rte_pktmbuf_alloc(mp); >+ if (unlikely(mi == NULL)) { >+ rte_pktmbuf_free(mc); >+ return NULL; >+ } >+ >+ mi->data_off = md->data_off; >+ mi->data_len = md->data_len; >+ mi->port = md->port; >+ mi->vlan_tci = md->vlan_tci; >+ mi->tx_offload = md->tx_offload; >+ mi->hash = md->hash; >+ >+ mi->next = NULL; >+ mi->pkt_len = md->pkt_len; >+ mi->nb_segs = md->nb_segs; >+ mi->ol_flags = md->ol_flags; >+ mi->packet_type = md->packet_type; >+ >+ rte_memcpy(rte_pktmbuf_mtod(mi, char *), >+ rte_pktmbuf_mtod(md, char *), >+ md->data_len); >+ >+ *prev = mi; >+ prev = &mi->next; >+ } while ((md = md->next) != NULL); >+ >+ *prev = NULL; >+ __rte_mbuf_sanity_check(mc, 1); >+ return mc; >+} >+ > /** > * Dump an mbuf structure to the console. > * >-- >2.1.4
Hi Stephen :> This patch look useful in case of backup buffs. There will be second approach ?