####################################################################
#UNIVERSIDADE FEDERAL DO PARÁ
#TESE DE DOUTORADO - FRAMEWORK CARIMBÓ
#MECANISMO DE PROTEÇÃO DA REDE INTERATIVA
#MAURO MARGALHO COUTINHO (MARGALHO@UNAMA.BR)
#ORIENTADORES: PROFS. JOÃO CRISÓSTOMO E RENATO FRANCÊS (UFPA)
#www.cci.unama.br/margalho
####################################################################



set ns [new Simulator]

set cir0  1000000
set rate0 1.5M


set testTime 20.0
set packetSize 200

# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#Definicao das cores para identificar os fluxos de dados
$ns color 1 Blue
$ns color 2 Red
$ns color 3 yellow
$ns color 4 green
$ns color 5 black
$ns color 6 pink
$ns color 7 white

#Arquivo de Trace
set f [open wtrace.tr w]
$ns trace-all $f
#Arquivo de Trace do NAM
set nf [open out.nam w]
$ns namtrace-all $nf
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


# ------------ Criacao da topologia da rede (inicio) -----------------------------------
set PCEgov [$ns node]
set PCRBelem [$ns node]
set PTVD [$ns node]
set nucleods [$ns node]
set PCRSantarem [$ns node]
set PCRObidos [$ns node]
set PCRCastanhal [$ns node]
set PCRAbaetetuba [$ns node]
set PCRAlenquer [$ns node]
set PCRBraganca [$ns node]
set PCRTucurui [$ns node]
set PCRAltamira [$ns node]

# 
#Link Ethernet
$ns duplex-link $PTVD  $PCEgov 100Mb 10ms DropTail
#link ADSL Lite Upload 384, download 1.5M

#link ADSL Lite Upload 384, download 1.5M
$ns simplex-link $PCRBelem  $nucleods 384Kb 100ms dsRED/edge
$ns simplex-link $nucleods $PCRBelem 1.5Mb 100ms dsRED/core

#Enlace de LPCD T1 = 1.544, cada enlace E1=2.048
# 8.192 = 4 enlaces E1
$ns simplex-link $nucleods $PTVD  1.544Mb 20ms dsRED/core
$ns simplex-link $PTVD  $nucleods 1.544Mb 20ms dsRED/edge
#
#Link T1
$ns simplex-link $PCRSantarem $nucleods 384Kb 100ms dsRED/edge
$ns simplex-link $nucleods $PCRSantarem 1.5Mb 100ms dsRED/core
$ns simplex-link $PCRObidos $nucleods 384Kb 100ms dsRED/edge
$ns simplex-link $nucleods $PCRObidos 1.5Mb 100ms dsRED/core
$ns simplex-link $PCRCastanhal $nucleods 384Kb 100ms dsRED/edge
$ns simplex-link $nucleods $PCRCastanhal 1.5Mb 100ms dsRED/core
$ns simplex-link $PCRAbaetetuba $nucleods 384Kb 100ms dsRED/edge
$ns simplex-link $nucleods $PCRAbaetetuba 1.5Mb 100ms dsRED/core
$ns simplex-link $PCRAlenquer $nucleods 384Kb 100ms dsRED/edge
$ns simplex-link $nucleods $PCRAlenquer 1.5Mb 100ms dsRED/core
$ns simplex-link $PCRBraganca $nucleods 384Kb 100ms dsRED/edge
$ns simplex-link $nucleods $PCRBraganca 1.5Mb 100ms dsRED/core
$ns simplex-link $PCRTucurui $nucleods 384Kb 100ms dsRED/edge
$ns simplex-link $nucleods $PCRTucurui 1.5Mb 100ms dsRED/core
$ns simplex-link $PCRAltamira $nucleods 384Kb 100ms dsRED/edge
$ns simplex-link $nucleods $PCRAltamira 1.5Mb 100ms dsRED/core
# Obs.Os links de QoS precisam ser simplex por isso vao e voltam

