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