From 64a0ba3b272dd9ee175e0c6256a6d0cb1733599b Mon Sep 17 00:00:00 2001 From: Stefano Brivio Date: Wed, 21 Jul 2021 12:01:04 +0200 Subject: 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 --- util.h | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'util.h') diff --git a/util.h b/util.h index c4d947a..7fbce1f 100644 --- a/util.h +++ b/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 #include #include @@ -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); -- cgit v1.2.3