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

通讯编程

开发平台:

Visual C++

  1. #
  2. # abslan.tcl
  3. #
  4. # Copyright (c) 1997 University of Southern California.
  5. # All rights reserved.                                            
  6. #                                                                
  7. # Redistribution and use in source and binary forms are permitted
  8. # provided that the above copyright notice and this paragraph are
  9. # duplicated in all such forms and that any documentation, advertising
  10. # materials, and other materials related to such distribution and use
  11. # acknowledge that the software was developed by the University of
  12. # Southern California, Information Sciences Institute.  The name of the
  13. # University may not be used to endorse or promote products derived from
  14. # this software without specific prior written permission.
  15. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  16. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  17. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18. #__________________________________________________________
  19. # AbsLanNode:
  20. # It create an abstract LAN.
  21. # An abstract lan is one in which the complex CSMA/CD contention mechanism
  22. # is replaced by a simple DropTail queue mechanism. 
  23. #____________________________________________________________
  24. #Class AbsLanNode
  25. AbsLanNode set address_   ""
  26. AbsLanNode instproc address  {val} { $self set address_  $val }
  27. AbsLanNode instproc bw       {val} { $self set bw_       $val }
  28. AbsLanNode instproc delay    {val} { $self set delay_    $val }
  29. AbsLanNode instproc qlen     {val} { $self set qlen_     $val }
  30. AbsLanNode instproc init {ns args} {
  31. set args [eval $self init-vars $args]
  32. $self instvar bw_ delay_ qlen_
  33. $self instvar ns_ nodelist_ defRouter_ cost_
  34. $self instvar id_ address_ q_ dlink_ mcl_ varp_
  35. $ns instvar Node_
  36. $self next
  37. set ns_ $ns
  38. set nodelist_ ""
  39. set cost_ 1
  40. set id_ [Node getid]
  41. $ns_ add-abslan-node $self $id_
  42.         $self nodeid $id_ ;# Propagate id_ into c++ space
  43. set Node_($id_) $self
  44.         set address_ $id_       ;# won't work for hier rtg!
  45. set defRouter_ [new LanRouter $ns $self]
  46. if [$ns multicast?] {
  47. set switch_ [new Classifier/Hash/Dest 32]
  48. $switch_ set mask_ [AddrParams set McastMask_]
  49. $switch_ set shift_ [AddrParams set McastShift_]
  50. $defRouter_ switch $switch_
  51. }
  52. set varp_ [new VARPTable]
  53. set q_ [new Queue/DropTail]
  54. set dlink_ [new DelayLink]
  55. $dlink_ set bandwidth_ $bw_
  56. $dlink_ set delay_ $delay_
  57. set mcl_ [new Classifier/Replicator]
  58. $mcl_ set offset_ [PktHdr_offset PacketHeader/Mac macDA_]
  59. $mcl_ set direction_ true
  60. $q_ target $dlink_
  61. $q_ set limit_ $qlen_
  62. $dlink_ target $mcl_
  63. }
  64. AbsLanNode instproc addNode {nodes} {
  65. $self instvar id_ lanIface_
  66. $self instvar q_ ns_ nodelist_ cost_ varp_ 
  67.         $self instvar dlink_ mcl_ bw_
  68.         $self instvar deqT_
  69. $ns_ instvar link_ Node_ 
  70.          
  71. set vlinkcost [expr $cost_ / 2.0]
  72. foreach src $nodes {
  73. set nif [new AbsLanIface $src $self]
  74. set tr [$ns_ get-ns-traceall]
  75. if {$tr != ""} {
  76. $nif trace $ns_ $tr
  77. }
  78. set tr [$ns_ get-nam-traceall]
  79. if {$tr != ""} {
  80. $nif nam-trace $ns_ $tr
  81. }
  82.         $mcl_ installNext [$nif set mac_]
  83.         $varp_ mac-addr [[$nif set node_] id] 
  84.         [[$nif set mac_] id] 
  85. $q_ drop-target [$nif set drophead_]
  86. set lanIface_($src) $nif
  87. $src add-neighbor $self
  88.         
  89. set sid [$src id]
  90.        
  91. set link_($sid:$id_) [new Vlink $ns_ $self $src  $self $bw_ 0]
  92. set link_($id_:$sid) [new Vlink $ns_ $self $self $src  $bw_ 0]
  93. #$src add-oif [$link_($sid:$id_) head]  $link_($sid:$id_)
  94. #$src add-iif [[$nif set iface_] label] $link_($id_:$sid)
  95. [$link_($sid:$id_) head] set link_ $link_($sid:$id_)
  96. # Changed to point to common queue
  97. $link_($sid:$id_) queue [$self set q_ ]
  98. $link_($id_:$sid) queue [$self set q_ ]
  99. #$link_($sid:$id_) set iif_ [$nif set iface_]
  100. #$link_($id_:$sid) set iif_ [$nif set iface_]
  101. $link_($sid:$id_) cost $vlinkcost
  102. $link_($id_:$sid) cost $vlinkcost
  103. }
  104. set nodelist_ [concat $nodelist_ $nodes]
  105. # Single Deque object ; Not one for each node
  106. # Using the last node as the drc node for create-trace
  107. set f [$ns_ get-ns-traceall]
  108. set deqT_ [$ns_ create-trace Deque  $f $src $self ]
  109. $deqT_ target $dlink_
  110. $q_ target $deqT_
  111. }
  112. AbsLanNode instproc assign-mac {ip} {
  113. return $ip ;# use ip addresses at MAC layer
  114. }
  115. AbsLanNode instproc cost c {
  116. $self instvar ns_ nodelist_ id_ cost_
  117. $ns_ instvar link_
  118. set cost_ $c
  119. set vlinkcost [expr $c / 2.0]
  120. foreach node $nodelist_ {
  121. set nid [$node id]
  122. $link_($id_:$nid) cost $vlinkcost
  123. $link_($nid:$id_) cost $vlinkcost
  124. }
  125. }
  126. AbsLanNode instproc cost? {} {
  127. $self instvar cost_
  128. return $cost_
  129. }
  130. AbsLanNode instproc rtObject? {} {
  131. # NOTHING
  132. }
  133. AbsLanNode instproc id {} { $self set id_ }
  134. AbsLanNode instproc node-addr {{addr ""}} { 
  135. eval $self set address_ $addr
  136. }
  137. AbsLanNode instproc reset {} {
  138. # NOTHING: needed for node processing by ns routing
  139. }
  140. AbsLanNode instproc is-lan? {} { return 1 }
  141. AbsLanNode instproc dump-namconfig {} {
  142. # Redefine this function if want a different lan layout
  143. $self instvar ns_ bw_ delay_ nodelist_ id_
  144. $ns_ puts-nam-config 
  145. "X -t * -n $id_ -r $bw_ -D $delay_ -o left"
  146. set cnt 0
  147. set LanOrient(0) "up"
  148. set LanOrient(1) "down"
  149. foreach n $nodelist_ {
  150. $ns_ puts-nam-config 
  151. "L -t * -s $id_ -d [$n id] -o $LanOrient($cnt)"
  152. set cnt [expr 1 - $cnt]
  153. }
  154. }
  155. AbsLanNode instproc init-outLink {} { 
  156. #NOTHING
  157. }
  158. AbsLanNode instproc start-mcast {} { 
  159. # NOTHING
  160. }
  161. AbsLanNode instproc getArbiter {} {
  162. # NOTHING
  163. }
  164. AbsLanNode instproc attach {agent} {
  165. # NOTHING
  166. }
  167. AbsLanNode instproc sp-add-route {args} {
  168. # NOTHING: use defRouter to find routes
  169. }
  170. AbsLanNode instproc add-route {args} {
  171. # NOTHING: use defRouter to find routes
  172. }
  173. AbsLanNode instproc add-hroute {args} {
  174. # NOTHING: use defRouter to find routes
  175. }
  176. AbsLanNode instproc split-addrstr addrstr {
  177. set L [split $addrstr .]
  178. return $L
  179. }
  180. #AbsLanIface---------------------------------------------------
  181. #
  182. # node's interface to a AbsLanNode
  183. #------------------------------------------------------------
  184. Class AbsLanIface 
  185. AbsLanIface instproc entry {} { $self set entry_ }
  186. AbsLanIface instproc init {node lan } {
  187. $self next 
  188. $self instvar node_ lan_ 
  189. $self instvar entry_ mac_ ll_ 
  190.         $self instvar drophead_
  191. set node_ $node
  192. set lan_ $lan
  193. set entry_ [new Connector]
  194.         set ll_ [new LL]
  195.         set mac_ [new Mac]
  196.         $mac_ set abstract_ true
  197. $entry_ target $ll_
  198.         $ll_ mac $mac_
  199.         $ll_ up-target [$node entry]
  200.         $ll_ down-target $mac_
  201.         $ll_ set macDA_ -1
  202.         $ll_ set delay_ 0
  203.         $ll_ lanrouter [$lan set defRouter_]
  204.         $ll_ varp [$lan set varp_]
  205.         $mac_ up-target $ll_
  206.         $mac_ down-target [$lan set q_]
  207.         $mac_ set delay_ 0
  208.         set ns [Simulator instance]
  209.         set drophead_ [new Connector]
  210.         $drophead_ target [$ns set nullAgent_]
  211.         $mac_ drop-target $drophead_
  212.         $ll_ drop-target $drophead_
  213. }
  214. AbsLanIface instproc trace {ns f {op ""}} {
  215. $self instvar hopT_ rcvT_ enqT_ drpT_ deqT_ 
  216. $self instvar iface_ entry_ node_ lan_ drophead_ 
  217. $self instvar ll_ mac_ 
  218. set hopT_ [$ns create-trace Hop   $f $node_ $lan_  $op]
  219. set rcvT_ [$ns create-trace Recv  $f $lan_  $node_ $op]
  220. set enqT_ [$ns create-trace Enque $f $node_ $lan_  $op]
  221. set drpT_ [$ns create-trace Drop  $f $node_ $lan_  $op]
  222. $hopT_ target [$entry_ target]
  223. $entry_ target $hopT_
  224. $rcvT_ target [$ll_ up-target]
  225. $ll_ up-target $rcvT_
  226. $enqT_ target [$mac_ down-target]
  227. $mac_ down-target $enqT_
  228. $drpT_ target [$drophead_ target]
  229. $drophead_ target $drpT_
  230. }
  231. # should be called after LanIface::trace
  232. AbsLanIface instproc nam-trace {ns f} {
  233. $self instvar hopT_ rcvT_ enqT_  drpT_ deqT_
  234. if [info exists hopT_] {
  235. $hopT_ namattach $f
  236. } else {
  237. $self trace $ns $f "nam"
  238. }
  239. $rcvT_ namattach $f
  240. $enqT_ namattach $f
  241. $drpT_ namattach $f
  242. }
  243. #To invoke the creation of an abstract Lan 
  244. Simulator instproc make-abslan {nodelist bw delay {qlen 50}} {
  245. set lan [new AbsLanNode $self 
  246. -bw $bw 
  247. -delay $delay 
  248. -qlen $qlen]
  249. $lan addNode $nodelist 
  250. return $lan
  251. }