百思论坛
                                                                  -工程科技交流平台

百思论坛 » 网络仿真软件 » NS » 在NS2中添加路由协议(整理版)3


2009-4-10 10:46 damaozy
在NS2中添加路由协议(整理版)3

[b]step 3:[/b]我们需要对ns2中的一些文件进行修改,来使这个协议在tcl中被调用,
需要修改的文件有以下几个,你可以在ns目录下找到它们:
[color=#ff0000]Common/packet.h[/color]
[color=#ff0000]Trace/cmu-trace.h[/color]
[color=#ff0000]Trace/cmu-trace.cc[/color]
[color=#ff0000]Tcl/lib/ns-packet.tcl[/color]
[color=#ff0000]Tcl/lib/ns-default.tcl[/color]
[color=#ff0000]Tcl/lib/ns-lib.tcl[/color]
[color=#ff0000]Queue/priqueue.cc[/color]
[color=#ff0000]Makefile[/color]
[b]step4:[/b]需要修改的具体内容(在需要修改的地方添加红色的字)
[b]1.Common/packet.h [/b](两个需要修改的地方)
[align=left]1: enum packet_t {[/align]
[align=left]2: PT_TCP,[/align]
[align=left]3: PT_UDP,[/align]
[align=left]4: PT_CBR,[/align]
[align=left]5: /* ... much more packet types ... */[/align]
[align=left][color=#ff0000][color=#000000]6:[/color] PT_PROTONAME,[/color][/align]
[align=left]7: PT_NTYPE // This MUST be the LAST one[/align]
[align=left]8: };[/align]
[align=left]=======================================[/align]

[align=left]1: p_info() {[/align]
[align=left]2: name_[PT_TCP]= "tcp";[/align]
[align=left]3: name_[PT_UDP]= "udp";[/align]
[align=left]4: name_[PT_CBR]= "cbr";[/align]
[align=left]5: /* ... much more names ... */[/align]
[align=left]6: [color=#ff0000]name_[PT_PROTONAME]= "protoname";[/color][/align]
[align=left]7: }[/align]

[b]2.Trace/cmu-trace.h [/b](一个)
[align=left]1: class CMUTrace : public Trace {[/align]
[align=left]2: /* ... definitions ... */[/align]
[align=left]3: private:[/align]
[align=left]4: /* ... */[/align]
[align=left]5:[color=#ff0000] void format_aodv(Packet *p, int offset);[/color][/align]
[align=left]6: [color=#ff0000]void format_protoname(Packet *p, int offset);[/color][/align]
[align=left]7: };[/align]

[b]3.Trace/cmu-trace.cc[/b] (三个,先在最上面加头文件,在找一个合适的地方加函数)
[align=left]1: [color=#ff0000]#include <protoname/protoname_pkt.h>[/color][/align]
[align=left]2:[/align]
[align=left]3: /* ... */[/align]
[align=left]4:[/align]
[align=left][color=#ff0000]5: void[/color][/align]
[align=left][color=#ff0000]6: CMUTrace::format_protoname(Packet *p, int offset)[/color][/align]
[align=left][color=#ff0000]7: {[/color][/align]
[align=left][color=#ff0000]8: struct hdr_protoname_pkt* ph = HDR_PROTONAME_PKT(p);[/color][/align]
[align=left][color=#ff0000]9:[/color][/align]
[align=left][color=#ff0000]10: if (pt_->tagged()) {[/color][/align]
[align=left][color=#ff0000]11: sprintf(pt_->buffer() + offset,[/color][/align]
[align=left][color=#ff0000]12: "-protoname:o %d -protoname:s %d -protoname:l %d ",[/color][/align]
[align=left][color=#ff0000]13: ph->pkt_src(),[/color][/align]
[align=left][color=#ff0000]14: ph->pkt_seq_num(),[/color][/align]
[align=left][color=#ff0000]15: ph->pkt_len());[/color][/align]
[align=left][color=#ff0000]16: }[/color][/align]
[align=left][color=#ff0000]17: else if (newtrace_) {[/color][/align]
[align=left][color=#ff0000]18: sprintf(pt_->buffer() + offset,[/color][/align]
[align=left][color=#ff0000]19: "-P protoname -Po %d -Ps %d -Pl %d ",[/color][/align]
[align=left][color=#ff0000]20: ph->pkt_src(),[/color][/align]
[align=left][color=#ff0000]21: ph->pkt_seq_num(),[/color][/align]
[align=left][color=#ff0000]22: ph->pkt_len());[/color][/align]
[align=left][color=#ff0000]23: }[/color][/align]
[align=left][color=#ff0000]24: else {[/color][/align]
[align=left][color=#ff0000]25: sprintf(pt_->buffer() + offset,[/color][/align]
[align=left][color=#ff0000]26: "[protoname %d %d %d] ",[/color][/align]
[align=left][color=#ff0000]27: ph->pkt_src(),[/color][/align]
[align=left][color=#ff0000]28: ph->pkt_seq_num(),[/color][/align]
[align=left][color=#ff0000]29: ph->pkt_len());[/color][/align]
[align=left][color=#ff0000]30: }[/color][/align]
[align=left][color=#ff0000]31: }[/color][/align]

[align=left]=========================================[/align]
[align=left][color=#ff0000]1: void[/color][/align]
[align=left][color=#ff0000]2: CMUTrace::format(Packet* p, const char *why)[/color][/align]
[align=left][color=#ff0000]3: {[/color][/align]
[align=left][color=#ff0000]4: /* ... */[/color][/align]
[align=left][color=#ff0000]5: case PT_PING:[/color][/align]
[align=left][color=#ff0000]6: break;[/color][/align]
[align=left][color=#ff0000]7:[/color][/align]
[align=left][color=#ff0000]8: case PT_PROTONAME:[/color][/align]
[align=left][color=#ff0000]9: format_protoname(p, offset);[/color][/align]
[align=left][color=#ff0000]10: break;[/color][/align]
[align=left][color=#ff0000]11:[/color][/align]
[align=left][color=#ff0000]12: default:[/color][/align]
[align=left][color=#ff0000]13: /* ... */[/color][/align]
[align=left][color=#ff0000]14: }[/color][/align]

[b]4.Tcl/lib/ns-packet.tcl[/b](一个)
1: foreach prot {
[align=left]2:[color=#ff0000] Protoname[/color][/align]
[align=left]3: AODV[/align]
[align=left]4: ARP[/align]
[align=left]5: # ...[/align]
[align=left]6: NV[/align]
[align=left]7: } {[/align]
[align=left]8: add-packet-header $prot[/align]
[align=left]9: }[/align]

[b]5.Tcl/lib/ns-default.tcl[/b](一个)
1: # ...
[align=left][color=#ff0000]2: # Defaults defined for Protoname[/color][/align]
[align=left][color=#ff0000]3: Agent/Protoname set accessible_var_ true[/color][/align]

[b]6.Tcl/lib/ns-lib.tcl[/b](两个)
1: Simulator instproc create-wireless-node args {
[align=left]2: # ...[/align]
[align=left][color=#000000]3: switch -exact $routingAgent_ {[/color][/align]
[align=left][color=#ff0000]4: Protoname {[/color][/align]
[align=left][color=#ff0000]5: set ragent [$self create-protoname-agent $node][/color][/align]
[align=left][color=#ff0000]6: }[/color][/align]
[align=left]7: # ...[/align]
[align=left]8: }[/align]
[align=left]9: # ...[/align]
[align=left]10: }[/align]
[align=left] [/align]
[align=left]=======================================[/align]
[align=left][color=#ff0000]1: Simulator instproc create-protoname-agent { node } {[/color][/align]
[align=left][color=#ff0000]2: # Create Protoname routing agent[/color][/align]
[align=left][color=#ff0000]3: set ragent [new Agent/Protoname [$node node-addr]][/color][/align]
[align=left][color=#ff0000]4: $self at 0.0 "$ragent start"[/color][/align]
[align=left][color=#ff0000]5: $node set ragent_ $ragent[/color][/align]
[align=left][color=#ff0000]6: return $ragent[/color][/align]
[align=left][color=#ff0000]7: }[/color][/align]

[b]7.Queue/priqueue.cc[/b](一个)
[align=left]1: void[/align]
[align=left]2: PriQueue::recv(Packet *p, Handler *h)[/align]
[align=left]3: {[/align]
[align=left]4: struct hdr_cmn *ch = HDR_CMN(p);[/align]
[align=left]5:[/align]
[align=left]6: if (Prefer_Routing_Protocols) {[/align]
[align=left]7:[/align]
[align=left]8: switch(ch->ptype()) {[/align]
[align=left]9: case PT_DSR:[/align]
[align=left]10: case PT_MESSAGE:[/align]
[align=left]11: case PT_TORA:[/align]
[align=left]12: case PT_AODV:[/align]
[align=left][color=#ff0000]13: case PT_PROTONAME:[/color][/align]
[align=left]14: recvHighPriority(p, h);[/align]
[align=left]15: break;[/align]
[align=left]16:[/align]
[align=left]17: default:[/align]
[align=left]18: Queue::recv(p, h);[/align]
[align=left]19: }[/align]
[align=left]20: }[/align]
[align=left]21: else {[/align]
[align=left]22: Queue::recv(p, h);[/align]
[align=left]23: }[/align]
[align=left]24: }[/align]

[b]8.Makefile[/b](一个)
1: OBJ_CC = \
[align=left]2: tools/random.o tools/rng.o tools/ranvar.o common/misc.o common/timer-handler.o \[/align]
[align=left]3: # ...[/align]
[align=left][color=#ff0000]4: protoname/protoname.o protoname/protoname_rtable.o \[/color][/align]
[align=left]5: # ...[/align]
[align=left]6: $(OBJ_STL)[/align]

[b]step 5:[/b]编译
[align=left]在ns目录下输入下名命令进行编译:[/align]

[align=left]$ make clean[/align]
[align=left]$ touch common/packet.cc[/align]
[align=left]$ make[/align]
[align=left][/align]

[align=left]到这里,我们添加新协议的过程就结束了。
[/align]

[align=left][b]step 6:[/b]测试[/align]

[align=left]协议写完了,要用一个tcl对它进行测试,下面这是个很简单的而且可用的例子[/align]

[align=left]set ns [new Simulator][/align]
[align=left]$ns node-config -Routing protoname   [/align]
[align=left]set nf [open out.nam w]     [/align]
[align=left]$ns namtrace-all $nf       [/align]
[align=left]set nd [open out.tr w]       [/align]
[align=left]$ns trace-all $nd             [/align]
[align=left]  proc finish {} {[/align]
[align=left]          global ns nf  nd[/align]
[align=left]          $ns flush-trace [/align]
[align=left]          close $nf       [/align]
[align=left]          close $nd       [/align]
[align=left]          exec nam out.nam &[/align]
[align=left]          exit 0[/align]
[align=left]   }[/align]
[align=left][/align]
[align=left]for {set i 0} {$i < 7} {incr i} {set n($i) [$ns node] }[/align]
[align=left]for {set i 0} {$i < 7} {incr i} {[/align]
[align=left]$ns duplex-link $n($i) $n([expr ($i+1)%7]) 1Mb 10ms DropTail[/align]
[align=left]}[/align]

[align=left]set udp0 [new Agent/UDP]   [/align]
[align=left]$ns attach-agent $n(0) $udp0[/align]
[align=left]set cbr0 [new Application/Traffic/CBR] [/align]
[align=left]$cbr0 set packetSize_ 500     [/align]
[align=left]$cbr0 set interval_ 0.005      [/align]
[align=left]$cbr0 attach-agent $udp0[/align]
[align=left]set null0 [new Agent/Null][/align]
[align=left]$ns attach-agent $n(3) $null0[/align]
[align=left]$ns connect $udp0 $null0 [/align]
[align=left]$ns at 0.5 "$cbr0 start"[/align]
[align=left]$ns rtmodel-at 1.0 down $n(1) $n(2) [/align]
[align=left]$ns rtmodel-at 2.0 up $n(1) $n(2)   [/align]
[align=left]$ns at 4.5 "$cbr0 stop"[/align]
[align=left]$ns at 5.0 "finish"[/align]
[align=left]$ns run[/align]


参考文献:
[align=left][1]Implementing a New Manet Unicast Routing Protocol in NS2,Francisco J. Ros  Pedro M. Ruiz[/align]
[align=left][2]http://ourlab.blog.sohu.com/64266258.html[/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]

[align=left]原文转自我的blog:[url=http://blog.163.com/caroline_zhang]http://blog.163.com/caroline_zhang[/url][/align]

[align=left] [/align]

2009-4-10 10:49 bluebird
正好要用这个,顶!!!

2009-4-10 11:02 牛奶加烧酒
学习学习
感谢楼主:good

2009-4-10 14:24 qiubiyu
:rose:rose:rose

2009-4-10 16:16 damaozy
为什么行距这么大?很奇怪

2009-4-16 11:20 moonlight616826
谢谢  刚好在做这一块的内容

2009-4-26 11:00 jackyLi
我什么都不懂啊,非常感谢,还是有好多地方不懂哦,是不是完全按照你的加代码就行了啊

2009-4-27 13:01 damaozy
[quote]原帖由 [i]jackyLi[/i] 于 2009-4-26 11:00 发表
我什么都不懂啊,非常感谢,还是有好多地方不懂哦,是不是完全按照你的加代码就行了啊 [/quote]

不是哦,你要加你自己的代码啊:)

2009-4-28 14:18 为你痴狂
非常感谢斑竹啊    帮助很大   辛苦了  :good

2009-5-6 08:36 ly830527
往ns2中添加新协议的一般步骤是什么 比如要修改那些文件的那些地方!
我想添加一个完全新的协议SCPS-TP,它是传输层的协议,它用的网络层和应用层的协议都是新的!
能给点什么建议么,我现在基本没什么思路啊。愁啊!!

2009-5-6 14:53 dagongjiaimimi
楼上的,如果你要加一个新的协议

那么你可能需要写好几个文件啊
比如,你的协议叫做A
那么你A的文件夹下一般应该包含A.h A.cc rtable.cc rtable.h.....巴拉巴拉等等

写完以后,需要在ns-2.33(取决于你使用的版本)文件夹下

make

make命令生成目标文件,就是.o文件

如果没有错的话 ,就ok了

还不明白可参考ns-2.33/dsr 或者aodv

2009-5-25 13:05 dcc986
真是太感谢了

2009-6-3 15:08 oucbear
谢谢楼主

2009-6-16 10:11 sjf_zj2006
太好了 详细!感谢楼主分享!

2009-6-21 15:29 tianhit
弱弱地问斑竹,在step3中:修改以下文件
[color=#ff0000]Common/packet.h
Trace/cmu-trace.h[/color]
[color=#ff0000]Trace/cmu-trace.cc[/color]
[color=#ff0000]Tcl/lib/ns-packet.tcl[/color]
[color=#ff0000]Tcl/lib/ns-default.tcl[/color]
[color=#ff0000]Tcl/lib/ns-lib.tcl[/color]
[color=#ff0000]Queue/priqueue.cc[/color]
[color=#ff0000]Makefile[/color]
是否对NS2中本来已存在的协议组件造成影响?或者说要运行以前其他的协议是否需要把这些修改过的地方,重新改回来呢?
能否解释下?谢谢了!

2009-7-11 09:20 catfish1112
高手

2009-9-15 08:36 tianyabingxue
:rose:rose:rose:lol

2009-10-16 10:53 shufeidu
太棒了,谢谢楼主

2009-12-22 14:23 felixco
谢谢楼主!

2010-3-2 21:16 nongxiufeng
很详细,很好,谢谢了。还想问一个问题,假如我要修改一下添加的协议算法,那又该怎么做呢?期待答复

页: [1] 2 3