我试图计算GFP(通用成帧过程)帧的有效载荷FCS(pFCS),但无法得到正确的值。
我所做的是解扰有效载荷并对从有效载荷头(4字节PTI、PFI、EXI、UPI、eHEC)到GFP PDU结束的字节使用CRC32,不包括4字节pfc。我使用的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。肠出血性大肠杆菌也是正确的价值。我计算pFCS是错误的,还是需要使用不同的CRC32计算方法?
最佳答案
在使用CRC calculator code并将#define REVERSED_DATA
从TRUE
更改为FALSE
之后,我终于能够获得GFP帧的正确CRC32值。
我想我之前无法得到正确的值,因为比特的发送顺序。与以太网相比,GFP以相反的方向发送位,如本文post所述。