📄 ns-rsvp.tcl
字号:
## Copyright (c) 1998 The University of Bonn# All rights reserved.# # Permission to use and copy this software in source and binary forms# is hereby granted, provided that the above copyright notice, this# paragraph and the following disclaimer are retained in any copies# of any part of this software and that the University of Bonn is# acknowledged in all documentation pertaining to any such copy# or derivative work. The name of the University of Bonn may not# be used to endorse or promote products derived from this software# without specific prior written permission.## THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL # THE UNIVERSITY OF BONN BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF # OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE.#WFQClass set limit_ 5000WFQClass set bw_ 0WFQClass set blocked_ falseWFQClass set unblock_on_resume_ trueWFQClass set debug_ falseQueue/WFQ set wf2q_ 0Queue/WFQ set prio_ 0Queue/WFQ set best_effort_ 0Queue/WFQ set borrow_ 0Queue/WFQ set num_classes_ 0Queue/WFQ set num_flows_ 0Queue/WFQ set num_drops_ 0Queue/WFQ set size_drops_ 0Agent/RSVP set noisy_ 0Agent/RSVP set refresh_ 30Agent/RSVP set lifetime_factor_ 3Agent/RSVP set ip6_ 0Agent/RSVP set fid_ 46Agent/RSVP set num_flows_ 0Agent/RSVP set num_rsb_ 0Agent/RSVP set num_psb_ 0Agent/RSVP set nam_ 1RSVPLink set src_ -1RSVPLink set dst_ -1RSVPLink set besteffort_ 0RSVPLink set debug_ falseRSVPChecker set src_ 0RSVPChecker set debug_ false# Clear the stats for a WFQ queueQueue/WFQ instproc clear-stats {} { $self set num_drops_ 0 $self set size_drops_ 0}# Upcall procedure for path eventsAgent/RSVP instproc upcall-path { sid rate bucket sender } { set ns [Simulator instance] puts "[expr [$self set agent_addr_]] \ PATH EVENT at [format "%3.3f" [$ns now]] :\ SID: $sid RATE: [format "%.0f" $rate] BUCKET:\ $bucket SENDER: $sender"}# Upcall procedure for path-tear eventsAgent/RSVP instproc upcall-path-tear { sid sender } { set ns [Simulator instance] puts "[expr [$self set agent_addr_] ] \ PATHTEAR EVENT at [format "%3.3f" [$ns now]] :\ SID: $sid SENDER: $sender"}# Upcall procedure for resv-tear eventsAgent/RSVP instproc upcall-resv-tear { sid sender } { set ns [Simulator instance] puts "[expr [$self set agent_addr_] ] \ RESVTEAR EVENT at [format "%3.3f" [$ns now]] :\ SID: $sid SENDER: $sender"}# Upcall procedure for resv eventsAgent/RSVP instproc upcall-resv { sid rate bucket sender } { set ns [Simulator instance] puts "[expr [$self set agent_addr_] ] \ RESV EVENT at [format "%3.3f" [$ns now]] :\ SID: $sid RATE: [format "%.0f" $rate]\ BUCKET: $bucket SENDER: $sender"}# Upcall procedure for path-timeout eventsAgent/RSVP instproc upcall-path-timeout { sid sender } { set ns [Simulator instance] puts "[expr [$self set agent_addr_] ] \ PATHTIMEOUT EVENT at [format "%3.3f" [$ns now]] :\ SID: $sid SENDER: $sender"}# Upcall procedure for resv-timeout eventsAgent/RSVP instproc upcall-resv-timeout { sid sender } { set ns [Simulator instance] puts "[expr [$self set agent_addr_] ] \ RESVTIMEOUT EVENT at [format "%3.3f" [$ns now]] :\ SID: $sid SENDER: $sender"}# Upcall procedure for resv-confirm eventsAgent/RSVP instproc upcall-resv-confirm { sid sender node } { set ns [Simulator instance] puts "[expr [$self set agent_addr_] ] \ RESVCONF EVENT at [format "%3.3f" [$ns now]] :\ SID: $sid SENDER: $sender NODE: $node"}# Upcall procedure for resv-error eventsAgent/RSVP instproc upcall-resv-error { sid code value node } { set ns [Simulator instance] puts "[expr [$self set agent_addr_] ] \ RESVERROR EVENT at [format "%3.3f" [$ns now]] :\ SID: $sid CODE: $code VALUE: $value NODE: $node"}# Return the admission control module which is attached to the link# between n1 and n2.Agent/RSVP instproc get-adc { n1 n2 } { set link [[Simulator instance] link $n1 $n2] return [$link set adc_]}# Check if the node the agent is attached to is a leaf in the# source-tree for the multicast group 'dst' and the source 'src'.Agent/RSVP instproc is-leaf { src dst } { set node [$self set node_] set rep [$node getReps $src $dst] if { $rep == "" } { return 1 } if { [$rep slots] == "" } { return 1 } return 0}# Create a class for the best-effort trafficRSVPLink instproc set-be { bw lim que } { $self instvar wfq_be_ set wfq_be_ [new WFQClass] $wfq_be_ set limit_ $lim $wfq_be_ set bw_ $bw $que add $wfq_be_ $que bind $wfq_be_ -1 0}# Return the best-effort traffic classRSVPLink instproc get-be {} { $self instvar wfq_be_ return $wfq_be_}# Set the destination for an RSVPChecker objectRSVPChecker instproc set-dst { node } { $self instvar dst_ set dst_ $node }# Set the source for an RSVPChecker objectRSVPChecker instproc set-src { node } { $self instvar src_ set src_ [$node id]}# Return the destination for an RSVPChecker objectRSVPChecker instproc get-rsvp-agent {} { $self instvar dst_ return [$dst_ get-rsvp-agent]}# Return the address of the destination agent for an RSVPChecker objectRSVPChecker instproc get-rsvp-agent-addr {} { $self instvar dst_ set agent [$dst_ get-rsvp-agent] return [$agent set agent_addr_]}# Add an RSVP agent to a nodeNode instproc add-rsvp-agent {} { $self instvar rsvp_ set rsvp_ [new Agent/RSVP] [Simulator instance] attach-agent $self $rsvp_ return $rsvp_}# Return a node's RSVP agent (or nothing if there is none)Node instproc get-rsvp-agent {} { $self instvar rsvp_ if [info exists rsvp_] { return $rsvp_ } else { return }}# Add an RSVPChecker object to a linkSimpleLink instproc add-rsvp-checker { check } { $self instvar rsvpcheck_ link_ ttl_ set rsvpcheck_ $check}# Connect two RSVP agentsSimulator instproc connect-rsvp-agents { n1 n2 } { set a1 [[$self get-node-by-id $n1] get-rsvp-agent] set a2 [[$self get-node-by-id $n2] get-rsvp-agent] $self connect $a1 $a2}# Add a single reservation to a link's schedulerSimulator instproc add-reservation { n1 n2 rate size} { set link_ [$self link $n1 $n2] set queue_ [$link_ queue] set wfq [new WFQClass] $wfq set limit_ $size $wfq set bw_ $rate $queue_ add $wfq set signalmod_ [$link_ set signalmod_] set be_ [$signalmod_ get-be] $be_ set bw_ [expr [$be_ set bw_] - $rate] return $wfq}# Modify a reservationSimulator instproc modify-reservation { n1 n2 wfq rate size} { set diff [expr $rate - [$wfq set bw_]] $wfq set limit_ $size $wfq set bw_ $rate set link_ [$self link $n1 $n2] set signalmod_ [$link_ set signalmod_] set be_ [$signalmod_ get-be] $be_ set bw_ [expr [$be_ set bw_] - $diff]}# Remove a reservation from a link's schedulerSimulator instproc delete-reservation { n1 n2 wfq } { $self modify-reservation $n1 $n2 $wfq 0 0 set link_ [$self link $n1 $n2] set queue_ [$link_ queue] $queue_ remove $wfq delete $wfq}# Bind a filter/fid combination to a reservationSimulator instproc add-filter-fid { n1 n2 wfq sender fid } { set link_ [$self link $n1 $n2] set queue_ [$link_ queue] $queue_ bind $wfq $sender $fid}# Unbind a filter/fid combination from a reservationSimulator instproc delete-filter-fid { n1 n2 sender fid } { set link_ [$self link $n1 $n2] set queue_ [$link_ queue] $queue_ unbind $sender $fid}# Set up an RSVP link with an RSVPChecker object, admission# control and a class for the best-effort trafficSimulator instproc setup-rsvp-link { n1 n2 bw res signal lim } { set link_ [$self link $n1 $n2] set ttl_ [$link_ set ttl_] set rsvpcheck_ [new RSVPChecker] $rsvpcheck_ set-dst $n2 $rsvpcheck_ target [$ttl_ target] $ttl_ target $rsvpcheck_ $rsvpcheck_ set-dst $n2 $rsvpcheck_ set-src $n1 set adc_ [$link_ set adc_] $adc_ set utilization_ $res set queue_ [$link_ queue] $queue_ set best_effort_ 1 $queue_ set borrow_ 1 $queue_ set src_ 1 set signalmod_ [$link_ set signalmod_] $signalmod_ set-be $bw $lim $queue_ set sigwfq [new WFQClass] if { $signal > 0 } { $sigwfq set limit_ 1000 $sigwfq set bw_ $signal $queue_ add $sigwfq $queue_ bind $sigwfq -1 46 set be_ [$signalmod_ get-be] $be_ set bw_ [expr [$be_ set bw_] - $signal] }}# Create a duplex RSVP link# Arguments: Node1, Node2, Bandwidth, Delay, Reservable Portion of the# link, portion of the link reserved for RSVP messages, queue size for the # best-effort class, admission control module, estimator module (for # measurement based admission control)Simulator instproc duplex-rsvp-link { n1 n2 bw delay res signal lim adc est } { $self duplex-intserv-link $n1 $n2 $bw $delay WFQ RSVPLink $adc $est CL $self setup-rsvp-link $n1 $n2 $bw $res $signal $lim $self setup-rsvp-link $n2 $n1 $bw $res $signal $lim}# To get rid of the warnings when using ADC/Param:ADC/Param set utilization_ 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -