?? ns-mobilenode.tcl
字號:
# -*- Mode:tcl; tcl-indent-level:8; tab-width:8; indent-tabs-mode:t -*-## Copyright (c) 1998-2000 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: /cvsroot/nsnam/ns-2/tcl/lib/ns-mobilenode.tcl,v 1.55 2005/09/22 18:34:03 haldar Exp $## Ported from CMU-Monarch project's mobility extensions -Padma, 10/98.## IT IS NOT ENCOURAGED TO SUBCLASSS MOBILENODE CLASS DEFINED IN THIS FILE#======================================================================# The ARPTable class#======================================================================ARPTable instproc init args { eval $self next $args ;# parent class constructor}ARPTable set bandwidth_ 0ARPTable set delay_ 5us#======================================================================# The Node/MobileNodeNode class#======================================================================Node/MobileNode instproc init args {# # I don't care about address classifier; it's not my business# # All I do is to setup port classifier so we can do broadcast, # # and to set up interface stuff.# $self attach-node $node# $node port-notify $self eval $self next $args $self instvar nifs_ arptable_ X_ Y_ Z_ nodetype_ set X_ 0.0 set Y_ 0.0 set Z_ 0.0 set arptable_ "" ;# no ARP table yet set nifs_ 0 ;# number of network interfaces # Mobile IP node processing $self makemip-New$nodetype_}#----------------------------------------------------------------------# XXX Following are the last remnant of nodetype_. Need to be completely # removed, however, we need a better mechanism to distinguish vanilla # mobile node from MIP base station, and MIP mobile host.Node/MobileNode instproc makemip-NewMobile {} {}Node/MobileNode instproc makemip-NewBase {} {}Node/MobileNode instproc makemip-New {} {}Node/MobileNode instproc makemip-NewMIPBS {} { $self instvar regagent_ encap_ decap_ agents_ id_ set dmux [new Classifier/Port/Reserve] $dmux set mask_ 0x7fffffff $dmux set shift_ 0 $self install-demux $dmux set regagent_ [new Agent/MIPBS $self] $self attach $regagent_ [Node/MobileNode set REGAGENT_PORT] $self attach-encap $self attach-decap}Node/MobileNode instproc attach-encap {} { $self instvar encap_ set encap_ [new MIPEncapsulator] $encap_ set mask_ [AddrParams NodeMask 1] $encap_ set shift_ [AddrParams NodeShift 1] #set mask 0x7fffffff #set shift 0 set nodeaddr [AddrParams addr2id [$self node-addr]] $encap_ set addr_ [expr ( ~([AddrParams NodeMask 1] << \ [AddrParams NodeShift 1]) & $nodeaddr )] $encap_ set port_ 1 $encap_ target [$self entry] $encap_ set node_ $self}Node/MobileNode instproc attach-decap {} { $self instvar decap_ dmux_ agents_ set decap_ [new Classifier/Addr/MIPDecapsulator] lappend agents_ $decap_ $decap_ set mask_ [AddrParams NodeMask 1] $decap_ set shift_ [AddrParams NodeShift 1] $dmux_ install [Node/MobileNode set DECAP_PORT] $decap_}Node/MobileNode instproc makemip-NewMIPMH {} { $self instvar regagent_ set dmux [new Classifier/Port/Reserve] $dmux set mask_ 0x7fffffff $dmux set shift_ 0 $self install-demux $dmux set regagent_ [new Agent/MIPMH $self] $self attach $regagent_ [Node/MobileNode set REGAGENT_PORT] $regagent_ set mask_ [AddrParams NodeMask 1] $regagent_ set shift_ [AddrParams NodeShift 1] $regagent_ set dst_addr_ [expr (~0) << [AddrParams NodeShift 1]] $regagent_ set dst_port_ 0 $regagent_ node $self}#----------------------------------------------------------------------Node/MobileNode instproc reset {} { $self instvar arptable_ nifs_ netif_ mac_ ifq_ ll_ imep_ for {set i 0} {$i < $nifs_} {incr i} { $netif_($i) reset $mac_($i) reset $ll_($i) reset $ifq_($i) reset if { [info exists opt(imep)] && $opt(imep) == "ON" } { $imep_($i) reset } } if { $arptable_ != "" } { $arptable_ reset }}## Attach an agent to a node. Pick a port and# bind the agent to the port number.# if portnumber is 255, default target is set to the routing agent#Node/MobileNode instproc add-target { agent port } { $self instvar dmux_ imep_ toraDebug_ set ns [Simulator instance] set newapi [$ns imep-support] $agent set sport_ $port # special processing for TORA/IMEP node set toraonly [string first "TORA" [$agent info class]] if {$toraonly != -1 } { $agent if-queue [$self set ifq_(0)] ;# ifq between LL and MAC # # XXX: The routing protocol and the IMEP agents needs handles # to each other. # $agent imep-agent [$self set imep_(0)] [$self set imep_(0)] rtagent $agent } # Special processing for AODV set aodvonly [string first "AODV" [$agent info class]] if {$aodvonly != -1 } { $agent if-queue [$self set ifq_(0)] ;# ifq between LL and MAC } #<zheng: add> # Special processing for ZBR #set zbronly [string first "ZBR" [$agent info class]] #if {$zbronly != -1 } { # $agent if-queue [$self set ifq_(0)] ;# ifq between LL and MAC #} #</zheng: add> if { $port == [Node set rtagent_port_] } { # Ad hoc routing agent setup needs special handling $self add-target-rtagent $agent $port return } # Attaching a normal agent set namfp [$ns get-nam-traceall] if { [Simulator set AgentTrace_] == "ON" } { # # Send Target # if {$newapi != ""} { set sndT [$self mobility-trace Send "AGT"] } else { set sndT [cmu-trace Send AGT $self] } if { $namfp != "" } { $sndT namattach $namfp } $sndT target [$self entry] $agent target $sndT # # Recv Target # if {$newapi != ""} { set rcvT [$self mobility-trace Recv "AGT"] } else { set rcvT [cmu-trace Recv AGT $self] } if { $namfp != "" } { $rcvT namattach $namfp } $rcvT target $agent $dmux_ install $port $rcvT } else { # # Send Target # $agent target [$self entry] # # Recv Target # $dmux_ install $port $agent }}Node/MobileNode instproc add-target-rtagent { agent port } { $self instvar imep_ toraDebug_ set ns [Simulator instance] set newapi [$ns imep-support] set namfp [$ns get-nam-traceall] set dmux_ [$self demux] set classifier_ [$self entry] # let the routing agent know about the port dmux $agent port-dmux $dmux_ if { [Simulator set RouterTrace_] == "ON" } { # # Send Target # if {$newapi != ""} { set sndT [$self mobility-trace Send "RTR"] } else { set sndT [cmu-trace Send "RTR" $self] } if { $namfp != "" } { $sndT namattach $namfp } if { $newapi == "ON" } { $agent target $imep_(0) $imep_(0) sendtarget $sndT # second tracer to see the actual # types of tora packets before imep packs them if { [info exists toraDebug_] && $toraDebug_ == "ON"} { set sndT2 [$self mobility-trace Send "TRP"] $sndT2 target $imep_(0) $agent target $sndT2 } } else { ;# no IMEP $agent target $sndT } $sndT target [$self set ll_(0)] # # Recv Target # if {$newapi != ""} { set rcvT [$self mobility-trace Recv "RTR"] } else { set rcvT [cmu-trace Recv "RTR" $self] } if { $namfp != "" } { $rcvT namattach $namfp } if {$newapi == "ON" } { [$self set ll_(0)] up-target $imep_(0) $classifier_ defaulttarget $agent # need a second tracer to see the actual # types of tora packets after imep unpacks them # no need to support any hier node if {[info exists toraDebug_] && $toraDebug_ == "ON" } { set rcvT2 [$self mobility-trace Recv "TRP"] $rcvT2 target $agent $classifier_ defaulttarget $rcvT2 } } else { $rcvT target $agent $classifier_ defaulttarget $rcvT $dmux_ install $port $rcvT } } else { # # Send Target # # if tora is used if { $newapi == "ON" } { $agent target $imep_(0) # second tracer to see the actual # types of tora packets before imep packs them if { [info exists toraDebug_] && $toraDebug_ == "ON"} { set sndT2 [$self mobility-trace Send "TRP"] $sndT2 target $imep_(0) $agent target $sndT2 } $imep_(0) sendtarget [$self set ll_(0)] } else { ;# no IMEP $agent target [$self set ll_(0)] } # # Recv Target # if {$newapi == "ON" } { [$self set ll_(0)] up-target $imep_(0) $classifier_ defaulttarget $agent # need a second tracer to see the actual # types of tora packets after imep unpacks them # no need to support any hier node if {[info exists toraDebug_] && $toraDebug_ == "ON" } { set rcvT2 [$self mobility-trace Recv "TRP"] $rcvT2 target $agent [$self set classifier_] defaulttarget $rcvT2 } } else { $classifier_ defaulttarget $agent $dmux_ install $port $agent } }}## The following setups up link layer, mac layer, network interface# and physical layer structures for the mobile node.#Node/MobileNode instproc add-interface { channel pmodel lltype mactype qtype qlen iftype anttype topo inerrproc outerrproc fecproc } { $self instvar arptable_ nifs_ netif_ mac_ ifq_ ll_ imep_ inerr_ outerr_ fec_ set ns [Simulator instance] set imepflag [$ns imep-support] set t $nifs_ incr nifs_ set netif_($t) [new $iftype] ;# interface set mac_($t) [new $mactype] ;# mac layer set ifq_($t) [new $qtype] ;# interface queue set ll_($t) [new $lltype] ;# link layer set ant_($t) [new $anttype] $ns mac-type $mactype set inerr_($t) "" if {$inerrproc != ""} { set inerr_($t) [$inerrproc] } set outerr_($t) "" if {$outerrproc != ""} { set outerr_($t) [$outerrproc] } set fec_($t) "" if {$fecproc != ""} { set fec_($t) [$fecproc] } set namfp [$ns get-nam-traceall] if {$imepflag == "ON" } { # IMEP layer set imep_($t) [new Agent/IMEP [$self id]] set imep $imep_($t) set drpT [$self mobility-trace Drop "RTR"] if { $namfp != "" } { $drpT namattach $namfp } $imep drop-target $drpT $ns at 0.[$self id] "$imep_($t) start" ;# start beacon timer } # # Local Variables # set nullAgent_ [$ns set nullAgent_] set netif $netif_($t) set mac $mac_($t) set ifq $ifq_($t) set ll $ll_($t) set inerr $inerr_($t) set outerr $outerr_($t) set fec $fec_($t) # # Initialize ARP table only once. # if { $arptable_ == "" } { set arptable_ [new ARPTable $self $mac] # FOR backward compatibility sake, hack only if {$imepflag != ""} { set drpT [$self mobility-trace Drop "IFQ"] } else { set drpT [cmu-trace Drop "IFQ" $self] } $arptable_ drop-target $drpT if { $namfp != "" } { $drpT namattach $namfp } } # # Link Layer # $ll arptable $arptable_ $ll mac $mac $ll down-target $ifq if {$imepflag == "ON" } { $imep recvtarget [$self entry] $imep sendtarget $ll $ll up-target $imep } else { $ll up-target [$self entry] } # # Interface Queue # $ifq target $mac $ifq set limit_ $qlen
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -