📄 rmcc.tcl
字号:
Class ScenLib/RMproc usage {prog} { switch $prog { "rmcc-1" { puts stderr "usage: ns rmcc-1.tcl -test 1 \ <or 2 or 3 indicating the \ testnum> \[other options\]See rmcc-1.tcl for description of each test\ conditions\n" exit 1 } "rmcc-2" { puts stderr "usage: ns rmcc-2.tcl \ \[other options\]" exit 1 } "rmcc-3" { puts stderr "usage: ns rmcc-3.tcl \ \[other options\]" exit 1 } "rmcc-4" { puts stderr "usage: ns rmcc-4.tcl \ \[other options\]" exit 1 } }}proc default_options {prog} { # check here for other options that may be set for the diffrent # experiments global opts set opts(routingProto) CtrMcast set opts(srmSimType) SRM set opts(rmSrcType) CBR set opts(tcpSrcType) FTP set opts(pktSize) 1000 switch $prog { rmcc-1 { set opts(test) -1 set opts(tcpType) TCP set opts(sinkType) TCPSink } rmcc-2 { set opts(tcpType) TCP/Reno set opts(sinkType) TCPSink/DelAck set opts(bottleneckBW) 1Mbps set opts(bottleneckDelay) 20ms set opts(bottleneckQSize) 60 } rmcc-3 { set opts(tcpType) TCP set opts(sinkType) TCPSink set opts(bottleneckBW) 1Mbps set opts(bottleneckDelay) 20ms set opts(bottleneckQSize) 30 } rmcc-4 { set opts(tcpType) TCP/Sack1 set opts(sinkType) TCPSink/Sack1 set opts(bottleneckDelay) 20ms set opts(clientNum) 10 # other options } }}proc process_args {argv } { global prog default_options $prog global opts for {set i 0} {$i < [llength $argv]} {incr i} { set key [lindex $argv $i] regsub {^-} $key {} key if {![info exists opts($key)]} { puts stderr "unknown option \"$key\"" } incr i set opts($key) [lindex $argv $i] }}ScenLib/RM instproc set_traces {} { global prog opts ns srmStats srmEvents t $ns trace-all [open out-$t.tr w] $ns namtrace-all [open out-$t.nam w] #set srmStats [open srmStats-$t.tr w] #set srmEvents [open srmEvents-$t.tr w]}ScenLib/RM instproc init {} { $self instvar fid_ set fid_ 0 global prog opts ns n set ns [new Simulator] Simulator set EnableMcast_ 1 Simulator set NumberInterfaces_ 1 #Node expandaddr $ns color 0 white ;# data packets $ns color 40 blue ;# session $ns color 41 red ;# request $ns color 42 green ;# repair $ns color 1 azure ;# source node $ns color 2 lavender ;# recvr node $ns color 3 navy ;# traffic $ns color 4 SeaGreen $ns color 5 green $ns color 6 DarkGreen $ns color 7 coral $ns color 8 OrangeRed $ns color 9 maroon $ns color 10 DarkBlue $self set_traces return $self}proc set_flowMonitor {flowmon output_chan} { $flowmon attach $output_chan set bytesInt_ [new Integrator] set pktsInt_ [new Integrator] $flowmon set-bytes-integrator $bytesInt_ $flowmon set-pkts-integrator $pktsInt_ return $flowmon}ScenLib/RM instproc make_flowmon { time args } { global ns $self instvar flowmon_ #puts "time = $time" #puts "args = $args" if {[expr [llength $args] % 3] != 0} { puts stderr {Error: Incomplete arguments for make_flowmon..} } #set c 0 for {set i 0} {$i < [llength $args]} {incr i} { set node1 [lindex $args $i] incr i set node2 [lindex $args $i] incr i set fout [lindex $args $i] set a [$node1 id] set b [$node2 id] set flow_stat($a:$b) [open $fout w] set flowmon_($a:$b) [$ns makeflowmon Fid] $ns attach-fmon [$ns link $node1 $node2] $flowmon_($a:$b) 0 set_flowMonitor $flowmon_($a:$b) $flow_stat($a:$b) #$ns at $time "$flowmon_($a:$b) dump" #incr c }}ScenLib/RM instproc dump_flowmon {n1 n2 time} { $self instvar flowmon_ global ns n $ns at $time "$flowmon_([$n1 id]:[$n2 id]) dump"}ScenLib/RM instproc make_nodes num { global ns n # setup the nodes for {set i 0} {$i < $num} {incr i} { set n($i) [$ns node] #puts "node($i) -> $n($i)" }}ScenLib/RM instproc create_mcast {srcnode switch addgrp time args} { global ns n opts srmStats srmEvents mflag $self instvar mrthandle_ fid_ if {$mflag == 0} { set mrthandle_ [$ns mrtproto $opts(routingProto) {}] #puts "setting the mcastproto- $opts(routingProto)" set mflag 1 } set dest [Node allocaddr] puts "mcast grp = $dest" $ns at $switch "$mrthandle_ switch-treetype $dest" #puts "ns at $switch $mrthandle_ switch-treetype $dest" set src [new Agent/$opts(srmSimType)] $src set dst_ $dest $src set fid_ [incr fid_] #puts "srcnode $srcnode fid -> [$src set fid_]" #$src trace $srmEvents #$src log $srmStats #$ns at 1.0 "$src start" $ns at $addgrp "$src start" # puts "ns at $addgrp src start" $ns attach-agent $n($srcnode) $src for {set i 0} {$i < [llength $args]} {incr i} { set j [lindex $args $i] set rcvr($j) [new Agent/$opts(srmSimType)] $rcvr($j) set dst_ $dest $rcvr($j) set fid_ [incr fid_] #puts "Srm-recr $j fid -> [$rcvr($j) set fid_]" #$rcvr($j) trace $srmEvents #$rcvr($j) log $srmStats $ns attach-agent $n($j) $rcvr($j) #$ns at 1.0 "$rcvr($j) start" $ns at $addgrp "$rcvr($j) start" # puts "ns at$addgrp rcvr($j) start" } #setup source set cbr [new Agent/$opts(rmSrcType)] $cbr set packetSize_ $opts(pktSize) $src traffic-source $cbr $src set packetSize_ $opts(pktSize) ;#so repairs are correct $cbr set fid_ [incr fid_] #puts "cbr fid = [$cbr set fid_]" $ns at $time "$src start-source"}ScenLib/RM instproc create_cbr { args } { if {[expr [llength $args] % 5] != 0} { puts stderr {uneven number of tcp endpoints} } global ns n opts $self instvar fid_ # Attach a CBR source and connect between a sender and recr # node at the given time for {set i 0} {$i < [llength $args]} {incr i} { set k [lindex $args $i] set cbr($k) [new Agent/CBR] $cbr($k) set fid_ [incr fid_] $cbr($k) set packetSize_ $opts(pktSize) incr i $cbr($k) set interval_ [lindex $args $i] $ns attach-agent $n($k) $cbr($k) incr i set null($k) [new Agent/Null] $ns attach-agent $n([lindex $args $i]) $null($k) $ns connect $cbr($k) $null($k) incr i $ns at [lindex $args $i] "$cbr($k) start" incr i $ns at [lindex $args $i] "$cbr($k) stop" }}proc loss-model10 {} { global ns #setup loss model #set loss_module [new ErrorModel] #$loss_module set rate_ 0.1 set loss_module [new SRMErrorModel] $loss_module set rate_ 0.1 #$loss_module drop-packet 2 200 1 $loss_module drop-target [$ns set nullAgent_] return $loss_module}proc loss-model5 {} { global ns set loss_module [new SRMErrorModel] $loss_module set rate_ 0.05 #$loss_module drop-packet 2 200 1 $loss_module drop-target [$ns set nullAgent_] return $loss_module}ScenLib/RM instproc loss-model-case1 {time a b} { global ns n set loss_module [loss-model10] $ns at $time "$ns lossmodel $loss_module $n($a) $n($b)"}ScenLib/RM instproc loss-model-case2 {time1 time2 a b c d} { global ns n set loss_module1 [loss-model10] set loss_module2 [loss-model10] $ns at $time1 "$ns lossmodel $loss_module1 $n($a) $n($b)" $ns at $time2 "$ns lossmodel $loss_module2 $n($c) $n($d)"}ScenLib/RM instproc loss-model-case3 {time1 time2 a b c d} { global ns n set loss_module1 [loss-model5] set loss_module2 [loss-model10] $ns at $time1 "$ns lossmodel $loss_module1 $n($a) $n($b)" $ns at $time2 "$ns lossmodel $loss_module2 $n($c) $n($d)"}ScenLib/RM instproc create_tcp {args} { if {[expr [llength $args] % 3] != 0} { puts stderr {uneven number of tcp endpoints} } global ns n opts $self instvar fid_ #Attach a TCP flow between each src and recvr pair for {set i 0} {$i < [llength $args]} {incr i} { set k [lindex $args $i] set tcp($k) [new Agent/$opts(tcpType)] $tcp($k) set fid_ [incr fid_] $tcp($k) set packetSize_ $opts(pktSize) $ns attach-agent $n($k) $tcp($k) #puts "ns attach-agent n($k) tcp (fid [$tcp($k) set fid_]" incr i set tcp_sink($k) [new Agent/$opts(sinkType)] $ns attach-agent $n([lindex $args $i]) $tcp_sink($k) #puts "dest=[lindex $args $i]" $ns connect $tcp($k) $tcp_sink($k) incr i set ftp($k) [new Application/$opts(tcpSrcType)] $ftp($k) attach-agent $tcp($k) set time [lindex $args $i] $ns at $time "$ftp($k) start" #puts "At $time, tcp (from node$k) starts.. " }}proc finish {} { global prog ns opts srmEvents srmStats t #$src stop puts "Running finish.." $ns flush-trace #close $srmStats #close $srmEvents #XXX #puts "Filtering ..." #exec tclsh8.0 ../../../../nam-1/bin/namfilter.tcl out-$t.nam puts "running nam..." exec nam out-$t.nam & exit 0}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -