|
|
1.1 root 1: /*
2: * Copyright (c) 1986 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)cksum.tahoe.c 2.3 (Berkeley) 6/18/88";
20: #endif /* not lint */
21:
22: #include <sys/types.h>
23:
24: /*
25: * Checksum routine for Internet Protocol family headers.
26: *
27: * This routine is very heavily used in the network
28: * code and should be modified for each CPU to be as fast as possible.
29: *
30: * This implementation is TAHOE version.
31: */
32:
33: #undef ADDCARRY
34: #define ADDCARRY(sum) { \
35: if (sum & 0xffff0000) { \
36: sum &= 0xffff; \
37: sum++; \
38: } \
39: }
40:
41: in_cksum(addr, len)
42: register u_short *addr;
43: register int len;
44: {
45: union word {
46: char c[2];
47: u_short s;
48: } u;
49: register int sum = 0;
50:
51: while (len > 0) {
52: /*
53: * add by words.
54: */
55: while ((len -= 2) >= 0) {
56: if ((int)addr & 0x1) {
57: /* word is not aligned */
58: u.c[0] = *(char *)addr;
59: u.c[1] = *((char *)addr+1);
60: sum += u.s;
61: addr++;
62: } else
63: sum += *addr++;
64: ADDCARRY(sum);
65: }
66: if (len == -1)
67: /*
68: * Odd number of bytes.
69: */
70: u.c[0] = *(u_char *)addr;
71: }
72: if (len == -1) {
73: /* The last mbuf has odd # of bytes. Follow the
74: standard (the odd byte is shifted left by 8 bits) */
75: u.c[1] = 0;
76: sum += u.s;
77: ADDCARRY(sum);
78: }
79: return (~sum & 0xffff);
80: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.