red-pd.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:10k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #
  2. # Main test file for red-pd simulations
  3. #
  4. Class TestSuite
  5. source monitoring.tcl
  6. source helper.tcl
  7. source sources.tcl
  8. source plot.tcl
  9. source traffic.tcl
  10. source topology.tcl
  11. #global options
  12. set unresponsive_test_ 1
  13. set target_rtt_ 0.040
  14. set seed_ 0
  15. set simtime_ 500
  16. set verbosity_ 0
  17. set plotgraphs_ 0
  18. set plotq_ 0
  19. set dump_interval_ 10
  20. set testIdent_ 0
  21. set listMode_ "multi"
  22. #topology or traffic specific option
  23. set topo_para1_ -1
  24. set traf_para1_ -1
  25. set traf_para2_ -1
  26. TestSuite instproc init {} {
  27.     $self instvar ns_  test_ net_ traffic_ enable_ 
  28.     $self instvar topo_ node_
  29.     $self instvar scheduler_ random_
  30.     global testIdent_
  31.     if {$traffic_ == "TestIdent"} {
  32. puts stderr "Running in Ident Only Mode"
  33. set testIdent_ 1
  34.     }
  35.     set ns_ [new Simulator]
  36.     
  37.     global seed_
  38. set random_ [new RNG]
  39.     $random_ seed $seed_
  40.     #$ns_ use-scheduler Heap
  41.     set scheduler_ [$ns_ set scheduler_]
  42.     
  43. #    puts stderr "Instantiating Topology ...$net_"
  44.     set topo_ [new Topology/$net_ $ns_]
  45. #    puts stderr "Done ..."
  46.     foreach i [$topo_ array names node_] {
  47. set node_($i) [$topo_ node? $i]
  48.     }
  49.     
  50. }
  51. TestSuite instproc  rnd {n} {
  52. $self instvar random_
  53. return [$random_ uniform 0 $n]
  54. }
  55. TestSuite instproc config { name } {
  56.     $self instvar linkflowfile_ linkgraphfile_
  57.     $self instvar flowfile_ graphfile_
  58.     $self instvar redqfile_
  59.     $self instvar label_ post_
  60.     
  61.     set label_ $name
  62.     
  63.     set linkflowfile_ $name.flows
  64.     set linkgraphfile_ $name.xgr
  65.     
  66.     set flowfile_ $name.f.tr
  67.     set graphfile_ $name.f.xgr
  68.     
  69.     set redqfile_ $name.q
  70.     
  71.     set post_ [new PostProcess $label_ $linkflowfile_ $linkgraphfile_ 
  72.    $flowfile_ $graphfile_ $redqfile_]
  73.     
  74.     $post_ set format_ "xgraph"
  75. }
  76. #
  77. # prints "time: $time class: $class bytes: $bytes" for the link.
  78. #
  79. TestSuite instproc linkDumpFlows { linkmon interval stoptime } {
  80.     $self instvar ns_ linkflowfile_
  81.     set f [open $linkflowfile_ w]
  82. #    puts "linkDumpFlows: opening file $linkflowfile_, fdesc: $f"
  83.     TestSuite instproc dump1 { file linkmon interval } {
  84. $self instvar ns_ linkmon_
  85. $ns_ at [expr [$ns_ now] + $interval] 
  86.     "$self dump1 $file $linkmon $interval"
  87. foreach flow [$linkmon flows] {
  88.     set bytes [$flow set bdepartures_]
  89.     if {$bytes > 0} {
  90. puts $file 
  91.     "time: [$ns_ now] class: [$flow set flowid_] bytes: $bytes $interval"     
  92.     }
  93. }
  94. # now put in the total
  95. set bytes [$linkmon set bdepartures_]
  96. puts $file  "time: [$ns_ now] class: 0 bytes: $bytes $interval"   
  97.     }
  98.     
  99.     $ns_ at $interval "$self dump1 $f $linkmon $interval"
  100.     $ns_ at $stoptime "flush $f"
  101. }
  102. #
  103. # called on exit
  104. #
  105. TestSuite instproc finish {} {
  106.     $self instvar post_ scheduler_
  107.     $self instvar linkflowfile_
  108.     $self instvar tcpRateFileDesc_ tcpRateFile_ topo_
  109.     $topo_ instvar bandwidth_
  110.     $scheduler_ halt
  111.     close $tcpRateFileDesc_       
  112.     global plotgraphs_ plotq_
  113.     if {$plotgraphs_ != 0} { 
  114. $post_ plot_bytes $bandwidth_  ;#plots the bandwidth consumed by various flows
  115. $post_ plot_tcpRate $tcpRateFile_  ;#plots TCP goodput
  116. if {$plotq_ == 1} { 
  117.     $post_ plot_queue             ;#plots red's average and instantaneous queue size
  118. }
  119.     }
  120. }
  121. #
  122. # for tests with a single congested link
  123. #
  124. Class Test/one -superclass TestSuite
  125. Test/one instproc init { name topo traffic enable } {
  126.     $self instvar net_ test_ traffic_ enable_
  127.     set test_ $name
  128.     set net_ $topo   
  129.     set traffic_ $traffic
  130.     set enable_ $enable
  131.     $self next
  132.     $self config $name.$topo.$traffic.$enable
  133. }
  134. Test/one instproc run {} {
  135.     $self instvar ns_ net_ topo_ enable_ stoptime_ test_ traffic_ label_
  136.     $topo_ instvar node_ rtt_ redpdq_ redpdflowmon_ redpdlink_ 
  137.     $self instvar tcpRateFileDesc_ tcpRateFile_
  138.     
  139.     #set stoptime_ 100.0
  140.     global simtime_
  141.     set stoptime_ $simtime_
  142.     set redpdsim [new REDPDSim $ns_ $redpdq_ $redpdflowmon_ $redpdlink_ 0 $enable_]
  143.     set fmon [$redpdsim monitor-link]
  144.     
  145. #    $self instvar flowfile_
  146. #    set flowf [open $flowfile_ w]
  147. #    $fmon attach $flowf
  148.     
  149.     global dump_interval_
  150.     $self linkDumpFlows $fmon $dump_interval_ $stoptime_
  151.     global plotq_ 
  152.     if {$plotq_ == 1} {
  153. $self instvar redqfile_
  154. set redqf [open $redqfile_ w]
  155. $redpdq_ trace curq_
  156. $redpdq_ trace ave_
  157. $redpdq_ attach $redqf
  158.     }
  159.     set tcpRateFile_ $label_.tcp
  160.     set tcpRateFileDesc_ [open $tcpRateFile_ w]
  161.     puts $tcpRateFileDesc_ "TitleText: $test_"
  162.     puts $tcpRateFileDesc_ "Device: Postscript"
  163.     
  164.     
  165.     $self traffic$traffic_
  166.     $ns_ at $stoptime_ "$self finish"
  167.     
  168.     ns-random 0
  169.     $ns_ run
  170. }
  171. #
  172. #multiple congested link tests
  173. #
  174. Class Test/multi -superclass TestSuite
  175. Test/multi instproc init { name topo traffic enable } {
  176.     $self instvar net_ test_ traffic_ enable_
  177.     set test_ $name
  178.     set net_ $topo   
  179.     set traffic_ $traffic
  180.     set enable_ $enable
  181.     $self next
  182.     $self config $name.$topo.$traffic.$enable
  183. }
  184. Test/multi instproc run {} {
  185.     $self instvar ns_ net_ topo_ enable_ stoptime_ test_ label_
  186.     $topo_ instvar node_ rtt_ redpdq_ redpdflowmon_ redpdlink_ noLinks_
  187.     $self instvar tcpRateFileDesc_ tcpRateFile_
  188.     
  189.     global simtime_
  190. set stoptime_ $simtime_
  191.     
  192.     for {set i 0} {$i < $noLinks_} {incr i} {
  193. set redpdsim($i) [new REDPDSim $ns_ $redpdq_($i) $redpdflowmon_($i) $redpdlink_($i) $i $enable_]
  194.     }
  195.     
  196.     #monitor the last congested link
  197.     set link [expr {$noLinks_ - 1}]
  198.     
  199. global dump_interval_
  200.     set fmon [$redpdsim($link) monitor-link]
  201. $self linkDumpFlows $fmon $dump_interval_ $stoptime_
  202. #    $self instvar flowfile_
  203. #    set flowf [open $flowfile_ w]
  204. #    $fmon attach $flowf
  205.     
  206.     global plotq_ 
  207. if {$plotq_ == 1} {
  208. $self instvar redqfile_
  209. set redqf [open $redqfile_ w]
  210. $redpdq_($link) trace curq_
  211. $redpdq_($link) trace ave_
  212. $redpdq_($link) attach $redqf
  213. }
  214.     set tcpRateFile_ $label_.tcp
  215.     set tcpRateFileDesc_ [open $tcpRateFile_ w]
  216.     puts $tcpRateFileDesc_ "TitleText: $test_"
  217.     puts $tcpRateFileDesc_ "Device: Postscript"
  218.     
  219.     $self trafficMulti $noLinks_
  220.     
  221.     $ns_ at $stoptime_ "$self finish"
  222.     ns-random 0
  223.     $ns_ run
  224. }
  225. #-----------------------------------------
  226. TestSuite proc usage {} {
  227.         global argv0
  228.     puts stderr "nUsage: ns $argv0 <test> <topology> <traffic> [options]"
  229.     puts stderr "nValid tests: [$self get-subclasses TestSuite Test/]"
  230.     puts stderr "Valid Topologies: [$self get-subclasses Topology Topology/]"
  231.     puts stderr "Valid Traffic: [$self get-subclasses TestSuite Traffic/]"
  232. puts stderr "nOptions:"
  233. puts stderr "enable <0|1> - whether RED-PD is enabled (default 1)"
  234. puts stderr "testUnresp <0|1> - whether unresponsive testing is ON (default 1)"
  235. puts stderr "rtt <value> - target rtt in seconds (default 0.040)"
  236. puts stderr "seed <value> - seed for the random number generator (default 0)"
  237. puts stderr "time <value> - time in seconds for which to run the simulation (default 500)"
  238.     puts stderr "verbose <value> - verbosity level [-1,5] (default 0)"
  239. puts stderr "plotgraphs <0|1> - whether to plot instantaneous throughput graph"
  240. puts stderr "plotq <0|1> - whether to trace RED instantaneous and avg queue"
  241. puts stderr "period <value> - period in seconds for dumping flow information"
  242. # puts stderr "listmode <single|multi> - what list mode to run in (currently supported only for testIdent)"
  243. puts stderr "nTopology or Traffic specific options:"
  244. puts stderr "p <value> - drop rate (fraction) for fixed drop rate simulations (netTestFRp & netPktsVsBytes)"
  245. puts stderr "gamma <value> - sending rate multiplier for the flow (TestFRp)"
  246. puts stderr "flows <value> - number of flows (TFRC & Response)"
  247. puts stderr "links <value> - number of links (netMulti)"
  248. puts stderr "ftype <cbr|tcp> - type of flow (Multi & TestFRp)"
  249. puts stderr "testRTT <value> - rtt of flows for testing identification (TestIdent)"
  250. exit  1
  251. }
  252. TestSuite proc isProc? {cls prc} {
  253.         if [catch "Object info subclass $cls/$prc" r] {
  254.                 global argv0
  255.                 puts stderr "$argv0: no such $cls: $prc"
  256.                 $self usage
  257.         }
  258. }
  259. TestSuite proc get-subclasses {cls pfx} {
  260.         set ret ""
  261.         set l [string length $pfx]
  262.         set c $cls
  263.         while {[llength $c] > 0} {
  264.                 set t [lindex $c 0]
  265.                 set c [lrange $c 1 end]
  266.                 if [string match ${pfx}* $t] {
  267.                         lappend ret [string range $t $l end]
  268.                 }
  269.                 eval lappend c [$t info subclass]
  270.         }
  271.         set ret
  272. }
  273. TestSuite proc runTest {} {
  274.     global argc argv
  275.     set enable 1
  276. if {$argc < 3} {
  277. $self usage
  278. }
  279. set test [lindex $argv 0]
  280. $self isProc? Test $test
  281. set topo [lindex $argv 1]
  282. $self isProc? Topology $topo
  283. set traffic [lindex $argv 2]
  284. $self isProc? Traffic $traffic
  285. for {set i 3} {$i < $argc} {incr i} {
  286. set option [lindex $argv $i]
  287. incr i
  288. set value [lindex $argv $i]
  289. switch -exact $option {
  290. enable {
  291. set enable $value
  292. }
  293. testUnresp {
  294. global unresponsive_test_
  295. set unresponsive_test_ $value
  296. }
  297. rtt {
  298. global target_rtt_
  299. set target_rtt_ $value
  300. }
  301. seed {
  302. global seed_
  303. set seed_ $value
  304. }
  305. time {
  306. global simtime_
  307. set simtime_ $value
  308. }
  309. verbose {
  310. global verbosity_
  311. set verbosity_ $value
  312. }
  313. plotgraphs {
  314. global plotgraphs_
  315. set plotgraphs_ $value
  316. }
  317. plotq {
  318. global plotq_
  319. set plotq_ $value
  320. }
  321. period {
  322. global dump_interval_
  323. set dump_interval_ $value
  324. }
  325. listmode {
  326. global listMode_ 
  327. set listMode_ $value
  328. }
  329. p {
  330. global topo_para1_
  331. set topo_para1_ $value
  332. }
  333. gamma {
  334. global traf_para2_
  335. set traf_para2_ $value
  336. }
  337. flows {
  338. global traf_para1_
  339. set traf_para1_ $value
  340. }
  341. links {
  342. global topo_para1_
  343. set topo_para1_ $value
  344. }
  345. ftype {
  346. global traf_para1_
  347. set traf_para1_ $value
  348. }
  349. testRTT {
  350. global topo_para1_
  351. set topo_para1_ $value
  352. }
  353. default {
  354. puts "Unknown Option $option"
  355. $self usage
  356. }
  357. }
  358. }
  359.     set t [new Test/$test $test $topo $traffic $enable]
  360.     $t run
  361. }
  362. TestSuite runTest