summaryrefslogtreecommitdiffstats
path: root/ctdb/common/system_linux.c
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronniesahlberg@gmail.com>2008-05-14 12:25:55 +1000
committerRonnie Sahlberg <ronniesahlberg@gmail.com>2008-05-14 12:25:55 +1000
commit7178dfb6569ec213d4a14f6b81cc2684df97c2e4 (patch)
tree8315755d0f5d726df90d5d0e712fab6b0f03e8b4 /ctdb/common/system_linux.c
parentd3e24f744aa2ff5bb5129f7996433a70186dced8 (diff)
downloadsamba-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.c24
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.