crc32.c revision 29868
1256694Snp/* 2256694Snp * This code implements the AUTODIN II polynomial used by Ethernet, 3256694Snp * and can be used to calculate multicast address hash indices. 4256694Snp * It assumes that the low order bits will be transmitted first, 5256694Snp * and consequently the low byte should be sent first when 6256694Snp * the crc computation is finished. The crc should be complemented 7256694Snp * before transmission. 8256694Snp * The variable corresponding to the macro argument "crc" should 9256694Snp * be an unsigned long and should be preset to all ones for Ethernet 10256694Snp * use. An error-free packet will leave 0xDEBB20E3 in the crc. 11256694Snp * Spencer Garrett <srg@quick.com> 12256694Snp */ 13256694Snp 14256694Snp#define CRC(crc, ch) (crc = (crc >> 8) ^ crctab[(crc ^ (ch)) & 0xff]) 15256694Snp 16256694Snp/* generated using the AUTODIN II polynomial 17256694Snp * x^32 + x^26 + x^23 + x^22 + x^16 + 18256694Snp * x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1 19256694Snp */ 20256694Snpunsigned long crctab[256] = { 21256694Snp 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 22256694Snp 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 23256694Snp 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 24256694Snp 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 25256694Snp 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 26256694Snp 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 27256694Snp 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 28256694Snp 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 29256694Snp 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 30256694Snp 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 31256694Snp 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 32256694Snp 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 33256694Snp 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 34256694Snp 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 35256694Snp 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 36256694Snp 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 37256694Snp 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 38256694Snp 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 39256694Snp 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 40256694Snp 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 41256694Snp 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 42256694Snp 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 43256694Snp 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 44256694Snp 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 45256694Snp 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 46256694Snp 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 47256694Snp 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 48256694Snp 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 49256694Snp 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 50256694Snp 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 51256694Snp 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 52256694Snp 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 53256694Snp 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 54256694Snp 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 55256694Snp 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 56256694Snp 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 57256694Snp 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 58256694Snp 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 59256694Snp 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 60256694Snp 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 61256694Snp 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 62256694Snp 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 63256694Snp 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 64256694Snp 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 65256694Snp 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 66256694Snp 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 67256694Snp 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 68256694Snp 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 69256694Snp 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 70256694Snp 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 71256694Snp 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 72256694Snp 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 73256694Snp 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 74256694Snp 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 75256694Snp 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 76256694Snp 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 77256694Snp 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 78256694Snp 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 79256694Snp 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 80256694Snp 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 81256694Snp 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 82256694Snp 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 83256694Snp 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 84256694Snp 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, 85256694Snp}; 86256694Snp 87256694Snp#include <stdio.h> 88256694Snp#include <sys/types.h> 89256694Snp 90256694Snpu_long crc32_total = 0 ; 91256694Snp 92256694Snpcrc32(fd, cval, clen) 93256694Snp register int fd; 94256694Snp u_long *cval, *clen; 95256694Snp{ 96256694Snp u_long crc = ~0; 97256694Snp char buf[BUFSIZ], *p ; 98256694Snp int len, nr ; 99256694Snp FILE *in; 100256694Snp 101256694Snp len = 0 ; 102256694Snp crc32_total = ~crc32_total ; 103256694Snp while (nr = read(fd, buf, sizeof(buf))) 104256694Snp for (len += nr, p = buf; nr--; ++p) { 105256694Snp CRC(crc, *p) ; 106256694Snp CRC(crc32_total, *p) ; 107256694Snp } 108256694Snp if (nr < 0) 109256694Snp return 1 ; 110256694Snp 111256694Snp *clen = len ; 112256694Snp *cval = ~crc ; 113256694Snp crc32_total = ~crc32_total ; 114256694Snp return 0 ; 115256694Snp} 116256694Snp