diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2023-01-06 11:43:19 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2023-01-23 18:54:57 +0100 |
commit | 0fb7b2b9080afd6dc97d2909015a1a6f3e721a73 (patch) | |
tree | 16da0d2a9fba56e99b712d47f5ce4918b9d35391 | |
parent | 2416310a17e37c61787a8d4366d09255cd784266 (diff) | |
download | passt-0fb7b2b9080afd6dc97d2909015a1a6f3e721a73.tar passt-0fb7b2b9080afd6dc97d2909015a1a6f3e721a73.tar.gz passt-0fb7b2b9080afd6dc97d2909015a1a6f3e721a73.tar.bz2 passt-0fb7b2b9080afd6dc97d2909015a1a6f3e721a73.tar.lz passt-0fb7b2b9080afd6dc97d2909015a1a6f3e721a73.tar.xz passt-0fb7b2b9080afd6dc97d2909015a1a6f3e721a73.tar.zst passt-0fb7b2b9080afd6dc97d2909015a1a6f3e721a73.zip |
tap: Use different io vector bases depending on tap type
Currently tap_send_frames() expects the frames it is given to include the
vnet_len field, even in pasta mode which doesn't use it (although it need
not be initialized in that case). To match, tap_iov_base() and
tap_iov_len() construct the frame in that way.
This will inconvenience future changes, so alter things to set the buffers
to include just the frame needed by the tap backend type.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r-- | tap.c | 5 | ||||
-rw-r--r-- | tap.h | 6 |
2 files changed, 6 insertions, 5 deletions
@@ -317,8 +317,7 @@ static void tap_send_frames_pasta(struct ctx *c, size_t i; for (i = 0; i < n; i++) { - if (write(c->fd_tap, (char *)iov->iov_base + 4, - iov->iov_len - 4) < 0) { + if (write(c->fd_tap, (char *)iov->iov_base, iov->iov_len) < 0) { debug("tap write: %s", strerror(errno)); if (errno != EAGAIN && errno != EWOULDBLOCK) tap_handler(c, c->fd_tap, EPOLLERR, NULL); @@ -383,7 +382,7 @@ void tap_send_frames(struct ctx *c, const struct iovec *iov, size_t n) else tap_send_frames_pasta(c, iov, n); - pcap_multiple(iov, n, sizeof(uint32_t)); + pcap_multiple(iov, n, c->mode == MODE_PASST ? sizeof(uint32_t) : 0); } /** @@ -20,8 +20,10 @@ struct tap_hdr { static inline size_t tap_hdr_len_(const struct ctx *c) { - (void)c; - return sizeof(struct tap_hdr); + if (c->mode == MODE_PASST) + return sizeof(struct tap_hdr); + else + return sizeof(struct ethhdr); } /** |