From 64b63d9e3e1dc2e4c1f32432cf8954f6cc3f788f Mon Sep 17 00:00:00 2001 From: David Gibson Date: Wed, 28 Feb 2024 12:52:01 +1100 Subject: iov: Add helper to find skip over first n bytes of an io vector Several of the IOV functions in iov.c, and also tap_send_frames_passt() needs to determine which buffer element a byte offset into an IO vector lies in. Split this out into a helper function iov_skip_bytes(). Signed-off-by: David Gibson Signed-off-by: Stefano Brivio --- tap.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'tap.c') diff --git a/tap.c b/tap.c index 396dee7..dd11d1d 100644 --- a/tap.c +++ b/tap.c @@ -45,6 +45,7 @@ #include "checksum.h" #include "util.h" +#include "iov.h" #include "passt.h" #include "arp.h" #include "dhcp.h" @@ -389,6 +390,7 @@ static size_t tap_send_frames_passt(const struct ctx *c, .msg_iov = (void *)iov, .msg_iovlen = n, }; + size_t buf_offset; unsigned int i; ssize_t sent; @@ -397,15 +399,11 @@ static size_t tap_send_frames_passt(const struct ctx *c, return 0; /* Check for any partial frames due to short send */ - for (i = 0; i < n; i++) { - if ((size_t)sent < iov[i].iov_len) - break; - sent -= iov[i].iov_len; - } + i = iov_skip_bytes(iov, n, sent, &buf_offset); - if (i < n && sent) { + if (i < n && buf_offset) { /* A partial frame was sent */ - tap_send_remainder(c, &iov[i], sent); + tap_send_remainder(c, &iov[i], buf_offset); i++; } -- cgit v1.2.3