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

通讯编程

开发平台:

Visual C++

  1. #
  2. # vlan.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. # $Header: /cvsroot/nsnam/ns-2/tcl/lan/vlan.tcl,v 1.37 2003/09/11 22:10:20 sfloyd Exp $
  19. # LanNode----------------------------------------------------
  20. #
  21. # Lan implementation as a virtual node: LanNode mimics a real
  22. # node and uses an address (id) from Node's address space
  23. #
  24. # WARNING: if used with hierarchical routing, one has to assign
  25. # a hierarchical address to the lan itself.  This maybe confusing.
  26. #------------------------------------------------------------
  27. #Class LanNode
  28. LanNode set ifqType_   Queue/DropTail
  29. LanNode set ifqLen_    ""
  30. LanNode set llType_    LL
  31. #LanNode set macType_   Mac/Csma/Cd
  32. LanNode set macType_   Mac
  33. LanNode set chanType_  Channel
  34. LanNode set phyType_   Phy/WiredPhy
  35. LanNode set address_   ""
  36. LanNode set mactrace_   false
  37. LanNode instproc address  {val} { $self set address_  $val }
  38. LanNode instproc bw       {val} { $self set bw_       $val }
  39. LanNode instproc delay    {val} { $self set delay_    $val }
  40. LanNode instproc ifqType  {val} { $self set ifqType_  $val }
  41. LanNode instproc ifqLen   {val} { $self set ifqLen_   $val }
  42. LanNode instproc llType   {val} { $self set llType_   $val }
  43. LanNode instproc macType  {val} { $self set macType_  $val }
  44. LanNode instproc chanType {val} { $self set chanType_ $val }
  45. LanNode instproc phyType  {val} { $self set phyType_  $val }
  46. LanNode instproc mactrace    {val} { $self set mactrace_    $val }
  47. LanNode instproc init {ns args} {
  48. set args [eval $self init-vars $args]
  49. $self instvar bw_ delay_ llType_ macType_ chanType_
  50. $self instvar phyType_ mactrace_
  51. $self instvar ns_ nodelist_ defRouter_ cost_
  52. $self instvar id_ address_ channel_ mcl_ varp_
  53. $ns instvar Node_
  54. $self next
  55. set ns_ $ns
  56. set nodelist_ ""
  57. set cost_ 1
  58. set id_ [Node getid]
  59.         $self nodeid $id_
  60.         $ns_ add-lannode $self $id_
  61.         set Node_($id_) $self
  62. if [Simulator hier-addr?] {
  63. if {$address_ == ""} {
  64. error "LanNode: use "-address" option 
  65. with hierarchical routing"
  66. }
  67. } else {
  68. set address_ $id_
  69. }
  70. $self addr $address_
  71. set defRouter_ [new LanRouter $ns $self]
  72. if [$ns multicast?] {
  73. set switch_ [new Classifier/Hash/Dest 32]
  74. $switch_ set mask_ [AddrParams McastMask]
  75. $switch_ set shift_ [AddrParams McastShift]
  76. $defRouter_ switch $switch_
  77. }
  78. set channel_ [new $chanType_]
  79. set varp_ [new VARPTable]
  80. #set mcl_ [new Classifier/Mac]
  81. #$mcl_ set offset_ [PktHdr_offset PacketHeader/Mac macDA_]
  82. #$channel_ target $mcl_
  83. }
  84. LanNode instproc addNode {nodes bw delay {llType ""} {ifqType ""} 
  85.         {macType ""} {phyType ""} {mactrace ""} {ifqLen ""}} {
  86. $self instvar ifqType_ ifqLen_ llType_ macType_ chanType_ phyType_ 
  87. $self instvar mactrace_
  88. $self instvar id_ channel_ mcl_ lanIface_
  89. $self instvar ns_ nodelist_ cost_ varp_
  90. $ns_ instvar link_ Node_ 
  91. if {$ifqType == ""} { set ifqType $ifqType_ }
  92. if {$ifqLen == ""} { set ifqLen $ifqLen_ }
  93. if {$macType == ""} { set macType $macType_ }
  94. if {$llType  == ""} { set llType $llType_ }
  95. if {$phyType  == ""} { set phyType $phyType_ }
  96. if {$mactrace == ""}  { set mactrace $mactrace_ }
  97. set vlinkcost [expr $cost_ / 2.0]
  98. foreach src $nodes {
  99. set nif [new LanIface $src $self 
  100. -ifqType $ifqType 
  101. -ifqLen $ifqLen 
  102. -llType  $llType 
  103. -macType $macType 
  104. -phyType $phyType 
  105. -mactrace $mactrace ]
  106. set tr [$ns_ get-ns-traceall]
  107. if {$tr != ""} {
  108. $nif trace $ns_ $tr
  109. }
  110. set tr [$ns_ get-nam-traceall]
  111. if {$tr != ""} {
  112. $nif nam-trace $ns_ $tr
  113. }
  114. set ll [$nif set ll_]
  115. $ll set delay_ $delay
  116. $ll varp $varp_
  117. $varp_ mac-addr [[$nif set node_] id] 
  118. [[$nif set mac_] id]
  119. set phy [$nif set phy_]
  120. $phy node $src
  121. $phy channel $channel_
  122. $channel_ addif $phy
  123. $phy set bandwidth_ $bw
  124. set lanIface_($src) $nif
  125. $src add-neighbor $self
  126. set sid [$src id]
  127. set link_($sid:$id_) [new Vlink $ns_ $self $src  $self $bw 0]
  128. set link_($id_:$sid) [new Vlink $ns_ $self $self $src  $bw 0]
  129. $src add-oif [$link_($sid:$id_) head]  $link_($sid:$id_)
  130. $src add-iif [[$nif set iface_] label] $link_($id_:$sid)
  131. [$link_($sid:$id_) head] set link_ $link_($sid:$id_)
  132. $link_($sid:$id_) queue [$nif set ifq_]
  133. $link_($id_:$sid) queue [$nif set ifq_]
  134. $link_($sid:$id_) set iif_ [$nif set iface_]
  135. $link_($id_:$sid) set iif_ [$nif set iface_]
  136. $link_($sid:$id_) cost $vlinkcost
  137. $link_($id_:$sid) cost $vlinkcost
  138. }
  139. set nodelist_ [concat $nodelist_ $nodes]
  140. }
  141. LanNode instproc assign-mac {ip} {
  142. return $ip ;# use ip addresses at MAC layer
  143. }
  144. LanNode instproc cost c {
  145. $self instvar ns_ nodelist_ id_ cost_
  146. $ns_ instvar link_
  147. set cost_ $c
  148. set vlinkcost [expr $c / 2.0]
  149. foreach node $nodelist_ {
  150. set nid [$node id]
  151. $link_($id_:$nid) cost $vlinkcost
  152. $link_($nid:$id_) cost $vlinkcost
  153. }
  154. }
  155. LanNode instproc cost? {} {
  156. $self instvar cost_
  157. return $cost_
  158. }
  159. LanNode instproc rtObject? {} {
  160. # NOTHING
  161. }
  162. LanNode instproc id {} { $self set id_ }
  163. LanNode instproc node-addr {{addr ""}} { 
  164. eval $self set address_ $addr
  165. }
  166. LanNode instproc reset {} {
  167. # NOTHING: needed for node processing by ns routing
  168. }
  169. LanNode instproc is-lan? {} { return 1 }
  170. LanNode instproc dump-namconfig {} {
  171. # Redefine this function if want a different lan layout
  172. $self instvar ns_ bw_ delay_ nodelist_ id_
  173. $ns_ puts-nam-config 
  174. "X -t * -n $id_ -r $bw_ -D $delay_ -o left"
  175. set cnt 0
  176. set LanOrient(0) "up"
  177. set LanOrient(1) "down"
  178. foreach n $nodelist_ {
  179. $ns_ puts-nam-config 
  180. "L -t * -s $id_ -d [$n id] -o $LanOrient($cnt)"
  181. set cnt [expr 1 - $cnt]
  182. }
  183. }
  184. LanNode instproc init-outLink {} { 
  185. #NOTHING
  186. }
  187. LanNode instproc start-mcast {} { 
  188. # NOTHING
  189. }
  190. LanNode instproc getArbiter {} {
  191. # NOTHING
  192. }
  193. LanNode instproc attach {agent} {
  194. # NOTHING
  195. }
  196. LanNode instproc sp-add-route {args} {
  197. # NOTHING: use defRouter to find routes
  198. }
  199. LanNode instproc add-route {args} {
  200. # NOTHING: use defRouter to find routes
  201. }
  202. LanNode instproc add-hroute {args} {
  203. # NOTHING: use defRouter to find routes
  204. }
  205. # LanIface---------------------------------------------------
  206. #
  207. # node's interface to a LanNode
  208. #------------------------------------------------------------
  209. Class LanIface 
  210. LanIface set ifqType_ Queue/DropTail
  211. #LanIface set macType_ Mac/Csma/Cd
  212. LanIface set macType_ Mac
  213. LanIface set llType_  LL
  214. LanIface set phyType_  Phy/WiredPhy
  215. LanIface set mactrace_ false
  216. LanIface instproc llType {val} { $self set llType_ $val }
  217. LanIface instproc ifqType {val} { $self set ifqType_ $val }
  218. LanIface instproc ifqLen {val} { $self set ifqLen_ $val }
  219. LanIface instproc macType {val} { $self set macType_ $val }
  220. LanIface instproc phyType {val} { $self set phyType_ $val }
  221. LanIface instproc mactrace {val} { $self set mactrace_ $val }
  222. LanIface instproc entry {} { $self set entry_ }
  223. LanIface instproc init {node lan args} {
  224. set args [eval $self init-vars $args]
  225. eval $self next $args
  226. $self instvar llType_ ifqType_ macType_ phyType_ mactrace_
  227. $self instvar node_ lan_ ifq_ ifqLen_ mac_ ll_ phy_
  228. $self instvar iface_ entry_ drophead_
  229. set node_ $node
  230. set lan_ $lan
  231. set ll_ [new $llType_]
  232. set ifq_ [new $ifqType_]
  233. if {$ifqLen_ != ""} { $ifq_ set limit_ $ifqLen_ }
  234. set mac_ [new $macType_]
  235.         if {[string compare $macType_ "Mac/802_3"] == 0} {
  236.     $mac_ set trace_ $mactrace_
  237. }
  238. set iface_ [new NetworkInterface]
  239. set phy_ [new $phyType_]
  240. set entry_ [new Connector]
  241. set drophead_ [new Connector]
  242. $ll_ set macDA_ -1 ;# bcast address if there is no LAN router
  243. $ll_ lanrouter [$lan set defRouter_]
  244. $ll_ up-target $iface_
  245. $ll_ down-target $ifq_
  246. $ll_ mac $mac_
  247. $ll_ ifq $ifq_
  248. $ifq_ target $mac_
  249. $mac_ up-target $ll_
  250. $mac_ down-target $phy_
  251. $mac_ netif $phy_
  252. $phy_ up-target $mac_
  253. $iface_ target [$node entry]
  254. $entry_ target $ll_
  255. set ns [Simulator instance]
  256. #drophead is the same for all drops in the lan
  257. $drophead_ target [$ns set nullAgent_]
  258. $ifq_ drop-target $drophead_ 
  259. $mac_ drop-target $drophead_ 
  260. $ll_ drop-target $drophead_
  261. }
  262. LanIface instproc trace {ns f {op ""}} {
  263. $self instvar hopT_ rcvT_ enqT_ deqT_ drpT_ 
  264. $self instvar iface_ entry_ node_ lan_ drophead_ 
  265. $self instvar ll_ ifq_ mac_ mactrace_
  266. set hopT_ [$ns create-trace Hop   $f $node_ $lan_  $op]
  267. set rcvT_ [$ns create-trace Recv  $f $lan_  $node_ $op]
  268. set enqT_ [$ns create-trace Enque $f $node_ $lan_  $op]
  269. set deqT_ [$ns create-trace Deque $f $node_ $lan_  $op]
  270.         set drpT_ [$ns create-trace Drop  $f $node_ $lan_  $op]
  271.         if {[string compare $mactrace_ "true"] == 0} {
  272.     #  For Mac level collision traces 
  273.     set macdrpT_ [$ns create-trace Collision $f $node_ $lan_ $op]
  274.     set macdrophead_ [new Connector]
  275.     $mac_ drop-target $macdrophead_
  276.     $macdrophead_ target $macdrpT_
  277. }
  278. $hopT_ target [$entry_ target]
  279. $entry_ target $hopT_
  280. $rcvT_ target [$iface_ target]
  281. $iface_ target $rcvT_
  282. $enqT_ target [$ll_ down-target]
  283. $ll_ down-target $enqT_
  284. $deqT_ target [$ifq_ target]
  285. $ifq_ target $deqT_
  286. $drpT_ target [$drophead_ target]
  287. $drophead_ target $drpT_
  288. }
  289. # should be called after LanIface::trace
  290. LanIface instproc nam-trace {ns f} {
  291. $self instvar hopT_ rcvT_ enqT_ deqT_ drpT_ 
  292. if [info exists hopT_] {
  293. $hopT_ namattach $f
  294. } else {
  295. $self trace $ns $f "nam"
  296. }
  297. $rcvT_ namattach $f
  298. $enqT_ namattach $f
  299. $deqT_ namattach $f
  300. $drpT_ namattach $f
  301. }
  302. LanIface instproc add-receive-filter filter {
  303. $self instvar mac_
  304. $filter target [$mac_ target]
  305. $mac_ target $filter
  306. }
  307. # Vlink------------------------------------------------------
  308. #
  309. # Virtual link  implementation. Mimics a Simple Link but with
  310. # zero delay and infinite bandwidth
  311. #------------------------------------------------------------
  312. Class Vlink
  313. Vlink instproc up? {} {
  314. return "up"
  315. }
  316. Vlink instproc queue {{q ""}} {
  317. eval $self set queue_ $q
  318. }
  319. Vlink instproc init {ns lan src dst b d} {
  320. $self instvar ns_ lan_ src_ dst_ bw_ delay_
  321. set ns_ $ns
  322. set lan_ $lan
  323. set src_ $src
  324. set dst_ $dst
  325. set bw_ $b
  326. set delay_ $d
  327. }
  328. Vlink instproc src {} { $self set src_ }
  329. Vlink instproc dst {} { $self set dst_ }
  330. Vlink instproc dump-nam-queueconfig {} {
  331. #NOTHING
  332. }
  333. Vlink instproc head {} {
  334. $self instvar lan_ dst_ src_
  335. if {$src_ == $lan_ } {
  336. # if this is a link FROM the lan vnode, 
  337. # it doesn't matter what we return, because
  338. # it's only used by $lan add-route (empty)
  339. return ""
  340. } else {
  341. # if this is a link TO the lan vnode, 
  342. # return the entry to the lanIface object
  343. set src_lif [$lan_ set lanIface_($src_)]
  344. return [$src_lif entry]
  345. }
  346. }
  347. Vlink instproc cost c { $self set cost_ $c}
  348. Vlink instproc cost? {} {
  349. $self instvar cost_
  350. if ![info exists cost_] {
  351. return 1
  352. }
  353. return $cost_
  354. }
  355. # LanRouter--------------------------------------------------
  356. #
  357. # "Virtual node lan" needs to know which of the lan nodes is
  358. # the next hop towards the packet's (maybe remote) destination.
  359. #------------------------------------------------------------
  360. LanRouter instproc init {ns lan} {
  361. $self next
  362. if [Simulator hier-addr?] {
  363. $self routing hier
  364. } else {
  365. $self routing flat
  366. }
  367. $self lanaddr [$lan node-addr]
  368. $self routelogic [$ns get-routelogic]
  369. }
  370. Node instproc is-lan? {} { return 0 }
  371. #
  372. # newLan:  create a LAN from a sete of nodes
  373. #
  374. Simulator instproc newLan {nodelist bw delay args} {
  375. set lan [eval new LanNode $self -bw $bw -delay $delay $args]
  376. $lan addNode $nodelist $bw $delay
  377. return $lan
  378. }
  379. # For convenience, use make-lan.  For more fine-grained control,
  380. # use newLan instead of make-lan.
  381. #{macType Mac/Csma/Cd} -> for now support for only Mac
  382. Simulator instproc make-lan { args } {
  383.        
  384.         set t [lindex $args 0]
  385.         set mactrace "false"
  386.         if { $t == "-trace" } {
  387.     set mactrace [lindex $args 1]
  388.     if {$mactrace == "on" } {
  389. set mactrace "true"
  390.     }
  391. }
  392. if { $t == "-trace" } {
  393.     set nodelist [lindex $args 2]
  394.     set bw [lindex $args 3]
  395.     set delay [lindex $args 4]
  396.     set llType [lindex $args 5]
  397.     set ifqType [lindex $args 6]
  398.     set macType [lindex $args 7]
  399.     set chanType [lindex $args 8]
  400.     set phyType [lindex $args 9]
  401.     set ifqLen [lindex $args 10]
  402. } else {
  403.     set nodelist [lindex $args 0]
  404.     set bw [lindex $args 1]
  405.     set delay [lindex $args 2]
  406.     set llType [lindex $args 3]
  407.     set ifqType [lindex $args 4]
  408.     set macType [lindex $args 5]
  409.     set chanType [lindex $args 6]
  410.     set phyType [lindex $args 7]
  411.     set ifqLen [lindex $args 8]
  412. }
  413. if { $llType == "" } {
  414.     set llType "LL"
  415. }
  416. if { $ifqType == "" } {
  417.     set ifqtype "Queue/DropTail"
  418. }
  419. if { $macType == "" } {
  420.     set macType "Mac"
  421. }
  422. if { $chanType == "" } {
  423.     set chanType "Channel"
  424. }
  425. if { $phyType == ""} {
  426.     set phyType "Phy/WiredPhy"
  427. }
  428.     
  429. if {[string compare $macType "Mac/Csma/Cd"] == 0} {
  430.     puts "Warning: Mac/Csma/Cd is out of date"
  431.     puts "Warning: Please use Mac/802_3 to replace Mac/Csma/Cd"
  432.     set macType "Mac/802_3"
  433. }
  434. set lan [new LanNode $self 
  435. -bw $bw 
  436. -delay $delay 
  437. -llType $llType 
  438. -ifqType $ifqType 
  439. -ifqLen $ifqLen 
  440. -macType $macType 
  441. -chanType $chanType 
  442. -phyType $phyType 
  443. -mactrace $mactrace]
  444. $lan addNode $nodelist $bw $delay $llType $ifqType $macType 
  445. $phyType $mactrace $ifqLen
  446. return $lan
  447. }