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