|
|
1.1 ! root 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 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.tahoe.c 2.3 (Berkeley) 6/18/88"; ! 20: #endif /* not lint */ ! 21: ! 22: #include <sys/types.h> ! 23: ! 24: /* ! 25: * Checksum routine for Internet Protocol family headers. ! 26: * ! 27: * This routine is very heavily used in the network ! 28: * code and should be modified for each CPU to be as fast as possible. ! 29: * ! 30: * This implementation is TAHOE version. ! 31: */ ! 32: ! 33: #undef ADDCARRY ! 34: #define ADDCARRY(sum) { \ ! 35: if (sum & 0xffff0000) { \ ! 36: sum &= 0xffff; \ ! 37: sum++; \ ! 38: } \ ! 39: } ! 40: ! 41: in_cksum(addr, len) ! 42: register u_short *addr; ! 43: register int len; ! 44: { ! 45: union word { ! 46: char c[2]; ! 47: u_short s; ! 48: } u; ! 49: register int sum = 0; ! 50: ! 51: while (len > 0) { ! 52: /* ! 53: * add by words. ! 54: */ ! 55: while ((len -= 2) >= 0) { ! 56: if ((int)addr & 0x1) { ! 57: /* word is not aligned */ ! 58: u.c[0] = *(char *)addr; ! 59: u.c[1] = *((char *)addr+1); ! 60: sum += u.s; ! 61: addr++; ! 62: } else ! 63: sum += *addr++; ! 64: ADDCARRY(sum); ! 65: } ! 66: if (len == -1) ! 67: /* ! 68: * Odd number of bytes. ! 69: */ ! 70: u.c[0] = *(u_char *)addr; ! 71: } ! 72: if (len == -1) { ! 73: /* The last mbuf has odd # of bytes. Follow the ! 74: standard (the odd byte is shifted left by 8 bits) */ ! 75: u.c[1] = 0; ! 76: sum += u.s; ! 77: ADDCARRY(sum); ! 78: } ! 79: return (~sum & 0xffff); ! 80: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.