ns-mpls-node.tcl

来自「一款用来进行网络模拟的软件」· TCL 代码 · 共 510 行 · 第 1/2 页

TCL
510
字号
				$self in-label-install $fec -1 -1 $inlabel			}		}		$ldpagent new-msgid		$ldpagent send-mapping-msg $fec $inlabel $pathvec -1	}}RtModule/MPLS instproc ldp-trigger-by-data {reqmsgid src fec pathvec} {	if { [$self is-egress-lsr $fec] == 1 } {		# This is a egress node		return	}	set outlabel [$self get-outgoing-label $fec -1]	if { $outlabel > -1  } {		# reroute check !! to establish altanative path		set outiface [$self get-outgoing-iface $fec -1]		if { [$self get-link-status $outiface] == "up" } {			# LSP was already setup			return		}	}	lappend pathvec [[$self node] id]      	set nexthop [$self get-nexthop $fec]	set ldpagent [$self get-ldp-agent $nexthop]	if { $ldpagent == "" } {		return	}	if {$reqmsgid > -1} {		# on-demand mode		set working [$ldpagent msgtbl-get-msgid $fec -1 $src]		if { $working < 0 } {			# have to make new request-msg			set newmsgid [$ldpagent new-msgid]			$ldpagent msgtbl-install $newmsgid $fec -1 \					$src $reqmsgid			$ldpagent send-request-msg $fec $pathvec		} else {			# $self is already tring to setup a LSP			# So, need not to send a request-msg		}	} else {		# not on-demand mode		if {$fec == $nexthop} {			# This is a penultimate hop			set outlabel 0		} else {			set outlabel [$self new-outgoing-label]		}		$self out-label-install $fec -1 $nexthop $outlabel		$ldpagent new-msgid		$ldpagent send-mapping-msg $fec $outlabel $pathvec -1	}}RtModule/MPLS instproc make-explicit-route {fec er lspid rc} {	$self ldp-trigger-by-explicit-route -1 [[$self node] id] $fec "*" \			$er $lspid $rc}RtModule/MPLS instproc ldp-trigger-by-explicit-route {reqmsgid src fec \		pathvec er lspid rc} {	$self instvar classifier_	set outlabel [$self get-outgoing-label $fec $lspid]	if { $outlabel > -1 } {		# LSP was already setup		return	}	if { [[$self node] id] != $src && [[$self node] id] == $fec } {		# This is a egress node		set ldpagent [$self get-ldp-agent $src]		if { $ldpagent != "" } {			$ldpagent new-msgid			$ldpagent send-cr-mapping-msg $fec 0 $lspid $reqmsgid		}		return	}	lappend pathvec [[$self node] id]	set er [split $er "_"]	set erlen [llength $er]	for {set i 0} {$i <= $erlen} {incr i 1} {		if { $i != $erlen } {			set erhop [lindex $er $i]		} else {			set erhop $fec		}		set stackERhop -1		if { $erhop >= [Classifier/Addr/MPLS minimum-lspid] } {			# This is the ER-Hop and LSPid (ER-LSP)			set lspidFEC [$self get-fec-for-lspid $erhop]			set inlabel  [$self get-incoming-label -1 $erhop]			set outlabel [$self get-outgoing-label -1 $erhop]			if { $lspidFEC == $fec } {				# splice two LSPs				if { $outlabel <= -1 } {					continue				}				if { $inlabel < 0 } {					set inlabel [$self new-incoming-label]					$self in-label-install -1 $erhop \						$src $inlabel				}				set ldpagent [$self get-ldp-agent $src]				$ldpagent new-msgid				$ldpagent send-cr-mapping-msg $fec $inlabel \						$lspid $reqmsgid				return			}			# $lspidFEC != $fec			# do stack operation			set existExplicitPeer [$self exist-ldp-agent $lspidFEC]			if { $outlabel > -1 && $existExplicitPeer == "1" } {				set stackERhop $erhop 				set erhop $lspidFEC			} elseif { $outlabel > -1 && $existExplicitPeer == "0" } {				set nexthop [$self get-outgoing-iface -1 \						$erhop]				set iiface  [$self get-incoming-iface -1 \						$erhop]				set ldpagent [$self get-ldp-agent $nexthop]				set working [$ldpagent msgtbl-get-msgid $fec \						$lspid $src]				if { $working < 0 } {					# have to make new request-msg					set newmsgid [$ldpagent new-msgid]					$ldpagent msgtbl-install $newmsgid \						$fec $lspid $src $reqmsgid					# determine whether labelpass or 					# labelstack					if {($iiface == $src) && \							($inlabel > -1) } {						$ldpagent msgtbl-set-labelpass $newmsgid					} else {						$ldpagent msgtbl-set-labelstack $newmsgid $erhop					}					$ldpagent send-cr-request-msg $fec \							$pathvec $er $lspid $rc				}				return			} else {				continue			}		}		if { [lsearch $pathvec $erhop] < 0 } {			set nexthop [$self get-nexthop $erhop]			if { [$self is-egress-lsr $nexthop] == 1 } {				# not exist MPLS-node to process a required 				# er-LSP				set ldpagent [$self get-ldp-agent $src]				if { $erhop == $fec } {					# This is a final node					$ldpagent new-msgid					$ldpagent send-cr-mapping-msg $fec 0 \							$lspid $reqmsgid				} else {					# be a wrong er list					$ldpagent new-msgid					$ldpagent send-notification-msg \							"NoRoute" $lspid				}			} else {				set ldpagent [$self get-ldp-agent $nexthop]				set working [$ldpagent msgtbl-get-msgid $fec \						$lspid $src]				if { $working < 0 } {					# have to make new request-msg					set newmsgid [$ldpagent new-msgid]					set id [$ldpagent msgtbl-install \							$newmsgid $fec \							$lspid $src $reqmsgid]					## for label stack					if { $stackERhop > -1 } {						$ldpagent msgtbl-set-labelstack $newmsgid $stackERhop					}					$ldpagent send-cr-request-msg $fec $pathvec $er $lspid $rc				}			} 			return		}	}	set ldpagent [$self get-ldp-agent $src]	if { $ldpagent != "" } {		$ldpagent new-msgid		$ldpagent send-notification-msg "NoRoute" $lspid	}}RtModule/MPLS instproc ldp-trigger-by-withdraw {fec lspid} {	set inlabel  [$self get-incoming-label $fec $lspid]	set iniface  [$self get-incoming-iface $fec $lspid]	$self in-label-clear $fec $lspid		if {$iniface > -1} {		set ldpagent [$self get-ldp-agent $iniface]		if { $ldpagent != "" } {			$ldpagent new-msgid			$ldpagent send-withdraw-msg $fec $lspid		}	} else {		# several upstream nodes may share a label.		# so inform all upstream nodes to withdraw the label		set nexthop [$self get-nexthop $fec]		set ldpagents [lsort [$self get-ldp-agents]]		for {set i 0} {$i < [llength $ldpagents]} {incr i 1} {			set ldpagent [lindex $ldpagents $i]			if { [$ldpagent peer-ldpnode] == $nexthop } {				continue			}			$ldpagent new-msgid			$ldpagent send-withdraw-msg $fec $lspid		}	}   }RtModule/MPLS instproc ldp-trigger-by-release {fec lspid} {	set outlabel  [$self get-outgoing-label $fec $lspid]	if {$outlabel < 0} {		return	}	set nexthop [$self get-outgoing-iface $fec $lspid]	$self out-label-clear $fec $lspid 	set ldpagent [$self get-ldp-agent $nexthop]	if { $ldpagent != "" } {		$ldpagent new-msgid		$ldpagent send-release-msg $fec $lspid	}   }# DebuggingRtModule/MPLS instproc trace-mpls {} {        [$self set classifier_] set trace_mpls_ 1}RtModule/MPLS instproc pft-dump {} {        # dump the records within Partial Forwarding Table(PFT)        set nodeid [[$self node] id]        [$self set classifier_] PFTdump $nodeid}RtModule/MPLS instproc erb-dump {} {        # dump the records within Explicit Route information Base(ERB)        set nodeid [[$self node] id]        [$self set classifier_] ERBdump $nodeid}RtModule/MPLS instproc lib-dump {} {        # dump the records within Label Information Base(LIB)        set nodeid [[$self node] id]        [$self set classifier_] LIBdump $nodeid}

⌨️ 快捷键说明

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