set ns [new Simulator]

set rate1 64000
set cir1  64000

set rate2 256000
set cir2  256000

set cir3 256000

set rate4  64000
set cir4   64000

set cir5  256000

set testTime 50
set packetSize 1000
set UDPpacketSize 160

# Open a file for writing the trace data
set trace_all [open out.all w]
set trace_nam [open out.nam w]

# Trace all events for post processing with animator (nam) or with any
# other software

#$ns trace-all $trace_all 
#$ns namtrace-all $trace_nam 



# Set up the network topology shown at the top of this file:
set s1 [$ns node]
set s2 [$ns node]
set s3 [$ns node]
set s4 [$ns node]
set s5 [$ns node]
set e1 [$ns node]
set e2 [$ns node]
set d1 [$ns node]
set d2 [$ns node]
set d3 [$ns node]
set d4 [$ns node]
set d5 [$ns node]


$ns duplex-link $s1 $e1 10Mb 5ms DropTail
$ns duplex-link $s2 $e1 10Mb 5ms DropTail
$ns duplex-link $s3 $e1 10Mb 5ms DropTail
$ns duplex-link $s4 $e1 10Mb 5ms DropTail
$ns duplex-link $s5 $e1 10Mb 5ms DropTail

$ns simplex-link $e1 $e2 1Mb 50ms dsRED/edge
$ns simplex-link $e2 $e1 1Mb 50ms dsRED/edge

$ns duplex-link $e2 $d1 10Mb 5ms DropTail
$ns duplex-link $e2 $d2 10Mb 5ms DropTail
$ns duplex-link $e2 $d3 10Mb 5ms DropTail
$ns duplex-link $e2 $d4 10Mb 5ms DropTail
$ns duplex-link $e2 $d5 10Mb 5ms DropTail


set qE1E2 [[$ns link $e1 $e2] queue]
set qE2E1 [[$ns link $e2 $e1] queue]


# Set DS RED parameters from Edge1 to Core:
$qE1E2 meanPktSize $packetSize
$qE1E2 set numQueues_ 2
$qE1E2 set NumPrec 2
$qE1E2 set SchedularMode WRR 
$qE1E2 addQueueWeights 2 2
$qE1E2 addPolicyEntry [$s1 id] [$d1 id] TSW2CM 10 $cir1
$qE1E2 addPolicyEntry [$s2 id] [$d2 id] TSW2CM 10 $cir2
$qE1E2 addPolicyEntry [$s3 id] [$d3 id] TSW2CM 10 $cir3
$qE1E2 addPolicyEntry [$s4 id] [$d4 id] TSW2CM 10 $cir4
$qE1E2 addPolicyEntry [$s5 id] [$d5 id] TSW2CM 10 $cir5
$qE1E2 addPolicerEntry TSW2CM 10 11
$qE1E2 addPolicerEntry TSW2CM 20 21
$qE1E2 addPHBEntry 10 0 0
$qE1E2 addPHBEntry 11 0 1
$qE1E2 addPHBEntry 20 1 0
$qE1E2 addPHBEntry 21 1 1
$qE1E2 configQ 0 0 10 15 0.05
$qE1E2 configQ 0 1 10 15 0.20
$qE1E2 configQ 1 0 5 35 0.05
$qE1E2 configQ 1 1 5 35 0.20


