add a checksum routine for tcp over ipv6
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Wed, 14 May 2008 02:25:55 +0000 (12:25 +1000)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Wed, 14 May 2008 02:25:55 +0000 (12:25 +1000)
common/system_linux.c

index 207387fe899558090104d57122def2e76c75699b..b9de2fb8ecfb896f00b4f121758de0d85eeb789f 100644 (file)
@@ -176,6 +176,30 @@ static uint16_t tcp_checksum(uint16_t *data, size_t n, struct iphdr *ip)
        return sum2;
 }
 
+/*
+  calculate the tcp checksum for tcp over ipv6
+*/
+static uint16_t tcp_checksum6(uint16_t *data, size_t n, struct ip6_hdr *ip6)
+{
+       uint32_t sum = uint16_checksum(data, n);
+       uint16_t sum2;
+
+       int i;
+       sum += uint16_checksum((uint16_t *)(void *)&ip6->ip6_src, 16);
+       sum += uint16_checksum((uint16_t *)(void *)&ip6->ip6_dst, 16);
+       sum += ip6->ip6_plen;
+       sum += ip6->ip6_nxt;
+                       
+       sum = (sum & 0xFFFF) + (sum >> 16);
+       sum = (sum & 0xFFFF) + (sum >> 16);
+       sum2 = htons(sum);
+       sum2 = ~sum2;
+       if (sum2 == 0) {
+               return 0xFFFF;
+       }
+       return sum2;
+}
+
 /*
   Send tcp segment from the specified IP/port to the specified
   destination IP/port.