1
0
Fork 0
mirror of https://passt.top/passt synced 2025-05-30 21:05:34 +02:00

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>
This commit is contained in:
David Gibson 2024-02-28 12:52:01 +11:00 committed by Stefano Brivio
parent 2a6f8bcca7
commit 64b63d9e3e
3 changed files with 40 additions and 16 deletions

12
tap.c
View file

@ -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++;
}