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

📄 ns-node.tcl

📁 ns gpsr路由协议 在ns2平台下实现的 对大家很有好处
💻 TCL
📖 第 1 页 / 共 2 页
字号:
## Copyright (c) 1996-1998 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.## @(#) $Header: /home/mole/u0/bkarp/cvsroot/ns-2.1b6/tcl/lib/ns-node.tcl,v 1.1.1.1 1999/07/29 03:27:35 bkarp Exp $## for MobileIP Classifier/Addr/Reserve instproc init args {        eval $self next        $self reserve-port 2}#Class NodeNode set nn_ 0Node proc getid {} {	set id [Node set nn_]	Node set nn_ [expr $id + 1]	return $id}Node instproc init args {	eval $self next $args	$self instvar np_ id_ agents_ dmux_ neighbor_ rtsize_	set neighbor_ ""	set agents_ ""	set dmux_ ""	set np_ 0	set id_ [Node getid]        set rtsize_ 0	$self mk-default-classifier}## splitting up address str: used by other non-hier classesNode instproc split-addrstr addrstr {	set L [split $addrstr .]	return $L}Node instproc mk-default-classifier {} {    $self instvar address_ classifier_ id_    set classifier_ [new Classifier/Addr]    # set up classifer as a router (default value 8 bit of addr and 8 bit port)    $classifier_ set mask_ [AddrParams set NodeMask_(1)]    $classifier_ set shift_ [AddrParams set NodeShift_(1)]    if ![info exists address_] {	    set address_ $id_	}}Node instproc enable-mcast sim {	$self instvar classifier_ multiclassifier_ ns_ switch_ mcastproto_	$self set ns_ $sim		$self set switch_ [new Classifier/Addr]	#	# set up switch to route unicast packet to slot 0 and	# multicast packets to slot 1	#		[$self set switch_] set mask_ [AddrParams set McastMask_]	[$self set switch_] set shift_ [AddrParams set McastShift_]		#	# create a classifier for multicast routing	#	$self set multiclassifier_ [new Classifier/Multicast/Replicator]	[$self set multiclassifier_] set node_ $self		$self set mrtObject_ [new mrtObject $self]	$switch_ install 0 $classifier_	$switch_ install 1 $multiclassifier_	}Node instproc add-neighbor p {	$self instvar neighbor_	lappend neighbor_ $p}## increase the routing table size counter - keeps track of rtg table # size for each node#Node instproc incr-rtgtable-size {} {	$self instvar rtsize_	set rtsize_ [expr $rtsize_ + 1]}Node instproc entry {} {	if [info exists router_supp_] {		return $router_supp_	}	if ![info exist ns_] {		set ns_ [Simulator instance]	}	if [$ns_ multicast?] {		$self instvar switch_		return $switch_	}	$self instvar classifier_	return $classifier_}Node instproc add-route { dst target } {	$self instvar classifier_	$classifier_ install $dst $target	$self incr-rtgtable-size}Node instproc id {} {	$self instvar id_	return $id_}Node instproc node-addr {} {	$self instvar address_	return $address_}Node instproc alloc-port { nullagent } {	$self instvar dmux_ np_	set p [$dmux_ alloc-port $nullagent]	if { $np_ < $p } {		set np_ $p	}	if {$np_ > [$dmux_ set mask_] } {		puts stderr "No of ports($np_) attached to $self node is greater than allowed"	}		return $p}## Attach an agent to a node.  Pick a port and# bind the agent to the port number.#Node instproc attach { agent { port "" } } {	$self instvar agents_ address_ dmux_ classifier_	$self instvar classifiers_	#	# assign port number (i.e., this agent receives	# traffic addressed to this host and port)	#	lappend agents_ $agent	#	# Check if number of agents exceeds length of port-address-field size	#	set mask [AddrParams set PortMask_]	set shift [AddrParams set PortShift_]		if {[expr [llength $agents_] - 1] > $mask} {		error "\# of agents attached to node $self exceeds port-field length of $mask bits\n"	}	#	# Attach agents to this node (i.e., the classifier inside).	# We call the entry method on ourself to find the front door	# (e.g., for multicast the first object is not the unicast	#  classifier)	# Also, stash the node in the agent and set the	# local addr of this agent.	#	$agent set node_ $self		if [Simulator set EnableHierRt_] {	    set nodeaddr [AddrParams set-hieraddr $address_]	    	} else {	    set nodeaddr [expr ( $address_ & [AddrParams set NodeMask_(1)] ) <<	[AddrParams set NodeShift_(1) ]]	}		#	# If a port demuxer doesn't exist, create it.	#		if { $dmux_ == "" } {		set dmux_ [new Classifier/Addr]		$dmux_ set mask_ $mask		$dmux_ set shift_ $shift				#		# point the node's routing entry to itself		# at the port demuxer (if there is one)		#	    if {[Simulator set EnableHierRt_]} {		$self add-hroute $address_ $dmux_	    } else {		$self add-route $address_ $dmux_	    }	}	if {$port == ""} {		set ns_ [Simulator instance]		$ns_ instvar nullAgent_		set port [$self alloc-port $nullAgent_]	}	$agent set portID_ $port			$agent set addr_ [expr (($port & $mask) << $shift) | ( ~($mask << $shift) & $nodeaddr)]		$self add-target $agent $port}## add target to agent and add entry for port-id in port-dmux#Node instproc add-target {agent port} {	$self instvar dmux_	#	# Send Target	#	$agent target [$self entry]		#	# Recv Target	#	$dmux_ install $port $agent}		## Detach an agent from a node.#Node instproc detach { agent nullagent } {	$self instvar agents_ dmux_	#	# remove agent from list	#	set k [lsearch -exact $agents_ $agent]	if { $k >= 0 } {		set agents_ [lreplace $agents_ $k $k]	}		#	# sanity -- clear out any potential linkage	#	$agent set node_ ""	$agent set addr_ 0	$agent target $nullagent		set port [$agent set portID_]		#Install nullagent to sink transit packets   	#    $dmux_ clear $port	$dmux_ install $port $nullagent}Node instproc agent port {	$self instvar agents_	foreach a $agents_ {		if { [$a set portID_] == $port } {			return $a		}	}	return ""}## reset all agents attached to this node#Node instproc reset {} {	$self instvar agents_	foreach a $agents_ {		$a reset	}}## Some helpers#Node instproc neighbors {} {	$self instvar neighbor_	return [lsort $neighbor_]}## Helpers for interface stuff#Node instproc attachInterfaces ifs {	$self instvar ifaces_	set ifaces_ $ifs	foreach ifc $ifaces_ {		$ifc setNode $self	}}

⌨️ 快捷键说明

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