@@ -164,9 +164,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
+ new_buffer = dp_packet_clone_data_with_headroom(dp_packet_data(buffer),
+ size, headroom);
+
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;