From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8413845B7C for ; Mon, 28 Oct 2024 15:03:14 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5AEBC400D7; Mon, 28 Oct 2024 15:03:14 +0100 (CET) Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) by mails.dpdk.org (Postfix) with ESMTP id 49743400D7 for ; Mon, 28 Oct 2024 15:03:13 +0100 (CET) Received: by mail-lj1-f174.google.com with SMTP id 38308e7fff4ca-2fb561f273eso38581971fa.2 for ; Mon, 28 Oct 2024 07:03:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=interfacemasters.com; s=google; t=1730124192; x=1730728992; darn=dpdk.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=7IVgtwA/7x6RyOAlCqfNKq8LAixSiXrUrQudO9jJu+Q=; b=LGhg8Yk9PZFn5JSFCERi9k/tTayYlTMtnxR5zyF2ZFTa3qWd6UMtpRFLhducDX9XpY 6FijNssAq3/qRngxpxIhR8Qh1OShMD8r/gztOtujm7rXHmTnt8IHsXiTFXl+4BO5TP3a c7F17A78QWM6/+LTJclYgQGuLwpG9mRDp17As= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1730124192; x=1730728992; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=7IVgtwA/7x6RyOAlCqfNKq8LAixSiXrUrQudO9jJu+Q=; b=a8aFBvxrMdsb5bT237PFDtGqhIXPrSFu21BJQhLsj03ilxNYzkT4E1r7nkPVx1NbR1 No7zQfrZtLXt2c/nERdEk3jLu8+IKZganzF4k+Hf5RkthIr51nl94Daigfdoggc1d+dj pYBaRHjFror5CKpXpW/KqdXpklRpU/fJr1Wuh0dnBqZg26HzHNM7a0UHtR48JPH6IYRd cy+MFsgLgSUuTkoCvMwlj+Jve/tm7tJp8PbTKUfi1ip+NsBkjZu8/dLw/ltOaRfQChID y1g4mkemwzXvUzI5wL3tvoFc/fYxyw23Gf3M2YUfPIGxEL1Iw+HyssggxoCr8kDuzt38 i9cA== X-Gm-Message-State: AOJu0Yy7M8h+3DPRyu5Ho+vxT18T8quRW7AxFYiI6W+0kJcr7KM47EFg sd7M/+g7e//yDT0eaGyrdo2XCRm/PzLYHWKRcnhZ9suhYiCTGbizslFKj8p15tXaBwbjm4m/FZp HW84= X-Google-Smtp-Source: AGHT+IFwsu3r008L5EAjHk7rGFaauJ1VUfnKKYjKVnB80K3rUlzeYvm4kKzcowrqm7TY60uwrslJzQ== X-Received: by 2002:a2e:be1c:0:b0:2fa:cdac:8723 with SMTP id 38308e7fff4ca-2fcbe0505a6mr36758311fa.29.1730124191654; Mon, 28 Oct 2024 07:03:11 -0700 (PDT) Received: from fedora.. ([185.143.144.104]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-2fcb453e34csm11728151fa.70.2024.10.28.07.03.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Oct 2024 07:03:10 -0700 (PDT) From: Oleksandr Nahnybida To: stable@dpdk.org Cc: stephen@networkplumber.org, Oleksandr Nahnybida Subject: [PATCH 22.11] pcapng: fix handling of chained mbufs Date: Mon, 28 Oct 2024 16:00:44 +0200 Message-ID: <20241028140044.278128-1-oleksandrn@interfacemasters.com> X-Mailer: git-send-email 2.47.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org [ 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 --- app/test/test_pcapng.c | 10 +++++++++- lib/pcapng/rte_pcapng.c | 12 ++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/test/test_pcapng.c b/app/test/test_pcapng.c index a7acbdc058..e9c85f2e02 100644 --- a/app/test/test_pcapng.c +++ b/app/test/test_pcapng.c @@ -81,6 +81,14 @@ mbuf1_prepare(struct dummy_mbuf *dm, uint32_t plen) rte_eth_random_addr(pkt.eth.src_addr.addr_bytes); memcpy(rte_pktmbuf_mtod(dm->mb, void *), &pkt, RTE_MIN(sizeof(pkt), plen)); + + /* 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 @@ -138,7 +146,7 @@ test_write_packets(void) for (i = 0; i < NUM_PACKETS; 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_get_tsc_cycles(), 0); if (mc == NULL) { fprintf(stderr, "Cannot copy packet\n"); diff --git a/lib/pcapng/rte_pcapng.c b/lib/pcapng/rte_pcapng.c index d8fd36799b..3f5e08379a 100644 --- a/lib/pcapng/rte_pcapng.c +++ b/lib/pcapng/rte_pcapng.c @@ -454,7 +454,7 @@ rte_pcapng_copy(uint16_t port_id, uint32_t queue, enum rte_pcapng_direction direction) { 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; uint16_t optlen; struct rte_mbuf *mc; @@ -497,8 +497,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); @@ -558,14 +558,14 @@ 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; epb->timestamp_hi = ns >> 32; epb->timestamp_lo = (uint32_t)ns; - epb->capture_length = data_len; + epb->capture_length = pkt_len; epb->original_length = orig_len; /* set trailer of block length */ @@ -594,7 +594,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.47.0