NS2 AODV::recv

AODV::recv(Packet *p, Handler*) {

//HDR_CMN HDR_IP均在ip.cc中定义

struct hdr_cmn *ch = HDR_CMN(p); //查看cmn头
struct hdr_ip *ih = HDR_IP(p);//查看ip头
//确保初始化
 assert(initialized());//断言
 //assert(p->incoming == 0);
 // XXXXX NOTE: use of incoming flag has been depracated; In order to track direction of pkt flow, direction_ in hdr_cmn is used instead. see packet.h for details.
//从cmn头的信息里对接收分组进行处理,判断是否是aodv包,如果是,调用recvAODV(p)
 if(ch->ptype() == PT_AODV) {  //ptype是包头类型
   ih->ttl_ -= 1;//如果是,time to leave-1
   recvAODV(p);//调用recvAODV(p)
   return;
 }




 /*
  *  Must be a packet I'm originating...
  */
 //若从ip头看出是本节点产生的数据包,并且没有loop,添加IP头
if((ih->saddr() == index) && (ch->num_forwards() == 0)) {
 /*
  * Add the IP Header.  
  * TCP adds the IP header too, so to avoid setting it twice, we check if
  * this packet is not a TCP or ACK segment.
  */
  if (ch->ptype() != PT_TCP && ch->ptype() != PT_ACK) { //如果包头类型不是TCP,也不是ACK类型,加上ip头
    ch->size() += IP_HDR_LEN;
  }
   // Added by Parag Dadhania && John Novatnack to handle broadcasting
//如果不是broadcast分组
  if ( (u_int32_t)ih->daddr() != IP_BROADCAST) {
//前面定义time to leave=30
      ih->ttl_ = NETWORK_DIAMETER;//等待时间30
  }
}
 /*
  *  I received a packet that I sent.  Probably
  *  a routing loop.
  */
 //收到本节点发送的包,说明有路由环路,丢包
else if(ih->saddr() == index) {
   drop(p, DROP_RTR_ROUTE_LOOP);
   return;
 }
 /*
  *  Packet I'm forwarding...
  */
 //我转发过的分组
 else {
 /*
  *  Check the TTL.  If it is zero, then discard.
  */
    //TTL分组最多转发次数
   if(--ih->ttl_ == 0) {
       //如果time to leave=0丢弃分组,因为超时
     drop(p, DROP_RTR_TTL);
     return;
   }
 }
// Added by Parag Dadhania && John Novatnack to handle broadcasting
 //收到的不是广播分组,解析分组
 if ( (u_int32_t)ih->daddr() != IP_BROADCAST)
     //如果不是broadcast分组则解析分组
   rt_resolve(p);
 else
     //转发,不等待
   forward((aodv_rt_entry*) 0, p, NO_DELAY);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值