#######################################
# EXERCISE SETUP                      #
#######################################

# Basename for the generated files
set filenameBase "S03E02"

# Setting type of routing
# link state protocol
#set routingType "lsp"
# distance vector protocol
set routingType "dvp"

# More dynamics
set dynamicNetwork "1"

#######################################
# SIMULATOR STARTUP                   #
#######################################

# Create simulator
set ns [new Simulator]

#######################################
# ROUTING SETUP                       #
#######################################

# Setting routing protocol
if { $routingType == "lsp" } {
	$ns rtproto LS
} elseif { $routingType == "dvp" } {
	$ns rtproto DV
}

#######################################
# COLOR SETUP                         #
#######################################

$ns color 0 Red

#######################################
# FILES                               #
#######################################

# Trace file
set tf [open $filenameBase.$routingType.dynamic.$dynamicNetwork.out.tr w]
$ns trace-all $tf

# Nam tracefile
set nf [open $filenameBase.$routingType.dynamic.$dynamicNetwork.out.nam w]
$ns namtrace-all $nf

#######################################
# NODE SETUP                          #
#######################################

# Backbone nodes
set bsludit 	[$ns node]
set bsludit2 	[$ns node]
set bsghb 	[$ns node]
set bsfaber 	[$ns node]
set bstheo 	[$ns node]
set bssoc 	[$ns node]

# Periphery nodes
set pshol	[$ns node]
set pshh	[$ns node]
set psalma3	[$ns node]
set psfaber	[$ns node]
set psmtm	[$ns node]
set psesat	[$ns node]
set psghb	[$ns node]
set pson2	[$ns node]
set pslaw	[$ns node]
set pstheo	[$ns node]
set pscbib	[$ns node]
set psarts	[$ns node]
set psstraf	[$ns node]
set pshal	[$ns node]
set psmech	[$ns node]
set pscw	[$ns node]
set pspsy	[$ns node]
set pssoc	[$ns node]

# Local nodes
set lsludit	[$ns node]
set lsluditsrv1	[$ns node]
set lsluditsrv2	[$ns node]
set lsmsi1 	[$ns node]
set lsmsi2	[$ns node]
set lshalsrv	[$ns node]
set lshal1	[$ns node]
set lshal2	[$ns node]
set lshal5	[$ns node]
set ls200b	[$ns node]
set ls200c	[$ns node]
set lsfys	[$ns node]
set ls200e	[$ns node]
set ls200g	[$ns node]
set lschem	[$ns node]
set lsavd	[$ns node]
set lsii	[$ns node]
set lskadoc1	[$ns node]
set lskadoc2	[$ns node]
set lskadoc3	[$ns node]

# Creating backbone links
$ns duplex-link $bsludit 	$bsludit2 	10Mb 10ms DropTail
$ns duplex-link $bsludit 	$bssoc 		10Mb 10ms DropTail
$ns duplex-link $bsludit 	$bsfaber 	10Mb 10ms DropTail
$ns duplex-link $bsludit2 	$bsfaber 	10Mb 10ms DropTail
$ns duplex-link $bsludit2 	$bsghb	 	10Mb 10ms DropTail
$ns duplex-link $bsghb	 	$bsfaber 	10Mb 10ms DropTail
$ns duplex-link $bsfaber 	$bstheo 	10Mb 10ms DropTail
$ns duplex-link $bstheo 	$bsfaber 	10Mb 10ms DropTail
$ns duplex-link $bsfaber 	$bssoc	 	10Mb 10ms DropTail
$ns duplex-link $bstheo 	$bssoc	 	10Mb 10ms DropTail
$ns duplex-link $bssoc 		$bstheo	 	10Mb 10ms DropTail
#$ns duplex-link $n0 $n1 10Mb 10ms RED
#$ns duplex-link $n0 $n1 10Mb 10ms SFQ

