aodv中处理处理RREQ分组的流程及协议.doc_第1页
aodv中处理处理RREQ分组的流程及协议.doc_第2页
aodv中处理处理RREQ分组的流程及协议.doc_第3页
aodv中处理处理RREQ分组的流程及协议.doc_第4页
aodv中处理处理RREQ分组的流程及协议.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一部分:RREQ分组的处理流程图:第二部分 与流程图对应的程序解析部分:voidAODV:recvRequest(Packet *p) struct hdr_ip *ih = HDR_IP(p);struct hdr_aodv_request *rq = HDR_AODV_REQUEST(p);aodv_rt_entry *rt;/*=*/该分组是否由自己产生 if(rq-rq_src = index) #ifdef DEBUG fprintf(stderr, %s: got my own REQUESTn, _FUNCTION_);#endif / DEBUG/如果是,回收分组 Packet:free(p); return; /如果不是,判断是否已经收到该分组 if (id_lookup(rq-rq_src, rq-rq_bcast_id) #ifdef DEBUG fprintf(stderr, %s: discarding requestn, _FUNCTION_);#endif / DEBUG/如果收到过该分组,回收分组 Packet:free(p); return; /*=*/如果没收到过该分组/将收到的广播分组存入Broadcast ID Cache中 /* * Cache the broadcast ID */ id_insert(rq-rq_src, rq-rq_bcast_id); 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 rt_hops) ) /这里就是路由判据,当遇到新的RREQ的时候,比较在路由表中已经存在的到目的节点的路由,比较目的节点的序列号(用来保证使用最新路由防止路由环),在目的节点序列号相同的情况下,采用跳数较小的。在这种情况下就更新路由表。/若需要更新,更新路由表项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; /判断节点是否有发往反向路由目的节点的数据分组,并且路由是否有效 /* Find out whether any buffered packet can benefit from the * reverse route. * May need some change in the following code - Mahesh 09/11/99 */ assert (rt0-rt_flags = RTF_UP);/若有发往反向路由目的节点 的分组 Packet *buffered_pkt; while (buffered_pkt = rqueue.deque(rt0-rt_dst) if (rt0 & (rt0-rt_flags = RTF_UP) /若路由有效assert(rt0-rt_hops != INFINITY2);/将数据分组转发 forward(rt0, buffered_pkt, NO_DELAY); / End for putting reverse route in rt table/*=*/若没有发往反向路由目的节点的数据分组,或者路由无效/或者原来的路由项不需要更新,转发或处理路由请求分组 * We have taken care of the reverse route stuff. * Now see whether we can send a route reply. */* 在这种情况下我们有两种选择,一种是将RREQ继续传播下去,一种是产生RREP。在这之前我们要确定,反向路由已经在路由表中存在。如果存在反向路由,在考虑是否应该想源节点发送RREP */ rt = rtable.rt_lookup(rq-rq_dst);/判断节点本身是路由请求分组的目的地址 if(rq-rq_dst = index) /如果节点本身是目的地址,向源节点发送路由应答分组并且回收请求分组#ifdef DEBUG fprintf(stderr, %d - %s: destination sending replyn, index, _FUNCTION_);#endif / DEBUGseqno = max(seqno, rq-rq_dst_seqno)+1; if (seqno%2) seqno+; sendReply(rq-rq_src, / IP Destination 1, / Hop Count index, / Dest IP Address seqno, / Dest Sequence Num MY_ROUTE_TIMEOUT, / Lifetime rq-rq_timestamp); / timestamp Packet:free(p); /*=*/判断节点是否有到达目的节点足够新的路由?else if (rt & (rt-rt_hops != INFINITY2) & (rt-rt_seqno = rq-rq_dst_seqno) ) /如果不是目的地址,但是有足够新的路由 /assert (rt-rt_flags = RTF_UP); assert(rq-rq_dst = rt-rt_dst); /assert (rt-rt_seqno%2) = 0);/ is the seqno even?/向源节点发送路由应答分组 sendReply(rq-rq_src, rt-rt_hops + 1, /如果是目的节点的话就设成一,这里不是目的节点就在个RREQ中的跳数加1; rq-rq_dst, /如果是目的节点这一项就是目的节点的IP地址(这个节点本身的地址),这里是RREQ中的目的节点IP地址 rt-rt_seqno, (u_int32_t) (rt-rt_expire - CURRENT_TIME), / rt-rt_expire - CURRENT_TIME, rq-rq_timestamp); / Insert nexthops to RREQ source and RREQ destination in the / precursor lists of destination and source respectively/ /更新正向路由项和反向路由项的前驱列表 rt-pc_insert(rt0-rt_nexthop); / nexthop to RREQ source rt0-pc_insert(rt-rt_nexthop); / nexthop to RREQ destination#ifdef RREQ_GRAT_RREP / /向目的节点发送路由应答分组,并且回收路由请求分组 sendReply(rq-rq_dst, rq-rq_hop_count, rq-rq_src, rq-rq_src_seqno, (u_int32_t) (rt-rt_expire - CURRENT_TIME), / rt-rt_expire - CURRENT_TIME, rq-rq_timestamp);#endif / TODO: send grat RREP to dst if G flag set in RREQ using rq-rq_src_seqno, rq-rq_hop_counT / DONE: Included gratuitous replies to be sent as per IETF aodv draft specification. As of now, G flag has not been dynamically used and is always set or reset in aodv-packet.h - Anant Utgikar, 09/16/02.Packet:free(p); /*=*/ /* * Cant reply. So forward the Route Request */如果没有到达目的节点足够新的路由,继续转发路由请求分组 e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论