⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fq.tcl

📁 ns gpsr路由协议 在ns2平台下实现的 对大家很有好处
💻 TCL
字号:
## This file contains a preliminary cut at fair-queueing for ns# as well as a number of stubs for Homework 3 in CS268.## $Header: /home/mole/u0/bkarp/cvsroot/ns-2.1b6/tcl/ex/fq.tcl,v 1.1.1.1 1999/07/29 03:27:30 bkarp Exp $#set ns [new Simulator]# override built-in link allocator$ns proc simplex-link { n1 n2 bw delay type } {	$self instvar link_ queueMap_ nullAgent_	$self instvar traceAllFile_	set sid [$n1 id]	set did [$n2 id]	if [info exists queueMap_($type)] {		set type $queueMap_($type)	}	if { $type == "FQ" } {		set link_($sid:$did) [new FQLink $n1 $n2 $bw $delay $nullAgent_]	} else {		set q [new Queue/$type]		$q drop-target $nullAgent_		set link_($sid:$did) [new SimpleLink $n1 $n2 $bw $delay $q]	}	$n1 add-neighbor $n2	#XXX yuck	if { $type == "RED" } {	 	set bw [[$link_($sid:$did) set link_] set bandwidth_]		$q set ptc_ [expr $bw / (8. * [$q set mean_pktsize_])]	}        if [info exists traceAllFile_] {                $self trace-queue $n1 $n2 $traceAllFile_        }	set trace [$self get-ns-traceall]	if {$trace != ""} {		$self trace-queue $n1 $n2 $trace	}	set trace [$self get-nam-traceall]	if {$trace != ""} {		$self namtrace-queue $n1 $n2 $trace	}}Class Classifier/Hash/Fid/FQ -superclass Classifier/Hash/FidClassifier/Hash/Fid/FQ instproc unknown-flow { src dst fid buck } {	$self instvar fq_	$fq_ new-flow $src $dst $fid}Class FQLink -superclass LinkFQLink instproc init { src dst bw delay nullAgent } {	$self next $src $dst	$self instvar link_ queue_ head_ toNode_ ttl_ classifier_ \		nactive_ drpT_	$self instvar drophead_		;# idea stolen from CBQ and Kevin	set drpT_ $nullAgent	set nactive_ 0	set queue_ [new Queue/FQ]	set link_ [new DelayLink]	$link_ set bandwidth_ $bw	$link_ set delay_ $delay	set classifier_ [new Classifier/Hash/Fid/FQ 33]	$classifier_ set fq_ $self	$queue_ target $link_	$queue_ drop-target $nullAgent	$link_ target [$toNode_ entry]	set head_ $classifier_	set drophead_ [new Connector]	$drophead_ target [[Simulator instance] set nullAgent_]	# XXX	# put the ttl checker after the delay	# so we don't have to worry about accounting	# for ttl-drops within the trace and/or monitor	# fabric	#	set ttl_ [new TTLChecker]	$ttl_ target [$link_ target]	$link_ target $ttl_	$queue_ set secsPerByte_ [expr 8.0 / [$link_ set bandwidth_]]}Queue set limit_ 10FQLink set queueManagement_ REDFQLink set queueManagement_ DropTailFQLink instproc new-flow { src dst fid } {	$self instvar classifier_ nactive_ queue_ link_ drpT_	incr nactive_	set type [$class set queueManagement_]	set q [new Queue/$type]	#XXX yuck	if { $type == "RED" } {	 	set bw [$link_ set bandwidth_]		$q set ptc_ [expr $bw / (8. * [$q set mean_pktsize_])]	}	$q drop-target $drpT_	set slot [$classifier_ installNext $q]	$classifier_ set-hash auto $src $dst $fid $slot	$q target $queue_	$queue_ install $fid $q}#XXX ask Kannan why this isn't in otcl base class.FQLink instproc up? { } {	return up}## should be called after SimpleLink::trace#FQLink instproc nam-trace { ns f } {	$self instvar enqT_ deqT_ drpT_ rcvT_ dynT_	if [info exists enqT_] {		$enqT_ namattach $f		if [info exists deqT_] {			$deqT_ namattach $f		}		if [info exists drpT_] {			$drpT_ namattach $f		}		if [info exists rcvT_] {			$rcvT_ namattach $f		}		if [info exists dynT_] {			foreach tr $dynT_ {				$tr namattach $f			}		}	} else {		#XXX 		# we use enqT_ as a flag of whether tracing has been		# initialized		$self trace $ns $f "nam"	}}## Support for link tracing# XXX only SimpleLink (and its children) can dump nam config, because Link# doesn't have bandwidth and delay.#FQLink instproc dump-namconfig {} {	# make a duplex link in nam	$self instvar link_ attr_ fromNode_ toNode_	if ![info exists attr_(COLOR)] {		set attr_(COLOR) "black"	}	if ![info exists attr_(ORIENTATION)] {		set attr_(ORIENTATION) ""	}	set ns [Simulator instance]	set bw [$link_ set bandwidth_]	set delay [$link_ set delay_]	$ns puts-nam-config \		"l -t * -s [$fromNode_ id] -d [$toNode_ id] -S UP -r $bw -D $delay -o $attr_(ORIENTATION)"}FQLink instproc dump-nam-queueconfig {} {	$self instvar attr_ fromNode_ toNode_	set ns [Simulator instance]	if [info exists attr_(QUEUE_POS)] {		$ns puts-nam-config "q -t * -s [$fromNode_ id] -d [$toNode_ id] -a $attr_(QUEUE_POS)"	} else {		set attr_(QUEUE_POS) ""	}}## Build trace objects for this link and# update the object linkage## create nam trace files if op == "nam"#FQLink instproc trace { ns f {op ""} } {	$self instvar enqT_ deqT_ drpT_ queue_ link_ head_ fromNode_ toNode_	$self instvar rcvT_ ttl_	$self instvar drophead_		;# idea stolen from CBQ and Kevin	set enqT_ [$ns create-trace Enque $f $fromNode_ $toNode_ $op]	set deqT_ [$ns create-trace Deque $f $fromNode_ $toNode_ $op]	set drpT_ [$ns create-trace Drop $f $fromNode_ $toNode_ $op]	set rcvT_ [$ns create-trace Recv $f $fromNode_ $toNode_ $op]	$self instvar drpT_ drophead_	set nxt [$drophead_ target]	$drophead_ target $drpT_	$drpT_ target $nxt	$queue_ drop-target $drophead_#	$drpT_ target [$queue_ drop-target]#	$queue_ drop-target $drpT_	$deqT_ target [$queue_ target]	$queue_ target $deqT_	#$enqT_ target $head_	#set head_ $enqT_       -> replaced by the following        if { [$head_ info class] == "networkinterface" } {	    $enqT_ target [$head_ target]	    $head_ target $enqT_	    # puts "head is i/f"        } else {	    $enqT_ target $head_	    set head_ $enqT_	    # puts "head is not i/f"	}	# put recv trace after ttl checking, so that only actually 	# received packets are recorded	$rcvT_ target [$ttl_ target]	$ttl_ target $rcvT_	$self instvar dynamics_	if [info exists dynamics_] {		$self trace-dynamics $ns $f $op	}}## Insert objects that allow us to monitor the queue size# of this link.  Return the name of the object that# can be queried to determine the average queue size.#FQLink instproc init-monitor ns {	puts stderr "FQLink::init-monitor not implemented"}#Queue/RED set thresh_ 3#Queue/RED set maxthresh_ 8proc build_topology { ns which } {        $ns color 1 red        $ns color 2 white	foreach i "0 1 2 3" {		global n$i		set tmp [$ns node]		set n$i $tmp	}	$ns duplex-link $n0 $n2 5Mb 2ms DropTail	$ns duplex-link $n1 $n2 5Mb 10ms DropTail	$ns duplex-link-op $n0 $n2 orient right-down	$ns duplex-link-op $n1 $n2 orient right-up	if { $which == "FIFO" } {		$ns duplex-link $n2 $n3 1.5Mb 10ms DropTail	} elseif { $which == "RED" } {		$ns duplex-link $n2 $n3 1.5Mb 10ms RED	} else {		$ns duplex-link $n2 $n3 1.5Mb 10ms FQ	}	$ns duplex-link-op $n2 $n3 orient right	$ns duplex-link-op $n2 $n3 queuePos 0.5}proc build_tcp { from to startTime } {	global ns	set tcp [new Agent/TCP]	set sink [new Agent/TCPSink]	$ns attach-agent $from $tcp	$ns attach-agent $to $sink	$ns connect $tcp $sink	set ftp [new Application/FTP]	$ftp attach-agent $tcp	$ns at $startTime "$ftp start"	return $tcp}proc finish file {	set f [open temp.rands w]	puts $f "TitleText: $file"	puts $f "Device: Postscript"		exec rm -f temp.p temp.d 	exec touch temp.d temp.p	#	# split queue/drop events into two separate files.	# we don't bother checking for the link we're interested in	# since we know only such events are in our trace file	#	exec awk {		{			if (($1 == "+" || $1 == "-" ) && \			    ($5 == "tcp"))\					print $2, $8 + ($11 % 90) * 0.01		}	} out.tr > temp.p	exec awk {		{			if ($1 == "d")				print $2, $8 + ($11 % 90) * 0.01		}	} out.tr > temp.d	puts $f \"packets	flush $f	exec cat temp.p >@ $f	flush $f	# insert dummy data sets so we get X's for marks in data-set 4	puts $f [format "\n\"skip-1\n0 1\n\n\"skip-2\n0 1\n\n"]	puts $f \"drops	flush $f	#	# Repeat the first line twice in the drops file because	# often we have only one drop and xgraph won't print marks	# for data sets with only one point.	#	exec head -1 temp.d >@ $f	exec cat temp.d >@ $f	close $f	exec xgraph -bb -tk -nl -m -x time -y packet temp.rands &	# dump the highest seqno sent of each tcp agent	# this gives an idea of throughput	set k 1	while 1 {		global tcp$k		if [info exists tcp$k] {			set tcp [set tcp$k]			puts "tcp$k seqno [$tcp set t_seqno_]"		} else {			break		}		incr k	}	exit 0}set f [open out.tr w]$ns trace-all $fset nf [open out.nam w]$ns namtrace-all $nfbuild_topology $ns FQset tcp1 [build_tcp $n0 $n3 0.1]$tcp1 set class_ 1set tcp2 [build_tcp $n1 $n3 0.1]$tcp2 set class_ 2$ns at 40.0 "finish Output"#$ns at 8.0 "xfinish"proc xfinish {} {	global ns f nf	$ns flush-trace	close $f	close $nf	puts "running nam..."	exec nam out.nam &	exit 0}$ns run

⌨️ 快捷键说明

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