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

通讯编程

开发平台:

Visual C++

  1. # Copyright (c) 1995 The Regents of the University of California.
  2. # All rights reserved.
  3. #
  4. # Redistribution and use in source and binary forms, with or without
  5. # modification, are permitted provided that the following conditions
  6. # are met:
  7. # 1. Redistributions of source code must retain the above copyright
  8. #    notice, this list of conditions and the following disclaimer.
  9. # 2. Redistributions in binary form must reproduce the above copyright
  10. #    notice, this list of conditions and the following disclaimer in the
  11. #    documentation and/or other materials provided with the distribution.
  12. # 3. All advertising materials mentioning features or use of this software
  13. #    must display the following acknowledgement:
  14. # This product includes software developed by the Computer Systems
  15. # Engineering Group at Lawrence Berkeley Laboratory.
  16. # 4. Neither the name of the University nor of the Laboratory may be used
  17. #    to endorse or promote products derived from this software without
  18. #    specific prior written permission.
  19. #
  20. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  21. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  24. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30. # SUCH DAMAGE.
  31. #
  32. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/test/misc_simple.tcl,v 1.13 2003/01/19 03:51:18 sfloyd Exp $
  33. #
  34. Object instproc exit args {
  35.       set ns [Simulator instance]
  36.       catch "$ns clearTimers"
  37.       eval exit $args
  38. }
  39. Class TestSuite
  40. # Use "$self next 0" or "$self next noTraceFiles" to avoid creating 
  41. #   all.tr and all.nam.
  42. # Use "$self next 2" or "$self next pktTraceFile" to create only all.tr, 
  43. #   but not all.nam.
  44. TestSuite instproc init { {dotrace traceFiles} } {
  45. global quiet argv0
  46. $self instvar ns_ test_ node_ testName_ 
  47. $self instvar allchan_ namchan_
  48. if [catch "$self get-simulator" ns_] {
  49.     set ns_ [new Simulator]
  50. }
  51. if { $dotrace == 1 || $dotrace == 2 || $dotrace == "traceFiles" || 
  52.    $dotrace == "pktTraceFile" } {
  53.                 set allchan_ [open all.tr w]
  54.                 $ns_ trace-all $allchan_
  55.         } 
  56.         if { $dotrace == "traceFiles" || $dotrace == 1 } {
  57. set namchan_ [open all.nam w]
  58. if {$quiet == "false"} {
  59.                  $ns_ namtrace-all $namchan_
  60. }
  61. if {[regexp {testReno} $argv0]} {
  62. $ns_ eventtrace-all
  63. }
  64. }
  65. set testName_ "$test_"
  66. }
  67. #
  68. # Arrange for tcp source stats to be dumped for $tcpSrc every
  69. # $interval seconds of simulation time
  70. #
  71. TestSuite instproc tcpDump { tcpSrc interval } {
  72. global quiet
  73. $self instvar dump_inst_ ns_
  74. if ![info exists dump_inst_($tcpSrc)] {
  75. set dump_inst_($tcpSrc) 1
  76. $ns_ at 0.0 "$self tcpDump $tcpSrc $interval"
  77. return
  78. }
  79. $ns_ at [expr [$ns_ now] + $interval] "$self tcpDump $tcpSrc $interval"
  80. set report [$ns_ now]/cwnd=[format "%.4f" [$tcpSrc set cwnd_]]/ssthresh=[$tcpSrc set ssthresh_]/ack=[$tcpSrc set ack_]
  81.         if {$quiet == "false"} {
  82.                 puts $report
  83.         }
  84. }
  85. #
  86. # Arrange for time to be printed every
  87. # $interval seconds of simulation time
  88. #
  89. TestSuite instproc timeDump { interval } {
  90. global quiet
  91. $self instvar dump_inst_ ns_
  92. if ![info exists dump_inst_] {
  93. set dump_inst_ 1
  94. $ns_ at 0.0 "$self timeDump $interval"
  95. return
  96. }
  97. $ns_ at [expr [$ns_ now] + $interval] "$self timeDump $interval"
  98. set report [$ns_ now]
  99.         if {$quiet == "false"} {
  100.                 puts $report
  101.         }
  102. }
  103. #
  104. # Trace the TCP congestion window cwnd_.
  105. #
  106. TestSuite instproc enable_tracecwnd { ns tcp {filename all.cwnd} } { 
  107.         $self instvar cwnd_chan_
  108.         set cwnd_chan_ [open $filename w]
  109.         $tcp trace cwnd_
  110.         $tcp attach $cwnd_chan_ 
  111. }       
  112.         
  113. #
  114. # Plot the TCP congestion window cwnd_.
  115. #
  116. TestSuite instproc plot_cwnd { {terse 0} {title cwnd} {newfiles 0} } {
  117.         global quiet
  118.         $self instvar cwnd_chan_
  119.         set awkCode {
  120.               {
  121.               if ($6 == "cwnd_") {
  122.                 print $1, $7 >> "temp.cwnd";
  123.               } }
  124.         }
  125.         set awkCodeTerse {
  126.       BEGIN { oldcwnd = -2; print "  " >> "temp.cwnd";}
  127.               {
  128.               if ($6 == "cwnd_") {
  129.  newcwnd = $7;
  130.  newtime = $1;
  131.  if (newtime < oldtime) {
  132.                     print "  " >> "temp.cwnd";
  133.     oldcwnd = -1;
  134.  }
  135.                  if ((newcwnd >= oldcwnd + 1) || (newcwnd <= oldcwnd - 1)){
  136.                     print newtime, newcwnd >> "temp.cwnd";
  137.     oldcwnd = $7;
  138.  }
  139.  oldtime = $1;
  140.               } }
  141.         }
  142.         set f [open cwnd.xgr w]
  143.         puts $f "TitleText: $title"
  144.         puts $f "Device: Postscript"
  145.  
  146.         if { [info exists cwnd_chan_] } {
  147.                 close $cwnd_chan_  
  148.         }
  149.         exec rm -f temp.cwnd
  150.         exec touch temp.cwnd
  151.         
  152. if {$terse == 1} {
  153. exec awk $awkCodeTerse all.cwnd
  154. if {$newfiles != 0} {
  155.           exec awk $awkCodeTerse all.cwnd1
  156. }
  157. } else {
  158.         exec awk $awkCode all.cwnd
  159. }
  160.         
  161.         puts $f "cwnd
  162.         exec cat temp.cwnd >@ $f
  163.         close $f                
  164.         if {$quiet == "false"} {
  165.                 exec xgraph -bb -tk -x time -y cwnd cwnd.xgr &
  166.         }               
  167. }                               
  168.                 
  169. TestSuite instproc cleanup { tfile testname } {
  170. $self instvar ns_ allchan_ namchan_
  171. $ns_ halt
  172. close $tfile
  173. if { [info exists allchan_] } {
  174. close $allchan_
  175. }       
  176. if { [info exists namchan_] } {
  177. close $namchan_
  178. }       
  179. $self finish $testname; # calls finish procedure in test suite file
  180. }
  181. TestSuite instproc cleanupAll { testname {stoptime 0}} {
  182. $self instvar ns_ allchan_ namchan_
  183. $ns_ halt
  184. if { [info exists allchan_] } {
  185. close $allchan_
  186. }       
  187. if { [info exists namchan_] } {
  188. close $namchan_
  189. }       
  190. if { $stoptime > 0 } {
  191. $self finish $testname $stoptime; 
  192. } else {
  193. $self finish $testname;
  194. }
  195. # calls finish procedure in test suite file
  196. }
  197. TestSuite instproc openTrace { stopTime testName } {
  198. $self instvar ns_ allchan_ namchan_
  199. exec rm -f out.tr temp.rands
  200. set traceFile [open out.tr w]
  201. puts $traceFile "v testName $testName"
  202. $ns_ at $stopTime "$self cleanup $traceFile $testName"
  203. return $traceFile
  204. }
  205. TestSuite instproc traceQueues { node traceFile } {
  206.         $self instvar ns_
  207.         foreach nbr [$node neighbors] { 
  208.                 $ns_ trace-queue $node $nbr $traceFile
  209.                 [$ns_ link $node $nbr] trace-dynamics $ns_ $traceFile
  210.         }
  211. }
  212.  
  213. proc usage {} {
  214. global argv0
  215. puts stderr "Valid tests are:t[get-subclasses TestSuite Test/]"
  216. exit 1
  217. }
  218. proc isProc? {cls prc} {
  219. if [catch "Object info subclass $cls/$prc" r] {
  220. global argv0
  221. puts stderr "$argv0: no such $cls: $prc"
  222. usage
  223. }
  224. }
  225. proc get-subclasses {cls pfx} {
  226. set ret ""
  227. set l [string length $pfx]
  228. set c $cls
  229. while {[llength $c] > 0} {
  230. set t [lindex $c 0]
  231. set c [lrange $c 1 end]
  232. if [string match ${pfx}* $t] {
  233. lappend ret [string range $t $l end]
  234. }
  235. eval lappend c [$t info subclass]
  236. }
  237. set ret
  238. }
  239. TestSuite proc runTest {} {
  240.         global argc argv quiet
  241.         set quiet false
  242.         switch $argc {
  243.                 1 {
  244.                         set test $argv
  245.                         isProc? Test $test
  246.                 }
  247.                 2 {
  248.                         set test [lindex $argv 0]
  249.                         isProc? Test $test
  250.                         set param [lindex $argv 1]
  251.                         if {$param == "QUIET"} {
  252.                                 set quiet true 
  253.                         } 
  254.                 }
  255.                 default {
  256.                         usage
  257.                 }
  258.         }
  259.         set t [new Test/$test]
  260.         $t run
  261. }
  262. TestSuite instproc setTopo {} {
  263.     $self instvar node_ net_ ns_ topo_
  264.     set topo_ [new Topology/$net_ $ns_]
  265.     foreach i [$topo_ array names node_] {
  266.         set node_($i) [$topo_ node? $i]
  267.     }
  268. }
  269. ### Local Variables:
  270. ### mode: tcl
  271. ### tcl-indent-level: 8
  272. ### tcl-default-application: ns
  273. ### End: