📄 ns-node.tcl
字号:
Node instproc addInterface { iface } { $self instvar ifaces_ lappend ifaces_ $iface# $iface setNode $self }Node instproc createInterface { num } { $self instvar ifaces_ set newInterface [new NetInterface] if { $num < 0 } { return 0 } $newInterface set-label $num return 1}Node instproc getInterfaces {} { $self instvar ifaces_ return $ifaces_}Node instproc getNode {} { return $self}## helpers for PIM stuff#Node instproc get-vif {} { $self instvar vif_ if [info exists vif_] { return $vif_ } set vif_ [new NetInterface] $self addInterface $vif_ return $vif_}# List of corresponding peer TCP hosts from this node, used in IntTcpNode instproc addCorresHost {addr cw mtu maxcw wndopt } { $self instvar chaddrs_ if { ![info exists chaddrs_($addr)] } { set chost [new Agent/Chost $addr $cw $mtu $maxcw $wndopt] set chaddrs_($addr) $chost } return $chaddrs_($addr)}Node instproc createTcpSession {dst} { $self instvar tcpSession_ if { ![info exists tcpSession_($dst)] } { set tcpsession [new Agent/TCP/Session] $self attach $tcpsession $tcpsession set dst_ $dst set tcpSession_($dst) $tcpsession } return $tcpSession_($dst)}Node instproc getTcpSession {dst} { $self instvar tcpSession_ if { [info exists tcpSession_($dst)] } { return $tcpSession_($dst) } else { puts "In getTcpSession(): no session exists for destination [$dst set addr_]" return "" }}Node instproc existsTcpSession {dst} { $self instvar tcpSession_ if { [info exists tcpSession_($dst)] } { return 1 } else { return 0 }}## Node support for detailed dynamic routing#Node instproc init-routing rtObject { $self instvar multiPath_ routes_ rtObject_ set multiPath_ [$class set multiPath_] set nn [$class set nn_] for {set i 0} {$i < $nn} {incr i} { set routes_($i) 0 } if ![info exists rtObject_] { $self set rtObject_ $rtObject } $self set rtObject_}Node instproc rtObject? {} { $self instvar rtObject_ if ![info exists rtObject_] { return "" } else { return $rtObject_ }}## Node support for equal cost multi path routing#Node instproc add-routes {id ifs} { $self instvar classifier_ multiPath_ routes_ mpathClsfr_ if !$multiPath_ { if {[llength $ifs] > 1} { warn "$class::$proc cannot install multiple routes" set ifs [lindex $ifs 0] } $self add-route $id [$ifs head] set routes_($id) 1 return } if {$routes_($id) <= 0 && [llength $ifs] == 1 && \ ![info exists mpathClsfr_($id)]} { $self add-route $id [$ifs head] set routes_($id) 1 } else { if ![info exists mpathClsfr_($id)] { # 1. get new MultiPathClassifier, # 2. migrate existing routes to that mclassifier # 3. install the mclassifier in the node classifier_ # set mpathClsfr_($id) [new Classifier/MultiPath] if {$routes_($id) > 0} { assert {$routes_($id) == 1} $mpathClsfr_($id) installNext [$classifier_ in-slot? $id] } $classifier_ install $id $mpathClsfr_($id) } foreach L $ifs { $mpathClsfr_($id) installNext [$L head] incr routes_($id) } }}Node instproc delete-routes {id ifs nullagent} { $self instvar mpathClsfr_ routes_ if [info exists mpathClsfr_($id)] { foreach L $ifs { set nonLink([$L head]) 1 } foreach {slot link} [$mpathClsfr_($id) adjacents] { if [info exists nonLink($link)] { $mpathClsfr_($id) clear $slot incr routes_($id) -1 } } } else { $self add-route $id $nullagent incr routes_($id) -1 }}Node instproc intf-changed { } { $self instvar rtObject_ if [info exists rtObject_] { ;# i.e. detailed dynamic routing $rtObject_ intf-changed }}### PGM Router support #### Simulator instproc attach-PgmNE (args) {# foreach node $args {# $node attach-PgmNEAgent# }# Node instproc attach-PgmNEAgent {} {# $self instvar switch_ router_supp_ ns_# # if![$ns_ multicast?] {# # error "Error :Attaching PGM without Mcast option!"# # }# set router_supp_ [new Agent/NE/Pgm $switch_]# [Simulator instance] attach-agent $self $router-supp_# $switch_ install 1 $router-supp_# }## Manual Routing Nodes:# like normal nodes, but with a hash classifier.#Class ManualRtNode -superclass NodeManualRtNode instproc mk-default-classifier {} { $self instvar address_ classifier_ id_ dmux_ # Note the very small hash size--- # you're supposed to resize it if you want more. set classifier_ [new Classifier/Hash/Dest 2] $classifier_ set mask_ [AddrParams set NodeMask_(1)] $classifier_ set shift_ [AddrParams set NodeShift_(1)] set address_ $id_ # # When an agent is created, # $self add-route $address_ $dmux_ is called # which will do this. #}ManualRtNode instproc add-route {dst_address target} { $self instvar classifier_ set slot [$classifier_ installNext $target] if {$dst_address == "default"} { $classifier_ set default_ $slot } else { # don't encode the address here, set-hash bypasses that for us set encoded_dst_address [expr $dst_address << [AddrParams set NodeShift_(1)]] $classifier_ set-hash auto 0 $encoded_dst_address 0 $slot # $classifier_ set-hash auto 0 $dst_address 0 $slot }# puts "ManualRtNode::add-route: $dst $target, classifier=$classifier_ slot=$slot"# puts "\t*slot=[$classifier_ slot $slot]"}ManualRtNode instproc add-route-to-adj-node args { $self instvar classifier_ address_ set dst "" if {[lindex $args 0] == "-default"} { set dst default set args [lrange $args 1 end] } if {[llength $args] != 1} { error "ManualRtNode::add-route-to-adj-node [-default] node" } set target_node $args if {$dst == ""} { set dst [$target_node set address_] } set ns [Simulator instance] set link [$ns link $self $target_node] set target [$link head] # puts "ManualRtNode::add-route-to-adj-node: in $self for addr $dst to target $target" return [$self add-route $dst $target]}## Virtual Classifier Nodes:# like normal nodes, but with a virtual unicast classifier.#Class VirtualClassifierNode -superclass NodeVirtualClassifierNode instproc mk-default-classifier {} { $self instvar address_ classifier_ id_ set classifier_ [new Classifier/Virtual] $classifier_ set node_ $self $classifier_ set mask_ [AddrParams set NodeMask_(1)] $classifier_ set shift_ [AddrParams set NodeShift_(1)] set address_ $id_}VirtualClassifierNode instproc add-route { dst target } {}Classifier/Virtual instproc find dst { $self instvar node_ ns_ routingTable_ if ![info exist ns_] { set ns_ [Simulator instance] } if ![info exist routingTable_] { set routingTable_ [$ns_ get-routelogic] } if {[$node_ id] == $dst} { $self set-target [$node_ set dmux_] } else { set nh [$routingTable_ lookup [$node_ id] $dst] $self set-target [[$ns_ link $node_ [$ns_ set Node_($nh)]] head] }}Classifier/Virtual instproc install {dst target} {}# # Broadcast Nodes:# accept limited broadcast packets# Class Node/Broadcast -superclass Node Node/Broadcast instproc mk-default-classifier {} { $self instvar address_ classifier_ id_ dmux_ set classifier_ [new Classifier/Addr/Bcast] $classifier_ set mask_ [AddrParams set NodeMask_(1)] $classifier_ set shift_ [AddrParams set NodeShift_(1)] set address_ $id_ if { $dmux_ == "" } { set dmux_ [new Classifier/Addr/Reserve] $dmux_ set mask_ [AddrParams set PortMask_] $dmux_ set shift_ [AddrParams set PortShift_] if [Simulator set EnableHierRt_] { $self add-hroute $address_ $dmux_ } else { $self add-route $address_ $dmux_ } } $classifier_ bcast-receiver $dmux_}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -