diff options
| author | Lucas Castro <lucas@gnuabordo.com.br> | 2024-01-10 22:33:44 -0300 |
|---|---|---|
| committer | Lucas Castro <lucas@gnuabordo.com.br> | 2024-01-10 22:33:44 -0300 |
| commit | a4270020addc324fb60d2b1b446b41bc31e3baf8 (patch) | |
| tree | 8708f08c66a63f08c0cd88ab1a46faadcd3f4706 /cksum.c | |
Import Upstream version 1.0.4upstream/1.0.4
Diffstat (limited to 'cksum.c')
| -rw-r--r-- | cksum.c | 35 |
1 files changed, 35 insertions, 0 deletions
@@ -0,0 +1,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 */ |
