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>,
	Laurent Vivier <lvivier@redhat.com>,
	passt-dev@passt.top
Cc: David Gibson <david@gibson.dropbear.id.au>
Subject: [PATCH 3/7] tcp: Rework tcp_l2_buf_fill_headers() into tcp_buf_make_frame()
Date: Mon, 28 Oct 2024 20:40:46 +1100	[thread overview]
Message-ID: <20241028094050.1609090-4-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20241028094050.1609090-1-david@gibson.dropbear.id.au>

tcp_l2_buf_fill_headers() is always followed by updating the payload IOV
entry to the correct length of the frame.  It already needs knowledge of
the frame/IOV layout, so we might as well perform that update inside the
function.  Rename it to tcp_buf_make_frame() to reflect its expanded
duties.

While we're there use some temporaries to make our dissection of the IOV a
bit clearer.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 tcp_buf.c | 46 +++++++++++++++++++++-------------------------
 1 file changed, 21 insertions(+), 25 deletions(-)

diff --git a/tcp_buf.c b/tcp_buf.c
index dbe565c..deb7be4 100644
--- a/tcp_buf.c
+++ b/tcp_buf.c
@@ -257,35 +257,38 @@ void tcp_payload_flush(const struct ctx *c)
 }
 
 /**
- * tcp_buf_fill_headers() - Fill 802.3, IP, TCP headers in pre-cooked buffers
+ * tcp_buf_make_frame() - Adjust IOV, complete headers to build a TCP frame
  * @conn:	Connection pointer
  * @iov:	Pointer to an array of iovec of TCP pre-cooked buffers
  * @dlen:	TCP payload length
  * @check:	Checksum, if already known
  * @seq:	Sequence number for this segment
  * @no_tcp_csum: Do not set TCP checksum
- *
- * Return: IP payload length, host order
  */
