# Codigo Exemplo no NS criado por Mauro Margalho Coutinho
# www.margalho.pro.br
# Exercicio1
#
	
#Instancia o objeto NS
set ns [new Simulator]

puts "Versao 1.0"

#Uso de roteamento dinamico (para queda de enlace)
$ns rtproto DV

#Define as cores para os fluxos de dados
$ns color 1 Blue
$ns color 2 Red
$ns color 3 Orange
$ns color 4 Green
$ns color 5 Yellow

#Cria o arquivo do Netwaor Animator
set nf [open animacao.nam w]
$ns namtrace-all $nf

#Cria o arquivo de trace para geração de graficos
set nt [open wtrace.tr w]
$ns trace-all $nt

#Procedimento de Encerramento da simulacao
proc encerrar {} {
        global ns nf nt
        $ns flush-trace
	#Fecha os arquivos
        close $nf 
        close $nt
	#Executa o nam a partir do arquivo gerado
        exec nam animacao.nam &
        exit 0
}

#Cria os roteadores 
set wnum_rt 14
for {set wind_rt 1} {$wind_rt<=$wnum_rt} { incr wind_rt } {
    set rt_($wind_rt) [$ns node]
}


#Cria legendas no NAM
$ns at 0.0 "$rt_(1) label rt_1"
$ns at 0.0 "$rt_(2) label rt_2"
$ns at 0.0 "$rt_(3) label rt_3"
$ns at 0.0 "$rt_(4) label rt_4"
$ns at 0.0 "$rt_(5) label rt_5"
$ns at 0.0 "$rt_(6) label rt_6"
$ns at 0.0 "$rt_(7) label rt_7"
$ns at 0.0 "$rt_(8) label rt_8"
$ns at 0.0 "$rt_(9) label rt_9"
$ns at 0.0 "$rt_(10) label rt_10"
$ns at 0.0 "$rt_(11) label rt_11"
$ns at 0.0 "$rt_(12) label rt_12"
$ns at 0.0 "$rt_(13) label rt_13"
$ns at 0.0 "$rt_(14) label rt_14"



#Cria o enlace entre os nos
# DropTail
$ns duplex-link $rt_(1) $rt_(5) 1Mb 50ms RED
$ns duplex-link $rt_(2) $rt_(5) 1Mb 50ms RED
$ns duplex-link $rt_(3) $rt_(5) 1Mb 50ms RED
$ns duplex-link $rt_(4) $rt_(5) 1Mb 50ms RED
$ns duplex-link $rt_(5) $rt_(10) 1.544Mb 50ms RED
$ns duplex-link $rt_(10) $rt_(11) 1Mb 50ms RED
$ns duplex-link $rt_(10) $rt_(12) 1Mb 50ms RED
$ns duplex-link $rt_(10) $rt_(13) 1Mb 50ms RED
$ns duplex-link $rt_(10) $rt_(14) 1Mb 50ms RED
$ns duplex-link $rt_(5) $rt_(6) 1.544Mb 50ms RED
$ns duplex-link $rt_(6) $rt_(7) 1.544Mb 50ms RED
$ns duplex-link $rt_(7) $rt_(8) 1.544Mb 50ms RED
$ns duplex-link $rt_(8) $rt_(9) 1.544Mb 50ms RED
$ns duplex-link $rt_(9) $rt_(10) 1.544Mb 50ms RED




proc cria_conexao_cbr { origem destino inicio fim inicio2 fim2 taxa classe } {
	global ns
	set udp0 [new Agent/UDP]
	set src [new Application/Traffic/CBR]	
	$udp0 set class_ $classe
	$src set rate_ $taxa
        

	set sink [new Agent/Null]

	$ns attach-agent $origem $udp0
	$src attach-agent $udp0
	$ns attach-agent $destino $sink

	$ns connect $udp0 $sink
	$ns at $inicio "$src start"
        $ns at $fim "$src stop"
        if {($inicio2 != 0) && ($fim2!=0)} {
	   puts "entrei: =  $classe"  
	   $ns at $inicio2 "$src set rate_ 0.900Mb"
	   $ns at $inicio2 "$src start"
           $ns at $fim2 "$src stop"
        }
	return $udp0
}

proc cria_conexao_tcp { origem destino inicio fim classe} {
        global ns
	set tcp [new Agent/TCP]
	$tcp set packetSize_ 1500
	$tcp set class_ $classe
	set sink [new Agent/TCPSink]
	$ns attach-agent $origem $tcp
	$ns attach-agent $destino $sink
	$ns connect $tcp $sink
	set ftp [new Application/FTP]
	$ftp set packetSize_ 1500
	$ftp attach-agent $tcp
	$ns at $inicio "$ftp start" 
        $ns at $fim "$ftp stop"
      return $tcp
}


#Escalona os eventos para as aplicações
set video1 [cria_conexao_cbr $rt_(1) $rt_(11) 1 30 30.1 99 0.386Mb 1]
set video2 [cria_conexao_cbr $rt_(2) $rt_(12) 5 99 0 0 0.386Mb 2]
set video3 [cria_conexao_cbr $rt_(3) $rt_(13) 10 99 0 0 0.386Mb 3]
set video4 [cria_conexao_cbr $rt_(4) $rt_(14) 15 99 0 0 0.386Mb 4]
set ftp1 [cria_conexao_tcp $rt_(7) $rt_(10) 1 99 5]

#Escalona os estados dos enlaces
$ns rtmodel-at 50.0 down $rt_(5) $rt_(10)
$ns rtmodel-at 70.0 up $rt_(5) $rt_(10)


#Chama o procedimento de encerramento 
$ns at 100.0 "encerrar"

#Executa a simulacao
$ns run

