From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gandalf.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 2A3885A0281 for ; Thu, 22 Feb 2024 06:56:13 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202312; t=1708581366; bh=y5WvUOT7/H8QS9SGRa4XujE5BcjKAhxlEgktKvTs+IM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=n7ireYCruCD8ER2TkMYpRJFmT1Lknl0gHUhhUekaFBGo964CNeHmKlF2q1b9apHMj A7BXyLPmfL8GZMLLs+KysddtSPvKewJ6mCVr3xTzU6MklT9IB+1hLHjEucF9jiAlKT CuL5V0qli43X9HGUed0enCkHmDPuaW/YkU5BEaB322VTbrw8PcmMtuEvD4IR1k3UqC p14P62vpkhXAlFgSuQNG2+zh5A/H8wnpnR0tgafAmboXkCqVyNmF88JzVL/4Aktgxc z3LM3z6qGuuNHzIwWw/fHxyfmVrYpYPAoWwA+RgIXhNaX9DUJb7A8sqZdgakp4esee zNwciLgx7D8cQ== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4TgMny345Tz4wxX; Thu, 22 Feb 2024 16:56:06 +1100 (AEDT) From: David Gibson To: passt-dev@passt.top, Stefano Brivio , Laurent Vivier Subject: [PATCH 5/6] pcap: Allow pcap_frame() and pcap_multiple() to take multi-buffer frames Date: Thu, 22 Feb 2024 16:56:01 +1100 Message-ID: <20240222055602.1872516-6-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.43.2 In-Reply-To: <20240222055602.1872516-1-david@gibson.dropbear.id.au> References: <20240222055602.1872516-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: EPP7NDDUUCBFZBBEGW6WTLYR2KBQ4XH6 X-Message-ID-Hash: EPP7NDDUUCBFZBBEGW6WTLYR2KBQ4XH6 X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: David Gibson X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: pcap_frame() explicitly takes a single frame, and only allows a single buffer (iovec) to be passed. pcap_multiple() takes multiple buffers, but explicitly expects exactly one frame per buffer. Future changes are going to want to split single frames across multiple buffers in some circumstances, so extend the pcap functions to allow for that. Signed-off-by: David Gibson --- pcap.c | 24 ++++++++++++++---------- pcap.h | 3 ++- tap.c | 2 +- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/pcap.c b/pcap.c index eeb71a3c..9eb4f3d2 100644 --- a/pcap.c +++ b/pcap.c @@ -31,6 +31,7 @@ #include "util.h" #include "passt.h" #include "log.h" +#include "pcap.h" #define PCAP_VERSION_MINOR 4 @@ -67,14 +68,15 @@ struct pcap_pkthdr { /** * pcap_frame() - Capture a single frame to pcap file with given timestamp - * @iov: iovec referencing buffer containing frame (with L2 headers) - * @offset: Offset of the frame from @iov->iov_base + * @iov: IO vector containing frame (with L2 headers and tap headers) + * @iovcnt: Number of buffers (@iov entries) in frame + * @offset: Byte offset of the L2 headers within @iov * @tv: Timestamp * * Returns: 0 on success, -errno on error writing to the file */ -static void pcap_frame(const struct iovec *iov, size_t offset, - const struct timeval *tv) +static void pcap_frame(const struct iovec *iov, size_t iovcnt, + size_t offset, const struct timeval *tv) { size_t len = iov->iov_len - offset; struct pcap_pkthdr h = { @@ -86,7 +88,7 @@ static void pcap_frame(const struct iovec *iov, size_t offset, struct iovec hiov = { &h, sizeof(h) }; if (write_remainder(pcap_fd, &hiov, 1, 0) < 0 || - write_remainder(pcap_fd, iov, 1, offset) < 0) + write_remainder(pcap_fd, iov, iovcnt, offset) < 0) debug("Cannot log packet, length %zu: %s", len, strerror(errno)); } @@ -105,16 +107,18 @@ void pcap(const char *pkt, size_t len) return; gettimeofday(&tv, NULL); - pcap_frame(&iov, 0, &tv); + pcap_frame(&iov, 1, 0, &tv); } /** * pcap_multiple() - Capture multiple frames - * @iov: Array of iovecs, one entry per frame + * @iov: Array of iovecs, every @framebufs entries is one frame + * @framebufs: Number of buffers per frame * @n: Number of frames to capture - * @offset: Offset of the frame within each iovec buffer + * @offset: Offset of the L2 frame within each iovec buffer */ -void pcap_multiple(const struct iovec *iov, unsigned int n, size_t offset) +void pcap_multiple(const struct iovec *iov, size_t framebufs, unsigned int n, + size_t offset) { struct timeval tv; unsigned int i; @@ -125,7 +129,7 @@ void pcap_multiple(const struct iovec *iov, unsigned int n, size_t offset) gettimeofday(&tv, NULL); for (i = 0; i < n; i++) - pcap_frame(iov + i, offset, &tv); + pcap_frame(iov + i * framebufs, framebufs, offset, &tv); } /** diff --git a/pcap.h b/pcap.h index da5a7e84..b9a2257e 100644 --- a/pcap.h +++ b/pcap.h @@ -7,7 +7,8 @@ #define PCAP_H void pcap(const char *pkt, size_t len); -void pcap_multiple(const struct iovec *iov, unsigned int n, size_t offset); +void pcap_multiple(const struct iovec *iov, size_t framebufs, unsigned int n, + size_t offset); void pcap_init(struct ctx *c); #endif /* PCAP_H */ diff --git a/tap.c b/tap.c index f15eba6e..7f0389f3 100644 --- a/tap.c +++ b/tap.c @@ -432,7 +432,7 @@ size_t tap_send_frames(const struct ctx *c, const struct iovec *iov, size_t n) if (m < n) debug("tap: failed to send %zu frames of %zu", n - m, n); - pcap_multiple(iov, m, c->mode == MODE_PASST ? sizeof(uint32_t) : 0); + pcap_multiple(iov, 1, n, c->mode == MODE_PASST ? sizeof(uint32_t) : 0); return m; } -- 2.43.2