mirror of
https://passt.top/passt
synced 2025-06-14 03:25: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
59
util.h
59
util.h
|
@ -52,6 +52,64 @@ void debug(const char *format, ...);
|
|||
|
||||
#define NS_FN_STACK_SIZE (RLIMIT_STACK_VAL * 1024 / 4)
|
||||
|
||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||
#define L2_BUF_ETH_IP4_INIT \
|
||||
{ \
|
||||
.h_dest = { 0 }, \
|
||||
.h_source = { 0 }, \
|
||||
.h_proto = ETH_P_IP, \
|
||||
}
|
||||
#else
|
||||
#define L2_BUF_ETH_IP4_INIT \
|
||||
{ \
|
||||
.h_dest = { 0 }, \
|
||||
.h_source = { 0 }, \
|
||||
.h_proto = __bswap_constant_16(ETH_P_IP), \
|
||||
}
|
||||
#endif
|
||||
|
||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||
#define L2_BUF_ETH_IP6_INIT \
|
||||
{ \
|
||||
.h_dest = { 0 }, \
|
||||
.h_source = { 0 }, \
|
||||
.h_proto = ETH_P_IPV6, \
|
||||
}
|
||||
#else
|
||||
#define L2_BUF_ETH_IP6_INIT \
|
||||
{ \
|
||||
.h_dest = { 0 }, \
|
||||
.h_source = { 0 }, \
|
||||
.h_proto = __bswap_constant_16(ETH_P_IPV6), \
|
||||
}
|
||||
#endif
|
||||
|
||||
#define L2_BUF_IP4_INIT(proto) \
|
||||
{ \
|
||||
.version = 4, \
|
||||
.ihl = 5, \
|
||||
.tos = 0, \
|
||||
.tot_len = 0, \
|
||||
.id = 0, \
|
||||
.frag_off = 0, \
|
||||
.ttl = 255, \
|
||||
.protocol = (proto), \
|
||||
.saddr = 0, \
|
||||
.daddr = 0, \
|
||||
}
|
||||
|
||||
#define L2_BUF_IP6_INIT(proto) \
|
||||
{ \
|
||||
.priority = 0, \
|
||||
.version = 6, \
|
||||
.flow_lbl = { 0 }, \
|
||||
.payload_len = 0, \
|
||||
.nexthdr = (proto), \
|
||||
.hop_limit = 255, \
|
||||
.saddr = IN6ADDR_ANY_INIT, \
|
||||
.daddr = IN6ADDR_ANY_INIT, \
|
||||
}
|
||||
|
||||
#include <linux/ipv6.h>
|
||||
#include <net/if.h>
|
||||
#include <linux/ip.h>
|
||||
|
@ -59,6 +117,7 @@ void debug(const char *format, ...);
|
|||
|
||||
struct ctx;
|
||||
|
||||
uint32_t sum_16b(void *buf, size_t len);
|
||||
uint16_t csum_fold(uint32_t sum);
|
||||
uint16_t csum_ip4(void *buf, size_t len);
|
||||
void csum_tcp4(struct iphdr *iph);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue