1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
|
#
# Copyright (c) Xerox Corporation 1997. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# Linking this file statically or dynamically with other modules is making
# a combined work based on this file. Thus, the terms and conditions of
# the GNU General Public License cover the whole combination.
#
# In addition, as a special exception, the copyright holders of this file
# give you permission to combine this file with free software programs or
# libraries that are released under the GNU LGPL and with code included in
# the standard release of ns-2 under the Apache 2.0 license or under
# otherwise-compatible licenses with advertising requirements (or modified
# versions of such code, with unchanged license). You may copy and
# distribute such a system following the terms of the GNU GPL for this
# file and the licenses of the other code concerned, provided that you
# include the source code of that other code when and as the GNU GPL
# requires distribution of source code.
#
# Note that people who make modified versions of this file are not
# obligated to grant this special exception for their modified versions;
# it is their choice whether to do so. The GNU General Public License
# gives permission to release a modified version without this exception;
# this exception also makes it possible to release a modified version
# which carries forward this exception.
#
# updated to use -multicast on by Lloyd Wood
proc uniform01 {} {
return [expr double(([ns-random] % 10000000) + 1) / 1e7]
}
proc uniform { a b } {
return [expr ($b - $a) * [uniform01] + $a]
}
proc exponential mean {
return [expr - $mean * log([uniform01])]
}
proc trunc_exponential lambda {
while 1 {
set u [exponential $lambda]
if { $u < [expr 4 * $lambda] } {
return $u
}
}
}
set packetSize 1000
set runtime 600
set scenario 0
set rlm_debug_flag 1
set seed 1
set rates "32e3 64e3 128e3 256e3 512e3 1024e3 2048e3"
#set rates "32e3 64e3 128e3 256e3"
set level [llength $rates]
set proto rlm
set run_nam 0
#XXX
Queue/DropTail set limit_ 15
Simulator instproc create-agent { node type pktClass } {
$self instvar Agents PortID
set agent [new $type]
$agent set fid_ $pktClass
$self attach-agent $node $agent
$agent proc get var {
return [$self set $var]
}
return $agent
}
Simulator instproc cbr_flow { node fid addr bw } {
global packetSize
set agent [$self create-agent $node Agent/UDP $fid]
set cbr [new Application/Traffic/CBR]
$cbr attach-agent $agent
#XXX abstraction violation
$agent set dst_addr_ $addr
$agent set dst_port_ 0
$cbr set packetSize_ $packetSize
$cbr set interval_ [expr $packetSize * 8. / $bw]
$cbr set random_ 1
return $cbr
}
Simulator instproc build_source_set { mmgName rates addrs baseClass node when } {
global src_mmg src_rate
set n [llength $rates]
for {set i 0} {$i<$n} {incr i} {
set r [lindex $rates $i]
set addr [expr [lindex $addrs $i]]
set src_rate($addr) $r
set k $mmgName:$i
set src_mmg($k) [$self cbr_flow $node $baseClass $addr $r]
$self at $when "$src_mmg($k) start"
incr baseClass
}
}
Simulator instproc finish {} {
#XXX
global rcvrMMG proto scenario lossTraceFile debugfile run_nam
puts finish
#XXX
#flush_all_trace
if [info exists plots] {
close $plots
}
#XXX
if [info exists lossTraceFile] {
close $lossTraceFile
}
if [info exists debugfile] {
close $debugfile
}
if [info exists rcvrMMG] {
set br [expr [total_bits $rcvrMMG] / 8.]
set bd [total_bytes_delivered $rcvrMMG]
puts "loss-frac [expr 1024. * [node_loss $rcvrMMG] / $bd] \
goodput [expr $bd / [optimal_bytes]]"
}
if {$run_nam} {
puts "running nam..."
exec nam -g 600x700 -f dynamic-nam.conf out.nam &
}
exit 0
}
Simulator instproc tick {} {
puts stderr [$self now]
$self at [expr [$self now] + 30.] "$self tick"
}
Class Topology
Topology instproc init { simulator } {
$self instvar ns id
set ns $simulator
set id 0
}
Topology instproc mknode nn {
$self instvar node ns
if ![info exists node($nn)] {
set node($nn) [$ns node]
}
}
#
# build a link between nodes $a and $b
# if either node doesn't exist, create it as a side effect.
# (we don't build any sources)
#
Topology instproc build_link { a b delay bw } {
global buffers packetSize
if { $a == $b } {
puts stderr "link from $a to $b?"
exit 1
}
$self instvar node ns
$self mknode $a
$self mknode $b
$ns duplex-link $node($a) $node($b) $bw $delay DropTail
}
#
# build a new source (by allocating a new address) and
# place it at node $nn. start it up at random time
#
Topology instproc place_source { nn when } {
#XXX
global rates
$self instvar node ns id addrs caddrs
incr id
set caddrs($id) [Node allocaddr]
set addrs($id) {}
foreach r $rates {
lappend addrs($id) [Node allocaddr]
}
$ns build_source_set s$id $rates $addrs($id) 1 $node($nn) $when
return $id
}
Topology instproc place_receiver { nn id when } {
$self instvar ns
$ns at $when "$self build_receiver $nn $id"
}
#
# build a new receiver for source $id and
# place it at node $nn.
#
Topology instproc build_receiver { nn id } {
$self instvar node ns addrs caddrs
set rcvr [new MMG/ns $ns $node($nn) $caddrs($id) $addrs($id)]
global rlm_debug_flag
$rcvr set debug_ $rlm_debug_flag
}
Class Scenario0 -superclass Topology
Scenario0 instproc init args {
#Create the following topology
# _____ R1
# /100kb
# 1000kb/
# S------N1-------N2------R2
# 1000kb \ 250kb
# \
# 1000kb \
# \N3____R3
# 50kb
#
eval $self next $args
$self instvar ns node
$self build_link 0 1 200ms 1000e3
$self build_link 1 2 200ms 100e3
$self build_link 1 3 200ms 1000e3
$self build_link 3 4 200ms 250e3
$self build_link 3 5 200ms 1000e3
$self build_link 5 6 200ms 50e3
$ns duplex-link-op $node(0) $node(1) orient right
$ns duplex-link-op $node(1) $node(2) orient right
$ns duplex-link-op $node(1) $node(3) orient right-down
$ns duplex-link-op $node(3) $node(4) orient right
$ns duplex-link-op $node(3) $node(5) orient right-down
$ns duplex-link-op $node(5) $node(6) orient right
$ns duplex-link-op $node(0) $node(1) queuePos 0.5
$ns duplex-link-op $node(1) $node(2) queuePos 0.5
$ns duplex-link-op $node(1) $node(3) queuePos 0.5
$ns duplex-link-op $node(3) $node(4) queuePos 0.5
$ns duplex-link-op $node(3) $node(5) queuePos 0.5
$ns duplex-link-op $node(5) $node(6) queuePos 0.5
set time [expr double([ns-random] % 10000000) / 1e7 * 60]
set addr [$self place_source 0 $time]
$self place_receiver 2 $addr $time
$self place_receiver 4 $addr $time
$self place_receiver 6 $addr $time
#mcast set up
DM set PruneTimeout 1000
set mproto DM
set mrthandle [$ns mrtproto $mproto {} ]
}
Class Scenario1 -superclass Topology
Scenario1 instproc init args {
eval $self next $args
$self instvar ns node
$self build_link 0 1 200ms 100e3
$ns duplex-link-op $node(0) $node(1) orient right
$ns duplex-link-op $node(0) $node(1) queuePos 0.5
set time [expr double([ns-random] % 10000000) / 1e7 * 60]
set id [$self place_source 0 $time]
$self place_receiver 1 $id $time
#mcast set up
DM set PruneTimeout 1000
set mproto DM
set mrthandle [$ns mrtproto $mproto {} ]
}
foreach a $argv {
set L [split $a =]
if {[llength $L] != 2} { continue }
set var [lindex $L 0]
set val [lindex $L 1]
set $var $val
}
#Clean up rectFile
#rlm_init $rectFile $level $runtime
set ns [new Simulator -multicast on]
#XXXX
proc ns-now {} "return \[$ns now]"
$ns color 1 blue
$ns color 2 green
$ns color 3 red
$ns color 4 white
# prunes, grafts
$ns color 30 orange
$ns color 31 yellow
$ns trace-all [open out.tr w]
$ns namtrace-all [open out.nam w]
set scn [new Scenario$scenario $ns]
$ns at [expr $runtime +1] "$ns finish"
$ns run
|