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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值