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"]; }