ns-mpls-classifier.tcl
来自「一款用来进行网络模拟的软件」· TCL 代码 · 共 199 行
TCL
199 行
# -*- Mode:tcl; tcl-indent-level:8; tab-width:8; indent-tabs-mode:t -*-## Time-stamp: <2000-09-11 15:34:10 haoboy># # This program is free software; you can redistribute it and/or# modify it under the terms of the GNU General Public License,# version 2, as published by the Free Software Foundation.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License along# with this program; if not, write to the Free Software Foundation, Inc.,# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.## The copyright of this module includes the following# linking-with-specific-other-licenses addition:## In addition, as a special exception, the copyright holders of# this module give you permission to combine (via static or# dynamic linking) this module with free software programs or# libraries that are released under the GNU LGPL and with code# included in the standard release of ns-2 under the Apache 2.0# license or under otherwise-compatible licenses with advertising# requirements (or modified versions of such code, with unchanged# license). You may copy and distribute such a system following the# terms of the GNU GPL for this module and the licenses of the# other code concerned, provided that you include the source code of# that other code when and as the GNU GPL requires distribution of# source code.## Note that people who make modified versions of this module# are not obligated to grant this special exception for their# modified versions; it is their choice whether to do so. The GNU# General Public License gives permission to release a modified# version without this exception; this exception also makes it# possible to release a modified version which carries forward this# exception.# # Original source contributed by Gaeil Ahn. See below.## $Header: /cvsroot/nsnam/ns-2/tcl/mpls/ns-mpls-classifier.tcl,v 1.3 2005/09/16 03:05:45 tomh 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 Classifier ## Author: Gaeil Ahn (fog1@ce.cnu.ac.kr), Jan. 2000 ## ##############################################################Classifier/Addr/MPLS instproc init {args} { eval $self next $args $self set rtable_ ""}Classifier/Addr/MPLS instproc set-node { node module } { $self set mpls_node_ $node $self set mpls_mod_ $module}Classifier/Addr/MPLS instproc no-slot args { # Do nothing, just don't exit like the default no-slot{} does.}Classifier/Addr/MPLS instproc trace-packet-switching { time src dst ptype \ ilabel op oiface olabel ttl psize } { $self instvar mpls_node_ puts "$time [$mpls_node_ id]($src->$dst): $ptype $ilabel $op $oiface $olabel $ttl $psize"}# XXX Temporary interfaces## All of the following instprocs should be moved into the MPLS functionality# part of a Node. The big picture is that MPLS code should be packaged in a # module, then a Node should intercept add-route and pass it on to the MPLS # module, which then dispatches it to route-new, etc., depending on the # MPLS classifier status of the slot. This should not be done as a callback # from the classifier.Classifier/Addr/MPLS instproc ldp-trigger-by-switch { fec } { $self instvar mpls_node_ mpls_mod_ if { [Classifier/Addr/MPLS on-demand?] == 1 } { set msgid 1 } else { set msgid -1 } $mpls_mod_ ldp-trigger-by-data $msgid [$mpls_node_ id] $fec *}# XXX This is a really bad way to check if routing table is built.# During initialization of dynamic routing (e.g., DV), at each node, for # each possible destination, a nullAgent_ will be added to the routing table.## Since rtable-ready does not know this, it will think that routing table# is ready and start to compute routes. This is the reason that routing-new{}# must do a special check (route-nochange{} does not need it because it is # only called when an existing slot is replaced, which cannot happen during # the initialization phase).## A better way should be let Node to intercept add-route{}, and updated # rtable_ only when the target is not the default null agent. However, this # is difficult with current node-config design, where node types are exclusive.# But this will change as time goes by.Classifier/Addr/MPLS instproc rtable-ready { fec } { $self instvar rtable_ # # determine whether or not a routing table is stable status # set ns [Simulator instance] if { [lsearch $rtable_ $fec] == -1 } { lappend rtable_ $fec } set rtlen [llength $rtable_] set nodelen [$ns array size Node_] if { $rtlen == $nodelen } { return 1 } else { return 0 }}Classifier/Addr/MPLS instproc routing-new { slot time } { $self instvar mpls_node_ rtable_ mpls_mod_ if { [$self control-driven?] != 1 } { return } if { [lsearch $rtable_ [$mpls_node_ id]] == -1 } { lappend rtable_ [$mpls_node_ id] } if { [$self rtable-ready $slot] == 1 } { # Now, routing table is built. really ? # Check whether static routing or dynamic routing set rtlen [llength $rtable_] for {set i 0} {$i < $rtlen} {incr i 1} { set nodeid [lindex $rtable_ $i] if { [$mpls_mod_ get-nexthop $nodeid] == -1 } { # # It's Dynamic Routing # set rtable_ "" return } } # XXX The following piece of code is only reached for # static routing but not for dynamic routing. We have to # do the scheduling because this piece may be executed # BEFORE '$ns run' is completed; thus calling ldp-... # will not succeed because other initialization may not # have all finished yet. set rtable_ "" [Simulator instance] at [expr $time] \ "$mpls_mod_ ldp-trigger-by-routing-table" }}# XXX Why routing table should be updated when there is no change??Classifier/Addr/MPLS instproc routing-nochange {slot time} { $self instvar mpls_node_ rtable_ mpls_mod_ if { [$self control-driven?] != 1 } { return } if { [lsearch $rtable_ [$mpls_node_ id]] == -1 } { lappend rtable_ [$mpls_node_ id] } if { [$self rtable-ready $slot] == 1 } { set rtable_ "" [Simulator instance] at $time \ "$mpls_mod_ ldp-trigger-by-routing-table" }}Classifier/Addr/MPLS instproc routing-update {slot time} { $self instvar mpls_mod_ rtable_ if {[$self control-driven?] != 1} { return } set fec $slot set pft_outif [$mpls_mod_ get-outgoing-iface $fec -1] set rt_outif [$mpls_mod_ get-nexthop $fec] if { $pft_outif == -1 || $rt_outif == -1 } { return } $mpls_mod_ ldp-trigger-by-control $fec * return}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?