File: web.tcl

package info (click to toggle)
ns2 2.35%2Bdfsg-9
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 79,396 kB
  • sloc: cpp: 172,923; tcl: 107,167; perl: 6,391; sh: 6,143; ansic: 5,846; makefile: 829; awk: 525; csh: 355
file content (232 lines) | stat: -rw-r--r-- 6,242 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
source ../../../ex/asym/util.tcl

set WebCScount 0

Class WebCS

proc createTransfer {ns src dst tcpargs tcptrace sinkargs session sessionargs doneargs xfersz} {
	set tcp [eval createTcpSource $tcpargs]
	$tcp proc done {} " $doneargs"
	if {$xfersz < 1} {
		$tcp set packetSize_ [expr int($xfersz*1000)]
	}
	set sink [eval createTcpSink $sinkargs]
	set ftp [createFtp $ns $src $tcp $dst $sink]
	if {$session} {
		set newSessionFlag false
		set newSessionFlag [eval setupTcpSession $tcp $sessionargs]
		setupTcpTracing $tcp $tcptrace $newSessionFlag
	}
	setupTcpTracing $tcp $tcptrace $session
	return $ftp
}

proc numberOfImages {} {
	global numimg

	return $numimg
}

proc htmlRequestSize {} {
	global reqsize

	return $reqsize
}

proc htmlReplySize {} {
	global htmlsize

	return $htmlsize
}

proc imageRequestSize {} {
	global reqsize

	return $reqsize
}

proc imageResponseSize {} {
	global imgsize

	return $imgsize
}

WebCS instproc init {ns client server tcpargs tcptrace sinkargs {phttp 0} {httpseq 0} {session false} {sessionargs ""}} {
	$self instvar ns_ 
	$self instvar ftpCS1_ ftpCS2_ 
	$self instvar ftpSC1_ ftpSC2_
	$self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
	$self instvar numImgRecd_ numImgRepl_
	$self instvar numImgReq_
	$self instvar starttime_ endtime_
	$self instvar phttp_ httpseq_ session_
	$self instvar finish_
	global WebCScount

	incr WebCScount
	set ns_ $ns
	set phttp_ $phttp
	set httpseq_ $httpseq
	set session_ $session
	# compute transfer sizes
	set numImg_ [numberOfImages]
	set htmlReqsz_ [htmlRequestSize]
	set htmlReplsz_ [htmlReplySize]
	set imgReqsz_ [imageRequestSize]
	set imgReplsz_ [imageResponseSize]

	# create "ftp's" for each transfer
	set ftpCS1_ [createTransfer $ns $client $server "TCP/Newreno" $tcptrace $sinkargs $session $sessionargs "$self htmlReqDone" $htmlReqsz_]
	set ftpSC1_ [createTransfer $ns $server $client $tcpargs $tcptrace $sinkargs $session $sessionargs "$self htmlReplDone" $htmlReplsz_]
	# XXX assume request to be of fixed size regardless of numImg_
	# unless HTTP with sequential connections is being employed
	if {$httpseq} {
		set numImgReq_ $numImg_
		for {set i 0} {$i < $numImg_} {incr i 1} {
			set ftpCS2_($i) [createTransfer $ns $client $server "TCP/Newreno" $tcptrace $sinkargs $session $sessionargs "$self imgReqDone" $imgReqsz_]
		}
	} else {
		set numImgReq_ 1
		set ftpCS2_(0) $ftpCS1_
	}
	for {set i 0} {$i < $numImg_} {incr i 1} {
		if {$phttp} {
			set ftpSC2_($i) $ftpSC1_
#			if {$i == 0} {
#				set ftpSC2_($i) [createTransfer $ns $server $client $tcpargs $tcptrace $sinkargs $session $sessionargs "$self imgReplDone" $imgReplsz_]
#			} else {
#				set ftpSC2_($i) $ftpSC2_(0)
#			}
		} else {
			set ftpSC2_($i) [createTransfer $ns $server $client $tcpargs $tcptrace $sinkargs $session $sessionargs "$self imgReplDone" $imgReplsz_]
		}
	}
}

