aboutgitcodebugslistschat
path: root/util.c
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.c
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.c')
-rw-r--r--util.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/util.c b/util.c
index 1372eec..4d4661a 100644
--- a/util.c
+++ b/util.c
@@ -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)