diff --git a/ipv6/tayga/patches/002-bigendian_wrong_checksum.patch b/ipv6/tayga/patches/002-bigendian_wrong_checksum.patch new file mode 100644 index 000000000..d8deac3a2 --- /dev/null +++ b/ipv6/tayga/patches/002-bigendian_wrong_checksum.patch @@ -0,0 +1,53 @@ +--- 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: