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

通讯编程

开发平台:

Visual C++

  1. #  Copyright (c) 1997 by the University of Southern California
  2. #  All rights reserved.
  3. #  This program is free software; you can redistribute it and/or
  4. #  modify it under the terms of the GNU General Public License,
  5. #  version 2, as published by the Free Software Foundation.
  6. #
  7. #  This program is distributed in the hope that it will be useful,
  8. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10. #  GNU General Public License for more details.
  11. #
  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. #  59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  15. #
  16. #  The copyright of this module includes the following
  17. #  linking-with-specific-other-licenses addition:
  18. #
  19. #  In addition, as a special exception, the copyright holders of
  20. #  this module give you permission to combine (via static or
  21. #  dynamic linking) this module with free software programs or
  22. #  libraries that are released under the GNU LGPL and with code
  23. #  included in the standard release of ns-2 under the Apache 2.0
  24. #  license or under otherwise-compatible licenses with advertising
  25. #  requirements (or modified versions of such code, with unchanged
  26. #  license).  You may copy and distribute such a system following the
  27. #  terms of the GNU GPL for this module and the licenses of the
  28. #  other code concerned, provided that you include the source code of
  29. #  that other code when and as the GNU GPL requires distribution of
  30. #  source code.
  31. #
  32. #  Note that people who make modified versions of this module
  33. #  are not obligated to grant this special exception for their
  34. #  modified versions; it is their choice whether to do so.  The GNU
  35. #  General Public License gives permission to release a modified
  36. #  version without this exception; this exception also makes it
  37. #  possible to release a modified version which carries forward this
  38. #  exception.
  39. # ns trace support for nam
  40. #
  41. # Author: Haobo Yu (haoboy@isi.edu)
  42. #
  43. # $Header: /cvsroot/nsnam/ns-2/tcl/lib/ns-namsupp.tcl,v 1.43 2006/02/22 13:23:15 mahrenho Exp $
  44. #
  45. #
  46. # Support for node tracing
  47. #
  48. # This will only work during initialization. Not possible to change shape 
  49. # dynamically
  50. Node instproc shape { shape } {
  51. $self instvar attr_ 
  52. set attr_(SHAPE) $shape
  53. }
  54. # Returns the current shape of the node
  55. Node instproc get-shape {} {
  56. $self instvar attr_
  57. if [info exists attr_(SHAPE)] {
  58. return $attr_(SHAPE)
  59. } else {
  60. return ""
  61. }
  62. }
  63. Node instproc color { color } {
  64. $self instvar attr_ id_
  65. set ns [Simulator instance]
  66. if [$ns is-started] {
  67. # color must be initialized
  68. $ns puts-nam-config 
  69. [eval list "n -t [format "%.15g" [$ns now]] -s $id_ -S COLOR -c $color -o $attr_(COLOR) -i $color -I $attr_(LCOLOR)"]
  70. set attr_(COLOR) $color
  71.         set attr_(LCOLOR) $color
  72. } else {
  73. set attr_(COLOR) $color
  74.         set attr_(LCOLOR) $color
  75. }
  76. }
  77. Node instproc label { str} {
  78. $self instvar attr_ id_
  79. set ns [Simulator instance]
  80. if [info exists attr_(DLABEL)] {
  81. $ns puts-nam-config "n -t [$ns now] -s $id_ -S DLABEL -l "$str" -L $attr_(DLABEL)"
  82. } else {
  83. $ns puts-nam-config "n -t [$ns now] -s $id_ -S DLABEL -l "$str" -L """
  84. }
  85. set attr_(DLABEL) "$str"
  86. }
  87. Node instproc label-color { str} {
  88.         $self instvar attr_ id_
  89.         set ns [Simulator instance]
  90.         if [info exists attr_(DCOLOR)] {
  91.                 $ns puts-nam-config "n -t [$ns now] -s $id_ -S DCOLOR -e "$str" -E $attr_(DCOLOR)"
  92.         } else {
  93.                 $ns puts-nam-config "n -t [$ns now] -s $id_ -S DCOLOR -e "$str" -E """
  94.         }
  95.         set attr_(DCOLOR) "$str"
  96. }
  97. Node instproc label-at { str } {
  98.         $self instvar attr_ id_
  99.         set ns [Simulator instance]
  100.         if [info exists attr_(DIRECTION)] {
  101.                 $ns puts-nam-config "n -t [$ns now] -s $id_ -S DIRECTION -p "$str" -P $attr_(DIRECTION)"
  102.         } else {
  103.                 $ns puts-nam-config "n -t [$ns now] -s $id_ -S DIRECTION -p "$str" -P """
  104.         }
  105.         set attr_(DIRECTION) "$str"
  106. }
  107. Node instproc dump-namconfig {} {
  108. $self instvar attr_ id_ address_ X_ Y_ Z_
  109. set ns [Simulator instance]
  110. if ![info exists attr_(SHAPE)] {
  111. set attr_(SHAPE) "circle"
  112. if ![info exists attr_(COLOR)] {
  113. set attr_(COLOR) "black"
  114.         set attr_(LCOLOR) "black"
  115. }
  116.         if ![info exists attr_(DCOLOR)] {
  117.                 set attr_(DCOLOR) "black"
  118.         }
  119. if { [info exists X_] && [info exists Y_] } {
  120. if [info exists Z_] {
  121. $ns puts-nam-config 
  122. [eval list "n -t * -a $address_ -s $id_ -S UP -v $attr_(SHAPE) -c $attr_(COLOR) -i $attr_(LCOLOR) -x $X_ -y $Y_ -Z $Z_"]
  123. } else {
  124. $ns puts-nam-config 
  125. [eval list "n -t * -a $address_ -s $id_ -S UP -v $attr_(SHAPE) -c $attr_(COLOR) -i $attr_(LCOLOR) -x $X_ -y $Y_"]
  126. }
  127. } else {
  128. $ns puts-nam-config 
  129. [eval list "n -t * -a $address_ -s $id_ -S UP -v $attr_(SHAPE) -c $attr_(COLOR) -i $attr_(LCOLOR)"]
  130. }
  131. }
  132. Node instproc change-color { color } {
  133. puts "Warning: Node::change-color is obsolete. Use Node::color instead"
  134. $self color $color
  135. }
  136. Node instproc get-attribute { name } {
  137. $self instvar attr_
  138. if [info exists attr_($name)] {
  139. return $attr_($name)
  140. } else {
  141. return ""
  142. }
  143. }
  144. Node instproc get-color {} {
  145. puts "Warning: Node::get-color is obsolete. Please use Node::get-attribute"
  146. return [$self get-attribute "COLOR"]
  147. }
  148. Node instproc add-mark { name color {shape "circle"} } {
  149. $self instvar id_ markColor_ shape_
  150. set ns [Simulator instance]
  151. $ns puts-nam-config "m -t [$ns now] -s $id_ -n $name -c $color -h $shape"
  152. set markColor_($name) $color
  153. set shape_($name) $shape
  154. }
  155. Node instproc delete-mark { name } {
  156. $self instvar id_ markColor_ shape_
  157. # Ignore if the mark $name doesn't exist
  158. if ![info exists markColor_($name)] {
  159. return
  160. }
  161. set ns [Simulator instance]
  162. $ns puts-nam-config 
  163. "m -t [$ns now] -s $id_ -n $name -c $markColor_($name) -h $shape_($name) -X"
  164. }
  165. #
  166. # Support for link tracing
  167. # XXX only SimpleLink (and its children) can dump nam config, because Link
  168. # doesn't have bandwidth and delay.
  169. #
  170. SimpleLink instproc dump-namconfig {} {
  171. # make a duplex link in nam
  172. $self instvar link_ attr_ fromNode_ toNode_
  173. if ![info exists attr_(COLOR)] {
  174. set attr_(COLOR) "black"
  175. }
  176. set ns [Simulator instance]
  177. set bw [$link_ set bandwidth_]
  178. set delay [$link_ set delay_]
  179. if [info exists attr_(ORIENTATION)] {
  180. $ns puts-nam-config 
  181. "l -t * -s [$fromNode_ id] -d [$toNode_ id] -S UP -r $bw -D $delay -c $attr_(COLOR) -o $attr_(ORIENTATION)"
  182. } else {
  183. $ns puts-nam-config 
  184. "l -t * -s [$fromNode_ id] -d [$toNode_ id] -S UP -r $bw -D $delay -c $attr_(COLOR)"
  185. }
  186. }
  187. Link instproc dump-nam-queueconfig {} {
  188. $self instvar attr_ fromNode_ toNode_
  189. if ![info exists attr_(COLOR)] {
  190. set attr_(COLOR) "black"
  191. }
  192. set ns [Simulator instance]
  193. if [info exists attr_(QUEUE_POS)] {
  194. $ns puts-nam-config "q -t * -s [$fromNode_ id] -d [$toNode_ id] -a $attr_(QUEUE_POS)"
  195. } else {
  196. set attr_(QUEUE_POS) ""
  197. }
  198. }
  199. #
  200. # XXX
  201. # This function should be called ONLY ONCE during initialization. 
  202. # The order in which links are created in nam is determined by the calling 
  203. # order of this function.
  204. #
  205. Link instproc orient { ori } {
  206. $self instvar attr_
  207. set attr_(ORIENTATION) $ori
  208. [Simulator instance] register-nam-linkconfig $self
  209. }
  210. Link instproc get-attribute { name } {
  211. $self instvar attr_
  212. if [info exists attr_($name)] {
  213. return $attr_($name)
  214. } else {
  215. return ""
  216. }
  217. }
  218. Link instproc queuePos { pos } {
  219. $self instvar attr_
  220. set attr_(QUEUE_POS) $pos
  221. }
  222. Link instproc color { color } {
  223. $self instvar attr_ fromNode_ toNode_ trace_
  224. set ns [Simulator instance]
  225. if [$ns is-started] {
  226. $ns puts-nam-config 
  227. [eval list "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S COLOR -c $color -o $attr_(COLOR)"]
  228. set attr_(COLOR) $color
  229. } else {
  230. set attr_(COLOR) $color
  231. }
  232. }
  233. # a link doesn't have its own trace file, write it to global trace file
  234. Link instproc change-color { color } {
  235. puts "Warning: Link::change-color is obsolete. Please use Link::color."
  236. $self color $color
  237. }
  238. Link instproc get-color {} {
  239. puts "Warning: Node::get-color is obsolete. Please use Node::get-attribute"
  240. return [$self get-attribute "COLOR"]
  241. }
  242. Link instproc label { label } {
  243.         $self instvar attr_ fromNode_ toNode_ trace_
  244.         set ns [Simulator instance]
  245.         if [info exists attr_(DLABEL)] {
  246.             $ns puts-nam-config 
  247.             "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DLABEL -l "$label" -L $attr_(DLABEL)"
  248.         } else {
  249.             $ns puts-nam-config 
  250.             "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DLABEL -l "$label" -L """
  251.         }
  252.         set attr_(DLABEL) "$label"
  253.     }
  254. Link instproc label-color { str } {
  255.         $self instvar attr_ fromNode_ toNode_ trace_
  256.         set ns [Simulator instance]
  257.         if [info exists attr_(DCOLOR)] {
  258.             $ns puts-nam-config 
  259.             "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DCOLOR -e "$str" -E $attr_(DCOLOR)"
  260.         } else {
  261.             $ns puts-nam-config 
  262.             "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DCOLOR -e "$str" -E """
  263.         }
  264.         set attr_(DCOLOR) "$str"
  265.     }
  266. Link instproc label-at { str } {
  267.         $self instvar attr_ fromNode_ toNode_ trace_
  268.         set ns [Simulator instance]
  269.         if [info exists attr_(DIRECTION)] {
  270.             $ns puts-nam-config 
  271.             "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DIRECTION -p "$str" -P $attr_(DIRECTION)"
  272.         } else {
  273.             $ns puts-nam-config 
  274.             "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DIRECTION -p "$str" -P """
  275.         }
  276.         set attr_(DIRECTION) "$str"
  277.     }
  278. #
  279. # Support for nam snapshot
  280. #
  281. Simulator instproc snapshot { } {
  282.     set ns [Simulator instance]
  283.     $ns puts-nam-config 
  284.             "v -t [$self now] take_snapshot"
  285. }
  286. Simulator instproc rewind-nam { } {
  287. set ns [Simulator instance]
  288. $ns puts-nam-config 
  289. "v  -t [$self now] playing_backward"
  290. }
  291. Simulator instproc re-rewind-nam { } {
  292. set ns [Simulator instance]
  293. $ns puts-nam-config 
  294. "v  -t [$self now] playing_forward"
  295. }
  296. Simulator instproc terminate-nam { } {
  297. set ns [Simulator instance]
  298. $ns puts-nam-config 
  299. "v  -t [$self now] terminating_nam"
  300. }
  301. #
  302. # Support for agent tracing
  303. #
  304. # This function records agents being traced, so they will be written into nam
  305. # trace when the simulator starts
  306. Simulator instproc add-agent-trace { agent name {f ""} } {
  307. $self instvar tracedAgents_
  308. set tracedAgents_($name) $agent
  309. set trace [$self get-nam-traceall]
  310. if {$f != ""} {
  311. $agent attach-trace $f
  312. } elseif {$trace != ""} {
  313. $agent attach-trace $trace
  314. }
  315. }
  316. Simulator instproc delete-agent-trace { agent } {
  317. $agent delete-agent-trace
  318. }
  319. Simulator instproc monitor-agent-trace { agent } {
  320. $self instvar monitoredAgents_
  321. lappend monitoredAgents_ $agent
  322. }
  323. #
  324. # Agent trace is added when attaching to a traced node
  325. # we need to keep a file handle in tcl so that var tracing can also be 
  326. # done in tcl by manual inserting update-var-trace{}
  327. #
  328. Agent instproc attach-trace { file } {
  329. $self instvar namTrace_
  330. set namTrace_ $file 
  331. # add all traced var messages
  332. $self attach $file 
  333. }
  334. #
  335. # nam initialization
  336. #
  337. Simulator instproc dump-namagents {} {
  338. $self instvar tracedAgents_ monitoredAgents_
  339. if {![$self is-started]} {
  340. return
  341. }
  342. if [info exists tracedAgents_] {
  343. foreach id [array names tracedAgents_] {
  344. $tracedAgents_($id) add-agent-trace $id
  345. $tracedAgents_($id) cmd dump-namtracedvars
  346. }
  347. unset tracedAgents_
  348. }
  349. if [info exists monitoredAgents_] {
  350. foreach a $monitoredAgents_ {
  351. $a show-monitor
  352. }
  353. unset monitoredAgents_
  354. }
  355. }
  356. Simulator instproc dump-namversion { v } {
  357. $self puts-nam-config "V -t * -v $v -a 0"
  358. }
  359. Simulator instproc dump-namwireless {} {
  360. $self instvar namNeedsW_ namWx_ namWy_
  361. # see if we need to write a W event
  362. if ![info exists namNeedsW_] { set namNeedsW_ 0 }
  363. if {[info exists namWx_] && [info exists namWy_]}  {
  364. set maxX $namWx_
  365. set maxY $namWy_
  366. } else {
  367. set maxX 10
  368. set maxY 10
  369. # get max X and Y coords of nodes
  370. # if any nodes have coordinates set, then flag the need for
  371. # a W event and adjust maxX/maxY as needed
  372. foreach node [Node info instances] {
  373. if {[lsearch -exact [$node info vars] X_] != -1} {
  374. set namNeedsW_ 1
  375. set curX [$node set X_]
  376. if {$curX > $maxX} {set maxX $curX}
  377. }
  378. if {[lsearch -exact [$node info vars] Y_] != -1} {
  379. set namNeedsW_ 1
  380. set curY [$node set Y_]
  381. if {$curY > $maxY} {set maxY $curY}
  382. }
  383. }
  384. }
  385. if $namNeedsW_ {
  386. $self puts-nam-config "W -t * -x $maxX -y $maxY"
  387. }
  388. }
  389. Simulator instproc dump-namcolors {} {
  390. $self instvar color_
  391. if ![$self is-started] {
  392. return 
  393. }
  394. foreach id [array names color_] {
  395. $self puts-nam-config "c -t * -i $id -n $color_($id)"
  396. }
  397. }
  398. Simulator instproc dump-namlans {} {
  399. if ![$self is-started] {
  400. return
  401. }
  402. $self instvar Node_
  403. foreach nn [array names Node_] {
  404. if [$Node_($nn) is-lan?] {
  405. $Node_($nn) dump-namconfig
  406. }
  407. }
  408. }
  409. Simulator instproc dump-namlinks {} {
  410. $self instvar linkConfigList_
  411. if ![$self is-started] {
  412. return
  413. }
  414. if [info exists linkConfigList_] {
  415. foreach lnk $linkConfigList_ {
  416. $lnk dump-namconfig
  417. }
  418. unset linkConfigList_
  419. }
  420. }
  421. Simulator instproc dump-namnodes {} {
  422. $self instvar Node_
  423. if ![$self is-started] {
  424. return
  425. }
  426. foreach nn [array names Node_] {
  427. if ![$Node_($nn) is-lan?] {
  428. $Node_($nn) dump-namconfig
  429. }
  430. }
  431. }
  432. Simulator instproc dump-namqueues {} {
  433. $self instvar link_
  434. if ![$self is-started] {
  435. return
  436. }
  437. foreach qn [array names link_] {
  438. $link_($qn) dump-nam-queueconfig
  439. }
  440. }
  441. # Write hierarchical masks/shifts into trace file
  442. Simulator instproc dump-namaddress {} {
  443. # First write number of hierarchies
  444. $self puts-nam-config 
  445.     "A -t * -n [AddrParams hlevel] -p 0 -o [AddrParams set 
  446. ALL_BITS_SET] -c [AddrParams McastShift] -a [AddrParams McastMask]"
  447. for {set i 1} {$i <= [AddrParams hlevel]} {incr i} {
  448. $self puts-nam-config "A -t * -h $i -m [AddrParams 
  449. NodeMask $i] -s [AddrParams NodeShift $i]"
  450. }
  451. }
  452. Simulator instproc init-nam {} {
  453. $self instvar annotationSeq_ 
  454. set annotationSeq_ 0
  455. # Setting nam trace file version first
  456. $self dump-namversion 1.0a5
  457. # write W event if needed
  458. $self dump-namwireless
  459. # Addressing scheme
  460. $self dump-namaddress
  461. # Color configuration for nam
  462. $self dump-namcolors
  463. # Node configuration for nam
  464. $self dump-namnodes
  465. # Lan and Link configurations for nam
  466. $self dump-namlinks 
  467. $self dump-namlans
  468. # nam queue configurations
  469. $self dump-namqueues
  470. # Traced agents for nam
  471. $self dump-namagents
  472. }
  473. #
  474. # Other animation control support
  475. Simulator instproc trace-annotate { str } {
  476. $self instvar annotationSeq_
  477. $self puts-ns-traceall [format 
  478. "v %s %s {set sim_annotation {%s}}" [$self now] eval $str]
  479. incr annotationSeq_
  480. $self puts-nam-config [format 
  481. "v -t %.15g -e sim_annotation %.15g $annotationSeq_ $str" 
  482. [$self now] [$self now] ]
  483. }
  484. proc trace_annotate { str } {
  485. set ns [Simulator instance]
  486. $ns trace-annotate $str
  487. }
  488. proc flash_annotate { start duration msg } {
  489. set ns [Simulator instance]
  490. $ns at $start "trace_annotate {$msg}"
  491. $ns at [expr $start+$duration] "trace_annotate periodic_message"
  492. }
  493. # rate's unit is second
  494. Simulator instproc set-animation-rate { rate } {
  495. # time_parse defined in tcl/rtp/session-rtp.tcl
  496. set r [time_parse $rate]
  497. # This old nam api (set_rate) works but is quite obscure,
  498. # the new api (set_rate_ext) is simpler.
  499. # $self puts-nam-config "v -t [$self now] set_rate [expr 10*log10($r)] 1"
  500. $self puts-nam-config "v -t [$self now] set_rate_ext $r 1"
  501. }