|
|
1.1 ! root 1: /* ! 2: * Little-endian CRC32 implementation. ! 3: * ! 4: * Copyright (c) 2009 Joshua Oreman <[email protected]>. ! 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 <ipxe/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.