# Creating periphery links
$ns duplex-link $pshol 		$bsfaber 	10Mb 10ms DropTail
$ns duplex-link $pshol 		$pshh 		10Mb 10ms DropTail
$ns duplex-link $pshh 		$bstheo 	10Mb 10ms DropTail
$ns duplex-link $psalma3 	$bsludit 	10Mb 10ms DropTail
$ns duplex-link $psalma3 	$psfaber 	10Mb 10ms DropTail
$ns duplex-link $psfaber 	$bsfaber 	10Mb 10ms DropTail
$ns duplex-link $psmtm 		$bsludit 	10Mb 10ms DropTail
$ns duplex-link $psmtm 		$psesat 	10Mb 10ms DropTail
$ns duplex-link $psesat 	$bssoc 		10Mb 10ms DropTail
$ns duplex-link $psghb 		$bsludit2 	10Mb 10ms DropTail
$ns duplex-link $psghb 		$pson2 		10Mb 10ms DropTail
$ns duplex-link $pson2 		$bsghb 		10Mb 10ms DropTail
$ns duplex-link $pslaw 		$bssoc 		10Mb 10ms DropTail
$ns duplex-link $pslaw 		$pstheo 	10Mb 10ms DropTail
$ns duplex-link $pstheo 	$bstheo 	10Mb 10ms DropTail
$ns duplex-link $psarts 	$bssoc 		10Mb 10ms DropTail
$ns duplex-link $psarts 	$pscbib 	10Mb 10ms DropTail
$ns duplex-link $pscbib 	$bstheo 	10Mb 10ms DropTail
$ns duplex-link $psstraf 	$bsfaber 	10Mb 10ms DropTail
$ns duplex-link $psstraf 	$pshal 		10Mb 10ms DropTail
$ns duplex-link $bstheo 	$pshal 		10Mb 10ms DropTail
$ns duplex-link $psmech 	$bsludit 	10Mb 10ms DropTail
$ns duplex-link $psmech 	$pscw 		10Mb 10ms DropTail
$ns duplex-link $bsfaber 	$pscw 		10Mb 10ms DropTail
$ns duplex-link $pspsy 		$bstheo 	10Mb 10ms DropTail
$ns duplex-link $pspsy 		$pssoc 		10Mb 10ms DropTail
$ns duplex-link $bssoc 		$pssoc 		10Mb 10ms DropTail

# Local links
$ns duplex-link $lsludit 	$bsludit 	10Mb 10ms DropTail
$ns duplex-link $lsludit 	$bsludit2 	10Mb 10ms DropTail
$ns duplex-link $lsluditsrv1 	$bsludit 	10Mb 10ms DropTail
$ns duplex-link $lsluditsrv1 	$lsluditsrv2 	10Mb 10ms DropTail
$ns duplex-link $lsluditsrv2 	$bsludit2 	10Mb 10ms DropTail
$ns duplex-link $lshalsrv 	$pshal 		10Mb 10ms DropTail
$ns duplex-link $lshalsrv 	$lshal1 	10Mb 10ms DropTail
$ns duplex-link $lshalsrv 	$lshal2 	10Mb 10ms DropTail
$ns duplex-link $lshalsrv 	$lshal5 	10Mb 10ms DropTail
$ns duplex-link $lshal1 	$lshal2 	10Mb 10ms DropTail
$ns duplex-link $lshal5 	$lshal2 	10Mb 10ms DropTail
$ns duplex-link $pscw 		$ls200c 	10Mb 10ms DropTail
$ns duplex-link $ls200c 	$ls200e		10Mb 10ms DropTail
$ns duplex-link $ls200e 	$lschem		10Mb 10ms DropTail
$ns duplex-link $lschem 	$lsii		10Mb 10ms DropTail
$ns duplex-link $lsii 		$lsavd		10Mb 10ms DropTail
$ns duplex-link $lsavd 		$ls200g		10Mb 10ms DropTail
$ns duplex-link $ls200g 	$lsfys		10Mb 10ms DropTail
$ns duplex-link $lsfys 		$ls200b		10Mb 10ms DropTail
$ns duplex-link $ls200b 	$pscw		10Mb 10ms DropTail
$ns duplex-link $pssoc 		$lskadoc1 	10Mb 10ms DropTail
$ns duplex-link $lskadoc1 	$lskadoc2 	10Mb 10ms DropTail
$ns duplex-link $lskadoc2 	$lskadoc3 	10Mb 10ms DropTail
$ns duplex-link $lskadoc3 	$lskadoc1 	10Mb 10ms DropTail
$ns duplex-link $psarts 	$lsmsi2 	10Mb 10ms DropTail
$ns duplex-link $lsmsi2 	$lsmsi1 	10Mb 10ms DropTail
$ns duplex-link $lsmsi1 	$pscbib 	10Mb 10ms DropTail

#######################################
# NAM SETUP                           #
#######################################

# Backbone node labels
$bsludit	label BS-Ludit
$bsludit2	label BS-Ludit2
$bsghb		label BS-Ghb
$bsfaber	label BS-Faber
$bstheo		label BS-Theo
$bssoc		label BS-Soc

# Backbone node colors
$bsludit	color Green
$bsludit2	color Green
$bsghb 		color Green
$bsfaber 	color Green
$bstheo 	color Green
$bssoc  	color Green

# Backbone node shapes
$bsludit	shape hexagon
$bsludit2	shape hexagon
$bsghb		shape hexagon
$bsfaber	shape hexagon
$bstheo		shape hexagon
$bssoc		shape hexagon

