diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2018-05-28 14:29:49 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2018-06-08 16:16:42 +0000 |
commit | 44fcc9f11e80cd4ae0811dc41f8201c5d95dea6b (patch) | |
tree | 91580d1ddbea6927bb77776370f72b725eed1d88 /doc/lchan.msc | |
parent | c4bb31dcad3b0bedd6f1ad89d99ada71be55f06d (diff) |
doc: charts: illustrate new plan for ts and lchans
Add lchan and timeslot FSM charts to illustrate planning of how osmo-bsc should
handle lchan assignment and release.
Modify assignment, handover, lchan-release charts according to the new plan.
Change-Id: I18d60de5ee932c962aad0a532965a55d570bb936
Diffstat (limited to 'doc/lchan.msc')
-rw-r--r-- | doc/lchan.msc | 306 |
1 files changed, 306 insertions, 0 deletions
diff --git a/doc/lchan.msc b/doc/lchan.msc new file mode 100644 index 000000000..9b7d663c4 --- /dev/null +++ b/doc/lchan.msc @@ -0,0 +1,306 @@ +msc { + hscale=2; + bts [label="MS/BTS"], bsc[label="BSC"], bsc_ts [label="BSC timeslot FSM"], + bsc_lchan[label="BSC lchan FSM"], bsc_gscon[label="BSC conn FSM"], + mgw_msc[label="MGW/MSC"]; + + bts box mgw_msc [label="lchan allocation sequence"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_UNUSED"]; + + bts rbox mgw_msc [label="Channel Request from MS"]; + bts => bsc [label="RSL Channel Request"]; + bsc box bsc [label="lchan_select_by_type(chan_type)"]; + bsc -> bsc_lchan [label="lchan_activate(lchan, FOR_MS_CHANNEL_REQUEST)"]; + bsc_lchan rbox bsc_lchan [label="Continue at\nlchan_activate()\n"]; + |||; + |||; + + bts rbox mgw_msc [label="Channel Request from BSSMAP Assignment"]; + bsc_gscon <= mgw_msc [label="BSSMAP Assignment request"]; + bsc_gscon box bsc_gscon [label="lchan_select_by_chan_mode(chan_mode)"]; + bsc_lchan <- bsc_gscon [label="lchan_activate(lchan, FOR_ASSIGNMENT)"]; + bsc_lchan rbox bsc_lchan [label="Continue at\nlchan_activate()\n"]; + |||; + |||; + + bts rbox mgw_msc [label="Channel Request from Handover Decision"]; + bsc note bsc [label="target lchan typically already chosen by Handover Decision"]; + bsc -> bsc_gscon [label="GSCON_EV_HO_START (intra-BSC)"]; + bsc_lchan <- bsc_gscon [label="lchan_activate(lchan, FOR_HANDOVER)"]; + bsc_lchan rbox bsc_lchan [label="Continue at\nlchan_activate()\n"]; + |||; + |||; + + bts rbox mgw_msc [label="Channel Request from intra-BSC-MT-Handover"]; + bsc_gscon <- mgw_msc [label="BSSMAP Handover Request"]; + bsc_gscon box bsc_gscon [label="lchan_select_by_chan_mode(chan_mode)"]; + bsc box bsc [label="lchan_activate(lchan, FOR_HANDOVER)"]; + bsc_lchan rbox bsc_lchan [label="Continue at\nlchan_activate()\n"]; + |||; + |||; + bts rbox mgw_msc [label="lchan_activate()"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_\nWAIT_TS_READY\n(timeout: ? s, Tnnnn)"]; + |||; + |||; + --- [label="TCH?"]; + bsc_lchan note bsc_gscon [label="This is skipped when FOR_MS_CHANNEL_REQUEST. If the MS requests + a TCH lchan, and we end up actually giving it a TCH because no SDCCH are available, we + can not set up an RTP stream because there is not even an L3 conn yet."]; + bsc_lchan note bsc_gscon [label="The lchan FSM asks the conn FSM to have an MGW endpoint ready as + early as possible. Either the conn already has such MGW endpoint from a previous lchan, + in which case it immediately replies, or it requests one from the MGW, in which case we + wait for a response in 'TCH? (2)' below."]; + bsc_lchan -> bsc_gscon [label="GSCON_EV_ENSURE_MGW_ENDPOINT"]; + --- [label="IF conn has user_plane.fi_bts in state ST_READY"]; + bsc_lchan <- bsc_gscon [label="LCHAN_EV_MGW_ENDPOINT_AVAILABLE"]; + bsc_lchan box bsc_lchan [label="mgw_endpoint_available = true"]; + bsc_lchan note bsc_lchan [label="lchan_activate() continues"]; + --- [label="ELSE (no MGW endpoint available yet)"]; + bsc_gscon => mgw_msc [label="CRCX (for BTS) via mgcp_conn_create()"]; + bsc_gscon abox bsc_gscon [label="ST_WAIT_CRCX_BTS\n(timeout: ? s, Tnnnn)"]; + bsc_lchan <- bsc_gscon [label="(event dispatch returns)"]; + bsc_lchan note bsc_lchan [label="lchan_activate() continues"]; + ...; + bsc_gscon note bsc_gscon [label="async:"]; + bsc_gscon <= mgw_msc [label="CRCX OK (for BTS)"]; + bsc_lchan <- bsc_gscon [label="LCHAN_EV_MGW_ENDPOINT_AVAILABLE"]; + bsc_lchan box bsc_lchan [label="mgw_endpoint_available = true"]; + bsc_lchan note bsc_lchan [label="As soon as we reach LCHAN_ST_WAIT_MGW_ENDPOINT_AVAILABLE, this triggers + immedate action (s.b.), but until then, only the flag gets set to true."]; + ...; + --- [label="CRCX timeout"]; + bsc_gscon note bsc_gscon [label="conn FSM should fire on CRCX timeout"]; + bsc_lchan <- bsc_gscon [label="LCHAN_EV_MGW_ENDPOINT_ERROR"]; + bsc_gscon note bsc_gscon [label="conn FSM should not assume anything and wait for + GSCON_EV_LCHAN_ALLOC_ERROR"]; + bsc_lchan rbox bsc_lchan [label="Do 'On any error'"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_UNUSED"]; + bsc_ts <- bsc_lchan [label="TS_EV_LCHAN_UNUSED"]; + --- [label="END: 'TCH?'"]; + |||; + |||; + + bsc_lchan box bsc_lchan [label="lchan_activate() exits"]; + bsc_lchan note bsc_lchan [label="still in\nlchan_request()\nLCHAN_ST_WAIT_\nTS_READY"]; + bsc_ts <- bsc_lchan [label="TS_EV_LCHAN_REQUESTED"]; + ...; + --- [label="on error from TS or timeout:"]; + bsc_ts -> bsc_lchan [label="LCHAN_EV_TS_ERROR"]; + bsc_lchan rbox bsc_lchan [label="Do 'On any error'"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_UNUSED"]; + bsc_ts <- bsc_lchan [label="TS_EV_LCHAN_UNUSED"]; + ---; + ...; + bsc_ts abox bsc_ts [label="TS_ST_IN_USE"]; + bsc_ts -> bsc_lchan [label="LCHAN_EV_TS_READY"]; + bsc_lchan box bsc_lchan [label="lchan_fsm_\npre_lchan_activ()"]; + + |||; + |||; + bts rbox mgw_msc [label="mode FOR_MS_CHANNEL_REQUEST"]; + bts note bsc_lchan [label="This is the simple case where the MS requested a channel, and there is no + L3 conn to the MSC; no matter if this is SDDCH or a TCH channel type, we will not prepare + an RTP stream."]; + + bsc_lchan note bsc_lchan [label="still in lchan_fsm_\npre_lchan_activ()"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nACTIV_ACK\n(timeout: ? s, Tnnnn)"]; + bts <= bsc_lchan [label="RSL Chan Activ (RSL_ACT_INTRA_IMM_ASS)"]; + bts note bsc_lchan [label="If any errors occur from now on, we don't want to send an RR Immediate + Assignment Reject anymore."]; + bsc_lchan box bsc_lchan [label="sent_chan_activ = true"]; + ...; + --- [label="on timeout"]; + bsc_lchan rbox bsc_lchan [label="Continue at: 'On any error', 'unrecoverable'"]; + ---; + ...; + bts => bsc_lchan [label="RSL Chan Activ ACK"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nRLL_ESTABLISH\nT3101"]; + bsc_lchan note bsc_lchan [label="Now the lchan is assigned, but has no L3 conn yet. On errors, + this will either go into graceful release or into broken state, but will not trigger any + events to a (non-existing) conn."]; + ...; + --- [label="on timeout"]; + bts <= bsc_lchan [label="RSL RF Channel Release"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_RF_RELEASE_ACK\n(T?, 4s)"]; + ---; + ...; + bts => bsc_lchan [label="RLL Establish Ind"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_ACTIVE"]; + |||; + |||; + bts rbox mgw_msc [label="modes FOR_ASSIGNMENT and FOR_HANDOVER"]; + + bsc_lchan note bsc_lchan [label="still in lchan_fsm_\npre_lchan_activ()"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nACTIV_ACK\n(timeout: ? s, Tnnnn)"]; + bts <= bsc_lchan [label="RSL Chan Activ (RSL_ACT_INTRA_NORM_ASS)",ID=FOR_ASSIGNMENT]; + bts <= bsc_lchan [label="RSL Chan Activ (RSL_ACT_INTER_ASYNC)",ID=FOR_HANDOVER]; + ...; + --- [label="on timeout"]; + bsc_lchan rbox bsc_lchan [label="Continue at: 'On any error', 'unrecoverable'"]; + ---; + bts => bsc_lchan [label="RSL Chan Activ ACK"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nRLL_ESTABLISH\nT3101"]; + ...; + --- [label="on timeout"]; + bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ALLOC_ERROR"]; + bsc_lchan -> bsc_lchan [label="lchan_fsm_pre_rf_release()"]; + ---; + ...; + bts => bsc_lchan [label="RLL Establish Indication"]; + |||; + + --- [label="TCH? (2)"]; + --- [label="mgw_endpoint_available == false?"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nMGW_ENDPOINT_\nAVAILABLE"]; + bsc_lchan note bsc_lchan [label="rely on conn FSM timeout; apply only a long sanity timeout."]; + ...; + bsc_gscon <= mgw_msc [label="CRCX OK (for BTS)"]; + bsc_lchan <- bsc_gscon [label="LCHAN_EV_MGW_ENDPOINT_AVAILABLE"]; + bsc_lchan box bsc_lchan [label="mgw_endpoint_available = true"]; + bsc_lchan <- bsc_lchan [label="re-invoke lchan_fsm_pre_lchan_activ()"]; + --- [label="END: 'TCH? (2)'"]; + |||; + + --- [label="is BTS using IPA Abis? (osmo-bts, ip.access)"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nIPACC_CRCX_ACK\n(timeout: ? s, Tnnnn)"]; + bts <= bsc_lchan [label="IPACC CRCX"]; + ...; + --- [label="on timeout"]; + bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ALLOC_ERROR"]; + bsc_lchan -> bsc_lchan [label="lchan_graceful_release()"]; + ---; + ...; + bts => bsc_lchan [label="IPACC CRCX ACK"]; + bts note bsc_lchan [label="The IPACC CRCX ACK tells us what port the IPA Abis based BTS has + assigned to this lchan. AoIP: we need to forward this to the MGW (BTS side) with an MDCX; + SCCPlite: we forward this to the MSC during BSSMAP Assignment Complete (TODO: is this + correct??)"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nIPACC_MDCX_ACK\n(timeout: ? s, Tnnnn)"]; + bts <= bsc_lchan [label="IPACC MDCX"]; + bts note bsc_lchan [label="The IPACC MDCX tells IPA Abis based BTSes the IP address and RTP port + assigned by the BTS side of the MGW. AoIP: the MGW CRCX (BTS) must thus happen before + this; SCCPlite: the RTP port is already known from the timeslot+multiplex information."]; + ...; + --- [label="on timeout"]; + bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ALLOC_ERROR"]; + bsc_lchan -> bsc_lchan [label="lchan_graceful_release()"]; + ---; + ...; + bts => bsc_lchan [label="IPACC MDCX ACK"]; + --- [label="END: is BTS using IPA Abis? (osmo-bts, ip.access)"]; + |||; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_ACTIVE"]; + bsc_lchan box bsc_lchan [label="lchan_fsm_post_lchan_activ()"]; + bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ACTIVE"]; + bts <= bsc_gscon [label="RR Assignment",ID="BSSMAP Assignment Request"]; + bts <= bsc_gscon [label="RR Handover Command",ID="intra-BSC HO"]; + bsc_gscon => mgw_msc [label="BSSMAP Handover\nRequest Acknowledge",ID="inter-BSC-MT HO"]; + ...; + ---[label="On error"]; + bsc_lchan rbox bsc_lchan [label="Continue at 'When the lchan is no longer used'"]; + ---; + ...; + + bts => bsc_gscon [label="RR Assignment Complete",ID="BSSMAP Assignment Request"]; + bts => bsc_gscon [label="RR Handover Detect",ID="intra-BSC HO"]; + bts => bsc_gscon [label="RR Handover Accept",ID="inter-BSC-MT HO"]; + bsc_gscon note bsc_gscon [label="conn FSM takes care of MGW endpoints for BTS side (possibly + redirect) and MSC side (possibly create). More information in e.g. assignment.msc and + handover.msc"]; + + ...; + ...; + ...; + + bts rbox mgw_msc [label="When the lchan is no longer used"]; + --- [label="IF the MS or BTS release the lchan"]; + bts -> bsc_lchan [label="RLL Release Ind for SAPI=0"]; + --- [label="IF the BSC other than the conn FSM decides to release"]; + bsc -> bsc_lchan [label="LCHAN_EV_RELEASE"]; + --- [label="IF the MSC or conn FSM release the lchan"]; + bsc_lchan <- bsc_gscon [label="LCHAN_EV_RELEASE"]; + ---; + bsc note bsc_gscon [label="The LCHAN_EV_RELEASE's data pointer possibly indicates an error + cause"]; + bsc_lchan note bsc_gscon [label="If the conn FSM requested a release, it probably has already + forgotten about this lchan. However, if the MS/BTS initiated the release, make sure the conn FSM + is informed:"]; + bsc_lchan box bsc_lchan [label="lchan_graceful_release()"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nSAPIS_RELEASED\nT3109"]; + --- [label="TCH and got as far as Chan Activ Ack?"]; + bts <= bsc_lchan [label="RSL Deactivate SACCH"]; + ---; + bts <= bsc_lchan [label="RLL Release Request (Local End)..."]; + bts <= bsc_lchan [label="...for all SAPIs except [0]"]; + |||; + --- [label="SAPI[0] in use?"]; + bsc_lchan note bsc_lchan [label="for bts->nokia.no_loc_rel_cnf we do not expect Release Confirm + messages and this state immediately advances to lchan_fsm_pre_rf_release()"]; + ...; + --- [label="on timeout"]; + bsc_lchan box bsc_lchan [label="Anyway try RF Channel Release, continue + with lchan_fsm_wait_before_rf_release()"]; + ---; + ...; + bts => bsc_lchan [label="RLL Release Confirm..."]; + bts => bsc_lchan [label="...for each SAPI except [0]"]; + bsc_lchan box bsc_lchan [label="Stay in\nLCHAN_ST_WAIT_\nSAPIS_RELEASED\nuntil only SAPI[0] remains active"]; + --- [label="END: 'SAPI[0] in use?'"]; + |||; + + bsc_lchan box bsc_lchan [label="lchan_fsm_wait_before_rf_release()"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nBEFORE_RF_RELEASE\nT3111"]; + bsc_lchan -> bsc_gscon [label="GSCON_EV_FORGET_LCHAN (data=lchan)"]; + bsc_gscon note bsc_gscon [label="conn FSM immediately forgets about the lchan"]; + bsc_gscon => mgw_msc [label="BSSMAP Clear Request?"]; + ...; + bsc_lchan box bsc_lchan [label="T3111 expires"]; + bsc_lchan box bsc_lchan [label="lchan_fsm_pre_rf_release()"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nRF_RELEASE_ACK\nT3111"]; + bsc_lchan box bsc_lchan [label="for each bsc_rll_req matching this lchan: disable timer, call + cb(BSC_RLLR_IND_REL_IND)"]; + bts <= bsc_lchan [label="RSL RF Channel Release"]; + ...; + --- [label="on timeout"]; + bsc_lchan rbox bsc_lchan [label="Continue at: 'On any error', 'unrecoverable'"]; + ---; + ...; + bts => bsc_lchan [label="RSL RF Channel Release Ack"]; + + bsc_lchan box bsc_lchan [label="lchan_fsm_post_rf_release()"]; + |||; + --- [label="IF an error cause was indicated on LCHAN_EV_RELEASE"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_WAIT_\nAFTER_ERROR\n(timeout: T3111+2 s, T?)"]; + ...; + bsc_lchan box bsc_lchan [label="timer expires"]; + --- [label="END: 'an error cause was indicated on LCHAN_EV_RELEASE'"]; + |||; + bsc_lchan box bsc_lchan [label="lchan_fsm_release_complete()"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_UNUSED"]; + bsc_ts <- bsc_lchan [label="TS_EV_LCHAN_UNUSED"]; + bsc_ts abox bsc_ts [label="TS_ST_UNUSED"]; + |||; + |||; + + bts rbox mgw_msc [label="On any error"]; + |||; + --- [label="IF FOR_MS_CHANNEL_REQUEST && !sent_chan_activ"]; + bts <= bsc_lchan [label="RR Immediate Assign Reject"]; + |||; + --- [label="IF FOR_ASSIGNMENT or FOR_HANDOVER"]; + bsc_lchan -> bsc_gscon [label="GSCON_EV_LCHAN_ALLOC_ERROR"]; + bsc_gscon note bsc_gscon [label="conn FSM shall immediately 'forget' the lchan"]; + bsc_gscon => mgw_msc [label="BSSMAP\nAssignment Failure",ID=FOR_ASSIGNMENT]; + bsc_gscon => mgw_msc [label="BSSMAP\nHandover Failure",ID="inter-BSC-MT HO"]; + ---; + |||; + --- [label="IF unrecoverable error"]; + bsc_lchan abox bsc_lchan [label="LCHAN_ST_BORKEN"]; + bsc_lchan note bsc_lchan [label="The broken state usually stays around + until the BTS disconnects."]; + ...; + bts note bsc_lchan [label="If an ACK comes in late, for specific BTS models, we may choose to + 'repair' the lchan so that it is usable again."]; + bts -> bsc_lchan [label="Chan Release ACK"]; + bsc_lchan -> bsc_lchan [label="lchan_fsm_post_rf_release()"]; +} |