NORM-mirror/ns/normcc.tcl

254 lines
6.8 KiB
Tcl

# This script exercises NORM-CC versus TCP flows over
# a single bottleneck topology. There is one NORM flow
# and possibly multiple TCP flows. The number of receivers
# in the NORM "group" can vary (default gsize:10)
proc normcc {optionList} {
# normcc usage
set usage {Usage: ns normcc.tcl [brate <bottleneckRate>][tcp <numTcp>][gsize <count>]}
append usage {[rate <sendRate>][duration <sec>][backoff <k>][trace]}
#Some default parameters for NORM
set groupSize "10"
set backoffFactor "4.0"
set sendRate "32kb"
set bottleneckRate "1Mb"
set duration "240.0"
set nsTracing 1
set numTcp 1
set queueType "DropTail"
set queueSize 100
#Parse optionList for parameters
set state flag
foreach option $optionList {
switch -- $state {
"flag" {
switch -glob -- $option {
"gsize" {set state "gsize"}
"rate" {set state "rate"}
"brate" {set state "brate"}
"backoff" {set state "backoff"}
"duration" {set state "duration"}
"tcp" {set state "tcp"}
"red" {set queueType "RED"}
"trace" {set nsTracing 1}
default {
puts "normcc: Bad option $option"
puts "$usage"
exit
}
}
}
"gsize" {
set groupSize $option
set state "flag"
}
"backoff" {
set backoffFactor $option
set state "flag"
}
"brate" {
set bottleneckRate $option
set state "flag"
}
"rate" {
set sendRate $option
set state "flag"
}
"duration" {
set duration $option
set state "flag"
}
"tcp" {
set numTcp $option
set state "flag"
}
default {
error "normcc: Bad option parse state!"
}
}
}
# 1) An ns-2 simulator instance is created an configured
# for multicast operation with a dense mode (DM) multicast
# routing protocol:
set ns_ [new Simulator -multicast on]
$ns_ multicast
# 2) Trace files are opened and ns and nam
# tracing is enabled:
if {$nsTracing} {
set f [open normcc.tr w]
$ns_ trace-all $f
set nf [open normcc.nam w]
$ns_ namtrace-all $nf
} else {
set f 0
set nf 0
}
# 3) Create a single bottleneck
# Link 0 <-> 1 is our bottleneck
set n(0) [$ns_ node]
set n(1) [$ns_ node]
puts "normcc: Creating bottleneck link ..."
$ns_ duplex-link $n(0) $n(1) $bottleneckRate 10ms $queueType
$ns_ queue-limit $n(0) $n(1) $queueSize
$ns_ duplex-link-op $n(0) $n(1) queuePos 0.5
if {"RED" == $queueType} {
set redq [[$ns_ link $n(0) $n(1)] queue]
$redq set thresh_ [expr int($queueSize/10 + 0.9)]
$redq set maxthresh_ [expr int($queueSize/2 +0.9)]
$redq set linterm_ 10
}
# Non-bottleneck link rate is 10 * bottleneckRate
set linkRate [expr 10 * [bw_parse $bottleneckRate]]
# 4) Create a single NORM server and link to bottleneck
puts "normcc: Creating NORM server ..."
set n(2) [$ns_ node]
set norm_server [new Agent/NORM]
$ns_ attach-agent $n(2) $norm_server
# Link from NORM server to bottleneck
$ns_ duplex-link $n(2) $n(0) $linkRate 1ms DropTail
$ns_ queue-limit $n(2) $n(0) 100
$ns_ duplex-link-op $n(2) $n(0) queuePos 0.5
# 5) Create nodes with TCP sources and links to bottleneck
if {$numTcp > 0} {
puts "normcc: Creating TCP sources ..."
}
for {set i 0} {$i < $numTcp} {incr i} {
set k [expr $i + 3]
set n($k) [$ns_ node]
set tcp_src($i) [new Agent/TCP/FullTcp]
$ns_ attach-agent $n($k) $tcp_src($i)
$tcp_src($i) set window_ 100
$tcp_src($i) set packetSize_ 512
# Links from TCP sources to bottleneck
$ns_ duplex-link $n($k) $n(0) $linkRate 1ms DropTail
$ns_ queue-limit $n($k) $n(0) 100
$ns_ duplex-link-op $n($k) $n(0) queuePos 0.5
# Attach FTP app to tcp sources
set ftp($i) [new Application/FTP]
$ftp($i) attach-agent $tcp_src($i)
}
# 6) Create nodes with NORM clients and links to bottleneck
puts "normcc: Creating NORM clients ..."
for {set i 0} {$i < $groupSize} {incr i} {
set k [expr $i + 3 + $numTcp]
set n($k) [$ns_ node]
set norm_client($i) [new Agent/NORM]
$ns_ attach-agent $n($k) $norm_client($i)
# Links from bottleneck to NORM clients
$ns_ duplex-link $n(1) $n($k) $linkRate 1ms DropTail
$ns_ queue-limit $n(1) $n($k) 100
$ns_ duplex-link-op $n(1) $n($k) queuePos 0.5
}
# 7) Create nodes with TCP sinks and links to bottleneck
puts "normcc: Creating TCP sinks..."
for {set i 0} {$i < $numTcp} {incr i} {
set k [expr $i + 4 + $numTcp + $groupSize]
set n($k) [$ns_ node]
set tcp_sink($i) [new Agent/TCP/FullTcp]
$ns_ attach-agent $n($k) $tcp_sink($i)
# Links from bottleneck to TCP sinks
$ns_ duplex-link $n(1) $n($k) $linkRate 1ms DropTail
$ns_ queue-limit $n(1) $n($k) 100
$ns_ duplex-link-op $n(1) $n($k) queuePos 0.5
# Connect tcp sources->sinks
$ns_ connect $tcp_src($i) $tcp_sink($i)
$tcp_sink($i) listen
}
# 8) Configure multicast routing for topology
set mproto DM
set mrthandle [$ns_ mrtproto $mproto {}]
if {$mrthandle != ""} {
$mrthandle set_c_rp [list $n(1)]
}
# 9) Allocate a multicast address to use
set group [Node allocaddr]
puts "normcc: Configuring NORM agents ..."
# 10) Configure global NORM agent commands (using norm_server)
$norm_server debug 2
#$norm_server log normLog.txt
# 11) Configure NORM server parameters
$norm_server address $group/5000
$norm_server rate [bw_parse $sendRate]
$norm_server cc on
$norm_server backoff $backoffFactor
$norm_server segment 532
$norm_server block 64
$norm_server parity 32
$norm_server repeat -1
$norm_server interval 0.0
$norm_server txloss 0.0
$norm_server gsize $groupSize
#$norm_server trace
# 12) Configure NORM client parameters
for {set i 0} {$i < $groupSize} {incr i} {
$norm_client($i) address $group/5000
$norm_client($i) backoff $backoffFactor
$norm_client($i) rxbuffer 1000000
$norm_client($i) txloss 0.0
$norm_client($i) gsize $groupSize
#$norm_client($i) trace
}
# 13) Start NORM server and clients
$ns_ at 0.0 "$norm_server start server"
for {set i 0} {$i < $groupSize} {incr i} {
$ns_ at 0.0 "$norm_client($i) start client"
}
$ns_ at 0.0 "$norm_server sendStream 1000000"
# 14) Start tcp flows
for {set i 0} {$i < $numTcp} {incr i} {
$ns_ at 0.0 "$ftp($i) start"
}
# 15) Schedule finish time
$ns_ at $duration "finish $ns_ $f $nf $nsTracing"
puts "normcc: Running simulation (tcp:$numTcp gsize:$groupSize rate:$sendRate backoff $backoffFactor duration:$duration) ..."
$ns_ run
}
proc finish {ns_ f nf nsTracing} {
puts "normcc: Done."
$ns_ flush-trace
if {$nsTracing} {
close $f
close $nf
}
$ns_ halt
delete $ns_
}
# Run a set of trials with optional command-line parameters
puts "Running normcc: $argv"
normcc $argv