| msc { |
| hscale=2; |
| ms [label="MS/BTS"], ho[label="BSC Handover FSM"], gscon[label="BSC conn FSM"], msc_[label="MSC"]; |
| |
| ms note msc_ [label="inter-BSC Handover to another BSS"]; |
| |
| gscon abox gscon [label="ST_ACTIVE"]; |
| |
| ms => ho [label="Measurement Report"]; |
| ho box ho [label="Handover Decision"]; |
| ho box ho [label="handover_request\n(struct handover_out_req)"]; |
| ho note gscon [label="To make sure the conn FSM permits a handover, trigger an event:"]; |
| ho -> gscon [label="GSCON_EV_HANDOVER_START\ndata=handover_out_req"]; |
| gscon abox gscon [label="ST_HANDOVER"]; |
| ho <- gscon [label="handover_start\n(handover_out_req)"]; |
| ho box ho [label="handover_start_inter_bsc_out()"]; |
| ho => msc_ [label="BSSMAP Handover Required"]; |
| ho abox ho [label="HO_OUT_ST_WAIT_HO_COMMAND"]; |
| ...; |
| ...; |
| --- [label="On Timeout"]; |
| ho box ho [label="handover_end(fail)"]; |
| ho -> gscon [label="GSCON_EV_HANDOVER_END"]; |
| gscon abox gscon [label="ST_ACTIVE"]; |
| ms note gscon [label="MS happily continues on the old lchan."]; |
| --- [label="END: 'On Timeout'"]; |
| ...; |
| ...; |
| ho <= msc_ [label="BSSMAP Handover Command\n HO_OUT_EV_BSSMAP_HO_COMMAND"]; |
| ms <= ho [label="Forward L3 Info (RR Handover Command from new BSS)"]; |
| ho abox ho [label="HO_OUT_ST_WAIT_CLEAR"]; |
| ...; |
| gscon abox gscon [label="ST_HANDOVER_MO_\nWAIT_CLEAR_CMD\nT8"]; |
| ms <= gscon [label="RR Handover Command"]; |
| ...; |
| ho rbox gscon [label="On Timeout: same as above"]; |
| ...; |
| msc_ note msc_ [label="Remote BSS reported Handover Complete to the MSC, |
| this connection has been superseded."]; |
| gscon <= msc_ [label="BSSMAP Clear Command\n GSCON_EV_A_CLEAR_CMD"]; |
| gscon abox gscon [label="ST_CLEARING"]; |
| gscon => msc_ [label="BSSMAP Clear Complete"]; |
| ...; |
| gscon <= msc_ [label="DISC IND\n GSCON_EV_A_DISC_IND"]; |
| ho abox ho [label="terminate\n(child of conn FSM)"]; |
| gscon abox gscon [label="terminate"]; |
| } |