#Orientacao para o desenho da topologia no NAM (opcional)
#$ns duplex-link-op $TerminalInterativo $PCRBelem orient up-right
$ns simplex-link-op $PCRBelem $nucleods orient right
$ns simplex-link-op $nucleods $PTVD orient right
$ns simplex-link-op $PCRSantarem $nucleods orient up-left
$ns simplex-link-op $PCRObidos $nucleods orient up-left
$ns simplex-link-op $PCRCastanhal $nucleods orient up-right
$ns simplex-link-op $PCRAbaetetuba $nucleods orient up-right
$ns simplex-link-op $PCRAlenquer $nucleods orient down-left
$ns simplex-link-op $PCRBraganca $nucleods orient down-left
$ns simplex-link-op $PCRTucurui $nucleods orient down-tight
$ns simplex-link-op $PCRAltamira $nucleods orient down-right
$ns simplex-link-op $PTVD $PCEgov orient right

#Identificacao das filas a serem monitoradas pelo NAM
$ns simplex-link-op $nucleods $PTVD queuePos 0.5

# ------------ Criacao da topologia da rede (fim) --------------------------------------
# Criacao das Filas
set qBinN2 [[$ns link $PCRBelem $nucleods] queue]
#
set qN2Bin [[$ns link $nucleods $PCRBelem] queue]
#
set qN2Bout2 [[$ns link $nucleods $PTVD] queue]
#
set qBout2N2 [[$ns link $PTVD $nucleods] queue]
#
set qTB2N2 [[$ns link $PCRSantarem $nucleods] queue]
set qN2TB2 [[$ns link $nucleods $PCRSantarem] queue]
set qTB3N2 [[$ns link $PCRObidos $nucleods] queue]
set qN2TB3 [[$ns link $nucleods $PCRObidos] queue]
set qTB4N2 [[$ns link $PCRCastanhal $nucleods] queue]
set qN2TB4 [[$ns link $nucleods $PCRCastanhal] queue]
set qTB5N2 [[$ns link $PCRAbaetetuba $nucleods] queue]
set qN2TB5 [[$ns link $nucleods $PCRAbaetetuba] queue]
set qTB6N2 [[$ns link $PCRAlenquer $nucleods] queue]
set qN2TB6 [[$ns link $nucleods $PCRAlenquer] queue]
set qTB7N2 [[$ns link $PCRBraganca $nucleods] queue]
set qN2TB7 [[$ns link $nucleods $PCRBraganca] queue]
set qTB8N2 [[$ns link $PCRTucurui $nucleods] queue]
set qN2TB8 [[$ns link $nucleods $PCRTucurui] queue]
set qTB9N2 [[$ns link $PCRAltamira $nucleods] queue]
set qN2TB9 [[$ns link $nucleods $PCRAltamira] queue]

# P O L I T I C A S     &     P H B 's =======================================
$qBinN2 meanPktSize $packetSize
$qBinN2 set numQueues_ 2
$qBinN2 setNumPrec 1
$qBinN2 addPolicyEntry [$PCRBelem id] [$PCEgov id] TSW2CM 10 $cir0
$qBinN2 addPolicerEntry TSW2CM 10 10
$qBinN2 configQ 0 0 20 40 0.02
$qBinN2 configQ 1 0 10 20 0.10
$qBinN2 addPHBEntry 10 0 0
$qBinN2 addPHBEntry 0 1 0

$qTB2N2 meanPktSize $packetSize
$qTB2N2 set numQueues_ 2
$qTB2N2 setNumPrec 1
$qTB2N2 addPolicyEntry [$PCRSantarem id] [$PCEgov id] TSW2CM 10 $cir0
$qTB2N2 addPolicerEntry TSW2CM 10 10
$qTB2N2 configQ 0 0 20 40 0.02
$qTB2N2 configQ 1 0 10 20 0.10
$qTB2N2 addPHBEntry 10 0 0
$qTB2N2 addPHBEntry 0 1 0

