aodv中处理处理rreq分组的流程及协议

上传人:第*** 文档编号:31321680 上传时间:2018-02-06 格式:DOC 页数:5 大小:155KB
返回 下载 相关 举报
aodv中处理处理rreq分组的流程及协议_第1页
第1页 / 共5页
aodv中处理处理rreq分组的流程及协议_第2页
第2页 / 共5页
aodv中处理处理rreq分组的流程及协议_第3页
第3页 / 共5页
aodv中处理处理rreq分组的流程及协议_第4页
第4页 / 共5页
aodv中处理处理rreq分组的流程及协议_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《aodv中处理处理rreq分组的流程及协议》由会员分享,可在线阅读,更多相关《aodv中处理处理rreq分组的流程及协议(5页珍藏版)》请在金锄头文库上搜索。

1、第一部分: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 DEBUGfprintf(stderr, %s: got my own REQUESTn, _FUNCTION_);#endif / DEBUG/如果是,回收分组Packet:

2、free(p);return; /如果不是,判断是否已经收到该分组if (id_lookup(rq-rq_src, rq-rq_bcast_id) #ifdef DEBUGfprintf(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);

3、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);/若存在反向路由项/

4、判断反向路由是否需要更新 ?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()

5、,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 changert0-rt_req_cnt = 0;rt0-rt_req_

6、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 =

7、 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/*=*/若没有发往反向路由目的节点的数据分组,或者路由无效/或者原来的路由项不需要更新

8、,转发或处理路由请求分组* 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) /如果节点本身是目的地址,向源节点发送路

9、由应答分组并且回收请求分组#ifdef DEBUGfprintf(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 Destination1, / Hop Countindex, / Dest IP Addressseqno, / Dest Sequence NumMY_ROUTE_TIMEOUT, / Lifetimerq-

10、rq_timestamp); / timestampPacket: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-r

11、q_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/ precu

12、rsor lists of destination and source respectively/ /更新正向路由项和反向路由项的前驱列表rt-pc_insert(rt0-rt_nexthop); / nexthop to RREQ sourcert0-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_int

13、32_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 dynam

14、ically 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*/如果没有到达目的节点足够新的路由,继续转发路由请求分组else ih-saddr() = index;ih-daddr() = IP_BROADCAST;rq-rq_hop_count += 1; / Maximum sequence number seen en routeif (rt) rq-rq_dst_seqno = max(rt-rt_seqno, rq-rq_dst_seqno);forward(aodv_rt_entry*) 0, p, DELAY);/*=

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号