Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.13 191 lines 6.6 kB view raw
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 45static 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 * 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 * 131 -*/ 132unsigned long CRCdwCrc32(unsigned char *pbyData, unsigned int cbByte, unsigned long dwCrcSeed) 133{ 134 unsigned long dwCrc; 135 136 dwCrc = dwCrcSeed; 137 while (cbByte--) { 138 dwCrc = s_adwCrc32Table[(unsigned char)((dwCrc ^ (*pbyData)) & 0xFF)] ^ (dwCrc >> 8); 139 pbyData++; 140 } 141 142 return dwCrc; 143} 144 145/*+ 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 * 162 -*/ 163unsigned long CRCdwGetCrc32(unsigned char *pbyData, unsigned int cbByte) 164{ 165 return ~CRCdwCrc32(pbyData, cbByte, 0xFFFFFFFFL); 166} 167 168/*+ 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 * 187 -*/ 188unsigned long CRCdwGetCrc32Ex(unsigned char *pbyData, unsigned int cbByte, unsigned long dwPreCRC) 189{ 190 return CRCdwCrc32(pbyData, cbByte, dwPreCRC); 191}