📄 red-pd.tcl
字号:
## Main test file for red-pd simulations#Class TestSuitesource monitoring.tclsource helper.tclsource sources.tclsource plot.tclsource traffic.tclsource topology.tcl#global optionsset unresponsive_test_ 1set target_rtt_ 0.040set seed_ 0set simtime_ 500set verbosity_ 0set plotgraphs_ 0set plotq_ 0set dump_interval_ 10set testIdent_ 0set listMode_ "multi"#topology or traffic specific optionset topo_para1_ -1set traf_para1_ -1set traf_para2_ -1TestSuite instproc init {} { $self instvar ns_ test_ net_ traffic_ enable_ $self instvar topo_ node_ $self instvar scheduler_ random_ global testIdent_ if {$traffic_ == "TestIdent"} { puts stderr "Running in Ident Only Mode" set testIdent_ 1 } set ns_ [new Simulator] global seed_ set random_ [new RNG] $random_ seed $seed_ #$ns_ use-scheduler Heap set scheduler_ [$ns_ set scheduler_] # puts stderr "Instantiating Topology ...$net_" set topo_ [new Topology/$net_ $ns_]# puts stderr "Done ..." foreach i [$topo_ array names node_] { set node_($i) [$topo_ node? $i] } }TestSuite instproc rnd {n} { $self instvar random_ return [$random_ uniform 0 $n]}TestSuite instproc config { name } { $self instvar linkflowfile_ linkgraphfile_ $self instvar flowfile_ graphfile_ $self instvar redqfile_ $self instvar label_ post_ set label_ $name set linkflowfile_ $name.flows set linkgraphfile_ $name.xgr set flowfile_ $name.f.tr set graphfile_ $name.f.xgr set redqfile_ $name.q set post_ [new PostProcess $label_ $linkflowfile_ $linkgraphfile_ \ $flowfile_ $graphfile_ $redqfile_] $post_ set format_ "xgraph"}## prints "time: $time class: $class bytes: $bytes" for the link.#TestSuite instproc linkDumpFlows { linkmon interval stoptime } { $self instvar ns_ linkflowfile_ set f [open $linkflowfile_ w]# puts "linkDumpFlows: opening file $linkflowfile_, fdesc: $f" TestSuite instproc dump1 { file linkmon interval } { $self instvar ns_ linkmon_ $ns_ at [expr [$ns_ now] + $interval] \ "$self dump1 $file $linkmon $interval" foreach flow [$linkmon flows] { set bytes [$flow set bdepartures_] if {$bytes > 0} { puts $file \ "time: [$ns_ now] class: [$flow set flowid_] bytes: $bytes $interval" } } # now put in the total set bytes [$linkmon set bdepartures_] puts $file "time: [$ns_ now] class: 0 bytes: $bytes $interval" } $ns_ at $interval "$self dump1 $f $linkmon $interval" $ns_ at $stoptime "flush $f"}## called on exit#TestSuite instproc finish {} { $self instvar post_ scheduler_ $self instvar linkflowfile_ $self instvar tcpRateFileDesc_ tcpRateFile_ topo_ $topo_ instvar bandwidth_ $scheduler_ halt close $tcpRateFileDesc_ global plotgraphs_ plotq_ if {$plotgraphs_ != 0} { $post_ plot_bytes $bandwidth_ ;#plots the bandwidth consumed by various flows $post_ plot_tcpRate $tcpRateFile_ ;#plots TCP goodput if {$plotq_ == 1} { $post_ plot_queue ;#plots red's average and instantaneous queue size } }}## for tests with a single congested link#Class Test/one -superclass TestSuiteTest/one instproc init { name topo traffic enable } { $self instvar net_ test_ traffic_ enable_ set test_ $name set net_ $topo set traffic_ $traffic set enable_ $enable $self next $self config $name.$topo.$traffic.$enable}Test/one instproc run {} { $self instvar ns_ net_ topo_ enable_ stoptime_ test_ traffic_ label_ $topo_ instvar node_ rtt_ redpdq_ redpdflowmon_ redpdlink_ $self instvar tcpRateFileDesc_ tcpRateFile_ #set stoptime_ 100.0 global simtime_ set stoptime_ $simtime_ set redpdsim [new REDPDSim $ns_ $redpdq_ $redpdflowmon_ $redpdlink_ 0 $enable_] set fmon [$redpdsim monitor-link] # $self instvar flowfile_# set flowf [open $flowfile_ w]# $fmon attach $flowf global dump_interval_ $self linkDumpFlows $fmon $dump_interval_ $stoptime_ global plotq_ if {$plotq_ == 1} { $self instvar redqfile_ set redqf [open $redqfile_ w] $redpdq_ trace curq_ $redpdq_ trace ave_ $redpdq_ attach $redqf } set tcpRateFile_ $label_.tcp set tcpRateFileDesc_ [open $tcpRateFile_ w] puts $tcpRateFileDesc_ "TitleText: $test_" puts $tcpRateFileDesc_ "Device: Postscript" $self traffic$traffic_ $ns_ at $stoptime_ "$self finish" ns-random 0 $ns_ run}##multiple congested link tests#Class Test/multi -superclass TestSuiteTest/multi instproc init { name topo traffic enable } { $self instvar net_ test_ traffic_ enable_ set test_ $name set net_ $topo set traffic_ $traffic set enable_ $enable $self next $self config $name.$topo.$traffic.$enable}Test/multi instproc run {} { $self instvar ns_ net_ topo_ enable_ stoptime_ test_ label_ $topo_ instvar node_ rtt_ redpdq_ redpdflowmon_ redpdlink_ noLinks_ $self instvar tcpRateFileDesc_ tcpRateFile_ global simtime_ set stoptime_ $simtime_ for {set i 0} {$i < $noLinks_} {incr i} { set redpdsim($i) [new REDPDSim $ns_ $redpdq_($i) $redpdflowmon_($i) $redpdlink_($i) $i $enable_] } #monitor the last congested link set link [expr {$noLinks_ - 1}] global dump_interval_ set fmon [$redpdsim($link) monitor-link] $self linkDumpFlows $fmon $dump_interval_ $stoptime_# $self instvar flowfile_# set flowf [open $flowfile_ w]# $fmon attach $flowf global plotq_ if {$plotq_ == 1} { $self instvar redqfile_ set redqf [open $redqfile_ w] $redpdq_($link) trace curq_ $redpdq_($link) trace ave_ $redpdq_($link) attach $redqf } set tcpRateFile_ $label_.tcp set tcpRateFileDesc_ [open $tcpRateFile_ w] puts $tcpRateFileDesc_ "TitleText: $test_" puts $tcpRateFileDesc_ "Device: Postscript" $self trafficMulti $noLinks_ $ns_ at $stoptime_ "$self finish" ns-random 0 $ns_ run}#-----------------------------------------TestSuite proc usage {} { global argv0 puts stderr "\nUsage: ns $argv0 <test> <topology> <traffic> \[options]" puts stderr "\nValid tests: [$self get-subclasses TestSuite Test/]" puts stderr "Valid Topologies: [$self get-subclasses Topology Topology/]" puts stderr "Valid Traffic: [$self get-subclasses TestSuite Traffic/]" puts stderr "\nOptions:" puts stderr "enable <0|1> - whether RED-PD is enabled (default 1)" puts stderr "testUnresp <0|1> - whether unresponsive testing is ON (default 1)" puts stderr "rtt <value> - target rtt in seconds (default 0.040)" puts stderr "seed <value> - seed for the random number generator (default 0)" puts stderr "time <value> - time in seconds for which to run the simulation (default 500)" puts stderr "verbose <value> - verbosity level \[-1,5] (default 0)" puts stderr "plotgraphs <0|1> - whether to plot instantaneous throughput graph" puts stderr "plotq <0|1> - whether to trace RED instantaneous and avg queue" puts stderr "period <value> - period in seconds for dumping flow information"# puts stderr "listmode <single|multi> - what list mode to run in (currently supported only for testIdent)" puts stderr "\nTopology or Traffic specific options:" puts stderr "p <value> - drop rate (fraction) for fixed drop rate simulations (netTestFRp & netPktsVsBytes)" puts stderr "gamma <value> - sending rate multiplier for the flow (TestFRp)" puts stderr "flows <value> - number of flows (TFRC & Response)" puts stderr "links <value> - number of links (netMulti)" puts stderr "ftype <cbr|tcp> - type of flow (Multi & TestFRp)" puts stderr "testRTT <value> - rtt of flows for testing identification (TestIdent)" exit 1}TestSuite proc isProc? {cls prc} { if [catch "Object info subclass $cls/$prc" r] { global argv0 puts stderr "$argv0: no such $cls: $prc" $self usage }}TestSuite proc get-subclasses {cls pfx} { set ret "" set l [string length $pfx] set c $cls while {[llength $c] > 0} { set t [lindex $c 0] set c [lrange $c 1 end] if [string match ${pfx}* $t] { lappend ret [string range $t $l end] } eval lappend c [$t info subclass] } set ret}TestSuite proc runTest {} { global argc argv set enable 1 if {$argc < 3} { $self usage } set test [lindex $argv 0] $self isProc? Test $test set topo [lindex $argv 1] $self isProc? Topology $topo set traffic [lindex $argv 2] $self isProc? Traffic $traffic for {set i 3} {$i < $argc} {incr i} { set option [lindex $argv $i] incr i set value [lindex $argv $i] switch -exact $option { enable { set enable $value } testUnresp { global unresponsive_test_ set unresponsive_test_ $value } rtt { global target_rtt_ set target_rtt_ $value } seed { global seed_ set seed_ $value } time { global simtime_ set simtime_ $value } verbose { global verbosity_ set verbosity_ $value } plotgraphs { global plotgraphs_ set plotgraphs_ $value } plotq { global plotq_ set plotq_ $value } period { global dump_interval_ set dump_interval_ $value } listmode { global listMode_ set listMode_ $value } p { global topo_para1_ set topo_para1_ $value } gamma { global traf_para2_ set traf_para2_ $value } flows { global traf_para1_ set traf_para1_ $value } links { global topo_para1_ set topo_para1_ $value } ftype { global traf_para1_ set traf_para1_ $value } testRTT { global topo_para1_ set topo_para1_ $value } default { puts "Unknown Option $option" $self usage } } } set t [new Test/$test $test $topo $traffic $enable] $t run}TestSuite runTest
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -