您的位置:首页 > 其它

如何在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)定义包头

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即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: