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

通讯编程

开发平台:

Visual C++

  1. #  Copyright (c) 2000 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. #  Copyright (C) 1998 by Mingzhou Sun. All rights reserved.
  40. #
  41. #  This software is developed at Rensselaer Polytechnic Institute under 
  42. #  DARPA grant No. F30602-97-C-0274
  43. #  Redistribution and use in source and binary forms are permitted
  44. #  provided that the above copyright notice and this paragraph are
  45. #  duplicated in all such forms and that any documentation, advertising
  46. #  materials, and other materials related to such distribution and use
  47. #  acknowledge that the software was developed by Mingzhou Sun at the
  48. #  Rensselaer  Polytechnic Institute.  The name of the University may not 
  49. #  be used to endorse or promote products derived from this software 
  50. #  without specific prior written permission.
  51. #
  52. # Link State Routing Agent
  53. #
  54. # $Header: /cvsroot/nsnam/ns-2/tcl/rtglib/ns-rtProtoLS.tcl,v 1.4 2005/09/16 03:05:46 tomh Exp $
  55. #
  56. # XXX These default values have to stay here because link state module
  57. # may be disabled during configuration time. If these stay in ns-default.tcl,
  58. # Agent/rtProto/LS may be unknown when ns-default.tcl is loaded.
  59. #
  60. Agent/rtProto/LS set UNREACHABLE  [rtObject set unreach_]
  61. Agent/rtProto/LS set preference_        120
  62. Agent/rtProto/LS set INFINITY           [Agent set ttl_]
  63. Agent/rtProto/LS set advertInterval     1800
  64. # like DV's, except $self cmd initialize and cmd setNodeNumber
  65. Agent/rtProto/LS proc init-all args {
  66. if { [llength $args] == 0 } {
  67. set nodeslist [[Simulator instance] all-nodes-list]
  68. } else { 
  69. eval "set nodeslist $args"
  70. }
  71. Agent set-maxttl Agent/rtProto/LS INFINITY
  72. eval rtObject init-all $nodeslist
  73. foreach node $nodeslist {
  74. set proto($node) [[$node rtObject?] add-proto LS $node]
  75. }
  76. foreach node $nodeslist {
  77. foreach nbr [$node neighbors] {
  78. set rtobj [$nbr rtObject?]
  79. if { $rtobj == "" } {
  80. continue
  81. }
  82. set rtproto [$rtobj rtProto? LS]
  83. if { $rtproto == "" } {
  84. continue
  85. }
  86. $proto($node) add-peer $nbr 
  87. [$rtproto set agent_addr_] 
  88. [$rtproto set agent_port_]
  89. }
  90. }
  91. # -- LS stuffs --
  92. set first_node [lindex $nodeslist 0 ]
  93. foreach node $nodeslist {
  94. set rtobj [$node rtObject?]
  95. if { $rtobj == "" } {
  96. continue
  97. }
  98. set rtproto [$rtobj rtProto? LS]
  99. if { $rtproto == "" } {
  100. continue
  101. }
  102. $rtproto cmd initialize
  103. if { $node == $first_node } {
  104. $rtproto cmd setNodeNumber 
  105. [[Simulator instance] get-number-of-nodes]
  106. }
  107. }
  108. }
  109. # like DV's , except LS_ready
  110. Agent/rtProto/LS instproc init node {
  111. global rtglibRNG
  112. $self next $node
  113. $self instvar ns_ rtObject_ ifsUp_ rtsChanged_ rtpref_ nextHop_ 
  114. nextHopPeer_ metric_ multiPath_
  115. Agent/rtProto/LS instvar preference_ 
  116. ;# -- LS stuffs -- 
  117. $self instvar LS_ready
  118. set LS_ready 0
  119. set rtsChanged_ 1
  120. set UNREACHABLE [$class set UNREACHABLE]
  121. foreach dest [$ns_ all-nodes-list] {
  122. set rtpref_($dest) $preference_
  123. set nextHop_($dest) ""
  124. set nextHopPeer_($dest) ""
  125. set metric_($dest)  $UNREACHABLE
  126. }
  127. set ifsUp_ ""
  128. set multiPath_ [[$rtObject_ set node_] set multiPath_]
  129. set updateTime [$rtglibRNG uniform 0.0 0.5]
  130. $ns_ at $updateTime "$self send-periodic-update"
  131. }
  132. # like DV's
  133. Agent/rtProto/LS instproc add-peer {nbr agentAddr agentPort} {
  134. $self instvar peers_
  135. $self set peers_($nbr) [new rtPeer $agentAddr $agentPort $class]
  136. }
  137. # like DV's, except cmd sendUpdates, instead of not send-updates
  138. Agent/rtProto/LS instproc send-periodic-update {} {
  139. global rtglibRNG
  140. $self instvar ns_
  141. # -- LS stuffs --
  142. $self cmd sendUpdates
  143. set updateTime [expr [$ns_ now] + ([$class set advertInterval] * 
  144. [$rtglibRNG uniform 0.5 1.5])]
  145. $ns_ at $updateTime "$self send-periodic-update"
  146. }
  147. # like DV's, except cmd computeRoutes
  148. Agent/rtProto/LS instproc compute-routes {} {
  149. $self instvar node_
  150. #puts "Node [$node_ id]: Agent/rtProto/LS compute-routes"
  151. $self cmd computeRoutes
  152. $self install-routes
  153. }
  154. # like DV's, except cmd intfChanged(), comment out DV stuff
  155. Agent/rtProto/LS instproc intf-changed {} {
  156. $self instvar ns_ peers_ ifs_ ifstat_ ifsUp_ nextHop_ 
  157. nextHopPeer_ metric_
  158. set INFINITY [$class set INFINITY]
  159. set ifsUp_ ""
  160. foreach nbr [lsort -dictionary [array names peers_]] {
  161. set state [$ifs_($nbr) up?]
  162. if {$state != $ifstat_($nbr)} {
  163. set ifstat_($nbr) $state
  164. }
  165. }
  166. # -- LS stuffs --
  167. $self cmd intfChanged
  168. $self route-changed
  169. }
  170. ;# called by C++ whenever a LSA or Topo causes a change in the routing table
  171. Agent/rtProto/LS instproc route-changed {} {
  172. $self instvar node_ 
  173. #puts "At [[Simulator instance] now] node [$node_ id]: Agent/rtProto/LS route-changed"
  174. $self instvar rtObject_  rtsChanged_
  175. $self install-routes
  176. set rtsChanged_ 1
  177. $rtObject_ compute-routes
  178. }
  179. # put the routes computed in C++ into tcl space
  180. Agent/rtProto/LS instproc install-routes {} {
  181. $self instvar ns_ ifs_ rtpref_ metric_ nextHop_ nextHopPeer_
  182. $self instvar peers_ rtsChanged_ multiPath_
  183. $self instvar node_  preference_ 
  184.     
  185. set INFINITY [$class set INFINITY]
  186. set MAXPREF  [rtObject set maxpref_]
  187. set UNREACH  [rtObject set unreach_]
  188. set rtsChanged_ 1 
  189. foreach dst [$ns_ all-nodes-list] {
  190. # puts "installing routes for $dst"
  191. if { $dst == $node_ } {
  192. set metric_($dst) 32  ;# the magic number
  193. continue
  194. }
  195. #  puts " [$node_ id] looking for route to [$dst id]"
  196. set path [$self cmd lookup [$dst id]]
  197. # puts "$path" ;# debug
  198. if { [llength $path ] == 0 } {
  199. # no path found in LS
  200. set rtpref_($dst) $MAXPREF
  201. set metric_($dst) $UNREACH
  202. set nextHop_($dst) ""
  203. continue
  204. }
  205. set cost [lindex $path 0]
  206. set rtpref_($dst) $preference_
  207. set metric_($dst) $cost
  208. if { ! $multiPath_ } {
  209. set nhNode [$ns_ get-node-by-id [lindex $path 1]]
  210. set nextHop_($dst) $ifs_($nhNode)
  211. continue
  212. }
  213. set nextHop_($dst) ""
  214. set nh ""
  215. set count [llength $path]
  216. foreach nbr [lsort -dictionary [array names peers_]] {
  217. foreach nhId [lrange $path 1 $count ] {
  218. if { [$nbr id] == $nhId } {
  219. lappend nextHop_($dst) $ifs_($nbr)
  220. break
  221. }
  222. }
  223. }
  224. }
  225. }
  226. Agent/rtProto/LS instproc send-updates changes {
  227. $self cmd send-buffered-messages
  228. }
  229. Agent/rtProto/LS proc compute-all {} {
  230. # Because proc methods are not inherited from the parent class.
  231. }
  232. Agent/rtProto/LS instproc get-node-id {} {
  233. $self instvar node_
  234. return [$node_ id]
  235. }
  236. Agent/rtProto/LS instproc get-links-status {} {
  237. $self instvar ifs_ ifstat_ 
  238. set linksStatus ""
  239. foreach nbr [array names ifs_] {
  240. lappend linksStatus [$nbr id]
  241. if {[$ifs_($nbr) up?] == "up"} {
  242. lappend linksStatus 1
  243. } else {
  244. lappend linksStatus 0
  245. }
  246. lappend linksStatus [$ifs_($nbr) cost?]
  247. }
  248. set linksStatus
  249. }
  250. Agent/rtProto/LS instproc get-peers {} {
  251. $self instvar peers_
  252. set peers ""
  253. foreach nbr [lsort -dictionary [array names peers_]] {
  254. lappend peers [$nbr id]
  255. lappend peers [$peers_($nbr) addr?]
  256. lappend peers [$peers_($nbr) port?]
  257. }
  258. set peers
  259. }
  260. # needed to calculate the appropriate timeout value for retransmission 
  261. # of unack'ed LSA or Topo messages
  262. Agent/rtProto/LS instproc get-delay-estimates {} {
  263. $self instvar ifs_ ifstat_ 
  264. set total_delays ""
  265. set packet_size 8000.0 ;# bits
  266. foreach nbr [array names ifs_] {
  267. set intf $ifs_($nbr)
  268. set q_limit [ [$intf queue ] set limit_]
  269. set bw [bw_parse [ [$intf link ] set bandwidth_ ] ]
  270. set p_delay [time_parse [ [$intf link ] set delay_] ]
  271. set total_delay [expr $q_limit * $packet_size / $bw + $p_delay]
  272. $self cmd setDelay [$nbr id] $total_delay
  273. }
  274. }