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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1996-1997 Regents of the University of California.
  3. # All rights reserved.
  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 MASH Research
  15. #  Group at the University of California Berkeley.
  16. # 4. Neither the name of the University nor of the Research Group may be
  17. #    used to endorse or promote products derived from this software without
  18. #    specific prior written permission.
  19. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  20. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  23. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  25. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  26. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  28. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  29. # SUCH DAMAGE.
  30. #
  31. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/lib/ns-trace.tcl,v 1.23 2001/05/21 19:27:34 haldar Exp $
  32. #
  33. Trace instproc init type {
  34. $self next $type
  35. $self instvar type_
  36. set type_ $type
  37. }
  38. Trace instproc format args {
  39. # The strange puts construction below helps us write formats such as
  40. #  $traceObject format {$src_} {$dst_} 
  41. # that will then put the source or destination id in the desired place.
  42. $self instvar type_ fp_ src_ dst_
  43. if [info exists fp_] {
  44. set ns [Simulator instance]
  45. puts $fp_ [eval list $type_ [$ns now] [eval concat $args]]
  46. }
  47. }
  48. Trace instproc attach fp {
  49. $self instvar fp_
  50. set fp_ $fp
  51. $self cmd attach $fp_
  52. }
  53. # For now separate attach instprocs for Trace and BaseTrace
  54. # later will merge both. change Trace to BaseTrace/Trace
  55. BaseTrace instproc attach fp {
  56.     $self instvar fp_
  57.     
  58.     set fp_ $fp
  59.     $self cmd attach $fp_
  60. }
  61. Class Trace/Hop -superclass Trace
  62. Trace/Hop instproc init {} {
  63. $self next "h"
  64. }
  65. Class Trace/Enque -superclass Trace
  66. Trace/Enque instproc init {} {
  67. $self next "+"
  68. }
  69. Trace/Deque instproc init {} {
  70. $self next "-"
  71. }
  72. #Early Drop Trace - added by ratul to be able to trace edrops in RED queues
  73. Class Trace/EDrop -superclass Trace
  74. Trace/EDrop instproc init {} {
  75.     $self next "e"
  76. }
  77. #Monitored Early Drop Trace - added by ratul to be able to trace mon_edrops in RedPD queues
  78. Class Trace/MEDrop -superclass Trace
  79. Trace/MEDrop instproc init {} {
  80.     $self next "m"
  81. }
  82. # Next two are for SessionSim's packet traces
  83. Class Trace/SessEnque -superclass Trace
  84. Trace/SessEnque instproc init {} {
  85. $self next "E" ;# Should use '='? :)
  86. }
  87. Class Trace/SessDeque -superclass Trace
  88. Trace/SessDeque instproc init {} {
  89. $self next "D" ;# Should use '_'?
  90. }
  91. Class Trace/Recv -superclass Trace 
  92. Trace/Recv instproc init {} {
  93. $self next "r"
  94. }
  95. Class Trace/Drop -superclass Trace
  96. Trace/Drop instproc init {} {
  97. $self next "d"
  98. }
  99. Class Trace/Generic -superclass Trace
  100. Trace/Generic instproc init {} {
  101. $self next "v"
  102. }
  103. #MAC level Collision traces
  104. Class Trace/Collision -superclass Trace
  105. Trace/Collision instproc init {} {
  106.     $self next "c"
  107. }
  108. # var trace shouldn't be derived here because it shouldn't be a connector
  109. # it's here only for backward compatibility
  110. Class Trace/Var -superclass Trace
  111. Trace/Var instproc init {} {
  112. $self next "f"
  113. }
  114. # Some pretty printing routines for generic use...
  115. proc f-time t {
  116. # format time
  117. format "%7.4f" $t
  118. }
  119. proc f-node n {
  120. # format node id...
  121. set node [expr $n >> 8]
  122. set port [expr $n & 0xff]
  123. return "$node.$port"
  124. }
  125. proc gc o {
  126. set ret "NULL_OBJECT"
  127. if { $o != "" } {
  128. set ret ""
  129. foreach i $o {
  130. if ![catch "$i info class" val] {
  131. lappend ret $val
  132. }
  133. }
  134. }
  135. set ret
  136. }
  137. Node instproc tn {} {
  138. $self instvar id_
  139. return "${self}(id $id_)"
  140. }
  141. Simulator instproc gen-map {} {
  142. # Did you ever see such uglier code? duh?
  143. #
  144. $self instvar Node_ link_ MobileNode_
  145. set nn [Node set nn_]
  146. for {set i 0} {$i < $nn} {incr i} {
  147. if ![info exists Node_($i)] {
  148. #incr i
  149. continue
  150. }
  151. set n $Node_($i)
  152. puts "Node [$n tn]"
  153. foreach nc [$n info vars] {
  154. switch $nc {
  155. ns_ continue
  156. id_ continue
  157. neighbor_ continue
  158. agents_ continue
  159. routes_ continue
  160. np_ continue
  161. default {
  162. if [$n array exists $nc] {
  163. puts "tt$nct[$n array get $nc]"
  164. } else {
  165. set v [$n set $nc]
  166. puts "tt$nc${v}([gc $v])"
  167. }
  168. }
  169. }
  170. }
  171. # Would be nice to dump agents attached to the dmux here?
  172. if {[llength [$n set agents_]] > 0} {
  173. puts "ntAgents at node (possibly in order of creation):"
  174. foreach a [$n set agents_] {
  175. puts "tt$at[gc $a]ttdst-addr/port: [$a set dst_addr_]/[$a set dst_port_]"
  176. }
  177. }
  178. puts ""
  179. foreach li [array names link_ [$n id]:*] {
  180. set L [split $li :]
  181. set nbr [[$self get-node-by-id [lindex $L 1]] entry]
  182. set ln $link_($li)
  183. puts "tLink $ln, fromNode_ [[$ln set fromNode_] tn] -> toNode_ [[$ln set toNode_] tn]"
  184. puts "tComponents (in order) head first"
  185. for {set c [$ln head]} {$c != $nbr} {set c [$c target]} {
  186. puts "tt$ct[gc $c]"
  187. }
  188. }
  189. puts "---"
  190. }
  191. }
  192. Simulator instproc maybeEnableTraceAll {obj args} {
  193.         foreach {file tag} {
  194.                 traceAllFile_           {}
  195.                 namtraceAllFile_        nam
  196.         } {
  197.                 $self instvar $file
  198.                 if [info exists $file] {
  199.                         $obj trace [set $file] $args $tag
  200.                 }
  201.         }
  202. }