1 /* 2 * Little-endian CRC32 implementation. 3 * 4 * Copyright (c) 2009 Joshua Oreman <oremanj (at) rwcr.net>. 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License as 8 * published by the Free Software Foundation; either version 2 of the 9 * License, or any later version. 10 * 11 * This program is distributed in the hope that it will be useful, but 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 */ 20 21 FILE_LICENCE ( GPL2_OR_LATER ); 22 23 #include <gpxe/crc32.h> 24 25 #define CRCPOLY 0xedb88320 26 27 /** 28 * Calculate 32-bit little-endian CRC checksum 29 * 30 * @v seed Initial value 31 * @v data Data to checksum 32 * @v len Length of data 33 * 34 * Usually @a seed is initially zero or all one bits, depending on the 35 * protocol. To continue a CRC checksum over multiple calls, pass the 36 * return value from one call as the @a seed parameter to the next. 37 */ 38 u32 crc32_le ( u32 seed, const void *data, size_t len ) 39 { 40 u32 crc = seed; 41 const u8 *src = data; 42 u32 mult; 43 int i; 44 45 while ( len-- ) { 46 crc ^= *src++; 47 for ( i = 0; i < 8; i++ ) { 48 mult = ( crc & 1 ) ? CRCPOLY : 0; 49 crc = ( crc >> 1 ) ^ mult; 50 } 51 } 52 53 return crc; 54 } 55