C ospf校验和是如何计算的?

C ospf校验和是如何计算的?,c,checksum,ospf,C,Checksum,Ospf,我很难计算出准确的校验和。我的路由器因此拒绝了我的Hello消息。这是从ospf头开始的十六进制包 vv vv <-- my program's checksum 0000 02 01 00 30 c0 a8 03 0a 00 00 00 00 f3 84 00 00 ...0............ 0010 00 00 00 00 00 00 00 00 ff ff ff 00 00 0a

我很难计算出准确的校验和。我的路由器因此拒绝了我的Hello消息。这是从ospf头开始的十六进制包

                                           vv vv <-- my program's checksum
0000   02 01 00 30 c0 a8 03 0a 00 00 00 00 f3 84 00 00  ...0............
0010   00 00 00 00 00 00 00 00 ff ff ff 00 00 0a 00 01  ................
0020   00 00 00 28 c0 a8 03 0a c0 a8 03 0a              ...(........
不需要担心身份验证。我们甚至没有被教如何设置它。最后,这是我计算校验和的方法:

OspfHeader result;

result.Type = type;
result.VersionNumber = 0x02;
result.PacketLength = htons(24 + content_len);
result.AuthType = htons(auth_type);
result.AuthValue = auth_val;
result.AreaId = area_id;
result.RouterId = router_id;

uint16_t header_buffer[12];
memcpy(header_buffer, &result, 24);

uint32_t checksum;
for(int i = 0; i < 8; i++)
{
    checksum += ntohs(header_buffer[i]);
    checksum = (checksum & 0xFFFF) + (checksum >> 16);
}

for(int i = 0; i + 1 < content_len; i += 2)
{
    checksum += (content_buffer[i] << 8) + content_buffer[i+1];
    checksum = (checksum & 0xFFF) + (checksum >> 16);
}

result.Checksum = htons(checksum xor 0xFFFF);

return result;

我不知道我到底在哪里搞砸了。有什么线索吗?

校验和未初始化。另外,这里有一个关于如何对OSPF包进行校验和的示例。我已经尝试了这两种方法,但都没有成功。我使用了维基百科上Fletcher的16位算法,结果不同:c
OspfHeader result;

result.Type = type;
result.VersionNumber = 0x02;
result.PacketLength = htons(24 + content_len);
result.AuthType = htons(auth_type);
result.AuthValue = auth_val;
result.AreaId = area_id;
result.RouterId = router_id;

uint16_t header_buffer[12];
memcpy(header_buffer, &result, 24);

uint32_t checksum;
for(int i = 0; i < 8; i++)
{
    checksum += ntohs(header_buffer[i]);
    checksum = (checksum & 0xFFFF) + (checksum >> 16);
}

for(int i = 0; i + 1 < content_len; i += 2)
{
    checksum += (content_buffer[i] << 8) + content_buffer[i+1];
    checksum = (checksum & 0xFFF) + (checksum >> 16);
}

result.Checksum = htons(checksum xor 0xFFFF);

return result;