#PARAMETERS

#simulation parameters
set simtime 5
puts "simtime = $simtime"

#access link parameters
set abw 10Mb
set adel 0.01
set aqsize 1000

#bottle neck link parameters
set bnbw 2000000
set bndel 0.005
set bnqsize 100

# RED parameters
set wq 0.002
set pmax 0.2
set Tmin 5
set Tmax 50

#TCP parameters
set maxwnd 40

#TCP/UDP parameters
set mpktsize 1000

#create random number generator
set rng [new RNG]
$rng seed predef 1

#SIMULATOR OBJECT
set nssim [new Simulator]

#TOPOLOGY

#create 3 nodes
set na1 [$nssim node]
set nb1 [$nssim node]
set nb2 [$nssim node]

#create duplex links between nodes
$nssim duplex-link $na1 $nb1 $abw $adel DropTail
$nssim duplex-link $nb1 $nb2 $bnbw $bndel RED

#set queue sizes
$nssim queue-limit $na1 $nb1 $aqsize
$nssim queue-limit $nb1 $nb2 $bnqsize

#Set RED parameters
set redq [[$nssim link $nb1 $nb2] queue]
$redq set thresh_ $Tmin
$redq set maxthresh_ $Tmax
$redq set linterm_ [expr 1/$pmax]
$redq set wait_ false
$redq set mean_pktsize_ $mpktsize
$redq set q_weight_ $wq

#SOURCES AND SINKS

#create standard TCP Tahoe connection
set tcp1 [$nssim create-connection TCP $na1 TCPSink $nb2 1]
set ftp1 [new Application/FTP]
$ftp1 attach-agent $tcp1
$tcp1 set packetSize_ $mpktsize
$tcp1 set window_ $maxwnd

#create UDP source 
set udp1 [new Agent/UDP]
$nssim attach-agent $nb1 $udp1 
set null1 [new Agent/Null]
$nssim attach-agent $nb2 $null1
$nssim connect $udp1 $null1
$udp1 set packetSize_ $mpktsize
$udp1 set fid_ 0

proc sendUDP {} {
    global udp1 mpktsize nssim rng bnbw
    set now [$nssim now]
    $udp1 send $mpktsize
    set exprnd [$rng exponential [expr $mpktsize*8/($bnbw*0.8)]]
#    puts "$exprnd"
    $nssim at [expr $now+$exprnd] "sendUDP"
}

#TRACING AND MONITORING

#set monitoring
set fmon [$nssim makeflowmon Fid]
$nssim attach-fmon [$nssim link $nb1 $nb2] $fmon

proc flowstats {} {
    global fmon
    set fclassifier [$fmon classifier]
    set flow1 [$fclassifier lookup auto 0 0 1]
    set flow2 [$fclassifier lookup auto 0 0 0]
    set parrtcp [$flow1 set parrivals_]
    set pdropstcp [$flow1 set pdrops_]
    puts "TCP: $parrtcp $pdropstcp"
    set parrudp [$flow2 set parrivals_]
    set pdropsudp [$flow2 set pdrops_]
    puts "UDP: $parrudp $pdropsudp"
    set parr [$fmon set parrivals_]
    set pdrops [$fmon set pdrops_]
    puts "All: $parr $pdrops"
}

#set tracing
set winfile [open win.dat w]
$tcp1 attach $winfile
$tcp1 trace cwnd_

#RUNNING SIMULATION

#schedule events for ns2
$nssim at 0 "sendUDP"
$nssim at 0 "$ftp1 start"
$nssim at $simtime "flowstats"
$nssim at $simtime "$nssim halt"

#run and end the simulation
$nssim run

#close win.dat
close $winfile

# process window data
exec awk {
    {if ($1 != "") print $1, $7}
} win.dat > winfinal.dat
exec rm win.dat

#Exit
exit 0
