aboutgitcodebugslistschat
path: root/util.h
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2021-07-21 12:01:04 +0200
committerStefano Brivio <sbrivio@redhat.com>2021-07-21 12:01:04 +0200
commit64a0ba3b272dd9ee175e0c6256a6d0cb1733599b (patch)
tree4a9ab4a8c4a264ad66d12ac8cc597a062f788963 /util.h
parent7fa3e90290d1966e25f3f8882ee25f14808e8e48 (diff)
downloadpasst-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.h59
1 files changed, 59 insertions, 0 deletions
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 <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);