NS2下AODV协议aodv.cc注释(5)

case AODVTYPE_HELLO:
  recvHello(p);
  break;
       
 default:
  fprintf(stderr, "Invalid AODV type (%x)\n", ah->ah_type);
  exit(1);
 }

}


void
AODV::recvRequest(Packet *p) {
struct hdr_ip *ih = HDR_IP(p);
struct hdr_aodv_request *rq = HDR_AODV_REQUEST(p);
aodv_rt_entry *rt;

/*
  * Drop if:
  *      - I'm the source
  *      - I recently heard this request.
  */
/*如果此节点就是源节点,出现环路,丢弃路由请求报文*/
  if(rq->rq_src == index) {
#ifdef DEBUG
    fprintf(stderr, "%s: got my own REQUEST\n", __FUNCTION__);
#endif // DEBUG
    Packet::free(p);
    return;
  }
/*如果已经收到了源地址和请求序列号相等的请求报文,丢弃*/
 if (id_lookup(rq->rq_src, rq->rq_bcast_id)) {

#ifdef DEBUG
  fprintf(stderr, "%s: discarding request\n", __FUNCTION__);
#endif // DEBUG
 
  Packet::free(p);
  return;
 }

/*
  * Cache the broadcast ID
  */
  /*缓存此路由请求*/
 id_insert(rq->rq_src, rq->rq_bcast_id);

/*
  * We are either going to forward the REQUEST or generate a
  * REPLY. Before we do anything, we make sure that the REVERSE
  * route is in the route table.
  */
  //建立反向路径
 aodv_rt_entry *rt0; // rt0 is the reverse route
 
  rt0 = rtable.rt_lookup(rq->rq_src);
  if(rt0 == 0) { /* if not in the route table */
  // create an entry for the reverse route.
    rt0 = rtable.rt_add(rq->rq_src);
  }
  //更新此路由条目的生存时间
  rt0->rt_expire = max(rt0->rt_expire, (CURRENT_TIME + REV_ROUTE_LIFE));
/*如果请求序列号大于路由序列号或者两者序列号相等但是跳数
比源路由跳数小,则更新*/
  if ( (rq->rq_src_seqno > rt0->rt_seqno ) ||
     ((rq->rq_src_seqno == rt0->rt_seqno) &&
  (rq->rq_hop_count < rt0->rt_hops)) ) {
  // If we have a fresher seq no. or lesser #hops for the
  // same seq no., update the rt entry. Else don't bother.
rt_update(rt0, rq->rq_src_seqno, rq->rq_hop_count, ih->saddr(),
            max(rt0->rt_expire, (CURRENT_TIME + REV_ROUTE_LIFE)) );
  /*如果此前请求过该路由条目,则更新信息*/
    if (rt0->rt_req_timeout > 0.0) {
    // Reset the soft state and
    // Set expiry time to CURRENT_TIME + ACTIVE_ROUTE_TIMEOUT
    // This is because route is used in the forward direction,
    // but only sources get benefited by this change
      rt0->rt_req_cnt = 0;
      rt0->rt_req_timeout = 0.0;
      rt0->rt_req_last_ttl = rq->rq_hop_count;
      rt0->rt_expire = CURRENT_TIME + ACTIVE_ROUTE_TIMEOUT;
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ab5562fd35bafa4ee10b3188dd4834ce.html