Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 1 | msc { |
| 2 | hscale=2; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 3 | ms [label="MS/BTS"], ts [label="BSC timeslot FSM"], |
| 4 | lchan[label="BSC lchan FSM"], rtp[label="BSC lchan RTP FSM"],mgwep[label="BSC MGW endpoint FSM"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 5 | |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 6 | ms box mgwep [label="lchan allocation sequence"]; |
| 7 | lchan abox lchan [label="LCHAN_ST_UNUSED"]; |
| 8 | ...; |
| 9 | lchan rbox lchan [label="lchan_activate(activate_info)"]; |
| 10 | lchan note lchan [label="Dispatching event to make sure the lchan FSM permits activation."]; |
| 11 | lchan -> lchan [label="LCHAN_EV_ACTIVATE\ndata = activate_info"]; |
| 12 | lchan abox lchan [label="LCHAN_ST_\nWAIT_TS_READY"]; |
| 13 | ts <- lchan [label="TS_EV_LCHAN_REQUESTED"]; |
| 14 | ts rbox ts [label="Most details omitted. See timeslot FSM diagrams."]; |
| 15 | ts note ts [label="A dyn TS may be in PDCH mode and will asynchronously switch off PDCH first. A |
| 16 | non-dynamic TS is ready immediately."]; |
| 17 | |||; |
| 18 | --- [label="IF requires_voice_stream"]; |
| 19 | lchan -> rtp [label="lchan_rtp_fsm_start()"]; |
| 20 | rtp abox rtp [label="allocate\n LCHAN_RTP_ST_\nWAIT_MGW_ENDPOINT_\nAVAILABLE"]; |
| 21 | --- [label="IF no endpoint-CI yet"]; |
| 22 | rtp box rtp [label="gscon_ensure_mgw_endpoint()"]; |
| 23 | rtp -> mgwep [label="mgw_endpoint_ci_add(to-BTS)"]; |
| 24 | rtp -> mgwep [label="CRCX to-BTS"]; |
| 25 | mgwep rbox mgwep [label="MGCP: CRCX"]; |
| 26 | ...; |
| 27 | mgwep rbox mgwep [label="MGCP: CRCX OK"]; |
| 28 | rtp <- mgwep [label="LCHAN_RTP_EV_MGW_ENDPOINT_AVAILABLE"]; |
| 29 | rtp note mgwep [label="The CRCX OK has assigned us a new endpoint CI number"]; |
| 30 | rtp abox rtp [label="LCHAN_RTP_ST_WAIT_LCHAN_READY"]; |
| 31 | --- [label="END: no endpoint-CI yet"]; |
| 32 | --- [label="END: requires_voice_stream"]; |
| 33 | |||; |
| 34 | ...; |
| 35 | ts -> lchan [label="LCHAN_EV_TS_READY"]; |
| 36 | lchan abox lchan [label="LCHAN_ST_\nWAIT_ACTIV_ACK"]; |
| 37 | --- [label="IF FOR_MS_CHANNEL_REQUEST"]; |
| 38 | ms <= lchan [label="RSL Chan Activ (RSL_ACT_INTRA_IMM_ASS)"]; |
| 39 | --- [label="ELSE: FOR_ASSIGNMENT"]; |
| 40 | ms <= lchan [label="RSL Chan Activ (RSL_ACT_INTRA_NORM_ASS)"]; |
| 41 | --- [label="ELSE: FOR_HANDOVER"]; |
| 42 | ms <= lchan [label="RSL Chan Activ (RSL_ACT_INTER_ASYNC)"]; |
| 43 | --- [label="END"]; |
| 44 | ...; |
| 45 | ms rbox lchan [label="On timeout or Chan Activ NACK, see: 'On any error', 'unrecoverable'"]; |
| 46 | ...; |
| 47 | ms => lchan [label="RSL Chan Activ ACK"]; |
| 48 | lchan box lchan [label="lchan_fsm_post_activ_ack()"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 49 | |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 50 | --- [label="IF FOR_MS_CHANNEL_REQUEST"]; |
| 51 | ms <= lchan [label="RR Immediate Assignment"]; |
| 52 | --- [label="ELSE: FOR_ASSIGNMENT"]; |
| 53 | lchan rbox lchan [label="dispatch\nASSIGNMENT_EV_\nLCHAN_ACTIVE\n(see Assignment FSM diagrams)"]; |
| 54 | ms <= lchan [label="RR Assignment Command"]; |
| 55 | --- [label="ELSE: FOR_HANDOVER"]; |
| 56 | lchan rbox lchan [label="dispatch\nHO_EV_LCHAN_ACTIVE\n(see Handover FSM diagrams)"]; |
| 57 | --- [label="END"]; |
| 58 | |
| 59 | |
| 60 | lchan abox lchan [label="LCHAN_ST_WAIT_\nRLL_RTP_ESTABLISH\nT3101"]; |
| 61 | |||; |
| 62 | |||; |
| 63 | --- [label="IF requires_voice_stream"]; |
| 64 | lchan -> rtp [label="LCHAN_RTP_EV_LCHAN_READY"]; |
| 65 | |||; |
| 66 | --- [label="IF ip.access style BTS"]; |
| 67 | rtp abox rtp [label="LCHAN_RTP_ST_WAIT_IPACC_CRCX_ACK"]; |
| 68 | ms <= rtp [label="IPACC CRCX"]; |
| 69 | ...; |
| 70 | ms => rtp [label="IPACC CRCX ACK (BTS RTP port info)"]; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 71 | --- [label="END ip.access style BTS"]; |
| 72 | |||; |
| 73 | rtp box rtp [label="lchan_rtp_fsm_switch_rtp()"]; |
| 74 | |||; |
| 75 | --- [label="IF wait_before_switching_rtp"]; |
| 76 | rtp note rtp [label="During Handover, wait for HO DETECT before redirecting an existing endpoint |
| 77 | CI towards the new lchan."]; |
| 78 | rtp abox rtp [label="LCHAN_RTP_ST_WAIT_READY_TO_SWITCH_RTP"]; |
| 79 | ...; |
| 80 | ms => rtp [label="HO DETECT (via Handover FSM)"]; |
| 81 | --- [label="END: wait_before_switching_rtp"]; |
| 82 | |||; |
| 83 | rtp abox rtp [label="LCHAN_RTP_ST_WAIT_MGW_ENDPOINT_CONFIGURED"]; |
| 84 | rtp box rtp [label="connect_mgw_endpoint_to_lchan()"]; |
| 85 | rtp -> mgwep [label="MDCX to-BTS"]; |
| 86 | mgwep rbox mgwep [label="MGCP: MDCX"]; |
| 87 | ...; |
| 88 | mgwep rbox mgwep [label="MGCP: MDCX OK"]; |
| 89 | rtp <- mgwep [label="LCHAN_RTP_EV_MGW_ENDPOINT_CONFIGURED"]; |
Pau Espin Pedrol | f087c1e | 2020-09-02 18:40:43 +0200 | [diff] [blame] | 90 | --- [label="IF ip.access style BTS"]; |
| 91 | rtp abox rtp [label="LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK"]; |
| 92 | ms <= rtp [label="IPACC MDCX (MGW RTP port info)"]; |
| 93 | ...; |
| 94 | ms => rtp [label="IPACC MDCX ACK"]; |
| 95 | --- [label="END ip.access style BTS"]; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 96 | rtp abox rtp [label="LCHAN_RTP_ST_READY"]; |
| 97 | lchan <- rtp [label="LCHAN_EV_RTP_READY"]; |
| 98 | rtp note rtp [label="RTP FSM stays ready for Rollback until final establish event"]; |
| 99 | ...; |
| 100 | lchan -> rtp [label="LCHAN_RTP_EV_ESTABLISHED\nvia gscon_change_primary_lchan()"]; |
| 101 | rtp abox rtp [label="LCHAN_RTP_ST_\nESTABLISHED"]; |
| 102 | --- [label="END: requires_voice_stream"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 103 | |||; |
| 104 | |||; |
| 105 | |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 106 | ...; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 107 | ms => lchan [label="RLL Establish Ind"]; |
| 108 | lchan abox lchan [label="LCHAN_ST_\nESTABLISHED"]; |
| 109 | lchan box lchan [label="lchan_on_fully_established()"]; |
| 110 | --- [label="IF FOR_MS_CHANNEL_REQUEST"]; |
| 111 | ms note lchan [label="No action required. The MS will have sent an L3 message in the RLL |
| 112 | Establish Ind and is then free to dispatch DTAP."]; |
| 113 | --- [label="ELSE: FOR_ASSIGNMENT"]; |
| 114 | lchan rbox lchan [label="dispatch\nASSIGNMENT_EV_\nLCHAN_ESTABLISHED\n(see Assignment FSM diagrams)"]; |
| 115 | --- [label="ELSE: FOR_HANDOVER"]; |
| 116 | lchan rbox lchan [label="dispatch\nHO_EV_LCHAN_ESTABLISHED\n(see Handover FSM diagrams)"]; |
| 117 | --- [label="END"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 118 | ...; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 119 | --- [label="IF requires_voice_stream"]; |
| 120 | lchan rbox lchan [label="Assignment or Handover FSM:"]; |
| 121 | lchan -> mgwep [label="CRCX/MDCX to-MSC"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 122 | ...; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 123 | lchan <- mgwep [label="OK"]; |
| 124 | lchan box lchan [label="gscon_change_primary_lchan()"]; |
| 125 | lchan -> rtp [label="LCHAN_RTP_EV_ESTABLISHED"]; |
| 126 | rtp abox rtp [label="LCHAN_RTP_ST_\nESTABLISHED"]; |
| 127 | rtp box rtp [label="Forget any Rollback info"]; |
| 128 | --- [label="END: requires_voice_stream"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 129 | |
| 130 | ...; |
| 131 | ...; |
| 132 | ...; |
| 133 | |
Philipp Maier | 92eed41 | 2020-08-21 20:47:49 +0200 | [diff] [blame] | 134 | ms rbox mgwep [label="On Mode Modify (e.g. change a TCH lchan from signalling to voice)"]; |
| 135 | lchan abox lchan [label="LCHAN_ST_\nWAIT_RR_CHAN_\nMODE_MODIFY_ACK"]; |
| 136 | ms <= lchan [label="RR Chan Mode Modif"]; |
| 137 | ...; |
| 138 | ms => lchan [label="RR Chan Mode Modif Ack"]; |
| 139 | lchan abox lchan [label="LCHAN_ST_\nWAIT_RSL_CHAN_\nMODE_MODIFY_ACK"]; |
| 140 | ms <= lchan [label="RSL MT Mode Modify Req"]; |
| 141 | ...; |
| 142 | ms => lchan [label="RSL MT Mode Modify Ack"]; |
| 143 | --- [label="IF adding RTP stream"]; |
| 144 | lchan abox lchan [label="LCHAN_ST_WAIT_\nRLL_RTP_ESTABLISH\nT3101"]; |
| 145 | lchan rbox rtp [label="See above at 'LCHAN_RTP_EV_LCHAN_READY'"]; |
| 146 | --- [label="IF not adding RTP stream"]; |
| 147 | lchan abox lchan [label="LCHAN_ST_\nESTABLISHED"]; |
| 148 | --- [label="END: whether adding voice stream"]; |
| 149 | |
| 150 | ...; |
| 151 | ...; |
| 152 | ...; |
| 153 | |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 154 | ms rbox mgwep [label="When the MS or BTS release the lchan"]; |
| 155 | lchan abox lchan [label="LCHAN_ST_\nESTABLISHED"]; |
| 156 | ms -> lchan [label="RLL Release Ind for SAPI=0"]; |
| 157 | lchan abox lchan [label="LCHAN_ST_WAIT_RLL_RTP_RELEASED"]; |
| 158 | lchan rbox lchan [label="Continue at 'common release' below"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 159 | ...; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 160 | ...; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 161 | ms rbox mgwep [label="When the BSC decides to release the lchan"]; |
| 162 | lchan box lchan [label="lchan_release()"]; |
| 163 | lchan abox lchan [label="LCHAN_ST_WAIT_RLL_RTP_RELEASED"]; |
| 164 | ms <= lchan [label="RR Release"]; |
| 165 | lchan rbox lchan [label="common release"]; |
| 166 | --- [label="IF RTP FSM present"]; |
| 167 | lchan -> rtp [label="LCHAN_RTP_EV_RELEASE"]; |
| 168 | --- [label="END: RTP FSM present"]; |
| 169 | ms <= lchan [label="RSL Deactivate SACCH"]; |
| 170 | ms <= lchan [label="RSL Release Request (Local End)",ID="for each SAPI except [0]"]; |
| 171 | lchan note lchan [label="for ms->nokia.no_loc_rel_cnf we do not expect Release Confirm |
| 172 | messages and immediately mark all SAPIs as released"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 173 | |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 174 | ...; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 175 | lchan <- rtp [label="LCHAN_EV_RTP_RELEASED"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 176 | ...; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 177 | ms => lchan [label="RLL Release Confirm",ID="for each SAPI except [0]"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 178 | ...; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 179 | lchan box lchan [label="Stay in\nLCHAN_ST_WAIT_\nRLL_RTP_RELEASED\nuntil only SAPI[0] remains active"]; |
| 180 | lchan abox lchan [label="LCHAN_ST_WAIT_\nBEFORE_RF_RELEASE\nT3111"]; |
| 181 | ...; |
| 182 | lchan box lchan [label="T3111 expires"]; |
| 183 | lchan box lchan [label="lchan_fsm_pre_rf_release()"]; |
| 184 | lchan abox lchan [label="LCHAN_ST_WAIT_\nRF_RELEASE_ACK\nT3111"]; |
| 185 | ms <= lchan [label="RSL RF Channel Release"]; |
| 186 | ...; |
| 187 | lchan rbox lchan [label="On timeout, continue at: 'On any error', 'unrecoverable'"]; |
| 188 | ...; |
| 189 | ms => lchan [label="RSL RF Channel Release Ack"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 190 | |||; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 191 | --- [label="IF release_in_error"]; |
| 192 | lchan abox lchan [label="LCHAN_ST_WAIT_\nAFTER_ERROR\n(timeout: T3111+2 s, T993111)"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 193 | ...; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 194 | lchan box lchan [label="timer expires"]; |
| 195 | --- [label="END: release_in_error"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 196 | |||; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 197 | lchan abox lchan [label="LCHAN_ST_UNUSED"]; |
| 198 | ts <- lchan [label="TS_EV_LCHAN_UNUSED"]; |
| 199 | |||; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 200 | |||; |
| 201 | |||; |
| 202 | |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 203 | ms rbox mgwep [label="On any error"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 204 | |||; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 205 | --- [label="IF FOR_MS_CHANNEL_REQUEST"]; |
| 206 | ms <= lchan [label="RR Immediate Assign Reject"]; |
| 207 | --- [label="ELSE: FOR_ASSIGNMENT"]; |
| 208 | lchan rbox lchan [label="dispatch\nASSIGNMENT_EV_\nLCHAN_ERROR\n(see Assignment FSM diagrams)"]; |
| 209 | --- [label="ELSE: FOR_HANDOVER"]; |
| 210 | lchan rbox lchan [label="dispatch\nHO_EV_LCHAN_ERROR\n(see Handover FSM diagrams)"]; |
| 211 | --- [label="END"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 212 | |||; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 213 | --- [label="IF fi_rtp present"]; |
| 214 | lchan -> rtp [label="LCHAN_RTP_EV_ROLLBACK"]; |
| 215 | rtp rbox rtp [label="If to-BTS is not established yet, ROLLBACK is synonymous to LCHAN_RTP_EV_RELEASE"]; |
| 216 | rtp rbox rtp [label="If there is no old_lchan, just DLCX instead"]; |
| 217 | rtp abox rtp [label="LCHAN_RTP_ST_ROLLBACK"]; |
| 218 | rtp box rtp [label="connect_mgw_endpoint_to_lchan()\nusing old_lchan"]; |
| 219 | rtp -> mgwep [label="MDCX to-BTS"]; |
| 220 | mgwep rbox mgwep [label="MGCP: MDCX"]; |
| 221 | ...; |
| 222 | mgwep rbox mgwep [label="MGCP: MDCX OK"]; |
| 223 | rtp <- mgwep [label="LCHAN_RTP_EV_MGW_ENDPOINT_CONFIGURED"]; |
| 224 | rtp abox rtp [label="terminate"]; |
| 225 | lchan <- rtp [label="LCHAN_EV_RTP_RELEASED"]; |
| 226 | --- [label="END: fi_rtp present"]; |
| 227 | |||; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 228 | |||; |
| 229 | --- [label="IF unrecoverable error"]; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 230 | lchan abox lchan [label="LCHAN_ST_BORKEN"]; |
| 231 | ms note lchan [label="The broken state usually stays around |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 232 | until the BTS disconnects."]; |
| 233 | ...; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 234 | ms note lchan [label="If an ACK comes in late, for specific BTS models, we may choose to |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 235 | 'repair' the lchan so that it is usable again."]; |
Neels Hofmeyr | 3b5de1b | 2018-06-16 16:08:55 +0200 | [diff] [blame] | 236 | ms -> lchan [label="RF Chan Release ACK"]; |
| 237 | lchan rbox lchan [label="continue above at\nLCHAN_ST_WAIT_\nAFTER_ERROR"]; |
Neels Hofmeyr | 44fcc9f | 2018-05-28 14:29:49 +0200 | [diff] [blame] | 238 | } |