……
……
staticconst packet_t PT_MFLOOD =73;
static packet_t PT_NTYPE = 74; // This MUST be the LAST one
跟2.29也不一样,2.35把赋值语句放到了initName()函数中,找到这个函数,可以把这句依然放到PT_NTYPE之前。
name_[PT_MFLOOD]="MFlood";
name_[PT_NTYPE]="undefined";
(2)ns-2.35/tcl/lib/ns-packet.tcl
mflood定义自己的分组头部hdr_mflood,这个头部需要激活,否则将产生异常。所以要在ns-packet.tcl文件中定义的激活分组头的进程中加入MFlood。(mflood头部定义的具体代码在mflood.cc中)。
#Mobility, Ad-Hoc Networks, Sensor Nets:
MFlood
AODV # WSN protocol for ad-hoc networks
(3)ns-2.35/tcl/lib/ns-lib.tcl
在ns-lib.tcl中Simulator类的create-wireless-node成员函数(这个函数的定义为Simulator instproc create-wireless-node args)中加入下划线中的代码:
Simulator instproc create-wireless-node args {
……
switch -exact $routingAgent_ { #这里是不同的协议的初始化函数,以下为加入代码
AODV {
set ragent [$self create-omnimcast-agent $node]
}
TORA {
Simulator set IMEPFlag_ ON
set ragent [$self create-tora-agent $node]
}
MFlood {
set ragent [$self create-mflood-agent $node]
}
……
}
……
}
这个表示当无线移动节点指定跌幅协议为MFlood的时候,将会调用create-mflood-agent成员函数来进行初始化。
然后在ns-lib.tcl文件中定义create-mflood-agent成员函数,代码如下:
Simulator instproc create-mflood-agent {node} {
set ragent [new Agent/MFlood [$node id]]
$node set ragent_ $ragent
return $ragent
}
这里注意,set前请使用制表符对齐。从create-mflood-agent函数的定义可以看出,创建了Agent/MFlood对象,这个对象最后将和某个移动节点$node绑定在一起。
步骤三:ns-2.35/Makefile。
在makefile文件的OBJ_CC变量的定义中加入下划线上的代码:
wpan/p802_15_4trace.o wpan/p802_15_4transac.o \
apps/pbc.o \
mflood/mflood.o mflood/mflood-seqtable.o \
$(OBJ_STL)
注意:每个.o后面都有一个空格
保存Makefile,然后回到ns-2.35目录下,分别执行,make clean,make,sudo make install重新编译NS。
然后运行书中的验证例子:mflood-3nodes.tcl。(注意:mflood-3nodes.tcl放到ns-2.35下的一个文件夹内)
Terminal终端的运行显示如下:
num_nodes is set 3
INITIALIZE THE LIST xListHead
Start Simulation...
channel.cc:sendUp - Calc highestAntennaZ_ and distCST_
highestAntennaZ_ = 1.5, distCST_ = 550.0
SORTING LISTS ...DONE!
最经常出的一个错误为:
invalid command name "Agent/MFlood"
while executing
"Agent/MFloodcreate _o17 0"
invoked from within
"catch"$className create $o $args" msg"
invoked from within
"if [catch"$className create $o $args" msg] {
if [string match"__FAILED_SHADOW_OBJECT_" $msg] {
delete $o
return ""
}
global errorInfo
error "class$..."
(procedure "new" line 3)
invoked from within
"newAgent/MFlood [$node id]"
(procedure "_o3" line 2)
(Simulator create-mflood-agent line 2)
invoked from within
"$selfcreate-mflood-agent $node"
("MFlood" arm line 2)
invoked from within
"switch -exact$routingAgent_ {
DSDV {
set ragent [$selfcreate-dsdv-agent $node]
}
DSR {
$self at 0.0"$node start-dsr"
}
AODV {
set ragent [$selfcre..."
(procedure "_o3" line 14)
(Simulator create-wireless-node line 14)
invoked from within
"_o3create-wireless-node"
("eval" body line 1)
invoked from within
"eval $selfcreate-wireless-node $args"
(procedure "_o3" line 23)
(Simulator node line 23)
invoked from within
"$nsnode"
invoked from within
"set n0 [$nsnode]"
(file "test.tcl" line 64)
这表示MFlood没有编译进NS中,我的解决办法是:先查看Makefile文件,确保添加了mflood/mflood.o mflood/mflood-seqtable.o \。保存Makefile文件后,在ns-2.35下执行make clean,make,make install。
如果提示报错permission denied,解决办法为执行sudo make install。
另外有一点:NS2中需要经常用Tab键,每次添加代码的时候,段前和段后要注意。