没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
ns里实现的aodv是单播的,多播的aodv叫MAODV,网上有源代码。我觉得看代码之前最好先对协议有个了解,这样看起来会更有效率;另外,实现与理论不一样,如果不对代码做改动的话,没必要对每个细节都了解很清楚。以下将简略介绍aodv中的重要函数。不足之处请谅解,我也是两年前看的源代码了,可能有些地方理解不对。
AODV中aodv.cc是最重要的,了解aodv看这个文件也就差不多了,这个文件中,起点从AODV::recv(Packet *p, Handler*) 开始,文件开头那些都不用管
1. Void AODV::recv(Packet *p, Handler*)
//判断是否是aodv包,是则调用函数recvAODV(p)
if(ch->ptype() == PT_AODV) { recvAODV(p);
//本节点产生的数据包,添加IP头
if((ih->saddr() == index) && (ch->num_forwards() == 0)) Add the IP Header
//收到本节点发送的包,说明有路由环路,丢包
else if(ih->saddr() == index) drop(p, DROP_RTR_ROUTE_LOOP);
//本节点是中间节点
else {//TTL是分组最多能转发的次数 if(--ih->ttl_ == 0) drop(p, DROP_RTR_TTL);
//收到的不是广播分组,解析分组
if ( (u_int32_t)ih->daddr() != IP_BROADCAST) rt_resolve(p);
//转发 else forward((aodv_rt_entry*) 0, p, NO_DELAY);
2. void AODV::rt_resolve(Packet *p) {//解析收到的分组
//查找是否有到目的节点的路由 rt = rtable.rt_lookup(ih->daddr());
//没有,则添加到该目的节点的路由,此时添加的路由是无效的
if(rt == 0) rt = rtable.rt_add(ih->daddr());
//有效路由,则根据路由表中信息转发分组
if(rt->rt_flags == RTF_UP) forward(rt, p, NO_DELAY);
//如果本节点是该分组的源节点,说明没有到目的节点的路,此时发送RREQ找路
else if(ih->saddr() == index) rqueue.enque(p); sendRequest(rt->rt_dst);
//链路中断,在维护中 else if (rt->rt_flags == RTF_IN_REPAIR) rqueue.enque(p);
// 本节点转发数据分组,但是不知道该到目的节点的路,发送RERR说明链路中断
else sendError(rerr, false);
3. AODV::sendRequest(nsaddr_t dst) { //发送RREQ
//添加到目的节点的路由,此时的路由不可用,是无效的
aodv_rt_entry *rt = rtable.rt_lookup(dst);
AODV中aodv.cc是最重要的,了解aodv看这个文件也就差不多了,这个文件中,起点从AODV::recv(Packet *p, Handler*) 开始,文件开头那些都不用管
1. Void AODV::recv(Packet *p, Handler*)
//判断是否是aodv包,是则调用函数recvAODV(p)
if(ch->ptype() == PT_AODV) { recvAODV(p);
//本节点产生的数据包,添加IP头
if((ih->saddr() == index) && (ch->num_forwards() == 0)) Add the IP Header
//收到本节点发送的包,说明有路由环路,丢包
else if(ih->saddr() == index) drop(p, DROP_RTR_ROUTE_LOOP);
//本节点是中间节点
else {//TTL是分组最多能转发的次数 if(--ih->ttl_ == 0) drop(p, DROP_RTR_TTL);
//收到的不是广播分组,解析分组
if ( (u_int32_t)ih->daddr() != IP_BROADCAST) rt_resolve(p);
//转发 else forward((aodv_rt_entry*) 0, p, NO_DELAY);
2. void AODV::rt_resolve(Packet *p) {//解析收到的分组
//查找是否有到目的节点的路由 rt = rtable.rt_lookup(ih->daddr());
//没有,则添加到该目的节点的路由,此时添加的路由是无效的
if(rt == 0) rt = rtable.rt_add(ih->daddr());
//有效路由,则根据路由表中信息转发分组
if(rt->rt_flags == RTF_UP) forward(rt, p, NO_DELAY);
//如果本节点是该分组的源节点,说明没有到目的节点的路,此时发送RREQ找路
else if(ih->saddr() == index) rqueue.enque(p); sendRequest(rt->rt_dst);
//链路中断,在维护中 else if (rt->rt_flags == RTF_IN_REPAIR) rqueue.enque(p);
// 本节点转发数据分组,但是不知道该到目的节点的路,发送RERR说明链路中断
else sendError(rerr, false);
3. AODV::sendRequest(nsaddr_t dst) { //发送RREQ
//添加到目的节点的路由,此时的路由不可用,是无效的
aodv_rt_entry *rt = rtable.rt_lookup(dst);
资源评论
- zhanglibin_12222012-05-24已经算是搜到的资料中讲的比较详细的了,但是如果想对aodv有彻底了解的,一些细节的问题还是要看rfc文档更好
- xiaoxiong3452012-12-19这么高的分 可惜不是我想要的
- qingtingshaoshuo2014-08-13有时候头文件也挺重要的。
snowyyzz
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功