From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ie0-f171.google.com (mail-ie0-f171.google.com [209.85.223.171]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by huchra.bufferbloat.net (Postfix) with ESMTPS id 91B1421F33E for ; Wed, 18 Feb 2015 23:19:35 -0800 (PST) Received: by iecar1 with SMTP id ar1so7404129iec.11 for ; Wed, 18 Feb 2015 23:19:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=P+jMphu1Y6Q688xQBiZOFIC9+VCmvXWkOP1+l9Ct9GY=; b=uEt4Zvc4baWW5P/aCdV2Oqe7rPutJAbfP2U30ZzUcC8Hghd4gO+9+ld8zoHDq540MN PkHjsC/fT/P6m+4ZivP2W7lu/3r3oM4ZJpcZJQBCJzev8ZXUGvHq3AtwaDHt/p/oL+eN PCPfeYQFZyKPvOrrJjwDY10+fkJbtlX4uuAmjcjroBoMLf/BDB+KdW+iGltsfQKvxqwB y/n9U9Onv2iX9YZAnsPZtqRkL/Du2J/RDYOtdZYkBxBo1STqXCrHayaQshycB5DgZG+q n1DKWSleb8Y+BhfW9B+xllJfj/A5qjMN5stBxQEl0ClOoymt2KTaIUsyomGbsbIqV6es YsKw== MIME-Version: 1.0 X-Received: by 10.43.142.4 with SMTP id jg4mr4660926icc.42.1424330374120; Wed, 18 Feb 2015 23:19:34 -0800 (PST) Received: by 10.36.44.10 with HTTP; Wed, 18 Feb 2015 23:19:34 -0800 (PST) Date: Thu, 19 Feb 2015 12:49:34 +0530 Message-ID: From: kanu monga To: codel@lists.bufferbloat.net Content-Type: multipart/alternative; boundary=001a11c2dd98fe2ff1050f6bc145 Subject: [Codel] Codel code X-BeenThere: codel@lists.bufferbloat.net X-Mailman-Version: 2.1.13 Precedence: list List-Id: CoDel AQM discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 19 Feb 2015 07:20:03 -0000 --001a11c2dd98fe2ff1050f6bc145 Content-Type: text/plain; charset=UTF-8 is there anyone who can help me in understanding tcl code of codel(given below) This one is quite complex for me. please help if you can. Thanks in advance. ################################################################### # ns codel.tcl f w c {b}Mb s d r # where: # f = # ftps # w = # PackMime connections per second # c = # CBRs # b = bottleneck bandwidth in Mbps # s = filesize for ftp, -1 for infinite # d = dynamic bandwidth, if non-zero, changes (kind of kludgey) # have to set the specific change ratios in this file (below) # r = number of "reverse" ftps set stopTime 300 set ns [new Simulator] # These are defaults if values not set on command line set num_ftps 1 set web_rate 0 set revftp 0 set num_cbrs 0 #rate and packetSize set in build_cbr set bottleneck 3Mb #for a 10MB ftp set filesize 10000000 set dynamic_bw 0 set greedy 0 # Parse command line if {$argc >= 1} { set num_ftps [lindex $argv 0] if {$argc >= 2} { set web_rate [lindex $argv 1] if {$argc >= 3} { set num_cbrs [lindex $argv 2] if {$argc >= 4} { set bottleneck [lindex $argv 3] if {$argc >= 5} { set filesize [lindex $argv 4] if {$argc >= 6} { set dynamic_bw [lindex $argv 5] if {$argc >= 7} { set revftp [lindex $argv 6] } } } } } } } set bw [bw_parse $bottleneck] if { $revftp >= 1} { set num_revs $revftp } else { set num_revs 0 } puts "ftps $num_ftps webrate $web_rate cbrs $num_cbrs bw $bw filesize $filesize reverse $num_revs" # experiment settings set psize 1500 if { $bw < 1000000} { set psize 500 } set nominal_rtt [delay_parse 100ms] set accessdly 20 set bdelay 10 set realrtt [expr 2*(2*$accessdly + $bdelay)] puts "accessdly $accessdly bneckdly $bdelay realrtt $realrtt bneckbw $bw" # CoDel values # interval to keep min over set interval [delay_parse 100ms] # target in ms. set target [delay_parse 5ms] global defaultRNG $defaultRNG seed 0 ns-random 0 #$defaultRNG seed 54321 #ns-random 23145 # ------- config info is all above this line ---------- #bdp in packets, based on the nominal rtt set bdp [expr round($bw*$nominal_rtt/(8*$psize))] Trace set show_tcphdr_ 1 set startTime 0.0 #TCP parameters - have to set both for FTPs and PackMime Agent/TCP set window_ [expr $bdp*16] Agent/TCP set segsize_ [expr $psize-40] Agent/TCP set packetSize_ [expr $psize-40] Agent/TCP set windowInit_ 4 Agent/TCP set segsperack_ 1 Agent/TCP set timestamps_ true set delack 0.4 Agent/TCP set interval_ $delack Agent/TCP/FullTcp set window_ [expr $bdp*16] Agent/TCP/FullTcp set segsize_ [expr $psize-40] Agent/TCP/FullTcp set packetSize_ [expr $psize-40] Agent/TCP/FullTcp set windowInit_ 4 Agent/TCP/FullTcp set segsperack_ 1 Agent/TCP/FullTcp set timestamps_ true Agent/TCP/FullTcp set interval_ $delack Agent/TCP/Linux instproc done {} { global ns filesize #this doesn't seem to work, had to hack tcp-linux.cc to do repeat ftps $self set closed_ 0 #needs to be delayed by at least .3sec to slow start puts "[$ns now] TCP/Linux proc done called" $ns at [expr [$ns now] + 0.3] "$self send $filesize" } # problem is that idle() in tcp.cc never seems to get called... Application/FTP instproc resume {} { puts "called resume" global filesize $self send $filesize # $ns at [expr [$ns now] + 0.5] "[$self agent] reset" $ns at [expr [$ns now] + 0.5] "[$self agent] send $filesize" } Application/FTP instproc fire {} { global filesize $self instvar maxpkts_ set maxpkts_ $filesize [$self agent] set maxpkts_ $filesize $self send $maxpkts_ puts "fire() FTP" } #buffersizes set buffersize [expr $bdp] set buffersize1 [expr $bdp*10] Queue/CoDel set target_ $target Queue/CoDel set interval_ $interval #set Flow_id 1 proc build_topology { ns } { # nodes n0 and n1 are the server and client side gateways and # the link between them is the congested slow link. n0 -> n1 # handles all the server to client traffic. # # if the web_rate is non-zero, node n2 will be the packmime server cloud # and node n3 will be the client cloud. # # num_ftps server nodes and client nodes are created for the ftp sessions. # the first client node is n{2+w} and the first server node is n{2+f+w} # where 'f' is num_ftps and 'w' is 1 if web_rate>0 and 0 otherwise. # servers will be even numbered nodes, clients odd # Warning: the numbering here is ridiculously complicated global bw bdelay accessdly buffersize buffersize1 filesize node_cnt set node_cnt 2 # congested link global n0 n1 set n0 [$ns node] set n1 [$ns node] $ns duplex-link $n0 $n1 $bw ${bdelay}ms CoDel $ns duplex-link-op $n0 $n1 orient right $ns duplex-link-op $n0 $n1 queuePos 0.5 $ns duplex-link-op $n1 $n0 queuePos 1.5 $ns queue-limit $n0 $n1 $buffersize $ns queue-limit $n1 $n0 $buffersize set node_cnt 2 #dynamic bandwidth # these are the multipliers for changing bw, times initial set bw # edit these values to get different patterns global stopTime dynamic_bw array names bw_changes set bw_changes(1) 0.1 set bw_changes(2) 0.01 set bw_changes(3) 0.5 set bw_changes(4) 0.01 set bw_changes(5) 1.0 puts "bottleneck starts at [[[$ns link $n0 $n1] link] set bandwidth_]bps" for {set k 1} {$k <= $dynamic_bw} {incr k 1} { set changeTime [expr $k*$stopTime/($dynamic_bw+1)] set f $bw_changes($k) set newBW [expr $f*$bw] puts "change at $changeTime to [expr $newBW/1000000.]Mbps" $ns at $changeTime "[[$ns link $n0 $n1] link] set bandwidth_ $newBW" $ns at $changeTime "[[$ns link $n1 $n0] link] set bandwidth_ $newBW" $ns at $changeTime "puts $newBW" } set li_10 [[$ns link $n1 $n0] queue] set li_01 [[$ns link $n0 $n1] queue] set tchan_ [open /tmp/redqvar.tr w] $li_01 trace curq_ $li_01 trace d_exp_ $li_01 attach $tchan_ global num_ftps web_rate num_cbrs greedy num_revs set linkbw [expr $bw*10] set w [expr $web_rate > 0] if {$w} { global n2 n3 #server set n2 [$ns node] $ns duplex-link $n2 $n0 $linkbw ${accessdly}ms DropTail $ns queue-limit $n2 $n0 $buffersize1 $ns queue-limit $n0 $n2 $buffersize1 #client set n3 [$ns node] $ns duplex-link $n1 $n3 $linkbw ${accessdly}ms DropTail $ns queue-limit $n1 $n3 $buffersize1 $ns queue-limit $n3 $n1 $buffersize1 set node_cnt 4 } #need to fix the angles if use nam for {set k 0} {$k < $num_ftps} {incr k 1} { # servers set j $node_cnt global n$j set n$j [$ns node] if {$greedy > 0 && $k == 0} { $ns duplex-link [set n$j] $n0 $linkbw 1ms DropTail } else { $ns duplex-link [set n$j] $n0 $linkbw ${accessdly}ms DropTail } $ns queue-limit [set n$j] $n0 $buffersize1 $ns queue-limit $n0 [set n$j] $buffersize1 set angle [expr $num_ftps>1? 0.75+($k-1)*.5/($num_ftps-1) : 1] $ns duplex-link-op $n0 [set n$j] orient $angle incr node_cnt # clients set j $node_cnt global n$j set n$j [$ns node] set dly [expr ${accessdly} +($k+1)] $ns duplex-link $n1 [set n$j] $linkbw ${dly}ms DropTail $ns queue-limit $n1 [set n$j] $buffersize1 $ns queue-limit [set n$j] $n1 $buffersize1 set angle [expr $num_ftps>1? fmod(2.25-($k-1)*.5/($num_ftps-1), 2) : 0] $ns duplex-link-op $n1 [set n$j] orient $angle incr node_cnt } for {set k 0} {$k < $num_cbrs} {incr k 1} { # servers set j $node_cnt global n$j set n$j [$ns node] $ns duplex-link [set n$j] $n0 $linkbw ${accessdly}ms DropTail $ns queue-limit [set n$j] $n0 $buffersize1 $ns queue-limit $n0 [set n$j] $buffersize1 # set angle [expr $num_cbrs>1? 0.75+($k-1)*.5/($num_cbrs-1) : 1] $ns duplex-link-op $n0 [set n$j] orient $angle incr node_cnt # clients set j $node_cnt global n$j set n$j [$ns node] $ns duplex-link $n1 [set n$j] $linkbw ${accessdly}ms DropTail $ns queue-limit $n1 [set n$j] $buffersize1 $ns queue-limit [set n$j] $n1 $buffersize1 # set angle [expr $num_cbrs>1? fmod(2.25-($k-1)*.5/($num_ftps-1), 2) : 0] $ns duplex-link-op $n1 [set n$j] orient $angle incr node_cnt } #reverse direction ftps for {set k 0} {$k < $num_revs} {incr k 1} { # clients set j $node_cnt global n$j set n$j [$ns node] $ns duplex-link [set n$j] $n0 $linkbw ${accessdly}ms DropTail $ns queue-limit [set n$j] $n0 $buffersize1 $ns queue-limit $n0 [set n$j] $buffersize1 set angle [expr $num_ftps>1? 0.75+($k-1)*.5/($num_ftps-1) : 1] $ns duplex-link-op $n0 [set n$j] orient $angle incr node_cnt # servers set j $node_cnt global n$j set n$j [$ns node] set dly [expr ($accessdly)*1.1 +($k+1)] $ns duplex-link $n1 [set n$j] $linkbw ${dly}ms DropTail $ns queue-limit $n1 [set n$j] $buffersize1 $ns queue-limit [set n$j] $n1 $buffersize1 set angle [expr $num_ftps>1? fmod(2.25-($k-1)*.5/($num_ftps-1), 2) : 0] $ns duplex-link-op $n1 [set n$j] orient $angle incr node_cnt } } proc build_cbr {cnd snd startTime timeToStop Flow_id} { global ns set udp [$ns create-connection UDP $snd LossMonitor $cnd $Flow_id] set cbr [new Application/Traffic/CBR] $cbr attach-agent $udp # change these for different types of CBRs $cbr set packetSize_ 100 $cbr set rate_ 0.064Mb $ns at $startTime "$cbr start" $ns at $timeToStop "$cbr stop" } # cnd is client node, snd is server node proc build_ftpclient {cnd snd startTime timeToStop Flow_id} { global ns filesize greedy revftp set ctcp [$ns create-connection TCP/Linux $snd TCPSink/Sack1 $cnd $Flow_id] $ctcp select_ca cubic set ftp [$ctcp attach-app FTP] $ftp set enableResume_ true $ftp set type_ FTP #set up a single infinite ftp with smallest RTT if {$greedy > 0 || $filesize < 0} { $ns at $startTime "$ftp start" set greedy 0 } else { $ns at $startTime "$ftp send $filesize" } $ns at $timeToStop "$ftp stop" } proc build_webs {cnd snd rate startTime timeToStop} { set CLIENT 0 set SERVER 1 # SETUP PACKMIME set pm [new PackMimeHTTP] $pm set-TCP Sack $pm set-client $cnd $pm set-server $snd $pm set-rate $rate; # new connections per second $pm set-http-1.1; # use HTTP/1.1 # create RandomVariables set flow_arrive [new RandomVariable/PackMimeHTTPFlowArrive $rate] set req_size [new RandomVariable/PackMimeHTTPFileSize $rate $CLIENT] set rsp_size [new RandomVariable/PackMimeHTTPFileSize $rate $SERVER] # assign RNGs to RandomVariables $flow_arrive use-rng [new RNG] $req_size use-rng [new RNG] $rsp_size use-rng [new RNG] # set PackMime variables $pm set-flow_arrive $flow_arrive $pm set-req_size $req_size $pm set-rsp_size $rsp_size global ns $ns at $startTime "$pm start" $ns at $timeToStop "$pm stop" } proc uniform {a b} { expr $a + (($b- $a) * ([ns-random]*1.0/0x7fffffff)) } proc finish {} { global ns $ns halt $ns flush-trace exit 0 } # $ns namtrace-all [open out.nam w] # $ns color 2 blue # $ns color 3 red # $ns color 4 yellow # $ns color 5 green build_topology $ns #$ns trace-queue $n0 $n1 [open out_n0ton1.tr w] #set fname f${num_ftps}w${web_rate}b${bottleneck}.tr set fname f.tr puts $fname $ns trace-queue $n0 $n1 [open /tmp/$fname w] #reverse direction #$ns trace-queue $n1 $n0 [open /tmp/$fname w] set node_cnt 2 if {$web_rate > 0} { build_webs $n3 $n2 $web_rate 0 $stopTime set node_cnt 4 } for {set k 1} {$k <= $num_ftps} {incr k 1} { set j $node_cnt incr node_cnt set i $node_cnt build_ftpclient [set n$i] [set n$j] \ $startTime $stopTime $i # [expr 1.0*($k-1)] $stopTime $i # [expr $startTime+($k-1)*[uniform 0.0 2.0]] $stopTime $i incr node_cnt } for {set k 1} {$k <= $num_cbrs} {incr k 1} { set j $node_cnt incr node_cnt set i $node_cnt build_cbr [set n$i] [set n$j] \ [expr $startTime+($k-1)*[uniform 0.0 2.0]] $stopTime $i incr node_cnt } #for reverse direction, give client smaller number for {set k 1} {$k <= $num_revs} {incr k 1} { set j $node_cnt incr node_cnt set i $node_cnt build_ftpclient [set n$j] [set n$i] $startTime $stopTime $j incr node_cnt } $ns at [expr $stopTime ] "finish" $ns run exit 0 ################################################################### --001a11c2dd98fe2ff1050f6bc145 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
is there anyone who can help me in understanding tcl code = of codel(given below)
This one is quite complex for me.
pleas= e help if you can.
Thanks in advance.

###################################################################
<= /div>


# ns codel.tcl f w c {b}Mb s d r
# where:
# f =3D # ftps
# w =3D # PackMime connections per second
# c =3D # CBRs
# b =3D bottleneck bandwidth in Mbps
# s =3D filesize for ftp= , -1 for infinite
# d =3D dynamic bandwidth, if non-zero, changes (kind of kludgey)
<= div># have to set the sp= ecific change ratios in this file (below)
# r =3D number of "reverse" ftps
=

set stopTime 300
set ns [new Simulator]
=

# These are defaults if values not set on command line<= /div>

set num_ftps 1
set web_rate 0
= set revftp 0
set num_cbrs 0
#rate and packetSize set in= build_cbr
set bottleneck 3Mb
#for a 10MB ftp
set filesize 10000000
set dynamic_bw 0
set greedy 0

# Parse command line

if {$a= rgc >=3D 1} {
=C2=A0 =C2=A0 set num_ftps [lindex $argv 0]
=C2=A0 =C2=A0 if {$argc >=3D 2} {
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 set web_rate [lindex $argv 1]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = if {$argc >=3D 3} {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = set num_cbrs [lindex $argv 2]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 if {$argc >=3D 4} {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 set bottleneck [l= index $argv 3]
=C2=A0 =C2=A0 if {$argc= >=3D 5} {
set filesize [lindex $argv 4]
=C2=A0 if {$argc >=3D 6} = {
set dynam= ic_bw [lindex $argv 5]
=C2=A0 if {$argc >=3D 7} {
<= div> set revftp [lind= ex $argv 6]
= =C2=A0 =C2=A0 }
=C2=A0 =C2=A0 }
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 }
= =C2=A0 =C2=A0 =C2=A0 = =C2=A0 }
}
=C2=A0 =C2=A0 }
}

set bw [bw_pars= e $bottleneck]
if { $revftp >=3D 1} {
set num_revs $revftp
} else = {
set num_revs= 0
}
puts "ftps $num_ftps webrate $web_rate cbrs $= num_cbrs bw $bw filesize $filesize reverse $num_revs"

# experiment settings
set psize 1500
if { $bw = < 1000000} { set psize 500 }
set nominal_rtt [delay_parse 100m= s]
set accessdly 20
set bdelay 10=C2=A0
set r= ealrtt [expr 2*(2*$accessdly + $bdelay)]
puts "accessdly $ac= cessdly bneckdly $bdelay realrtt $realrtt bneckbw $bw"

<= /div>
# CoDel values
# interval to keep min over
se= t interval [delay_parse 100ms]
# target in ms.
set targ= et [delay_parse 5ms]

global defaultRNG
$= defaultRNG seed 0
ns-random 0
#$defaultRNG seed 54321
#ns-random 23145

# ------- config info is= all above this line ----------

#bdp in packets, b= ased on the nominal rtt
set bdp [expr round($bw*$nominal_rtt/(8*$= psize))]

Trace set show_tcphdr_ 1
set st= artTime 0.0

#TCP parameters - have to set both for= FTPs and PackMime

Agent/TCP set window_ [expr $bd= p*16]
Agent/TCP set segsize_ [expr $psize-40]
Agent/TCP= set packetSize_ [expr $psize-40]
Agent/TCP set windowInit_ 4
Agent/TCP set segsperack_ 1
Agent/TCP set timestamps_ true=
set delack 0.4
Agent/TCP set interval_ $delack

Agent/TCP/FullTcp set window_ [expr $bdp*16]
Ag= ent/TCP/FullTcp set segsize_ [expr $psize-40]
Agent/TCP/FullTcp s= et packetSize_ [expr $psize-40]
Agent/TCP/FullTcp set windowInit_= 4
Agent/TCP/FullTcp set segsperack_ 1
Agent/TCP/FullTc= p set timestamps_ true
Agent/TCP/FullTcp set interval_ $delack


Agent/TCP/Linux instproc done {} {
global ns filesi= ze
#this doesn't seem to work, had to hack tcp-linux.cc to do= repeat ftps
$= self set closed_ 0
#needs to be delayed by at least .3sec to slow= start
puts &q= uot;[$ns now] TCP/Linux proc done called"
$ns at [expr [$ns now] + 0.3] "$self = send $filesize"
}

# problem is that= idle() in tcp.cc never seems to get called...
Application/FTP in= stproc resume {} {
puts "called resume"
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 global filesize
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 $self send $filesize
# $ns at [expr [$ns now] + 0.5] "[$self agent] reset"
$ns at [expr [$= ns now] + 0.5] "[$self agent] send $filesize"
}

Application/FTP instproc fire {} {
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 global filesize
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $se= lf instvar maxpkts_
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set maxpkts_ $fil= esize
[$self a= gent] set maxpkts_ $filesize
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $self se= nd $maxpkts_
p= uts "fire() FTP"
}

#buffersize= s
set buffersize [expr $bdp]
set buffersize1 [expr $bdp= *10]

Queue/CoDel set target_ $target
Que= ue/CoDel set interval_ $interval

#set Flow_id 1

proc build_topology { ns } {
=C2=A0 =C2=A0= # nodes n0 and n1 are the server and client side gateways and
= =C2=A0 =C2=A0 # the link between them is the congested slow link. n0 -> = n1
=C2=A0 =C2=A0 # handles all the server to client traffic.
=C2=A0 =C2=A0 #
=C2=A0 =C2=A0 # if the web_rate is non-zero= , node n2 will be the packmime server cloud
=C2=A0 =C2=A0 # and n= ode n3 will be the client cloud.
=C2=A0 =C2=A0 #
=C2=A0= =C2=A0 # num_ftps server nodes and client nodes are created for the ftp se= ssions.
=C2=A0 =C2=A0 # the first client node is n{2+w} and the f= irst server node is n{2+f+w}
=C2=A0 =C2=A0 # where 'f' is= num_ftps and 'w' is 1 if web_rate>0 and 0 otherwise.
= =C2=A0 =C2=A0 # servers will be even numbered nodes, clients odd
= =C2=A0 =C2=A0 # Warning: the numbering here is ridiculously complicated

=C2=A0 =C2=A0 global bw bdelay accessdly buffersize b= uffersize1 filesize node_cnt
=C2=A0 =C2=A0 set node_cnt 2

=C2=A0 =C2=A0 # congested link
=C2=A0 =C2=A0 gl= obal n0 n1
=C2=A0 =C2=A0 set n0 [$ns node]
=C2=A0 =C2= =A0 set n1 [$ns node]
=C2=A0 =C2=A0 $ns duplex-link $n0 $n1 $bw $= {bdelay}ms CoDel
=C2=A0 =C2=A0 $ns duplex-link-op $n0 $n1 orient = right
=C2=A0 =C2=A0 $ns duplex-link-op $n0 $n1 queuePos 0.5
=
=C2=A0 =C2=A0 $ns duplex-link-op $n1 $n0 queuePos 1.5
=C2=A0= =C2=A0 $ns queue-limit $n0 $n1 $buffersize
=C2=A0 =C2=A0 $ns que= ue-limit $n1 $n0 $buffersize
=C2=A0 =C2=A0 set node_cnt 2

=C2=A0 =C2=A0 #dynamic bandwidth
=C2=A0 =C2=A0 = # these are the multipliers for changing bw, times initial set bw
=C2=A0 =C2=A0 # edit these values to get different patterns
=C2= =A0 =C2=A0 global stopTime dynamic_bw
=C2=A0 =C2=A0 array names b= w_changes
=C2=A0 =C2=A0 set bw_changes(1) 0.1
=C2=A0 = =C2=A0 set bw_changes(2) 0.01
=C2=A0 =C2=A0 set bw_changes(3) 0.5=
=C2=A0 =C2=A0 set bw_changes(4) 0.01
=C2=A0 =C2=A0 set= bw_changes(5) 1.0

=C2=A0 =C2=A0 puts "bottle= neck starts at [[[$ns link $n0 $n1] link] set bandwidth_]bps"
=C2=A0 =C2=A0 for {set k 1} {$k <=3D $dynamic_bw} {incr k 1} {
set changeTime [expr = $k*$stopTime/($dynamic_bw+1)]
set f $bw_changes($k)
set newBW [expr $f*$bw]
puts "change at $changeTime to [expr= $newBW/1000000.]Mbps"
$ns at $changeTime "[[$ns link $n0 $n1] link] set bandwi= dth_ $newBW"
$ns at $changeTime "[[$ns link $n1 $n0] link] set bandwidth_ $newB= W"
$ns at= $changeTime "puts $newBW"
=C2=A0 =C2=A0 }
=C2=A0 =C2=A0 set li_10 [[$ns link $n1 $n0] queue]
= =C2=A0 =C2=A0 set li_01 [[$ns link $n0 $n1] queue]

=C2=A0 =C2=A0 set tchan_ [open /tmp/redqvar.= tr w]
=C2=A0 =C2=A0 $li_01 trace curq_
=C2=A0 =C2= =A0 $li_01 trace d_exp_
=C2=A0 =C2=A0 $li_01 attach $tchan_
=

=C2=A0 =C2=A0 global num_ftps web_rate num_cbrs greedy = num_revs
=C2=A0 =C2=A0 set linkbw [expr $bw*10]

=C2=A0 =C2=A0 set w [expr $web_rate > 0]
=C2=A0 =C2=A0= if {$w} {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 global n2 n3
#server
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 set n2 [$ns node]
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 $ns duplex-link $n2 $n0 $linkbw ${accessdly}ms DropTail
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 $ns queue-limit $n2 $n0 $buffersize1
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 $ns queue-limit $n0 $n2 $buffersize1
#client
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set n3 [$ns node]
=C2=A0 =C2=A0= =C2=A0 =C2=A0 $ns duplex-link $n1 $n3 $linkbw ${accessdly}ms DropTail
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns queue-limit $n1 $n3 $buffersize1
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns queue-limit $n3 $n1 $buffersize1
set node_cnt 4
=C2=A0 =C2=A0 }
#need to fix the angles if use nam
=C2=A0 =C2=A0 for {set k 0} {$k < $num_ftps} {incr k 1} {
= =C2=A0 =C2=A0 =C2=A0 =C2=A0 # servers
=C2=A0 =C2=A0 =C2=A0 =C2=A0= set j $node_cnt
=C2=A0 =C2=A0 =C2=A0 =C2=A0 global n$j
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set n$j [$ns node]
if {$greedy > 0 && $k =3D=3D 0= } {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0$ns duplex-link [set n$j] $= n0 $linkbw 1ms DropTail
} else {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0$ns duplex-l= ink [set n$j] $n0 $linkbw ${accessdly}ms DropTail
}
=C2=A0 =C2=A0 =C2=A0 =C2=A0= $ns queue-limit [set n$j] $n0 $buffersize1
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 $ns queue-limit $n0 [set n$j] $buffersize1
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 set angle [expr $num_ftps>1? 0.75+($k-1)*.5/($num_ftps-1) = : 1]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns duplex-link-op $n0 [set n$j]= orient $angle
incr node_cnt

=C2=A0 =C2=A0 =C2=A0 =C2=A0 # clien= ts
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set j $node_cnt
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 global n$j
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set n= $j [$ns node]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set dly [expr ${accessd= ly} +($k+1)]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns duplex-link $n1 [set= n$j] $linkbw =C2=A0${dly}ms =C2=A0DropTail
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 $ns queue-limit $n1 [set n$j] $buffersize1
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 $ns queue-limit [set n$j] $n1 $buffersize1
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 set angle [expr $num_ftps>1? fmod(2.25-($k-1)*.5/($= num_ftps-1), 2) : 0]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns duplex-link-= op $n1 [set n$j] orient $angle
incr node_cnt
=C2=A0 =C2=A0 }
=C2=A0 = =C2=A0 for {set k 0} {$k < $num_cbrs} {incr k 1} {
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 # servers
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set j $no= de_cnt
=C2=A0 =C2=A0 =C2=A0 =C2=A0 global n$j
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 set n$j [$ns node]
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 $ns duplex-link [set n$j] $n0 $linkbw ${accessdly}ms DropTail
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns queue-limit [set n$j] $n0 $buffersize1
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns queue-limit $n0 [set n$j] $buffersiz= e1
# =C2=A0 =C2=A0 =C2=A0 =C2=A0set angle [expr $num_cbrs>1? 0= .75+($k-1)*.5/($num_cbrs-1) : 1]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns = duplex-link-op $n0 [set n$j] orient $angle
incr node_cnt

=C2=A0 = =C2=A0 =C2=A0 =C2=A0 # clients
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set j = $node_cnt
=C2=A0 =C2=A0 =C2=A0 =C2=A0 global n$j
=C2=A0= =C2=A0 =C2=A0 =C2=A0 set n$j [$ns node]
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 $ns duplex-link $n1 [set n$j] $linkbw =C2=A0${accessdly}ms =C2=A0DropTa= il
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns queue-limit $n1 [set n$j] $buf= fersize1
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns queue-limit [set n$j] $n= 1 $buffersize1
# =C2=A0 =C2=A0 =C2=A0 =C2=A0set angle [expr $num_= cbrs>1? fmod(2.25-($k-1)*.5/($num_ftps-1), 2) : 0]
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 $ns duplex-link-op $n1 [set n$j] orient $angle
= incr node_cnt
= =C2=A0 =C2=A0 }
#reverse direction ftps
=C2=A0 =C2=A0 f= or {set k 0} {$k < $num_revs} {incr k 1} {
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 # clients
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set j $node_cnt<= /div>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 global n$j
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 set n$j [$ns node]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns = duplex-link [set n$j] $n0 $linkbw ${accessdly}ms DropTail
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 $ns queue-limit [set n$j] $n0 $buffersize1
= =C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns queue-limit $n0 [set n$j] $buffersize1
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set angle [expr $num_ftps>1? 0.75+($k-= 1)*.5/($num_ftps-1) : 1]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns duplex-l= ink-op $n0 [set n$j] orient $angle
incr node_cnt

=C2=A0 =C2=A0 = =C2=A0 =C2=A0 # servers
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set j $node_c= nt
=C2=A0 =C2=A0 =C2=A0 =C2=A0 global n$j
=C2=A0 =C2=A0= =C2=A0 =C2=A0 set n$j [$ns node]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set= dly [expr ($accessdly)*1.1 +($k+1)]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = $ns duplex-link $n1 [set n$j] $linkbw =C2=A0${dly}ms =C2=A0DropTail
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns queue-limit $n1 [set n$j] $buffersize1
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns queue-limit [set n$j] $n1 $buffers= ize1
=C2=A0 =C2=A0 =C2=A0 =C2=A0 set angle [expr $num_ftps>1? = fmod(2.25-($k-1)*.5/($num_ftps-1), 2) : 0]
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 $ns duplex-link-op $n1 [set n$j] orient $angle
incr node_cnt
=C2=A0 =C2= =A0 }
}

proc build_cbr {cnd snd startTim= e timeToStop Flow_id} {
=C2=A0 =C2=A0 global ns
=C2=A0 = =C2=A0 set udp [$ns create-connection UDP $snd LossMonitor $cnd $Flow_id]
=C2=A0 =C2=A0 set cbr [new Application/Traffic/CBR]
=C2= =A0 =C2=A0 $cbr attach-agent $udp
=C2=A0 =C2=A0 # change these fo= r different types of CBRs
=C2=A0 =C2=A0 $cbr set packetSize_ 100<= /div>
=C2=A0 =C2=A0 $cbr set rate_ 0.064Mb
=C2=A0 =C2=A0 $ns = at $startTime "$cbr start"
=C2=A0 =C2=A0 $ns at $timeTo= Stop "$cbr stop"
}

# cnd is cl= ient node, snd is server node
proc build_ftpclient {cnd snd start= Time timeToStop Flow_id} {
=C2=A0 =C2=A0=C2=A0
=C2=A0 = =C2=A0 global ns filesize greedy revftp
=C2=A0 =C2=A0 set ctcp [$= ns create-connection TCP/Linux $snd TCPSink/Sack1 $cnd $Flow_id]
= =C2=A0 =C2=A0 $ctcp select_ca cubic
=C2=A0 =C2=A0 set ftp [$ctcp = attach-app FTP]
=C2=A0 =C2=A0 $ftp set enableResume_ true
=C2=A0 =C2=A0 $ftp set type_ FTP=C2=A0

#set up = a single infinite ftp with smallest RTT
=C2=A0 =C2=A0 if {$greedy= > 0 || $filesize < 0} {
=C2=A0 =C2=A0 =C2=A0$ns at $startT= ime "$ftp start"
=C2=A0 =C2=A0 =C2=A0set greedy 0
=
=C2=A0 =C2=A0 } else {
=C2=A0 =C2=A0 =C2=A0$ns at $startTime= "$ftp send $filesize"
=C2=A0 =C2=A0 }
=C2=A0= =C2=A0 $ns at $timeToStop "$ftp stop"
}

=
proc build_webs {cnd snd rate startTime timeToStop} {
= =C2=A0 =C2=A0 set CLIENT 0
=C2=A0 =C2=A0 set SERVER 1
<= br>
=C2=A0 =C2=A0 # SETUP PACKMIME
=C2=A0 =C2=A0 set pm= [new PackMimeHTTP]
=C2=A0 =C2=A0 $pm set-TCP Sack
=C2= =A0 =C2=A0 $pm set-client $cnd
=C2=A0 =C2=A0 $pm set-server $snd<= /div>
=C2=A0 =C2=A0 $pm set-rate $rate; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# new connections per second
=C2=A0 =C2=A0 $pm set-http-1.1; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# use HTTP/1.1

= =C2=A0 =C2=A0 # create RandomVariables
=C2=A0 =C2=A0 set flow_arr= ive [new RandomVariable/PackMimeHTTPFlowArrive $rate]
=C2=A0 =C2= =A0 set req_size [new RandomVariable/PackMimeHTTPFileSize $rate $CLIENT]
=C2=A0 =C2=A0 set rsp_size [new RandomVariable/PackMimeHTTPFileSize= $rate $SERVER]

=C2=A0 =C2=A0 # assign RNGs to Ran= domVariables
=C2=A0 =C2=A0 $flow_arrive use-rng [new RNG]
=C2=A0 =C2=A0 $req_size use-rng [new RNG]
=C2=A0 =C2=A0 $rsp_s= ize use-rng [new RNG]

=C2=A0 =C2=A0 # set PackMime= variables
=C2=A0 =C2=A0 $pm set-flow_arrive $flow_arrive
=C2=A0 =C2=A0 $pm set-req_size $req_size
=C2=A0 =C2=A0 $pm set= -rsp_size $rsp_size

=C2=A0 =C2=A0 global ns
<= div>=C2=A0 =C2=A0 $ns at $startTime "$pm start"
=C2=A0 = =C2=A0 $ns at $timeToStop "$pm stop"
}

proc uniform {a b} {
expr $a + (($b- $a) * ([ns-random]*1.0/0x7fffffff))
}

proc finish {} {
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 global ns
= $ns halt
=C2=A0 =C2=A0 =C2=A0 =C2=A0 $ns flush-trace
=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit 0
}

# $ns namtrace-all [open out.nam w]
# $ns color 2 blue
# $ns color 3 red
# $ns color 4 yellow
# $ns color 5 = green

build_topology $ns

= #$ns trace-queue $n0 $n1 [open out_n0ton1.= tr w]
#set fname f${num_ftps}w${web_rate}b${bottleneck}.tr
set fname f.tr
puts $fname
$ns trace-queue $n0 $n1 [open /tmp/$fname w]
#reverse dir= ection
#$ns trace-queue $n1 $n0 [open /tmp/$fname w]
set node_cnt 2
if {$web_rate > 0} {
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 build_webs $n3 $n2 $web_rate 0 $stopTime
set node_cnt 4
}

for {set k 1} {$k <=3D $num_ftps} {incr k 1= } {
=C2=A0 =C2=A0 set j $node_cnt
=C2=A0 =C2=A0 incr no= de_cnt
=C2=A0 =C2=A0 set i $node_cnt
=C2=A0 =C2=A0 buil= d_ftpclient [set n$i] [set n$j] =C2=A0\
=C2=A0 $startTime $stopTime $i
# [expr 1.0*($k-1)] $stopTime $= i
# [expr $st= artTime+($k-1)*[uniform 0.0 2.0]] $stopTime $i
=C2=A0 =C2=A0 incr= node_cnt
}

for {set k 1} {$k <=3D $n= um_cbrs} {incr k 1} {
=C2=A0 =C2=A0 set j $node_cnt
=C2= =A0 =C2=A0 incr node_cnt
=C2=A0 =C2=A0 set i $node_cnt
= =C2=A0 =C2=A0 build_cbr [set n$i] [set n$j] =C2=A0\
=C2=A0 [expr $startTime+($k-1)*[unifo= rm 0.0 2.0]] $stopTime $i
=C2=A0 =C2=A0 incr node_cnt
}=

#for reverse direction, give client smaller numbe= r
for {set k 1} {$k <=3D $num_revs} {incr k 1} {
=C2= =A0 =C2=A0 set j $node_cnt
=C2=A0 =C2=A0 incr node_cnt
= =C2=A0 =C2=A0 set i $node_cnt
=C2=A0 =C2=A0 build_ftpclient [set = n$j] [set n$i] $startTime $stopTime $j
=C2=A0 =C2=A0 incr node_cn= t
}

$ns at [expr $stopTime ] "finis= h"
$ns run
exit 0
################= ###################################################
--001a11c2dd98fe2ff1050f6bc145--