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