如何在NS-2中添加协议[转载]

来源:互联网 发布:电子与通信工程知乎 编辑:程序博客网 时间:2024/04/28 08:51

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即可

原创粉丝点击