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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1996 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-route.tcl,v 1.38 2005/05/30 05:22:36 sfloyd Exp $
  32. #
  33. RouteLogic instproc register {proto args} {
  34. $self instvar rtprotos_ node_rtprotos_ default_node_rtprotos_
  35. if [info exists rtprotos_($proto)] {
  36. eval lappend rtprotos_($proto) $args
  37. } else {
  38. set rtprotos_($proto) $args
  39. }
  40. if { [Agent/rtProto/$proto info procs pre-init-all] != "" } {
  41. Agent/rtProto/$proto pre-init-all $args
  42. }
  43. }
  44. RouteLogic instproc configure {} {
  45. $self instvar rtprotos_
  46. if [info exists rtprotos_] {
  47. foreach proto [array names rtprotos_] {
  48. eval Agent/rtProto/$proto init-all $rtprotos_($proto)
  49. }
  50. } else {
  51. Agent/rtProto/Static init-all
  52. }
  53. }
  54. RouteLogic instproc lookup { nodeid destid } {
  55. if { $nodeid == $destid } {
  56. return $nodeid
  57. }
  58. set ns [Simulator instance]
  59. set node [$ns get-node-by-id $nodeid]
  60. if [Simulator hier-addr?] {
  61. set dest [$ns get-node-by-id $destid]
  62. set nh [$self hier-lookup [$node node-addr] [$dest node-addr]]
  63. return [$ns get-node-id-by-addr $nh]
  64. }
  65. set rtobj [$node rtObject?]
  66. if { $rtobj != "" } {
  67. $rtobj lookup [$ns get-node-by-id $destid]
  68. } else {
  69. $self cmd lookup $nodeid $destid
  70. }
  71. RouteLogic instproc notify {} {
  72. $self instvar rtprotos_
  73. foreach i [array names rtprotos_] {
  74. Agent/rtProto/$i compute-all
  75. }
  76. foreach i [CtrMcastComp info instances] {
  77. $i notify
  78. }
  79. if { [rtObject info instances] == ""} {
  80. foreach node [[Simulator instance] all-nodes-list] {
  81. # XXX using dummy 0 for 'changes'
  82. $node notify-mcast 0
  83. }
  84. }
  85. }
  86. #
  87. # routine to create address for hier-route-lookup at each level
  88. # i.e at level 2, address to lookup should be 0.1 and not just 1
  89. #
  90. RouteLogic instproc append-addr {level addrstr} {
  91. if {$level != 0} {
  92. set str [lindex $addrstr 0]
  93. for {set i 1} {$i < $level} {incr i} {
  94. append str . [lindex $addrstr [expr $i]]
  95. }
  96. return $str
  97. }
  98. }
  99. #
  100. # debugging method to dump table (see route.cc for C++ methods)
  101. #
  102. RouteLogic instproc dump nn {
  103. set i 0
  104. while { $i < $nn } {
  105. set j 0
  106. while { $j < $nn } {
  107. puts "$i -> $j via [$self lookup $i $j]"
  108. incr j
  109. }
  110. incr i
  111. }
  112. }
  113. Simulator instproc rtproto {proto args} {
  114.     $self instvar routingTable_
  115.     if {$proto == "Algorithmic"} {
  116. set routingTable_ [new RouteLogic/Algorithmic]
  117.     }
  118.     eval [$self get-routelogic] register $proto $args
  119. }
  120. Simulator instproc get-routelogic {} {
  121. $self instvar routingTable_
  122. if ![info exists routingTable_] {
  123. set routingTable_ [new RouteLogic]
  124. }
  125. return $routingTable_
  126. }
  127. # Debo
  128. Simulator instproc dump-approx-sim-data {} {
  129. $self instvar routingTable_ Node_ link_
  130.     
  131. #        if ![info exists routingTable_] {
  132. #     puts "error: routing table is not computed yet!"
  133. #     return 0
  134. # }
  135. set r [$self get-routelogic]
  136. $self cmd get-routelogic $r  ;# propagate rl in C++
  137. # populate the route logic 
  138. foreach ln [array names link_] {
  139. set L [split $ln :]
  140. set srcID [lindex $L 0]
  141. set dstID [lindex $L 1]
  142. if { [$link_($ln) up?] == "up" } {
  143. $r insert $srcID $dstID [$link_($ln) cost?]
  144. } else {
  145. $r reset $srcID $dstID
  146. }
  147. }
  148. # now compute routes
  149. $r compute
  150. puts "# Dumping Approx-Sim Data"  
  151. set n [Node set nn_]
  152. puts "m [Link set nl_] "
  153.         foreach qn [array names link_] {
  154.                 set l $link_($qn)
  155.         set q [$l queue]
  156.         set t [$q info class]
  157.     if {[lindex [split $t "/"] 1] == "DropTail"} {
  158.                 puts "link [expr [$l set id_] + 1] [expr [$l bw] / 8000] [expr [$l bw] / 8000] [$l delay] [$l qsize] $t"
  159.     }
  160.     if {[lindex [split $t "/"] 1] == "RED"} {
  161.                 puts "link [expr [$l set id_] + 1] [expr [$l bw] / 8000] [expr [$l bw] / 8000] [$l delay] [$l qsize] RED [$q set thresh_] 0 [$q set maxthresh_] [expr 1.0 / [$q set linterm_] ]"
  162.     }
  163.         }
  164. puts ""
  165. puts "n $nconn_"
  166. for { set i 0 } { $i < $nconn_ } { incr i } {
  167. set len 0
  168. set str ""
  169. set list [split $conn_($i) ":"] 
  170. set srcid [lindex $list 0]
  171. set dstid [lindex $list 1]
  172. while { $srcid != $dstid } {
  173. incr len
  174. # shortened nexthop to nh, to fit add-route in
  175. # a single line
  176. set nh [$r lookup $srcid $dstid]
  177. # print the route 
  178. append str " " [expr [$link_($srcid:$nh) id] + 1] 
  179. set srcid  $nh
  180. }
  181. puts "route [expr $i + 1] $len $str"
  182. }
  183. }
  184. Simulator instproc dump-routelogic-nh {} {
  185. $self instvar routingTable_ Node_ link_
  186. if ![info exists routingTable_] {
  187.     puts "error: routing table is not computed yet!"
  188.     return 0
  189. }
  190. puts "Dumping Routing Table: Next Hop Information"
  191. set n [Node set nn_]
  192. set i 0
  193. puts -nonewline "t"
  194. while { $i < $n } {
  195.     if ![info exists Node_($i)] {
  196. incr i
  197. continue
  198.     }
  199.     puts -nonewline "$it"
  200.     incr i
  201. }
  202. set i 0
  203. while { $i < $n } {
  204. if ![info exists Node_($i)] {
  205.     incr i
  206.     continue
  207. }
  208. puts -nonewline "n$it"
  209. set n1 $Node_($i)
  210. set j 0
  211. while { $j < $n } {
  212. if { $i != $j } {
  213. # shortened nexthop to nh, to fit add-route in
  214. # a single line
  215. set nh [$routingTable_ lookup $i $j]
  216. if { $nh >= 0 } {
  217.     puts -nonewline "$nht"
  218. }
  219. } else {
  220. puts -nonewline "--t"
  221. }
  222. incr j
  223. }
  224. incr i
  225. }
  226. puts ""
  227. }
  228. Simulator instproc dump-routelogic-distance {} {
  229. $self instvar routingTable_ Node_ link_
  230. if ![info exists routingTable_] {
  231.     puts "error: routing table is not computed yet!"
  232.     return 0
  233. }
  234. # puts "Dumping Routing Table: Distance Information"
  235. set n [Node set nn_]
  236. set i 0
  237. puts -nonewline "t"
  238. while { $i < $n } {
  239.     if ![info exists Node_($i)] {
  240. incr i
  241. continue
  242.     }
  243.     puts -nonewline "$it"
  244.     incr i
  245. }
  246. for {set i 0} {$i < $n} {incr i} {
  247. if ![info exists Node_($i)] {
  248.     continue
  249. }
  250. puts -nonewline "n$it"
  251. set n1 $Node_($i)
  252. for {set j 0} {$j < $n} {incr j} {
  253. if { $i == $j } {
  254. puts -nonewline "0t"
  255. continue
  256. }
  257. set nh [$routingTable_ lookup $i $j]
  258. if { $nh < 0 } {
  259. puts -nonewline "0t"
  260. continue
  261. }
  262. set distance 0
  263. set tmpfrom $i
  264. set tmpto $j
  265. while {$tmpfrom != $tmpto} {
  266. set tmpnext [$routingTable_ lookup 
  267. $tmpfrom $tmpto]
  268. set distance [expr $distance + 
  269. [$link_($tmpfrom:$tmpnext) cost?]]
  270. set tmpfrom $tmpnext
  271. }
  272. puts -nonewline "$distancet"
  273. }
  274. }
  275. puts ""
  276. }
  277. # Only used by static routing protocols, namely: static and session.
  278. Simulator instproc compute-routes {} {
  279. #
  280. # call hierarchical routing, if applicable
  281. #
  282. if [Simulator hier-addr?] {
  283. $self compute-hier-routes 
  284. } else {
  285. $self compute-flat-routes
  286. }
  287. }
  288. Simulator instproc compute-flat-routes {} {
  289. $self instvar Node_ link_
  290. #
  291. # Compute all the routes using the route-logic helper object.
  292. #
  293.         if { [ Simulator set nix-routing] } {
  294.             puts "Using NixVector routing, skipping route computations"
  295.             return
  296.         }
  297. #puts "Starting to read link_ array..
  298. # time: [clock format [clock seconds] -format %X]"
  299. set r [$self get-routelogic]
  300. $self cmd get-routelogic $r  ;# propagate rl in C++
  301. foreach ln [array names link_] {
  302. set L [split $ln :]
  303. set srcID [lindex $L 0]
  304. set dstID [lindex $L 1]
  305. if { [$link_($ln) up?] == "up" } {
  306. $r insert $srcID $dstID [$link_($ln) cost?]
  307. } else {
  308. $r reset $srcID $dstID
  309. }
  310. }
  311. #puts "Completed reading link_ array.."
  312. #puts " and starting route-compute at 
  313. # time: [clock format [clock seconds] -format %X]"
  314. $r compute
  315. #puts "completed route-compute"
  316. #puts "and starting to populate classifiers at 
  317. # time: [clock format [clock seconds] -format %X]"
  318. set n [Node set nn_]
  319. # classifier-population part moved to C++: this results in > 50% 
  320.         # improvement of simulation run time.
  321. $self populate-flat-classifiers $n
  322. # Set up each classifer (aka node) to act as a router.
  323. # Point each classifer table to the link object that
  324. # in turns points to the right node.
  325. #
  326. #set i 0
  327. #set n [Node set nn_]
  328. #while { $i < $n } {
  329. # if ![info exists Node_($i)] {
  330. #     incr i
  331. #     continue
  332. # }
  333. # set n1 $Node_($i)
  334. # set j 0
  335. # while { $j < $n } {
  336. #     if { $i != $j } {
  337. # shortened nexthop to nh, to fit add-route in
  338. # a single line
  339. # set nh [$r lookup $i $j]
  340. # if { $nh >= 0 } {
  341. #     $n1 sp-add-route $j [$link_($i:$nh) head]
  342. # }
  343. #     } 
  344. #     incr j
  345. # }
  346. # incr i
  347. #}
  348. #puts "Completed populating classifiers at 
  349. # time: [clock format [clock seconds] -format %X]"
  350. }
  351. Simulator instproc get-link-head { n1 n2 } {
  352.     $self instvar link_
  353.     return [$link_($n1:$n2) head]
  354. }
  355. #
  356. # Hierarchical routing support
  357. #
  358. Simulator instproc hier-topo {rl} {
  359. #
  360. # if topo info not found, use default values
  361. #
  362. AddrParams instvar domain_num_ cluster_num_ nodes_num_ 
  363.     
  364. if ![info exists cluster_num_] {
  365. if {[AddrParams hlevel] > 1} {
  366. ### set default value of clusters/domain 
  367. set def [AddrParams set def_clusters]
  368. puts "Default value for cluster_num set to $defn"
  369. for {set i 0} {$i < $domain_num_} {incr i} {
  370. lappend clusters $def
  371. }
  372. } else {
  373. ### how did we reach here instead of flat routing?
  374. puts stderr "hierarchy level = 1; should use flat-rtg instead of hier-rtg" 
  375. exit 1
  376. }
  377. AddrParams set cluster_num_ $clusters
  378. }
  379. ### set default value of nodes/cluster
  380. if ![info exists nodes_num_ ] {
  381. set total_node 0
  382. set def [AddrParams set def_nodes]
  383. puts "Default value for nodes_num set to $defn"
  384. for {set i 0} {$i < $domain_num_} {incr i} {
  385. set total_node [expr $total_node + 
  386. [lindex $clusters $i]]
  387. }
  388. for {set i 0} {$i < $total_node} {incr i} {
  389. lappend nodes $def
  390. }
  391. AddrParams set nodes_num_ $nodes
  392. }
  393. # Eval is necessary because these *_num_ are usually lists; eval 
  394. # will break them into individual arguments
  395. eval $rl send-num-of-domains $domain_num_
  396. eval $rl send-num-of-clusters $cluster_num_
  397. eval $rl send-num-of-nodes $nodes_num_
  398. }
  399. Simulator instproc compute-hier-routes {} {
  400. $self instvar Node_ link_
  401. set r [$self get-routelogic]
  402.         $self cmd get-routelogic $r ;# propagate rl in C++    
  403. # send hierarchical data :
  404. # array of cluster size, #clusters, #domains
  405. # assuming 3 levels of hierarchy --> this should be extended to support
  406. # n-levels of hierarchy
  407. #
  408.         if ![info exists link_] {
  409. return
  410. }
  411.         set level [AddrParams hlevel]
  412.         $r hlevel-is $level
  413. $self hier-topo $r
  414. foreach ln [array names link_] {
  415. set L [split $ln :]
  416.         set srcID [[$self get-node-by-id [lindex $L 0]] node-addr]
  417. set dstID [[$self get-node-by-id [lindex $L 1]] node-addr]
  418. if { [$link_($ln) up?] == "up" } {
  419. $r hier-insert $srcID $dstID [$link_($ln) cost?]
  420. } else {
  421. $r hier-reset $srcID $dstID
  422. }
  423. }
  424. $r hier-compute
  425. # Set up each classifier (n for n levels of hierarchy) 
  426. # for every node
  427. # classifier-population part moved to C++: this results in > 50% 
  428.         # improvement of simulation run time. -Padma, 02/01.
  429. set n [Node set nn_]
  430. $self populate-hier-classifiers $n
  431. #$self gen-map
  432. # for {set i 0} {$i < $n} {incr i} {
  433. # if ![info exists Node_($i)] {
  434. # continue
  435. # }
  436. # set n1 $Node_($i)
  437. # set addr [$n1 node-addr]
  438. # set L [AddrParams split-addrstr $addr]
  439. #
  440. # for each hierarchy level, populate classifier for that level
  441. #
  442. # for {set k 0} {$k < $level} {incr k} {
  443. # set csize [AddrParams elements-in-level? $addr $k]
  444. #
  445. # for each element in that level (elements maybe 
  446. # nodes or clusters or domains 
  447. #
  448. # if {$k > 0} {
  449. # set prefix [$r append-addr $k $L]
  450. # }
  451. # for {set m 0} {$m < $csize} {incr m} {
  452. # if { $m == [lindex $L $k]} {
  453. # continue
  454. # }
  455. # if {$k > 0} {
  456. # set str $prefix
  457. # append str . $m
  458. # } else {
  459. # set str $m
  460. # }
  461. # set nh [$r hier-lookup $addr $str]
  462. # add entry in clasifier only if hier-lookup 
  463. # returns a value. 
  464. # if {$nh == -1} { 
  465. # continue
  466. # }
  467. # set node [$self get-node-id-by-addr $nh]
  468. # if { $node >= 0 } {
  469. # $n1 sp-add-route $str 
  470. # [$link_($i:$node) head]
  471. # }
  472. # }
  473. # }
  474. # }
  475. #}
  476. }
  477. #
  478. # Now source the dynamic routing protocol methods
  479. #
  480. source ../rtglib/route-proto.tcl
  481. source ../rtglib/dynamics.tcl
  482. source ../rtglib/algo-route-proto.tcl
  483. Simulator instproc compute-algo-routes {} {
  484. $self instvar Node_ link_
  485. #
  486. # Compute all the routes using the route-logic helper object.
  487. #
  488. set r [$self get-routelogic]
  489. $r BFS
  490. $r compute
  491. #
  492. # Set up each classifer (aka node) to act as a router.
  493. # Point each classifer table to the link object that
  494. # in turns points to the right node.
  495. #
  496. set i 0
  497. set n [Node set nn_]
  498. while { $i < $n } {
  499. if ![info exists Node_($i)] {
  500.     incr i
  501.     continue
  502. }
  503. set n1 $Node_($i)
  504. $n1 set rtsize_ 1 
  505. set j 0
  506. while { $j < $n } {
  507.     if { $i != $j } {
  508. # shortened nexthop to nh, to fit add-route in
  509. # a single line
  510. set nh [$r lookup $i $j]
  511. # puts "$i $j $nh"
  512. if { $nh >= 0 } {
  513.     $n1 add-route $j [$link_($i:$nh) head]
  514.     ###$n1 incr-rtgtable-size
  515. }
  516.     } 
  517.     incr j
  518. }
  519. incr i
  520. }
  521. }
  522. # Asim routines 
  523. # Debojyoti Dutta
  524. Simulator instproc asim-run { } {
  525.     $self instvar asim_
  526.     set asim_ [new Asim]
  527.     $self asim-dump ddt
  528.     $asim_ readinput ddt
  529.     $asim_ run
  530. }
  531. Simulator instproc asim-dump { file } {
  532. $self instvar routingTable_ Node_ link_
  533.         $self instvar nconn_ conn_ sflows_ nsflows_
  534.         
  535.         set tf_ [open "$file" w]
  536.     
  537. set r [$self get-routelogic]
  538. $self cmd get-routelogic $r  ;# propagate rl in C++
  539. # populate the route logic 
  540. foreach ln [array names link_] {
  541. set L [split $ln :]
  542. set srcID [lindex $L 0]
  543. set dstID [lindex $L 1]
  544. if { [$link_($ln) up?] == "up" } {
  545. $r insert $srcID $dstID [$link_($ln) cost?]
  546. } else {
  547. $r reset $srcID $dstID
  548. }
  549. }
  550. # now compute routes
  551. $r compute
  552. puts $tf_ "# Dumping Approx-Sim Data"  
  553. set n [Node set nn_]
  554. puts $tf_ "m [Link set nl_] "
  555.         foreach qn [array names link_] {
  556.                 set l $link_($qn)
  557.         set q [$l queue]
  558.         set t [$q info class]
  559.     if {[lindex [split $t "/"] 1] == "DropTail"} {
  560.                 puts $tf_ "link [expr [$l set id_] + 1] [$l delay] [expr [$l bw] / 8000] [expr [$l bw] / 8000]  [$l qsize] $t"
  561.     }
  562.     if {[lindex [split $t "/"] 1] == "RED"} {
  563.                 puts $tf_ "link [expr [$l set id_] + 1] [$l delay] [expr [$l bw] / 8000] [expr [$l bw] / 8000] [$l qsize] red [$q set thresh_] 0 [$q set maxthresh_] [expr 1.0 / [$q set linterm_] ]"
  564.     }
  565.         }
  566. puts $tf_ ""
  567. puts $tf_ "n [expr $nconn_ + $nsflows_]"
  568. set i 0
  569. foreach x $conn_ {
  570. set len 0
  571. set str ""
  572. set list [split $x ":"] 
  573. set srcid [lindex $list 0]
  574. set dstid [lindex $list 1]
  575. while { $srcid != $dstid } {
  576. incr len
  577. # shortened nexthop to nh, to fit add-route in
  578. # a single line
  579. set nh [$r lookup $srcid $dstid]
  580. # print the route 
  581. append str " " [expr [$link_($srcid:$nh) id] + 1] 
  582. set srcid  $nh
  583. }
  584. puts $tf_ "route [expr $i + 1] $len $str"
  585. incr i
  586. }
  587. foreach x $sflows_ {
  588. set len 0
  589. set str ""
  590. set list [split $x ":"] 
  591. set srcid [lindex $list 0]
  592. set dstid [lindex $list 1]
  593.         set lambda [lindex $list 2]
  594.         set mu [lindex $list 3]
  595. while { $srcid != $dstid } {
  596. incr len
  597. # shortened nexthop to nh, to fit add-route in
  598. # a single line
  599. set nh [$r lookup $srcid $dstid]
  600. # print the route 
  601. append str " " [expr [$link_($srcid:$nh) id] + 1] 
  602. set srcid  $nh
  603. }
  604. puts $tf_ "route [expr $i + 1] $len $str sh $lambda $mu"
  605. incr i
  606. }
  607. close $tf_
  608. }
  609. Simulator instproc asim-getLinkDelay { link } {
  610.     $self instvar asim_
  611.     set t [$asim_ get-link-delay [$link set id_] ]
  612.     return $t
  613. }
  614. Simulator instproc asim-getLinkDrop { link } {
  615.     $self instvar asim_
  616.     set t [$asim_ get-link-drop [$link set id_] ]
  617.     return $t
  618. }
  619. Simulator instproc asim-getLinkTput { link } {
  620.     $self instvar asim_
  621.     set t [$asim_ get-link-tput [$link set id_] ]
  622.     return $t
  623. }
  624. Simulator instproc asim-getAggrTput { srcnode dstnode } {
  625.     $self instvar conn_
  626.     $self instvar asim_ 
  627.     set src [$srcnode id]
  628.     set dst [$dstnode id]
  629. #    puts "searching $src:$dst in $conn_"
  630.     set tt [lsearch -exact $conn_ $src:$dst]
  631.     set t [$asim_ get-flow-tput $tt ]
  632.     return $t
  633. }
  634. Simulator instproc asim-getFlowTput { agent } {
  635.     $self instvar conn_
  636.     $self instvar asim_
  637.     set srcnode [$self get-node-by-addr [$agent set agent_addr_]]
  638.     set dstnode [$self get-node-by-addr [$agent set dst_addr_]]
  639.     set src [$srcnode id]
  640.     set dst [$dstnode id]
  641.     set sport [$agent set agent_port_]
  642.     set dport [$agent set dst_port_]
  643. #    puts "searching $src:$dst in $conn_"
  644.     set tt [lsearch -exact $conn_ $src:$dst:$sport:$dport]
  645.     set t [$asim_ get-flow-tput $tt ]
  646.     return $t
  647. }
  648. Simulator instproc asim-getFlowDrop { agent } {
  649.     $self instvar conn_
  650.     $self instvar asim_
  651.     set srcnode [$self get-node-by-addr [$agent set agent_addr_]]
  652.     set dstnode [$self get-node-by-addr [$agent set dst_addr_]]
  653.     set src [$srcnode id]
  654.     set dst [$dstnode id]
  655.     set sport [$agent set agent_port_]
  656.     set dport [$agent set dst_port_]
  657. #    puts "searching $src:$dst in $conn_"
  658.     set tt [lsearch -exact $conn_ $src:$dst:$sport:$dport]
  659.     set t [$asim_ get-flow-drop $tt ]
  660.     return $t
  661. }