[ovs-dev] [PATCH 4/5] lib/dp-packet: copy multi-segments data from DPDK mbuf

Kavanagh, Mark B mark.b.kavanagh at intel.com
Wed May 3 15:37:42 UTC 2017


>
>From: Michael Qiu <qiudayu at chinac.com>
>
>When doing packet clone, if packet source is from DPDK driver,
>multi-segment must be considered, and copy the segment's
>data one by one.
>
>Signed-off-by: Michael Qiu <qiudayu at chinac.com>
>---
> lib/dp-packet.c | 27 ++++++++++++++++++++++++---
> 1 file changed, 24 insertions(+), 3 deletions(-)
>
>diff --git a/lib/dp-packet.c b/lib/dp-packet.c
>index 79f6e7e..1093e4a 100644
>--- a/lib/dp-packet.c
>+++ b/lib/dp-packet.c
>@@ -165,9 +165,30 @@ dp_packet_clone_with_headroom(const struct dp_packet *buffer, size_t
>headroom)
> {
>     struct dp_packet *new_buffer;
>
>-    new_buffer = dp_packet_clone_data_with_headroom(dp_packet_data(buffer),
>-                                                 dp_packet_size(buffer),
>-                                                 headroom);
>+    uint32_t size = dp_packet_size(buffer);
>+
>+    /* copy multi-seg data */
>+#ifdef DPDK_NETDEV
>+    if (buffer->source == DPBUF_DPDK && buffer->mbuf.nb_segs > 1) {
>+        uint32_t off_set = 0;
>+        void *dst = NULL;
>+        struct rte_mbuf *tmbuf = CONST_CAST(struct rte_mbuf *, &(buffer->mbuf));
>+
>+        new_buffer = dp_packet_new_with_headroom(size, headroom);
>+        dst = dp_packet_put_uninit(new_buffer, size);
>+
>+        while (tmbuf) {
>+            rte_memcpy((char *)dst + off_set,
>+                       rte_pktmbuf_mtod(tmbuf, void *), tmbuf->data_len);
>+            off_set += tmbuf->data_len;
>+            tmbuf = tmbuf->next;
>+        }
>+    }
>+    else
>+#endif
Shouldn't this be #else, since the buffer has already been cloned for DPDK case?

>+        new_buffer = dp_packet_clone_data_with_headroom(dp_packet_data(buffer),
>+                                                        size, headroom);

Shouldn't this be #endif?
>+
>     new_buffer->l2_pad_size = buffer->l2_pad_size;
>     new_buffer->l2_5_ofs = buffer->l2_5_ofs;
>     new_buffer->l3_ofs = buffer->l3_ofs;
>--
>1.8.3.1



More information about the dev mailing list