diff options
author | Laurent Vivier <lvivier@redhat.com> | 2024-03-07 12:01:44 +0100 |
---|---|---|
committer | Laurent Vivier <lvivier@redhat.com> | 2024-03-11 15:58:29 +0100 |
commit | a66fceb28076916ec999619f7a0a5264b8a513c0 (patch) | |
tree | 6f00349cb3910e078818676a184c34dadffbaa19 /tap.h | |
parent | 137ce017896b2b64f8c45a8ddefbaed2cb71c445 (diff) | |
download | passt-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.h | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -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); |