diff -Naur ns-2.26/queue/red.cc ns2/queue/red.cc --- ns-2.26/queue/red.cc 2003-02-26 17:09:13.000000000 -0500 +++ ns2/queue/red.cc 2004-12-12 21:18:01.000000000 -0500 @@ -145,8 +145,8 @@ bind("prob1_", &edv_.v_prob1); // dropping probability bind("curq_", &curq_); // current queue size bind("cur_max_p_", &edv_.cur_max_p); // current max_p - - + bind("aqua_", &aqua); //Whether to use aqua or not + bind("lterm_", <erm); //term for link queues q_ = new PacketQueue(); // underlying queue pq_ = q_; //reset(); @@ -326,7 +326,10 @@ } old_ave = new_ave; new_ave *= 1.0 - q_w; - new_ave += q_w * nqueued; + if (!aqua) + new_ave += q_w * nqueued; + else + new_ave += q_w * (nqueued + (int) lterm); double now = Scheduler::instance().clock(); if (edp_.adaptive == 1) { diff -Naur ns-2.26/queue/red.h ns2/queue/red.h --- ns-2.26/queue/red.h 2003-02-26 17:09:13.000000000 -0500 +++ ns2/queue/red.h 2004-12-12 21:18:01.000000000 -0500 @@ -202,7 +202,8 @@ void print_edp(); // for debugging void print_edv(); // for debugging - + int aqua; // 1 for AQuA algorithm + double lterm; // link queue term in instantaneous queue calculations }; #endif diff -Naur ns-2.26/tcl/ex/aqua.tcl ns2/tcl/ex/aqua.tcl --- ns-2.26/tcl/ex/aqua.tcl 1969-12-31 19:00:00.000000000 -0500 +++ ns2/tcl/ex/aqua.tcl 2004-12-12 21:18:25.000000000 -0500 @@ -0,0 +1,338 @@ +# File: setup.tcl +# Author: Vikas Paliwal +# Date: March 18, 2003 +# Email: vpaliwal@sce.carelton.ca +# This is a simulation setup for the CDMA IS-2000 network + +global opt +#set Td [lindex $argv 0] +#set Tb [lindex $argv 1] +set Td 20 +set Tb 20 +set num_bs_nodes 10 +set opt(nn) 10 +set num_start 100 +set nn $opt(nn) +set opt(stop) 200 +set stop $opt(stop) +set num_sender_nodes [expr $opt(nn) * $num_bs_nodes] +set agg_bw 0 +set factor 0.06 +set deadCount 0 +#set Td 20 +#set Tb 20 +set riseTime [expr $Tb * $factor] +set fallTime [expr $Td * $factor] +#set riseTime [lindex $argv 0] +#set fallTime $riseTime +set nb 0 +set nd 0 +set bwn 8 +set aqp [lindex $argv 0] +set perturb [expr 0.2*$bwn] +set target [expr ($bwn*25)/0.616 + [lindex $argv 1]] +Queue/RED set thresh_ [expr ($target/2 ) ] +Queue/RED set limit_ [expr 3*$target] +Queue/RED set maxthresh_ [expr 1.5 * $target] +Queue/RED set gentle_ 0 +Queue/RED set adaptive_ 1 +Queue/RED set pd_ 0 +Queue/RED set aqua_ $aqp +Queue/RED set delt_ 0.01 +Queue/RED set kp_ 0.001 +Queue/RED set kd_ 0.05 +Queue/RED set mod_ 0 +#Queue/RED set q_weight_ 0.8 +Queue/RED set q_weight_ [expr ( 1 - exp(-1/($bwn*125.0/0.616)))] +# Various RLP Rates +set 1X [expr ($bwn - $perturb)*10] +if {$1X < 10} { + set 1X 10 +} +set 2X 19.2 +set 4X 38.4 +set 8X 76.8 +set 16X [expr ($perturb)*20] +set ns_ [new Simulator] + +$ns_ color 0 blue +$ns_ color 1 red +$ns_ color 2 green +$ns_ color 3 black + +#Open trace files +#set tracefd [open setup.tr w] +#$ns_ trace-all $tracefd +#set nf [open setup.nam w] +#$ns_ namtrace-all $nf +#set tr [open trace.tr w] +# queue size trace +set fqsize [open "qsize.out" w] + + # Create BSC and Gateway + set BSC [$ns_ node ] + set GW [$ns_ node ] + + # Create sender nodes in external internet + for {set i 0} {$i < [expr $num_sender_nodes]} {incr i} { + set S($i) [$ns_ node ] + } + + # Create the base-station nodes. + for {set i 0} {$i < [expr $num_bs_nodes]} {incr i} { + set BS($i) [$ns_ node ] + } + # Create the Mobile Nodes + for {set i 0} {$i < $num_bs_nodes} {incr i} { + for {set j 0} {$j < $opt(nn)} {incr j} { + set node_([expr ($i * $opt(nn)) +$j]) [ $ns_ node ] + set nodel_([expr ($i * $opt(nn)) +$j]) [ $ns_ node ] + } + } + + # Create links between BTS nodes and BSC + for {set i 0} {$i < [expr $num_bs_nodes]} {incr i} { + $ns_ duplex-link $BS($i) $BSC 100Mb 10ms DropTail + $ns_ queue-limit $BSC $BS($i) 10000 + $ns_ queue-limit $BS($i) $BSC 10000 + } + + # Create links between the BTS and mobile nodes + for {set i 0} {$i < $num_bs_nodes} {incr i} { + for {set j 0} {$j < $opt(nn)} {incr j} { + $ns_ duplex-link $BS($i) $node_([expr ($i * $opt(nn)) +$j]) 1000Mb 20ms DropTail + $ns_ duplex-link $node_([expr ($i * $opt(nn)) +$j]) $nodel_([expr ($i * $opt(nn)) +$j]) 1000Mb 0ms DropTail + set em([expr ($i * $opt(nn)) +$j]) [new ErrorModel] + $em([expr ($i * $opt(nn)) +$j]) set rate_ 0.0 + set k [expr ($i * $opt(nn)) +$j] + set tmp1($k) [new ErrorModel/Uniform 0 pkt] + set tmp2($k) [new ErrorModel/Uniform 1 pkt] + set m_states($k) [ list $tmp1($k) $tmp2($k)] + set m_periods($k) [list 0.04 0.04] + set m_transmx($k) { {0.8 0.2} + {0.8 0.2} } + set m_trunit($k) pkt + set m_sttype($k) time + set m_nstates($k) 2 + #set m_nstart($k) [lindex $m_states($k) 0] + #set em($k) [new ErrorModel/MultiState $m_states($k) $m_periods($k) $m_transmx($k) $m_trunit($k) $m_sttype($k) $m_nstates($k) $m_nstart($k)] + #$ns_ lossmodel $em([expr ($i * $opt(nn)) +$k]) $BS($i) $node_([expr ($i * $opt(nn)) +$k]) + } + } + +#$ns_ trace-all $tracefd + + # Create links between Gateway and BSC nodes + $ns_ simplex-link $BSC $GW [expr $bwn]Mb 10ms DropTail + $ns_ simplex-link $GW $BSC [expr $bwn]Mb 10ms RED + set redq [[$ns_ link $GW $BSC] queue] + set qmon [$ns_ monitor-queue $GW $BSC 0] +#$ns_ trace-all $tracefd + # Connect sender nodes to Gateway + for {set i 0} {$i < [expr $num_sender_nodes]} {incr i} { + $ns_ duplex-link $S($i) $GW 100Mb 10ms DropTail + } +## RLP Configuration + +# Create the required RLP Agents for forward and reverse links + for {set i 0} {$i < $num_bs_nodes} {incr i} { + for {set j 0} {$j < $opt(nn)} {incr j} { + Agent/Rlp set rlp_delay 10 + Agent/Rlp set hdrlen_ 0 + Agent/Rlp set rawrate_ [expr $1X ] + set pbs([expr ($i * $opt(nn)) +$j]) [new Agent/Ppp] + $ns_ attach-agent $BSC $pbs([expr ($i * $opt(nn)) +$j]) + set pms([expr ($i * $opt(nn)) +$j]) [new Agent/Ppp] + $ns_ attach-agent $node_([expr ($i * $opt(nn)) +$j]) $pms([expr ($i * $opt(nn)) +$j]) + set rbs([expr ($i * $opt(nn)) +$j]) [new Agent/Rlp] + $ns_ attach-agent $BSC $rbs([expr ($i * $opt(nn)) +$j]) + set rms([expr ($i * $opt(nn)) +$j]) [new Agent/Rlp] + $ns_ attach-agent $node_([expr ($i * $opt(nn)) +$j]) $rms([expr ($i * $opt(nn)) +$j]) + $pbs([expr ($i * $opt(nn)) +$j]) dst $rbs([expr ($i * $opt(nn)) +$j]) + $pms([expr ($i * $opt(nn)) +$j]) dst $rms([expr ($i * $opt(nn)) +$j]) + $rbs([expr ($i * $opt(nn)) +$j]) dst $pbs([expr ($i * $opt(nn)) +$j]) + $rms([expr ($i * $opt(nn)) +$j]) dst $pms([expr ($i * $opt(nn)) +$j]) + $rms([expr ($i * $opt(nn)) +$j]) errmodel $em([expr ($i * $opt(nn)) +$j]) + #set pbr([expr ($i * $opt(nn)) +$j]) [new Agent/Pass] + #$ns_ attach-agent $BSC $pbr([expr ($i * $opt(nn)) +$j]) + #set pmr([expr ($i * $opt(nn)) +$j]) [new Agent/Pass] + #$ns_ attach-agent $node_([expr ($i * $opt(nn)) +$j]) $pmr([expr ($i * $opt(nn)) +$j]) + #set rbr([expr ($i * $opt(nn)) +$j]) [new Agent/Rlp] + #$ns_ attach-agent $BSC $rbr([expr ($i * $opt(nn)) +$j]) + #set rmr([expr ($i * $opt(nn)) +$j]) [new Agent/Rlp] + #$ns_ attach-agent $node_([expr ($i * $opt(nn)) +$j]) $rmr([expr ($i * $opt(nn)) +$j]) + #$pbr([expr ($i * $opt(nn)) +$j]) dst $rbr([expr ($i * $opt(nn)) +$j]) + #$pmr([expr ($i * $opt(nn)) +$j]) dst $rmr([expr ($i * $opt(nn)) +$j]) + #$rbr([expr ($i * $opt(nn)) +$j]) dst $pbr([expr ($i * $opt(nn)) +$j]) + #$rmr([expr ($i * $opt(nn)) +$j]) dst $pmr([expr ($i * $opt(nn)) +$j]) + set agg_bw [expr $1X + $agg_bw] + } + } + + # Setup TCP connections +set packetsize 576 +Agent/TCP/Reno set packetSize_ $packetsize +Agent/TCP/Reno set minrto_ 0.4 +Agent/TCP/Reno set rtxcur_init_ 3.0 +Agent/TCP/Reno set segsperack_ 2 +Agent/TCPSink set interval_ 0.1 +set fmon_ [$ns_ makeflowmon Fid] +$ns_ attach-fmon [$ns_ link $GW $BSC] $fmon_ + #Agent/TCP/Reno set nam_tracevar_ true +#set nf [open out.nam w] +#$ns_ namtrace-all $nf + for {set i 0} {$i < [expr $opt(nn) * $num_bs_nodes]} {incr i} { + set tcp($i) [new Agent/TCP/Reno] + $tcp($i) set class_ 1 + #$ns_ add-agent-trace $tcp($i) tcp($i) + #$ns_ monitor-agent-trace $tcp($i) + #$tcp($i) tracevar cwnd_ + set wind 30 + $tcp($i) set window_ $wind + #$tcp($i) set overhead_ 0.08 + set sink($i) [new Agent/TCPSink] + $sink($i) set window_ $wind + $ns_ attach-agent $S($i) $tcp($i) + $ns_ attach-agent $nodel_($i) $sink($i) + $ns_ connect $tcp($i) $pbs($i) + $ns_ connect $rbs($i) $rms($i) + $ns_ connect $pms($i) $sink($i) + set ftp($i) [new Application/FTP] + $ftp($i) attach-agent $tcp($i) + if {$i < $num_start} { + $ns_ at 0 "$ftp($i) start" + } + } +$ns_ add-agent-trace $tcp(0) tcp(0) +$ns_ monitor-agent-trace $tcp(0) +$tcp(0) tracevar cwnd_ + + $ns_ at 0 "record" + $ns_ at $Td "give_SCH" + # $ns_ at $opt(stop) "puts \"NS EXITING...\" ; " + #$ns_ at $opt(stop) "get_queue;" + $ns_ at $opt(stop) "finish;" + +#Define a 'finish' procedure +proc finish {} { + global stop packetsize num_sender_nodes tcp bwn nb nd bwd bwb Tb Td 1X 16X wind deadCount qmon deadCount factor target creed + #exec tclsh ~/nets/nam-1.9/bin/namfilter.tcl out.nam + set throughput 0 + set sdelay 0 + for {set i 0} {$i < [expr $num_sender_nodes]} {incr i} { + set throughput [expr $throughput + (([$tcp($i) set ack_])*($packetsize +40) * 8.0 / $stop./1000.)] + } + puts " $creed $target [$qmon set pdrops_] [format "%6.4f " $throughput] " + exit 0 +} + +proc give_SCH {} { + global ns_ node_ n2 Tb num_bs_nodes nb stop nn rbs 16X 1X num_sender_nodes riseTime agg_bw + set time [$ns_ now] + set delta [expr $riseTime/($num_sender_nodes.0-1.0)] + for {set i 0} {$i < $num_bs_nodes} {incr i} { + for {set j 0} {$j < $nn} {incr j} { + set starttim([expr (($i * $nn) +$j)]) [expr $time + (($i * $nn) +$j)* $delta] + $ns_ at $starttim([expr (($i * $nn) +$j)]) "incrBW [expr (($i * $nn) +$j)]" + } + } + set time [$ns_ now] + if {[expr $time + $Tb] < $stop} { + incr nb + } else { + set nb [expr ($nb + (($stop. -$time)/$Tb))] + } + $ns_ at [expr $time + $Tb] "remove_SCH" + } + +proc incrBW {count} { +global rbs 16X 1X agg_bw +set prev [$rbs($count) set rawrate_] +$rbs($count) set rawrate_ [expr $16X + $1X] +set agg_bw [expr $agg_bw + $16X] +} + +proc remove_SCH {} { + global ns_ node_ n2 Td num_bs_nodes nd stop nn rbs 1X fallTime agg_bw num_sender_nodes + set time [$ns_ now] + set delta [expr $fallTime/($num_sender_nodes.0-1.0)] + for {set i 0} {$i < $num_bs_nodes} {incr i} { + for {set j 0} {$j < $nn} {incr j} { + set starttim([expr (($i * $nn) +$j)]) [expr $time + (($i * $nn) +$j)* $delta] + $ns_ at $starttim([expr (($i * $nn) +$j)]) "decrBW [expr (($i * $nn) +$j)]" + } + } + if {[expr $time + $Td] < $stop } { + incr nd + } else { + set nd [expr ($nd + (($stop. -$time)/$Td))] + } + $ns_ at [expr $time + $Td] "give_SCH" + } + +proc decrBW {count} { +global rbs 16X 1X agg_bw +$rbs($count) set rawrate_ [expr $1X] +set agg_bw [expr $agg_bw - $16X] +} +proc record {} { + global tcp ns_ tr fqsize redq num_sender_nodes qmonitor rbs packetsize agg_bw qmon deadCount bwn + set time [$ns_ now] + set qsize 0 + set idleCount 0 + set ldelay 0 + for {set i 0} {$i < [expr $num_sender_nodes]} {incr i} { + if { [$rbs($i) set ipq_] == 0} { + incr idleCount + } + set qsize [expr $qsize + [$rbs($i) set ipq_]] + set ldelay [expr $ldelay + [$rbs($i) set ipq_]/([$rbs($i) set rawrate_]*($packetsize +40.00))] + } + set qsize [ expr $qsize/($packetsize +40.00)] + set qsize [expr $qsize/$num_sender_nodes] + set ldelay [expr $ldelay/$num_sender_nodes.0] + set windo 0 + for {set i 0} {$i < [expr $num_sender_nodes]} {incr i} { + set windo [expr $windo + [$tcp($i) set cwnd_]] + } + set windo [expr $windo] + if {$idleCount >= 90 && ([$redq set curq_] <1)&& $time >1} { + incr deadCount + } + set ltem [expr (($ldelay*$bwn*1000))] + if {[$redq set aqua_] == 1} { + $redq set lterm_ $ltem + } + puts $fqsize "$time $agg_bw $windo [$redq set ave_] [$redq set curq_] $qsize [$qmon set pdrops_] $ltem" + $ns_ at [expr $time+0.02] "record" + } + +proc start_agents {} { +global ftp num_start num_sender_nodes +for {set i $num_start} {$i < [expr $num_sender_nodes]} {incr i} { +$ftp($i) start + } +} + +proc get_queue {} { + global ns_ fmon_ num_sender_nodes + + set fcl [$fmon_ classifier] + set fids { 0 1 } + set total 0.0 + for {set i 0} {$i < [expr $num_sender_nodes]} {incr i} { + set flow [$fcl lookup auto 0 0 $i] + if { $flow != "" } { + set dsamp [$flow get-delay-samples] + set mean [$dsamp mean] + set total [expr $total + $mean] + } + } + puts "mean delay (in seconds) [format "%8.6f" [expr $total / $num_sender_nodes]]" + #puts "(A queue of 100 packets corresponds to delay of 0.017 seconds.)" + +} + +# puts "Starting Simulation..." + +$ns_ run diff -Naur ns-2.26/tcl/lib/ns-default.tcl ns2/tcl/lib/ns-default.tcl --- ns-2.26/tcl/lib/ns-default.tcl 2003-02-26 17:09:37.000000000 -0500 +++ ns2/tcl/lib/ns-default.tcl 2004-12-12 21:18:01.000000000 -0500 @@ -192,6 +192,9 @@ Queue/RED/PD set P_testFRp_ -1 Queue/RED/PD set noidle_ false +Queue/RED set aqua_ 0 +Queue/RED set ltem_ 0 + Queue/PI set bytes_ false Queue/PI set queue_in_bytes_ false Queue/PI set a_ 0.00001822