OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / user / hping / cksum.c
1 /* $Id: cksum.c,v 1.3 2004/04/14 12:30:18 antirez Exp $  */
2
3 #include "hping2.h"     /* only for arch semi-indipendent data types */
4 #include "globals.h"
5
6 /*
7  * from R. Stevens's Network Programming
8  */
9 __u16 cksum(__u16 *buf, int nbytes)
10 {
11         __u32 sum;
12         __u16 oddbyte;
13
14         sum = 0;
15         while (nbytes > 1) {
16                 sum += *buf++;
17                 nbytes -= 2;
18         }
19
20         if (nbytes == 1) {
21                 oddbyte = 0;
22                 *((__u16 *) &oddbyte) = *(__u16 *) buf;
23                 sum += oddbyte;
24         }
25
26         sum = (sum >> 16) + (sum & 0xffff);
27         sum += (sum >> 16);
28
29         /* return a bad checksum with --badcksum option */
30         if (opt_badcksum) sum ^= 0x5555;
31
32         return (__u16) ~sum;
33 }