-static size_t tcp_l2_buf_fill_headers(const struct tcp_tap_conn *conn,
-				      struct iovec *iov, size_t dlen,
-				      const uint16_t *check, uint32_t seq,
-				      bool no_tcp_csum)
+static void tcp_buf_make_frame(const struct tcp_tap_conn *conn,
+			       struct iovec *iov, size_t dlen,
+			       const uint16_t *check, uint32_t seq,
+			       bool no_tcp_csum)
 {
+	struct tcp_payload_t *payload = iov[TCP_IOV_PAYLOAD].iov_base;
+	struct tap_hdr *taph = iov[TCP_IOV_TAP].iov_base;
 	const struct flowside *tapside = TAPFLOW(conn);
 	const struct in_addr *a4 = inany_v4(&tapside->oaddr);
+	size_t l4len;
 
 	if (a4) {
-		return tcp_fill_headers4(conn, iov[TCP_IOV_TAP].iov_base,
-					 iov[TCP_IOV_IP].iov_base,
-					 iov[TCP_IOV_PAYLOAD].iov_base, dlen,
-					 check, seq, no_tcp_csum);
+		struct iphdr *iph = iov[TCP_IOV_IP].iov_base;
+
+		l4len = tcp_fill_headers4(conn, taph, iph, payload, dlen,
+					  check, seq, no_tcp_csum);
+	} else {
+		struct ipv6hdr *ip6h = iov[TCP_IOV_IP].iov_base;
+
+		l4len = tcp_fill_headers6(conn, taph, ip6h, payload, dlen,
+					  seq, no_tcp_csum);
 	}
 
-	return tcp_fill_headers6(conn, iov[TCP_IOV_TAP].iov_base,
-				 iov[TCP_IOV_IP].iov_base,
-				 iov[TCP_IOV_PAYLOAD].iov_base, dlen,
-				 seq, no_tcp_csum);
+	iov[TCP_IOV_PAYLOAD].iov_len = l4len;
 }
 
 /**
@@ -301,7 +304,6 @@ int tcp_buf_send_flag(const struct ctx *c, struct tcp_tap_conn *conn, int flags)
 	struct tcp_flags_t *payload;
 	struct iovec *iov;
 	size_t optlen;
-	size_t l4len;
 	uint32_t seq;
 	int ret;
 
@@ -323,8 +325,7 @@ int tcp_buf_send_flag(const struct ctx *c, struct tcp_tap_conn *conn, int flags)
 		return ret;
 	}
 
-	l4len = tcp_l2_buf_fill_headers(conn, iov, optlen, NULL, seq, false);
-	iov[TCP_IOV_PAYLOAD].iov_len = l4len;
+	tcp_buf_make_frame(conn, iov, optlen, NULL, seq, false);
 
 	if (flags & DUP_ACK) {
 		struct iovec *dup_iov;
@@ -368,7 +369,6 @@ static void tcp_data_to_tap(const struct ctx *c, struct tcp_tap_conn *conn,
 			    ssize_t dlen, int no_csum, uint32_t seq)
 {
 	struct iovec *iov;
-	size_t l4len;
 
 	conn->seq_to_tap = seq + dlen;
 
@@ -384,18 +384,14 @@ static void tcp_data_to_tap(const struct ctx *c, struct tcp_tap_conn *conn,
 		tcp4_frame_conns[tcp4_payload_used] = conn;
 
 		iov = tcp4_l2_iov[tcp4_payload_used++];
-		l4len = tcp_l2_buf_fill_headers(conn, iov, dlen, check, seq,
-						false);
-		iov[TCP_IOV_PAYLOAD].iov_len = l4len;
+		tcp_buf_make_frame(conn, iov, dlen, check, seq, false);
 		if (tcp4_payload_used > TCP_FRAMES_MEM - 1)
 			tcp_payload_flush(c);
 	} else if (CONN_V6(conn)) {
 		tcp6_frame_conns[tcp6_payload_used] = conn;
 
 		iov = tcp6_l2_iov[tcp6_payload_used++];
-		l4len = tcp_l2_buf_fill_headers(conn, iov, dlen, NULL, seq,
-						false);
-		iov[TCP_IOV_PAYLOAD].iov_len = l4len;
+		tcp_buf_make_frame(conn, iov, dlen, NULL, seq, false);
 		if (tcp6_payload_used > TCP_FRAMES_MEM - 1)
 			tcp_payload_flush(c);
 	}
-- 
@@ -257,35 +257,38 @@ void tcp_payload_flush(const struct ctx *c)
 }
 
 /**
- * tcp_buf_fill_headers() - Fill 802.3, IP, TCP headers in pre-cooked buffers
+ * tcp_buf_make_frame() - Adjust IOV, complete headers to build a TCP frame
  * @conn:	Connection pointer
  * @iov:	Pointer to an array of iovec of TCP pre-cooked buffers
  * @dlen:	TCP payload length
  * @check:	Checksum, if already known
  * @seq:	Sequence number for this segment
  * @no_tcp_csum: Do not set TCP checksum
- *
- * Return: IP payload length, host order
  */
