patch 'pcapng: fix handling of chained mbufs' has been queued to stable release 23.11.3
Xueming Li
xuemingl at nvidia.com
Mon Nov 11 07:27:17 CET 2024
Hi,
FYI, your patch has been queued to stable release 23.11.3
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 11/30/24. So please
shout if anyone has objections.
Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.
Queued patches are on a temporary branch at:
https://git.dpdk.org/dpdk-stable/log/?h=23.11-staging
This queued commit can be viewed at:
https://git.dpdk.org/dpdk-stable/commit/?h=23.11-staging&id=e989eae1c9a4ec9a7fdf8014a58cdd0a241a836f
Thanks.
Xueming Li <xuemingl at nvidia.com>
---
>From e989eae1c9a4ec9a7fdf8014a58cdd0a241a836f Mon Sep 17 00:00:00 2001
From: Oleksandr Nahnybida <oleksandrn at interfacemasters.com>
Date: Fri, 13 Sep 2024 15:34:03 +0300
Subject: [PATCH] pcapng: fix handling of chained mbufs
Cc: Xueming Li <xuemingl at nvidia.com>
[ upstream commit 6db358536fee7891b5cb670df94ec87543ddd0fb ]
The pcapng generates corrupted files when dealing with chained mbufs.
This issue arises because in rte_pcapng_copy the length of the EPB block
is incorrectly calculated using the data_len of the first mbuf instead
of the pkt_len, despite that rte_pcapng_write_packets correctly writing
the mbuf chain to disk.
This fix ensures that the block length is calculated based on the pkt_len,
aligning it with the actual data written to disk.
Fixes: 8d23ce8f5ee9 ("pcapng: add new library for writing pcapng files")
Signed-off-by: Oleksandr Nahnybida <oleksandrn at interfacemasters.com>
Reviewed-by: Stephen Hemminger <stephen at networkplumber.org>
---
.mailmap | 1 +
app/test/test_pcapng.c | 12 ++++++++++--
lib/pcapng/rte_pcapng.c | 12 ++++++------
3 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/.mailmap b/.mailmap
index 8b9e849d05..4022645615 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1059,6 +1059,7 @@ Odi Assli <odia at nvidia.com>
Ognjen Joldzic <ognjen.joldzic at gmail.com>
Ola Liljedahl <ola.liljedahl at arm.com>
Oleg Polyakov <olegp123 at walla.co.il>
+Oleksandr Nahnybida <oleksandrn at interfacemasters.com>
Olga Shern <olgas at nvidia.com> <olgas at mellanox.com>
Olivier Gournet <ogournet at corp.free.fr>
Olivier Matz <olivier.matz at 6wind.com>
diff --git a/app/test/test_pcapng.c b/app/test/test_pcapng.c
index 89535efad0..5cdde0542a 100644
--- a/app/test/test_pcapng.c
+++ b/app/test/test_pcapng.c
@@ -102,6 +102,14 @@ mbuf1_prepare(struct dummy_mbuf *dm, uint32_t plen)
pkt.udp.dgram_len = rte_cpu_to_be_16(plen);
memcpy(rte_pktmbuf_mtod(dm->mb, void *), &pkt, sizeof(pkt));
+
+ /* Idea here is to create mbuf chain big enough that after mbuf deep copy they won't be
+ * compressed into single mbuf to properly test store of chained mbufs
+ */
+ dummy_mbuf_prep(&dm->mb[1], dm->buf[1], sizeof(dm->buf[1]), pkt_len);
+ dummy_mbuf_prep(&dm->mb[2], dm->buf[2], sizeof(dm->buf[2]), pkt_len);
+ rte_pktmbuf_chain(&dm->mb[0], &dm->mb[1]);
+ rte_pktmbuf_chain(&dm->mb[0], &dm->mb[2]);
}
static int
@@ -117,7 +125,7 @@ test_setup(void)
/* Make a pool for cloned packets */
mp = rte_pktmbuf_pool_create_by_ops("pcapng_test_pool",
- MAX_BURST, 0, 0,
+ MAX_BURST * 32, 0, 0,
rte_pcapng_mbuf_size(pkt_len) + 128,
SOCKET_ID_ANY, "ring_mp_sc");
if (mp == NULL) {
@@ -155,7 +163,7 @@ fill_pcapng_file(rte_pcapng_t *pcapng, unsigned int num_packets)
for (i = 0; i < burst_size; i++) {
struct rte_mbuf *mc;
- mc = rte_pcapng_copy(port_id, 0, orig, mp, pkt_len,
+ mc = rte_pcapng_copy(port_id, 0, orig, mp, rte_pktmbuf_pkt_len(orig),
RTE_PCAPNG_DIRECTION_IN, NULL);
if (mc == NULL) {
fprintf(stderr, "Cannot copy packet\n");
diff --git a/lib/pcapng/rte_pcapng.c b/lib/pcapng/rte_pcapng.c
index 7254defce7..e5326c1d38 100644
--- a/lib/pcapng/rte_pcapng.c
+++ b/lib/pcapng/rte_pcapng.c
@@ -475,7 +475,7 @@ rte_pcapng_copy(uint16_t port_id, uint32_t queue,
const char *comment)
{
struct pcapng_enhance_packet_block *epb;
- uint32_t orig_len, data_len, padding, flags;
+ uint32_t orig_len, pkt_len, padding, flags;
struct pcapng_option *opt;
uint64_t timestamp;
uint16_t optlen;
@@ -516,8 +516,8 @@ rte_pcapng_copy(uint16_t port_id, uint32_t queue,
(md->ol_flags & RTE_MBUF_F_RX_RSS_HASH));
/* pad the packet to 32 bit boundary */
- data_len = rte_pktmbuf_data_len(mc);
- padding = RTE_ALIGN(data_len, sizeof(uint32_t)) - data_len;
+ pkt_len = rte_pktmbuf_pkt_len(mc);
+ padding = RTE_ALIGN(pkt_len, sizeof(uint32_t)) - pkt_len;
if (padding > 0) {
void *tail = rte_pktmbuf_append(mc, padding);
@@ -584,7 +584,7 @@ rte_pcapng_copy(uint16_t port_id, uint32_t queue,
goto fail;
epb->block_type = PCAPNG_ENHANCED_PACKET_BLOCK;
- epb->block_length = rte_pktmbuf_data_len(mc);
+ epb->block_length = rte_pktmbuf_pkt_len(mc);
/* Interface index is filled in later during write */
mc->port = port_id;
@@ -593,7 +593,7 @@ rte_pcapng_copy(uint16_t port_id, uint32_t queue,
timestamp = rte_get_tsc_cycles();
epb->timestamp_hi = timestamp >> 32;
epb->timestamp_lo = (uint32_t)timestamp;
- epb->capture_length = data_len;
+ epb->capture_length = pkt_len;
epb->original_length = orig_len;
/* set trailer of block length */
@@ -623,7 +623,7 @@ rte_pcapng_write_packets(rte_pcapng_t *self,
/* sanity check that is really a pcapng mbuf */
epb = rte_pktmbuf_mtod(m, struct pcapng_enhance_packet_block *);
if (unlikely(epb->block_type != PCAPNG_ENHANCED_PACKET_BLOCK ||
- epb->block_length != rte_pktmbuf_data_len(m))) {
+ epb->block_length != rte_pktmbuf_pkt_len(m))) {
rte_errno = EINVAL;
return -1;
}
--
2.34.1
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2024-11-11 14:23:06.730371307 +0800
+++ 0031-pcapng-fix-handling-of-chained-mbufs.patch 2024-11-11 14:23:05.072192841 +0800
@@ -1 +1 @@
-From 6db358536fee7891b5cb670df94ec87543ddd0fb Mon Sep 17 00:00:00 2001
+From e989eae1c9a4ec9a7fdf8014a58cdd0a241a836f Mon Sep 17 00:00:00 2001
@@ -4,0 +5,3 @@
+Cc: Xueming Li <xuemingl at nvidia.com>
+
+[ upstream commit 6db358536fee7891b5cb670df94ec87543ddd0fb ]
@@ -16 +18,0 @@
-Cc: stable at dpdk.org
@@ -27 +29 @@
-index 62ef194168..aee7c91780 100644
+index 8b9e849d05..4022645615 100644
@@ -30 +32,2 @@
-@@ -1091,6 +1091,7 @@ Ognjen Joldzic <ognjen.joldzic at gmail.com>
+@@ -1059,6 +1059,7 @@ Odi Assli <odia at nvidia.com>
+ Ognjen Joldzic <ognjen.joldzic at gmail.com>
@@ -33 +35,0 @@
- Oleksandr Kolomeiets <okl-plv at napatech.com>
@@ -39 +41 @@
-index 2665b08c76..b219873c3a 100644
+index 89535efad0..5cdde0542a 100644
More information about the stable
mailing list