# Backbone link colors
$ns duplex-link-op $bsludit	$bsludit2	color Green
$ns duplex-link-op $bsludit	$bssoc 		color Green
$ns duplex-link-op $bsludit	$bsfaber	color Green
$ns duplex-link-op $bsludit2	$bsfaber	color Green
$ns duplex-link-op $bsludit2	$bsghb 		color Green
$ns duplex-link-op $bsghb	$bsfaber	color Green
$ns duplex-link-op $bsfaber	$bstheo 	color Green
$ns duplex-link-op $bstheo 	$bsfaber 	color Green
$ns duplex-link-op $bsfaber 	$bssoc 		color Green
$ns duplex-link-op $bstheo	$bssoc 		color Green
$ns duplex-link-op $bssoc 	$bstheo 	color Green

# Periphery node labels
$pshol 		label PS-Hol
$pshh		label PS-HH
$psalma3	label PS-Alma3
$psfaber	label PS-Faber
$psmtm		label PS-Mtm
$psesat		label PS-Esat
$psghb		label PS-Ghb
$pson2		label PS-On2
$pslaw		label PS-Law
$pstheo		label PS-Theo
$pscbib		label PS-Cbib
$psarts		label PS-Arts
$psstraf	label PS-Straf
$pshal		label PS-Hal
$psmech		label PS-Mech
$pscw		label PS-CW
$pspsy		label PS-Psy
$pssoc		label PS-Soc

# Periphery node colors
$pshol		color Blue
$pshh		color Blue
$psalma3	color Blue
$psfaber	color Blue
$psmtm		color Blue
$psesat		color Blue
$psghb		color Blue
$pson2		color Blue
$pslaw		color Blue
$pstheo		color Blue
$pscbib		color Blue
$psarts		color Blue
$psstraf	color Blue
$pshal		color Blue
$psmech		color Blue
$pscw		color Blue
$pspsy		color Blue
$pssoc		color Blue

# Periphery node shapes
$pshol 		shape square
$pshh 		shape square
$psalma3 	shape square
$psfaber 	shape square
$psmtm 		shape square
$psesat 	shape square
$psghb 		shape square
$pson2 		shape square
$pslaw 		shape square
$pstheo 	shape square
$pscbib 	shape square
$psarts 	shape square
$psstraf 	shape square
$pshal 		shape square
$psmech 	shape square
$pscw 		shape square
$pspsy 		shape square
$pssoc 		shape square

# Periphery link colors
$ns duplex-link-op $pshol 	$bsfaber 	color Blue	
$ns duplex-link-op $pshol 	$pshh 		color Blue
$ns duplex-link-op $pshh 	$bstheo 	color Blue
$ns duplex-link-op $psalma3 	$bsludit 	color Blue
$ns duplex-link-op $psalma3 	$psfaber 	color Blue
$ns duplex-link-op $psfaber 	$bsfaber 	color Blue
$ns duplex-link-op $psmtm 	$bsludit 	color Blue
$ns duplex-link-op $psmtm 	$psesat 	color Blue
$ns duplex-link-op $psesat 	$bssoc 		color Blue
$ns duplex-link-op $psghb 	$bsludit2 	color Blue
$ns duplex-link-op $psghb 	$pson2 		color Blue
$ns duplex-link-op $pson2 	$bsghb 		color Blue
$ns duplex-link-op $pslaw 	$bssoc 		color Blue
$ns duplex-link-op $pslaw 	$pstheo 	color Blue
$ns duplex-link-op $pstheo 	$bstheo 	color Blue
$ns duplex-link-op $psarts 	$bssoc 		color Blue
$ns duplex-link-op $psarts 	$pscbib 	color Blue
$ns duplex-link-op $pscbib 	$bstheo 	color Blue
$ns duplex-link-op $psstraf 	$bsfaber 	color Blue
$ns duplex-link-op $psstraf 	$pshal 		color Blue
$ns duplex-link-op $bstheo 	$pshal 		color Blue
$ns duplex-link-op $psmech 	$bsludit 	color Blue
$ns duplex-link-op $psmech 	$pscw 		color Blue
$ns duplex-link-op $bsfaber 	$pscw 		color Blue
$ns duplex-link-op $pspsy 	$bstheo 	color Blue
$ns duplex-link-op $pspsy 	$pssoc 		color Blue
$ns duplex-link-op $bssoc 	$pssoc 		color Blue

# Local node labels
$lsludit	label LS-Ludit
$lsluditsrv1	label LS-Ludit-Srv1
$lsluditsrv2	label LS-Ludit-Srv2
$lsmsi1 	label LS-Msi1
$lsmsi2 	label LS-Msi2
$lshalsrv	label LS-Hal-Srv
$lshal1		label LS-Hal1
$lshal2		label LS-Hal2
$lshal5		label LS-Hal5
$ls200b		label LS-200b
$ls200c		label LS-200c
$lsfys		label LS-Fys
$ls200e		label LS-200e
$ls200g		label LS-200g
$lschem		label LS-Chem
$lsavd		label LS-Avd
$lsii		label LS-Ii
$lskadoc1	label LS-Kadoc1
$lskadoc2	label LS-Kadoc2
$lskadoc3	label LS-Kadoc3

