aboutgitcodebugslistschat
path: root/tap.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2024-02-28 12:52:01 +1100
committerStefano Brivio <sbrivio@redhat.com>2024-02-29 06:24:07 +0100
commit64b63d9e3e1dc2e4c1f32432cf8954f6cc3f788f (patch)
treebbc7d06c7ccf693f1f563001a779002d4acbabb8 /tap.c
parent2a6f8bcca77ae7391a8943a3791be2fbb98a918b (diff)
downloadpasst-64b63d9e3e1dc2e4c1f32432cf8954f6cc3f788f.tar
passt-64b63d9e3e1dc2e4c1f32432cf8954f6cc3f788f.tar.gz
passt-64b63d9e3e1dc2e4c1f32432cf8954f6cc3f788f.tar.bz2
passt-64b63d9e3e1dc2e4c1f32432cf8954f6cc3f788f.tar.lz
passt-64b63d9e3e1dc2e4c1f32432cf8954f6cc3f788f.tar.xz
passt-64b63d9e3e1dc2e4c1f32432cf8954f6cc3f788f.tar.zst
passt-64b63d9e3e1dc2e4c1f32432cf8954f6cc3f788f.zip
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 <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'tap.c')
-rw-r--r--tap.c12
1 files changed, 5 insertions, 7 deletions
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++;
}