blob: ed6868a9c16e0d16cc117c6e62643dc9a51f335a [file] [log] [blame]
Forest Bond5449c682009-04-25 10:30:44 -04001/*
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 *
Justin P. Mattock789d1ae2012-08-20 08:43:13 -070021 * Purpose: Implement functions to calculate CRC
Forest Bond5449c682009-04-25 10:30:44 -040022 *
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
Forest Bond5449c682009-04-25 10:30:44 -040036#include "tcrc.h"
Forest Bond5449c682009-04-25 10:30:44 -040037
38/*--------------------- Static Definitions -------------------------*/
39
40/*--------------------- Static Classes ----------------------------*/
41
42/*--------------------- Static Variables --------------------------*/
43
44// 32-bit CRC table
Charles Clément0f4c60d2010-06-24 11:02:25 -070045static const unsigned long s_adwCrc32Table[256] = {
Joe Perches9eb6c752013-03-18 10:45:03 -070046 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
Forest Bond5449c682009-04-25 10:30:44 -0400110};
111
112/*--------------------- Static Functions --------------------------*/
113
114/*--------------------- Export Variables --------------------------*/
115
Forest Bond5449c682009-04-25 10:30:44 -0400116/*+
117 *
118 * Description:
119 * Generate a CRC-32 from the data stream
120 *
121 * Parameters:
122 * In:
123 * pbyData - the data stream
124 * cbByte - the length of the stream
125 * dwCrcSeed - Seed for CRC32
126 * Out:
127 * none
128 *
129 * Return Value: CRC-32
130 *
Joe Perches9eb6c752013-03-18 10:45:03 -0700131 -*/
132unsigned long CRCdwCrc32(unsigned char *pbyData, unsigned int cbByte, unsigned long dwCrcSeed)
Forest Bond5449c682009-04-25 10:30:44 -0400133{
Joe Perches9eb6c752013-03-18 10:45:03 -0700134 unsigned long dwCrc;
Forest Bond5449c682009-04-25 10:30:44 -0400135
Joe Perches9eb6c752013-03-18 10:45:03 -0700136 dwCrc = dwCrcSeed;
137 while (cbByte--) {
138 dwCrc = s_adwCrc32Table[(unsigned char)((dwCrc ^ (*pbyData)) & 0xFF)] ^ (dwCrc >> 8);
139 pbyData++;
140 }
Forest Bond5449c682009-04-25 10:30:44 -0400141
Joe Perches9eb6c752013-03-18 10:45:03 -0700142 return dwCrc;
Forest Bond5449c682009-04-25 10:30:44 -0400143}
144
Forest Bond5449c682009-04-25 10:30:44 -0400145/*+
146 *
147 * Description:
148 * To test CRC generator, input 8 bytes packet
149 * -- 0xff 0xff 0xff 0xff 0x00 0x00 0x00 0x00
150 * the generated CRC should be
151 * -- 0xff 0xff 0xff 0xff
152 *
153 * Parameters:
154 * In:
155 * pbyData - the data stream
156 * cbByte - the length of the stream
157 * Out:
158 * none
159 *
160 * Return Value: CRC-32
161 *
Joe Perches9eb6c752013-03-18 10:45:03 -0700162 -*/
163unsigned long CRCdwGetCrc32(unsigned char *pbyData, unsigned int cbByte)
Forest Bond5449c682009-04-25 10:30:44 -0400164{
Joe Perches9eb6c752013-03-18 10:45:03 -0700165 return ~CRCdwCrc32(pbyData, cbByte, 0xFFFFFFFFL);
Forest Bond5449c682009-04-25 10:30:44 -0400166}
167
Forest Bond5449c682009-04-25 10:30:44 -0400168/*+
169 *
170 * Description:
171 *
172 * NOTE.... Because CRCdwGetCrc32Ex() is an iteration function,
173 * this means we will use the output of CRCdwGetCrc32Ex()
174 * to be a new argument to do next CRCdwGetCrc32Ex() calculation.
175 * Thus, the final result must be inverted to be the
176 * correct answer.
177 *
178 * Parameters:
179 * In:
180 * pbyData - the data stream
181 * cbByte - the length of the stream
182 * Out:
183 * none
184 *
185 * Return Value: CRC-32
186 *
Joe Perches9eb6c752013-03-18 10:45:03 -0700187 -*/
Charles Clément0f4c60d2010-06-24 11:02:25 -0700188unsigned long CRCdwGetCrc32Ex(unsigned char *pbyData, unsigned int cbByte, unsigned long dwPreCRC)
Forest Bond5449c682009-04-25 10:30:44 -0400189{
Joe Perches9eb6c752013-03-18 10:45:03 -0700190 return CRCdwCrc32(pbyData, cbByte, dwPreCRC);
Forest Bond5449c682009-04-25 10:30:44 -0400191}