WebCS instproc start {} {
	$self instvar ns_ 
	$self instvar ftpCS1_ ftpCS2_ 
	$self instvar ftpSC1_ ftpSC2_
	$self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
	$self instvar numImgRecd_ numImgRepl_
	$self instvar numImgReq_
	$self instvar starttime_ endtime_
	$self instvar phttp_ httpseq_ session_

	set starttime_ [$ns_ now]
	set numImgRecd_ 0
	set numImgRepl_ 0
	if {$htmlReqsz_ < 1} {
		$ftpCS1_ producemore 1
	} else {
		$ftpCS1_ producemore $htmlReqsz_
	}
}

WebCS instproc htmlReqDone {} {
	$self instvar ns_ 
	$self instvar ftpCS1_ ftpCS2_ 
	$self instvar ftpSC1_ ftpSC2_
	$self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
	$self instvar numImgRecd_ numImgRepl_
	$self instvar numImgReq_
	$self instvar starttime_ endtime_
	$self instvar phttp_ httpseq_ session_

	$ftpSC1_ producemore $htmlReplsz_
}

WebCS instproc htmlReplDone {} {
	$self instvar ns_ 
	$self instvar ftpCS1_ ftpCS2_ 
	$self instvar ftpSC1_ ftpSC2_
	$self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
	$self instvar numImgRecd_ numImgRepl_
	$self instvar numImgReq_
	$self instvar starttime_ endtime_
	$self instvar phttp_ httpseq_ session_

	[$ftpCS1_ agent] proc done {} "$self imgReqDone"
	[$ftpSC1_ agent] proc done {} "$self imgReplDone"
	if {$imgReqsz_ < 1} {
		$ftpCS2_($numImgRecd_) producemore 1
	} else {
		$ftpCS2_($numImgRecd_) producemore $imgReqsz_
	}
}

WebCS instproc imgReqDone {} {
	$self instvar ns_ 
	$self instvar ftpCS1_ ftpCS2_ 
	$self instvar ftpSC1_ ftpSC2_
	$self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
	$self instvar numImgRecd_ numImgRepl_
	$self instvar numImgReq_
	$self instvar starttime_ endtime_
	$self instvar phttp_ httpseq_ session_

	if {$httpseq_} {
		$ftpSC2_($numImgRepl_) producemore $imgReplsz_
		incr numImgRepl_
	} else {
		for {} {$numImgRepl_ < $numImg_} {incr numImgRepl_ 1} {
			
			$ftpSC2_($numImgRepl_) producemore $imgReplsz_
		}
	}
}
	
	
WebCS instproc imgReplDone {} {
	$self instvar ns_ 
	$self instvar ftpCS1_ ftpCS2_ 
	$self instvar ftpSC1_ ftpSC2_
	$self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
	$self instvar numImgRecd_ numImgRepl_
	$self instvar numImgReq_
	$self instvar starttime_ endtime_
	$self instvar phttp_ httpseq_ session_

	incr numImgRecd_
	if {($numImgRecd_ == $numImg_) || $phttp_} {
		$self end
	} elseif {$httpseq_} {
		$self htmlReplDone
	}
}

WebCS instproc end {} {
	$self instvar ns_ 
	$self instvar ftpCS1_ ftpCS2_ 
	$self instvar ftpSC1_ ftpSC2_
	$self instvar numImg_ htmlReqsz_ htmlReplsz_ imgReqsz_ imgReplsz_
	$self instvar numImgRecd_ numImgRepl_
	$self instvar numImgReq_
	$self instvar starttime_ endtime_
	$self instvar phttp_ httpseq_ session_
	$self instvar finish_
	global WebCScount

	set endtime_ [$ns_ now]
	puts -nonewline stderr "[format "%.3f " [expr $endtime_ - $starttime_]]"
	if {$phttp_} {
		set nrexmit [[$ftpSC2_(0) agent] set nrexmit_]
	} elseif {$session_} {
		set nrexmit [[[$ftpSC2_(0) agent] session] set nrexmit_]
	} else {
		set nrexmit 0
		for {set i 0} {$i < $numImg_} {incr i} {
			incr nrexmit [[$ftpSC2_($i) agent] set nrexmit_]
		}
	}
	puts -nonewline stderr "$nrexmit "
	flush stderr
	incr WebCScount -1
	if {$WebCScount == 0} {
		eval "$finish_"
	}
#	$ns_ at [expr [$ns_ now] + 3] "$self start"
#	[$ftpCS1_ agent] proc done {} "$self htmlReqDone"
#	[$ftpSC1_ agent] proc done {} "$self htmlReplDone"
}