$qTB3N2 meanPktSize $packetSize
$qTB3N2 set numQueues_ 2
$qTB3N2 setNumPrec 1
$qTB3N2 addPolicyEntry [$PCRObidos id] [$PCEgov id] TSW2CM 0 $cir0
$qTB3N2 addPolicerEntry TSW2CM 0 0
$qTB3N2 configQ 0 0 20 40 0.02
$qTB3N2 configQ 1 0 10 20 0.10
$qTB3N2 addPHBEntry 10 0 0
$qTB3N2 addPHBEntry 0 1 0

$qTB4N2 meanPktSize $packetSize
$qTB4N2 set numQueues_ 2
$qTB4N2 setNumPrec 1
$qTB4N2 addPolicyEntry [$PCRCastanhal id] [$PCEgov id] TSW2CM 0 $cir0
$qTB4N2 addPolicerEntry TSW2CM 0 0
$qTB4N2 configQ 0 0 20 40 0.02
$qTB4N2 configQ 1 0 10 20 0.10
$qTB4N2 addPHBEntry 10 0 0
$qTB4N2 addPHBEntry 0 1 0

$qTB5N2 meanPktSize $packetSize
$qTB5N2 set numQueues_ 2
$qTB5N2 setNumPrec 1
$qTB5N2 addPolicyEntry [$PCRAbaetetuba id] [$PCEgov id] TSW2CM 0 $cir0
$qTB5N2 addPolicerEntry TSW2CM 0 0
$qTB5N2 configQ 0 0 20 40 0.02
$qTB5N2 configQ 1 0 10 20 0.10
$qTB5N2 addPHBEntry 10 0 0
$qTB5N2 addPHBEntry 0 1 0

$qTB6N2 meanPktSize $packetSize
$qTB6N2 set numQueues_ 2
$qTB6N2 setNumPrec 1
$qTB6N2 addPolicyEntry [$PCRAlenquer id] [$PCEgov id] TSW2CM 0 $cir0
$qTB6N2 addPolicerEntry TSW2CM 0 0
$qTB6N2 configQ 0 0 20 40 0.02
$qTB6N2 configQ 1 0 10 20 0.10
$qTB6N2 addPHBEntry 10 0 0
$qTB6N2 addPHBEntry 0 1 0

$qTB7N2 meanPktSize $packetSize
$qTB7N2 set numQueues_ 2
$qTB7N2 setNumPrec 1
$qTB7N2 addPolicyEntry [$PCRBraganca id] [$PCEgov id] TSW2CM 0 $cir0
$qTB7N2 addPolicerEntry TSW2CM 0 0
$qTB7N2 configQ 0 0 20 40 0.02
$qTB7N2 configQ 1 0 10 20 0.10
$qTB7N2 addPHBEntry 10 0 0
$qTB7N2 addPHBEntry 0 1 0

$qTB8N2 meanPktSize $packetSize
$qTB8N2 set numQueues_ 2
$qTB8N2 setNumPrec 1
$qTB8N2 addPolicyEntry [$PCRTucurui id] [$PCEgov id] TSW2CM 0 $cir0
$qTB8N2 addPolicerEntry TSW2CM 0 0
$qTB8N2 configQ 0 0 20 40 0.02
$qTB8N2 configQ 1 0 10 20 0.10
$qTB8N2 addPHBEntry 10 0 0
$qTB8N2 addPHBEntry 0 1 0

$qTB9N2 meanPktSize $packetSize
$qTB9N2 set numQueues_ 2
$qTB9N2 setNumPrec 1
$qTB9N2 addPolicyEntry [$PCRAltamira id] [$PCEgov id] TSW2CM 0 $cir0
$qTB9N2 addPolicerEntry TSW2CM 0 0
$qTB9N2 configQ 0 0 20 40 0.02
$qTB9N2 configQ 1 0 10 20 0.10
$qTB9N2 addPHBEntry 10 0 0
$qTB9N2 addPHBEntry 0 1 0

