File: redlight.tcl

package info (click to toggle)
ns2 2.35%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 78,796 kB
  • sloc: cpp: 172,923; tcl: 107,130; perl: 6,391; sh: 6,143; ansic: 5,846; makefile: 816; awk: 525; csh: 355
file content (261 lines) | stat: -rw-r--r-- 6,130 bytes parent folder | download | duplicates (8)
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
#set stopTime 120
set stopTime 10
set ns [new Simulator]

if {[llength $argv] > 0} {
	set num_ftps [lindex $argv 0]
} else {
	set num_ftps 1
}
#set num_ftps [lindex $argv 0]


if {[llength $argv] > 1} {
	set num_webs [lindex $argv 1]
} else {
	set num_webs 0
}
if {[llength $argv] > 2} {
	set bottleneck [lindex $argv 2]
} else {
	set bottleneck 1.5Mb
}


#set random_seed  [lindex $argv 3]
set random_seed 0
set rtt 100ms

# ------- config info is all above this line ----------

set rtt [$ns delay_parse $rtt]
set bw [$ns bw_parse $bottleneck]
if {$bw <= 128000} {
	set psize 552
} else {
	set psize 1500
}
set bdp [expr round($bw*$rtt/(8*$psize))]
if {$bdp < 5} {
	set bdp 5
}

# allow lots of nodes (more than 128)
#$ns set-address-format expanded

Trace set show_tcphdr_ 1
set startTime 0.0

#TCP parameters

Agent/TCP set window_ [expr $bdp*4]
set win_size 1
Agent/TCP set windowInit_ $win_size
set segsize [expr $psize-40]
set segperack 2
set delack 0.4

set lastsample 0
set client_addr 0
set no_of_inlines 3
#set filesize [expr $stopTime*$bw/8/2]
set filesize 10000000000


#buffersizes
set buffersize [expr $bdp*2]
set buffersize1 [expr $bdp*2]

#thresholds

set minthresh [expr round(0.3*$bdp)]
set maxthresh [expr round($minthresh + 1.0*$bdp)]

set sampling_interval [expr $psize*8/$bw]
# set sampling_interval 0.007

set si_per_rtt [expr $rtt/$sampling_interval]
for {set ptwo 2} {$ptwo < $si_per_rtt} {set ptwo [expr $ptwo*2]} { }
set QWT [expr 1./$ptwo]


puts "minthresh $minthresh  maxthresh $maxthresh  QWT $QWT  sample $sampling_interval"

#set Flow_id 1
ns-random $random_seed;
puts $random_seed;
#ns-random 0

proc build_topology { ns which } {
	global bw rtt bdp buffersize buffersize1 maxthresh minthresh QWT \
	       sampling_interval

	# congested link
	global n0 n1
	set n0 [$ns node]
	set n1 [$ns node]
	set bdelay [expr $rtt/2. - [$ns delay_parse 25ms]]
        # $ns duplex-link $n0 $n1 $bw $bdelay RED/New
        $ns duplex-link $n0 $n1 $bw $bdelay RED
	$ns duplex-link-op $n0 $n1 orient right
	$ns duplex-link-op $n1 $n0 queuePos 0.5
	$ns queue-limit $n0 $n1 $buffersize
	$ns queue-limit $n1 $n0 $buffersize

	set li_10 [[$ns link $n1 $n0] queue]
	$li_10 set maxthresh_ $maxthresh
	$li_10 set thresh_ $minthresh
	$li_10 set q_weight_ $QWT

#	$li_10 sampling_interval $sampling_interval
#	$li_10 cancel_thresh 0
#	$li_10 drop_interval $buffersize

	# $li_10 set queue-in-bytes_ true
	# $li_10 set bytes_ true
	# $li_10 set mean_pktsize_ 1500

	set li_01 [[$ns link $n0 $n1] queue]
	$li_01 set maxthresh_ $maxthresh
	$li_01 set thresh_ $minthresh
	$li_01 set q_weight_ $QWT
	# $li_01 set queue-in-bytes_ true
	# $li_01 set bytes_ true
	# $li_01 set mean_pktsize_ 1500

	global num_ftps num_webs
	set n [expr $num_ftps+$num_webs]
	for {set k 1} {$k <= $n} {incr k 1} {
	    # clients
	    set j [expr ($k+1)]
	    set dly [expr ($k)]
	    set dly 1
	    global n$j
	    set n$j [$ns node]
	    set linkbw [expr $bw*10]
	    $ns duplex-link [set n$j] $n0 $linkbw ${dly}ms DropTail
	    $ns queue-limit [set n$j] $n0 $buffersize1
	    $ns queue-limit $n0 [set n$j] $buffersize1
	    set angle [expr $n>1? 0.75+($k-1)*.5/($n-1) : 1]
	    $ns duplex-link-op $n0 [set n$j] orient $angle
	    # servers
	    set j [expr $k+$n+1]
	    global n$j
	    set n$j [$ns node]
	    $ns duplex-link $n1 [set n$j] $linkbw  25ms  DropTail
	    $ns queue-limit $n1 [set n$j] $buffersize1
	    $ns queue-limit [set n$j] $n1 $buffersize1
	    set angle [expr $n>1? fmod(2.25-($k-1)*.5/($n-1), 2) : 0]
	    $ns duplex-link-op $n1 [set n$j] orient $angle
	}
}


