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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1996-1998 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. # Ported from CMU-Monarch project's mobility extensions -Padma, 10/98.
  32. # dsr.tcl
  33. # $Id: dsr.tcl,v 1.16 2003/12/23 17:36:35 haldar Exp $
  34. # ======================================================================
  35. # Default Script Options
  36. # ======================================================================
  37. set opt(rt_port) 255
  38. set opt(cc)      "off"            ;# have god check the caches for bad links?
  39. # ======================================================================
  40. # god cache monitoring
  41. #source tcl/ex/timer.tcl
  42. Class CacheTimer -superclass Timer
  43. CacheTimer instproc timeout {} {
  44.     global opt node_;
  45.     $self instvar agent;
  46.     $agent check-cache
  47.     $self sched 1.0
  48. }
  49. proc checkcache {a} {
  50.     global cachetimer ns
  51.     set cachetimer [new CacheTimer]
  52.     $cachetimer set agent $a
  53.     $cachetimer sched 1.0
  54. }
  55. # ======================================================================
  56. Class SRNode -superclass Node/MobileNode
  57. SRNode instproc init {args} {
  58. global ns ns_ opt tracefd RouterTrace
  59. $self instvar dsr_agent_ dmux_ entry_point_ address_
  60.         set ns_ [Simulator instance]
  61. eval $self next $args ;# parent class constructor
  62. if {$dmux_ == "" } {
  63. set dmux_ [new Classifier/Port]
  64. $dmux_ set mask_ [AddrParams PortMask]
  65. $dmux_ set shift_ [AddrParams PortShift]
  66. #
  67. # point the node's routing entry to itself
  68. # at the port demuxer (if there is one)
  69. #
  70. }
  71. # puts "making dsragent for node [$self id]"
  72. set dsr_agent_ [new Agent/DSRAgent]
  73. # setup address (supports hier-address) for dsragent
  74. $dsr_agent_ addr $address_
  75. $dsr_agent_ node $self
  76. if [Simulator set mobile_ip_] {
  77.     $dsr_agent_ port-dmux [$self set dmux_]
  78. }
  79. # set up IP address
  80. $self addr $address_
  81.     if { $RouterTrace == "ON" } {
  82. # Recv Target
  83. set rcvT [cmu-trace Recv "RTR" $self]
  84. $rcvT target $dsr_agent_
  85. set entry_point_ $rcvT
  86.     } else {
  87. # Recv Target
  88. set entry_point_ $dsr_agent_
  89.     }
  90.     #
  91.     # Drop Target (always on regardless of other tracing)
  92.     #
  93.     set drpT [cmu-trace Drop "RTR" $self]
  94.     $dsr_agent_ drop-target $drpT
  95.     #
  96.     # Log Target
  97.     #
  98.     set T [new Trace/Generic]
  99.     $T target [$ns_ set nullAgent_]
  100.     $T attach $tracefd
  101.     $T set src_ [$self id]
  102.     $dsr_agent_ log-target $T
  103.     $dsr_agent_ target $dmux_
  104.     # packets to the DSR port should be dropped, since we've
  105.     # already handled them in the DSRAgent at the entry.
  106.     set nullAgent_ [$ns_ set nullAgent_]
  107.     $dmux_ install $opt(rt_port) $nullAgent_
  108.     # SRNodes don't use the IP addr classifier.  The DSRAgent should
  109.     # be the entry point
  110.     $self instvar classifier_
  111.     set classifier_ "srnode made illegal use of classifier_"
  112. }
  113. SRNode instproc start-dsr {} {
  114.     $self instvar dsr_agent_
  115.     global opt;
  116.     $dsr_agent_ startdsr
  117.     if {$opt(cc) == "on"} {checkcache $dsr_agent_}
  118. }
  119. SRNode instproc entry {} {
  120.         $self instvar entry_point_
  121.         return $entry_point_
  122. }
  123. SRNode instproc add-interface {args} {
  124. # args are expected to be of the form
  125. # $chan $prop $tracefd $opt(ll) $opt(mac)
  126.     global ns ns_ opt RouterTrace
  127.     eval $self next $args
  128.     $self instvar dsr_agent_ ll_ mac_ ifq_
  129.     $dsr_agent_ mac-addr [$mac_(0) id]
  130.     if { $RouterTrace == "ON" } {
  131. # Send Target
  132. set sndT [cmu-trace Send "RTR" $self]
  133. $sndT target $ll_(0)
  134. $dsr_agent_ add-ll $sndT $ifq_(0)
  135.     } else {
  136. # Send Target
  137. $dsr_agent_ add-ll $ll_(0) $ifq_(0)
  138.     }
  139.     
  140.     # setup promiscuous tap into mac layer
  141.     $dsr_agent_ install-tap $mac_(0)
  142. }
  143. SRNode instproc reset args {
  144.     $self instvar dsr_agent_
  145.     eval $self next $args
  146.     $dsr_agent_ reset
  147. }
  148. # ======================================================================
  149. proc dsr-create-mobile-node { id args } {
  150. global ns_ chan prop topo tracefd opt node_
  151. set ns_ [Simulator instance] 
  152.         if [Simulator hier-addr?] {
  153.     if [Simulator set mobile_ip_] {
  154. set node_($id) [new SRNode/MIPMH $args]
  155.     } else {
  156. set node_($id) [new SRNode $args]
  157.     }
  158. } else {
  159.     set node_($id) [new SRNode]
  160. }
  161. set node $node_($id)
  162. $node random-motion 0 ;# disable random motion
  163. $node topography $topo
  164. # XXX Activate energy model so that we can use sleep, etc. But put on 
  165. # a very large initial energy so it'll never run out of it.
  166. if [info exists opt(energy)] {
  167. $node addenergymodel [new $opt(energy) $node 1000 0.5 0.2]
  168. }
  169. if ![info exist inerrProc_] {
  170.     set inerrProc_ ""
  171. }
  172. if ![info exist outerrProc_] {
  173.     set outerrProc_ ""
  174. }
  175. if ![info exist FECProc_] {
  176.     set FECProc_ ""
  177. }
  178.         # connect up the channel
  179.         $node add-interface $chan $prop $opt(ll) $opt(mac)     
  180.     $opt(ifq) $opt(ifqlen) $opt(netif) $opt(ant) $topo 
  181.     $inerrProc_ $outerrProc_ $FECProc_ 
  182. #
  183. # This Trace Target is used to log changes in direction
  184. # and velocity for the mobile node and log actions of the DSR agent
  185. #
  186. set T [new Trace/Generic]
  187. $T target [$ns_ set nullAgent_]
  188. $T attach $tracefd
  189. $T set src_ $id
  190. $node log-target $T
  191.         $ns_ at 0.0 "$node start-dsr"
  192. return $node
  193. }