# Sliding window protocol in a heavily loaded network.
# features : labeling, annotation, nam-graph, and window size monitoring
# all packets look black cause of supporting nam-graph
# you could run 'C2-sliding-color.nam' to see the colors of each traffic

#
#	n0 			  n5 
#	   \	  	        / 
#	n1 -- n3 ---------- n4 -- n6
#	   /			\ 
#	n2 			  n7


set ns [new Simulator]

$ns color 0 black
$ns color 1 red

#$ns trace-all [open C2-sliding-window.tr w]
#$ns namtrace-all [open C2-sliding-window.nam w]

	foreach i " 0 1 2 3 4 5 6 7" {
		set n$i [$ns node]
	}

        $ns at 0.0 "$n0 label TCP"
        $ns at 0.0 "$n5 label TCP"
        $ns at 0.0 "$n1 label CBR-1"
        $ns at 0.0 "$n2 label CBR-2" 
        $ns at 0.0 "$n6 label CBR-1"
        $ns at 0.0 "$n7 label CBR-2"

        $ns duplex-link $n0 $n3 5Mb 20ms DropTail
        $ns duplex-link $n1 $n3 1Mb 20ms DropTail
        $ns duplex-link $n2 $n3 1Mb 20ms DropTail
        $ns duplex-link $n3 $n4 1Mb 50ms DropTail
	$ns duplex-link $n4 $n5 5Mb 20ms DropTail
        $ns duplex-link $n4 $n6 1Mb 20ms DropTail
        $ns duplex-link $n4 $n7 1Mb 20ms DropTail

        $ns queue-limit $n3 $n4 10

        $ns duplex-link-op $n0 $n3 orient right-down
        $ns duplex-link-op $n1 $n3 orient right
        $ns duplex-link-op $n2 $n3 orient right-up
        $ns duplex-link-op $n3 $n4 orient right     
        $ns duplex-link-op $n4 $n5 orient right-up
        $ns duplex-link-op $n4 $n6 orient right     
        $ns duplex-link-op $n4 $n7 orient right-down     

        $ns duplex-link-op $n3 $n4 queuePos 0.5

Agent/TCP set nam_tracevar_ true         
Agent/TCP set maxcwnd_ 8

### TCP between n0 and n5 (Black)

#set sliding [new Agent/TCP/SlidingWindow]
set sliding [new Agent/TCP]
$sliding set fid_ 0
$ns attach-agent $n0 $sliding
        
#set sink [new Agent/TCPSink/SlidingWindowSink]
set sink [new Agent/TCPSink]
$ns attach-agent $n5 $sink

$ns connect $sliding $sink

set ftp [new Application/FTP]
$ftp attach-agent $sliding

$ns add-agent-trace $sliding tcp
$ns monitor-agent-trace $sliding
$sliding tracevar cwnd_

### CBR traffic between (n1 & n6) and (n2 & n7)

set cbr0 [new Agent/CBR]
$ns attach-agent $n1 $cbr0
$cbr0 set fid_ 1
$cbr0 set packetSize_ 500
$cbr0 set interval_ 0.01

set null0 [new Agent/CBR]
$ns attach-agent $n6 $null0

$ns connect $cbr0 $null0

set cbr1 [new Agent/CBR]
$ns attach-agent $n2 $cbr1
$cbr1 set fid_ 1
$cbr1 set packetSize_ 1000
$cbr1 set interval_ 0.01

set null1 [new Agent/CBR]
$ns attach-agent $n7 $null1

$ns connect $cbr1 $null1 

proc finish {} {

        global ns
        $ns flush-trace

#        puts "filtering..."
#        exec tclsh ../bin/namfilter.tcl C2-sliding-window.nam
        puts "running nam..."
        exec nam C2-sliding-window.nam &
        exit 0
}

### set operations
$ns at 0.05 "$cbr0 start"
$ns at 2.3 "$cbr0 stop" 
$ns at 0.1 "$cbr1 start"
$ns at 2.5 "$cbr1 stop"
$ns at 0.5 "$ftp start"
$ns at 2.5 "$ftp stop"
$ns at 2.7 "finish"

$ns at 0.50 "$cbr1 set interval_ 0.02"
$ns at 1.50 "$cbr0 set interval_ 0.02"
$ns at 1.70 "$cbr1 set interval_ 0.01"
$ns at 1.70 "$cbr1 set interval_ 0.01"


### add annotations
$ns at 0.0 "$ns trace-annotate \"Sliding Window (window size=8) in a heavely loaded network\"" 
$ns at 0.05 "$ns trace-annotate \"CBR-1 starts\""
$ns at 0.1 "$ns trace-annotate \"CBR-2 starts\""
$ns at 0.48 "$ns trace-annotate \"Sliding-Window Traffic starts\""

$ns at 0.51 "$ns trace-annotate \"Send Packet_0 to 7 \""
$ns at 0.54 "$ns trace-annotate \"Lost Packet (5 of them) \""
$ns at 0.66 "$ns trace-annotate \"3 Ack_0s\""
$ns at 0.75 "$ns trace-annotate \"Send Packet_8\""
$ns at 0.85 "$ns trace-annotate \"Ack_0\""
$ns at 0.95 "$ns trace-annotate \"Send Packet_1 to 8\""
$ns at 1.04 "$ns trace-annotate \"Ack_1 to 8\""
$ns at 1.14 "$ns trace-annotate \"Send Packet_9 to 16\""
$ns at 1.22 "$ns trace-annotate \"Lost Packet (2 of them) \""
$ns at 1.27 "$ns trace-annotate \"Ack_7 to 14 \""
$ns at 1.35 "$ns trace-annotate \"Send Packet_17 to 22\""
$ns at 1.49 "$ns trace-annotate \"6 Ack_14s  \""
$ns at 1.58 "$ns trace-annotate \"Send Packet_15 to 22\""
$ns at 1.70 "$ns trace-annotate \"Ack_15 to 22 \""
$ns at 1.78 "$ns trace-annotate \"Send Packet_23 to 30\""
$ns at 1.85 "$ns trace-annotate \"Lost Packet (2 of them) \""
$ns at 1.90 "$ns trace-annotate \"Ack_23 to 27 \""
$ns at 2.00 "$ns trace-annotate \"Send Packet_31 to 35\""
$ns at 2.08 "$ns trace-annotate \"Lost Packet (all of them) \""

$ns at 2.55 "$ns trace-annotate \"FTP stops\""

$ns run



