diff options
author | Ronnie Sahlberg <ronniesahlberg@gmail.com> | 2008-05-14 12:25:55 +1000 |
---|---|---|
committer | Ronnie Sahlberg <ronniesahlberg@gmail.com> | 2008-05-14 12:25:55 +1000 |
commit | 7178dfb6569ec213d4a14f6b81cc2684df97c2e4 (patch) | |
tree | 8315755d0f5d726df90d5d0e712fab6b0f03e8b4 /ctdb/common/system_linux.c | |
parent | d3e24f744aa2ff5bb5129f7996433a70186dced8 (diff) | |
download | samba-7178dfb6569ec213d4a14f6b81cc2684df97c2e4.tar.gz samba-7178dfb6569ec213d4a14f6b81cc2684df97c2e4.tar.xz samba-7178dfb6569ec213d4a14f6b81cc2684df97c2e4.zip |
add a checksum routine for tcp over ipv6
(This used to be ctdb commit b712762a1b8a3028625085e32136df4458b292c0)
Diffstat (limited to 'ctdb/common/system_linux.c')
-rw-r--r-- | ctdb/common/system_linux.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/ctdb/common/system_linux.c b/ctdb/common/system_linux.c index 207387fe89..b9de2fb8ec 100644 --- a/ctdb/common/system_linux.c +++ b/ctdb/common/system_linux.c @@ -177,6 +177,30 @@ static uint16_t tcp_checksum(uint16_t *data, size_t n, struct iphdr *ip) } /* + 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. |