NS2中DSR协议路由出错代码分析

本文详细介绍了在网络通信中遇到链路故障时的处理流程。主要包括:调用xmitFailed()生成RERR数据包通知源节点;undeliverablePkt处理无法投递的数据包;processBrokenRouteError处理收到的Rerr错误数据包;handlePktWithoutSR尝试重新发送数据包;getRouteForPacket获取数据包路由;sendOutRtReq发送路由请求。
链路出错时,处理流程
0)、首先是调用xmitFailed()。
     首先生成 tellid,fromid,toid;分别代表err数据包通知的源节点,me,和me的下一跳。
     然后处理这个无法发送的数据包(调用undeliverablePkt)
     同时也处理sendbuffer中包含该错误链路的数据包(也是调用undeliverablePkt)
     最后生成RERR数据包,告知tellid。
1)、undeliverablePkt
     如果这个数据包是我要发送的,则调用handlePktWithoutSR
     否则,如果这个数据包不值得拯救,或者拯救次数达到最大,则丢弃。
     否则,在cache中寻找路由(调用route_cache->findRoute( p.dest, salvage_route, 0)),如果找到,则
           使用salvaged的路由发送,此时数据包的源节点发生变化,不是原来的源节点,而是me
     否则,丢弃数据包,或者重新将该数据包插入sendbuffer。
    
2)、processBrokenRouteError用在收到Rerr错误数据包,或者snoop到Rerr数据包
    processBrokenRouteError 首先处理出错的链路(告知源端节点)
     而后调用 handlePktWithoutSR,处理无法发送的数据包
3)、handlePktWithoutSR 处理无法发送的数据包
     首先在cache中查找到dest的路由,
     如果有,则发送(调用 sendOutPacketWithRoute)
     否则调用 getRouteForPacket,寻找路由。
4)、getRouteForPacket首先生成一个数据包。然后判断是否可以发送rreq请求包(backoff退避算法)
    如果可以,则判断
    是否目的地址==自己
    是否为dsragent_ring_zero_search,如果是,则调用 sendOutRtReq(rrp,0)。注意后面参数为0,代表该数据包只有一跳,
            因此只能到起邻居。
    否则进行最大范围的路由请求广播。
    是否....
    是否....
5)、sendoutrtreq()设置广播请求包,调用 sendOutPacketWithRoute(p,false) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值