diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2021-07-21 12:01:04 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2021-07-21 12:01:04 +0200 |
commit | 64a0ba3b272dd9ee175e0c6256a6d0cb1733599b (patch) | |
tree | 4a9ab4a8c4a264ad66d12ac8cc597a062f788963 /util.h | |
parent | 7fa3e90290d1966e25f3f8882ee25f14808e8e48 (diff) | |
download | passt-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 'util.h')
-rw-r--r-- | util.h | 59 |
1 files changed, 59 insertions, 0 deletions
@@ -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); |