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

📄 ns-address.tcl

📁 R. Lo Cigno, P. Larcheri 802.11e closed-loop scheduling Description: ns-2 package for 802.11e clo
💻 TCL
字号:
## Copyright (c) 1996 Regents of the University of California.# All rights reserved.# # Redistribution and use in source and binary forms, with or without# modification, are permitted provided that the following conditions# are met:# 1. Redistributions of source code must retain the above copyright#    notice, this list of conditions and the following disclaimer.# 2. Redistributions in binary form must reproduce the above copyright#    notice, this list of conditions and the following disclaimer in the#    documentation and/or other materials provided with the distribution.# 3. All advertising materials mentioning features or use of this software#    must display the following acknowledgement:# 	This product includes software developed by the MASH Research# 	Group at the University of California Berkeley.# 4. Neither the name of the University nor of the Research Group may be#    used to endorse or promote products derived from this software without#    specific prior written permission.# # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF# SUCH DAMAGE.####################################################################################### API's for allocating bits to ns addressing structure# These routines should be used for setting bits for portid (agent), for nodeid # (flat or hierarchical).# DEFADDRSIZE_ and MAXADDRSIZE_ defined in ns-default.tcl# Name :        set-address-format ()# Options :     default, expanded, hierarchical (default) and hierarchical#		(with specific allocations) # Synopsis :    set-address-format <option> <additional info, if required# 		by option> ## Option:1      def (default settings)# Synopsis :    set-address-format def# Currently 32 bit address space is the default feature in ns # (OLD) Description:  This allows default settings in the following manner:#               * 8bits portid#               * 1 bit for mcast and 7 bits nodeid (mcast should be enabled#               before Simulator is inited (new Simulator is called)--> leads # 		to unnecessary wasting of 1 bit even if mcast is not set.# [This is obsoleted by default 32 bit address space]# Option 2:     expanded # Synopsis :    set-address-format expanded# Description:  This allows to expand the address space from default size 16 # 		to 32 with bit allocated to the field in the foll manner:#               * 8bits portid#               * 1 bit for mcast and 21 bits nodeid (and same comments # 		regarding setting mcast as for default option above)## Option :3     hierarchical (default)# Synopsis :    set-address-format hierarchical# Description:  This allows setting of hierarchical address as follows:#                   * Sets 8bits portid#                   * Sets mcast bit (if specified)#                   * Sets default hierchical levels with:#                      * 3 levels of hierarchy and#                      * (10 11 11) by default #                      * (9 11 11) if mcast is enabled.## Option 4:     hierarchical (specified)# Synopsis:     set-address-format hierarchical <#n hierarchy levels> #		<#bits for level1> <#bits for level 2> ....#		<#bits for nth level>#               e.g  #                   set-address-format hierarchical 4 2 2 2 10# Description:  This allows setting of hierarchical address as specified for #		each level.#                 * Sets 8bits portid#                 * Sets mcast bit (if specified)#                 * Sets hierchical levels with bits specified for each level.# Name:         expand-port-field-bits ()# Synopsis:     expand-port-field-bits <#bits for portid> # Status:	Obsolete.  It is no longer needed in the 32-bit addressing#		scheme# Description : This should be used incase of need to extend portid. #               This commnad may be used in conjuction with #               set-address-format command explained above.#               expand-port-field-bits checks and raises error in the foll. #		cases#                 * if the requested portsize cannot be accomodated (i.e  #                   if sufficient num.of free bits are not available)#                 * if requested portsize is less than equal to existing #		    portsize, and incase of no errors sets port field with # 		    bits as specified.## Errors: 	* if # of bits specified less than 0.#               * if bit positions clash (contiguous # of requested free bits #		  not found)#               * if total # of bits exceed MAXADDRSIZE_#               * if expand-port-field-bits is attempted with portbits less or#		  equal to the existing portsize.#               * if # hierarchy levels donot match with #bits specified (for#                 each level). Class AllocAddrBitsSimulator proc address-format {} {	return [Simulator set AddressFormat_]}Simulator proc default-addr? {} {	if { [Simulator set AddressFormat_] == "DEF" } {		return 1	} else { 		return 0	}}Simulator proc hier-addr? {} {	if { [Simulator set AddressFormat_] == "HIER" } {		return 1	} else {		return 0	}}Simulator instproc set-address-format {opt args} {	set len [llength $args]	if {[string compare $opt "def"] == 0} {		$self set-address 32		set mcastshift [AddrParams McastShift]		Simulator set McastAddr_ [expr 1 << $mcastshift]		mrtObject expandaddr		Simulator set AddressFormat_ DEF	} elseif {[string compare $opt "expanded"] == 0} {		puts "set-address-format expanded is obsoleted by 32-bit addressing."	} elseif {[string compare $opt "hierarchical"] == 0 && $len == 0} {		if [$self multicast?] {			$self set-hieraddress 3 9 11 11		} else {			$self set-hieraddress 3 10 11 11		}	} elseif {[string compare $opt "hierarchical"] == 0 && $len > 0} {		eval $self set-hieraddress [lindex $args 0] \				[lrange $args 1 [expr $len - 1]]	} else {		error "ns-address.tcl:set-address-format: Unknown address format $opt"	}}Simulator instproc set-hieraddress {hlevel args} {	set a [$self get-AllocAddrBits "new"]	$a set size_ [AllocAddrBits set MAXADDRSIZE_]	# By default, setting hierarchical addressing turns on hier rtg	Simulator set AddressFormat_ HIER	Node enable-module "Hier"	if [$self multicast?] {		$a set-mcastbits 1	}	eval $a set-idbits $hlevel $args}# Sets address for nodeid and port fields# The order of setting bits for different fields does matter and should # be as follows:#   mcast#   idbits#   portbits# this is true for both set-address and set-hieraddressSimulator instproc set-address {node} {	set a [$self get-AllocAddrBits "new"]	$a set size_ [AllocAddrBits set DEFADDRSIZE_]	if {[expr $node] > [$a set size_]} {		$a set size_ [AllocAddrBits set MAXADDRSIZE_]	}			# One bit is set aside for mcast as default :: this waste of 1 bit 	# may be avoided, if mcast option is enabled before the initialization	# of Simulator.	$a set-mcastbits 1	set lastbit [expr $node - [$a set mcastsize_]]	$a set-idbits 1 $lastbit}Simulator instproc get-AllocAddrBits {prog} {	$self instvar allocAddr_	if ![info exists allocAddr_] {		set allocAddr_ [new AllocAddrBits]	} elseif ![string compare $prog "new"] {		set allocAddr_ [new AllocAddrBits]	}	return $allocAddr_}Simulator instproc expand-port-field-bits nbits {	# The function is obsolete, given that ports are now 32 bits wide	puts "Warning: Simulator::expand-port-field-bits is obsolete.  Ports are 32 bits wide"	return}Simulator instproc expand-address {} {	puts "Warning: Simulator::expand-address is obsolete.  The node address is 32 bits wide"	return}AllocAddrBits instproc init {} {	eval $self next	$self instvar size_ portsize_ idsize_ mcastsize_	set size_ 0	set portsize_ 0	set idsize_ 0	set mcastsize_ 0}AllocAddrBits instproc get-AllocAddr {} {	$self instvar addrStruct_	if ![info exists addrStruct_] {		set addrStruct_ [new AllocAddr]	}	return $addrStruct_}AllocAddrBits instproc get-Address {} {	$self instvar address_	if ![info exists address_] {		set address_ [new Address]	}	return $address_}AllocAddrBits instproc chksize {bit_num prog} {	$self instvar size_ portsize_ idsize_ mcastsize_  	if {$bit_num <= 0 } {		error "$prog : \# bits less than 1"	}	set totsize [expr $portsize_ + $idsize_ + $mcastsize_]	if {$totsize > [AllocAddrBits set MAXADDRSIZE_]} {		error "$prog : Total \# bits exceed MAXADDRSIZE"	}	if { $size_ < [AllocAddrBits set MAXADDRSIZE_]} {		if {$totsize > [AllocAddrBits set DEFADDRSIZE_]} {			set size_ [AllocAddrBits set MAXADDRSIZE_]			return 1		} 	}	return 0}AllocAddrBits instproc set-portbits {bit_num} {	# The function is obsolete, given that ports are now 32 bits wide	puts "Warning: AllocAddrBits::set-portbits is obsolete.  Ports are 32 bits wide."	return}AllocAddrBits instproc expand-portbits nbits {	# The function is obsolete, given that ports are now 32 bits wide	puts "Warning: AllocAddrBits::expand-portbits is obsolete.  Ports are 32 bits wide."	return}AllocAddrBits instproc set-mcastbits {bit_num} {	$self instvar size_ mcastsize_	if {$bit_num != 1} {		error "setmcast : mcastbit > 1"	}	set mcastsize_ $bit_num	#chk to ensure there;s no change in size	if [$self chksize mcastsize_ "setmcast"] {		# assert {$chk == 0} --> assert doesn't seem to work		error "set-mcastbits: size_ has been changed."	}	set a [$self get-AllocAddr] 	set v [$a setbit $bit_num $size_]	AddrParams McastMask [lindex $v 0]	AddrParams McastShift [lindex $v 1]	### TESTING	# set mask [lindex $v 0]	# set shift [lindex $v 1]	# puts "Mcastshift = $shift \n McastMask = $mask\n"	set ad [$self get-Address]	$ad mcastbits-are [AddrParams McastShift] [AddrParams McastMask]}AllocAddrBits instproc set-idbits {nlevel args} {	$self instvar size_ portsize_ idsize_ hlevel_ hbits_	if {$nlevel != [llength $args]} {		error "setid: hlevel < 1 OR nlevel and \# args donot match"	}	set a [$self get-AllocAddr] 	set old 0	set idsize_ 0	set nodebits 0	# Set two global variables	AddrParams hlevel $nlevel	set hlevel_ $nlevel	for {set i 0} {$i < $nlevel} {incr i} {		set bpl($i) [lindex $args $i]		set idsize_ [expr $idsize_ + $bpl($i)]				# check to ensure there's no change in size		set chk [$self chksize $bpl($i) "setid"]		# assert {$chk ==0}		if {$chk > 0} {			error "set-idbits: size_ has been changed."		}		set v [$a setbit $bpl($i) $size_]		AddrParams NodeMask [expr $i+1] [lindex $v 0]		set m([expr $i+1]) [lindex $v 0]		AddrParams NodeShift [expr $i+1] [lindex $v 1]		set s([expr $i+1]) [lindex $v 1]		lappend hbits_ $bpl($i)			}	AddrParams nodebits $idsize_	set ad [$self get-Address]	eval $ad idsbits-are [array get s]	eval $ad idmbits-are [array get m]	eval $ad bpl-are $hbits_	### TESTING	# set mask [lindex $v 0]	# set shift [lindex $v 1]	# puts "Nodeshift = $shift \n NodeMask = $mask\n"}# Create an integer address from addr string AddrParams proc addr2id addrstr {	if [Simulator hier-addr?] {		set addressObj [[[Simulator instance] get-AllocAddrBits ""] \				get-Address]		return [$addressObj str2addr $addrstr]	} else {		return [expr $addrstr & [AddrParams NodeMask 1] << \				[AddrParams NodeShift 1]]	}}# Returns address string from an integer address: reverse of set-hieraddr.AddrParams proc id2addr addr {	for {set i 1} {$i <= [AddrParams hlevel]} {incr i} {		set a [expr ($addr >> [AddrParams NodeShift $i]) & \				[AddrParams NodeMask $i]]		lappend str $a	}	return $str}# Splitting up address stringAddrParams proc split-addrstr addrstr {	return [split $addrstr .]}# Returns number of elements at a given hierarchical level, that is visible to # a node.AddrParams proc elements-in-level? {nodeaddr level} {	AddrParams instvar domain_num_ cluster_num_ nodes_num_ 	set L [AddrParams split-addrstr $nodeaddr]	set level [expr $level + 1]	#	# if no topology info found for last level, set default values	#		# For now, assuming only 3 levels of hierarchy 	if { $level == 1} {		return $domain_num_	}	if { $level == 2} {		return [lindex $cluster_num_ [lindex $L 0]]	}	if { $level == 3} {		set C 0		set index 0		while {$C < [lindex $L 0]} {			set index [expr $index + [lindex $cluster_num_ $C]]			incr C		}		return [lindex $nodes_num_ [expr $index + [lindex $L 1]]]	}}

⌨️ 快捷键说明

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