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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) Xerox Corporation 1998. All rights reserved.
  3. #
  4. # This program is free software; you can redistribute it and/or modify it
  5. # under the terms of the GNU General Public License as published by the
  6. # Free Software Foundation; either version 2 of the License, or (at your
  7. # option) any later version.
  8. # This program is distributed in the hope that it will be useful, but
  9. # WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11. # General Public License for more details.
  12. # You should have received a copy of the GNU General Public License along
  13. # with this program; if not, write to the Free Software Foundation, Inc.,
  14. # 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  15. # Linking this file statically or dynamically with other modules is making
  16. # a combined work based on this file.  Thus, the terms and conditions of
  17. # the GNU General Public License cover the whole combination.
  18. # In addition, as a special exception, the copyright holders of this file
  19. # give you permission to combine this file with free software programs or
  20. # libraries that are released under the GNU LGPL and with code included in
  21. # the standard release of ns-2 under the Apache 2.0 license or under
  22. # otherwise-compatible licenses with advertising requirements (or modified
  23. # versions of such code, with unchanged license).  You may copy and
  24. # distribute such a system following the terms of the GNU GPL for this
  25. # file and the licenses of the other code concerned, provided that you
  26. # include the source code of that other code when and as the GNU GPL
  27. # requires distribution of source code.
  28. # Note that people who make modified versions of this file are not
  29. # obligated to grant this special exception for their modified versions;
  30. # it is their choice whether to do so.  The GNU General Public License
  31. # gives permission to release a modified version without this exception;
  32. # this exception also makes it possible to release a modified version
  33. # which carries forward this exception.
  34. #
  35. # $Header: /cvsroot/nsnam/ns-2/tcl/test/test-suite-intserv.tcl,v 1.10 2005/08/26 05:05:30 tomh Exp $
  36. #
  37. # This test suite runs validation tests for the measurement based
  38. # admission control algorithms that are part of the simple
  39. # integrated services support in ns.  The integrated services support
  40. # includes a simple signalling protocol and a scheduler that provides
  41. # a service like controlled-load by giving priority to real-time over
  42. # best-effort traffic.
  43. #
  44. # Five admission control algorithms are tested:
  45. # 1. Measured Sum (MS)
  46. # 2. Hoeffding Bounds (HB)
  47. # 3. Acceptance Region Tangent at Peak (ACTP)
  48. # 4. Acceptance Region Tangent at Origin (ACTO)
  49. # 5. Parameter Based (Param)
  50. #
  51. # The first four are measurement-based, the last is parameter-based.
  52. #
  53. # The measurement-based algorithms each use an estimation algorithm.
  54. # Time window for Measured Sum, exponential averaging for Hoeffding
  55. # Bounds and Point Sample for the Acceptance region algorithms.
  56. # See the paper "Comparison of Measurement-based Admission Control Algorithms
  57. # for Controlled-Load Service", Sugih Jamin, Scott Shenker and Peter
  58. # Danzig, in the Proceedings of IEEE Infocom '97, and references therein
  59. # for a further description of these algorithms.
  60. # To run a test:  
  61. # ns test-suite-intserv.tcl ALG
  62. # where ALG is one of MS, HB, ACTP, ACTO, Param
  63. #remove-all-packet-headers       ; # removes all except common
  64. #add-packet-header Flags IP TCP  ; # hdrs reqd for validation test
  65.  
  66. # FOR UPDATING GLOBAL DEFAULTS:
  67. set meastime 100
  68. set simtime 300
  69. Class TestSuite
  70. TestSuite proc setinstance {T} {
  71. TestSuite set T $T
  72. }
  73. TestSuite proc getinstance {} {
  74. TestSuite set T
  75. }
  76. TestSuite instproc init {} {
  77. $self instvar ns_ net_ test_ node_ testName_ adc_ est_
  78. $self instvar param_ r_ hvar_ fvar_ srcno_ qmon_ f_ flow_ totflows_
  79. $self defaults
  80. set ns_ [new Simulator]
  81. # next line no longer needed with 32-bit addressing, Nov '99.
  82. # $ns_ expand-port-field-bits 16
  83. TestSuite setinstance $self
  84. set net_ 2Node
  85. set topo_ [new Topology/$net_ $ns_]
  86. foreach i [$topo_ array names node_] {
  87. # This would be cool, but lets try to be compatible
  88. # with test-suite.tcl as far as possible.
  89. #
  90. # $self instvar $i
  91. # set $i [$topo_ node? $i]
  92. #
  93. set node_($i) [$topo_ node? $i]
  94. }
  95. # create the link 
  96. $ns_ duplex-intserv-link $node_(0) $node_(1) $param_(bw) $param_(dly) SimpleIntServ SALink $adc_ $est_ CL
  97. # set up queue monitor
  98. set f_ [open temp.rands w]
  99. set qmon_ [$ns_ monitor-queue $node_(0) $node_(1) $f_]
  100. set l01 [$ns_ link $node_(0) $node_(1)]
  101. $l01 set qBytesEstimate_ 0
  102. $l01 set qPktsEstimate_ 0
  103. $l01 set sampleInterval_ 0
  104. #$ns_ at $param_(meastime) "$l01 trace-util [expr $param_(ptime)*$param_(S)] $f_"
  105. # create the receiver
  106. set r_ [new Agent/SAack]
  107. $ns_ attach-agent $node_(1) $r_
  108. set hvar_ [new RandomVariable/Exponential]
  109. $hvar_ set avg_ $param_(hold)
  110. set fvar_ [new RandomVariable/Exponential]
  111. $fvar_ set avg_ $param_(fint)
  112. set srcno_ 1
  113. # schedule the first flow
  114. set starttime  [expr $srcno_ + double([ns-random] % 10000000) / 1e7]
  115. $ns_ at $starttime "$self sched-source $node_(0)"
  116. $ns_ at $param_(meastime) "$qmon_ set bdepartures_ 0;$qmon_ set bdrops_ 0"
  117. $ns_ at $param_(simtime) "$self finish $f_"
  118. $self set flows_ 0
  119. $self set totflows_ 0
  120. }
  121. TestSuite instproc flowadmit {} {
  122. $self instvar flows_ totflows_
  123. incr flows_
  124. incr totflows_
  125. }
  126. TestSuite instproc flowdepart {} {
  127. $self instvar flows_
  128. incr flows_ -1
  129. }
  130. TestSuite instproc defaults {} {
  131. global simtime meastime
  132. $self instvar param_
  133. set param_(psize) 125
  134. set param_(bw) 10e6
  135. set param_(ptime) [expr $param_(psize)*8.0/$param_(bw)]
  136. set param_(dly) 1ms
  137. set param_(S) 5e3
  138. set param_(hold) 300
  139. set param_(fint) .4
  140. set param_(simtime) $simtime
  141. set param_(meastime) $meastime
  142. set param_(trace_flow) 0
  143. Queue/SimpleIntServ set qlimit1_ 160
  144. Queue/SimpleIntServ set qlimit0_ 0
  145. ADC set backoff_ true
  146. Est set period_ [expr $param_(S) * $param_(ptime)]
  147. }
  148. TestSuite instproc run {} {
  149. $self instvar ns_
  150. $ns_ run
  151. }
  152. TestSuite instproc create-source {node starttime i} {
  153. $self instvar ns_ r_ hvar_
  154.         set a [new Agent/SA]
  155.         $ns_ attach-agent $node $a
  156.         $a set fid_ $i
  157.  
  158.         $ns_ connect $a $r_
  159.  
  160.  
  161.         set exp1 [new Application/Traffic/Exponential]
  162.         $exp1 set packetSize_ 125
  163.         $exp1 set burst_time_ [expr 20.0/64]
  164.         $exp1 set idle_time_ 325ms
  165.         $exp1 set rate_ 64k
  166.  
  167.         #set up (r,b)
  168.         $a set rate_ 64k
  169.         $a set bucket_ 1
  170.         $a attach-traffic $exp1
  171.         $a set lifetime_ [$hvar_ value]
  172.         $ns_ at $starttime "$a start"
  173.         $a instvar trafgen_
  174.         set trafgen_ $exp1
  175. TestSuite instproc sched-source {node} {
  176. $self instvar srcno_ ns_ fvar_  param_ f_
  177.  
  178.         $self create-source $node  [$ns_ now]  $srcno_
  179.         if { $param_(trace_flow) } {
  180.                 puts $f_ "Flow $srcno started @ [$ns now]"
  181.         }
  182.         incr srcno_
  183.  
  184.         #generate another startime
  185.         set starttime [expr [$ns_ now]+[$fvar_ value]]
  186.         $ns_ at $starttime "$self sched-source $node"
  187. }
  188. TestSuite proc runTest {} {
  189. global argc argv quiet
  190. set test [lindex $argv 0]
  191. set t [new Test/$test]
  192. $t show-simtime
  193. $t run
  194. }
  195. TestSuite instproc show-simtime {} {
  196. global tcl_precision
  197. $self instvar ns_ qmon_ param_ f_ flows_ totflows_
  198. $qmon_ instvar bdepartures_ pdrops_ pdepartures_
  199. if {$pdepartures_ != 0} {
  200. set d [expr $pdrops_*1.0/($pdrops_+$pdepartures_)]
  201. } else {
  202. set d 0
  203. }
  204. if { [$ns_ now] < $param_(meastime) } {
  205. set time [$ns_ now]
  206. } else {
  207. set time [expr [$ns_ now] - $param_(meastime)]
  208. }
  209. if { $time == 0 } {
  210. set thput 0
  211. } else {
  212. set thput [expr $bdepartures_ * 8.0 / ($param_(bw) * $time)]
  213. }
  214. set oprecision [set tcl_precision]
  215. set tcl_precision 6
  216. puts $f_ "[$ns_ now] $thput $d"
  217. puts $f_ "Flows: $flows_ $totflows_"
  218. set tcl_precision $oprecision
  219. $ns_ at [expr [$ns_ now] + 10.0] "$self show-simtime"
  220. }
  221. TestSuite instproc finish { file } {
  222. global tcl_precision
  223. $self instvar qmon_ param_ f_
  224. $qmon_ instvar pdrops_ pdepartures_ bdepartures_
  225. set utlzn [expr $bdepartures_*8.0/($param_(bw)*($param_(simtime)-$param_(meastime)))]
  226. set d [expr $pdrops_*1.0/($pdrops_+ $pdepartures_)]
  227. set oprecision [set tcl_precision]
  228. set tcl_precision 6
  229. puts $f_ "Drops : $d Utilization : $utlzn"
  230. set tcl_precision $oprecision
  231. close $file
  232. exec rm -f $file
  233. exit 0
  234. }
  235. Class Test/MS -superclass TestSuite
  236. Test/MS instproc init {} {
  237. $self instvar adc_ est_
  238. set adc_ MS
  239. set est_ TimeWindow
  240. $self next
  241. }
  242. Test/MS instproc defaults {} {
  243. $self next
  244. ADC/MS set backoff_ false
  245. ADC/MS set utilization_ 1.02
  246. Est/TimeWindow set T_ 3
  247. }
  248. Class Test/HB -superclass TestSuite
  249. Test/HB instproc init {} {
  250. $self instvar adc_ est_
  251. set adc_ HB
  252. set est_ ExpAvg
  253. $self next
  254. }
  255. Test/HB instproc defaults {} {
  256. $self next
  257. ADC/HB set epsilon_ 0.999
  258. Est/ExpAvg set w_ 0.0625
  259. }
  260. Class Test/ACTP -superclass TestSuite
  261. Test/ACTP instproc init {} {
  262. $self instvar adc_ est_
  263. set adc_ ACTP
  264. set est_ PointSample
  265. $self next
  266. }
  267. Test/ACTP instproc defaults {} {
  268. $self next
  269. $self instvar param_
  270. ADC/ACTP set s_ [expr 2e-7]
  271. set param_(S) 2.5e4
  272. Est set period_ [expr $param_(S) * $param_(ptime)]
  273. }
  274. Class Test/ACTO -superclass TestSuite
  275. Test/ACTO instproc init {} {
  276. $self instvar adc_ est_
  277. set adc_ ACTO
  278. set est_ PointSample
  279. $self next
  280. }
  281. Test/ACTO instproc defaults {} {
  282. $self next
  283. $self instvar param_
  284. ADC/ACTO set s_ [expr 8e-8]
  285. set param_(S) 2.5e4
  286. Est set period_ [expr $param_(S) * $param_(ptime)]
  287. }
  288. Class Test/Param -superclass TestSuite
  289. Test/Param instproc init {} {
  290. $self instvar adc_ est_
  291. set adc_ Param
  292. set est_ Null
  293. $self next
  294. }
  295. Test/Param instproc defaults {} {
  296. $self next
  297. ADC/Param set utilization_ 2.05
  298. }
  299. Class SkelTopology
  300. SkelTopology instproc init ns {
  301. $self next
  302. }
  303. SkelTopology instproc node? n {
  304.     $self instvar node_
  305.     if [info exists node_($n)] {
  306. set ret $node_($n)
  307.     } else {
  308. set ret ""
  309.     }
  310.     set ret
  311. }
  312. Class Topology/2Node -superclass SkelTopology
  313. Topology/2Node instproc init ns {
  314. $self next $ns
  315. $self instvar node_
  316. set node_(0) [$ns node]
  317. set node_(1) [$ns node]
  318. }
  319. #new Test/$TestName
  320. Agent/SA instproc sched-stop { decision } {
  321.         global hold simtime trace_flow
  322.         $self instvar node_ lifetime_
  323. set T [TestSuite getinstance]
  324. $T instvar ns_ param_ flows_ totflows_ f_
  325.         if { $decision == 1 } {
  326.                 set leavetime [expr [$ns_ now] + $lifetime_]
  327. $T flowadmit
  328.                 $ns_ at [expr [$ns_ now] + $lifetime_] "$self stop;
  329.                 if { $param_(trace_flow) } { 
  330.                     puts $f_ "Flow [$self set fid_] left @ $leavetime" 
  331.             }; 
  332.             $ns_ detach-agent $node_ $self; 
  333.             delete [$self set trafgen_]; delete $self; $T flowdepart"
  334.         } else {
  335.                 set leavetime [$ns_ now]
  336.                 $ns_ at-now "if { $param_(trace_flow) } { 
  337.                     puts $f_ "Flow [$self set fid_] left @ $leavetime"
  338.             }; 
  339.             $ns_ detach-agent $node_ $self; 
  340.             delete [$self set trafgen_]; delete $self"
  341.         }
  342. }
  343. TestSuite runTest