OSPF - 校验和不起作用

时间:2014-11-09 20:03:58

标签: c networking network-programming checksum ospf

我正在开发一个项目,我需要手动生成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;
}

1 个答案:

答案 0 :(得分:2)

首先,请使用常量或更好的struct__attribute__((packed))而不是大量的数组偏移。

其次,这看起来很可疑:

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

ospf_packet是14个无符号短裤。然而,你正在写48条无符号短裤。这将导致未定义的行为。

此外,malloc似乎是packet_return,因此大概是按顺序排列。你正在阅读它,假设它是所有短线的电线顺序(我认为是好的),然后将它从线序转换为主机顺序(似乎) - 我认为应该是char *不是ntohs(是的,我知道他们做同样的事情)。你这样做的原因并不明显。

最后,OSPF校验和是根据除认证字段之外的整个OSPF数据包计算的。

来自RFC2328

htons

我无法立即了解您的代码在整个数据包中的总和,以及它如何省略身份验证字段。