#distvec2.tcl

#Gli algoritmi distance vector reagiscono rapidamente alle buone notizie
# e lentamente alle cattive notizie
#Il simulatore invia invece lo stesso numero di distance vector in entrambi i casi.
#Le sorgenti sono TCP, mi aspetto che non spediscano pacchetti
#quando il link e' down.


set ns [new Simulator]

$ns rtproto DV

set nf [open distvec2.nam w]
$ns namtrace-all $nf

proc finish { }  {
                  global ns nf
                  $ns flush-trace
                  close $nf
                  exec nam distvec2.nam &
                  exit 0
}

set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
set n4 [$ns node]

$ns duplex-link $n0 $n1 1Mb 10ms DropTail
$ns duplex-link $n1 $n2 1Mb 10ms DropTail
$ns duplex-link $n2 $n3 1Mb 10ms DropTail
$ns duplex-link $n3 $n4 1Mb 10ms DropTail


#Il livello di trasporto
set tcp1 [new Agent/TCP]
$ns attach-agent $n1 $tcp1

set tcp2 [new Agent/TCP]
$ns attach-agent $n2 $tcp2

set tcp4 [new Agent/TCP]
$ns attach-agent $n4 $tcp4

# Alla rottura del link 0-1, n2  dovrebbe  sapere che il link e' down
# e quindi non dovrebbe spedire pacchetti;
# oppure dovrebbe ritenere che la distanza tra n1 ed n0
# sia infinito e tra n3 ed n0 sia 3,
# dunque dovrebbe decidere di spedire i pacchetti a n3,
# invece li spedisce comunque a n1.


set sink10 [new Agent/TCPSink]
$ns attach-agent $n0 $sink10
set sink20 [new Agent/TCPSink]
$ns attach-agent $n0 $sink20
set sink40 [new Agent/TCPSink]
$ns attach-agent $n0 $sink40

$ns connect $tcp4 $sink40
$ns connect $tcp2 $sink20

#Il livello di applicazione
set ftp4 [new Application/FTP]
$ftp4 attach-agent $tcp4
set ftp2 [new Application/FTP]
$ftp2 attach-agent $tcp2 

puts "\n\n ###### COMMENTI ######\n"
puts "0.1 : link 0-1 down"
puts "ftp4 starts, ma nessuno puo' trasmettere"
puts "1.0 : link 0-1 up"
puts "1.5 : ftp2 starts SlowStart"
puts "2.0 : link 0-1 down"
puts "Ritrasmissione secondo l'algoritmo di Karn\n"
puts "A questo punto si dovrebbero vedere piu' distance vector scambiati\
perche' la cattiva notizia dovrebbe propaga in molti piu' passi, invece\
cio' non accade grazie a Split Horizon"


#Temporizzazione della simulazione
$ns rtmodel-at 0.1 down $n1 $n0
$ns at 0.4 "$ftp4 start"
#ftp4 non trasmette
$ns rtmodel-at 1.0 up $n1 $n0
$ns at 1.5 "$ftp2 start"
#ftp2 fa SS
$ns rtmodel-at 2 down $n1 $n0
#Karn's retransmission

$ns at 6.0 "finish"
$ns run