-static size_t tcp_l2_buf_fill_headers(const struct tcp_tap_conn *conn,
-				      struct iovec *iov, size_t dlen,
-				      const uint16_t *check, uint32_t seq,
-				      bool no_tcp_csum)
+static void tcp_buf_make_frame(const struct tcp_tap_conn *conn,
+			       struct iovec *iov, size_t dlen,
+			       const uint16_t *check, uint32_t seq,
+			       bool no_tcp_csum)
 {
+	struct tcp_payload_t *payload = iov[TCP_IOV_PAYLOAD].iov_base;
+	struct tap_hdr *taph = iov[TCP_IOV_TAP].iov_base;
 	const struct flowside *tapside = TAPFLOW(conn);
 	const struct in_addr *a4 = inany_v4(&tapside->oaddr);
+	size_t l4len;
 
 	if (a4) {
-		return tcp_fill_headers4(conn, iov[TCP_IOV_TAP].iov_base,
-					 iov[TCP_IOV_IP].iov_base,
-					 iov[TCP_IOV_PAYLOAD].iov_base, dlen,
-					 check, seq, no_tcp_csum);
+		struct iphdr *iph = iov[TCP_IOV_IP].iov_base;
+
+		l4len = tcp_fill_headers4(conn, taph, iph, payload, dlen,
+					  check, seq, no_tcp_csum);
+	} else {
+		struct ipv6hdr *ip6h = iov[TCP_IOV_IP].iov_base;
+
+		l4len = tcp_fill_headers6(conn, taph, ip6h, payload, dlen,
+					  seq, no_tcp_csum);
 	}
 
-	return tcp_fill_headers6(conn, iov[TCP_IOV_TAP].iov_base,
-				 iov[TCP_IOV_IP].iov_base,
-				 iov[TCP_IOV_PAYLOAD].iov_base, dlen,
-				 seq, no_tcp_csum);
+	iov[TCP_IOV_PAYLOAD].iov_len = l4len;
 }
 
 /**
@@ -301,7 +304,6 @@ int tcp_buf_send_flag(const struct ctx *c, struct tcp_tap_conn *conn, int flags)
 	struct tcp_flags_t *payload;
 	struct iovec *iov;
 	size_t optlen;
-	size_t l4len;
 	uint32_t seq;
 	int ret;
 
@@ -323,8 +325,7 @@ int tcp_buf_send_flag(const struct ctx *c, struct tcp_tap_conn *conn, int flags)
 		return ret;
 	}
 
-	l4len = tcp_l2_buf_fill_headers(conn, iov, optlen, NULL, seq, false);
-	iov[TCP_IOV_PAYLOAD].iov_len = l4len;
+	tcp_buf_make_frame(conn, iov, optlen, NULL, seq, false);
 
 	if (flags & DUP_ACK) {
 		struct iovec *dup_iov;
@@ -368,7 +369,6 @@ static void tcp_data_to_tap(const struct ctx *c, struct tcp_tap_conn *conn,
 			    ssize_t dlen, int no_csum, uint32_t seq)
 {
 	struct iovec *iov;
-	size_t l4len;
 
 	conn->seq_to_tap = seq + dlen;
 
@@ -384,18 +384,14 @@ static void tcp_data_to_tap(const struct ctx *c, struct tcp_tap_conn *conn,
 		tcp4_frame_conns[tcp4_payload_used] = conn;
 
 		iov = tcp4_l2_iov[tcp4_payload_used++];
-		l4len = tcp_l2_buf_fill_headers(conn, iov, dlen, check, seq,
-						false);
-		iov[TCP_IOV_PAYLOAD].iov_len = l4len;
+		tcp_buf_make_frame(conn, iov, dlen, check, seq, false);
 		if (tcp4_payload_used > TCP_FRAMES_MEM - 1)
 			tcp_payload_flush(c);
 	} else if (CONN_V6(conn)) {
 		tcp6_frame_conns[tcp6_payload_used] = conn;
 
 		iov = tcp6_l2_iov[tcp6_payload_used++];
-		l4len = tcp_l2_buf_fill_headers(conn, iov, dlen, NULL, seq,
-						false);
-		iov[TCP_IOV_PAYLOAD].iov_len = l4len;
+		tcp_buf_make_frame(conn, iov, dlen, NULL, seq, false);
 		if (tcp6_payload_used > TCP_FRAMES_MEM - 1)
 			tcp_payload_flush(c);
 	}
-- 
2.47.0


  parent reply	other threads:[~2024-10-28  9:41 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-28  9:40 [PATCH 0/7] Rework some IOV handling in TCP code David Gibson
2024-10-28  9:40 ` [PATCH 1/7] tcp: Pass TCP header and payload separately to tcp_update_check_tcp[46]() David Gibson
2024-10-28 18:42   ` Stefano Brivio
2024-10-29  3:02     ` David Gibson
2024-10-29  4:07       ` David Gibson
2024-10-29  9:09         ` Stefano Brivio
2024-10-29  9:26           ` David Gibson
2024-10-29 10:32             ` Stefano Brivio
2024-10-28  9:40 ` [PATCH 2/7] tcp: Move tcp_l2_buf_fill_headers() to tcp_buf.c David Gibson
2024-10-28  9:40 ` David Gibson [this message]
2024-10-28  9:40 ` [PATCH 4/7] tcp: Don't use return value from tcp_fill_headers[46] to adjust iov_len David Gibson
2024-10-28  9:40 ` [PATCH 5/7] tcp: Pass TCP header and payload separately to tcp_fill_headers[46]() David Gibson
2024-10-28  9:40 ` [PATCH 6/7] tcp: Merge tcp_update_check_tcp[46]() David Gibson
2024-10-28  9:40 ` [PATCH 7/7] tcp: Fold tcp_update_csum() into tcp_fill_header() David Gibson

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=20241028094050.1609090-4-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --cc=lvivier@redhat.com \
    --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).