1 # fca-modrcvr.tcl --
2 #
3 # FIXME: This file needs a description here.
4 #
5 # Copyright (c) 1997-2002 The Regents of the University of California.
6 # All rights reserved.
7 #
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions are met:
10 #
11 # A. Redistributions of source code must retain the above copyright notice,
12 # this list of conditions and the following disclaimer.
13 # B. Redistributions in binary form must reproduce the above copyright notice,
14 # this list of conditions and the following disclaimer in the documentation
15 # and/or other materials provided with the distribution.
16 # C. Neither the names of the copyright holders nor the names of its
17 # contributors may be used to endorse or promote products derived from this
18 # software without specific prior written permission.
19 #
20 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
21 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
24 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31
32 Class FCARcvr/Tcl/Moderator -superclass FCARcvr/Tcl
33 FCARcvr/Tcl/Moderator instproc init { mgr srcId } {
34 $self next $mgr $srcId
35 $self set repairRequest_ ""
36 $self set repairReply_ ""
37 $self set test_ 1
38 }
39
40 #--- SRM callbacks ---#
41 FCARcvr/Tcl/Moderator instproc handle_request { fcaPkt } {
42 $self instvar repairRequest_ mgr_
43 DbgOut "FCARcvr/Tcl/Moderator::handle_request, modrcvr_obj($self)"
44
45 set rreqState [$fcaPkt set moderatorState]
46 if {$repairRequest_ != ""} {
47 set myRqState [$repairRequest_ moderator_state]
48 if {$rreqState >= $myRqState} {
49 DbgOut "FCARcvr/Tcl/Moderator::handle_request, backoff"
50 $repairRequest_ backoff
51 return
52 }
53 }
54 set fcd [$mgr_ fcDynamics]
55 set myState [$fcd moderator_state]
56 if {$myState >= $rreqState} {
57 $self make_repair_reply $myState
58 }
59 }
60
61
62 FCARcvr/Tcl/Moderator instproc make_repair_reply {state} {
63 $self instvar repairReply_ mgr_ srcId_
64
65 if {$repairReply_ != ""} {
66 DbgOut "FCARcvr/Tcl/Moderator::make_repair_reply a repair reply has\
67 already been scheduled"
68 DbgOut "!!! repairReply_ is of class [$repairReply_ info class]"
69 set curRpyState [$repairReply_ state]
70 if {$curRpyState >= $state } {
71 DbgOut "FCARcvr/Tcl/Moderator::make_repair_reply, a repair \
72 only made, don't need to make the repair anymore"
73 return
74 }
75 $repairReply_ cancel
76 delete $repairReply_
77 set repairReply_ ""
78 }
79 set repairReply_ [new FCARepairReply/Tcl/Moderator]
80 set fcd [$mgr_ fcDynamics]
81 $repairReply_ set_state [$fcd moderator_state]
82 $repairReply_ set pktGrantUpdate [$fcd make_grant_pkt]
83 $repairReply_ set pktQueueUpdate [$fcd make_queue_pkt]
84 $mgr_ sched_reply $repairReply_ $srcId_
85 DbgOut "FCARcvr/Tcl/Moderator::make_repair_reply, a repair reply is\
86 just scheduled"
87 }
88
89
90 FCARcvr/Tcl/Moderator instproc handle_queue_update_repair { fcaPkt } {
91 $self instvar mgr_
92
93 set fcDynamics [$mgr_ fcDynamics]
94 set newStateNum [$fcaPkt set moderatorState]
95 $fcDynamics set_moderator_state $newStateNum
96 set numUpdates [$fcaPkt set numUpdates]
97 set pktUpdates [$fcaPkt set pktUpdates]
98 if { $numUpdates != [llength $pktUpdates]} {
99 DbgOut "FCARcvr/Tcl/Moderator::handle_queue_update_repair, \
100 numUpdates != number of grants within pktUpdates"
101 }
102
103 # creating new admitted list
104 set newAdmittedRqs [new FCA_RequestList/Bounded [$mgr_ fcPolicy]]
105
106 foreach i $pktUpdates {
107 set srcId [$i set srcId]
108 set requestId [$i set requestId]
109 set allRequests [[$mgr_ getRcvr $srcId] get_requests]
110 if { ![$allRequests is_canceled $requestId] } {
111 # add requests to admitted requests
112 $newAdmittedRqs add $srcId $requestId
113 $fcDynamics delete_pending_request $srcId $requestId
114 if { [$allRequests dont_have $requestId] } {
115 DbgOut "Don't have request for $srcId:$requestId"
116
117 # let the rcvr know that we ought to have got this stuff
118 $allRequests got_request $requestId {}
119
120 # make a repair request
121 DbgOut "FCARcvr/Tcl/Moderator::handle_queue_update_repair, \
122 make repair request "
123 set rcvr [$mgr_ getRcvr $srcId]
124 set needSched \
125 [$rcvr make_repair_request 0 $requestId $requestId]
126 if {$needSched} {
127 DbgOut "handle_queue_update_repair: \
128 repairRequest [$rcvr repair_request]"
129 $mgr_ sched_request [$rcvr repair_request] $srcId
130 }
131 }
132 }
133 }
134
135
136 set admittedRqs [$fcDynamics admitted_requests]
137 set admittedRqList [$admittedRqs get_list]
138 # for each of the old admitted request, if not in the new admitted
139 # request list, should be removed from the final admitted list
140 foreach rq $admittedRqList {
141 set srcId [lindex $rq 0]
142 set requestId [lindex $rq 1]
143 if {![$newAdmittedRqs exists $srcId $requestId]} {
144 $fcDynamics remove_admitted_request $srcId $requestId
145 }
146 }
147
148 # for each of the new admitted request, if not in the old admitted
149 # request list, should be added to the final admitted list
150 set newAdmittedRqList [$newAdmittedRqs get_list]
151 foreach rq $newAdmittedRqList {
152 set srcId [lindex $rq 0]
153 set requestId [lindex $rq 1]
154 if {![$admittedRqs exists $srcId $requestId]} {
155 $fcDynamics admit_request $srcId $requestId
156 }
157 }
158
159 delete $newAdmittedRqs
160 }
161
162
163 FCARcvr/Tcl/Moderator instproc handle_grant_update_repair { fcaPkt } {
164 $self instvar mgr_
165
166 set fcDynamics [$mgr_ fcDynamics]
167 set newStateNum [$fcaPkt set moderatorState]
168 $fcDynamics set_moderator_state $newStateNum
169
170 set numUpdates [$fcaPkt set numUpdates]
171 if {$numUpdates == 0} {
172 DbgOut "FCARcvr/Tcl/Moderator::handle_grant_update_repair, \
173 numUpdates = 0"
174 return
175 }
176 set pktUpdates [$fcaPkt set pktUpdates]
177 if { $numUpdates != [llength $pktUpdates]} {
178 DbgOut "numUpdates != number of grants within pktUpdates"
179 }
180
181 set grantInstList ""
182
183 foreach i $pktUpdates {
184 set grantSeqNo [$i set grantSeqno]
185 set srcId [$i set srcId]
186 set requestId [$i set requestId]
187 set floorType [$i set floorType]
188 set instance [$i set floorInstance]
189
190 lappend grantInstList [list $floorType $instance]
191
192 set instObj [$fcDynamics getFloorInstanceObj $floorType $instance]
193 set allRequests [[$mgr_ getRcvr $srcId] get_requests]
194 if { [$allRequests is_canceled $requestId] } {
195 # this request has already been canceled
196 not_implemented "release this grant instance"
197 return
198 }
199
200 set request [$allRequests get $requestId]
201 $fcDynamics grant_floor $floorType $instance $srcId \
202 $requestId $grantSeqNo
203 }
204
205 # evacuate the other floorType and instances not mentioned in the repair
206 foreach inst $grantInstList {
207 set ftype [lindex $inst 0]
208 set instance [lindex $inst 1]
209 $fcDynamics evacuate $ftype $instance
210 }
211 }
212
213
214 FCARcvr/Tcl/Moderator instproc handle_reply {fcaPkt } {
215 $self instvar mgr_ repairReply_ repairRequest_
216
217 set fcd [$mgr_ fcDynamics]
218 set myModState [$fcd moderator_state]
219 set qUpdate [$fcaPkt set pktQueueUpdate]
220 set grantUpdate [$fcaPkt set pktGrantUpdate]
221 set rrpyState [$qUpdate set moderatorState]
222
223 if {$myModState < $rrpyState } {
224 $fcd reset
225 $self handle_queue_update $qUpdate
226 $self handle_grant_update $grantUpdate
227 # cancel repair request:
228
229 if { $repairRequest_ != "" } {
230 set rqState [$repairRequest_ moderator_state]
231 if {$rqState <= $rrpyState} {
232 $repairRequest_ cancel
233 delete $repairRequest_
234 set repairRequest_ ""
235 }
236 }
237 return
238 }
239
240 #cancel repair reply
241 if {$repairReply_ != "" } {
242 set myRrpyState [$repairReply_ state]
243 if {$rrpyState >= $myRrpyState} {
244 DbgOut "FCARcvr/Tcl/Moderator::handle_reply, my repair reply \
245 canceled"
246 $repairReply_ cancel
247 delete $repairReply_
248 set repairReply_ ""
249 }
250 }
251 }
252
253
254 FCARcvr/Tcl/Moderator instproc handle_SA {fcaPkt} {
255 $self instvar repairRequest_ mgr_ srcId_
256 DbgOut "handle_SA::FCARcvr/Tcl/Moderator, newState = [$fcaPkt set currentState]"
257 set fcd [$mgr_ fcDynamics]
258 set myState [$fcd moderator_state]
259 set newState [$fcaPkt set currentState]
260 if { $myState >= $newState } {
261 DbgOut "myState($myState) newState($newState) \
262 FCARcvr/Tcl/Moderator::handle_SA"
263 # after 5000
264 return
265 }
266 # after 1000
267 if { $repairRequest_ == "" } {
268 set repairRequest_ [new FCARepairRequest/Tcl/Moderator $newState]
269 $mgr_ sched_request $repairRequest_ $srcId_
270 DbgOut "new repairRequest newed and sent out"
271 # after 1000
272 return
273 }
274
275 set rqState [$repairRequest_ moderator_state]
276 if {$rqState >= $newState} {
277 DbgOut "currently requested state ($rqState) is newer than \
278 newState ($newState)"
279 return
280 }
281 $repairRequest_ set_moderator_state $newState
282 # after 1000
283 }
284
285 # HERE!!
286 #FCARcvr/Tcl/Moderator instproc handle_SA {fcaPkt} {
287 # $self instvar mgr_ srcId_ repairRequest_
288 # set fcd [$mgr_ fcDynamics]
289 # set myModState [$fcd moderator_state]
290 # set newState [$fcaPkt set currentState]
291 # DbgOut "saModState = $newState, FCARcvr/Tcl/Moderator::handle_SA,"
292 # DbgOut "FCARcvr/Tcl/Moderator::handle_SA, repairRequest = $repairRequest_"
293 # if { $myModState >= $newState } {
294 # DbgOut "FCARcvr/Tcl/Moderator::handle_SA, \
295 # myModState ($myModState) >= newState ($newState)"
296 # return
297 # }
298 # if { $repairRequest_ != "" } {
299 # DbgOut "repairRequest is not empty"
300 # DbgOut "of class [$repairRequest_ info class]"
301 ## DbgOut "moderatorState = [$repairRequest_ set moderatorState]"
302 # } else {
303 # DbgOut "repairRequest is empty"
304 # }
305 ## if { [info exist [$RepairRequest_ set moderatorState] } {
306 # if { $repairRequest_ == "" } {
307 # DbgOut "RepairRequest is empty"
308 # set needSched 1
309 # set repairRequest_ [new FCARepairRequest/Tcl/Moderator $newState]
310 # $mgr_ sched_request $repairRequest_ $srcId_
311 # DbgOut "Repair request ($repairRequest_) sent out"
312 # } else {
313 # if { $newState > [$repairRequest_ moderator_state] } {
314 # $repairRequest_ set_moderator_state $newState
315 # DbgOut "Repair request has new state $newState"
316 # }
317 # }
318 #}
319
320
321
322
323 FCARcvr/Tcl/Moderator instproc recv { fcaPkt } {
324 set pktType [$fcaPkt set pktType]
325 switch $pktType {
326 "PKT_FLOOR_REQUEST" {
327 $self handle_floor_request $fcaPkt
328 }
329 "PKT_FLOOR_CANCEL" {
330 $self handle_floor_cancel $fcaPkt
331 }
332 "PKT_GRANT_UPDATE" {
333 $self handle_grant_update $fcaPkt
334 }
335 "PKT_QUEUE_UPDATE" {
336 $self handle_queue_update $fcaPkt
337 }
338 "PKT_CANCEL_UPDATE" {
339 $self handle_cancel_update $fcaPkt
340 }
341 default {
342 DbgOut ""should not receive $pktType here!"
343 }
344 }
345 }
346
347
348 # assume single moderator now -> local receiver is not a moderator
349 # for multiple moderators, check whether local receiver is moderator,
350 # then send out update messages
351 FCARcvr/Tcl/Moderator instproc handle_grant_update {fcaPkt} {
352 $self instvar mgr_
353
354 ###!!! testing handle_sa
355 DbgOut "modrcvr ignore grant update [$fcaPkt set moderatorState]"
356 return
357
358
359 set fcDynamics [$mgr_ fcDynamics]
360 set curStateNum [$fcDynamics moderator_state]
361 set newStateNum [$fcaPkt set moderatorState]
362 if { $newStateNum != [expr $curStateNum+1] } {
363 DbgOut "invalid moderator update received; ignoring it"
364 return
365 }
366
367 $fcDynamics set_moderator_state $newStateNum
368 set numUpdates [$fcaPkt set numUpdates]
369 set pktUpdates [$fcaPkt set pktUpdates]
370 if { $numUpdates != [llength $pktUpdates]} {
371 DbgOut "numUpdates != number of grants within pktUpdates"
372 }
373
374 if { [$fcaPkt set pktType]=="PKT_GRANT_UPDATE" } {
375 set isGrant 1
376 } else {
377 set isGrant 0
378 }
379
380 foreach i $pktUpdates {
381 set grantSeqNo [$i set grantSeqno]
382 set srcId [$i set srcId]
383 set requestId [$i set requestId]
384 set floorType [$i set floorType]
385 set instance [$i set floorInstance]
386
387 if { ![$fcDynamics gr_is_stale $floorType $instance $grantSeqNo] } {
388 # if not stale grant/release
389
390 set instObj [$fcDynamics getFloorInstanceObj $floorType $instance]
391 set allRequests [[$mgr_ getRcvr $srcId] get_requests]
392 if { [$allRequests is_canceled $requestId] } {
393 # this request has already been canceled
394 not_implemented "release this grant instance"
395 return
396 }
397
398 set request [$allRequests get $requestId]
399 if {$isGrant} {
400 $fcDynamics grant_floor $floorType $instance $srcId \
401 $requestId $grantSeqNo
402 } else {
403 not_implemented "release"
404 $fcDynamics releaseHolder $floorType $instance $grantSeqNo
405 # update UI
406 [$mgr_ set uiMgr_] release_received $floorType $instObj
407 }
408 }
409 }
410 }
411
412
413
414 FCARcvr/Tcl/Moderator instproc handle_queue_update {fcaPkt} {
415 $self instvar mgr_ test_
416
417 ###!!! testing handle_sa
418 if {$test_} {
419 set test_ 0
420 DbgOut "FCARcvr/Tcl/Moderator, ignore queue update, testing mod handle_sa"
421 return
422 }
423
424
425 set fcDynamics [$mgr_ fcDynamics]
426 set curStateNum [$fcDynamics moderator_state]
427 set newStateNum [$fcaPkt set moderatorState]
428 if { $newStateNum <= $curStateNum } {
429 DbgOut "current state is more recent than new state, dump queue update"
430 return
431 }
432
433 set numUpdates [$fcaPkt set numUpdates]
434 set pktUpdates [$fcaPkt set pktUpdates]
435
436 $fcDynamics set_moderator_state $newStateNum
437
438 foreach i $pktUpdates {
439 set isAdd [$i set isAdd]
440 set srcId [$i set srcId]
441 set requestId [$i set requestId]
442
443 if {$isAdd} {
444 set allRequests [[$mgr_ getRcvr $srcId] get_requests]
445
446 if { ![$allRequests is_canceled $requestId] } {
447 # add requests to admitted requests
448 $fcDynamics admit_request $srcId $requestId
449 $fcDynamics delete_pending_request $srcId $requestId
450
451 if { [$allRequests dont_have $requestId] } {
452 DbgOut "Don't have request for $srcId:$requestId"
453
454 # let the rcvr know that we ought to have got this stuff
455 $allRequests got_request $requestId {}
456
457 # make a repair request
458 DbgOut "FCARcvr/Tcl/Moderator::handle_queue_update, \
459 make repair request "
460 set rcvr [$mgr_ getRcvr $srcId]
461 set needSched \
462 [$rcvr make_repair_request 0 $requestId $requestId]
463 if {$needSched} {
464 DbgOut "handle_queue_update: \
465 repairRequest [$rcvr repair_request]"
466 $mgr_ sched_request [$rcvr repair_request] $srcId
467 }
468
469 }
470 }
471 } else {
472 $fcDynamics remove_admitted_request $srcId $requestId
473 # if there is a cancel message for this request, obsolete it out
474 [$mgr_ getRcvr $srcId] obsolete_important cancel $requestId
475 }
476 }
477 }
478
479
480
481 # whether at srcId there is a release for grantSeq
482 FCARcvr/Tcl/Moderator instproc isPendingRls {srcId grantSeq} {
483 $self instvar mgr_ pendingRls_
484 set rcvr [$mgr_ getRcvr $srcId]
485 return [info exist pendingRls_($grantSeq)]
486 }
487
488
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.