簡體   English   中英

OSPF-校驗和不起作用

[英]OSPF - Checksum not working

我正在做一個需要手動生成OSPF數據包的項目。 我目前在正確使用OSPF校驗和時遇到問題。 我讀到我必須將Auth數據排除在計算之外,即使這樣做,我也無法正常工作。 我知道用於生成校驗和的函數是正確的,因為我使用相同的函數來生成IP標頭的校驗和,並且可以正常工作。

*對於我糟糕的C編程感到抱歉,這不是我的主要語言。

void generateHello(unsigned char* packet_return,unsigned char* buff,unsigned short *ospf_packet){
ospf_packet = (unsigned short*) malloc(14*sizeof(unsigned short));

//OSPF Version 
packet_return[34] = 0x02;

//Message Type - Hello
packet_return[35] = 0x01;

//Packet Length
packet_return[36] = 0x00;
packet_return[37] = 0x2c;

//Source OSPF Router (IP)
packet_return[38]=local_ip[0];
packet_return[39]=local_ip[1];
packet_return[40]=local_ip[2];
packet_return[41]=local_ip[3];

//Area 

packet_return[42]=0x00;
packet_return[43]=0x00;
packet_return[44]=0x00;
packet_return[45]=0x01;

//ADD CHECKSUM

packet_return[46]=0x00;
packet_return[47]=0x00;

//Auth Type
packet_return[48]=0x00;
packet_return[49]=0x00;

//Auth Data
packet_return[50]=0x00;
packet_return[51]=0x00;
packet_return[52]=0x00;
packet_return[53]=0x00;
packet_return[54]=0x00;
packet_return[55]=0x00;
packet_return[56]=0x00;
packet_return[57]=0x00;

//Network Mask
packet_return[58]=0xff;
packet_return[59]=0xff;
packet_return[60]=0xff;
packet_return[61]=0x00;

//Hello Interval
packet_return[62]=0x00;
packet_return[63]=0x0a;

//Multi-Topology Routing
packet_return[64]=0x12;

//Router Priority
packet_return[65]=0x01;

//Router Dead Interval 
packet_return[66]=0x00;
packet_return[67]=0x00;
packet_return[68]=0x00;
packet_return[69]=0x28;

//Designated Router
packet_return[70]=0x00;
packet_return[71]=0x00;
packet_return[72]=0x00;
packet_return[73]=0x00;

//Backup designated router
packet_return[74]=0x00;
packet_return[75]=0x00;
packet_return[76]=0x00;
packet_return[77]=0x00;

//Checksum
packet_return[78]=0x00;
packet_return[79]=0x00;

//LLS Data Length
packet_return[80]=0x00;
packet_return[81]=0x03;

//Type
packet_return[82]=0x00;
packet_return[83]=0x01;

//Length
packet_return[84]=0x00;
packet_return[85]=0x04;

//Options - LSDB Resynchronization
packet_return[86]=0x00;
packet_return[87]=0x00;
packet_return[88]=0x00;
packet_return[89]=0x01;


int i;
int j;
for(i=0,j=34;i<48;i++,j+=2)
{
    ospf_packet[i]= htons(((packet_return[j] << 8) | packet_return[j+1])); 
}


unsigned short ck_sum = in_cksum(ospf_packet,sizeof(unsigned short)*14);
printf("CHECKSUM OSPF - %.4x \n", ck_sum);

packet_return[46]=ck_sum & 0xff;
packet_return[47]=(ck_sum >> 8) & 0xff;
}

首先,請使用常量或更佳的__attribute__((packed)) struct ,而不要使用大量數組偏移量。

其次,這看起來很糟糕:

for(i=0,j=34;i<48;i++,j+=2)
{
    ospf_packet[i]= htons(((packet_return[j] << 8) | packet_return[j+1])); 
}

根據mallocospf_packet長為14個無符號短褲。 但是,您正在其中寫入48條未簽名的短褲。 這將導致不確定的行為。

另外, packet_return似乎是一個char *因此大概是電匯順序。 然后,您正在閱讀它假設它在線材為了所有的短褲(精盡可能去我想),然后從導線為了將其轉換為主機順序(似乎) -我認為這應該是ntohshtons (是的,我知道他們做同樣的事情。 目前尚不清楚為什么要這樣做。

最后,除驗證字段外,在整個OSPF數據包上計算OSPF校驗和。

來自RFC2328

    Checksum
        The standard IP 16-bit one's complement checksum of the
        entire OSPF packet, excluding the 64-bit authentication
        field.  This checksum is calculated as part of the
        appropriate authentication procedure; for some OSPF
        authentication types, the checksum calculation is omitted.
        See Section D.4 for details.

我無法立即看到為什么您的代碼會在整個數據包中求和,也不會忽略身份驗證字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM