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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1999 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 MASH Research
  16. #       Group at the University of California Berkeley.
  17. # 4. Neither the name of the University nor of the Research Group may be
  18. #    used 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. # Contributed by Tom Henderson, UCB Daedalus Research Group, June 1999
  34. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/lib/ns-sat.tcl,v 1.13 2002/07/10 02:29:50 tomh Exp $
  35. # ======================================================================
  36. #
  37. # The Node/SatNode class (a pure virtual class)
  38. #
  39. # ======================================================================
  40. Node/SatNode instproc init args {
  41. eval $self next $args ;# parent class constructor
  42. $self instvar nifs_ 
  43. $self instvar phy_tx_ phy_rx_ mac_ ifq_ ll_ pos_ hm_ id_
  44. set nifs_ 0 ;# number of network interfaces
  45. # Create a drop trace to log packets for which no route exists
  46. set ns_ [Simulator instance]
  47. set trace_ [$ns_ get-ns-traceall]
  48. if {$trace_ != ""} {
  49. set dropT_ [$ns_ create-trace Sat/Drop $trace_ $self $self ""]
  50. $self set_trace $dropT_
  51. }
  52. $self cmd set_address $id_ ; # Used to indicate satellite node in array
  53. }
  54. Node/SatNode instproc reset {} {
  55.         eval $self next 
  56. $self instvar hm_ instvar nifs_ phy_tx_ phy_rx_ mac_ ifq_ ll_
  57. set ns [Simulator instance]
  58. set now_ [$ns now]
  59.         for {set i 0} {$i < $nifs_} {incr i} {
  60. $phy_tx_($i) reset
  61. $phy_rx_($i) reset
  62. if {[info exists mac_($i)]} {
  63. $mac_($i) reset
  64. }
  65. if {[info exists ll_($i)]} {
  66. $ll_($i) reset
  67. }
  68. if {[info exists ifq_($i)]} {
  69. $ifq_($i) reset
  70. }
  71. }
  72. if {$now_ == 0} {
  73. if {[info exists hm_]} {
  74. $ns at 0.0 "$self start_handoff"
  75. }
  76. }
  77. }
  78. Node/SatNode instproc set_next {node_} {
  79. $self instvar pos_
  80. $pos_ set_next [$node_ set pos_]
  81. }
  82. #
  83. # Attach an agent to a node.  Pick a port and
  84. # bind the agent to the port number.
  85. # if portnumber is 255, default target is set to the routing agent
  86. #
  87. Node/SatNode instproc add-target {agent port } {
  88. $self instvar dmux_ 
  89. if { $port == [Node set rtagent_port_] } {
  90. # Set the default target at C++ level.  
  91. [$self set classifier_] defaulttarget $agent
  92. $dmux_ install $port $agent
  93. } else {
  94. #
  95. # Send Target
  96. #
  97. $agent target [$self entry]
  98. #
  99. # Recv Target
  100. #
  101. $dmux_ install $port $agent
  102. }
  103. }
  104. # ======================================================================
  105. #
  106. # methods for creating SatNodes
  107. #
  108. # ======================================================================
  109. Simulator instproc create-satnode {} {
  110. $self instvar satNodeType_ llType_ ifqType_ ifqlen_ macType_ 
  111. downlinkBW_ phyType_ channelType_
  112. if {![info exists satNodeType_]} {
  113. puts "Error: create-satnode called, but no satNodeType_; exiting"
  114. exit 1
  115. }
  116. # Case conversion (for backward compatibility)
  117. if {$satNodeType_ == "Polar"} {set satNodeType_ "polar"}
  118. if {$satNodeType_ == "Geo"} {set satNodeType_ "geo"}
  119. if {$satNodeType_ == "Terminal"} {set satNodeType_ "terminal"}
  120. if {$satNodeType_ == "Geo-repeater"} {set satNodeType_ "geo-repeater"}
  121. if {[lsearch {polar geo terminal geo-repeater} $satNodeType_] < 0} {
  122. puts "Error: undefined satNodeType: $satNodeType_; exiting"
  123. exit 1
  124. }
  125. # Create the satnode
  126. set tmp [$self newsatnode]
  127. # Add uplink and downlink if this is not a terminal
  128. if {$satNodeType_ == "polar" || $satNodeType_ == "geo"} {
  129. set linkargs "$llType_ $ifqType_ $ifqlen_ $macType_ 
  130.     $downlinkBW_ $phyType_"
  131. $self add-first-links $tmp gsl $linkargs $channelType_
  132. } elseif {$satNodeType_ == "geo-repeater"} {
  133. $self add-first-links $tmp gsl-repeater "" $channelType_
  134. }
  135. return $tmp
  136. }
  137. Simulator instproc newsatnode {} {
  138. $self instvar Node_ satNodeType_
  139. if ![info exists satNodeType_] {
  140. puts "Error: satNodeType_ does not exist in newsatnode; exiting"
  141. exit 1
  142. }
  143. set node [new Node/SatNode]
  144. # Create a routing agent for all types except the repeater node
  145. if {$satNodeType_ == "polar" || $satNodeType_ == "geo" || 
  146.     $satNodeType_ == "terminal"} {
  147. $node create-ragent
  148. }
  149. set Node_([$node id]) $node
  150. $node set ns_ $self
  151. if [$self multicast?] {
  152. $node enable-mcast $self
  153. }
  154. $self check-node-num
  155. return $node
  156. }
  157. Node/SatNode instproc set-position args {
  158. set ns_ [Simulator instance]
  159. set nodetype_ [$ns_ set satNodeType_]
  160. if {$nodetype_ == "polar"} {
  161. if {[llength $args] != 5 } {
  162. puts "Error:  satNodeType_ is polar, but number
  163.       of position arguments incorrect: $args; exiting"
  164. exit 1
  165. }
  166. $self set pos_ [new Position/Sat/Polar $args]
  167. $self cmd set_position [$self set pos_]
  168. [$self set pos_] setnode $self
  169. # Set up handoff manager
  170. $self set hm_ [new HandoffManager/Sat]
  171. $self cmd set_handoff_mgr [$self set hm_]
  172. [$self set hm_] setnode $self
  173. } elseif {$nodetype_ == "geo" || $nodetype_ == "geo-repeater"} {
  174. if {[llength $args] != 1 } {
  175. puts "Error:  satNodeType_ is geo, but number
  176.       of position arguments incorrect: $args; exiting"
  177. exit 1
  178. }
  179. $self set pos_ [new Position/Sat/Geo $args]
  180. $self cmd set_position [$self set pos_]
  181. [$self set pos_] setnode $self
  182. } elseif {$nodetype_ == "terminal"} {
  183. if {[llength $args] != 2 } {
  184. puts "Error:  satNodeType_ is terminal, but number
  185.               of position arguments incorrect: $args; exiting"
  186. exit 1
  187. }
  188. $self set pos_ [new Position/Sat/Term $args]
  189. $self cmd set_position [$self set pos_]
  190. [$self set pos_] setnode $self
  191. $self set hm_ [new HandoffManager/Term]
  192. $self cmd set_handoff_mgr [$self set hm_]
  193. [$self set hm_] setnode $self
  194. } else {
  195. puts "Error:  satNodeType_ not set appropriately:
  196.      $satNodeType_ exiting"
  197. exit 1
  198. }
  199. }
  200. ## Backward compatibility code starts
  201. # Wrapper method for making a polar satellite node that first creates a 
  202. # satnode plus two link interfaces (uplink and downlink) plus two 
  203. # satellite channels (uplink and downlink)
  204. # Additional ISLs can be added later
  205. Simulator instproc satnode-polar {alt inc lon alpha plane linkargs chan} {
  206.         set tmp [$self satnode polar $alt $inc $lon $alpha $plane]
  207. $self add-first-links $tmp gsl $linkargs $chan
  208.         return $tmp
  209. }
  210. # Wrapper method for making a geo satellite node that first creates a 
  211. # satnode plus two link interfaces (uplink and downlink) plus two 
  212. # satellite channels (uplink and downlink)
  213. Simulator instproc satnode-geo {lon linkargs chan} {
  214.         set tmp [$self satnode geo $lon]
  215. $self add-first-links $tmp gsl $linkargs $chan
  216. return $tmp
  217. }
  218. # Wrapper method for making a geo satellite repeater node that first creates a 
  219. # satnode plus two link interfaces (uplink and downlink) plus two 
  220. # satellite channels (uplink and downlink)
  221. Simulator instproc satnode-geo-repeater {lon chan} {
  222.         set tmp [$self satnode geo $lon]
  223. $self add-first-links $tmp gsl-repeater "" $chan
  224. return $tmp
  225. }
  226. # Wrapper method that does nothing really but makes the API consistent 
  227. Simulator instproc satnode-terminal {lat lon} {
  228. $self satnode terminal $lat $lon
  229. }
  230. Simulator instproc satnode args {
  231. $self instvar Node_
  232. set node [new Node/SatNode]
  233. if {[lindex $args 0] == "polar" || [lindex $args 0] == "Polar"} {
  234. set args [lreplace $args 0 0]
  235. # Set up position object
  236. $node set pos_ [new Position/Sat/Polar $args]
  237. $node cmd set_position [$node set pos_]
  238. [$node set pos_] setnode $node
  239. # Set up handoff manager
  240. $node set hm_ [new HandoffManager/Sat]
  241. $node cmd set_handoff_mgr [$node set hm_]
  242. [$node set hm_] setnode $node
  243. $node create-ragent 
  244. } elseif {[lindex $args 0] == "geo" || [lindex $args 0] == "Geo"} {  
  245. set args [lreplace $args 0 0]
  246. $node set pos_ [new Position/Sat/Geo $args]
  247. $node cmd set_position [$node set pos_]
  248. [$node set pos_] setnode $node
  249. $node create-ragent
  250. } elseif {[lindex $args 0] == "geo-repeater" || [lindex $args 0] == "Geo-repeater"} {  
  251. set args [lreplace $args 0 0]
  252. $node set pos_ [new Position/Sat/Geo $args]
  253. $node cmd set_position [$node set pos_]
  254. [$node set pos_] setnode $node
  255. } elseif {[lindex $args 0] == "terminal" || [lindex $args 0] == "Terminal"} {  
  256. set args [lreplace $args 0 0]
  257. $node set pos_ [new Position/Sat/Term $args]
  258. $node cmd set_position [$node set pos_]
  259. [$node set pos_] setnode $node
  260. $node set hm_ [new HandoffManager/Term]
  261. $node cmd set_handoff_mgr [$node set hm_]
  262. [$node set hm_] setnode $node
  263. $node create-ragent
  264. } else {
  265. puts "Otcl error; satnode specified incorrectly: $args"
  266. }
  267. set Node_([$node id]) $node
  268. $node set ns_ $self
  269.         if [$self multicast?] {
  270.                 $node enable-mcast $self
  271.         }
  272. $self check-node-num
  273. return $node
  274. }
  275. ## Backward compatibility code ends 
  276. # ======================================================================
  277. #
  278. # methods for creating satellite links, channels, and error models
  279. #
  280. # ======================================================================
  281. # Helper method for creating uplinks and downlinks for a satellite node
  282. Simulator instproc add-first-links {node_ linktype linkargs chan} {
  283. $node_ set_downlink $chan
  284.         $node_ set_uplink $chan
  285.         # Add the interface for these channels and then attach the channels
  286. if {$linktype == "gsl-repeater"} {
  287. $node_ add-repeater $chan
  288. } else {
  289.          eval $node_ add-interface $linktype $linkargs
  290. }
  291.         $node_ attach-to-outlink [$node_ set downlink_]
  292.         $node_ attach-to-inlink [$node_ set uplink_]
  293. }
  294. #  Add network stack and attach to the channels 
  295. Node/SatNode instproc add-gsl {ltype opt_ll opt_ifq opt_qlim opt_mac 
  296. opt_bw opt_phy opt_inlink opt_outlink} {
  297. $self add-interface $ltype $opt_ll $opt_ifq $opt_qlim $opt_mac $opt_bw 
  298. $opt_phy 
  299. $self attach-to-inlink $opt_inlink
  300. $self attach-to-outlink $opt_outlink
  301. }
  302. # Add network stacks for ISLs, and create channels for them
  303. Simulator instproc add-isl {ltype node1 node2 bw qtype qlim} {
  304. set opt_ll LL/Sat
  305. set opt_mac Mac/Sat
  306. set opt_phy Phy/Sat
  307. set opt_chan Channel/Sat
  308. set chan1 [new $opt_chan]
  309. set chan2 [new $opt_chan]
  310. $node1 add-interface $ltype $opt_ll $qtype $qlim $opt_mac $bw $opt_phy $chan1 $chan2
  311. $node2 add-interface $ltype $opt_ll $qtype $qlim $opt_mac $bw $opt_phy $chan2 $chan1
  312. if {$ltype == "crossseam"} {
  313. # Add another spare interface between node 1 and node 2
  314. $node1 add-interface $ltype $opt_ll $qtype $qlim $opt_mac $bw $opt_phy 
  315. $node2 add-interface $ltype $opt_ll $qtype $qlim $opt_mac $bw $opt_phy 
  316. }
  317. }
  318. Node/SatNode instproc add-repeater chan { 
  319. $self instvar nifs_ phy_tx_ phy_rx_ linkhead_ 
  320. set t $nifs_
  321. incr nifs_
  322. # linkhead_($t) is a simple connector that provides an API for
  323. # accessing elements of the network interface stack
  324. set linkhead_($t) [new Connector/LinkHead/Sat]
  325. set phy_tx_($t) [new Phy/Repeater] ;# interface
  326. set phy_rx_($t) [new Phy/Repeater]
  327. # linkhead maintains a collection of pointers
  328. $linkhead_($t) setnode $self
  329. $linkhead_($t) setphytx $phy_tx_($t)
  330. $linkhead_($t) setphyrx $phy_rx_($t)
  331. $linkhead_($t) set_type "gsl-repeater"
  332. $linkhead_($t) set type_ "gsl-repeater"
  333. $phy_rx_($t) up-target $phy_tx_($t)
  334. $phy_tx_($t) linkhead $linkhead_($t)
  335. $phy_rx_($t) linkhead $linkhead_($t)
  336. $phy_tx_($t) node $self ;# Bind node <---> interface
  337. $phy_rx_($t) node $self ;# Bind node <---> interface
  338. }
  339. #
  340. #  The following sets up link layer, mac layer, interface queue 
  341. #  and physical layer structures for the satellite nodes.
  342. #  Propagation model is an optional argument
  343. #
  344. Node/SatNode instproc add-interface args { 
  345. $self instvar nifs_ phy_tx_ phy_rx_ mac_ ifq_ ll_ drophead_ linkhead_
  346. global ns_ MacTrace opt
  347. set t $nifs_
  348. incr nifs_
  349. # linkhead_($t) is a simple connector that provides an API for
  350. # accessing elements of the network interface stack
  351. set linkhead_($t) [new Connector/LinkHead/Sat]
  352. set linktype  [lindex $args 0]
  353. set ll_($t) [new [lindex $args 1]] ;# link layer
  354. set ifq_($t) [new [lindex $args 2]] ;# interface queue
  355. set qlen [lindex $args 3]
  356. set mac_($t) [new [lindex $args 4]] ;# mac layer
  357. set mac_bw [lindex $args 5]
  358. set phy_tx_($t) [new [lindex $args 6]] ;# interface
  359. set phy_rx_($t) [new [lindex $args 6]] ;# interface
  360. set inchan  [lindex $args 7]
  361. set outchan  [lindex $args 8]
  362. set drophead_($t) [new Connector] ;# drop target for queue
  363. set iif_($t) [new NetworkInterface]
  364. #
  365. # Local Variables
  366. #
  367. #set nullAgent_ [$ns_ set nullAgent_]
  368. set linkhead $linkhead_($t)
  369. set phy_tx $phy_tx_($t)
  370. set phy_rx $phy_rx_($t)
  371. set mac $mac_($t)
  372. set ifq $ifq_($t)
  373. set ll $ll_($t)
  374. set drophead $drophead_($t)
  375. set iif $iif_($t)
  376. # linkhead maintains a collection of pointers
  377. $linkhead setnode $self
  378. $linkhead setll $ll
  379. $linkhead setmac $mac
  380. $linkhead setqueue $ifq
  381. $linkhead setphytx $phy_tx
  382. $linkhead setphyrx $phy_rx
  383. $linkhead setnetinf $iif
  384. $self addlinkhead $linkhead; # Add NetworkInterface to node's list
  385. $linkhead target $ll; 
  386. $linkhead set_type $linktype
  387. $linkhead set type_ $linktype
  388. # NetworkInterface
  389. #
  390. $iif target [$self entry]
  391. #
  392. # Link Layer
  393. #
  394. $ll mac $mac; # XXX is this needed?
  395. $ll up-target $iif
  396. $ll down-target $ifq
  397. $ll set delay_ 0ms; # processing delay between ll and ifq
  398. $ll setnode $self
  399. #
  400. # Interface Queue
  401. #
  402. $ifq target $mac
  403. $ifq set limit_ $qlen
  404.         $drophead target [[Simulator instance] set nullAgent_]
  405.         $ifq drop-target $drophead
  406. #
  407. # Mac Layer
  408. #
  409. $mac netif $phy_tx; # Not used by satellite code at this time
  410. $mac up-target $ll
  411. $mac down-target $phy_tx
  412. $mac set bandwidth_ $mac_bw; 
  413. #$mac nodes $opt(nn)
  414. #
  415. # Physical Layer
  416. #
  417. $phy_rx up-target $mac
  418. $phy_tx linkhead $linkhead
  419. $phy_rx linkhead $linkhead
  420. $phy_tx node $self ;# Bind node <---> interface
  421. $phy_rx node $self ;# Bind node <---> interface
  422. # If we have a channel to attach this link to (for an point-to-point
  423. # ISL), do so here
  424. if {$outchan != "" && $inchan != ""} {
  425. $phy_tx channel $outchan
  426. $phy_rx channel $inchan
  427. # Add to list of Phys receiving on the channel
  428. $inchan addif $phy_rx
  429. }
  430. return $t
  431. }
  432. Node/SatNode instproc set_uplink {chan} {
  433. $self instvar uplink_
  434. set uplink_ [new $chan]
  435. $self cmd set_uplink $uplink_
  436. }
  437. Node/SatNode instproc set_downlink {chan} {
  438. $self instvar downlink_
  439. set downlink_ [new $chan]
  440. $self cmd set_downlink $downlink_
  441. }
  442. #  Attaches channel to the phy indexed by "index" (by default, the first one)
  443. Node/SatNode instproc attach-to-outlink {chan {index 0} } {
  444. $self instvar phy_tx_ mac_
  445. $phy_tx_($index) channel $chan
  446. #$mac_($index) channel $chan; # For mac addr resolution (rather than ARP)
  447. }
  448. #  Attaches channel to the phy indexed by "index" (by default, the first one)
  449. Node/SatNode instproc attach-to-inlink { chan {index 0}} {
  450. $self instvar phy_rx_ 
  451. $phy_rx_($index) channel $chan
  452. $chan addif $phy_rx_($index)
  453. }
  454. #  Attaches error model to interface "index" (by default, the first one)
  455. Node/SatNode instproc interface-errormodel { em { index 0 } } {
  456. $self instvar mac_ ll_ em_ linkhead_
  457. $mac_($index) up-target $em
  458. $em target $ll_($index)
  459. $em drop-target [new Agent/Null]; # otherwise, packet is only marked
  460. set em_($index) $em
  461. $linkhead_($index) seterrmodel $em
  462. # ======================================================================
  463. #
  464. # methods to add tracing support to Mac/Sat
  465. #
  466. # ======================================================================
  467. Mac/Sat instproc init args {
  468. eval $self next $args           ;# parent class constructor
  469. set ns_ [Simulator instance]
  470. set trace_ [$ns_ get-ns-traceall]
  471. if {$trace_ != ""} {
  472. set dropT_ [$ns_ create-trace Sat/Drop $trace_ $self $self ""]
  473. $self set_drop_trace $dropT_
  474. set collT_ [$ns_ create-trace Sat/Collision $trace_ $self $self ""]
  475. $self set_coll_trace $collT_
  476. }
  477. }
  478. # ======================================================================
  479. #
  480. # methods for routing 
  481. #
  482. # ======================================================================
  483. # Create a network interface (for one uplink and downlink), add routing agent
  484. # At least one interface must be created before routing agent is added
  485. Node/SatNode instproc create-ragent {} {
  486. set ragent [new Agent/SatRoute]
  487.         $self attach $ragent 255; # attaches to default target of classifier  
  488.         $ragent set myaddr_ [$self set id_]
  489. $self set_ragent $ragent; # sets pointer at C++ level
  490. $ragent set_node $self; # sets back pointer in ragent to node
  491. }
  492. # When running all routing in C++, we want a dummy OTcl routing
  493. #
  494. Class Agent/rtProto/Dummy -superclass Agent/rtProto
  495. Agent/rtProto/Dummy proc init-all args {
  496. # Nothing
  497. }
  498. # ======================================================================
  499. #
  500. # methods for wired/wireless integration
  501. #
  502. # ======================================================================
  503. # For wired routing to work, the following are needed:
  504. # - the link_(src:dst) array must point to the LinkHead at the top of the link
  505. # - the call "link_(src:dst) up?" must return "up"
  506. # - the call "link_(src:dst) cost?" must return the current cost
  507. # However, in wireless case, the same linkhead may be used to connect to
  508. # multiple destinations on the channel.  Therefore, a new data structure
  509. # is needed that can perform the above functions
  510. Class Connector/RoutingHelper -superclass Connector
  511. Simulator instproc sat_link_up {src dst cost handle queue_handle} {
  512. $self instvar link_
  513. global slink_
  514. set slink_($src:$dst) $self; # what is this?
  515. if {![info exists link_($src:$dst)]} {
  516. set link_($src:$dst) [new Connector/RoutingHelper]
  517. }
  518. if {[$link_($src:$dst) info class] == "Connector/RoutingHelper"} {
  519. $link_($src:$dst) set cost_ $cost
  520. $link_($src:$dst) set up_ "up"
  521. $link_($src:$dst) set queue_ $queue_handle
  522. $link_($src:$dst) target $handle
  523. $link_($src:$dst) set head_ $handle
  524. } else {
  525. puts -nonewline "link_(${src}:${dst}) have non-connector "
  526. puts "[$link_($src:$dst) info class]"
  527. exit 1
  528. }
  529. }
  530. # Upcall to enable wired routing
  531. # Normally, in satellite routing we insert directly to adjacency table 
  532. # in C++, but we upcall here to allow the OTcl link_ array to be populated
  533. Simulator instproc sat_link_destroy {src dst} {
  534. $self instvar link_
  535. global slink_
  536. if {[info exists slink_($src:$dst)]} {
  537. unset slink_($src:$dst)
  538. }
  539. if {[info exists link_($src:$dst)]} {
  540. delete $link_($src:$dst)
  541. unset link_($src:$dst)
  542. } else {
  543. # This warning pops up when running sat-teledesic.tcl script,
  544. # which uses crossseam ISLs (not yet debugged)
  545. puts -nonewline "Warning: trying to delete a link_ "
  546. puts "link_(${src}:${dst}) that doesn't exist at [$self now]"
  547. }
  548. }
  549. Connector/RoutingHelper instproc up? {} {
  550. $self instvar up_
  551. return $up_
  552. }
  553. Connector/RoutingHelper instproc queue {} {
  554. $self instvar queue_
  555. return $queue_
  556. }
  557. Connector/RoutingHelper instproc head {} {
  558. $self instvar head_
  559. return $head_
  560. }
  561. Connector/RoutingHelper instproc cost? {} {
  562. $self instvar cost_
  563. return $cost_
  564. }                                                     
  565. # XXX this is because we can't support all of these nam calls
  566. Connector/RoutingHelper instproc dump-nam-queueconfig {} { return 0}
  567. # ======================================================================
  568. #
  569. # methods for tracing
  570. #
  571. # ======================================================================
  572. Simulator instproc trace-all-satlinks {f} {
  573. $self instvar Node_
  574. foreach nn [array names Node_] {
  575. if {![$Node_($nn) info class Node/SatNode]} {
  576. continue; # Not a SatNode
  577. }
  578. $Node_($nn) trace-all-satlinks $f
  579. }
  580. }
  581. # All satlinks should have an interface indexed by nifs_
  582. Node/SatNode instproc trace-all-satlinks {f} {
  583. $self instvar nifs_ enqT_ rcvT_ linkhead_
  584. for {set i 0} {$i < $nifs_} {incr i} {
  585. if {[$linkhead_($i) set type_] == "gsl-repeater"} {
  586. continue;
  587. }
  588. if {[info exists enqT_($i)]} {
  589. puts "Tracing already exists on node [$self id]"
  590. } else {
  591. $self trace-outlink-queue $f $i
  592. }
  593. if {[info exists rcvT_($i)]} {
  594. puts "Tracing already exists on node [$self id]"
  595. } else {
  596. $self trace-inlink-queue $f $i
  597. }
  598. }
  599. }
  600. # Set up trace objects around first output queue for packets destined to node
  601. Node/SatNode instproc trace-outlink-queue {f {index_ 0} } {
  602. $self instvar id_ enqT_ deqT_ drpT_ mac_ ll_ ifq_ drophead_ 
  603. set ns [Simulator instance]
  604. set fromNode_ $id_
  605. set toNode_ -1
  606. set enqT_($index_) [$ns create-trace Sat/Enque $f $fromNode_ $toNode_]
  607. $enqT_($index_) target $ifq_($index_)
  608. $ll_($index_) down-target $enqT_($index_)
  609. set deqT_($index_) [$ns create-trace Sat/Deque $f $fromNode_ $toNode_]
  610. $deqT_($index_) target $mac_($index_)
  611. $ifq_($index_) target $deqT_($index_)
  612. set drpT_($index_) [$ns create-trace Sat/Drop $f $fromNode_ $toNode_]
  613. $drpT_($index_) target [$drophead_($index_) target]
  614. $drophead_($index_) target $drpT_($index_)
  615. $ifq_($index_) drop-target $drpT_($index_)
  616. }
  617. # Trace element between mac and ll tracing packets between node and node
  618. Node/SatNode instproc trace-inlink-queue {f {index_ 0} } {
  619. $self instvar id_ rcvT_ mac_ ll_ phy_rx_ em_ errT_    
  620. set ns [Simulator instance]
  621. set toNode_ $id_
  622. set fromNode_ -1
  623. if {[info exists em_($index_)]} {
  624. # if error model, then chain mac -> em -> rcvT -> ll
  625. # First, set up an error trace on the ErrorModule
  626. set errT_($index_) [$ns create-trace Sat/Error $f $fromNode_ $toNode_]
  627. $errT_($index_) target [$em_($index_) drop-target]
  628. $em_($index_) drop-target $errT_($index_)
  629. set rcvT_($index_) [$ns create-trace Sat/Recv $f $fromNode_ $toNode_]
  630. $rcvT_($index_) target [$em_($index_) target]
  631. $em_($index_) target $rcvT_($index_)
  632. } else {
  633. # if no error model, then insert between mac and ll
  634. set rcvT_($index_) [$ns create-trace Sat/Recv $f $fromNode_ $toNode_]
  635. $rcvT_($index_) target [$mac_($index_) up-target]
  636. $mac_($index_) up-target $rcvT_($index_)
  637. }
  638. }
  639. ###########
  640. # TRACE MODIFICATIONS
  641. ##########
  642. # This creates special satellite tracing elements
  643. # See __FILE__.cc
  644. # Support for Enque, Deque, Recv, Drop, Generic (not Session)
  645. Class Trace/Sat/Hop -superclass Trace/Sat
  646. Trace/Sat/Hop instproc init {} {
  647.         $self next "h"
  648. }
  649. Class Trace/Sat/Enque -superclass Trace/Sat
  650. Trace/Sat/Enque instproc init {} {
  651.         $self next "+"
  652. }
  653. Trace/Sat/Deque instproc init {} {
  654.         $self next "-"
  655. }
  656. Class Trace/Sat/Recv -superclass Trace/Sat
  657. Trace/Sat/Recv instproc init {} {
  658.         $self next "r"
  659. }
  660. Class Trace/Sat/Drop -superclass Trace/Sat
  661. Trace/Sat/Drop instproc init {} {
  662.         $self next "d"
  663. }
  664. Class Trace/Sat/Error -superclass Trace/Sat
  665. Trace/Sat/Error instproc init {} {
  666.         $self next "e"
  667. }
  668. Class Trace/Sat/Collision -superclass Trace/Sat
  669. Trace/Sat/Collision instproc init {} {
  670. $self next "c"
  671. }
  672. Class Trace/Sat/Generic -superclass Trace/Sat
  673. Trace/Sat/Generic instproc init {} {
  674.         $self next "v"
  675. }
  676. # ======================================================================
  677. #
  678. # Defaults for bound variables 
  679. #
  680. # ======================================================================
  681. Node/SatNode set dist_routing_ false; # distributed routing not yet supported
  682. Position/Sat set time_advance_ 0; # time offset to start of simulation 
  683. Position/Sat/Polar set plane_ 0
  684. HandoffManager/Term set elevation_mask_ 0
  685. HandoffManager/Term set term_handoff_int_ 10
  686. HandoffManager/Sat set sat_handoff_int_ 10
  687. HandoffManager/Sat set latitude_threshold_ 70
  688. HandoffManager/Sat set longitude_threshold_ 0
  689. HandoffManager set handoff_randomization_ false 
  690. SatRouteObject set metric_delay_ true
  691. SatRouteObject set data_driven_computation_ false
  692. SatRouteObject set wiredRouting_ false
  693. Mac/Sat set trace_drops_ true
  694. Mac/Sat set trace_collisions_ true
  695. Mac/Sat/UnslottedAloha set mean_backoff_ 1s; # mean backoff time upon collision
  696. Mac/Sat/UnslottedAloha set rtx_limit_ 3; # Retransmission limit 
  697. Mac/Sat/UnslottedAloha set send_timeout_ 270ms; # Timer interval for new sends
  698. Agent/SatRoute set myaddr_       0        ;# My address
  699. Mac/Sat set bandwidth_ 2Mb