{
dumpPkt((unsigned char*)pBuffer,bufferSize);/*从缓冲区取出数据组包*/
int snums=(bufferSize-sizeof(packet_header))/sizeof(packet_data);/*计算缓冲区RIP包的总数*/
for (int i=0;i
{
packet_data*pd=(packet_data*)(pBuffer+sizeof(packet_header));/*从缓冲区dump数据形成本地路由表的链表*/
pd+=i;
dumpPkt((unsigned char*)pd,sizeof(packet_data));
pd->ipaddr=ntohl(pd->ipaddr);
pd->netmask=ntohl(pd->netmask);
pd->nexthop=ntohl(pd->nexthop);
pd->metric=ntohl(pd->metric);
/*给RIP链表里的每一项赋值*/
stud_rip_route_node*hd=g_rip_route_table;
dumpPkt((unsigned char*)pd,sizeof(packet_data));
int hdcount=0;
while (hd) {
if (hd->dest==pd->ipaddr&;&;hd->mask==pd->netmask) break; hd=hd->next;
hdcount++;
}
do/*对传来的RIP数据进行分析,更新本地路由表*/
{
if (hd) {
/*如果下一跳不是原来表中的下一跳,只有当跳数更低时,更新表项*/
printf("Match at %d and nexthop %x\n",hdcount,hd->nexthop);
if (hd->nexthop!=pd->nexthop)
{
if (hd->metric>pd->metric)
{
hd->metric=pd->metric+1;/*跳数加一*/
hd->nexthop=pd->nexthop;/*目的地更新*/
hd->if_no=iNo;
}
break;
}
/*如果下一跳满足,直接更新RIP链表*/
hd->metric=pd->metric+1;
hd->nexthop=pd->nexthop;
hd->if_no=iNo;
/*如果跳数为16显然不合法,大于16的置为16*/
if (hd->metric>16)
hd->metric=16;
}
else {
/*如果不存在则创建新节点(链表)*/
printf("Unmatched.\n");
if (pd->metric>=16) break;/*跳过跳数为16的项目*/
stud_rip_route_node* nhd=(stud_rip_route_node*)malloc(sizeof(stud_rip_route_node));/*创建新节点*/
nhd->dest=pd->ipaddr;
nhd->mask=pd->netmask;
nhd->nexthop=pd->nexthop;
nhd->metric=pd->metric+1;/*初始值为1*/
nhd->if_no=iNo;
nhd->next=g_rip_route_table;/*插入路由链表的头部*/
g_rip_route_table=nhd;
}
} while (false);
}
}
}
/*超时处理函数*/
void stud_rip_route_timeout(UINT32 destAdd, UINT32 mask, unsigned char msgType)
{
if (msgType==RIP_MSG_SEND_ROUTE)
{
/*向两个端口都广播自己的路由表*/
MakePacket(2,1);
MakePacket(2,2);
}
else if (msgType==RIP_MSG_DELE_ROUTE)
{
stud_rip_route_node*hd=g_rip_route_table;
while (hd) {
if (hd->dest==destAdd&;&;hd->mask==mask)
break;
hd=hd->next;/*传入超时的路由表项,将跳数置为16,此该表项会被自动删除*/
}
hd->metric=16;
}
}