# Local node colors
$lsludit	color Black
$lsluditsrv1	color Black
$lsluditsrv2	color Black
$lsmsi1 	color Black
$lsmsi2 	color Black
$lshalsrv	color Black
$lshal1		color Black
$lshal2		color Black
$lshal5		color Black
$ls200b		color Black
$ls200c		color Black
$lsfys		color Black
$ls200e		color Black
$ls200g		color Black
$lschem		color Black
$lsavd		color Black
$lsii		color Black
$lskadoc1	color Black
$lskadoc2	color Black
$lskadoc3	color Black

# Local link colors
$ns duplex-link-op $lsludit 	$bsludit 	color Black
$ns duplex-link-op $lsludit 	$bsludit2 	color Black
$ns duplex-link-op $lsluditsrv1 $bsludit 	color Black
$ns duplex-link-op $lsluditsrv1 $lsluditsrv2 	color Black
$ns duplex-link-op $lsluditsrv2 $bsludit2 	color Black
$ns duplex-link-op $lshalsrv 	$pshal 		color Black
$ns duplex-link-op $lshalsrv 	$lshal1 	color Black
$ns duplex-link-op $lshalsrv 	$lshal2 	color Black
$ns duplex-link-op $lshalsrv 	$lshal5 	color Black
$ns duplex-link-op $lshal1 	$lshal2 	color Black
$ns duplex-link-op $lshal5 	$lshal2 	color Black
$ns duplex-link-op $pscw 	$ls200c 	color Black
$ns duplex-link-op $ls200c 	$ls200e		color Black
$ns duplex-link-op $ls200e 	$lschem		color Black
$ns duplex-link-op $lschem 	$lsii		color Black
$ns duplex-link-op $lsii 	$lsavd		color Black
$ns duplex-link-op $lsavd 	$ls200g		color Black
$ns duplex-link-op $ls200g 	$lsfys		color Black
$ns duplex-link-op $lsfys 	$ls200b		color Black
$ns duplex-link-op $ls200b 	$pscw		color Black
$ns duplex-link-op $pssoc 	$lskadoc1 	color Black
$ns duplex-link-op $lskadoc1 	$lskadoc2 	color Black
$ns duplex-link-op $lskadoc2 	$lskadoc3 	color Black
$ns duplex-link-op $lskadoc3 	$lskadoc1 	color Black
$ns duplex-link-op $psarts 	$lsmsi2 	color Black
$ns duplex-link-op $lsmsi2 	$lsmsi1 	color Black
$ns duplex-link-op $lsmsi1 	$pscbib 	color Black

#######################################
# FTP CONNECTION BETWEEN CW AND LAW   #
#######################################

# Starting TCP Agent
set tcp [new Agent/TCP]
#set tcp [new Agent/TCP/Newreno]
#set tco [new Agent/TCP/Vegas]
$ns attach-agent $pscw $tcp

# Starting Sink Agent
set sink [new Agent/TCPSink]
$ns attach-agent $pslaw $sink

# Connecting TCP agent to Sink agent
$ns connect $tcp $sink

# Setting connection parameters
$tcp set fid_ 0
#$tcp set packetSize_
#$tcp set window_
#$tcp set rate_

# Starting FTP Connection
set ftp [new Application/FTP]
$ftp attach-agent $tcp

#######################################
# BREAKING LINKS                      #
#######################################

# Connection between Sociology and Faber
$ns rtmodel-at 2.0 down	$bsfaber $bssoc
$ns rtmodel-at 8.0 up $bsfaber $bssoc

if { $dynamicNetwork == "1" } {
	# Connection between Sociology and Law
	$ns rtmodel-at 4.0 down $bssoc $pslaw
	$ns rtmodel-at 7.0 up $bssoc $pslaw
	#Connection between BS Faber, BS ludit2
	$ns rtmodel-at 3.0 down $bsludit2 $bsfaber
	$ns rtmodel-at 4.5 up $bsludit2 $bsfaber
}

#######################################
# TIMING                              #
#######################################

# FTP Connection timing
$ns at 1.0 "$ftp start"
$ns at 9.9 "$ftp stop"

# End of simulation
$ns at 10.0 "finish"

#######################################
# FUNCTIONS                           #
#######################################

# Finish function
proc finish {} {
	#finalize trace files
	global ns nf tf filenameBase routingType dynamicNetwork
	$ns flush-trace
	close $tf
	close $nf
	
	#exec nam $filenameBase.$routingType.dynamic.$dynamicNetwork.out.nam &
	exit 0
}

#######################################
# RUNNING SIMULATOR                   #
#######################################

# Running the network simulator
$ns run

