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:
parent
7fa3e90290
commit
64a0ba3b27
9 changed files with 537 additions and 61 deletions
14
passt.c
14
passt.c
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue