Added CRC code for use in calculating ethernet CRCs.

This commit is contained in:
Gregory Alexander 2001-06-17 22:39:57 +00:00
parent d0f1caa404
commit b94d9a6656
2 changed files with 62 additions and 0 deletions

43
bochs/iodev/crc32.cc Normal file
View File

@ -0,0 +1,43 @@
/* CRC-32 calculator
* Adapted from http://www.createwindow.org/programming/crc32/
*/
#include "crc32.h"
CRC_Generator::CRC_Generator() { init(); }
void CRC_Generator::init(void) {
Bit32u POLYNOMIAL = 0x04c11db7;
int i;
for(i = 0; i<0xFF; i++) {
int j;
crc32_table[i]=reflect(i,8) << 24;
for(j=0; j<8; j++)
crc32_table[i] = (crc32_table[i]<<1)^(crc_table[i] & (1<<31) ? POLYNOMIAL : 0);
crc32_table[i] = reflect(crc32_table[i], 32);
}
}
Bit32u CRC_Generator::reflect(Bit32u ref, Bit8u ch) {
Bit32u value(0);
int i;
for(i=1; i<(ch+1); i++) {
if(ref & 1)
value |= 1 << (ch-i);
ref >>= 1;
}
return value;
}
Bit32u CRC_Generator::get_CRC(Bit8u * buf, Bit32u buflen) {
Bit32u ulCRC(0xFFFFFFFF);
Bit32u len(buflen);
Bit8u * buffer=(Bit8u *) buf;
while(len--)
ulCRC=(ulCRC>>8)^crc32_table[(ulCRC & 0xFF)^*buffer++];
return ulCRC ^ 0xFFFFFFFF;
}

19
bochs/iodev/crc32.h Normal file
View File

@ -0,0 +1,19 @@
/* CRC-32 calculator
* Adapted from http://www.createwindow.org/programming/crc32/
*/
#ifndef _CRC_32_H_
#define _CRC_32_H_
class CRC_Generator {
private:
Bit32u crc32_table[256];
Bit32u reflect(Bit32u ref, Bit8u ch);
public:
void init(void);
CRC_Generator();
Bit32u get_CRC(Bit8u * buf, Bit32u buflen);
}
#endif //_CRC_32_H_