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)定义包头
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即可