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
next prev 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).