📄 ns-lib.tcl
字号:
# -*- Mode:tcl; tcl-indent-level:8; tab-width:8; indent-tabs-mode:t -*-## Copyright (c) 1996 Regents of the University of California.# All rights reserved.# # Redistribution and use in source and binary forms, with or without# modification, are permitted provided that the following conditions# are met:# 1. Redistributions of source code must retain the above copyright# notice, this list of conditions and the following disclaimer.# 2. Redistributions in binary form must reproduce the above copyright# notice, this list of conditions and the following disclaimer in the# documentation and/or other materials provided with the distribution.# 3. All advertising materials mentioning features or use of this software# must display the following acknowledgement:# This product includes software developed by the MASH Research# Group at the University of California Berkeley.# 4. Neither the name of the University nor of the Research Group may be# used to endorse or promote products derived from this software without# specific prior written permission.# # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF# SUCH DAMAGE.## @(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/tcl/lib/ns-lib.tcl,v 1.271 2005/10/09 19:32:07 tomh Exp $## Word of warning to developers:# this code (and all it sources) is compiled into the# ns executable. You need to rebuild ns or explicitly# source this code to see changes take effect.#proc warn {msg} { global warned_ if {![info exists warned_($msg)]} { puts stderr "warning: $msg" set warned_($msg) 1 }}if {[info commands debug] == ""} { proc debug args { warn {Script debugging disabled. Reconfigure with --with-tcldebug, and recompile.} }}proc assert args { if [catch "expr $args" ret] { set ret [eval expr $args] } if {! $ret} { error "assertion failed: $args" }}proc find-max list { set max 0 foreach val $list { if {$val > $max} { set max $val } } return $max}proc bw_parse { bspec } { if { [scan $bspec "%f%s" b unit] == 1 } { set unit bps } regsub {[/p]s(ec)?$} $unit {} unit if [string match {*B} $unit] { set b [expr $b*8] set unit "[string trimright $unit B]b" } switch $unit { b { return $b } kb { return [expr $b*1000] } Mb { return [expr $b*1000000] } Gb { return [expr $b*1000000000] } default { puts "error: bw_parse: unknown unit `$unit'" exit 1 } }}proc time_parse { spec } { if { [scan $spec "%f%s" t unit] == 1 } { set unit s } regsub {sec$} $unit {s} unit switch $unit { s { return $t } ms { return [expr $t*1e-3] } us { return [expr $t*1e-6] } ns { return [expr $t*1e-9] } ps { return [expr $t*1e-12] } default { puts "error: time_parse: unknown unit `$unit'" exit 1 } }}proc delay_parse { spec } { return [time_parse $spec]}## Create the core OTcl class called "Simulator".# This is the principal interface to the simulation engine.##Class Simulator## XXX Whenever you modify the source list below, please also change the# OTcl script dependency list in Makefile.in#source ns-autoconf.tclsource ns-address.tclsource ns-node.tclsource ns-rtmodule.tclsource ns-hiernode.tclsource ns-mobilenode.tclsource ns-bsnode.tclsource ns-link.tclsource ns-source.tclsource ns-compat.tclsource ns-packet.tclsource ns-queue.tclsource ns-trace.tclsource ns-random.tclsource ns-agent.tclsource ns-route.tclsource ns-errmodel.tclsource ns-intserv.tclsource ns-cmutrace.tclsource ns-mip.tclsource ns-sat.tcl#source ns-nix.tclsource ns-diffusion.tclsource ../rtp/session-rtp.tclsource ../interface/ns-iface.tclsource ../lan/ns-mac.tcl# Added by Sushmita to support event tracing for mac-simple and 802.11source ../lan/ns-mac-simple.tclsource ../lan/ns-mac-802_11.tclsource ../lan/ns-ll.tclsource ../lan/vlan.tclsource ../lan/abslan.tclsource ../mcast/timer.tclsource ../mcast/ns-mcast.tclsource ns-srcrt.tclsource ../mcast/McastProto.tclsource ../mcast/DM.tclsource ../ctr-mcast/CtrMcast.tclsource ../ctr-mcast/CtrMcastComp.tclsource ../ctr-mcast/CtrRPComp.tclsource ../mcast/BST.tclsource ../mcast/srm.tclsource ../mcast/srm-ssm.tcl# These files removed due to licensing conflicts# source ../mcast/mftp_snd.tcl# source ../mcast/mftp_rcv.tcl# source ../mcast/mftp_rcv_stat.tclsource ../mcast/McastMonitor.tclsource ../rlm/rlm.tclsource ../rlm/rlm-ns.tclsource ../session/session.tclsource ../webcache/http-server.tclsource ../webcache/http-cache.tclsource ../webcache/http-agent.tclsource ../webcache/http-mcache.tclsource ../webcache/webtraf.tclsource ../webcache/empweb.tclsource ns-namsupp.tclsource ../mobility/dsdv.tclsource ../mobility/dsr.tclsource ../mobility/com.tclsource ../plm/plm.tclsource ../plm/plm-ns.tclsource ../plm/plm-topo.tcl# MPLSsource ../mpls/ns-mpls-simulator.tclsource ../mpls/ns-mpls-node.tclsource ../mpls/ns-mpls-ldpagent.tclsource ../mpls/ns-mpls-classifier.tclsource ns-default.tclsource ../emulate/ns-emulate.tcl#pushbacksource ns-pushback.tcl# PGM#source ../pgm/ns-pgm.tcl#LMSsource ../mcast/ns-lms.tcl#WIMAXsource ns-wimax.tcl# STL dependent modules get included# ONLY when STL is foundif {[ns-hasSTL] == 1} {source ns-nix.tclsource ../pgm/ns-pgm.tclsource ../rtglib/ns-rtProtoLS.tcl}source ns-qsnode.tcl# Obsolete modules#source ns-wireless-mip.tcl#source ns-nam.tclSimulator instproc init args { # Debojyoti added this for asim $self instvar useasim_ $self instvar slinks_ $self instvar nconn_ $self instvar sflows_ $self instvar nsflows_ set slinks_(0:0) 0 set nconn_ 0 set conn_ "" # for short flows stuff set sflows_ "" set nsflows_ 0 set useasim_ 0 $self create_packetformat $self use-scheduler Calendar #$self use-scheduler List $self set nullAgent_ [new Agent/Null] $self set-address-format def if {[lindex $args 0] == "-multicast"} { $self multicast $args } eval $self next $args}Simulator instproc nullagent {} { $self instvar nullAgent_ return $nullAgent_}Simulator instproc use-scheduler type { $self instvar scheduler_ if [info exists scheduler_] { if { [$scheduler_ info class] == "Scheduler/$type" } { return } else { delete $scheduler_ } } set scheduler_ [new Scheduler/$type] $scheduler_ now}Simulator instproc delay_parse { spec } { return [time_parse $spec]}Simulator instproc bw_parse { spec } { return [bw_parse $spec]}## A simple method to wrap any object around# a trace object that dumps to stdout#Simulator instproc dumper obj { set t [$self alloc-trace hop stdout] $t target $obj return $t}# New node structure## Add APT to support multi-interface: user can specified multiple channels# when config nod. Still need modifications in routing agents to make# multi-interfaces really work. -chen xuan 07/21/00## Define global node configuration# $ns_ node-config -addressType flat/hierarchical# -adhocRouting DSDV/DSR/TORA# -llType# -macType# -propType# -ifqType# -ifqLen# -phyType# -antType# -channel# -channelType# -topologyInstance# -wiredRouting ON/OFF# -mobileIP ON/OFF# -energyModel "EnergyModel"# -initialEnergy (in Joules)# -rxPower (in W)# -txPower (in W)# -idlePower (in W)## -sleepPower (in W)## -agentTrace ON# -routerTrace ON # -macTrace OFF # -toraDebug OFF # -movementTrace OFF# change wrt Mike's code# -eotTrace OFF# -diffusionFilter "GradientFilter/OnePhasePullFilter/GeoRoutingFilter/RmstFilter/SourceRouteFilter/LogFilter/TagFilter"Simulator instproc addressType {val} { $self set addressType_ $val }Simulator instproc adhocRouting {val} { $self set routingAgent_ $val }Simulator instproc llType {val} { $self set llType_ $val }Simulator instproc macType {val} { $self set macType_ $val }Simulator instproc propType {val} { $self set propType_ $val }Simulator instproc propInstance {val} { $self set propInstance_ $val }Simulator instproc ifqType {val} { $self set ifqType_ $val }Simulator instproc ifqLen {val} { $self set ifqlen_ $val }Simulator instproc phyType {val} { $self set phyType_ $val }Simulator instproc antType {val} { $self set antType_ $val }Simulator instproc channel {val} {$self set channel_ $val}Simulator instproc channelType {val} {$self set channelType_ $val}Simulator instproc topoInstance {val} {$self set topoInstance_ $val}Simulator instproc wiredRouting {val} {$self set wiredRouting_ $val}Simulator instproc mobileIP {val} {$self set mobileIP_ $val}Simulator instproc energyModel {val} { $self set energyModel_ $val }Simulator instproc initialEnergy {val} { $self set initialEnergy_ $val }Simulator instproc txPower {val} { $self set txPower_ $val }Simulator instproc rxPower {val} { $self set rxPower_ $val }Simulator instproc idlePower {val} { $self set idlePower_ $val }#Simulator instproc sleepPower {val} { $self set sleepPower_ $val }Simulator instproc transitionPower {val} { $self set transitionPower_ $val }Simulator instproc transitionTime {val} { $self set transitionTime_ $val }#Simulator instproc IncomingErrProc {val} { $self set inerrProc_ $val }Simulator instproc OutgoingErrProc {val} { $self set outerrProc_ $val }Simulator instproc FECProc {val} { $self set FECProc_ $val }Simulator instproc agentTrace {val} { $self set agentTrace_ $val }Simulator instproc routerTrace {val} { $self set routerTrace_ $val }Simulator instproc macTrace {val} { $self set macTrace_ $val }Simulator instproc movementTrace {val} { $self set movementTrace_ $val }Simulator instproc toraDebug {val} {$self set toraDebug_ $val }Simulator instproc satNodeType {val} {$self set satNodeType_ $val}Simulator instproc downlinkBW {val} {$self set downlinkBW_ $val}Simulator instproc stopTime {val} {$self set stopTime_ $val}# change wrt Mike's codeSimulator instproc eotTrace {val} { $self set eotTrace_ $val }Simulator instproc diffusionFilter {val} {$self set diffFilter_ $val}Simulator instproc MPLS { val } { if { $val == "ON" } { Node enable-module "MPLS" } else { Node disable-module "MPLS" }}Simulator instproc PGM { val } { if { $val == "ON" } { Node enable-module "PGM" } else { Node disable-module "PGM" }}Simulator instproc LMS { val } { if { $val == "ON" } { Node enable-module "LMS" } else { Node disable-module "LMS" }}Simulator instproc get-nodetype {} { $self instvar addressType_ routingAgent_ wiredRouting_ set val "" if { [info exists addressType_] && $addressType_ == "hierarchical" } { set val Hier } if { [info exists routingAgent_] && $routingAgent_ != "" } { set val Mobile } if { [info exists wiredRouting_] && $wiredRouting_ == "ON" } { set val Base } if { [info exists wiredRouting_] && $wiredRouting_ == "OFF"} { set val Base } if { [Simulator set mobile_ip_] } { if { $val == "Base" && $wiredRouting_ == "ON" } { set val MIPBS } if { $val == "Base" && $wiredRouting_ == "OFF" } { set val MIPMH } } return $val}Simulator instproc node-config args { # Object::init-vars{} is defined in ~tclcl/tcl-object.tcl. # It initializes all default variables in the following way: # 1. Look for pairs of {-cmd val} in args # 2. If "$self $cmd $val" is not valid then put it in a list of # arguments to be returned to the caller. # # Since we do not handle undefined {-cmd val} pairs, we ignore # return value from init-vars{}. set args [eval $self init-vars $args] $self instvar addressType_ routingAgent_ propType_ macTrace_ \ routerTrace_ agentTrace_ movementTrace_ channelType_ channel_ \ chan topoInstance_ propInstance_ mobileIP_ \ rxPower_ txPower_ idlePower_ sleepPower_ transitionPower_ \ transitionTime_ satNodeType_ eotTrace_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -