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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1995 The Regents of the University of California.
  3. # All rights reserved.
  4. #
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. # 1. Redistributions of source code must retain the above copyright
  9. #    notice, this list of conditions and the following disclaimer.
  10. # 2. Redistributions in binary form must reproduce the above copyright
  11. #    notice, this list of conditions and the following disclaimer in the
  12. #    documentation and/or other materials provided with the distribution.
  13. # 3. All advertising materials mentioning features or use of this software
  14. #    must display the following acknowledgement:
  15. # This product includes software developed by the Computer Systems
  16. # Engineering Group at Lawrence Berkeley Laboratory.
  17. # 4. Neither the name of the University nor of the Laboratory may be used
  18. #    to endorse or promote products derived from this software without
  19. #    specific prior written permission.
  20. #
  21. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31. # SUCH DAMAGE.
  32. #
  33. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/test/misc.tcl,v 1.20 2000/05/24 00:22:27 heideman Exp $
  34. #
  35. #source plotting.tcl
  36. if [file exists redefines.tcl] {
  37. puts "sourcing redefines.tcl in [pwd]"
  38. source redefines.tcl
  39. }
  40. Object instproc exit args {
  41.       set ns [Simulator instance]
  42.       catch "$ns clearTimers"
  43.       eval exit $args
  44. }
  45. Class TestSuite
  46. TestSuite instproc init { {dotrace 1} } {
  47. global quiet
  48. $self instvar ns_ net_ defNet_ test_ topo_ node_ testName_ 
  49. $self instvar allchan_ namchan_
  50. if [catch "$self get-simulator" ns_] {
  51.     set ns_ [new Simulator]
  52. }
  53. if { $dotrace } {
  54.                 set allchan_ [open all.tr w]
  55.                 $ns_ trace-all $allchan_
  56. set namchan_ [open all.nam w]
  57. if {$quiet == "false"} {
  58.                  $ns_ namtrace-all $namchan_
  59. }
  60. }
  61. if {$net_ == ""} {
  62. set net_ $defNet_
  63. }
  64. if ![Topology/$defNet_ info subclass Topology/$net_] {
  65. global argv0
  66. puts "$argv0: cannot run test $test_ over topology $net_"
  67. exit 1
  68. }
  69. set topo_ [new Topology/$net_ $ns_]
  70. foreach i [$topo_ array names node_] {
  71. # This would be cool, but lets try to be compatible
  72. # with test-suite.tcl as far as possible.
  73. #
  74. # $self instvar $i
  75. # set $i [$topo_ node? $i]
  76. #
  77. set node_($i) [$topo_ node? $i]
  78. }
  79. if {$net_ == $defNet_} {
  80. set testName_ "$test_"
  81. } else {
  82. set testName_ "$test_:$net_"
  83. }
  84. if { $dotrace } {
  85. # XXX
  86. if [info exists node_(k1)] {
  87. set blink [$ns_ link $node_(r1) $node_(k1)]
  88. } else {
  89. set blink [$ns_ link $node_(r1) $node_(r2)] 
  90. }
  91. $blink trace-dynamics $ns_ stdout 
  92. }
  93. }
  94. TestSuite instproc finish file {
  95. # global env
  96. #
  97. # THIS CODE IS NOW SUPERSEDED BY THE NEWER EXTERNAL DRIVERS,
  98. # raw2xg, and raw2gp, in ~ns/bin.  raw2xg generates output suitable
  99. # for xgraph, and raw2gp, that suitable for gnuplot.
  100. #
  101. #       To reproduce old functionality:
  102. # global PERL
  103. # exec $PERL ../../bin/getrc -s 2 -d 3 all.tr | 
  104. #   $PERL ../../bin/raw2xg -s 0.01 -m 90 |  
  105. #   xgraph -bb -tk -nl -m -x time -y packets"
  106. #
  107. #       catch "$self exit 0"
  108. exit 0
  109. }
  110. #
  111. # Arrange for tcp source stats to be dumped for $tcpSrc every
  112. # $interval seconds of simulation time
  113. #
  114. TestSuite instproc tcpDump { tcpSrc interval } {
  115. global quiet
  116. $self instvar dump_inst_ ns_
  117. if ![info exists dump_inst_($tcpSrc)] {
  118. set dump_inst_($tcpSrc) 1
  119. $ns_ at 0.0 "$self tcpDump $tcpSrc $interval"
  120. return
  121. }
  122. $ns_ at [expr [$ns_ now] + $interval] "$self tcpDump $tcpSrc $interval"
  123. set report [$ns_ now]/cwnd=[format "%.4f" [$tcpSrc set cwnd_]]/ssthresh=[$tcpSrc set ssthresh_]/ack=[$tcpSrc set ack_]
  124.         if {$quiet == "false"} {
  125.                 puts $report
  126.         }
  127. }
  128. TestSuite instproc tcpDumpAll { tcpSrc interval label } {
  129. $self instvar dump_inst_ ns_
  130. if ![info exists dump_inst_($tcpSrc)] {
  131. set dump_inst_($tcpSrc) 1
  132. puts $label/window=[$tcpSrc set window_]/packetSize=[$tcpSrc set packetSize_]/bugFix=[$tcpSrc set bugFix_]
  133. $ns_ at 0.0 "$self tcpDumpAll $tcpSrc $interval $label"
  134. return
  135. }
  136. $ns_ at [expr [$ns_ now] + $interval] "$self tcpDumpAll $tcpSrc $interval $label"
  137. puts $label/time=[$ns_ now]/cwnd=[format "%.4f" [$tcpSrc set cwnd_]]/ssthresh=[$tcpSrc set ssthresh_]/ack=[$tcpSrc set ack_]/rtt=[$tcpSrc set rtt_]
  138. }
  139. TestSuite instproc cleanup { tfile testname } {
  140. $self instvar ns_ allchan_ namchan_
  141. $ns_ halt
  142. close $tfile
  143. if { [info exists allchan_] } {
  144. close $allchan_
  145. }       
  146. if { [info exists namchan_] } {
  147. close $namchan_
  148. }       
  149. $self finish $testname; # calls finish procedure in test suite file
  150. }
  151. TestSuite instproc openTrace { stopTime testName } {
  152. $self instvar ns_ allchan_ namchan_
  153. exec rm -f out.tr temp.rands
  154. set traceFile [open out.tr w]
  155. puts $traceFile "v testName $testName"
  156. $ns_ at $stopTime "$self cleanup $traceFile $testName"
  157. return $traceFile
  158. }
  159. TestSuite instproc traceQueues { node traceFile } {
  160. $self instvar ns_
  161. foreach nbr [$node neighbors] {
  162. $ns_ trace-queue $node $nbr $traceFile
  163. [$ns_ link $node $nbr] trace-dynamics $ns_ $traceFile
  164. }
  165. }
  166. TestSuite instproc namtraceQueues { node traceFile } {
  167. $self instvar ns_
  168. foreach nbr [$node neighbors] {
  169. $ns_ namtrace-queue $node $nbr $traceFile
  170. [$ns_ link $node $nbr] trace-dynamics $ns_ $traceFile "nam"
  171. }
  172. }
  173. proc usage {} {
  174. global argv0
  175. puts stderr "usage: ns $argv0 <tests> [<topologies>]"
  176. puts stderr "Valid tests are:t[get-subclasses TestSuite Test/]"
  177. puts stderr "Valid Topologies are:t[get-subclasses SkelTopology Topology/]"
  178. exit 1
  179. }
  180. proc isProc? {cls prc} {
  181. if [catch "Object info subclass $cls/$prc" r] {
  182. global argv0
  183. puts stderr "$argv0: no such $cls: $prc"
  184. usage
  185. }
  186. }
  187. proc get-subclasses {cls pfx} {
  188. set ret ""
  189. set l [string length $pfx]
  190. set c $cls
  191. while {[llength $c] > 0} {
  192. set t [lindex $c 0]
  193. set c [lrange $c 1 end]
  194. if [string match ${pfx}* $t] {
  195. lappend ret [string range $t $l end]
  196. }
  197. eval lappend c [$t info subclass]
  198. }
  199. set ret
  200. }
  201. TestSuite proc runTest {} {
  202.         global argc argv quiet
  203.         set quiet false
  204.         switch $argc {
  205.                 1 {
  206.                         set test $argv
  207.                         isProc? Test $test
  208.                         set topo ""
  209.                 }
  210.                 2 {
  211.                         set test [lindex $argv 0]
  212.                         isProc? Test $test
  213.                         set topo [lindex $argv 1]
  214.                         if {$topo == "QUIET"} {
  215.                                 set quiet true 
  216.                                 set topo ""
  217.                         } else {
  218.                                 isProc? Topology $topo
  219.                         }
  220.                 }
  221.                 3 {
  222.                         set test [lindex $argv 0]
  223.                         isProc? Test $test
  224.                         set topo [lindex $argv 1]
  225.                         isProc? Topology $topo
  226.                         set extra [lindex $argv 2]
  227.                         if {$extra == "QUIET"} {
  228.                                 set quiet true
  229.                         }
  230.                 }
  231.                 default {
  232.                         usage
  233.                 }
  234.         }
  235.         set t [new Test/$test $topo]
  236.         $t run
  237. }
  238. ### Local Variables:
  239. ### mode: tcl
  240. ### tcl-indent-level: 8
  241. ### tcl-default-application: ns
  242. ### End: