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 + -
显示快捷键?