--- a/nat64.c +++ b/nat64.c @@ -19,6 +19,11 @@ extern struct config *gcfg; +static uint16_t checksum_extend_byte(uint8_t b) +{ + return htons(b << 8); +} + static uint16_t ip_checksum(void *d, int c) { uint32_t sum = 0xffff; @@ -30,7 +35,7 @@ static uint16_t ip_checksum(void *d, int } if (c) - sum += htons(*((uint8_t *)p) << 8); + sum += checksum_extend_byte(*((uint8_t *)p)); while (sum > 0xffff) sum = (sum & 0xffff) + (sum >> 16); @@ -180,10 +185,12 @@ static int xlate_payload_4to6(struct pkt cksum = ones_add(p->icmp->cksum, cksum); if (p->icmp->type == 8) { p->icmp->type = 128; - p->icmp->cksum = ones_add(cksum, ~(128 - 8)); + p->icmp->cksum = ones_add(cksum, + ~checksum_extend_byte(128 - 8)); } else { p->icmp->type = 129; - p->icmp->cksum = ones_add(cksum, ~(129 - 0)); + p->icmp->cksum = ones_add(cksum, + ~checksum_extend_byte(129 - 0)); } return 0; case 17: @@ -668,10 +675,12 @@ static int xlate_payload_6to4(struct pkt cksum = ones_add(p->icmp->cksum, cksum); if (p->icmp->type == 128) { p->icmp->type = 8; - p->icmp->cksum = ones_add(cksum, 128 - 8); + p->icmp->cksum = ones_add(cksum, + checksum_extend_byte(128 - 8)); } else { p->icmp->type = 0; - p->icmp->cksum = ones_add(cksum, 129 - 0); + p->icmp->cksum = ones_add(cksum, + checksum_extend_byte(129 - 0)); } return 0; case 17: