From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pd0-f174.google.com (mail-pd0-f174.google.com [209.85.192.174]) by dpdk.org (Postfix) with ESMTP id 50D6F5A74 for ; Fri, 10 Jul 2015 01:37:40 +0200 (CEST) Received: by pdbep18 with SMTP id ep18so173107328pdb.1 for ; Thu, 09 Jul 2015 16:37:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=FaEfvhlfupNDIsTjLCR7C4aqp50X05jxZ2TS+8E6ZBM=; b=fZ4w+gsNImAv+KO/hFv7+nGxNcSjtHttzpzKbl/kNPm+VlPuVNx9ZTxsNBpAkuqmkf zGeKrVV8Sjl4uezkxet/kKResJQEGHJ4mMbd2pnptrSNJ1nNZL7tUP9T4e6kZRSsFjTO acghf8jh+PB0R5D2kRVCLeNHqTvpU4osCijhEJMnkK5SSjB3NMu3fWMYn26/F18pYYNt cghkUZe9BJ4TLJcN5UAxFjorOvsZ94FENfGwzyF3ud8XMROBq3cu7Fi7LIC9m9F5KX2I BpPv1SgBsrre5UWwCFD13dK8lqVVc+apCAMDfGeka0BGQlpJaEp/qYHv4Y8TF0VdBmA6 lmUw== X-Gm-Message-State: ALoCoQkcouCJJg0ut+wYEeTTLjiZVoxnI6e0PBjlW1K7cLEAMhEZcmVwIEYSR0/fqwZZ3/P1m9bd X-Received: by 10.68.167.66 with SMTP id zm2mr36192589pbb.164.1436485059750; Thu, 09 Jul 2015 16:37:39 -0700 (PDT) Received: from urahara.home.lan (static-50-53-82-155.bvtn.or.frontiernet.net. [50.53.82.155]) by smtp.gmail.com with ESMTPSA id cq5sm7232038pad.11.2015.07.09.16.37.38 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 09 Jul 2015 16:37:39 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Date: Thu, 9 Jul 2015 16:37:47 -0700 Message-Id: <1436485068-30609-2-git-send-email-stephen@networkplumber.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1436485068-30609-1-git-send-email-stephen@networkplumber.org> References: <1436485068-30609-1-git-send-email-stephen@networkplumber.org> Cc: Mike Davison , Stephen Hemminger Subject: [dpdk-dev] [PATCH 1/2] mbuf: Add rte_pktmbuf_copy X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 09 Jul 2015 23:37:40 -0000 From: Stephen Hemminger Added rte_pktmbuf_copy() function since copying multi-part segments is common issue and can be problematic. Signed-off-by: Mike Davison Reviewed-by: Stephen Hemminger --- 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 #include #include +#include #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