diff options
Diffstat (limited to 'src/vpn/gnunet-vpn-checksum.c')
-rw-r--r-- | src/vpn/gnunet-vpn-checksum.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/src/vpn/gnunet-vpn-checksum.c b/src/vpn/gnunet-vpn-checksum.c index 81ec044dc..0e0e24cdc 100644 --- a/src/vpn/gnunet-vpn-checksum.c +++ b/src/vpn/gnunet-vpn-checksum.c | |||
@@ -26,26 +26,32 @@ | |||
26 | 26 | ||
27 | #include "gnunet-vpn-checksum.h" | 27 | #include "gnunet-vpn-checksum.h" |
28 | 28 | ||
29 | uint32_t calculate_checksum_update(uint32_t sum, uint16_t *hdr, short len) { | 29 | uint32_t |
30 | for(; len >= 2; len -= 2) | 30 | calculate_checksum_update (uint32_t sum, uint16_t * hdr, short len) |
31 | sum += *(hdr++); | 31 | { |
32 | if (len == 1) | 32 | for (; len >= 2; len -= 2) |
33 | sum += *((unsigned char*)hdr); | 33 | sum += *(hdr++); |
34 | return sum; | 34 | if (len == 1) |
35 | sum += *((unsigned char *) hdr); | ||
36 | return sum; | ||
35 | } | 37 | } |
36 | 38 | ||
37 | uint16_t calculate_checksum_end(uint32_t sum) { | 39 | uint16_t |
38 | while (sum >> 16) | 40 | calculate_checksum_end (uint32_t sum) |
39 | sum = (sum >> 16) + (sum & 0xFFFF); | 41 | { |
42 | while (sum >> 16) | ||
43 | sum = (sum >> 16) + (sum & 0xFFFF); | ||
40 | 44 | ||
41 | return ~sum; | 45 | return ~sum; |
42 | } | 46 | } |
43 | 47 | ||
44 | /** | 48 | /** |
45 | * Calculate the checksum of an IPv4-Header | 49 | * Calculate the checksum of an IPv4-Header |
46 | */ | 50 | */ |
47 | uint16_t | 51 | uint16_t |
48 | calculate_ip_checksum(uint16_t* hdr, short len) { | 52 | calculate_ip_checksum (uint16_t * hdr, short len) |
49 | uint32_t sum = calculate_checksum_update(0, hdr, len); | 53 | { |
50 | return calculate_checksum_end(sum); | 54 | uint32_t sum = calculate_checksum_update (0, hdr, len); |
55 | |||
56 | return calculate_checksum_end (sum); | ||
51 | } | 57 | } |