public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Stefano Brivio <sbrivio@redhat.com>, passt-dev@passt.top
Cc: David Gibson <david@gibson.dropbear.id.au>
Subject: [PATCH v3 02/18] pcap: Replace pcapm() with pcap_multiple()
Date: Fri,  6 Jan 2023 11:43:06 +1100	[thread overview]
Message-ID: <20230106004322.985665-3-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20230106004322.985665-1-david@gibson.dropbear.id.au>

pcapm() captures multiple frames from a msghdr, however the only thing it
cares about in the msghdr is the list of buffers, where it assumes there is
one frame to capture per buffer.  That's what we want for its single caller
but it's not the only obvious choice here (one frame per msghdr would
arguably make more sense in isolation).  In addition pcapm() has logic
that only makes sense in the context of the passt specific path its called
from: it skips the first 4 bytes of each buffer, because those have the
qemu vnet_len rather than the frame proper.

Make this clearer by replacing pcapm() with pcap_multiple() which more
explicitly takes one struct iovec per frame, and parameterizes how much of
each buffer to skip (i.e. the offset of the frame within the buffer).

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 pcap.c | 18 +++++++++---------
 pcap.h |  2 +-
 tcp.c  |  3 ++-
 3 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/pcap.c b/pcap.c
index 0c6dc89..7dca599 100644
--- a/pcap.c
+++ b/pcap.c
@@ -105,10 +105,12 @@ void pcap(const char *pkt, size_t len)
 }
 
 /**
- * pcapm() - Capture multiple frames from message header to pcap file
- * @mh:		Pointer to sendmsg() message header buffer
+ * pcap_multiple() - Capture multiple frames
+ * @iov:	Array of iovecs, one entry per frame
+ * @n:		Number of frames to capture
+ * @offset:	Offset of the frame within each iovec buffer
  */
-void pcapm(const struct msghdr *mh)
+void pcap_multiple(const struct iovec *iov, unsigned int n, size_t offset)
 {
 	struct timeval tv;
 	unsigned int i;
@@ -118,13 +120,11 @@ void pcapm(const struct msghdr *mh)
 
 	gettimeofday(&tv, NULL);
 
-	for (i = 0; i < mh->msg_iovlen; i++) {
-		const struct iovec *iov = &mh->msg_iov[i];
-
-		if (pcap_frame((char *)iov->iov_base + 4,
-			       iov->iov_len - 4, &tv) != 0) {
+	for (i = 0; i < n; i++) {
+		if (pcap_frame((char *)iov[i].iov_base + offset,
+			       iov[i].iov_len - offset, &tv) != 0) {
 			debug("Cannot log packet, length %lu",
-			      iov->iov_len - 4);
+			      iov->iov_len - offset);
 			return;
 		}
 	}
diff --git a/pcap.h b/pcap.h
index 9e1736c..eafc89b 100644
--- a/pcap.h
+++ b/pcap.h
@@ -7,7 +7,7 @@
 #define PCAP_H
 
 void pcap(const char *pkt, size_t len);
-void pcapm(const struct msghdr *mh);
+void pcap_multiple(const struct iovec *iov, unsigned int n, size_t offset);
 void pcapmm(const struct mmsghdr *mmh, unsigned int vlen);
 void pcap_init(struct ctx *c);
 
diff --git a/tcp.c b/tcp.c
index cfdae06..ed65a9e 100644
--- a/tcp.c
+++ b/tcp.c
@@ -1468,7 +1468,8 @@ static void tcp_l2_buf_flush(struct ctx *c, struct msghdr *mh,
 		}
 	}
 	*buf_used = *buf_bytes = 0;
-	pcapm(mh);
+
+	pcap_multiple(mh->msg_iov, mh->msg_iovlen, sizeof(uint32_t));
 }
 
 /**
-- 
@@ -1468,7 +1468,8 @@ static void tcp_l2_buf_flush(struct ctx *c, struct msghdr *mh,
 		}
 	}
 	*buf_used = *buf_bytes = 0;
-	pcapm(mh);
+
+	pcap_multiple(mh->msg_iov, mh->msg_iovlen, sizeof(uint32_t));
 }
 
 /**
-- 
2.39.0


  parent reply	other threads:[~2023-01-06  0:43 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-06  0:43 [PATCH v3 00/18] RFC: Unify and simplify tap send path David Gibson
2023-01-06  0:43 ` [PATCH v3 01/18] pcap: Introduce pcap_frame() helper David Gibson
2023-01-06  0:43 ` David Gibson [this message]
2023-01-06  0:43 ` [PATCH v3 03/18] tcp: Combine two parts of passt tap send path together David Gibson
2023-01-06  0:43 ` [PATCH v3 04/18] tcp: Don't compute total bytes in a message until we need it David Gibson
2023-01-06  0:43 ` [PATCH v3 05/18] tcp: Improve interface to tcp_l2_buf_flush() David Gibson
2023-01-06  0:43 ` [PATCH v3 06/18] tcp: Combine two parts of pasta tap send path together David Gibson
2023-02-13  1:13   ` Stefano Brivio
2023-01-06  0:43 ` [PATCH v3 07/18] tap, tcp: Move tap send path to tap.c David Gibson
2023-01-06  0:43 ` [PATCH v3 08/18] util: Introduce hton*_constant() in place of #ifdefs David Gibson
2023-01-06  0:43 ` [PATCH v3 09/18] tcp, udp: Use named field initializers in iov_init functions David Gibson
2023-01-06  0:43 ` [PATCH v3 10/18] util: Parameterize ethernet header initializer macro David Gibson
2023-01-06  0:43 ` [PATCH v3 11/18] tcp: Remove redundant and incorrect initialization from *_iov_init() David Gibson
2023-01-06  0:43 ` [PATCH v3 12/18] tcp: Consolidate calculation of total frame size David Gibson
2023-01-06  0:43 ` [PATCH v3 13/18] tap: Add "tap headers" abstraction David Gibson
2023-01-06  0:43 ` [PATCH v3 14/18] tcp: Use abstracted tap header David Gibson
2023-01-06  0:43 ` [PATCH v3 15/18] tap: Use different io vector bases depending on tap type David Gibson
2023-01-06  0:43 ` [PATCH v3 16/18] udp: Use abstracted tap header David Gibson
2023-01-06  0:43 ` [PATCH v3 17/18] tap: Improve handling of partial frame sends David Gibson
2023-01-06  0:43 ` [PATCH v3 18/18] udp: Use tap_send_frames() David Gibson
2023-01-24 21:20 ` [PATCH v3 00/18] RFC: Unify and simplify tap send path Stefano Brivio
2023-01-25  3:13   ` David Gibson
2023-01-25 23:21     ` Stefano Brivio
2023-02-13  1:14       ` Stefano Brivio

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230106004322.985665-3-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --cc=passt-dev@passt.top \
    --cc=sbrivio@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).