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

📄 ns-mpls-ldpagent.tcl

📁 这个软件的功能是实现多播协议
💻 TCL
字号:
# -*-	Mode:tcl; tcl-indent-level:8; tab-width:8; indent-tabs-mode:t -*-## Time-stamp: <2000-09-11 14:54:38 haoboy># #  Copyright (c) 1997 by the University of Southern California#  All rights reserved.# #  Permission to use, copy, modify, and distribute this software and its#  documentation in source and binary forms for non-commercial purposes#  and without fee is hereby granted, provided that the above copyright#  notice appear in all copies and that both the copyright notice and#  this permission notice appear in supporting documentation. and that#  any documentation, advertising materials, and other materials related#  to such distribution and use acknowledge that the software was#  developed by the University of Southern California, Information#  Sciences Institute.  The name of the University may not be used to#  endorse or promote products derived from this software without#  specific prior written permission.# #  THE UNIVERSITY OF SOUTHERN CALIFORNIA makes no representations about#  the suitability of this software for any purpose.  THIS SOFTWARE IS#  PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,#  INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.# #  Other copyrights might apply to parts of this software and are so#  noted when applicable.# #  Original source contributed by Gaeil Ahn. See below.##  $Header: /nfs/jade/vint/CVSROOT/ns-2/tcl/mpls/ns-mpls-ldpagent.tcl,v 1.2 2000/09/14 18:19:30 haoboy Exp $############################################################################ Copyright (c) 2000 by Gaeil Ahn                                	  ## Everyone is permitted to copy and distribute this software.		  ## Please send mail to fog1@ce.cnu.ac.kr when you modify or distribute     ## this sources.								  ##########################################################################################################################################                                                           ##     File: File for LDP protocol                           ##     Author: Gaeil Ahn (fog1@ce.cnu.ac.kr), Jan. 2000      ##                                                           ##############################################################Agent/LDP instproc set-mpls-module { mod } {	$self set module_ $mod}Agent/LDP instproc get-request-msg {msgid src fec pathvec} {	$self instvar node_ module_	set pathvec [split $pathvec "_"]	if {[lsearch $pathvec [$node_ id]] > -1} {		# loop detected		set ldpagent [$module_ get-ldp-agent $src]		$ldpagent new-msgid		$ldpagent send-notification-msg "LoopDetected" -1           				return	}		set nexthop [$module_ get-nexthop $fec]	if {$src == $nexthop} {		#  message from downstream node		$self request-msg-from-downstream $msgid $src $fec $pathvec	} else {		#  message from upstream node		$self request-msg-from-upstream $msgid $src $fec $pathvec	}}Agent/LDP instproc request-msg-from-downstream {msgid src fec pathvec} {	$self instvar module_	#  1. allocate label (upstream label allocation)	set outlabel [$module_ get-outgoing-label $fec -1]	if { $outlabel < 0 } {		if { $fec == $src } {			# This is a penultimate hop			set outlabel 0		} else {			set outlabel [$module_ new-outgoing-label]		}     		$module_ out-label-install $fec -1 $src $outlabel             	} else {		set outIface [$module_ get-outgoing-iface $fec -1]		if { $src != $outIface} {			# wrong LIB information, let's fix it up			$module_ out-label-install $fec -1 $src $outlabel		} 	}		#  2. reply a allocated label to $src	set ldpagent [$module_ get-ldp-agent $src]	$ldpagent new-msgid	$ldpagent send-mapping-msg $fec $outlabel "*" $msgid	#  3. trigger label distribution (control-driven-trigger)	#     not support on-demand mode in control-driven-trigger	$module_ ldp-trigger-by-control $fec $pathvec}Agent/LDP instproc request-msg-from-upstream {msgid src fec pathvec} {	$self instvar module_	#  ldp agent for src	set ldpagent [$module_ get-ldp-agent $src]	# This is a egress LSR	if { [$module_ is-egress-lsr $fec] == 1 } {                $ldpagent new-msgid                $ldpagent send-mapping-msg $fec 0 "*" $msgid                return	}		set inlabel  [$module_ get-incoming-label $fec -1]	set outlabel [$module_ get-outgoing-label $fec -1]	#	# ordered-control mode	#	if { [Classifier/Addr/MPLS ordered-control?] == 1 } {		if { $outlabel > -1 } {			if { $inlabel < 0 } {				set inlabel [$module_ new-incoming-label]			}			$ldpagent new-msgid			$ldpagent send-mapping-msg $fec inlabel "*" $msgid		} else {			$module_ ldp-trigger-by-data $msgid $src $fec $pathvec		}		return	}	#	#  independent-control mode	#	#  1. allocate label (upstream label allocation)	if { $inlabel < 0 } {		set inlabel [$module_ new-incoming-label]		$module_ in-label-install $fec -1 $src $inlabel	} else {		set inIface [$module_ get-incoming-iface $fec -1]		if { $src != $inIface} {			set classifier [$module_ set classifier_]			set dontcare [$classifier set dont_care_]			$module_ in-label-install $fec -1 -1 $dontcare		} 	}	#  2. reply a allocated label to $src	$ldpagent new-msgid	$ldpagent send-mapping-msg $fec $inlabel "*" $msgid	#  3. trigger label distribution (data-driven-trigger)	#     support on-demand mode in data-driven-trigger	$module_ ldp-trigger-by-data $msgid $src $fec $pathvec}Agent/LDP instproc get-cr-request-msg {msgid src fec pathvec er lspid rc} {	$self instvar node_ module_	#	#  CR-LDP:  used to setup explicit-LSP	#	set pathvec [split $pathvec "_"]	if {[lsearch $pathvec [$node_ id]] > -1} {		# loop detected		set ldpagent [$module_ get-ldp-agent $src]		$ldpagent new-msgid		$ldpagent send-notification-msg "NoRoute" $lspid		return	}		# reserve a required resources using $rc	# if a reservation fails, send notificaiton-msg	#  ldp agent for src	set ldpagent [$module_ get-ldp-agent $src]	#  if a outgoing label for the fec exists ingnore this request-msg and	#  send cr-mapping-msg.	set inlabel [$module_ get-incoming-label $fec $lspid]	set outlabel [$module_ get-outgoing-label $fec $lspid]		if { $outlabel > -1 } {                if { $inlabel < 0 } {			set inlabel [$module_ new-incoming-label]			$module_ in-label-install $fec $lspid $src $inlabel                }                $ldpagent new-msgid                $ldpagent send-cr-mapping-msg $fec $inlabel $lspid $msgid                return	}	$module_ ldp-trigger-by-explicit-route $msgid $src $fec $pathvec $er \			$lspid $rc}Agent/LDP instproc get-cr-mapping-msg {msgid src fec label lspid reqmsgid} {	$self instvar node_ trace_ldp_ module_	# select a upstream-node to receive a mapping-msg in msgtbl	# and clear the msgtbl entry	set prvsrc   [$self msgtbl-get-src       $reqmsgid]	set prvmsgid [$self msgtbl-get-reqmsgid  $reqmsgid]	set labelop  [$self msgtbl-get-labelop   $reqmsgid]	if {$labelop == 2} {		set tunnelid [$self msgtbl-get-erlspid   $reqmsgid]	} else {		set tunnelid -1	}		$self msgtbl-clear $reqmsgid	if { $trace_ldp_ } {		puts "$src -> [$node_ id] : prvsrc($prvsrc)"	}		# allocate outgoing-label	if { $labelop == 2 } {		# stack operation		$module_ out-label-install $fec $lspid $src $label		$module_ erlsp-stacking $lspid $tunnelid	} elseif {$labelop == 1} {		# only pass label		set ldpagent [$module_ get-ldp-agent $prvsrc]		$ldpagent new-msgid		$ldpagent send-cr-mapping-msg $fec $label $lspid $prvmsgid		return	} else {		# use the label		$module_ out-label-install $fec $lspid  $src $label	}		if {$prvsrc == [$node_ id]} {		return	}	# allocate incoming-label            	set inlabel [$module_ new-incoming-label]	$module_ in-label-install $fec $lspid $prvsrc $inlabel	# find a ldpagent for a upstream-node, continually send a 	# mapping-msg to the node	set ldpagent [$module_ get-ldp-agent $prvsrc]	$ldpagent new-msgid	$ldpagent send-cr-mapping-msg $fec $inlabel $lspid $prvmsgid}# msgid    : the msgid of a mapping message sent by dstination# reqmsgid : the msgid of a request message sent by me beforeAgent/LDP instproc get-mapping-msg {msgid src fec label pathvec reqmsgid} {	$self instvar node_ trace_ldp_ module_	if { $trace_ldp_ } {		puts "[[Simulator instance] now]: <mapping-msg> $src ->\[$node_ id] : fec($fec), label($label) [$module_ get-nexthop $fec]"	}		set pathvec [split $pathvec "_"]	if {[lsearch $pathvec [$node_ id]] > -1} {		# loop detected		set ldpagent [$module_ get-ldp-agent $src]		$ldpagent new-msgid		$ldpagent send-notification-msg "LoopDetected" -1           		return	}	set nexthop [$module_ get-nexthop $fec]	if {$src == $nexthop} {		#  message from downstream node		$self mapping-msg-from-downstream $msgid $src $fec $label \				$pathvec $reqmsgid	} else {		#  message from upstream node		$self mapping-msg-from-upstream $msgid $src $fec $label \				$pathvec $reqmsgid	}}Agent/LDP instproc mapping-msg-from-downstream {msgid src fec label \		pathvec reqmsgid} {	$self instvar node_ module_	#  allocate label (upstream label allocation)	$module_ out-label-install $fec -1 $src $label	if { $reqmsgid > -1 } {		# downstream-on-demand mode				# 1. find a upstream-node who sent a request-msg in msgtbl		#    & delete entry in msgtbl		set prvsrc   [$self msgtbl-get-src      $reqmsgid]		set prvmsgid [$self msgtbl-get-reqmsgid $reqmsgid]		$self msgtbl-clear $reqmsgid		if { $prvsrc == [$node_ id] || $prvsrc < 0} {			return		}		if { [Classifier/Addr/MPLS ordered-control?] == 1 } {			# ordered-control mode			# 1. allocate incoming-label			set inlabel [$module_ new-incoming-label]			$module_ in-label-install $fec -1 $prvsrc $inlabel			# 2. find a ldpagent for a upstream-node,			#    send a mapping-msg forward a upstream-node			set ldpagent [$module_ get-ldp-agent $prvsrc]			$ldpagent new-msgid			$ldpagent send-mapping-msg $fec $inlabel -1 $prvmsgid			return		}	} else {		#  trigger label distribution (control-driven-trigger)		$module_ ldp-trigger-by-control $fec $pathvec		return	}}Agent/LDP instproc mapping-msg-from-upstream {msgid src fec label pathvec \		reqmsgid} {	$self instvar node_ module_	# check whether or not myself is a next hop of src for a fec.	set nexthop [$module_ lookup-nexthop $src $fec]	if { $nexthop != [$node_ id] } {		return	}	#  1. allocate label (upstream label allocation)	set inlabel [$module_ get-incoming-label $fec -1]	if { $inlabel == -1 } {		if { [$module_ is-egress-lsr $fec] == 1 } {			#  message from a penultimate hop			#  so, send a null label to a penultimate hop			if { $label != 0 } {				set ldpagent [$module_ get-ldp-agent $src]				$ldpagent new-msgid				$ldpagent send-mapping-msg $fec 0 "*" $msgid			}		} else {			$module_ in-label-install $fec -1 $src $label		}	} else {		set ldpagent [$module_ get-ldp-agent $src]		if { $reqmsgid < 0 } {			$ldpagent new-msgid			$ldpagent send-mapping-msg $fec $inlabel "*" $msgid		}   	}    	#  2. trigger label distribution (data-driven-trigger)	#     support on-demand mode only in data-driven-trigger	if { $reqmsgid < 0 } {		$module_ ldp-trigger-by-data -1 $src $fec $pathvec	} else {   		# if ($reqmsgid > -1) then delete a entry in msgid table		$self msgtbl-clear $reqmsgid	}    }Agent/LDP instproc get-notification-msg {src status lspid} {	$self instvar node_ trace_ldp_ module_	# Notification-msg (in case of Loop Detection, No Route)	if { $trace_ldp_ } {		puts "Notification($src->[$node_ id]): $status src=$src lspid=$lspid"	}	set msgid [$self msgtbl-get-msgid -1 $lspid -1]	if {$msgid > -1} {		set prvsrc   [$self msgtbl-get-src      $msgid]		$self msgtbl-clear $msgid            		if { $prvsrc < -1 || $prvsrc == [$node_ id] } {			return		}		set ldpagent [$module_ get-ldp-agent $prvsrc]		$ldpagent new-msgid		$ldpagent send-notification-msg $status $lspid	}}Agent/LDP instproc get-withdraw-msg {src fec lspid} {	$self instvar module_	# withdraw msg : downstream -> upstream	set outiface  [$module_ get-outgoing-iface $fec $lspid]	if {$src == $outiface} {		$module_ out-label-clear $fec $lspid		set inlabel [$module_ get-incoming-label $fec $lspid]		if {$inlabel > -1} {			$module_ ldp-trigger-by-withdraw $fec $lspid		}	}}Agent/LDP instproc get-release-msg {src fec lspid} {	$self instvar module_		# release msg : upstream --> downstream	set iniface  [$module_ get-incoming-iface $fec $lspid]	set outlabel [$module_ get-outgoing-label $fec $lspid]	if {$iniface == $src} {		$module_ in-label-clear $fec $lspid 		if {$outlabel > -1} {			$module_ ldp-trigger-by-release $fec $lspid		}	} }Agent/LDP instproc trace-ldp-packet {src_addr src_port msgtype msgid fec \		label pathvec lspid er rc reqmsgid status atime} {	$self instvar node_	puts "$atime [$node_ id]: $src_addr ($msgtype $msgid) $fec $label $pathvec  \[$reqmsgid $status\]  \[$lspid $er $rc\]"}Agent/LDP instproc send-notification-msg {status lspid} {	$self set fid_ 101	$self cmd notification-msg $status $lspid}Agent/LDP instproc send-request-msg {fec pathvec} {	$self set fid_ 102	$self request-msg $fec $pathvec}Agent/LDP instproc send-mapping-msg {fec label pathvec reqmsgid} {	$self set fid_ 103	$self cmd mapping-msg $fec $label $pathvec $reqmsgid}Agent/LDP instproc send-withdraw-msg {fec lspid} {	$self set fid_ 104	$self withdraw-msg $fec $lspid}Agent/LDP instproc send-release-msg {fec lspid} {	$self set fid_ 105	$self release-msg $fec $lspid}Agent/LDP instproc send-cr-request-msg {fec pathvec er lspid rc} {	$self set fid_ 102	$self cr-request-msg $fec $pathvec $er $lspid $rc}Agent/LDP instproc send-cr-mapping-msg {fec inlabel lspid prvmsgid} {	$self set fid_ 103	$self cr-mapping-msg $fec $inlabel $lspid $prvmsgid}

⌨️ 快捷键说明

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