📄 ns-node.tcl
字号:
## 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 + -