## TCP-Fusion ns-2 simulation script
#  written by Kazumi Kaneko
#
#  Copyright (c) 2007, Katto Lab., Waseda University.
#  All rights reserved.
##

### Default Values

set wnd_option_ 0
set buffer 0
set psize 1460
set lrate 0


### Read command line arguments
if {$argc > 1} {
    set wnd_option_  [lindex $argv 0]
    set lrate  [lindex $argv 1]  
} else {
    puts "usage: ns fusion-ex.tcl <wnd_option> <error rate>"
    puts " "
    puts "<wnd_option>: 0->Fusion 1->ARENO 2->Compound"
   
    exit 1
}

set ns [new Simulator]


set tr_f        [open "| awk -f th.awk >th-wnd_option_$wnd_option_.tr" w]
set nam_f       [open out.nam w]
set record_f    [open Fusion.data w]
set record_g    [open Reno.data w]

$ns trace-all $tr_f
#$ns namtrace-all $nam_f

### Finish proc
proc finish {} {
     global ns tr_f record_f nam_f record_g
     $ns flush-trace
     close $tr_f
     close $record_f
     close $nam_f
     close $record_g
	
     exit 0
}


# Network topology:
#                                  
#                                  
#   1000Mb,1ms      200Mb,22 ms        1000Mb,1ms
#  n0 -------- n1 ------------- n2 --------- n3 TCP-Sink
# TCP Source         30 buffer     
#                                 
#                                  
# backlogged FTP sources with 1400 bytes packet size

set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
set n4 [$ns node]
set n5 [$ns node]

#   object      from  to  bandwith   delay    queue    
$ns duplex-link $n0  $n1   1000Mb      1ms   DropTail
$ns duplex-link $n2  $n3   1000Mb      1ms   DropTail
$ns duplex-link $n4  $n1   1000Mb      1ms   DropTail
$ns duplex-link $n2  $n5   1000Mb      1ms   DropTail
$ns duplex-link $n1  $n2    200Mb     22ms   DropTail

#### BOTTLENECK BUFFER
# buffer = BDP/2
$ns queue-limit $n1 $n2 400


#### BOTTLENECK LINK ERRORS
# Add bottleneck link errors 
set lossy_link 0
if {$lrate > 0} { set lossy_link 1 }

if { $lossy_link == 1} {
	set loss_module [new ErrorModel]
	$loss_module unit pkt
	$loss_module set rate_ $lrate
	$loss_module ranvar [new RandomVariable/Uniform]
	$loss_module drop-target [new Agent/Null]

	$ns lossmodel $loss_module $n1 $n2
	puts ">>>ErrorModel: lossy_link: $lossy_link - rate: $lrate"
}

#### TCP AGENT    
set tcp [new Agent/TCP/Fusion]
$tcp set fid_ 1
$tcp set window_ 100000
$tcp set maxcwnd_ 200000
$tcp set packetSize_ $psize
$tcp set windowOption_ $wnd_option_
$ns attach-agent $n0 $tcp

set sink [new Agent/TCPSink/Sack1]
$ns attach-agent $n3 $sink

$ns connect $tcp $sink

set ftp [new Application/FTP]
$ftp attach-agent $tcp

set tcp1 [$ns create-connection TCP/Sack1 $n4 TCPSink/Sack1 $n5 2]
$tcp1 set window_ 10000
$tcp1 set maxcwnd_ 20000
$tcp1 set packetSize_ $psize
set ftp1 [$tcp1 attach-app FTP]


### Record proc
proc record {} {
    global ns tcp  tcp1 sink record_f  record_g
    set now [$ns now]
    
    set time 0.15
    
    set Fusion_cwnd     [$tcp set cwnd_]
    set Fusion_ssthresh [$tcp set ssthresh_]
    set Reno_cwnd    [$tcp1 set cwnd_]
    set Reno_ssthresh [$tcp1 set ssthresh_]
   # set rtt [expr [$tcp set rtt_]*[$tcp set tcpTick_]]
   # set rtt1 [expr [$tcp1 set rtt_]*[$tcp1 set tcpTick_]]
  
    puts $record_f "$now [expr $Fusion_cwnd*1]  $Fusion_ssthresh "
    puts $record_g "$now [expr $Reno_cwnd*1] $Reno_ssthresh"
    
    $ns at [expr $now+$time] "record "   
}

$ns at 0.0 "record"
$ns at 0.0 "$ftp start"
#$ns at 0.0 "$ftp1 start"
$ns at 200.0 "finish"

$ns run

