Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
tcrc.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2003 VIA Networking, Inc. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  *
18  *
19  * File: tcrc.c
20  *
21  * Purpose: Implement functions to calculate CRC
22  *
23  * Author: Tevin Chen
24  *
25  * Date: May 21, 1996
26  *
27  * Functions:
28  * CRCdwCrc32 -
29  * CRCdwGetCrc32 -
30  * CRCdwGetCrc32Ex -
31  *
32  * Revision History:
33  *
34  */
35 
36 #include "tcrc.h"
37 
38 /*--------------------- Static Definitions -------------------------*/
39 
40 /*--------------------- Static Classes ----------------------------*/
41 
42 /*--------------------- Static Variables --------------------------*/
43 
44 // 32-bit CRC table
45 static const unsigned long s_adwCrc32Table[256] = {
46  0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,
47  0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,
48  0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,
49  0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,
50  0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,
51  0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,
52  0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,
53  0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,
54  0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,
55  0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,
56  0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,
57  0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,
58  0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,
59  0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,
60  0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,
61  0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,
62  0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,
63  0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,
64  0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,
65  0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,
66  0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,
67  0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,
68  0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,
69  0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,
70  0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,
71  0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,
72  0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,
73  0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,
74  0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,
75  0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,
76  0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,
77  0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,
78  0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,
79  0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,
80  0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,
81  0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,
82  0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,
83  0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,
84  0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,
85  0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,
86  0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,
87  0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,
88  0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,
89  0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,
90  0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,
91  0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,
92  0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,
93  0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,
94  0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,
95  0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,
96  0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,
97  0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,
98  0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,
99  0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,
100  0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,
101  0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,
102  0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,
103  0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,
104  0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,
105  0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,
106  0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,
107  0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,
108  0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,
109  0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL
110 };
111 
112 /*--------------------- Static Functions --------------------------*/
113 
114 /*--------------------- Export Variables --------------------------*/
115 
116 
117 
118 
119 /*+
120  *
121  * Description:
122  * Generate a CRC-32 from the data stream
123  *
124  * Parameters:
125  * In:
126  * pbyData - the data stream
127  * cbByte - the length of the stream
128  * dwCrcSeed - Seed for CRC32
129  * Out:
130  * none
131  *
132  * Return Value: CRC-32
133  *
134 -*/
135 unsigned long CRCdwCrc32 (unsigned char *pbyData, unsigned int cbByte, unsigned long dwCrcSeed)
136 {
137  unsigned long dwCrc;
138 
139  dwCrc = dwCrcSeed;
140  while (cbByte--) {
141  dwCrc = s_adwCrc32Table[(unsigned char)((dwCrc ^ (*pbyData)) & 0xFF)] ^ (dwCrc >> 8);
142  pbyData++;
143  }
144 
145  return dwCrc;
146 }
147 
148 
149 /*+
150  *
151  * Description:
152  * To test CRC generator, input 8 bytes packet
153  * -- 0xff 0xff 0xff 0xff 0x00 0x00 0x00 0x00
154  * the generated CRC should be
155  * -- 0xff 0xff 0xff 0xff
156  *
157  * Parameters:
158  * In:
159  * pbyData - the data stream
160  * cbByte - the length of the stream
161  * Out:
162  * none
163  *
164  * Return Value: CRC-32
165  *
166 -*/
167 unsigned long CRCdwGetCrc32 (unsigned char *pbyData, unsigned int cbByte)
168 {
169  return ~CRCdwCrc32(pbyData, cbByte, 0xFFFFFFFFL);
170 }
171 
172 
173 /*+
174  *
175  * Description:
176  *
177  * NOTE.... Because CRCdwGetCrc32Ex() is an iteration function,
178  * this means we will use the output of CRCdwGetCrc32Ex()
179  * to be a new argument to do next CRCdwGetCrc32Ex() calculation.
180  * Thus, the final result must be inverted to be the
181  * correct answer.
182  *
183  * Parameters:
184  * In:
185  * pbyData - the data stream
186  * cbByte - the length of the stream
187  * Out:
188  * none
189  *
190  * Return Value: CRC-32
191  *
192 -*/
193 unsigned long CRCdwGetCrc32Ex(unsigned char *pbyData, unsigned int cbByte, unsigned long dwPreCRC)
194 {
195  return CRCdwCrc32(pbyData, cbByte, dwPreCRC);
196 }
197 
198