aboutgitcodebugslistschat
path: root/passt.c
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2021-07-21 12:01:04 +0200
committerStefano Brivio <sbrivio@redhat.com>2021-07-21 12:01:04 +0200
commit64a0ba3b272dd9ee175e0c6256a6d0cb1733599b (patch)
tree4a9ab4a8c4a264ad66d12ac8cc597a062f788963 /passt.c
parent7fa3e90290d1966e25f3f8882ee25f14808e8e48 (diff)
downloadpasst-64a0ba3b272dd9ee175e0c6256a6d0cb1733599b.tar
passt-64a0ba3b272dd9ee175e0c6256a6d0cb1733599b.tar.gz
passt-64a0ba3b272dd9ee175e0c6256a6d0cb1733599b.tar.bz2
passt-64a0ba3b272dd9ee175e0c6256a6d0cb1733599b.tar.lz
passt-64a0ba3b272dd9ee175e0c6256a6d0cb1733599b.tar.xz
passt-64a0ba3b272dd9ee175e0c6256a6d0cb1733599b.tar.zst
passt-64a0ba3b272dd9ee175e0c6256a6d0cb1733599b.zip
udp: Introduce recvmmsg()/sendmmsg(), zero-copy path from socket
Packets are received directly onto pre-cooked, static buffers for IPv4 (with partial checksum pre-calculation) and IPv6 frames, with pre-filled Ethernet addresses and, partially, IP headers, and sent out from the same buffers with sendmmsg(), for both passt and pasta (non-local traffic only) modes. Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'passt.c')
-rw-r--r--passt.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/passt.c b/passt.c
index ee721df..b0fcbc0 100644
--- a/passt.c
+++ b/passt.c
@@ -410,6 +410,18 @@ static void timer_handler(struct ctx *c, struct timespec *now)
}
/**
+ * proto_update_l2_buf() - Update scatter-gather L2 buffers in protocol handlers
+ * @eth_d: Ethernet destination address, NULL if unchanged
+ * @eth_s: Ethernet source address, NULL if unchanged
+ * @ip_da: Pointer to IPv4 destination address, NULL if unchanged
+ */
+void proto_update_l2_buf(unsigned char *eth_d, unsigned char *eth_s,
+ uint32_t *ip_da)
+{
+ udp_update_l2_buf(eth_d, eth_s, ip_da);
+}
+
+/**
* usage_passt() - Print usage for "passt" mode and exit
* @name: Executable name
*/
@@ -499,6 +511,8 @@ int main(int argc, char **argv)
get_dns(&c);
get_bound_ports(&c);
+ proto_update_l2_buf(c.mac_guest, c.mac, &c.addr4);
+
if (udp_sock_init(&c) || tcp_sock_init(&c))
exit(EXIT_FAILURE);