$qN2Bout2 setSchedularMode WRR
$qN2Bout2 addQueueWeights 0 6.5
$qN2Bout2 addQueueWeights 1 3.5
$qN2Bout2 meanPktSize $packetSize
$qN2Bout2 set numQueues_ 2
$qN2Bout2 setNumPrec 1
$qN2Bout2 addPHBEntry 10 0 0
$qN2Bout2 addPHBEntry 0 1 0
$qN2Bout2 configQ 0 0 20 40 0.02
$qN2Bout2 configQ 1 0 10 20 0.10

# ------------ Criacao do trafego (inicio) -----------------------------------
# Vazao agregada vinda de usuarios da rede sem fio para 10 usuários
set udp2 [new Agent/UDP]
$ns attach-agent $PCRBelem $udp2
set cbr2 [new Application/Traffic/CBR]
$cbr2 attach-agent $udp2
$cbr2 set packet_size_ $packetSize
$udp2 set packetSize_ $packetSize
$udp2 set class_ 1
$cbr2 set rate_ 147Kb
$cbr2 set codePt_ 10
set null2 [new Agent/Null]
$ns attach-agent $PCEgov $null2
$ns connect $udp2 $null2

#Taxa 1920K = 30 acessos de 33.600K - Media em 10Kbps
set udp2b [new Agent/UDP]
$ns attach-agent $PCRSantarem $udp2b
set exp2b [new Application/Traffic/CBR]
$exp2b attach-agent $udp2b
$exp2b set packet_size_ $packetSize
$udp2b set packetSize_ $packetSize
$udp2b set class_ 2
$exp2b set rate_ 336Kb
$exp2b set codePt_ 10
set null2b [new Agent/Null]
$ns attach-agent $PCEgov $null2b
$ns connect $udp2b $null2b

# Trafego com baixa prioridade (background)----------------------------------

set udp3 [new Agent/UDP]
$ns attach-agent $PCRObidos $udp3
set cbr3 [new Application/Traffic/CBR]
$cbr3 attach-agent $udp3
$cbr3 set packet_size_ $packetSize
$udp3 set packetSize_ $packetSize
$udp3 set class_ 3
$cbr3 set rate_ 640Kb
$cbr3 set codePt_ 0
set null3 [new Agent/Null]
$ns attach-agent $PCEgov $null3
$ns connect $udp3 $null3

set udp4 [new Agent/UDP]
$ns attach-agent $PCRCastanhal $udp4
set cbr4 [new Application/Traffic/CBR]
$cbr4 attach-agent $udp4
$cbr4 set packet_size_ $packetSize
$udp4 set packetSize_ $packetSize
$udp4 set class_ 4
$cbr4 set rate_ 640Kb
$cbr4 set codePt_ 0
set null4 [new Agent/Null]
$ns attach-agent $PCEgov $null4
$ns connect $udp4 $null4

set udp5 [new Agent/UDP]
$ns attach-agent $PCRAbaetetuba $udp5
set cbr5 [new Application/Traffic/CBR]
$cbr5 attach-agent $udp5
$cbr5 set packet_size_ $packetSize
$udp5 set packetSize_ $packetSize
$udp5 set class_ 5
$cbr5 set rate_ 640Kb
$cbr5 set codePt_ 0
set null5 [new Agent/Null]
$ns attach-agent $PCEgov $null5
$ns connect $udp5 $null5

set udp6 [new Agent/UDP]
$ns attach-agent $PCRAlenquer $udp6
set cbr6 [new Application/Traffic/CBR]
$cbr6 attach-agent $udp6
$cbr6 set packet_size_ $packetSize
$udp6 set packetSize_ $packetSize
$udp6 set class_ 6
$cbr6 set rate_ 640Kb
$cbr6 set codePt_ 0
set null6 [new Agent/Null]
$ns attach-agent $PCEgov $null6
$ns connect $udp6 $null6

