NS-2.35添加MFlood协议

       学习NS2有两个多月了,因为是Linux和NS的新手,在很多很简单的问题上纠结了过多的时间。这让我想把自己学习的过程记录下来,供没有基础仍学习NS2的人做个参考。
  系统: Ubuntu 12.04.2 LTS,NS-2.35
       我是参照黄化吉、冯穗力、秦丽娇、陆宏治编著的《NS网络模拟和协议仿真》第11章洪泛路由协议的移植来做的,MFlood协议也是该书上的版本。同时参考了以下网址上的办法:
       http://www.chinadmd.com/file/auxvoxotrpwopop6ezarxz6t_1.html
       http://www.cnblogs.com/reaver21/archive/2012/02/09/2344056.html
       步骤一:在/ns-allinone-2.35/ns-2.35目录下新建mflood文件夹,并将5个协议文件:mflood.h,mflood.cc,mflood_packet.h,mflood-seqtable.h,mflood-seqtable.cc放于该文件夹下面。
       步骤二:修改NS中与mflood协议相关的文件。
       (1)ns-2.35/common/packet.h
        mflood协议定义的分组类型为:PT_MFLOOD,需要将该分组类型添加到packet.h文件中。该添加过程需要做两处改动:
        其一,修改packet_t的类型。在PT_NTYPE之前加入PT_MFLOOD。如下面下滑线的代码是新加入的内容。添加自定义的分组类型是必须保证PT_NTYPE为最后一个。
        但2.35跟2.29很不同,在75行左右说的很清楚:自从ns-2.33就修改了,加入了对动态库的支持。packet_t从enum枚举类型改成了unsigned int类型,为了使得新加动态库中可以动态定义新的分组。预定义的分组类型通过static const来实现。
       
static const packet_t PT_TCP = 0;
……
……
staticconst packet_t PT_MFLOOD =73;
static packet_t PT_NTYPE = 74; // This MUST be the LAST one
         其二,在class p_info { }中加入对应分组类型PT_MFLOOD的字符串:name [PT_MFLOOD]="MFlood"

         跟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键,每次添加代码的时候,段前和段后要注意。

     


                     




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值