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.c | |
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.c')
-rw-r--r-- | util.c | 40 |
1 files changed, 26 insertions, 14 deletions
@@ -77,6 +77,29 @@ logfn(debug, LOG_DEBUG) #endif /** + * sum_16b() - Calculate sum of 16-bit words + * @buf: Input buffer + * @len: Buffer length + * + * Return: 32-bit sum of 16-bit words +*/ +uint32_t sum_16b(void *buf, size_t len) +{ + uint32_t sum = 0; + uint16_t *p = buf; + size_t len1 = len / 2; + size_t off; + + for (off = 0; off < len1; off++, p++) + sum += *p; + + if (len % 2) + sum += *p & 0xff; + + return sum; +} + +/** * csum_fold() - Fold long sum for IP and TCP checksum * @sum: Original long sum * @@ -91,7 +114,7 @@ uint16_t csum_fold(uint32_t sum) } /** - * csum_ipv4() - Calculate IPv4 checksum + * csum_ip4() - Calculate IPv4 checksum * @buf: Packet buffer, L3 headers * @len: Total L3 packet length * @@ -99,22 +122,11 @@ uint16_t csum_fold(uint32_t sum) */ uint16_t csum_ip4(void *buf, size_t len) { - uint32_t sum = 0; - uint16_t *p = buf; - size_t len1 = len / 2; - size_t off; - - for (off = 0; off < len1; off++, p++) - sum += *p; - - if (len % 2) - sum += *p & 0xff; - - return ~csum_fold(sum); + return ~csum_fold(sum_16b(buf, len)); } /** - * csum_ipv4() - Calculate TCP checksum for IPv4 and set in place + * csum_tcp4() - Calculate TCP checksum for IPv4 and set in place * @iph: Packet buffer, IP header */ void csum_tcp4(struct iphdr *iph) |