正確なチェックサムを計算するのに問題があります。そのため、ルーターが Hello メッセージを拒否しています。これが16進数のパッケージです(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 ...(........
Wireshark は0xf384
偽の呼び出しを行い、期待値は であると言います0xb382
。私のアルゴリズムがバイトをペアで正しい順序で選択し、それらを一緒に追加することを確認しました。
0201 + 0030 + c0a8 + ... + 030a
心配する認証はありません。設定方法さえ教えられませんでした。最後に、チェックサムを計算する私のショットは次のとおりです。
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;
ここでどこを台無しにしたのか正確にはわかりません。手がかりはありますか?