ns-rtprotols.tcl

来自「一款用来进行网络模拟的软件」· TCL 代码 · 共 303 行

TCL
303
字号
# #  Copyright (c) 2000 by the University of Southern California#  All rights reserved.# #  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.#  Copyright (C) 1998 by Mingzhou Sun. All rights reserved.##  This software is developed at Rensselaer Polytechnic Institute under #  DARPA grant No. F30602-97-C-0274#  Redistribution and use in source and binary forms are permitted#  provided that the above copyright notice and this paragraph are#  duplicated in all such forms and that any documentation, advertising#  materials, and other materials related to such distribution and use#  acknowledge that the software was developed by Mingzhou Sun at the#  Rensselaer  Polytechnic Institute.  The name of the University may not #  be used to endorse or promote products derived from this software #  without specific prior written permission.## Link State Routing Agent## $Header: /cvsroot/nsnam/ns-2/tcl/rtglib/ns-rtProtoLS.tcl,v 1.4 2005/09/16 03:05:46 tomh Exp $## XXX These default values have to stay here because link state module# may be disabled during configuration time. If these stay in ns-default.tcl,# Agent/rtProto/LS may be unknown when ns-default.tcl is loaded.#Agent/rtProto/LS set UNREACHABLE  [rtObject set unreach_]Agent/rtProto/LS set preference_        120Agent/rtProto/LS set INFINITY           [Agent set ttl_]Agent/rtProto/LS set advertInterval     1800# like DV's, except $self cmd initialize and cmd setNodeNumberAgent/rtProto/LS proc init-all args {	if { [llength $args] == 0 } {		set nodeslist [[Simulator instance] all-nodes-list]	} else { 		eval "set nodeslist $args"	}	Agent set-maxttl Agent/rtProto/LS INFINITY	eval rtObject init-all $nodeslist	foreach node $nodeslist {		set proto($node) [[$node rtObject?] add-proto LS $node]	}	foreach node $nodeslist {		foreach nbr [$node neighbors] {			set rtobj [$nbr rtObject?]			if { $rtobj == "" } {				continue			}			set rtproto [$rtobj rtProto? LS]			if { $rtproto == "" } {				continue			}			$proto($node) add-peer $nbr \					[$rtproto set agent_addr_] \					[$rtproto set agent_port_]		}	}	# -- LS stuffs --	set first_node [lindex $nodeslist 0 ]	foreach node $nodeslist {		set rtobj [$node rtObject?]		if { $rtobj == "" } {			continue		}		set rtproto [$rtobj rtProto? LS]		if { $rtproto == "" } {			continue		}		$rtproto cmd initialize		if { $node == $first_node } {			$rtproto cmd setNodeNumber \				[[Simulator instance] get-number-of-nodes]		}	}}# like DV's , except LS_readyAgent/rtProto/LS instproc init node {	global rtglibRNG	$self next $node	$self instvar ns_ rtObject_ ifsUp_ rtsChanged_ rtpref_ nextHop_ \		nextHopPeer_ metric_ multiPath_	Agent/rtProto/LS instvar preference_ 		;# -- LS stuffs -- 	$self instvar LS_ready	set LS_ready 0	set rtsChanged_ 1	set UNREACHABLE [$class set UNREACHABLE]	foreach dest [$ns_ all-nodes-list] {		set rtpref_($dest) $preference_		set nextHop_($dest) ""		set nextHopPeer_($dest) ""		set metric_($dest)  $UNREACHABLE	}	set ifsUp_ ""	set multiPath_ [[$rtObject_ set node_] set multiPath_]	set updateTime [$rtglibRNG uniform 0.0 0.5]	$ns_ at $updateTime "$self send-periodic-update"}# like DV'sAgent/rtProto/LS instproc add-peer {nbr agentAddr agentPort} {	$self instvar peers_	$self set peers_($nbr) [new rtPeer $agentAddr $agentPort $class]}# like DV's, except cmd sendUpdates, instead of not send-updatesAgent/rtProto/LS instproc send-periodic-update {} {	global rtglibRNG		$self instvar ns_	# -- LS stuffs --	$self cmd sendUpdates	set updateTime [expr [$ns_ now] + ([$class set advertInterval] * \			[$rtglibRNG uniform 0.5 1.5])]	$ns_ at $updateTime "$self send-periodic-update"}# like DV's, except cmd computeRoutesAgent/rtProto/LS instproc compute-routes {} {	$self instvar node_	#puts "Node [$node_ id]: Agent/rtProto/LS compute-routes"	$self cmd computeRoutes	$self install-routes}# like DV's, except cmd intfChanged(), comment out DV stuffAgent/rtProto/LS instproc intf-changed {} {	$self instvar ns_ peers_ ifs_ ifstat_ ifsUp_ nextHop_ \			nextHopPeer_ metric_	set INFINITY [$class set INFINITY]	set ifsUp_ ""	foreach nbr [lsort -dictionary [array names peers_]] {		set state [$ifs_($nbr) up?]		if {$state != $ifstat_($nbr)} {			set ifstat_($nbr) $state		}	}	# -- LS stuffs --	$self cmd intfChanged	$self route-changed};# called by C++ whenever a LSA or Topo causes a change in the routing tableAgent/rtProto/LS instproc route-changed {} {	$self instvar node_ 	#puts "At [[Simulator instance] now] node [$node_ id]: Agent/rtProto/LS route-changed"	$self instvar rtObject_  rtsChanged_	$self install-routes	set rtsChanged_ 1	$rtObject_ compute-routes}# put the routes computed in C++ into tcl spaceAgent/rtProto/LS instproc install-routes {} {	$self instvar ns_ ifs_ rtpref_ metric_ nextHop_ nextHopPeer_	$self instvar peers_ rtsChanged_ multiPath_	$self instvar node_  preference_     	set INFINITY [$class set INFINITY]	set MAXPREF  [rtObject set maxpref_]	set UNREACH  [rtObject set unreach_]	set rtsChanged_ 1 		foreach dst [$ns_ all-nodes-list] {		# puts "installing routes for $dst"		if { $dst == $node_ } {			set metric_($dst) 32  ;# the magic number			continue		}		#  puts " [$node_ id] looking for route to [$dst id]"		set path [$self cmd lookup [$dst id]]		# puts "$path" ;# debug		if { [llength $path ] == 0 } {			# no path found in LS			set rtpref_($dst) $MAXPREF			set metric_($dst) $UNREACH			set nextHop_($dst) ""			continue		}		set cost [lindex $path 0]		set rtpref_($dst) $preference_		set metric_($dst) $cost				if { ! $multiPath_ } {			set nhNode [$ns_ get-node-by-id [lindex $path 1]]			set nextHop_($dst) $ifs_($nhNode)			continue		}		set nextHop_($dst) ""		set nh ""		set count [llength $path]		foreach nbr [lsort -dictionary [array names peers_]] {			foreach nhId [lrange $path 1 $count ] {				if { [$nbr id] == $nhId } {					lappend nextHop_($dst) $ifs_($nbr)					break				}			}		}	}}Agent/rtProto/LS instproc send-updates changes {	$self cmd send-buffered-messages}Agent/rtProto/LS proc compute-all {} {	# Because proc methods are not inherited from the parent class.}Agent/rtProto/LS instproc get-node-id {} {	$self instvar node_	return [$node_ id]}Agent/rtProto/LS instproc get-links-status {} {	$self instvar ifs_ ifstat_ 	set linksStatus ""	foreach nbr [array names ifs_] {		lappend linksStatus [$nbr id]		if {[$ifs_($nbr) up?] == "up"} {			lappend linksStatus 1		} else {			lappend linksStatus 0		}		lappend linksStatus [$ifs_($nbr) cost?]	}	set linksStatus}Agent/rtProto/LS instproc get-peers {} {	$self instvar peers_	set peers ""	foreach nbr [lsort -dictionary [array names peers_]] {		lappend peers [$nbr id]		lappend peers [$peers_($nbr) addr?]		lappend peers [$peers_($nbr) port?]	}	set peers}# needed to calculate the appropriate timeout value for retransmission # of unack'ed LSA or Topo messagesAgent/rtProto/LS instproc get-delay-estimates {} {	$self instvar ifs_ ifstat_ 	set total_delays ""	set packet_size 8000.0 ;# bits	foreach nbr [array names ifs_] {		set intf $ifs_($nbr)		set q_limit [ [$intf queue ] set limit_]		set bw [bw_parse [ [$intf link ] set bandwidth_ ] ]		set p_delay [time_parse [ [$intf link ] set delay_] ]		set total_delay [expr $q_limit * $packet_size / $bw + $p_delay]		$self cmd setDelay [$nbr id] $total_delay	}}

⌨️ 快捷键说明

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