aboutgitcodebugslistschat
path: root/tap.h
diff options
context:
space:
mode:
authorLaurent Vivier <lvivier@redhat.com>2024-03-07 12:01:44 +0100
committerLaurent Vivier <lvivier@redhat.com>2024-03-11 15:58:29 +0100
commita66fceb28076916ec999619f7a0a5264b8a513c0 (patch)
tree6f00349cb3910e078818676a184c34dadffbaa19 /tap.h
parent137ce017896b2b64f8c45a8ddefbaed2cb71c445 (diff)
downloadpasst-a66fceb28076916ec999619f7a0a5264b8a513c0.tar
passt-a66fceb28076916ec999619f7a0a5264b8a513c0.tar.gz
passt-a66fceb28076916ec999619f7a0a5264b8a513c0.tar.bz2
passt-a66fceb28076916ec999619f7a0a5264b8a513c0.tar.lz
passt-a66fceb28076916ec999619f7a0a5264b8a513c0.tar.xz
passt-a66fceb28076916ec999619f7a0a5264b8a513c0.tar.zst
passt-a66fceb28076916ec999619f7a0a5264b8a513c0.zip
tcp: Replace TCP buffer structure by an iovec array
To be able to provide pointers to TCP headers and IP headers without worrying about alignment in the structure, split the structure into several arrays and point to each part of the frame using an iovec array. Using iovec also allows us to simply ignore the first entry when the vnet length header is not needed. And as the payload buffer contains only the TCP header and the TCP data we can increase the size of the TCP data to USHRT_MAX - sizeof(struct tcphdr). As a side effect, these changes improve performance by a factor of x1.5. Signed-off-by: Laurent Vivier <lvivier@redhat.com>
Diffstat (limited to 'tap.h')
-rw-r--r--tap.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/tap.h b/tap.h
index 437b9aa..2d8e7aa 100644
--- a/tap.h
+++ b/tap.h
@@ -6,6 +6,20 @@
#ifndef TAP_H
#define TAP_H
+/*
+ * TCP frame iovec array:
+ * TCP_IOV_VNET vnet length
+ * TCP_IOV_ETH ethernet header
+ * TCP_IOV_IP IP (v4/v6) header
+ * TCP_IOV_PAYLOAD IP payload (TCP header + data)
+ * TCP_IOV_NUM is the number of entries in the iovec array
+ */
+#define TCP_IOV_VNET 0
+#define TCP_IOV_ETH 1
+#define TCP_IOV_IP 2
+#define TCP_IOV_PAYLOAD 3
+#define TCP_IOV_NUM 4
+
/**
* struct tap_hdr - L2 and tap specific headers
* @vnet_len: Frame length (for qemu socket transport)
@@ -74,6 +88,8 @@ void tap_icmp6_send(const struct ctx *c,
const void *in, size_t len);
int tap_send(const struct ctx *c, const void *data, size_t len);
size_t tap_send_frames(const struct ctx *c, const struct iovec *iov, size_t n);
+size_t tap_send_iov(const struct ctx *c, struct iovec iov[][TCP_IOV_NUM],
+ size_t n);
void eth_update_mac(struct ethhdr *eh,
const unsigned char *eth_d, const unsigned char *eth_s);
void tap_listen_handler(struct ctx *c, uint32_t events);