# Set DS RED parameters from Edge2 to Core:
$qE2E1 meanPktSize $packetSize
$qE2E1 set numQueues_ 2
$qE2E1 set NumPrec 2
$qE2E1 set SchedularMode WRR 
$qE2E1 addQueueWeights 2 2
$qE2E1 addPolicyEntry [$d1 id] [$s1 id] TSW2CM 10 $cir1
$qE2E1 addPolicyEntry [$d2 id] [$s2 id] TSW2CM 10 $cir2
$qE2E1 addPolicyEntry [$d3 id] [$s3 id] TSW2CM 10 $cir3
$qE2E1 addPolicyEntry [$d4 id] [$s4 id] TSW2CM 10 $cir4
$qE2E1 addPolicyEntry [$d5 id] [$s5 id] TSW2CM 10 $cir5
$qE2E1 addPolicerEntry TSW2CM 10 11
$qE2E1 addPolicerEntry TSW2CM 20 21
$qE2E1 addPHBEntry 10 0 0
$qE2E1 addPHBEntry 11 0 1
$qE2E1 addPHBEntry 20 1 0
$qE2E1 addPHBEntry 21 1 1
$qE2E1 configQ 0 0 10 15 0.05
$qE2E1 configQ 0 1 10 15 0.20
$qE2E1 configQ 1 0 5 35 0.05
$qE2E1 configQ 1 1 5 35 0.20


# Application connections:
set udp1 [new Agent/UDP]
$ns attach-agent $s1 $udp1
set cbr1 [new Application/Traffic/CBR]
$cbr1 attach-agent $udp1
$cbr1 set packet_size_ $UDPpacketSize
$udp1 set packetSize_ $UDPpacketSize
$cbr1 set rate_ $rate1
set null1 [new Agent/Null]
$ns attach-agent $d1 $null1
$ns connect $udp1 $null1

set udp2 [new Agent/UDP]
$ns attach-agent $s2 $udp2
set cbr2 [new Application/Traffic/Exponential]
$cbr2 attach-agent $udp2
$cbr2 set packet_size_ 512
$udp2 set packetSize_ 512
$cbr2 set rate_ $rate2
$cbr2 set burst_time_ 2
$cbr2 set idel_time_ 1
set null2 [new Agent/Null]
$ns attach-agent $d2 $null2
$ns connect $udp2 $null2

set tcp3 [new Agent/TCP]
$ns attach-agent $s3 $tcp3
set ftp3 [new Application/FTP]
$ftp3 attach-agent $tcp3
$tcp3 set packetSize_ 1000
set sink3 [new Agent/TCPSink]
$ns attach-agent $d3 $sink3
$ns connect $tcp3 $sink3


set tcp4 [new Agent/TCP]
$ns attach-agent $s4 $tcp4
set cbr4 [new Application/Traffic/CBR]
$cbr4 set packet_size_ 128
$cbr4 set rate_ $rate4
$cbr4 attach-agent $tcp4
$tcp4 set packetSize_ 128
set sink4 [new Agent/TCPSink]
$ns attach-agent $d4 $sink4
$ns connect $tcp4 $sink4

set tcp5 [new Agent/TCP]
$ns attach-agent $s5 $tcp5
set telnet5 [new Application/Telnet]
$telnet5 set interval_ 0.05
$telnet5 attach-agent $tcp5
$tcp5 set packetSize_ 512
set sink5 [new Agent/TCPSink]
$ns attach-agent $d5 $sink5
$ns connect $tcp5 $sink5




proc finish {} {
    global ns trace_all trace_nam
    close $trace_all 
    close $trace_nam

    exit 0
}


$qE1E2 printPolicyTable
$qE1E2 printPolicerTable

$ns at 0.0 "$cbr1 start"
$ns at 0.0 "$cbr2 start"
$ns at 0.0 "$ftp3 start"
$ns at 0.0 "$cbr4 start"
$ns at 0.0 "$telnet5 start"
$ns at 10.0 "$qE1E2 printStats"
$ns at 20.0 "$qE1E2 printStats"
$ns at 30.0 "$qE1E2 printStats"
$ns at 40.0 "$qE1E2 printStats"
$ns at 50.0 "$qE1E2 printStats"
$ns at $testTime "$cbr1 stop"
$ns at $testTime "$cbr2 stop"
$ns at $testTime "$ftp3 stop"
$ns at $testTime "$cbr4 stop"
$ns at $testTime "$telnet5 stop"
$ns at [expr $testTime + 1.0] "finish"

$ns run