proc build_ftpclient {cnd snd sftp startTime timeToStop Flow_id} {
    
    global ns
    global stopTime
    set cli [get_ftpclient]
    set ctcp [get_fulltcp]
    $ctcp attach-application $cli
    #set cli [$ctcp attach-app FTP]
    $ctcp set fid_ $Flow_id
    $cli tcp $ctcp
    $ns attach-agent $cnd $ctcp

    set stcp [get_fulltcp]
    $stcp attach-application $sftp
    $stcp set fid_ $Flow_id
    $ns attach-agent $snd $stcp

    $ns connect $ctcp $stcp
    #$ctcp set dst_ [$stcp set addr_]
    $stcp listen
    $ns at $startTime "$cli start"
    $ns at $timeToStop "$cli stop"
    global ftplist
    global ftplist
    set ftplist($ctcp) $stcp
    return $cli
}




proc get_ftpclient {} {
    global client_addr
    set cli [new Agent/BayTcpApp/FtpClient]
    #set cli [new Agent/TcpApp/FtpClient]
    $cli set addr_ [incr client_addr]
    return $cli
}


proc get_fulltcp {} {
    global segperack segsize delack
    set atcp [new Agent/TCP/BayFullTcp]
    #set atcp [new Agent/TCP/FullTcp]
    $atcp set segsperack_ $segperack
    $atcp set segsize_ $segsize
    $atcp set interval_ $delack
    return $atcp
}
    

proc uniform {a b} {
	expr $a + (($b- $a) * ([ns-random]*1.0/0x7fffffff))
}

proc finish {} {
        global ns PERL
	$ns halt
        $ns flush-trace
    set wrap [expr 90 * 1000 + 40]
    set file BayFullTCP
    exec $PERL ../../bin/set_flow_id -s bay-out.tr | \
	    $PERL ../../bin/getrc -e -s 1 -d 0 | \
	    $PERL ../../bin/raw2xg -v -s 0.01 -m $wrap -t $file > temp.rands
    exec xgraph -bb -tk -nl -m -x time -y packets temp.rands &
        exit 0
}
$ns trace-all [open bay-out.tr w]
$ns namtrace-all [open bay-out.nam w]
$ns color 2 blue
$ns color 3 red
$ns color 4 yellow
$ns color 5 green

#build_topology $ns RED/New
build_topology $ns RED

set fname f${num_ftps}w${num_webs}b${bottleneck}.tr
#set fname /dev/fd/1
$ns trace-queue $n1 $n0 [open $fname w]

set nn [expr $num_ftps+$num_webs]
for {set k 1} {$k <= $num_ftps} {incr k 1} {
    set j [expr $k+1]
    set i [expr $j+$nn]
    set sftp [new Agent/BayTcpApp/FtpServer]
    #set sftp [new Agent/TcpApp/FtpServer]
    $sftp file_size $filesize
    build_ftpclient [set n$j] [set n$i]  $sftp \
    		[expr ($k-1)*[uniform 0.0 2.0]] 225 $j
}


$ns at [expr $stopTime ] "finish"
$ns run
exit 0