set ns [new Simulator]

$ns color 1 Green
$ns color 2 Blue
$ns color 3 Black

set f1 [open cbr1.tr w]
set f2 [open cbr2.tr w]
set f3 [open cbr3.tr w]


#Define a 'finish' procedure
proc finish {} {
      global f1 f2 f3

	close $f1 
	close $f2 
	close $f3 
	
	exec xgraph cbr1.tr cbr2.tr cbr3.tr -geometry 700x400 &
      exit 0
}

proc record {} {
        global sink1 sink2 sink3 f1 f2 f3 
        
        set ns [Simulator instance]
        set time 0.25
        set bw1 [$sink1 set bytes_]
        set bw2 [$sink2 set bytes_]
        set bw3 [$sink3 set bytes_]
        set now [$ns now]
        puts $f1 "$now [expr $bw1/$time*8/1000000]"
        puts $f2 "$now [expr $bw2/$time*8/1000000]"
        puts $f3 "$now [expr $bw3/$time*8/1000000]"
        $sink1 set bytes_ 0
        $sink2 set bytes_ 0
        $sink3 set bytes_ 0
        $ns at [expr $now+$time] "record"
}


#---------------------------------------------------------------------
#Create  nodes and links
#---------------------------------------------------------------------

set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
set n4 [$ns node]

$ns duplex-link $n0 $n3 1Mb 10ms DropTail
$ns duplex-link $n1 $n3 1Mb 10ms DropTail
$ns duplex-link $n2 $n3 1Mb 10ms DropTail
$ns simplex-link $n3 $n4 1Mb 10ms CBQ/WRR
$ns simplex-link $n4 $n3 1Mb 10ms DropTail


#---------------------------------------------------------------------
#Configure CBQ - WRR
#---------------------------------------------------------------------

set cbqlink [$ns link $n3 $n4]
set topclass [new CBQClass]
$topclass setparams none 0 1 auto 8 2 0

set class1 [new CBQClass]
set queue1 [new Queue/DropTail]
$class1 install-queue $queue1
$class1 setparams $topclass true 0.5 auto 1 1 0

set class2 [new CBQClass]
set queue2 [new Queue/DropTail]
$class2 install-queue $queue2
$class2 setparams $topclass true 0.3 auto 1 1 0

set class3 [new CBQClass]
set queue3 [new Queue/DropTail]
$class3 install-queue $queue3
$class3 setparams $topclass true 0.2 auto 1 1 0


$cbqlink insert $topclass
$cbqlink insert $class1
$cbqlink insert $class2
$cbqlink insert $class3


$cbqlink bind $class1 1 ; # fid 1
$cbqlink bind $class2 2 ; # fid 2
$cbqlink bind $class3 3 ; # fid 3


#---------------------------------------------------------------------
#Create Agents
#---------------------------------------------------------------------

set udp1 [new Agent/UDP]
$ns attach-agent $n0 $udp1
set sink1 [new Agent/LossMonitor]
$ns attach-agent $n4 $sink1
$ns connect $udp1 $sink1 
$udp1 set fid_ 1 

set cbr1 [new Application/Traffic/CBR]
$cbr1 attach-agent $udp1
$cbr1 set packet_size_ 500
$cbr1 set rate_ 500Kb

set udp2 [new Agent/UDP]
$ns attach-agent $n1 $udp2
set sink2 [new Agent/LossMonitor]
$ns attach-agent $n4 $sink2
$ns connect $udp2 $sink2 
$udp2 set fid_ 2 

set cbr2 [new Application/Traffic/CBR]
$cbr2 attach-agent $udp2
$cbr2 set packet_size_ 500
$cbr2 set rate_ 500Kb

set udp3 [new Agent/UDP]
$ns attach-agent $n2 $udp3
set sink3 [new Agent/LossMonitor]
$ns attach-agent $n4 $sink3
$ns connect $udp3 $sink3 
$udp3 set fid_ 3 

set cbr3 [new Application/Traffic/CBR]
$cbr3 attach-agent $udp3
$cbr3 set packet_size_ 500
$cbr3 set rate_ 500Kb


#---------------------------------------------------------------------
# Schedule events
#---------------------------------------------------------------------

$ns at 0.0 "record"

$ns at 5.0 "$cbr1 start"
$ns at 5.0 "$cbr2 start"
$ns at 5.0 "$cbr3 start"

$ns at 55.0 "$cbr1 stop"
$ns at 55.0 "$cbr2 stop"
$ns at 55.0 "$cbr3 stop"

$ns at 60.0 "finish"

#Run the simulation
$ns run
