http://blog.csdn.net/fhtingtian/article/details/5362653
在NS2想要添加一个协议,至少要实现如下8个步骤。下面以ns2中的ping为例子说明,在版本2.29中已存在ping,这里改为bing。
1.因为ping在文件夹apps下,这里就在该目录下(自己新建协议时,应该建立新的文件夹bing)新建文件bing.h bing.cc。
2.在bing.h中定义为packet头定义一个struct数据类型, 例如 "struct hdr_bing"; ( 仿照 "~ns/apps/ping.h" 文件中的hdr_ping)和一个类BingAgent(仿照PingAgent)
3.在bing.cc中定义BingHeaderClass和BingClass(仿照ping.cc中的类)。
前面三步可以省略,直接在文件夹apps下cp ping.h bing.h和cp ping.cc bing.cc,然后把bing.h和bing.cc中所有的ping,PING,Ping用bing,BING,Bing替代。以下几步是必要的修改:
4. 在 "~ns/common/packet.h" 文件中,为 enum packet_t 添加一个新的条目 "PT_BING" ,并在p_into类的构造函数中添加一个新的数组元素 name[PT_BING] = "bing",要注意此处的位置必须对应。
5. 在文件 "~ns/tcl/lib/ns-packet.tcl" 中,在"foreach prot" 中添加"BING" 。
6. 在文件 "~ns/tcl/lib/ns-default.tcl" 中,设置包的默认大小Agent/Bing set packetSize_ 64
7.在文件~ns/makefile中,apps/ping.o后添加apps/bing.o.(apps表示bing.h和bing.cc所在的文件夹,所以如果自己新建了文件夹bing,此处应添加bing/bing.o)
8.保存以上文件后,需要先‘make depend‘一下,生成依赖关系,然后再‘make‘。成功后,可以仿照ping.tcl建立一个bing.tcl(在文件中用bing,Bing替换ping,Ping)。接下来就可以运行ns bing.tcl查看结果。
以上各个步骤,步骤2是为了定义新的包头格式;步骤3是为了能够将该数据包与Otcl联系起来;步骤4是为了在trace中能够使用该数据包,注意name[PT_TCP]="tcp",其中的 "tcp" 即是出现在trace文件中的第五列,pkt type;步骤5是为了NS在启动的时候能够载入我们定义的包头。
最后需要注意:如果新建的协议是无线路由协议,则还需要在 "~ns/tcl/lib/ns-lib.tcl" 文件中Simulator的create-wireless-node方法中添加相应的处理。
小结:.h文件中主要定义头结构体hdr_[name],[name]agent:public agent。结构体中访问方法部分基本相同,类中要有默认构造函数和命令函数。所有.cc文件中的[name]headerclass和[name]class内容基本相同,主要是类agent中成员函数的实例化。