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文件。
大致如此了。