⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vlan.tcl

📁 NS-2.28的802.11e协议扩展源代码
💻 TCL
字号:
## vlan.tcl## Copyright (c) 1997 University of Southern California.# All rights reserved.                                            #                                                                # Redistribution and use in source and binary forms are permitted# provided that the above copyright notice and this paragraph are# duplicated in all such forms and that any documentation, advertising# materials, and other materials related to such distribution and use# acknowledge that the software was developed by the University of# Southern California, Information Sciences Institute.  The name of the# University may not be used to endorse or promote products derived from# this software without specific prior written permission.# # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.# # LanNode----------------------------------------------------## Lan implementation as a virtual node: LanNode mimics a real# node and uses an address (id) from Node's address space## WARNING: if used with hierarchical routing, one has to assign# a hierarchical address to the lan itself.  This maybe confusing.#------------------------------------------------------------Class LanNodeLanNode set ifqType_   Queue/DropTailLanNode set llType_    LL#LanNode set macType_   Mac/Csma/CdLanNode set macType_   MacLanNode set chanType_  ChannelLanNode set phyType_   Phy/WiredPhyLanNode set address_   ""LanNode instproc address  {val} { $self set address_  $val }LanNode instproc bw       {val} { $self set bw_       $val }LanNode instproc delay    {val} { $self set delay_    $val }LanNode instproc ifqType  {val} { $self set ifqType_  $val }LanNode instproc llType   {val} { $self set llType_   $val }LanNode instproc macType  {val} { $self set macType_  $val }LanNode instproc chanType {val} { $self set chanType_ $val }LanNode instproc phyType  {val} { $self set phyType_  $val }LanNode instproc init {ns args} {	set args [eval $self init-vars $args]	$self instvar bw_ delay_ ifqType_ llType_ macType_ chanType_	$self instvar phyType_	$self instvar ns_ nodelist_ defRouter_ cost_	$self instvar id_ address_ channel_ mcl_ varp_	$ns instvar Node_	$self next	set ns_ $ns	set nodelist_ ""	set cost_ 1	set id_ [Node getid]	set Node_($id_) $self	if [Simulator set EnableHierRt_] {		if {$address_ == ""} {			error "LanNode: use \"-address\" option \					with hierarchical routing"		}	} else {		set address_ $id_	}	set defRouter_ [new LanRouter $ns $self]	if [$ns multicast?] {		set switch_ [new Classifier/Hash/Dest 32]		$switch_ set mask_ [AddrParams set McastMask_]		$switch_ set shift_ [AddrParams set McastShift_]		$defRouter_ switch $switch_	}	set channel_ [new $chanType_]	set varp_ [new VARPTable]	#set mcl_ [new Classifier/Mac]	#$mcl_ set offset_ [PktHdr_offset PacketHeader/Mac macDA_]	#$channel_ target $mcl_}LanNode instproc addNode {nodes bw delay {llType ""} {ifqType ""} \		{macType ""} {phyType ""}} {	$self instvar ifqType_ llType_ macType_ chanType_ phyType_	$self instvar id_ channel_ mcl_ lanIface_	$self instvar ns_ nodelist_ cost_ varp_	$ns_ instvar link_ Node_ 	if {$ifqType == ""} { set ifqType $ifqType_ }	if {$macType == ""} { set macType $macType_ }	if {$llType  == ""} { set llType $llType_ }	if {$phyType  == ""} { set phyType $phyType_ }	set vlinkcost [expr $cost_ / 2.0]	foreach src $nodes {		set nif [new LanIface $src $self \				-ifqType $ifqType \				-llType  $llType \				-macType $macType \				-phyType $phyType]				set tr [$ns_ get-ns-traceall]		if {$tr != ""} {			$nif trace $ns_ $tr		}		set tr [$ns_ get-nam-traceall]		if {$tr != ""} {			$nif nam-trace $ns_ $tr		}				set ll [$nif set ll_]		$ll set delay_ $delay		$ll varp $varp_				$varp_ mac-addr [[$nif set node_] id] \				[[$nif set mac_] id]				set phy [$nif set phy_]		$phy node $src		$phy channel $channel_		$channel_ addif $phy		$phy set bandwidth_ $bw		set lanIface_($src) $nif		$src add-neighbor $self		set sid [$src id]		set link_($sid:$id_) [new Vlink $ns_ $self $src  $self $bw 0]		set link_($id_:$sid) [new Vlink $ns_ $self $self $src  $bw 0]		$src add-oif [$link_($sid:$id_) head]  $link_($sid:$id_)		$src add-iif [[$nif set iface_] label] $link_($id_:$sid)		[$link_($sid:$id_) head] set link_ $link_($sid:$id_)		$link_($sid:$id_) queue [$nif set ifq_]		$link_($id_:$sid) queue [$nif set ifq_]		$link_($sid:$id_) set iif_ [$nif set iface_]		$link_($id_:$sid) set iif_ [$nif set iface_]		$link_($sid:$id_) cost $vlinkcost		$link_($id_:$sid) cost $vlinkcost	}	set nodelist_ [concat $nodelist_ $nodes]}LanNode instproc assign-mac {ip} {	return $ip ;# use ip addresses at MAC layer}LanNode instproc cost c {	$self instvar ns_ nodelist_ id_ cost_	$ns_ instvar link_	set cost_ $c	set vlinkcost [expr $c / 2.0]	foreach node $nodelist_ {		set nid [$node id]		$link_($id_:$nid) cost $vlinkcost		$link_($nid:$id_) cost $vlinkcost	}}LanNode instproc cost? {} {	$self instvar cost_	return $cost_}LanNode instproc rtObject? {} {	# NOTHING}LanNode instproc id {} { $self set id_ }LanNode instproc node-addr {{addr ""}} { 	eval $self set address_ $addr}LanNode instproc reset {} {	# NOTHING: needed for node processing by ns routing}LanNode instproc is-lan? {} { return 1 }LanNode instproc dump-namconfig {} {	# Redefine this function if want a different lan layout	$self instvar ns_ bw_ delay_ nodelist_ id_	$ns_ puts-nam-config \			"X -t * -n $id_ -r $bw_ -D $delay_ -o left"	set cnt 0	set LanOrient(0) "up"	set LanOrient(1) "down"		foreach n $nodelist_ {		$ns_ puts-nam-config \				"L -t * -s $id_ -d [$n id] -o $LanOrient($cnt)"		set cnt [expr 1 - $cnt]	}}LanNode instproc init-outLink {} { 	#NOTHING}LanNode instproc start-mcast {} { 	# NOTHING}LanNode instproc getArbiter {} {	# NOTHING}LanNode instproc attach {agent} {	# NOTHING}LanNode instproc add-route {args} {	# NOTHING: use defRouter to find routes}LanNode instproc add-hroute {args} {	# NOTHING: use defRouter to find routes}LanNode instproc split-addrstr addrstr {	set L [split $addrstr .]	return $L}# LanIface---------------------------------------------------## node's interface to a LanNode#------------------------------------------------------------Class LanIface LanIface set ifqType_ Queue/DropTail#LanIface set macType_ Mac/Csma/CdLanIface set macType_ MacLanIface set llType_  LLLanIface set phyType_  Phy/WiredPhyLanIface instproc llType {val} { $self set llType_ $val }LanIface instproc ifqType {val} { $self set ifqType_ $val }LanIface instproc macType {val} { $self set macType_ $val }LanIface instproc phyType {val} { $self set phyType_ $val }LanIface instproc entry {} { $self set entry_ }LanIface instproc init {node lan args} {	set args [eval $self init-vars $args]	eval $self next $args	$self instvar llType_ ifqType_ macType_ phyType_	$self instvar node_ lan_ ifq_ mac_ ll_ phy_	$self instvar iface_ entry_ drophead_	set node_ $node	set lan_ $lan	set ll_ [new $llType_]	set ifq_ [new $ifqType_]	set mac_ [new $macType_]	set iface_ [new NetworkInterface]	set phy_ [new $phyType_]	set entry_ [new Connector]	set drophead_ [new Connector]	$ll_ set macDA_ -1	;# bcast address if there is no LAN router	$ll_ lanrouter [$lan set defRouter_]	$ll_ up-target $iface_	$ll_ down-target $ifq_	$ll_ mac $mac_		$ifq_ target $mac_		#$mac_ target $ll_	$mac_ up-target $ll_	$mac_ down-target $phy_	$mac_ netif $phy_		$phy_ up-target $mac_	$node addInterface $iface_	$iface_ target [$node entry]	$entry_ target $ll_	set ns [Simulator instance]		#drophead is the same for all drops in the lan	$drophead_ target [$ns set nullAgent_]	$ifq_ drop-target $drophead_ 	$mac_ drop-target $drophead_ 	$ll_ drop-target $drophead_}LanIface instproc trace {ns f {op ""}} {	$self instvar hopT_ rcvT_ enqT_ deqT_ drpT_ 	$self instvar iface_ entry_ node_ lan_ drophead_ 	$self instvar ll_ ifq_	set hopT_ [$ns create-trace Hop   $f $node_ $lan_  $op]	set rcvT_ [$ns create-trace Recv  $f $lan_  $node_ $op]	set enqT_ [$ns create-trace Enque $f $node_ $lan_  $op]	set deqT_ [$ns create-trace Deque $f $node_ $lan_  $op]	set drpT_ [$ns create-trace Drop  $f $node_ $lan_  $op]	$hopT_ target [$entry_ target]	$entry_ target $hopT_	$rcvT_ target [$iface_ target]	$iface_ target $rcvT_	$enqT_ target [$ll_ down-target]	$ll_ down-target $enqT_	$deqT_ target [$ifq_ target]	$ifq_ target $deqT_	$drpT_ target [$drophead_ target]	$drophead_ target $drpT_}# should be called after LanIface::traceLanIface instproc nam-trace {ns f} {	$self instvar hopT_ rcvT_ enqT_ deqT_ drpT_ 	if [info exists hopT_] {		$hopT_ namattach $f	} else {		$self trace $ns $f "nam"	}	$rcvT_ namattach $f	$enqT_ namattach $f	$deqT_ namattach $f	$drpT_ namattach $f}LanIface instproc add-receive-filter filter {	$self instvar mac_	$filter target [$mac_ target]	$mac_ target $filter}# Vlink------------------------------------------------------## Virtual link  implementation. Mimics a Simple Link but with# zero delay and infinite bandwidth#------------------------------------------------------------Class VlinkVlink instproc up? {} {	return "up"}Vlink instproc queue {{q ""}} {	eval $self set queue_ $q}Vlink instproc init {ns lan src dst b d} {	$self instvar ns_ lan_ src_ dst_ bw_ delay_	set ns_ $ns	set lan_ $lan	set src_ $src	set dst_ $dst	set bw_ $b	set delay_ $d}Vlink instproc src {}	{ $self set src_	}Vlink instproc dst {}	{ $self set dst_	}Vlink instproc dump-nam-queueconfig {} {	#NOTHING}Vlink instproc head {} {	$self instvar lan_ dst_ src_	if {$src_ == $lan_ } {		# if this is a link FROM the lan vnode, 		# it doesn't matter what we return, because		# it's only used by $lan add-route (empty)		return ""	} else {		# if this is a link TO the lan vnode, 		# return the entry to the lanIface object		set src_lif [$lan_ set lanIface_($src_)]		return [$src_lif entry]	}}Vlink instproc cost c { $self set cost_ $c}	Vlink instproc cost? {} {	$self instvar cost_	if ![info exists cost_] {		return 1	}	return $cost_}# LanRouter--------------------------------------------------## "Virtual node lan" needs to know which of the lan nodes is# the next hop towards the packet's (maybe remote) destination.#------------------------------------------------------------LanRouter instproc init {ns lan} {	$self next	Simulator instvar EnableHierRt_	if {$EnableHierRt_} {		$self routing hier	} else {		$self routing flat	}	$self lanaddr [$lan node-addr]	$self routelogic [$ns get-routelogic]}Node instproc is-lan? {} { return 0 }## newLan:  create a LAN from a sete of nodes#Simulator instproc newLan {nodelist bw delay args} {	set lan [eval new LanNode $self -bw $bw -delay $delay $args]	$lan addNode $nodelist $bw $delay	return $lan}# For convenience, use make-lan.  For more fine-grained control,# use newLan instead of make-lan.#{macType Mac/Csma/Cd} -> for now support for only MacSimulator instproc make-lan {nodelist bw delay \		{llType LL} \		{ifqType Queue/DropTail} \		{macType Mac} \		{chanType Channel} \		{phyType Phy/WiredPhy}} {	if {[string compare $macType "Mac/Csma/Cd"] == 0} {	    puts "Warning: Mac/Csma/Cd is out of date"	    puts "Warning: Please use Mac/802_3 to replace Mac/Csma/Cd"	    set macType "Mac/802_3"	}	set lan [new LanNode $self \			-bw $bw \			-delay $delay \			-llType $llType \			-ifqType $ifqType \			-macType $macType \			-chanType $chanType \			-phyType $phyType]	$lan addNode $nodelist $bw $delay $llType $ifqType $macType \			$phyType		return $lan}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -