diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2024-02-28 12:52:01 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2024-02-29 06:24:07 +0100 |
commit | 64b63d9e3e1dc2e4c1f32432cf8954f6cc3f788f (patch) | |
tree | bbc7d06c7ccf693f1f563001a779002d4acbabb8 /tap.c | |
parent | 2a6f8bcca77ae7391a8943a3791be2fbb98a918b (diff) | |
download | passt-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.c | 12 |
1 files changed, 5 insertions, 7 deletions
@@ -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++; } |