diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2020-07-20 16:27:43 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2021-02-16 07:57:57 +0100 |
commit | b439984641edaf4e781dc424d4c8a574461d3540 (patch) | |
tree | ecdd49d889bc5e566e59c390e58ade3804d0a7f4 /util.c | |
parent | fa2d20908d061fc7a4c56e793487da861af58aca (diff) | |
download | passt-b439984641edaf4e781dc424d4c8a574461d3540.tar passt-b439984641edaf4e781dc424d4c8a574461d3540.tar.gz passt-b439984641edaf4e781dc424d4c8a574461d3540.tar.bz2 passt-b439984641edaf4e781dc424d4c8a574461d3540.tar.lz passt-b439984641edaf4e781dc424d4c8a574461d3540.tar.xz passt-b439984641edaf4e781dc424d4c8a574461d3540.tar.zst passt-b439984641edaf4e781dc424d4c8a574461d3540.zip |
merd: ARP and DHCP handlers, connection tracking fixes
With this, merd provides a fully functional IPv4 environment to
guests, requiring a single capability, CAP_NET_RAW.
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -0,0 +1,48 @@ +/* MERD - MacVTap Egress and Routing Daemon + * + * util.c - Convenience helpers + * + * Author: Stefano Brivio <sbrivio@redhat.com> + * License: GPLv2 + * + */ + +#include <stdint.h> +#include <stddef.h> + +/** + * csum_fold() - Fold long sum for IP and TCP checksum + * @sum: Original long sum + * + * Return: 16-bit folded sum + */ +uint16_t csum_fold(uint32_t sum) +{ + while (sum >> 16) + sum = (sum & 0xffff) + (sum >> 16); + + return sum; +} + +/** + * csum_ipv4() - Calculate IPv4 checksum + * @buf: Packet buffer, L3 headers + * @len: Total L3 packet length + * + * Return: 16-bit IPv4-style checksum + */ +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); +} |