ns2 2.35 mflood协议移植

刚在ns2 2.35版本下移植了mflood协议,主要参照了网上一些ns2.34的资料和《NS网络模拟和协议仿真》中第11章ns2.29的mflood移植过程。

按照书上的验证方法,应该是移植成功了。验证采用书上第四章第2个例子,例子去www.ptpress.com.cn上搜这本书,然后资料里有的下。

 

1. 下载mflood协议

mflood协议我是从csdn上下载的,里面还有leach协议,一会移植下试试。

地址是:http://download.csdn.net/detail/lzq20082009/3365100

压缩包里有个mfloodtest应该是用来测试的,但是跑了没什么效果,不太懂,有知情者可以告诉我为啥哈,学习下~~~

2. 在ns-2.35文件夹下建立mflood目录

如题,在你的ns-2.35目录下建立mflood目录,将下载的文件中的,mflood.h, mflood.cc, mflood_packet.h, mflood-seqtable.h, mflood-seqtable.cc放入该文件夹内。

3. ns-2.35/common/packet.h

(1)packet.h是定义分组类型头文件,这里要修改packet_t的类型。2.35跟2.29很不同,在75行左右说的很清楚:

  自从ns-2.33就修改了,加入了对动态库的支持。

  packet_t从enum枚举类型改成了unsigned int类型,为了使得新加动态库中可以动态定义新的分组。

  预定义的分组类型通过static const来实现。

那么在下面一串 

static const packet_t PT_TCP = 0;
……
……
static packet_t PT_NTYPE = 73; // This MUST be the LAST one

 

这些都是分组类型,最后一行的PT_NTYPE必须是最后一个,那么在这行之前加入PT_MFLOOD类型。

加入划线一行之后如下:

static const packet_t PT_TCP = 0;
……
……
static const packet_t PT_MFLOOD = 73;
static packet_t PT_NTYPE = 74; // This MUST be the LAST one

(2)同样是这个文件,还需要加入对应分组类型PT_MFLOOD的字符串。

需要p_info类,跟2.29也不一样了,2.35把赋值语句放到了initName()函数中,找到这个函数,可以把这句依然放到PT_NTYPE之前。

name_[PT_MFLOOD]="MFlood";
name_[PT_NTYPE]="undefined";


4. ns-2.35/tcl/lib/ns-packet.tcl

mflood定义自己的分组头部,这个头部需要激活。所以在此文件中修改,添加mflood的头部。(mflood头部定义的具体代码在mflood.cc中,想看的可以去看看这是个啥)。这里的MFlood写法应该和上一步“”中的一样,书上貌似写错了,写成了Mflood,f小写了,应该是大写的。

#Mobility, Ad-Hoc Networks, Sensor Nets:
MFlood
AODV # WSN protocol for ad-hoc networks

5. ns-2.35/tcl/lib/ns-lib.tcl

(1)在这里添加语句,表示当无线移动节点指定路由协议为MFlood是,将调用create-mflood-agent成员函数进行初始化。

OMNIMCAST {
eval $node addr $args
set ragent [$self create-omnimcast-agent $node]
}
MFlood {
set ragent [$self create-mflood-agent $node]
}

下划线一段加在这个switch语段里就行了,不一定非要加到OMNIMCAST后面。

(2)在末尾加入函数具体定义。

Simulator instproc create-mflood-agent {node} {
set ragent [new Agent/MFlood [$node id]]
$node set ragent_ $ragent
return $ragent
}


6. ns-2.35/Makefile

    修改Makefile文件,加入:

wpan/p802_15_4trace.o wpan/p802_15_4transac.o \
apps/pbc.o \
mflood/mflood.o mflood/mflood-seqtable.o \
$(OBJ_STL)

 

7*. mflood/mflood.cc  mflood/mflood.h

这一步不一定要做,主要看你下载的mflood协议里写没写这些,我下的那个写了,所以此步骤可以忽略。写在这只是提个醒,注意检查下mflood.cc和mflood.h的内容。

(1)mflood.cc中:

else if (strcmp(argv[1], "uptarget") == 0) {
if (*argv[2] == '0') {
……
……}
if (uptarget == 0) {
……
……}
return (TCL_OK);
}
else if (strcasecmp (argv[1], "port-dmux") == 0) {
TclObject *obj;
port_dmux_ = (NsObject *) obj;
return (TCL_OK);
}

(2)mflood.h

// A mechanism for logging the contents of the routing
Trace *logtarget;
NsObject *uptarget_;
NsObject *port_dmux_;

注意有下划线的地方。

8. 重新编译NS

回到ns-2.35的目录下,执行make

 

经过以上步骤应该不会出error。

 

9. 验证移植结果

使用《NS网络模拟和协议仿真》第4章第2个,3节点无线网的例子来验证。

将源文件中

set val(rp)    MFlood ;#路由协议更改为MFlood

然后可以另存为mflood-3nodes.tcl

ns运行下,查看结果和trace文件。

大致如此了。






posted @ 2012-02-09 15:45  Reaver21  阅读(3270)  评论(5编辑  收藏  举报