ns-namsupp.tcl

来自「一款用来进行网络模拟的软件」· TCL 代码 · 共 591 行 · 第 1/2 页

TCL
591
字号
        set attr_(DLABEL) \"$label\"    }Link instproc label-color { str } {        $self instvar attr_ fromNode_ toNode_ trace_        set ns [Simulator instance]        if [info exists attr_(DCOLOR)] {            $ns puts-nam-config \            "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DCOLOR -e \"$str\" -E $attr_(DCOLOR)"        } else {            $ns puts-nam-config \            "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DCOLOR -e \"$str\" -E \"\""        }        set attr_(DCOLOR) \"$str\"    }Link instproc label-at { str } {        $self instvar attr_ fromNode_ toNode_ trace_        set ns [Simulator instance]        if [info exists attr_(DIRECTION)] {            $ns puts-nam-config \            "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DIRECTION -p \"$str\" -P $attr_(DIRECTION)"        } else {            $ns puts-nam-config \            "l -t [$ns now] -s [$fromNode_ id] -d [$toNode_ id] -S DIRECTION -p \"$str\" -P \"\""        }        set attr_(DIRECTION) \"$str\"    }## Support for nam snapshot#Simulator instproc snapshot { } {    set ns [Simulator instance]    $ns puts-nam-config \            "v -t [$self now] take_snapshot"}Simulator instproc rewind-nam { } {	set ns [Simulator instance]	$ns puts-nam-config \			"v  -t [$self now] playing_backward"}Simulator instproc re-rewind-nam { } {	set ns [Simulator instance]	$ns puts-nam-config \				"v  -t [$self now] playing_forward"}Simulator instproc terminate-nam { } {	set ns [Simulator instance]	$ns puts-nam-config \				"v  -t [$self now] terminating_nam"}## Support for agent tracing## This function records agents being traced, so they will be written into nam# trace when the simulator startsSimulator instproc add-agent-trace { agent name {f ""} } {	$self instvar tracedAgents_	set tracedAgents_($name) $agent	set trace [$self get-nam-traceall]	if {$f != ""} {		$agent attach-trace $f	} elseif {$trace != ""} {		$agent attach-trace $trace	}}Simulator instproc delete-agent-trace { agent } {	$agent delete-agent-trace}Simulator instproc monitor-agent-trace { agent } {	$self instvar monitoredAgents_	lappend monitoredAgents_ $agent}## Agent trace is added when attaching to a traced node# we need to keep a file handle in tcl so that var tracing can also be # done in tcl by manual inserting update-var-trace{}#Agent instproc attach-trace { file } {	$self instvar namTrace_	set namTrace_ $file 	# add all traced var messages	$self attach $file }## nam initialization#Simulator instproc dump-namagents {} {	$self instvar tracedAgents_ monitoredAgents_		if {![$self is-started]} {		return	}	if [info exists tracedAgents_] {		foreach id [array names tracedAgents_] {			$tracedAgents_($id) add-agent-trace $id			$tracedAgents_($id) cmd dump-namtracedvars		}		unset tracedAgents_	}	if [info exists monitoredAgents_] {		foreach a $monitoredAgents_ {			$a show-monitor		}		unset monitoredAgents_	}}Simulator instproc dump-namversion { v } {	$self puts-nam-config "V -t * -v $v -a 0"}Simulator instproc dump-namwireless {} {	$self instvar namNeedsW_ namWx_ namWy_	# see if we need to write a W event	if ![info exists namNeedsW_] { set namNeedsW_ 0 }	if {[info exists namWx_] && [info exists namWy_]}  {		set maxX $namWx_		set maxY $namWy_	} else {		set maxX 10		set maxY 10		# get max X and Y coords of nodes		# if any nodes have coordinates set, then flag the need for		# a W event and adjust maxX/maxY as needed		foreach node [Node info instances] {			if {[lsearch -exact [$node info vars] X_] != -1} {				set namNeedsW_ 1				set curX [$node set X_]				if {$curX > $maxX} {set maxX $curX}			}			if {[lsearch -exact [$node info vars] Y_] != -1} {				set namNeedsW_ 1				set curY [$node set Y_]				if {$curY > $maxY} {set maxY $curY}			}		}	}	if $namNeedsW_ {		$self puts-nam-config "W -t * -x $maxX -y $maxY"	}}Simulator instproc dump-namcolors {} {	$self instvar color_	if ![$self is-started] {		return 	}	foreach id [array names color_] {		$self puts-nam-config "c -t * -i $id -n $color_($id)"	}}Simulator instproc dump-namlans {} {	if ![$self is-started] {		return	}	$self instvar Node_	foreach nn [array names Node_] {		if [$Node_($nn) is-lan?] {			$Node_($nn) dump-namconfig		}	}}Simulator instproc dump-namlinks {} {	$self instvar linkConfigList_	if ![$self is-started] {		return	}	if [info exists linkConfigList_] {		foreach lnk $linkConfigList_ {			$lnk dump-namconfig		}		unset linkConfigList_	}}Simulator instproc dump-namnodes {} {	$self instvar Node_	if ![$self is-started] {		return	}	foreach nn [array names Node_] {		if ![$Node_($nn) is-lan?] {			$Node_($nn) dump-namconfig		}	}}Simulator instproc dump-namqueues {} {	$self instvar link_	if ![$self is-started] {		return	}	foreach qn [array names link_] {		$link_($qn) dump-nam-queueconfig	}}# Write hierarchical masks/shifts into trace fileSimulator instproc dump-namaddress {} {	# First write number of hierarchies	$self puts-nam-config \	    "A -t * -n [AddrParams hlevel] -p 0 -o [AddrParams set \ALL_BITS_SET] -c [AddrParams McastShift] -a [AddrParams McastMask]"		for {set i 1} {$i <= [AddrParams hlevel]} {incr i} {		$self puts-nam-config "A -t * -h $i -m [AddrParams \NodeMask $i] -s [AddrParams NodeShift $i]"	}}Simulator instproc init-nam {} {	$self instvar annotationSeq_ 	set annotationSeq_ 0	# Setting nam trace file version first	$self dump-namversion 1.0a5		# write W event if needed	$self dump-namwireless	# Addressing scheme	$self dump-namaddress		# Color configuration for nam	$self dump-namcolors		# Node configuration for nam	$self dump-namnodes		# Lan and Link configurations for nam	$self dump-namlinks 	$self dump-namlans		# nam queue configurations	$self dump-namqueues		# Traced agents for nam	$self dump-namagents}## Other animation control support# Simulator instproc trace-annotate { str } {	$self instvar annotationSeq_	$self puts-ns-traceall [format \		"v %s %s {set sim_annotation {%s}}" [$self now] eval $str]	incr annotationSeq_	$self puts-nam-config [format \		"v -t %.15g -e sim_annotation %.15g $annotationSeq_ $str" \		[$self now] [$self now] ]}proc trace_annotate { str } {	set ns [Simulator instance]	$ns trace-annotate $str}proc flash_annotate { start duration msg } {	set ns [Simulator instance]	$ns at $start "trace_annotate {$msg}"	$ns at [expr $start+$duration] "trace_annotate periodic_message"}# rate's unit is secondSimulator instproc set-animation-rate { rate } {	# time_parse defined in tcl/rtp/session-rtp.tcl	set r [time_parse $rate]	# This old nam api (set_rate) works but is quite obscure,	# the new api (set_rate_ext) is simpler.	# $self puts-nam-config "v -t [$self now] set_rate [expr 10*log10($r)] 1"	$self puts-nam-config "v -t [$self now] set_rate_ext $r 1"}

⌨️ 快捷键说明

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