如何在NS-2中添加协议[转载]
2013-06-20 16:22
302 查看
1、NS2源代码目录 (省略)
2、添加协议
2.1、添加别人实现的协议
为什么我安装总是出错?????
环境问题,OS,gcc版本,ns版本
解决办法:
(1)修改环境,装相应的os,gcc,ns2
(2)移植到新的环境,怎么移?采用gdb调试,没有别的办法!!!
2.2、自己写协议
路由协议?应用层协议?MAC协议?
(1)最好的方法就是模仿已有的协议,代表协议AODV, MAC802.11,Ping
(2)添加路由协议,从Agent继承
(3)添加应用层协议,从Agent(更灵活)或者Application(有些不能实现)
3、添加协议的举例
3.1、示例:一个泛洪协议(Mflood)
协议类型:路由层协议
(1)定义包头
//根据需要定义变量,这个灵活决定
….
//包头访问的方法,你只需要复制下来就OK了
(2)实现协议
(3)关联tcl对象与C++对象(模板)
(4)关联tcl对象与C++对象的包头(模板)
(5)目前为止,所有的代码工作都已经完成了
剩下的工作就是将这个协议编译到NS2中。
需要修改一下文件
l ns-packet.tcl (ns-allinone-2.29\ns-2.29\tcl\lib)
l packet.h (ns-allinone-2.29\ns-2.29\common)
l ns-lib.tcl (ns-allinone-2.29\ns-2.29\tcl\lib)
对于我们这个应用层协议不需要修改
(6)修改ns-packet.tcl(ns-2.29/tcl/lib)
目的:在NS启动的时候加载我们的包头。
(7)修改packet.h(一共修改两处ns-2.29/common)
目的:Trace中使用,协议构造函数SpTreeAgent()初始化时使用
(8)如果是路由协议如(AODV)
还需要修改ns-lib.tcl
(9)还有这段代码(Mflood未使用)~ns-mobilenode.tcl
添加新协议总结:
a) 5c-必须实现的五个C++模块
1) MFlood与MFloodclass
2) hdr_mflood与MFloodHeaderClass
3) packt.h添加包头类型
b) 2t-修改两个tcl文件
1) ns-lib.tcl与ns-packet.tcl
2) 有时候还会修改ns-defaut.tcl
c) 1m-修改Makefile,将新协议添加
d) 关于添加应用协议如ping,跟路由协议类似,甚至跟简单,如果从Agent继承,除了不需要修改ns-lib.tcl之外其它类似。
e) 但是别忘了设置包头的大小,不然你发出的所有数据包头的大小都是0!!!!
f) PingAgent::PingAgent() : Agent(PT_PING) {
g) bind("packetSize_", &size_);
h) }
i) 修改Ns-defautl.tcl
j) Agent/Ping set packetSize_ 64
4、编译NS
在LINUX下,进入ns-2.29目录下
执行
make clean #删除所有的*.o文件
make depend
make #重新编译ns
如果没有错误,则可以编写场景测试
什么时候要make clean???
(1)如果添加新协议,或者修改了多个协议公用的NS中头文件,如packet.h我们都需要重新make clean然后make depend, make。
(2)修改了C++文件
对于NS中已有的代码修改,不需要修改makefile,只需要make
添加新的模块或协议
修改Makefile并重新
Make clean
Make depend
Make
(3)修改了Otcl文件
修改NS中已有的代码
recompile
source
添加新的代码
source
修改Makefile (NS_TCL_LIB), tcl/ns-lib.tcl (source) and recompile
都只需要make即可
2、添加协议
2.1、添加别人实现的协议
为什么我安装总是出错?????
环境问题,OS,gcc版本,ns版本
解决办法:
(1)修改环境,装相应的os,gcc,ns2
(2)移植到新的环境,怎么移?采用gdb调试,没有别的办法!!!
2.2、自己写协议
路由协议?应用层协议?MAC协议?
(1)最好的方法就是模仿已有的协议,代表协议AODV, MAC802.11,Ping
(2)添加路由协议,从Agent继承
(3)添加应用层协议,从Agent(更灵活)或者Application(有些不能实现)
3、添加协议的举例
3.1、示例:一个泛洪协议(Mflood)
协议类型:路由层协议
(1)定义包头
struct hdr_mflood { u_int32_t seq_;
//根据需要定义变量,这个灵活决定
….
//包头访问的方法,你只需要复制下来就OK了
static int offset_; // required by PacketHeaderManager inline static int& offset() { return offset_; } inline static hdr_sptree* access(const Packet* p) { return (hdr_sptree*) p->access(offset_); } };
(2)实现协议
class MFlood: public Agent { public: MFlood(); void recv(Packet *p, Handler *); int command(int, const char *const *); protected: inline int initialized() { return 1 && target_; } //发送函数,其实就是调用目的节点的接受函数 inline void send(Packet *p){ target_->recv(p); } };
(3)关联tcl对象与C++对象(模板)
static class MFloodclass : public TclClass { public: MFloodclass() : TclClass("Agent/MFlood") {} TclObject* create(int argc, const char*const* argv) { assert(argc == 5); return (new MFlood((nsaddr_t) atoi(argv[4]))); // PBO agrv[4] is index_} } } class_rtProtoMFlood;
(4)关联tcl对象与C++对象的包头(模板)
int hdr_mflood::offset_; static class MFloodHeaderClass : public PacketHeaderClass { public: MFloodHeaderClass() : PacketHeaderClass("PacketHeader/MFlood", sizeof(hdr_mflood)) { bind_offset(&hdr_mflood::offset_); } } class_mfloodhdr;
(5)目前为止,所有的代码工作都已经完成了
剩下的工作就是将这个协议编译到NS2中。
需要修改一下文件
l ns-packet.tcl (ns-allinone-2.29\ns-2.29\tcl\lib)
l packet.h (ns-allinone-2.29\ns-2.29\common)
l ns-lib.tcl (ns-allinone-2.29\ns-2.29\tcl\lib)
对于我们这个应用层协议不需要修改
(6)修改ns-packet.tcl(ns-2.29/tcl/lib)
foreach prot { # add by season MFlood …… }
目的:在NS启动的时候加载我们的包头。
(7)修改packet.h(一共修改两处ns-2.29/common)
enum packet_t { // insert new packet types here //add by season PT_MFLOOD, //Trace用到 PT_NTYPE // This MUST be the LAST one } class p_info { public: p_info() { //add by season name_[PT_MFLOOD]=“MFlood”;//与前面对应 name_[PT_NTYPE]= "undefined"; }
目的:Trace中使用,协议构造函数SpTreeAgent()初始化时使用
(8)如果是路由协议如(AODV)
还需要修改ns-lib.tcl
Simulator instproc create-wireless-node args { MFlood { set ragent [$self create-mflood-agent $node] } …} Simulator instproc create-mflood-agent { node } { set ragent [new Agent/MFlood [$node id]] $node set ragent_ $ragent return $ragent }
(9)还有这段代码(Mflood未使用)~ns-mobilenode.tcl
# Special processing for AODV set aodvonly [string first "AODV" [$agent info class]] if {$aodvonly != -1 } { $agent if-queue [$self set ifq_(0)] ;# ifq between LL and MAC }
添加新协议总结:
a) 5c-必须实现的五个C++模块
1) MFlood与MFloodclass
2) hdr_mflood与MFloodHeaderClass
3) packt.h添加包头类型
b) 2t-修改两个tcl文件
1) ns-lib.tcl与ns-packet.tcl
2) 有时候还会修改ns-defaut.tcl
c) 1m-修改Makefile,将新协议添加
d) 关于添加应用协议如ping,跟路由协议类似,甚至跟简单,如果从Agent继承,除了不需要修改ns-lib.tcl之外其它类似。
e) 但是别忘了设置包头的大小,不然你发出的所有数据包头的大小都是0!!!!
f) PingAgent::PingAgent() : Agent(PT_PING) {
g) bind("packetSize_", &size_);
h) }
i) 修改Ns-defautl.tcl
j) Agent/Ping set packetSize_ 64
4、编译NS
在LINUX下,进入ns-2.29目录下
执行
make clean #删除所有的*.o文件
make depend
make #重新编译ns
如果没有错误,则可以编写场景测试
什么时候要make clean???
(1)如果添加新协议,或者修改了多个协议公用的NS中头文件,如packet.h我们都需要重新make clean然后make depend, make。
(2)修改了C++文件
对于NS中已有的代码修改,不需要修改makefile,只需要make
添加新的模块或协议
修改Makefile并重新
Make clean
Make depend
Make
(3)修改了Otcl文件
修改NS中已有的代码
recompile
source
添加新的代码
source
修改Makefile (NS_TCL_LIB), tcl/ns-lib.tcl (source) and recompile
都只需要make即可
相关文章推荐
- 如何在NS-2 AODV协议中添加一种新的数据包类型[转载]
- 如何在NS-2 AODV协议中添加一种新的数据包类型
- NS-2.35添加MFlood协议
- 如何往NS2中添加新的MAC协议
- Linux内核实践 - 如何添加网络协议[二]:实现
- 向NS2中添加协议PING[转载]
- 如何添加一个MAC协议--NS2
- [转载] 淘宝旺铺扶植版如何添加背景音乐
- [转载] Windows如何在cmd命令行中查看、修改、删除与添加、设置环境变量
- 【转载】如何在Linux系统中添加新的系统调用
- 如何往NS2中添加新的MAC协议
- 如何添加CGRect, CGPoint等到NSMutableArray
- 在NS中添加自己编写新协议的步骤
- [翻译]NS下添加新协议
- InstallShield的InstallScript MSI工程中如何添加用户协议界面
- 如何往IE工具条添加按钮(转载)
- 如何将Android例子程序添加到Eclipse进行调试运行(转载)
- Linux内核实践 - 如何添加网络协议
- 【转载】如何为软件添加注册码
- 如何:在 Visual Studio 中添加或移除引用(转载)