test-suite-jobs.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:13k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 2000-2002, by the Rector and Board of Visitors of the 
  3. # University of Virginia.
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, 
  7. # with or without modification, are permitted provided 
  8. # that the following conditions are met:
  9. #
  10. # Redistributions of source code must retain the above 
  11. # copyright notice, this list of conditions and the following 
  12. # disclaimer. 
  13. #
  14. # Redistributions in binary form must reproduce the above 
  15. # copyright notice, this list of conditions and the following 
  16. # disclaimer in the documentation and/or other materials provided 
  17. # with the distribution. 
  18. #
  19. # Neither the name of the University of Virginia nor the names 
  20. # of its contributors may be used to endorse or promote products 
  21. # derived from this software without specific prior written 
  22. # permission. 
  23. #
  24. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
  25. # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
  26. # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
  27. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  28. # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE 
  29. # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
  30. # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  31. # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
  32. # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
  33. # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  34. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
  35. # IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
  36. # THE POSSIBILITY OF SUCH DAMAGE.
  37. #
  38. # $Id: test-suite-jobs.tcl,v 1.4 2005/06/11 04:42:09 sfloyd Exp $                  
  39. remove-all-packet-headers       ; # removes all except common
  40. add-packet-header Flags IP RTP TCP  ; # hdrs reqd for validation test
  41.  
  42. # FOR UPDATING GLOBAL DEFAULTS:
  43. #                                                                     
  44. # This test suite is for validating wireless lans 
  45. # To run all tests: test-all-jobs
  46. # to run individual test:
  47. # ns test-suite-jobs.tcl jobs-rate
  48. # ns test-suite-jobs.tcl jobs-lossdel
  49. #
  50. # To view a list of available test to run with this script:
  51. # ns test-suite-jobs.tcl
  52. #
  53. Class TestSuite
  54. # Rate allocation
  55. Class Test/jobs-rate -superclass TestSuite
  56. # Relative guarantees, TCP traffic
  57. Class Test/jobs-lossdel -superclass TestSuite
  58. # =====================================================================
  59. # General setup
  60. #
  61. proc usage {} {
  62. global argv0
  63. puts stderr "usage: ns $argv0 <tests> "
  64. puts "Valid Tests: jobs-rate jobs-lossdel"
  65. exit 1
  66. }
  67. proc default_options {} {
  68. global opt
  69. set opt(queue_edg1) Marker
  70. set opt(queue_edg2) Demarker
  71. set opt(queue_core) JoBS
  72. set opt(seed) 16.0
  73. set opt(tr) temp.rands
  74. set opt(bw) 10000.0
  75. set opt(gw_buff) 800
  76. set opt(pktsz) 500
  77. set opt(start_tm) 0.0
  78. set opt(finish_tm) 10.0
  79. set opt(hops) 2
  80. set opt(nsources) 4
  81. set opt(n_cl1) 1
  82. set opt(n_cl2) 1
  83. set opt(n_cl3) 1
  84. set opt(n_cl4) 1
  85. set opt(delay) 1.0
  86. set opt(sample) 1
  87. }
  88. # =====================================================================
  89. # Other default settings
  90. #
  91. Queue/JoBS set drop_front_ false
  92. Queue/JoBS set trace_hop_ false
  93. Queue/JoBS set adc_resolution_type_ 0
  94. Queue/JoBS set shared_buffer_ 0
  95. Queue/JoBS set mean_pkt_size_ 4000
  96. Queue/Demarker set demarker_arrvs1_ 0
  97. Queue/Demarker set demarker_arrvs2_ 0
  98. Queue/Demarker set demarker_arrvs3_ 0
  99. Queue/Demarker set demarker_arrvs4_ 0
  100. Queue/Marker set marker_arrvs1_ 0
  101. Queue/Marker set marker_arrvs2_ 0
  102. Queue/Marker set marker_arrvs3_ 0
  103. Queue/Marker set marker_arrvs4_ 0
  104. # =====================================================================
  105. # The two tests
  106. #
  107. Test/jobs-rate instproc init {} {
  108.     global opt core_node user_source user_source_agent user_sink user_sink_agent 
  109.     $self instvar ns_ testName_
  110.     set testName_       jobs-rate
  111.     set opt(rp)         jobs-rate
  112.     set opt(udp_source_rate) 5000.0
  113.     $self next
  114.     $self jobs-rate-topo
  115.     $self traffic-setup 
  116.     $ns_ at 0.0 "$self record_thru"
  117.     $ns_ at [expr $opt(finish_tm)+.000000001] "puts "Finishing Simulation..." ;" 
  118.     $ns_ at [expr $opt(finish_tm)+1] "$self finish"
  119. }
  120. Test/jobs-rate instproc run {} {
  121.     $self instvar ns_
  122.     puts "Starting Simulation..."
  123.     $ns_ run
  124. }
  125. Test/jobs-lossdel instproc init {} {
  126.     global opt core_node user_source user_source_agent user_sink user_sink_agent 
  127.     $self instvar ns_ testName_
  128.     set testName_       jobs-lossdel
  129.     set opt(rp)         jobs-lossdel
  130.     set opt(udp_source_rate) 2600.0
  131.     $self next
  132.     $self jobs-lossdel-topo
  133.     $self traffic-setup 
  134.     $ns_ at [expr $opt(finish_tm)+.000000001] "puts "Finishing Simulation..." ;" 
  135.     $ns_ at [expr $opt(finish_tm)+1] "$self finish"
  136. }
  137. Test/jobs-lossdel instproc run {} {
  138.     $self instvar ns_
  139.     puts "Starting Simulation..."
  140.     $ns_ run
  141. }
  142. #
  143. # =====================================================================
  144. # Traffic generation
  145. #
  146. TestSuite instproc traffic-setup {} {
  147.     global opt user_source user_source_agent user_sink user_sink_agent 
  148.     $self instvar ns_
  149.     for {set i 1} {$i <= $opt(nsources)} {incr i} {
  150. set user_source_agent($i) [new Agent/UDP]
  151. set user_sink_agent($i) [new Agent/LossMonitor]
  152. set user_flow($i) [new Application/Traffic/CBR]
  153. $ns_ attach-agent $user_source($i) $user_source_agent($i)
  154. $ns_ attach-agent $user_sink($i) $user_sink_agent($i)
  155. $ns_ connect $user_source_agent($i) $user_sink_agent($i)
  156. $user_source_agent($i) set packetSize_ $opt(pktsz)
  157. $user_flow($i) set rate_ [expr $opt(udp_source_rate)*1000.0]
  158. $user_flow($i) attach-agent $user_source_agent($i)
  159. $ns_ at [expr $opt(start_tm)] "$user_flow($i) start"
  160.     }
  161. }
  162. # =====================================================================
  163. # Topology generation
  164. #
  165. TestSuite instproc jobs-rate-topo {} {    
  166.     global opt core_node user_source user_sink
  167.     $self instvar ns_ 
  168.     set DETERM 1
  169.     for {set i 1} {$i <= $opt(hops)} {incr i} {
  170. set core_node($i) [$ns_ node]
  171.     }
  172.     for {set i 1} {$i <= $opt(nsources)} {incr i} {
  173. set user_source($i) [$ns_ node]
  174. set user_sink($i) [$ns_ node]
  175.     }
  176.     for {set i 1} {$i < $opt(hops)} {incr i} {
  177. $ns_ duplex-link $core_node($i) $core_node([expr $i+1]) [expr $opt(bw)*1000.] [expr $opt(delay)/1000.] $opt(queue_core)
  178. $ns_ queue-limit $core_node($i) $core_node([expr $i+1]) $opt(gw_buff)
  179. $ns_ queue-limit $core_node([expr $i+1]) $core_node($i) $opt(gw_buff)
  180. set l [$ns_ get-link $core_node($i) $core_node([expr $i+1])]
  181. set q [$l queue]
  182. $q init-rdcs -1 -1 -1 -1
  183. $q init-rlcs -1 -1 -1 -1 
  184. $q init-alcs -1 -1 -1 -1 
  185. $q init-adcs -1 -1 -1 -1 
  186. $q init-arcs 4000000 3000000 2000000 1000000
  187. $q link [$l link]
  188. $q trace-file null
  189. $q sampling-period $opt(sample)
  190. $q id $i
  191. $q initialize
  192. # It's a duplex link, so we need to do exactly the same thing on the 
  193. # reverse path.
  194. set l [$ns_ get-link $core_node([expr $i+1]) $core_node($i)]
  195. set q [$l queue]
  196. $q init-rdcs -1 -1 -1 -1
  197. $q init-rlcs -1 -1 -1 -1 
  198. $q init-alcs -1 -1 -1 -1 
  199. $q init-adcs -1 -1 -1 -1 
  200. $q init-arcs 4000000 3000000 2000000 1000000
  201. $q link [$l link]
  202. $q trace-file null
  203. $q sampling-period $opt(sample)
  204. $q id [expr $i+$opt(hops)]
  205. $q initialize
  206.     }
  207.     for {set i 1} {$i <= $opt(nsources)} {incr i} {
  208. $ns_ simplex-link $user_source($i) $core_node(1) [expr $opt(bw)*1000.] [expr $opt(delay)/1000.] Marker
  209. $ns_ simplex-link $core_node(1) $user_source($i) [expr $opt(bw)*1000.] [expr $opt(delay)/1000.] Demarker
  210. $ns_ queue-limit $user_source($i) $core_node(1) $opt(gw_buff)
  211. $ns_ queue-limit $core_node(1) $user_source($i) $opt(gw_buff)
  212. set q [$ns_ get-queue $user_source($i) $core_node(1)]
  213. $q marker_type $DETERM
  214. if {$i == $opt(n_cl1)} {
  215.     $q marker_class 1
  216. } elseif {$i <= $opt(n_cl1)+$opt(n_cl2)} {
  217.     $q marker_class 2
  218. } elseif {$i <= $opt(n_cl1)+$opt(n_cl2)+$opt(n_cl3)} {
  219.     $q marker_class 3
  220. } else {
  221.     $q marker_class 4
  222. }
  223. set q [$ns_ get-queue $core_node(1) $user_source($i)]
  224. $q trace-file null
  225. $ns_ simplex-link $core_node($opt(hops)) $user_sink($i) [expr $opt(bw)*1000.] [expr $opt(delay)/1000.] Demarker
  226. $ns_ simplex-link $user_sink($i) $core_node($opt(hops)) [expr $opt(bw)*1000.] [expr $opt(delay)/1000.] Marker
  227. $ns_ queue-limit $core_node($opt(hops)) $user_sink($i) $opt(gw_buff)
  228. $ns_ queue-limit $user_sink($i) $core_node($opt(hops)) $opt(gw_buff)
  229. set q [$ns_ get-queue $core_node($opt(hops)) $user_sink($i)]
  230. $q trace-file null
  231. set q [$ns_ get-queue $user_sink($i) $core_node($opt(hops))]
  232. $q marker_type $DETERM
  233. if {$i == $opt(n_cl1)} {
  234.     $q marker_class 1
  235. } elseif {$i <= $opt(n_cl1)+$opt(n_cl2)} {
  236.     $q marker_class 2
  237. } elseif {$i <= $opt(n_cl1)+$opt(n_cl2)+$opt(n_cl3)} {
  238.     $q marker_class 3
  239. } else {
  240.     $q marker_class 4
  241. }
  242.     }
  243. }
  244. TestSuite instproc jobs-lossdel-topo {} {    
  245.     global opt core_node user_source user_sink
  246.     $self instvar ns_ 
  247.     set DETERM 1
  248.     Queue/JoBS set shared_buffer_ 1
  249.     Queue/JoBS set trace_hop_ true
  250.     for {set i 1} {$i <= $opt(hops)} {incr i} {
  251. set core_node($i) [$ns_ node]
  252.     }
  253.     for {set i 1} {$i <= $opt(nsources)} {incr i} {
  254. set user_source($i) [$ns_ node]
  255. set user_sink($i) [$ns_ node]
  256.     }
  257.     for {set i 1} {$i < $opt(hops)} {incr i} {
  258. $ns_ duplex-link $core_node($i) $core_node([expr $i+1]) [expr $opt(bw)*1000.] [expr $opt(delay)/1000.] $opt(queue_core)
  259. $ns_ queue-limit $core_node($i) $core_node([expr $i+1]) $opt(gw_buff)
  260. $ns_ queue-limit $core_node([expr $i+1]) $core_node($i) $opt(gw_buff)
  261. set l [$ns_ get-link $core_node($i) $core_node([expr $i+1])]
  262. set q [$l queue]
  263. $q init-rdcs -1 4 4 4 
  264. $q init-rlcs -1 2 2 2 
  265. $q init-alcs 0.01 -1 -1 -1
  266. $q init-adcs 0.005 -1 -1 -1
  267. $q init-arcs -1 -1 -1 -1
  268. $q link [$l link]
  269. $q trace-file $opt(tr) 
  270. $q sampling-period $opt(sample)
  271. $q id $i
  272. $q initialize
  273. # It's a duplex link, so we need to do exactly the same thing on the 
  274. # reverse path.
  275. set l [$ns_ get-link $core_node([expr $i+1]) $core_node($i)]
  276. set q [$l queue]
  277. $q init-rdcs -1 4 4 4 
  278. $q init-rlcs -1 2 2 2 
  279. $q init-alcs 0.01 -1 -1 -1
  280. $q init-adcs 0.005 -1 -1 -1
  281. $q init-arcs -1 -1 -1 -1
  282. $q link [$l link]
  283. $q trace-file null
  284. $q sampling-period $opt(sample)
  285. $q id [expr $i+$opt(hops)]
  286. $q initialize
  287.     }
  288.     for {set i 1} {$i <= $opt(nsources)} {incr i} {
  289. $ns_ simplex-link $user_source($i) $core_node(1) [expr $opt(bw)*1000.] [expr $opt(delay)/1000.] Marker
  290. $ns_ simplex-link $core_node(1) $user_source($i) [expr $opt(bw)*1000.] [expr $opt(delay)/1000.] Demarker
  291. $ns_ queue-limit $user_source($i) $core_node(1) $opt(gw_buff)
  292. $ns_ queue-limit $core_node(1) $user_source($i) $opt(gw_buff)
  293. set q [$ns_ get-queue $user_source($i) $core_node(1)]
  294. $q marker_type $DETERM
  295. if {$i == $opt(n_cl1)} {
  296.     $q marker_class 1
  297. } elseif {$i <= $opt(n_cl1)+$opt(n_cl2)} {
  298.     $q marker_class 2
  299. } elseif {$i <= $opt(n_cl1)+$opt(n_cl2)+$opt(n_cl3)} {
  300.     $q marker_class 3
  301. } else {
  302.     $q marker_class 4
  303. }
  304. set q [$ns_ get-queue $core_node(1) $user_source($i)]
  305. $q trace-file null
  306. $ns_ simplex-link $core_node($opt(hops)) $user_sink($i) [expr $opt(bw)*1000.] [expr $opt(delay)/1000.] Demarker
  307. $ns_ simplex-link $user_sink($i) $core_node($opt(hops)) [expr $opt(bw)*1000.] [expr $opt(delay)/1000.] Marker
  308.  $ns_ queue-limit $core_node($opt(hops)) $user_sink($i) $opt(gw_buff)
  309. $ns_ queue-limit $user_sink($i) $core_node($opt(hops)) $opt(gw_buff)
  310. set q [$ns_ get-queue $core_node($opt(hops)) $user_sink($i)]
  311. $q trace-file null
  312. set q [$ns_ get-queue $user_sink($i) $core_node($opt(hops))]
  313. $q marker_type $DETERM
  314. if {$i == $opt(n_cl1)} {
  315.     $q marker_class 1
  316. } elseif {$i <= $opt(n_cl1)+$opt(n_cl2)} {
  317.     $q marker_class 2
  318. } elseif {$i <= $opt(n_cl1)+$opt(n_cl2)+$opt(n_cl3)} {
  319.     $q marker_class 3
  320. } else {
  321.     $q marker_class 4
  322. }
  323.     }
  324. }
  325. # =====================================================================
  326. # Various helpers
  327. #
  328. Simulator instproc get-link { node1 node2 } {
  329.     $self instvar link_
  330.     set id1 [$node1 id]
  331.     set id2 [$node2 id]
  332.     return $link_($id1:$id2)
  333. }
  334. Simulator instproc get-queue { node1 node2 } {
  335.     set l [$self get-link $node1 $node2]
  336.     set q [$l queue]
  337.     return $q
  338. }
  339. TestSuite instproc init {} {
  340. global opt tracefd 
  341. global node_ 
  342. $self instvar ns_ testName_
  343. set ns_         [new Simulator]
  344. set tracefd [open $opt(tr) w]
  345. }
  346. TestSuite instproc finish {} {
  347. $self instvar ns_
  348. global quiet
  349. $ns_ flush-trace
  350. puts "finishing.."
  351. exit 0
  352. }
  353. TestSuite instproc record_thru {} {
  354.     $self instvar ns_
  355. global tracefd opt user_sink_agent  
  356. set time 0.5
  357. set tot_recv 0
  358. set now [$ns_ now]
  359. for {set i 1} {$i <= $opt(nsources)} {incr i} {
  360. set recv($i) [$user_sink_agent($i) set bytes_]
  361. $user_sink_agent($i) set bytes_ 0
  362. }
  363. puts $tracefd [format "%.2f %.2f %.2f %.2f %.2f" $now [expr 8.*$recv(1)/$time] [expr 8.*$recv(2)/$time] [expr 8.*$recv(3)/$time] [expr 8.*$recv(4)/$time]]
  364. $ns_ at [expr $now+$time] "$self record_thru"
  365. }
  366. # =====================================================================
  367. # Test launcher
  368. #
  369. proc runtest {arg} {
  370. global quiet
  371. set quiet 0
  372. set b [llength $arg]
  373. if {$b == 1} {
  374. set test $arg
  375. } elseif {$b == 2} {
  376. set test [lindex $arg 0]
  377. if {[lindex $arg 1] == "QUIET"} {
  378. set quiet 1
  379. }
  380. } else {
  381. usage
  382. }
  383. set t [new Test/$test]
  384. $t run
  385. }
  386. # =====================================================================
  387. # Main
  388. #
  389. global argv arg0
  390. default_options
  391. runtest $argv