Código de Ethernet incorrecto

0

Estoy tratando de usar el phy ethernet en mi FPGA. Estoy en el punto donde puedo recibir un marco. El marco que puedo ver usando el chipscopio coincide con los datos del marco enviado desde mi computadora, que puedo confirmar usando tcpdump. Sin embargo, el crc que estoy calculando no parece coincidir. Los últimos 4 bytes de mi paquete como se ve en la tarjeta son 0x4b504124. Sin embargo, tanto el cálculo de mi tarjeta como el de C ++ que coinciden son 0xC3899D7. Pensé que el código c que copié de algún lugar era correcto para Ethernet. Lo comprobé contra otro código c que encontré y coinciden. ¿Alguien puede indicarme una implementación correcta del código c para ethernet crc o decirme qué estoy haciendo mal?

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

   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.
         mask = -(crc & 1);
         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;
    
pregunta chasep255

0 respuestas

Lea otras preguntas en las etiquetas