计算GFP有效载荷FCS

时间:2014-07-05 01:35:28

标签: c crc32

我正在尝试计算GFP(通用成帧过程)帧的有效载荷FCS(pFCS),但无法获得正确的值。

我所做的是对有效载荷进行解扰,并在从有效载荷头(4字节PTI,PFI,EXI,UPI,eHEC)开始到GFP PDU末尾的字节上使用CRC32,不包括4字节pFCS。我使用的CRC32代码来自echo47's post

#include <stdio.h>

int main(void)
{
  unsigned char data[] =
  {
    0x00, 0x0A, 0xE6, 0xF0, 0x05, 0xA3, 0x00, 0x12,
    0x34, 0x56, 0x78, 0x90, 0x08, 0x00, 0x45, 0x00,
    0x00, 0x30, 0xB3, 0xFE, 0x00, 0x00, 0x80, 0x11,
    0x72, 0xBA, 0x0A, 0x00, 0x00, 0x03, 0x0A, 0x00,
    0x00, 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x1C,
    0x89, 0x4D, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
    0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
    0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13
  };
  unsigned int crc_table[] =
  {
    0x4DBDF21C, 0x500AE278, 0x76D3D2D4, 0x6B64C2B0,
    0x3B61B38C, 0x26D6A3E8, 0x000F9344, 0x1DB88320,
    0xA005713C, 0xBDB26158, 0x9B6B51F4, 0x86DC4190,
    0xD6D930AC, 0xCB6E20C8, 0xEDB71064, 0xF0000000
  };
  unsigned int n, crc=0;

  for (n=0; n<sizeof(data); n++)
  {
    crc = (crc >> 4) ^ crc_table[(crc ^ (data[n] >> 0)) & 0x0F];  /* lower nibble */
    crc = (crc >> 4) ^ crc_table[(crc ^ (data[n] >> 4)) & 0x0F];  /* upper nibble */
  }
  for (n=0; n<4; n++)  /* display the CRC, lower byte first */
  {
    printf("%02X ", crc & 0xFF);
    crc >>= 8;
  }
  printf("\n");
  return 0;
}

我能够使用此CRC32代码来获取正确的以太网FCS,但不能使用GFP pFCS。 eHEC也是正确的价值。我是否错误地计算了pFCS,还是需要使用不同的CRC32计算方法?

1 个答案:

答案 0 :(得分:2)

在使用CRC calculator code并将#define REVERSED_DATATRUE更改为FALSE后,我终于能够为GFP帧获取正确的CRC32值。

我猜我以前无法获得正确的值,因为比特的发送顺序。与以太网相比,GFP以相反的方向发送比特,如post中所述。