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:
parent
2a6f8bcca7
commit
64b63d9e3e
3 changed files with 40 additions and 16 deletions
12
tap.c
12
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++;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue