xref: /386bsd/usr/src/usr.sbin/timed/timed/cksum.i386.c (revision a2142627)
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, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33 
34 #ifndef lint
35 static char sccsid[] = "@(#)cksum.tahoe.c	2.4 (Berkeley) 6/1/90";
36 #endif /* not lint */
37 
38 #include <sys/types.h>
39 
40 /*
41  * Checksum routine for Internet Protocol family headers.
42  *
43  * This routine is very heavily used in the network
44  * code and should be modified for each CPU to be as fast as possible.
45  *
46  * This implementation is TAHOE version.
47  */
48 
49 #undef	ADDCARRY
50 #define ADDCARRY(sum) { \
51 	if (sum & 0xffff0000) {	\
52 		sum &= 0xffff; \
53 		sum++; \
54 	} \
55 }
56 
57 in_cksum(addr, len)
58 	register u_short *addr;
59 	register int len;
60 {
61 	union word {
62 		char	c[2];
63 		u_short	s;
64 	} u;
65 	register int sum = 0;
66 
67 	while (len > 0) {
68 		/*
69 		 * add by words.
70 		 */
71 		while ((len -= 2) >= 0) {
72 			if ((int)addr & 0x1) {
73 				/* word is not aligned */
74 				u.c[0] = *(char *)addr;
75 				u.c[1] = *((char *)addr+1);
76 				sum += u.s;
77 				addr++;
78 			} else
79 				sum += *addr++;
80 			ADDCARRY(sum);
81 		}
82 		if (len == -1)
83 			/*
84 			 * Odd number of bytes.
85 			 */
86 			u.c[0] = *(u_char *)addr;
87 	}
88 	if (len == -1) {
89 		/* The last mbuf has odd # of bytes. Follow the
90 		   standard (the odd byte is shifted left by 8 bits) */
91 		u.c[1] = 0;
92 		sum += u.s;
93 		ADDCARRY(sum);
94 	}
95 	return (~sum & 0xffff);
96 }
97