set udp7 [new Agent/UDP]
$ns attach-agent $PCRAltamira $udp7
set cbr7 [new Application/Traffic/CBR]
$cbr7 attach-agent $udp7
$cbr7 set packet_size_ $packetSize
$udp7 set packetSize_ $packetSize
$udp7 set class_ 7
$cbr7 set rate_ 640Kb
$cbr7 set codePt_ 0
set null7 [new Agent/Null]
$ns attach-agent $PCEgov $null7
$ns connect $udp7 $null7

set udp8 [new Agent/UDP]
$ns attach-agent $PCRBraganca $udp8
set cbr8 [new Application/Traffic/CBR]
$cbr8 attach-agent $udp8
$cbr8 set packet_size_ $packetSize
$udp8 set packetSize_ $packetSize
$udp8 set class_ 8
$cbr8 set rate_ 640Kb
$cbr8 set codePt_ 0
set null8 [new Agent/Null]
$ns attach-agent $PCEgov $null8
$ns connect $udp8 $null8

set udp9 [new Agent/UDP]
$ns attach-agent $PCRTucurui $udp9
set cbr9 [new Application/Traffic/CBR]
$cbr9 attach-agent $udp9
$cbr9 set packet_size_ $packetSize
$udp9 set packetSize_ $packetSize
$udp9 set class_ 9
$cbr9 set rate_ 640Kb
$cbr9 set codePt_ 0
set null9 [new Agent/Null]
$ns attach-agent $PCEgov $null9
$ns connect $udp9 $null9


# ------------ Criacao do trafego (fim) -------------------------------------

proc finish {} {
    global ns nf f
    $ns flush-trace
    #Fecha o arquivo de Trace
    close $f
    close $nf
    #Executa o NAM
    exec nam out.nam &
    exit 0
}

# Definindo o label
#$ns at 0.0 "$TerminalInterativo label TerminalInterativo"
$ns at 0.0 "$PCEgov label PCEgov"
$ns at 0.0 "$PCRBelem label PCRBelem"
$ns at 0.0 "$PTVD label PTVD"
$ns at 0.0 "$nucleods label nucleods"
$ns at 0.0 "$PCRSantarem label PCRSantarem"
$ns at 0.0 "$PCRObidos label PCRObidos"
$ns at 0.0 "$PCRCastanhal label PCRCastanhal"
$ns at 0.0 "$PCRAbaetetuba label PCRAbaetetuba"
$ns at 0.0 "$PCRAlenquer label PCRAlenquer"
$ns at 0.0 "$PCRBraganca label PCRBraganca"
$ns at 0.0 "$PCRTucurui label PCRTucurui"
$ns at 0.0 "$PCRAltamira label PCRAltamira"

#Definindo os momentos em que o trafego entra na rede
#$ns at 2.0 "$ftp2 start"
$ns at 0.0 "$cbr2 start"
$ns at 0.0 "$exp2b start"
$ns at 0.0 "$cbr3 start"
$ns at 0.0 "$cbr4 start"
$ns at 0.0 "$cbr5 start"
$ns at 0.0 "$cbr6 start"
$ns at 0.0 "$cbr7 start"
$ns at 0.0 "$cbr8 start"
$ns at 0.0 "$cbr9 start"

$ns at $testTime "$cbr2 stop"
$ns at $testTime "$exp2b stop"
$ns at $testTime "$cbr3 stop"
$ns at $testTime "$cbr4 stop"
$ns at $testTime "$cbr5 stop"
$ns at $testTime "$cbr6 stop"
$ns at $testTime "$cbr7 stop"
$ns at $testTime "$cbr8 stop"
$ns at $testTime "$cbr9 stop"
$ns at [expr $testTime + 1.0] "finish"

$ns run

