diff options
author | Laurent Vivier <lvivier@redhat.com> | 2025-09-02 09:52:35 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2025-09-03 20:43:18 +0200 |
commit | d2c33f45f7be0310668d22a74c4484b595899838 (patch) | |
tree | cf4252d89750bb94c650fdbd3c3ce959de56e3c2 | |
parent | 87cc7abc8536064e851006cdf772aa4a53e3f1cf (diff) | |
download | passt-d2c33f45f7be0310668d22a74c4484b595899838.tar passt-d2c33f45f7be0310668d22a74c4484b595899838.tar.gz passt-d2c33f45f7be0310668d22a74c4484b595899838.tar.bz2 passt-d2c33f45f7be0310668d22a74c4484b595899838.tar.lz passt-d2c33f45f7be0310668d22a74c4484b595899838.tar.xz passt-d2c33f45f7be0310668d22a74c4484b595899838.tar.zst passt-d2c33f45f7be0310668d22a74c4484b595899838.zip |
tcp: Convert tcp_data_from_tap() to use iov_tail
Use packet_data() and extract headers using IOV_PEEK_HEADER()
rather than packet_get().
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r-- | tcp.c | 30 |
1 files changed, 19 insertions, 11 deletions
@@ -1651,16 +1651,22 @@ static int tcp_data_from_tap(const struct ctx *c, struct tcp_tap_conn *conn, for (i = idx, iov_i = 0; i < (int)p->count; i++) { uint32_t seq, seq_offset, ack_seq; + struct tcphdr th_storage; const struct tcphdr *th; - char *data; - size_t off; + struct iov_tail data; + size_t off, size; + int count; - th = packet_get(p, i, 0, sizeof(*th), &len); + if (!packet_data(p, i, &data)) + return -1; + + th = IOV_PEEK_HEADER(&data, th_storage); if (!th) return -1; - len += sizeof(*th); + len = iov_tail_size(&data); off = th->doff * 4UL; + if (off < sizeof(*th) || off > len) return -1; @@ -1670,9 +1676,7 @@ static int tcp_data_from_tap(const struct ctx *c, struct tcp_tap_conn *conn, } len -= off; - data = packet_get(p, i, off, len, NULL); - if (!data) - continue; + iov_drop_header(&data, off); seq = ntohl(th->seq); if (SEQ_LT(seq, conn->seq_from_tap) && len <= 1) { @@ -1746,10 +1750,14 @@ static int tcp_data_from_tap(const struct ctx *c, struct tcp_tap_conn *conn, continue; } - tcp_iov[iov_i].iov_base = data + seq_offset; - tcp_iov[iov_i].iov_len = len - seq_offset; - seq_from_tap += tcp_iov[iov_i].iov_len; - iov_i++; + iov_drop_header(&data, seq_offset); + size = len - seq_offset; + count = iov_tail_clone(&tcp_iov[iov_i], UIO_MAXIOV - iov_i, + &data); + if (count < 0) + break; + seq_from_tap += size; + iov_i += count; if (keep == i) keep = -1; |