ns-mpls-classifier.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # -*- Mode:tcl; tcl-indent-level:8; tab-width:8; indent-tabs-mode:t -*-
  2. #
  3. # Time-stamp: <2000-09-11 15:34:10 haoboy>
  4. #  This program is free software; you can redistribute it and/or
  5. #  modify it under the terms of the GNU General Public License,
  6. #  version 2, as published by the Free Software Foundation.
  7. #
  8. #  This program is distributed in the hope that it will be useful,
  9. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. #  GNU General Public License for more details.
  12. #
  13. #  You should have received a copy of the GNU General Public License along
  14. #  with this program; if not, write to the Free Software Foundation, Inc.,
  15. #  59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  16. #
  17. #  The copyright of this module includes the following
  18. #  linking-with-specific-other-licenses addition:
  19. #
  20. #  In addition, as a special exception, the copyright holders of
  21. #  this module give you permission to combine (via static or
  22. #  dynamic linking) this module with free software programs or
  23. #  libraries that are released under the GNU LGPL and with code
  24. #  included in the standard release of ns-2 under the Apache 2.0
  25. #  license or under otherwise-compatible licenses with advertising
  26. #  requirements (or modified versions of such code, with unchanged
  27. #  license).  You may copy and distribute such a system following the
  28. #  terms of the GNU GPL for this module and the licenses of the
  29. #  other code concerned, provided that you include the source code of
  30. #  that other code when and as the GNU GPL requires distribution of
  31. #  source code.
  32. #
  33. #  Note that people who make modified versions of this module
  34. #  are not obligated to grant this special exception for their
  35. #  modified versions; it is their choice whether to do so.  The GNU
  36. #  General Public License gives permission to release a modified
  37. #  version without this exception; this exception also makes it
  38. #  possible to release a modified version which carries forward this
  39. #  exception.
  40. #  Original source contributed by Gaeil Ahn. See below.
  41. #
  42. #  $Header: /cvsroot/nsnam/ns-2/tcl/mpls/ns-mpls-classifier.tcl,v 1.3 2005/09/16 03:05:45 tomh Exp $
  43. ###########################################################################
  44. # Copyright (c) 2000 by Gaeil Ahn                                   #
  45. # Everyone is permitted to copy and distribute this software.   #
  46. # Please send mail to fog1@ce.cnu.ac.kr when you modify or distribute     #
  47. # this sources.   #
  48. ###########################################################################
  49. #############################################################
  50. #                                                           #
  51. #     File: File for Classifier                             #
  52. #     Author: Gaeil Ahn (fog1@ce.cnu.ac.kr), Jan. 2000      #
  53. #                                                           #
  54. #############################################################
  55. Classifier/Addr/MPLS instproc init {args} {
  56. eval $self next $args
  57. $self set rtable_ ""
  58. }
  59. Classifier/Addr/MPLS instproc set-node { node module } {
  60. $self set mpls_node_ $node
  61. $self set mpls_mod_ $module
  62. }
  63. Classifier/Addr/MPLS instproc no-slot args {
  64. # Do nothing, just don't exit like the default no-slot{} does.
  65. }
  66. Classifier/Addr/MPLS instproc trace-packet-switching { time src dst ptype 
  67. ilabel op oiface olabel ttl psize } {
  68. $self instvar mpls_node_ 
  69. puts "$time [$mpls_node_ id]($src->$dst): $ptype $ilabel $op $oiface $olabel $ttl $psize"
  70. }
  71. # XXX Temporary interfaces
  72. #
  73. # All of the following instprocs should be moved into the MPLS functionality
  74. # part of a Node. The big picture is that MPLS code should be packaged in a 
  75. # module, then a Node should intercept add-route and pass it on to the MPLS 
  76. # module, which then dispatches it to route-new, etc., depending on the 
  77. # MPLS classifier status of the slot. This should not be done as a callback 
  78. # from the classifier.
  79. Classifier/Addr/MPLS instproc ldp-trigger-by-switch { fec } {
  80. $self instvar mpls_node_ mpls_mod_
  81. if { [Classifier/Addr/MPLS on-demand?] == 1 } {
  82. set msgid  1
  83. } else {
  84. set msgid -1
  85. }
  86. $mpls_mod_ ldp-trigger-by-data $msgid [$mpls_node_ id] $fec *
  87. }
  88. # XXX This is a really bad way to check if routing table is built.
  89. # During initialization of dynamic routing (e.g., DV), at each node, for 
  90. # each possible destination, a nullAgent_ will be added to the routing table.
  91. #
  92. # Since rtable-ready does not know this, it will think that routing table
  93. # is ready and start to compute routes. This is the reason that routing-new{}
  94. # must do a special check (route-nochange{} does not need it because it is 
  95. # only called when an existing slot is replaced, which cannot happen during 
  96. # the initialization phase).
  97. #
  98. # A better way should be let Node to intercept add-route{}, and updated 
  99. # rtable_ only when the target is not the default null agent. However, this 
  100. # is difficult with current node-config design, where node types are exclusive.
  101. # But this will change as time goes by.
  102. Classifier/Addr/MPLS instproc rtable-ready { fec } {
  103. $self instvar rtable_
  104. #
  105. # determine whether or not a routing table is stable status
  106. #
  107. set ns [Simulator instance]
  108. if { [lsearch $rtable_ $fec] == -1 } {
  109. lappend rtable_ $fec
  110. }
  111. set rtlen [llength $rtable_]
  112. set nodelen [$ns array size Node_]
  113. if { $rtlen == $nodelen } {
  114. return 1
  115. } else {
  116. return 0
  117. }
  118. }
  119. Classifier/Addr/MPLS instproc routing-new { slot time } {
  120. $self instvar mpls_node_ rtable_ mpls_mod_
  121. if { [$self control-driven?] != 1 } {
  122. return
  123. }
  124. if { [lsearch $rtable_ [$mpls_node_ id]] == -1 } {
  125. lappend rtable_ [$mpls_node_ id]
  126. }
  127. if { [$self rtable-ready $slot] == 1 } {
  128. # Now, routing table is built.  really ?
  129. # Check whether static routing or dynamic routing
  130. set rtlen [llength $rtable_]
  131. for {set i 0} {$i < $rtlen} {incr i 1} {
  132. set nodeid [lindex $rtable_ $i]
  133. if { [$mpls_mod_ get-nexthop $nodeid] == -1 } {
  134. #
  135. # It's Dynamic Routing
  136. #
  137. set rtable_ "" 
  138. return
  139. }
  140. }
  141. # XXX The following piece of code is only reached for 
  142. # static routing but not for dynamic routing. We have to 
  143. # do the scheduling because this piece may be executed 
  144. # BEFORE '$ns run' is completed; thus calling ldp-... 
  145. # will not succeed because other initialization may not 
  146. # have all finished yet. 
  147. set rtable_ "" 
  148. [Simulator instance] at [expr $time] 
  149. "$mpls_mod_ ldp-trigger-by-routing-table"
  150. }
  151. }
  152. # XXX Why routing table should be updated when there is no change??
  153. Classifier/Addr/MPLS instproc routing-nochange {slot time} {
  154. $self instvar mpls_node_ rtable_ mpls_mod_
  155. if { [$self control-driven?] != 1 } {
  156. return
  157. }
  158. if { [lsearch $rtable_ [$mpls_node_ id]] == -1 } {
  159. lappend rtable_ [$mpls_node_ id]
  160. }
  161. if { [$self rtable-ready $slot] == 1 } {
  162. set rtable_ "" 
  163.    [Simulator instance] at $time 
  164. "$mpls_mod_ ldp-trigger-by-routing-table"
  165. }
  166. }
  167. Classifier/Addr/MPLS instproc routing-update {slot time} {
  168. $self instvar mpls_mod_ rtable_
  169. if {[$self control-driven?] != 1} {
  170. return
  171. }
  172. set fec $slot
  173. set pft_outif [$mpls_mod_ get-outgoing-iface $fec -1]
  174. set rt_outif  [$mpls_mod_ get-nexthop $fec]
  175. if { $pft_outif == -1 || $rt_outif == -1 } {
  176. return
  177. }
  178. $mpls_mod_ ldp-trigger-by-control $fec *
  179. return
  180. }