aboutsummaryrefslogtreecommitdiffstats
path: root/doc/lchan.msc
blob: e2caa48758b4605625c8fc73da2d704fb61f6d0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
msc {
	hscale=2;
	ms [label="MS/BTS"], ts [label="BSC timeslot FSM"],
	lchan[label="BSC lchan FSM"], rtp[label="BSC lchan RTP FSM"],mgwep[label="BSC MGW endpoint FSM"];

	ms box mgwep [label="lchan allocation sequence"];
	lchan abox lchan [label="LCHAN_ST_UNUSED"];
	...;
	lchan rbox lchan [label="lchan_activate(activate_info)"];
	lchan note lchan [label="Dispatching event to make sure the lchan FSM permits activation."];
	lchan -> lchan [label="LCHAN_EV_ACTIVATE\ndata = activate_info"];
	lchan abox lchan [label="LCHAN_ST_\nWAIT_TS_READY"];
	ts <- lchan [label="TS_EV_LCHAN_REQUESTED"];
	ts rbox ts [label="Most details omitted. See timeslot FSM diagrams."];
	ts note ts [label="A dyn TS may be in PDCH mode and will asynchronously switch off PDCH first. A
		non-dynamic TS is ready immediately."];
	|||;
	--- [label="IF requires_voice_stream"];
	lchan -> rtp [label="lchan_rtp_fsm_start()"];
	rtp abox rtp [label="allocate\n LCHAN_RTP_ST_\nWAIT_MGW_ENDPOINT_\nAVAILABLE"];
	--- [label="IF no endpoint-CI yet"];
	rtp box rtp [label="gscon_ensure_mgw_endpoint()"];
	rtp -> mgwep [label="mgw_endpoint_ci_add(to-BTS)"];
	rtp -> mgwep [label="CRCX to-BTS"];
	mgwep rbox mgwep [label="MGCP: CRCX"];
	...;
	mgwep rbox mgwep [label="MGCP: CRCX OK"];
	rtp <- mgwep [label="LCHAN_RTP_EV_MGW_ENDPOINT_AVAILABLE"];
	rtp note mgwep [label="The CRCX OK has assigned us a new endpoint CI number"];
	rtp abox rtp [label="LCHAN_RTP_ST_WAIT_LCHAN_READY"];
	--- [label="END: no endpoint-CI yet"];
	--- [label="END: requires_voice_stream"];
	|||;
	...;
	ts -> lchan [label="LCHAN_EV_TS_READY"];
	lchan abox lchan [label="LCHAN_ST_\nWAIT_ACTIV_ACK"];
	--- [label="IF FOR_MS_CHANNEL_REQUEST"];
	ms <= lchan [label="RSL Chan Activ (RSL_ACT_INTRA_IMM_ASS)"];
	--- [label="ELSE: FOR_ASSIGNMENT"];
	ms <= lchan [label="RSL Chan Activ (RSL_ACT_INTRA_NORM_ASS)"];
	--- [label="ELSE: FOR_HANDOVER"];
	ms <= lchan [label="RSL Chan Activ (RSL_ACT_INTER_ASYNC)"];
	--- [label="END"];
	...;
	ms rbox lchan [label="On timeout or Chan Activ NACK, see: 'On any error', 'unrecoverable'"];
	...;
	ms => lchan [label="RSL Chan Activ ACK"];
	lchan box lchan [label="lchan_fsm_post_activ_ack()"];

	--- [label="IF FOR_MS_CHANNEL_REQUEST"];
	ms <= lchan [label="RR Immediate Assignment"];
	--- [label="ELSE: FOR_ASSIGNMENT"];
	lchan rbox lchan [label="dispatch\nASSIGNMENT_EV_\nLCHAN_ACTIVE\n(see Assignment FSM diagrams)"];
	ms <= lchan [label="RR Assignment Command"];
	--- [label="ELSE: FOR_HANDOVER"];
	lchan rbox lchan [label="dispatch\nHO_EV_LCHAN_ACTIVE\n(see Handover FSM diagrams)"];
	--- [label="END"];


	lchan abox lchan [label="LCHAN_ST_WAIT_\nRLL_RTP_ESTABLISH\nT3101"];
	|||;
	|||;
	--- [label="IF requires_voice_stream"];
	lchan -> rtp [label="LCHAN_RTP_EV_LCHAN_READY"];
	|||;
	--- [label="IF ip.access style BTS"];
	rtp abox rtp [label="LCHAN_RTP_ST_WAIT_IPACC_CRCX_ACK"];
	ms <= rtp [label="IPACC CRCX"];
	...;
	ms => rtp [label="IPACC CRCX ACK (BTS RTP port info)"];
	rtp abox rtp [label="LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK"];
	ms <= rtp [label="IPACC MDCX (MGW RTP port info)"];
	...;
	ms => rtp [label="IPACC MDCX ACK"];
	--- [label="END ip.access style BTS"];
	|||;
	rtp box rtp [label="lchan_rtp_fsm_switch_rtp()"];
	|||;
	--- [label="IF wait_before_switching_rtp"];
	rtp note rtp [label="During Handover, wait for HO DETECT before redirecting an existing endpoint
		CI towards the new lchan."];
	rtp abox rtp [label="LCHAN_RTP_ST_WAIT_READY_TO_SWITCH_RTP"];
	...;
	ms => rtp [label="HO DETECT (via Handover FSM)"];
	--- [label="END: wait_before_switching_rtp"];
	|||;
	rtp abox rtp [label="LCHAN_RTP_ST_WAIT_MGW_ENDPOINT_CONFIGURED"];
	rtp box rtp [label="connect_mgw_endpoint_to_lchan()"];
	rtp -> mgwep [label="MDCX to-BTS"];
	mgwep rbox mgwep [label="MGCP: MDCX"];
	...;
	mgwep rbox mgwep [label="MGCP: MDCX OK"];
	rtp <- mgwep [label="LCHAN_RTP_EV_MGW_ENDPOINT_CONFIGURED"];
	rtp abox rtp [label="LCHAN_RTP_ST_READY"];
	lchan <- rtp [label="LCHAN_EV_RTP_READY"];
	rtp note rtp [label="RTP FSM stays ready for Rollback until final establish event"];
	...;
	lchan -> rtp [label="LCHAN_RTP_EV_ESTABLISHED\nvia gscon_change_primary_lchan()"];
	rtp abox rtp [label="LCHAN_RTP_ST_\nESTABLISHED"];
	--- [label="END: requires_voice_stream"];
	|||;
	|||;

	...;
	ms => lchan [label="RLL Establish Ind"];
	lchan abox lchan [label="LCHAN_ST_\nESTABLISHED"];
	lchan box lchan [label="lchan_on_fully_established()"];
	--- [label="IF FOR_MS_CHANNEL_REQUEST"];
	ms note lchan [label="No action required. The MS will have sent an L3 message in the RLL
		Establish Ind and is then free to dispatch DTAP."];
	--- [label="ELSE: FOR_ASSIGNMENT"];
	lchan rbox lchan [label="dispatch\nASSIGNMENT_EV_\nLCHAN_ESTABLISHED\n(see Assignment FSM diagrams)"];
	--- [label="ELSE: FOR_HANDOVER"];
	lchan rbox lchan [label="dispatch\nHO_EV_LCHAN_ESTABLISHED\n(see Handover FSM diagrams)"];
	--- [label="END"];
	...;
	--- [label="IF requires_voice_stream"];
	lchan rbox lchan [label="Assignment or Handover FSM:"];
	lchan -> mgwep [label="CRCX/MDCX to-MSC"];
	...;
	lchan <- mgwep [label="OK"];
	lchan box lchan [label="gscon_change_primary_lchan()"];
	lchan -> rtp [label="LCHAN_RTP_EV_ESTABLISHED"];
	rtp abox rtp [label="LCHAN_RTP_ST_\nESTABLISHED"];
	rtp box rtp [label="Forget any Rollback info"];
	--- [label="END: requires_voice_stream"];

	...;
	...;
	...;

	ms rbox mgwep [label="When the MS or BTS release the lchan"];
	lchan abox lchan [label="LCHAN_ST_\nESTABLISHED"];
	ms -> lchan [label="RLL Release Ind for SAPI=0"];
	lchan abox lchan [label="LCHAN_ST_WAIT_RLL_RTP_RELEASED"];
	lchan rbox lchan [label="Continue at 'common release' below"];
	...;
	...;
	ms rbox mgwep [label="When the BSC decides to release the lchan"];
	lchan box lchan [label="lchan_release()"];
	lchan abox lchan [label="LCHAN_ST_WAIT_RLL_RTP_RELEASED"];
	ms <= lchan [label="RR Release"];
	lchan rbox lchan [label="common release"];
	--- [label="IF RTP FSM present"];
	lchan -> rtp [label="LCHAN_RTP_EV_RELEASE"];
	--- [label="END: RTP FSM present"];
	ms <= lchan [label="RSL Deactivate SACCH"];
	ms <= lchan [label="RSL Release Request (Local End)",ID="for each SAPI except [0]"];
	lchan note lchan [label="for ms->nokia.no_loc_rel_cnf we do not expect Release Confirm
		messages and immediately mark all SAPIs as released"];

	...;
	lchan <- rtp [label="LCHAN_EV_RTP_RELEASED"];
	...;
	ms => lchan [label="RLL Release Confirm",ID="for each SAPI except [0]"];
	...;
	lchan box lchan [label="Stay in\nLCHAN_ST_WAIT_\nRLL_RTP_RELEASED\nuntil only SAPI[0] remains active"];
	lchan abox lchan [label="LCHAN_ST_WAIT_\nBEFORE_RF_RELEASE\nT3111"];
	...;
	lchan box lchan [label="T3111 expires"];
	lchan box lchan [label="lchan_fsm_pre_rf_release()"];
	lchan abox lchan [label="LCHAN_ST_WAIT_\nRF_RELEASE_ACK\nT3111"];
	ms <= lchan [label="RSL RF Channel Release"];
	...;
	lchan rbox lchan [label="On timeout, continue at: 'On any error', 'unrecoverable'"];
	...;
	ms => lchan [label="RSL RF Channel Release Ack"];
	|||;
	--- [label="IF release_in_error"];
	lchan abox lchan [label="LCHAN_ST_WAIT_\nAFTER_ERROR\n(timeout: T3111+2 s, T993111)"];
	...;
	lchan box lchan [label="timer expires"];
	--- [label="END: release_in_error"];
	|||;
	lchan abox lchan [label="LCHAN_ST_UNUSED"];
	ts <- lchan [label="TS_EV_LCHAN_UNUSED"];
	|||;
	|||;
	|||;

	ms rbox mgwep [label="On any error"];
	|||;
	--- [label="IF FOR_MS_CHANNEL_REQUEST"];
	ms <= lchan [label="RR Immediate Assign Reject"];
	--- [label="ELSE: FOR_ASSIGNMENT"];
	lchan rbox lchan [label="dispatch\nASSIGNMENT_EV_\nLCHAN_ERROR\n(see Assignment FSM diagrams)"];
	--- [label="ELSE: FOR_HANDOVER"];
	lchan rbox lchan [label="dispatch\nHO_EV_LCHAN_ERROR\n(see Handover FSM diagrams)"];
	--- [label="END"];
	|||;
	--- [label="IF fi_rtp present"];
	lchan -> rtp [label="LCHAN_RTP_EV_ROLLBACK"];
	rtp rbox rtp [label="If to-BTS is not established yet, ROLLBACK is synonymous to LCHAN_RTP_EV_RELEASE"];
	rtp rbox rtp [label="If there is no old_lchan, just DLCX instead"];
	rtp abox rtp [label="LCHAN_RTP_ST_ROLLBACK"];
	rtp box rtp [label="connect_mgw_endpoint_to_lchan()\nusing old_lchan"];
	rtp -> mgwep [label="MDCX to-BTS"];
	mgwep rbox mgwep [label="MGCP: MDCX"];
	...;
	mgwep rbox mgwep [label="MGCP: MDCX OK"];
	rtp <- mgwep [label="LCHAN_RTP_EV_MGW_ENDPOINT_CONFIGURED"];
	rtp abox rtp [label="terminate"];
	lchan <- rtp [label="LCHAN_EV_RTP_RELEASED"];
	--- [label="END: fi_rtp present"];
	|||;
	|||;
	--- [label="IF unrecoverable error"];
	lchan abox lchan [label="LCHAN_ST_BORKEN"];
	ms note lchan [label="The broken state usually stays around
		until the BTS disconnects."];
	...;
	ms note 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."];
	ms -> lchan [label="RF Chan Release ACK"];
	lchan rbox lchan [label="continue above at\nLCHAN_ST_WAIT_\nAFTER_ERROR"];
}