aboutsummaryrefslogtreecommitdiff
path: root/src/vpn/gnunet-vpn-checksum.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vpn/gnunet-vpn-checksum.c')
-rw-r--r--src/vpn/gnunet-vpn-checksum.c32
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
29uint32_t calculate_checksum_update(uint32_t sum, uint16_t *hdr, short len) { 29uint32_t
30 for(; len >= 2; len -= 2) 30calculate_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
37uint16_t calculate_checksum_end(uint32_t sum) { 39uint16_t
38 while (sum >> 16) 40calculate_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 */
47uint16_t 51uint16_t
48calculate_ip_checksum(uint16_t* hdr, short len) { 52calculate_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}