1
0
Fork 0
mirror of https://passt.top/passt synced 2025-06-13 02:55:34 +02:00

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>
This commit is contained in:
Stefano Brivio 2021-07-21 12:01:04 +02:00
parent 7fa3e90290
commit 64a0ba3b27
9 changed files with 537 additions and 61 deletions

14
passt.c
View file

@ -409,6 +409,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);