diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2023-01-06 11:43:17 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2023-01-23 18:54:52 +0100 |
commit | 4b3d38a0690988387fa4cef432ad96fe7ee32bf8 (patch) | |
tree | 667da707a578ebadb5f6a5d27e9eba7493ab0e83 /tap.c | |
parent | e4443ba9bd32b5d1f80a3167b6073e8f3ff4f14a (diff) | |
download | passt-4b3d38a0690988387fa4cef432ad96fe7ee32bf8.tar passt-4b3d38a0690988387fa4cef432ad96fe7ee32bf8.tar.gz passt-4b3d38a0690988387fa4cef432ad96fe7ee32bf8.tar.bz2 passt-4b3d38a0690988387fa4cef432ad96fe7ee32bf8.tar.lz passt-4b3d38a0690988387fa4cef432ad96fe7ee32bf8.tar.xz passt-4b3d38a0690988387fa4cef432ad96fe7ee32bf8.tar.zst passt-4b3d38a0690988387fa4cef432ad96fe7ee32bf8.zip |
tap: Add "tap headers" abstraction
Currently both the TCP and UDP code need to deal in various places with the
details of the L2 headers, and also the tap-specific "vnet_len" header.
This makes abstracting the tap interface to new backends (e.g. vhost-user
or tun) more difficult.
To improve this abstraction, create a new 'tap_hdr' structure which
represents both L2 (always Ethernet at the moment, but might be vary in
future) and any additional tap specific headers (such as the qemu socket's
vnet_len field). Provide helper functions and macros to initialize, update
and use it.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'tap.c')
-rw-r--r-- | tap.c | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -386,6 +386,21 @@ void tap_send_frames(struct ctx *c, const struct iovec *iov, size_t n) pcap_multiple(iov, n, sizeof(uint32_t)); } +/** + * tap_update_mac() - Update tap L2 header with new Ethernet addresses + * @taph: Tap headers to update + * @eth_d: Ethernet destination address, NULL if unchanged + * @eth_s: Ethernet source address, NULL if unchanged + */ +void tap_update_mac(struct tap_hdr *taph, + const unsigned char *eth_d, const unsigned char *eth_s) +{ + if (eth_d) + memcpy(taph->eh.h_dest, eth_d, sizeof(taph->eh.h_dest)); + if (eth_s) + memcpy(taph->eh.h_source, eth_s, sizeof(taph->eh.h_source)); +} + PACKET_POOL_DECL(pool_l4, UIO_MAXIOV, pkt_buf); /** |