aboutgitcodebugslistschat
path: root/tap.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 /tap.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 'tap.c')
-rw-r--r--tap.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/tap.c b/tap.c
index d0ef6b5..230566b 100644
--- a/tap.c
+++ b/tap.c
@@ -149,17 +149,19 @@ static void *tap_push_l2h(const struct ctx *c, void *buf, uint16_t proto)
static void *tap_push_ip4h(struct iphdr *ip4h, struct in_addr src,
struct in_addr dst, size_t len, uint8_t proto)
{
+ uint16_t tot_len = len + sizeof(*ip4h);
+
ip4h->version = 4;
ip4h->ihl = sizeof(struct iphdr) / 4;
ip4h->tos = 0;
- ip4h->tot_len = htons(len + sizeof(*ip4h));
+ ip4h->tot_len = htons(tot_len);
ip4h->id = 0;
ip4h->frag_off = 0;
ip4h->ttl = 255;
ip4h->protocol = proto;
ip4h->saddr = src.s_addr;
ip4h->daddr = dst.s_addr;
- ip4h->check = csum_ip4_header(ip4h->tot_len, proto, src, dst);
+ ip4h->check = csum_ip4_header(tot_len, proto, src, dst);
return ip4h + 1;
}