1 /*
2  * Copyright (c) 1983 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.m68000.c	2.3 (Berkeley) 06/18/88";
20 #endif /* not lint */
21 
22 #include "../globals.h"
23 #include <protocols/timed.h>
24 
25 /* computes the checksum for ip packets for a Motorola 68000 base computer */
26 
27 in_cksum(w, mlen)
28 	register u_short *w;
29 	register int mlen;
30 {
31 	register int sum = 0;
32 
33 	if (mlen > 0) {
34 		if (((int)w & 1) == 0) {
35 			sum = ocsum(w, mlen>>1);
36 			w += mlen>>1;
37 			if (mlen & 1) {
38 				sum += *(u_char *)w << 8;
39 				mlen = -1;
40 			}
41 		} else {
42 			u_short swsum;
43 
44 			sum = *(u_char *)w << 8;
45 			mlen--;
46 			w = (u_short *)(1 + (int)w);
47 			swsum = ocsum(w, mlen>>1);
48 			swab((char *)&swsum, (char *)&swsum, sizeof swsum);
49 			sum += swsum;
50 			w += mlen>>1;
51 			if (mlen & 1)
52 				sum += *(u_char *)w;
53 		}
54 	}
55 	sum = (sum & 0xFFFF) + (sum >> 16);
56 	sum = (sum & 0xFFFF) + (sum >> 16);
57 	sum = (~sum) & 0xFFFF;
58 	return (sum);
59 }
60