# Incorrect ethernet crc code

I am trying to use the ethernet phy on my FPGA. I am at the point where I can receive a frame. The frame I can see using chipscope matches the data of the frame sent from my computer which I can confirm using tcpdump. However the crc I am computing does not seem to match. The last 4 bytes of my packet as seen on the card are 0x4b504124. However, both my on card calculation and C++ calculation which match are 0xC3899D7. I thought the c code which I copied from somewhere was correct for ethernet. I checked it against some other c code I found and they match. Can someone point me to a correct implementation of c code for ethernet crc, or tell me what I am doing wrong?

unsigned int crc32b(unsigned char *message, int sz) {
int i, j;

i = 0;
crc = 0xFFFFFFFF;
while (i < sz) {
byte = message[i];            // Get next byte.
crc = crc ^ byte;
for (j = 7; j >= 0; j--) {    // Do eight times.
crc = (crc >> 1) ^ (0xEDB88320 & mask);
}
i = i + 1;
}
return ~crc;
}
...
uint16_t buf[] =
{
0x3333, 0x0000, 0x00fb, 0x0050, 0xb624, 0x9756, 0x86dd, 0x600b,
0xa860, 0x0035, 0x11ff, 0xfe80, 0x0000, 0x0000, 0x0000, 0x6191,
0xd947, 0x7f85, 0xc538, 0xff02, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x00fb, 0x14e9, 0x14e9, 0x0035, 0x7e5c, 0x0000,
0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x055f, 0x6970, 0x7073,
0x045f, 0x7463, 0x7005, 0x6c6f, 0x6361, 0x6c00, 0x000c, 0x0001,
0x045f, 0x6970, 0x70c0, 0x1200, 0x0c00, 0x0001
};
unsigned char* data = (unsigned char*)buf;
std::cout << crc32(data, sizeof(buf)) << std::endl;

• Could you include a dump of the packet you are sending? When you calculated the CRC, did you do it for the whole packet? or did you exclude the last 4 bytes? – Tom Carpenter Jul 6 '18 at 11:06
• I excluded the last 4 bytes. The data in buf is the packet data. – chasep255 Jul 6 '18 at 11:19
• Does the FPGA initialize its CRC generator with the same code (0xEDB88320)? – Lior Bilia Jul 6 '18 at 12:14
• No it uses 0xFFFFFFFF as the initial crc. I don't think 0xEDB88320 is the correct initial value. – chasep255 Jul 6 '18 at 12:36
• Also, why is your buf a bunch of int16 instead of int8 or char? You sure that's being interpreted correctly? – alex.forencich Jul 7 '18 at 18:10