#--------------------------------------------------------------------------------
# cbr-tb.tcl
# Author: Jeremy Ethridge.
# Dates: June 29-July 5, 1999.
# Notes: A DS-RED script that uses CBR traffic agents and the Token Bucket policer.
#
#    ----
#    |s1|-----------
#    ----   10 Mb   \
#            5 ms    \
#                     \----           ------          ----           ------
#                      |e1|-----------|core|----------|e2|-----------|dest|
#                     /----   10 Mb   ------   5 Mb   ----   10 Mb   ------
#                    /         5 ms            5 ms           5 ms
#    ----           /
#    |s2|-----------
#    ----   10 Mb
#            5 ms
#
#--------------------------------------------------------------------------------


set ns [new Simulator]

set tracefd	[open ds-cbr-tb.tr w]
set namtrace    [open ds-cbr-tb.nam w]


$ns trace-all $tracefd
#$ns namtrace-all $namtrace  

#$ns at 0.0 "trace_annotate {Starting receivers...}"




#set cir0  1000000
#set cbs0    10000
#set rate0 4000000
#set cir1  1000000
#set cbs1    10000
#set rate1 4000000

set cir0  1000000
set cbs0    10000
set rate0 40000

set cir1  1000000
set cbs1    10000
set rate1 40000


set testTime 85.0
#set testTime 9.0
set packetSize 1000


# Set up the network topology shown at the top of this file:
set s1 [$ns node]
set s2 [$ns node]
set e1 [$ns node]
set core [$ns node]
set e2 [$ns node]
set dest [$ns node]

$ns duplex-link $s1 $e1 10Mb 5ms DropTail
$ns duplex-link $s2 $e1 10Mb 5ms DropTail

$ns simplex-link $e1 $core 10Mb 5ms dsRED/edge
$ns simplex-link-op $e1 $core queuePos 0.5

$ns simplex-link $core $e1 10Mb 5ms dsRED/core

$ns simplex-link $core $e2 10Mb 5ms dsRED/core
$ns simplex-link $e2 $core 10Mb 5ms dsRED/edge

$ns duplex-link $e2 $dest 10Mb 5ms DropTail


$ns duplex-link-op $s1 $e1 orient down-right
$ns duplex-link-op $s2 $e1 orient up-right
$ns duplex-link-op $e1 $core orient right
$ns duplex-link-op $core $e2 orient right
$ns duplex-link-op $e2 $dest orient right


set qE1C [[$ns link $e1 $core] queue]
set qE2C [[$ns link $e2 $core] queue]
set qCE1 [[$ns link $core $e1] queue]
set qCE2 [[$ns link $core $e2] queue]


set qE2Cmon [$ns monitor-queue $e2 $core "" 0.01]
set qCE2mon [$ns monitor-queue $core $e2 "" 0.01]


set qCE2link [$ns link $core $e2] 
set qCE2fmon [$ns makeflowmon SrcDest]
$qCE2fmon attach [open ds-cbr-tb-flowmon.tr w]
$qCE2mon trace [open ds-cbr-tb-qmon.tr w]
$qCE2mon set estimate_rate_ 1
$ns attach-fmon $qCE2link $qCE2fmon



set qE2Clink [$ns link $core $e2] 
set qE2Cfmon [$ns makeflowmon SrcDest]
$qE2Cfmon attach [open ds-cbr-tb-flowmon.tr w]
$qE2Cmon trace [open ds-cbr-tb-qmon.tr w]
$qE2Cmon set estimate_rate_ 1
$ns attach-fmon $qE2Clink $qE2Cfmon



# Set DS RED parameters from Edge1 to Core:

$qE1C meanPktSize $packetSize
$qE1C set numQueues_ 1
$qE1C setNumPrec 3
$qE1C addPolicyEntry [$s1 id] [$dest id] TokenBucket 7 $cir0 $cbs0
$qE1C addPolicyEntry [$s2 id] [$dest id] TokenBucket 8 $cir0 $cbs0
$qE1C addPolicerEntry TokenBucket 7 9
$qE1C addPolicerEntry TokenBucket 8 9
$qE1C addPHBEntry 7 0 0
$qE1C addPHBEntry 8 0 1
$qE1C addPHBEntry 9 0 2
$qE2C configQ 0 0 20 40 0.02
$qE2C configQ 0 1 20 40 0.02
$qE2C configQ 0 2 10 20 0.10

# Set DS RED parameters from Edge2 to Core:
$qE2C meanPktSize $packetSize
$qE2C set numQueues_ 1
$qE2C setNumPrec 3
$qE2C addPolicyEntry [$dest id] [$s1 id] TokenBucket 7  $cir0 $cbs0
$qE2C addPolicyEntry [$dest id] [$s2 id] TokenBucket 8  $cir0 $cbs0
$qE2C addPolicerEntry TokenBucket 7 9
$qE2C addPolicerEntry TokenBucket 8 9
$qE2C addPHBEntry 7 0 0
$qE2C addPHBEntry 8 0 1
$qE2C addPHBEntry 9 0 2
$qE2C configQ 0 0 20 40 0.02
$qE2C configQ 0 1 20 40 0.02
$qE2C configQ 0 2 10 20 0.10


# Set DS RED parameters from Core to Edge1:
$qCE1 meanPktSize $packetSize
$qCE1 set numQueues_ 1
$qCE1 setNumPrec 3
$qCE1 addPHBEntry 7 0 0
$qCE1 addPHBEntry 8 0 1
$qCE1 addPHBEntry 9 0 2
$qCE1 configQ 0 0 20 40 0.02
$qCE1 configQ 0 1 20 40 0.02
$qCE1 configQ 0 2 10 20 0.10

# Set DS RED parameters from Core to Edge2:
$qCE2 meanPktSize $packetSize
$qCE2 set numQueues_ 1
$qCE2 setNumPrec 3
$qCE2 addPHBEntry 7 0 0
$qCE2 addPHBEntry 8 0 1
$qCE2 addPHBEntry 9 0 2
$qCE2 configQ 0 0 20 40 0.02
$qCE2 configQ 0 1 20 40 0.02
$qCE2 configQ 0 2 10 20 0.10


# Set up one CBR connection between each source and the destination:
set udp0 [new Agent/UDP]
$ns attach-agent $s1 $udp0
set cbr0 [new Application/Traffic/CBR]
$cbr0 attach-agent $udp0
$cbr0 set packet_size_ $packetSize
$udp0 set packetSize_ $packetSize
$cbr0 set rate_ $rate0
set null0 [new Agent/Null]
$ns attach-agent $dest $null0
$ns connect $udp0 $null0

set udp1 [new Agent/UDP]
$ns attach-agent $s2 $udp1
set cbr1 [new Application/Traffic/CBR]
$cbr1 attach-agent $udp1
$cbr1 set packet_size_ $packetSize
$udp1 set packetSize_ $packetSize
$cbr1 set rate_ $rate1
set null1 [new Agent/Null]
$ns attach-agent $dest $null1
$ns connect $udp1 $null1


proc finish {} {
    global ns 
    exit 0
}


$qE1C printPolicyTable
$qE1C printPolicerTable

$ns at 0.0 "$cbr0 start"
$ns at 0.0 "$cbr1 start"
$ns at 20.0 "$qE1C printStats"
$ns at 40.0 "$qE1C  printStats"
$ns at 60.0 "$qE1C  printStats"
$ns at 80.0 "$qE1C printStats"

$ns at $testTime "$cbr0 stop"
$ns at $testTime "$cbr1 stop"
$ns at [expr $testTime + 1.0] "finish"

$ns run
