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
|
#!/bin/sh
# the next line finds ns \
nshome=`dirname $0`; [ ! -x $nshome/ns ] && [ -x ../../ns ] && nshome=../..
# the next line starts ns \
export nshome; exec $nshome/ns "$0" "$@"
if [info exists env(nshome)] {
set nshome $env(nshome)
} elseif [file executable ../../ns] {
set nshome ../..
} elseif {[file executable ./ns] || [file executable ./ns.exe]} {
set nshome "[pwd]"
} else {
puts "$argv0 cannot find ns directory"
exit 1
}
set env(PATH) "$nshome/bin:$env(PATH)"
set opt(tr) out
set opt(namtr) ""
set opt(seed) 0
set opt(stop) 20
set opt(node) 3
set opt(qsize) 100
set opt(bw) 2Mb
set opt(delay) 1ms
set opt(ll) LL
set opt(ifq) Queue/DropTail
set opt(mac) Mac/Csma/Ca
set opt(chan) Channel
set opt(tcp) TCP/Reno
set opt(sink) TCPSink
set opt(app) FTP
proc Usage {} {
global opt argv0
puts "Usage: $argv0 \[-stop sec\] \[-seed value\] \[-node numNodes\]"
puts "\t\[-tr tracefile\] \[-g\]"
puts "\t\[-ll lltype\] \[-ifq qtype\] \[-mac mactype\]"
puts "\t\[-bw $opt(bw)] \[-delay $opt(delay)\]"
exit 1
}
proc Getopt {} {
global opt argc argv
if {$argc == 0} Usage
for {set i 0} {$i < $argc} {incr i} {
set key [lindex $argv $i]
if ![string match {-*} $key] continue
set key [string range $key 1 end]
set val [lindex $argv [incr i]]
set opt($key) $val
if [string match {-[A-z]*} $val] {
incr i -1
continue
}
switch $key {
ll { set opt($key) LL/$val }
ifq { set opt($key) Queue/$val }
mac { set opt($key) Mac/$val }
}
}
}
proc finish {} {
global env nshome pwd
global ns opt trfd
$ns flush-trace
close $trfd
foreach key {node bw delay ll ifq mac seed} {
lappend comment $opt($key)
}
set force ""
if {[info exists opt(f)] || [info exists opt(g)]} {
set force "-f"
}
exec perl $nshome/bin/trsplit -tt r -pt tcp -c '$comment' \
$force $opt(tr) >& $opt(tr)-bw
exec head -n 1 $opt(tr)-bw >@ stdout
if [info exists opt(g)] {
catch "exec xgraph -nl -M -display $env(DISPLAY) \
[lsort [glob $opt(tr).*]] &"
}
exit 0
}
proc create-trace {} {
global ns opt
if [file exists $opt(tr)] {
catch "exec rm -f $opt(tr) $opt(tr)-bw [glob $opt(tr).*]"
}
set trfd [open $opt(tr) w]
$ns trace-all $trfd
if {$opt(namtr) != ""} {
$ns namtrace-all [open $opt(namtr) w]
}
return $trfd
}
proc create-topology {} {
global ns opt
global lan node source
set num $opt(node)
for {set i 0} {$i <= $num} {incr i} {
set node($i) [$ns node]
lappend nodelist $node($i)
}
set lan [$ns newLan $nodelist $opt(bw) $opt(delay) \
-llType $opt(ll) -ifqType $opt(ifq) \
-macType $opt(mac) -chanType $opt(chan)]
}
proc create-source {} {
global ns opt
global lan node source
set num $opt(node)
for {set i 1} {$i <= $num} {incr i} {
set src 0
set dst $i
set tp($i) [$ns create-connection $opt(tcp) \
$node($src) $opt(sink) $node($dst) 0]
set source($i) [$tp($i) attach-app $opt(app)]
$ns at [expr $i/1000.0] "$source($i) start"
}
}
## MAIN ##
Getopt
if {$opt(seed) >= 0} { ns-random $opt(seed) }
if [info exists opt(qsize)] { Queue set limit_ $opt(qsize) }
set ns [new Simulator]
set trfd [create-trace]
create-topology
create-source
$lan trace $ns $trfd
$ns at $opt(stop) "finish"
$ns run
|