aboutsummaryrefslogtreecommitdiff
path: root/cksum.c
blob: b0215336822073ca770c4b7ac18e5bf50a50e7c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/*

(C) 2009-2011 Mika Ilmaranta <ilmis@nullnet.fi>

License: GPLv2

*/

#include "cksum.h"

int in_cksum(u_short *p, int n)
{
	register u_short answer;
	register long sum = 0;
	u_short odd_byte = 0;

	while(n > 1) {
		sum += *p++;
		n -= 2;
	}

	/* mop up an odd byte, if necessary */
	if(n == 1){
		*(u_char*)(&odd_byte) = *(u_char*)p;
		sum += odd_byte;
	}

	sum = (sum >> 16) + (sum & 0xffff);	/* add hi 16 to low 16 */
	sum += (sum >> 16);			/* add carry */
	answer = ~sum;				/* ones-complement, truncate */

	return(answer);
}

/* EOF */