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

通讯编程

开发平台:

Visual C++

  1. # -*- Mode:tcl; tcl-indent-level:8; tab-width:8; indent-tabs-mode:t -*-
  2. #
  3. # Copyright (c) Sun Microsystems, Inc. 1998 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. #
  9. # 1. Redistributions of source code must retain the above copyright
  10. #    notice, this list of conditions and the following disclaimer.
  11. #
  12. # 2. Redistributions in binary form must reproduce the above copyright
  13. #    notice, this list of conditions and the following disclaimer in the
  14. #    documentation and/or other materials provided with the distribution.
  15. #
  16. # 3. All advertising materials mentioning features or use of this software
  17. #    must display the following acknowledgement:
  18. #      This product includes software developed by Sun Microsystems, Inc.
  19. #
  20. # 4. The name of the Sun Microsystems, Inc nor may not be used to endorse or
  21. #      promote products derived from this software without specific prior
  22. #      written permission.
  23. #
  24. # SUN MICROSYSTEMS MERCHANTABILITY OF THIS SOFTWARE OR THE SUITABILITY OF THIS
  25. # SOFTWARE FOR ANY PARTICULAR PURPOSE.  The software is provided "as is"
  26. # without express or implied warranty of any kind.
  27. #
  28. # These notices must be retained in any copies of any part of this software.
  29. #
  30. # $Header: /cvsroot/nsnam/ns-2/tcl/lib/ns-mip.tcl,v 1.10 2001/02/22 19:45:42 haldar Exp $
  31. # XXX It is stupid to have both MIP implementation here and in mobile node. 
  32. # However, there is no test suite that covers test-suite-mip.tcl, which relies
  33. # on this file, and is implemented using mobile node. WHAT IS GOING ON?? 
  34. #     
  35. # Broadcast Nodes:
  36. # accept limited broadcast packets
  37. #     
  38. #Class Node/Broadcast -superclass Node
  39. Node/Broadcast instproc init {} {
  40. $self next
  41.         $self instvar address_ classifier_ id_ dmux_
  42. [Simulator instance] add-broadcast-node $self $id_
  43.         set classifier_ [new Classifier/Hash/Dest/Bcast 32]
  44.         $classifier_ set mask_ [AddrParams NodeMask 1]
  45.         $classifier_ set shift_ [AddrParams NodeShift 1]
  46.         set address_ $id_
  47.         if { $dmux_ == "" } {
  48.                 set dmux_ [new Classifier/Port/Reserve]
  49. $dmux_ set mask_ [AddrParams set ALL_BITS_SET]
  50.                 $dmux_ set shift_ 0
  51. $self add-route $address_ $dmux_
  52.         }
  53.         $classifier_ bcast-receiver $dmux_
  54. $self attach-classifier $classifier_
  55. }
  56. Node/Broadcast instproc mk-default-classifier {} { }
  57. # XXX The following three instprocs are used to keep this version of MIP
  58. # work. This is all work-in-progress and everything in this file should 
  59. # be converted into a routing module and merged with mobile node.
  60. #Node/Broadcast instproc sp-add-route { dst target } {
  61. # [$self set classifier_] install $dst $target
  62. #}
  63. Node/Broadcast instproc add-route { dst target } {
  64. [$self set classifier_] install $dst $target
  65. }
  66. Node/Broadcast instproc delete-route { dst nullagent } {
  67. [$self set classifier_] install $dst $nullagent
  68. }
  69. Node/Broadcast instproc add-target { agent port } {
  70. # Send target
  71. $agent target [$self entry]
  72. # Recv target
  73. [$self demux] install $port $agent
  74. }
  75. MIPEncapsulator instproc tunnel-exit mhaddr {
  76. $self instvar node_
  77. return [[$node_ set regagent_] set TunnelExit_($mhaddr)]
  78. }
  79. Class Node/MIPBS -superclass Node/Broadcast
  80. Node/MIPBS instproc init { args } {
  81. eval $self next $args
  82. $self instvar regagent_ encap_ decap_ agents_ address_ dmux_ id_
  83. if { $dmux_ == "" } {
  84. error "serious internal error at Node/MIPBSn"
  85. }
  86. set regagent_ [new Agent/MIPBS $self]
  87. $self attach $regagent_ 0
  88. $regagent_ set mask_ [AddrParams NodeMask 1]
  89. $regagent_ set shift_ [AddrParams NodeShift 1]
  90.    $regagent_ set dst_addr_ [expr (~0) << [AddrParams NodeShift 1]]
  91. $regagent_ set dst_port_ 0
  92. set encap_ [new MIPEncapsulator]
  93. set decap_ [new Classifier/Addr/MIPDecapsulator]
  94. #
  95. # install en/de-capsulators
  96. #
  97. lappend agents_ $decap_
  98. #
  99. # Check if number of agents exceeds length of port-address-field size
  100. #
  101. set nodeaddr [AddrParams addr2id $address_]
  102. $encap_ set addr_ $nodeaddr
  103. $encap_ set port_ 1
  104. $encap_ target [$self entry]
  105. $encap_ set node_ $self
  106. $dmux_ install 1 $decap_
  107. $encap_ set mask_ [AddrParams NodeMask 1]
  108. $encap_ set shift_ [AddrParams NodeShift 1]
  109. $decap_ set mask_ [AddrParams NodeMask 1]
  110. $decap_ set shift_ [AddrParams NodeShift 1]
  111. }
  112. Class Node/MIPMH -superclass Node/Broadcast
  113. Node/MIPMH instproc init { args } {
  114. eval $self next $args
  115. $self instvar regagent_
  116. set regagent_ [new Agent/MIPMH $self]
  117. $self attach $regagent_ 0
  118. $regagent_ set mask_ [AddrParams NodeMask 1]
  119. $regagent_ set shift_ [AddrParams NodeShift 1]
  120.   $regagent_ set dst_addr_ [expr (~0) << [AddrParams NodeShift 1]]
  121. $regagent_ set dst_port_ 0
  122. }
  123. Agent/MIPBS instproc init { node args } {
  124. eval $self next $args
  125.     
  126. # if mobilenode, donot use bcasttarget; use target_ instead;
  127. if {[$node info class] != "MobileNode/MIPBS" && 
  128. [$node info class] != "Node/MobileNode"} {
  129. $self instvar BcastTarget_
  130. set BcastTarget_ [new Classifier/Replicator]
  131. $self bcast-target $BcastTarget_
  132. }
  133. $self beacon-period 1.0 ;# default value
  134. }
  135. Agent/MIPBS instproc clear-reg mhaddr {
  136. $self instvar node_ OldRoute_ RegTimer_
  137. if [info exists OldRoute_($mhaddr)] {
  138. $node_ add-route $mhaddr $OldRoute_($mhaddr)
  139. }
  140. if {[$node_ info class] == "MobileNode/MIPBS" || [$node_ info class] =="Node/MobileNode" } {
  141. eval $node_ delete-route [AddrParams id2addr $mhaddr]
  142. }
  143. if { [info exists RegTimer_($mhaddr)] && $RegTimer_($mhaddr) != "" } {
  144. [Simulator instance] cancel $RegTimer_($mhaddr)
  145. set RegTimer_($mhaddr) ""
  146. }
  147. }
  148. Agent/MIPBS instproc encap-route { mhaddr coa lifetime } {
  149. $self instvar node_ TunnelExit_ OldRoute_ RegTimer_
  150. set ns [Simulator instance]
  151.         set encap [$node_ set encap_]
  152.         if {[$node_ info class] == "MobileNode/MIPBS" || [$node_ info class] == "Node/MobileNode"} {
  153.     set addr [AddrParams id2addr $mhaddr]
  154.     set a [split $addr]
  155.     set b [join $a .]
  156.     $node_ add-route $b $encap
  157. } else {
  158.     set or [[$node_ entry] slot $mhaddr]
  159.     if { $or != $encap } {
  160. set OldRoute_($mhaddr) $or
  161. $node_ add-route $mhaddr $encap
  162.     }
  163. }
  164. set TunnelExit_($mhaddr) $coa
  165. if { [info exists RegTimer_($mhaddr)] && $RegTimer_($mhaddr) != "" } {
  166. $ns cancel $RegTimer_($mhaddr)
  167. }
  168. set RegTimer_($mhaddr) [$ns at [expr [$ns now] + $lifetime] 
  169.     "$self clear-reg $mhaddr"]
  170. }
  171. Agent/MIPBS instproc decap-route { mhaddr target lifetime } {
  172. $self instvar node_ RegTimer_
  173. # decap's for mobilenodes can have a default-target; in this 
  174. # case the def-target is the routing-agent.
  175.     
  176. if {[$node_ info class] != "MobileNode/MIPBS" && 
  177. [$node_ info class] != "Node/MobileNode" } {
  178. set ns [Simulator instance]
  179. [$node_ set decap_] install $mhaddr $target
  180. if { [info exists RegTimer_($mhaddr)] && 
  181. $RegTimer_($mhaddr) != "" } {
  182. $ns cancel $RegTimer_($mhaddr)
  183. }
  184. set RegTimer_($mhaddr) [$ns at [expr [$ns now] + $lifetime] 
  185. "$self clear-decap $mhaddr"]
  186. } else {
  187. [$node_ set decap_] defaulttarget [$node_ set ragent_]
  188. }
  189. }
  190. Agent/MIPBS instproc clear-decap mhaddr {
  191. $self instvar node_ RegTimer_
  192. if { [info exists RegTimer_($mhaddr)] && $RegTimer_($mhaddr) != "" } {
  193. [Simulator instance] cancel $RegTimer_($mhaddr)
  194. set RegTimer_($mhaddr) ""
  195. }
  196. [$node_ set decap_] clear $mhaddr
  197. }
  198. Agent/MIPBS instproc get-link { src dst } {
  199. $self instvar node_
  200. if {[$node_ info class] != "MobileNode/MIPBS" && 
  201. [$node_ info class] != "Node/MobileNode"} {
  202. set ns [Simulator instance]
  203. return [[$ns link [$ns get-node-by-addr $src] 
  204. [$ns get-node-by-addr $dst]] head]
  205. } else { 
  206. return ""
  207. }
  208. }
  209. Agent/MIPBS instproc add-ads-bcast-link { ll } {
  210. $self instvar BcastTarget_
  211. $BcastTarget_ installNext [$ll head]
  212. }
  213. Agent/MIPMH instproc init { node args } {
  214. eval $self next $args
  215. # if mobilenode, donot use bcasttarget; use target_ instead;
  216. if {[$node info class] != "MobileNode/MIPMH" && 
  217. [$node info class] != "SRNode/MIPMH" && 
  218. [$node info class] != "Node/MobileNode" } {
  219. $self instvar BcastTarget_
  220. set BcastTarget_ [new Classifier/Replicator]
  221. $self bcast-target $BcastTarget_
  222. }
  223. $self beacon-period 1.0 ;# default value
  224. }
  225. Agent/MIPMH instproc update-reg coa {
  226. $self instvar node_
  227. ## dont need to set up routing for mobilenodes, so..
  228. if {[$node_ info class] != "MobileNode/MIPMH" && 
  229. [$node_ info class] != "SRNode/MIPMH" && 
  230. [$node_ info class] != "Node/MobileNode" } {
  231. set n [Node set nn_]
  232. set ns [Simulator instance]
  233. set id [$node_ id]
  234. set l [[$ns link $node_ [$ns get-node-by-addr $coa]] head]
  235. for { set i 0 } { $i < $n } { incr i } {
  236. if { $i != $id } {
  237. $node_ add-route $i $l
  238. }
  239. }
  240. }
  241. }
  242.     
  243. Agent/MIPMH instproc get-link { src dst } {
  244. $self instvar node_
  245. if {[$node_ info class] != "MobileNode/MIPMH" && 
  246. [$node_ info class] != "SRNode/MIPMH" && 
  247. [$node_ info class] != "Node/MobileNode" } {
  248. set ns [Simulator instance]
  249. return [[$ns link [$ns get-node-by-addr $src] 
  250. [$ns get-node-by-addr $dst]] head]
  251. } else {
  252. return ""
  253. }
  254. }
  255. Agent/MIPMH instproc add-sol-bcast-link { ll } {
  256. $self instvar BcastTarget_
  257. $BcastTarget_ installNext [$ll head]
  258. }