1 /*-
2  * Copyright (c) 1983 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)cksum.m68000.c	2.4 (Berkeley) 04/20/91";
10 #endif /* not lint */
11 
12 #include "../globals.h"
13 #include <protocols/timed.h>
14 
15 /* computes the checksum for ip packets for a Motorola 68000 base computer */
16 
17 in_cksum(w, mlen)
18 	register u_short *w;
19 	register int mlen;
20 {
21 	register int sum = 0;
22 
23 	if (mlen > 0) {
24 		if (((int)w & 1) == 0) {
25 			sum = ocsum(w, mlen>>1);
26 			w += mlen>>1;
27 			if (mlen & 1) {
28 				sum += *(u_char *)w << 8;
29 				mlen = -1;
30 			}
31 		} else {
32 			u_short swsum;
33 
34 			sum = *(u_char *)w << 8;
35 			mlen--;
36 			w = (u_short *)(1 + (int)w);
37 			swsum = ocsum(w, mlen>>1);
38 			swab((char *)&swsum, (char *)&swsum, sizeof swsum);
39 			sum += swsum;
40 			w += mlen>>1;
41 			if (mlen & 1)
42 				sum += *(u_char *)w;
43 		}
44 	}
45 	sum = (sum & 0xFFFF) + (sum >> 16);
46 	sum = (sum & 0xFFFF) + (sum >> 16);
47 	sum = (~sum) & 0xFFFF;
48 	return (sum);
49 }
50