2009-4-10 10:42
damaozy
在NS2中添加路由协议(整理版)1
最近正在研究怎样把自己新写的协议添加到NS2中去,正好借鉴了一些朋友的文章,现在整理下来,以便以后参考,也希望能给广大博友一些方便。
[b]step 1:[/b]比如我们新建的协议名字就叫做[color=#ff0000]protoname[/color],以ns2.27平台为例,我们在ns2.27目录下建立一个protoname目录。此目录包含[color=#ff0000]protoname.h,protoname.cc,protoname_pkt.h,protoname_rtable.h,[/color][color=#ff0000]protoname_rtable.cc[/color]五个文件。
其中五个文件的具体功能和作用如下:
(1)protoname.h 定义必要的计时器和路由代理
(2)protoname.cc 执行计时器、路由代理和Tcl文件
(3)protoname_pkt.h 声明protoname路由协议需要在无线自组网节点交换的数据包
(4)protoname_rtable.h 声明我们自己的路由选择表
(5)protoname_rtable.cc 执行路由选择表
[b]step 2:[/b]相应文件的代码
(1)protoname.h
#ifndef __protoname_h__
#define __protoname_h__
// 下面包含一些需要的头文件
#include "protoname_pkt.h" //数据包报头
#include "protoname_rtable.h"
#include <agent.h> //代理基本类
#include <packet.h> //数据包类
#include <trace.h> //跟踪类,用于在跟踪文件里记录输出的仿真结果
#include <timer-handler.h> //计时器基本类,创建我们自定义的计时器
#include <random.h> //随机类,用于产生伪随机数
#include <classifier-port.h> //端口分类器类,用于淘汰向上层传输的数据包
#include <mobilenode.h>
#include "arp.h"
#include "ll.h"
#include "mac.h"
#include "ip.h"
#include "delay.h"
#define CURRENT_TIME Scheduler::instance().clock() //定义了一个用于得到当前仿真时间的宏
//通过一个调度类的实例完成
#define JITTER (Random::uniform()*0.5) //在0-0.5之间去随机数作为发送数据的延迟时间
class Protoname; // forward declaration
/* Timers */ //自定义计时器发送定时的控制包
class Protoname_PktTimer : public TimerHandler {
public:
[indent] Protoname_PktTimer(Protoname* agent) : TimerHandler() {
agent_ = agent;
[/indent] }
protected:
[indent] Protoname* agent_;
virtual void expire(Event* e);
[/indent]};
/* Agent */ //定义Protoname 类
class Protoname : public Agent {
[indent]/* Friends */
friend class Protoname_PktTimer;
/* Private members */ //封装了自身的地址、内状态、路由表、可变的Tcl
//以及一个负责指定输出数量的计数器
nsaddr_t ra_addr_;
//protoname_state state_;
protoname_rtable rtable_;
int accesible_var_; //用来读取Tcl代码或脚本语言
u_int8_t seq_num_;
[/indent] protected:
[indent] MobileNode* node_;
PortClassifier* dmux_; // For passing packets up to agents.端口分类器
Trace* logtarget_; // For logging.跟踪器
Protoname_PktTimer pkt_timer_; // Timer for sending packets.自定义计时器
//内部属性
inline nsaddr_t& ra_addr() { return ra_addr_; }
//inline protoname_state& state() { return state_; }
inline int& accessible_var() { return accesible_var_; }
void forward_data(Packet*); //数据包被正确传输的目的地
void recv_protoname_pkt(Packet*);
void send_protoname_pkt();
void reset_protoname_pkt_timer();
[/indent] public:
[indent] Protoname(nsaddr_t);
int command(int, const char*const*);
void recv(Packet*, Handler*);
//void mac_failed(Packet*);
[/indent]};
#endif
(待续……)
2009-4-13 11:04
gnoynux
这么好的帖子没人顶?
2009-4-13 14:12
damaozy
[quote]原帖由 [i]gnoynux[/i] 于 2009-4-13 11:04 发表
这么好的帖子没人顶? [/quote]
谢谢呢
2009-4-14 12:42
littleneng
very good
确实是好.解决了心中的许多疑问!!!!:good
2009-4-14 12:54
littleneng
看来主要的问题是要具备C++面向对象编程能力
一点水平还不行,必须具备较强的C语言编程能力,否则写不出来,不存在加协议了.:(
2009-4-14 12:57
littleneng
不是所有的都需要写这五个文件
我看到有人写MPLS模块,添加到NS-2.26上就没有后三个文件,有人写TCPWESTOOD模块,也没有后三个文件.
2009-4-14 17:10
chrislin
想它想得心都累了,楼主,顶一个
想它想得心都累了,楼主,顶一个
2009-4-14 18:21
damaozy
[quote]原帖由 [i]littleneng[/i] 于 2009-4-14 12:57 发表
我看到有人写MPLS模块,添加到NS-2.26上就没有后三个文件,有人写TCPWESTOOD模块,也没有后三个文件. [/quote]
是的,不是所有的协议都要这五个文件,但是前两个必须有的
2009-4-16 12:27
jianon
学习了。。。继续努力哦!
2009-4-17 15:33
duanbf07
ding
2009-4-17 16:31
xiaoheshang168
当然要顶了,顶顶顶
2009-4-17 20:51
kiteking
好帖,谢楼主了
正愁协议怎么加呢,顶
2009-4-25 15:13
zhangsmallfish
给出了添加协议的整体思路,不错
2009-4-27 01:45
瘾大技术差
不错欧,好像是楼主看的一篇英文的添加协议的文章吧,在NS手册后面,
感谢楼住
2009-4-28 14:40
lovesaber
老大,有wimax跨层调度算法在ns2中修改的实施步骤吗,这方面的资料很少,感觉楼主比较牛,所以请教下~
2009-4-30 22:10
smartdu
请问楼主在写新的协议时,有没有遇到 can't read 'dubug_' no such avriable这样的错误,以及怎么解决的?thank you in advance...:)
2009-5-5 13:15
damaozy
[quote]原帖由 [i]smartdu[/i] 于 2009-4-30 22:10 发表
请问楼主在写新的协议时,有没有遇到 can't read 'dubug_' no such avriable这样的错误,以及怎么解决的?thank you in advance...:) [/quote]
好像是代码里一些单词的错误,我忘记了,请你仔细查一下有没有写错的字母什么的
2009-5-25 10:58
DANGQIONG
:)感谢总结
2009-5-25 13:04
dcc986
正好用的上
2009-5-31 17:19
zjl19870808
好东西,收藏了。。。