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

📄 ns-node.tcl

📁 ns gpsr路由协议 在ns2平台下实现的 对大家很有好处
💻 TCL
📖 第 1 页 / 共 2 页
字号:
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 + -