aboutgitcodebugslistschat
path: root/checksum.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2024-05-01 16:53:48 +1000
committerStefano Brivio <sbrivio@redhat.com>2024-05-02 16:13:21 +0200
commit9e22c53aa92552bd5c015c2597512056f8def4d8 (patch)
treeb4068984c67af419bbeaf6aad34c9d6921b5d034 /checksum.c
parent1095a7b0c9a150cb488ff5bd5fd74c897dd9236e (diff)
downloadpasst-9e22c53aa92552bd5c015c2597512056f8def4d8.tar
passt-9e22c53aa92552bd5c015c2597512056f8def4d8.tar.gz
passt-9e22c53aa92552bd5c015c2597512056f8def4d8.tar.bz2
passt-9e22c53aa92552bd5c015c2597512056f8def4d8.tar.lz
passt-9e22c53aa92552bd5c015c2597512056f8def4d8.tar.xz
passt-9e22c53aa92552bd5c015c2597512056f8def4d8.tar.zst
passt-9e22c53aa92552bd5c015c2597512056f8def4d8.zip
checksum: Make csum_ip4_header() take a host endian length
csum_ip4_header() takes the packet length as a network endian value. In general it's very error-prone to pass non-native-endian values as a raw integer. It's particularly bad here because this differs from other checksum functions (e.g. proto_ipv4_header_psum()) which take host native lengths. It turns out all the callers have easy access to the native endian value, so switch it to use host order like everything else. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'checksum.c')
-rw-r--r--checksum.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/checksum.c b/checksum.c
index a5a506c..b330e1e 100644
--- a/checksum.c
+++ b/checksum.c
@@ -116,7 +116,7 @@ uint16_t csum_fold(uint32_t sum)
/**
* csum_ip4_header() - Calculate IPv4 header checksum
- * @tot_len: IPv4 payload length (data + IP header, network order)
+ * @tot_len: IPv4 packet length (data + IP header, host order)
* @protocol: Protocol number
* @saddr: IPv4 source address
* @daddr: IPv4 destination address
@@ -128,7 +128,7 @@ uint16_t csum_ip4_header(uint16_t tot_len, uint8_t protocol,
{
uint32_t sum = L2_BUF_IP4_PSUM(protocol);
- sum += tot_len;
+ sum += htons(tot_len);
sum += (saddr.s_addr >> 16) & 0xffff;
sum += saddr.s_addr & 0xffff;
sum += (daddr.s_addr >> 16) & 0xffff;