blob: 8c8b66c99c88dd804e26b1f55ecfa1187963336d [file] [log] [blame]
Harald Welte801ed1a2023-04-30 15:07:00 +10001module BSC_Tests_ASCI {
2
3/* Integration Tests for OsmoBSC
4 * (C) 2023 by Harald Welte <laforge@gnumonks.org>
5 * All rights reserved.
6 *
7 * Released under the terms of GNU General Public License, Version 2 or
8 * (at your option) any later version.
9 *
10 * SPDX-License-Identifier: GPL-2.0-or-later
11 *
12 * This test suite tests OsmoBSC while emulating both multiple BTS + MS as
13 * well as the MSC. See README for more details.
14 */
15
16import from General_Types all;
17import from Osmocom_Types all;
18import from GSM_Types all;
19import from Misc_Helpers all;
20
21import from BSC_Tests all;
22import from BSSAP_Types all;
23import from BSSAP_CodecPort all;
24import from BSSMAP_Templates all;
25import from RSL_Types all;
26import from RSL_Emulation all;
27import from MGCP_Emulation all;
28
29import from MobileL3_CommonIE_Types all;
30import from MobileL3_Types all;
31import from L3_Templates all;
32import from GSM_RR_Types all;
33
34import from MSC_ConnectionHandler all;
35import from RAN_Adapter all;
36import from RAN_Emulation all;
37
38const charstring COORD_VGCS_CALL_EST := "VGCS_CALL_EST";
39const charstring COORD_VGCS_CALL_REL := "VGCS_CALL_REL";
40const charstring COORD_VGCS_CHANNEL_REL := "VGCS_CHANNEL_REL";
41const charstring COORD_VGCS_UPLINK_FREE := "VGCS_UPLINK_FREE";
42const charstring COORD_VGCS_UPLINK_BUSY := "VGCS_UPLINK_BUSY";
43const charstring COORD_VGCS_ASSIGN_RES := "VGCS_ASSIGN_RES";
44const charstring COORD_VGCS_ASSIGN_FAIL := "VGCS_ASSIGN_FAIL";
Andreas Eversberg28d6b812023-07-20 13:07:26 +020045const charstring COORD_UPLINK_REQUEST_CONFIRM := "UPLINK_REQUEST_CONFIRM";
Harald Welte801ed1a2023-04-30 15:07:00 +100046
47template (value) DescriptiveGroupOrBroadcastCallReference_V
48 ts_BSSMAP_IE_GroupCallRef(integer cr,
49 BIT1 sf,
50 BIT1 af,
51 BIT3 prio,
52 BIT4 ci) := {
53 binaryCodingOfGroupOrBroadcastCallReference := int2bit(cr, 27),
54 sF := sf,
55 aF := af,
56 callPriority := prio,
57 cipheringInformation := ci,
58 spare := '0000'B
59}
60
61function f_gen_asci_ass_req(integer bssap_idx := 0,
62 template (value) BSSMAP_IE_ChannelType ch_type := ts_BSSMAP_IE_ChannelType,
63 template (value) OCT1 ass_requirement := '00'O,
64 template (value) BSSMAP_IE_CellIdentifier cell_id := ts_CellId_CI(0),
65 template (value) GroupCallRef group_call_ref := '0000001000'O,
66 charstring aoip_tla :="1.2.3.4")
67runs on MSC_ConnHdlr return template (value) PDU_BSSAP {
68 if (mp_bssap_cfg[bssap_idx].transport == BSSAP_TRANSPORT_AoIP) {
69 var template (value) BSSMAP_IE_AoIP_TransportLayerAddress tla :=
70 f_ts_BSSMAP_IE_AoIP_TLA(aoip_tla, 2342);
71 var template (value) BSSMAP_IE_SpeechCodecList codec_list :=
72 ts_BSSMAP_IE_CodecList({ts_CodecFR});
73 return ts_BSSMAP_VGCS_VBS_AssignmentReq(ch_type, ass_requirement, cell_id,
74 group_call_ref, omit, tla, omit, codec_list);
75 } else {
76 var template (value) BSSMAP_IE_CircuitIdentityCode cic := ts_BSSMAP_IE_CIC(0,1);
77 return ts_BSSMAP_VGCS_VBS_AssignmentReq(ch_type, ass_requirement, cell_id,
78 group_call_ref, cic, omit, omit, omit);
79 }
80}
81
82/*
83 * VGCS/VBS call controling connection
84 */
85
Andreas Eversberg28d6b812023-07-20 13:07:26 +020086private function f_delay_msc() runs on MSC_ConnHdlr {
87 var PDU_BSSAP rx_bssap;
88 timer T := 2.0;
89 T.start;
90 alt {
91 [] BSSAP.receive(tr_BSSAP_BSSMAP) -> value rx_bssap {
92 setverdict(fail, "Got BSSAP message from BSC. This is unexpected:", rx_bssap);
93 }
94 [] T.timeout { }
95 }
96}
97
Harald Welte801ed1a2023-04-30 15:07:00 +100098private function f_tc_vgcs_vbs_setup(charstring id) runs on MSC_ConnHdlr {
99 var PDU_BSSAP rx_bssap;
100 var template (value) DescriptiveGroupOrBroadcastCallReference_V callref :=
101 ts_BSSMAP_IE_GroupCallRef(11, '1'B, '0'B, '000'B, '0000'B);
102 var template (value) PDU_BSSAP setup_req := ts_BSSMAP_VGCS_VBS_Setup(bit2oct(encvalue(callref)), omit);
103 var boolean uplink_free := false;
104 var boolean uplink_busy := false;
105 var boolean uplink_req := false;
106 var boolean uplink_req_conf := false;
107 var boolean uplink_rel_ind := false;
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200108 var boolean uplink_rel_ind_failure := false;
Harald Welte801ed1a2023-04-30 15:07:00 +1000109 var boolean assign_res := false;
110 var boolean assign_fail := false;
111 /* Note: This timer is used to receive messages after the expected event.
Andreas Eversberg35874922023-07-07 13:44:04 +0200112 * After timeout, the outcome of the test is checked.
113 * The timeout must be large enough, so all the messages pass before checking the outcome. */
114 timer T := 1.0;
Harald Welte801ed1a2023-04-30 15:07:00 +1000115
116 /* Wait for the COORD ports to be connected. */
117 f_sleep(1.0);
118
119 /* VGCS/VBS SETUP REQ in SCCP CR (must be the first message) */
120 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc, setup_req));
121 BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
122
123 alt {
124 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_SetupAck) -> value rx_bssap {
125 log("VGCS: got setup ack");
126 if (not g_pars.asci_test.vgcs_setup_ok) {
127 COORD.send(COORD_VGCS_CALL_EST);
128 repeat;
129 }
130 BSSAP.send(ts_BSSMAP_ClearCommand(0));
131 BSSAP.receive(tr_BSSMAP_ClearComplete);
132 BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
133 setverdict(pass);
134 return;
135 }
136 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_SetupRefuse) -> value rx_bssap {
137 log("VGCS: got setup refuse");
138 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
139 "Expected ASCI Setup to succeed, but got fail");
140 return;
141 }
142 [] BSSAP.receive(tr_BSSMAP_UplinkReq) -> value rx_bssap {
143 log("VGCS: received uplink req");
144 uplink_req := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200145 if (g_pars.asci_test.delay_msc) {
146 log("VGCS: delay uplink req ack");
147 f_delay_msc();
148 }
Andreas Eversberga29b2f32023-07-20 17:28:41 +0200149 if (g_pars.asci_test.vgcs_uplink_reject) {
150 log("VGCS: sending uplink rej cmd");
151 BSSAP.send(ts_BSSMAP_UplinkRejCmd(9));
152 } else {
153 log("VGCS: sending uplink req ack");
154 BSSAP.send(ts_BSSMAP_UplinkReqAck(omit));
155 }
156 if (g_pars.asci_test.vgcs_talker_req or
157 g_pars.asci_test.vgcs_uplink_reject) {
Harald Welte801ed1a2023-04-30 15:07:00 +1000158 T.start;
159 }
160 repeat;
161 }
162 [] BSSAP.receive(tr_BSSMAP_UplinkReqConf(?, omit, '1234'O)) -> value rx_bssap {
163 log("VGCS: received uplink req confirm");
164 uplink_req_conf := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200165 COORD.send(COORD_UPLINK_REQUEST_CONFIRM);
Harald Welte801ed1a2023-04-30 15:07:00 +1000166 if (g_pars.asci_test.vgcs_talker_est) {
167 T.start;
168 }
169 repeat;
170 }
171 [] BSSAP.receive(tr_BSSMAP_UplinkRelInd(GSM0808_CAUSE_CALL_CONTROL, omit)) -> value rx_bssap {
172 log("VGCS: received uplink rel ind");
173 uplink_rel_ind := true;
174 if (g_pars.asci_test.vgcs_talker_rel) {
175 T.start;
176 }
177 repeat;
178 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200179 [] BSSAP.receive(tr_BSSMAP_UplinkRelInd(GSM0808_CAUSE_RADIO_INTERFACE_FAILURE, omit)) -> value rx_bssap {
180 log("VGCS: received uplink rel ind, caused by failure");
181 uplink_rel_ind_failure := true;
182 if (g_pars.asci_test.vgcs_talker_fail) {
183 T.start;
184 }
185 repeat;
186 }
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200187 [] BSSAP.receive(tr_BSSMAP_UplinkRelInd(?, omit)) -> value rx_bssap {
188 setverdict(fail, "VGCS: received uplink rel ind, caused by failure with invalid cause: ", rx_bssap);
189 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000190 [] COORD.receive(COORD_VGCS_ASSIGN_RES) {
191 log("VGCS: got assignment result at call control");
192 assign_res := true;
193 if (g_pars.asci_test.vgcs_assign_ok) {
194 T.start;
195 }
Andreas Eversberg35874922023-07-07 13:44:04 +0200196 if (g_pars.asci_test.vgcs_uplink_seized or
197 g_pars.asci_test.vgcs_uplink_release) {
198 log("VGCS: sending Uplink Seized Cmd");
199 BSSAP.send(ts_BSSMAP_UplinkSeizedCmd(9, omit, omit, omit));
Andreas Eversberge1506022023-07-20 18:08:33 +0200200 T.start;
Andreas Eversberg35874922023-07-07 13:44:04 +0200201 }
202 if (g_pars.asci_test.vgcs_uplink_release) {
203 log("VGCS: sending Uplink Release Cmd");
204 BSSAP.send(ts_BSSMAP_UplinkRelCmd(9));
Andreas Eversberge1506022023-07-20 18:08:33 +0200205 T.start;
Andreas Eversberg35874922023-07-07 13:44:04 +0200206 }
207 if (g_pars.asci_test.vgcs_uplink_seized or
208 g_pars.asci_test.vgcs_uplink_release) {
209 T.start;
210 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000211 repeat;
212 }
213 [] COORD.receive(COORD_VGCS_ASSIGN_FAIL) {
214 log("VGCS: got assignment failure at call control");
215 assign_fail := true;
216 if (g_pars.asci_test.vgcs_assign_fail) {
217 T.start;
218 }
219 repeat;
220 }
221 [] COORD.receive(COORD_VGCS_UPLINK_FREE) {
222 log("VGCS: Got UPLINK FREE at call control");
223 uplink_busy := false;
224 uplink_free := true;
225 repeat;
226 }
227 [] COORD.receive(COORD_VGCS_UPLINK_BUSY) {
228 log("VGCS: Got UPLINK BUSY at call control");
229 uplink_busy := true;
230 uplink_free := false;
231 repeat;
232 }
233 [] T.timeout { }
234 }
235
236 /* After timeout: Release Channel and Call and see if the outcome of the test is as expected. */
237 COORD.send(COORD_VGCS_CHANNEL_REL);
238 BSSAP.send(ts_BSSMAP_ClearCommand(0));
239 BSSAP.receive(tr_BSSMAP_ClearComplete);
240 BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
241
242 if (g_pars.asci_test.vgcs_assign_ok) {
243 if (not assign_res) {
244 setverdict(fail, "VGCS: Assignment did not pass as expected!");
245 return;
246 }
247 if (not uplink_free) {
248 setverdict(fail, "VGCS: Uplink not free as expected!");
249 return;
250 }
251 log("VGCS: Channel assigned and uplink marked free as expected!");
252 setverdict(pass);
253 return;
254 }
255 if (g_pars.asci_test.vgcs_assign_fail) {
256 if (not assign_fail) {
257 setverdict(fail, "VGCS: Assignment did not fail as expected!");
258 return;
259 }
260 log("VGCS: Channel assignment failed as expected!");
261 setverdict(pass);
262 return;
263 }
264 if (g_pars.asci_test.vgcs_talker_req) {
265 if (not uplink_req) {
266 setverdict(fail, "VGCS: No uplink request as expected!");
267 return;
268 }
Andreas Eversberg5e3dd362023-07-07 12:09:00 +0200269 /* UPLINK BUSY is automatically sent by BTS, but not by BSC. */
270 if (uplink_busy) {
271 setverdict(fail, "VGCS: Uplink set to busy, this is not expected!");
Harald Welte801ed1a2023-04-30 15:07:00 +1000272 return;
273 }
274 log("VGCS: Uplink requested and uplink marked busy as expected!");
275 setverdict(pass);
276 return;
277 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200278 if (g_pars.asci_test.vgcs_talker_fail) {
279 if (not uplink_rel_ind_failure) {
280 setverdict(fail, "VGCS: No uplink release indication as expected!");
281 return;
282 }
283 if (not uplink_free) {
284 setverdict(fail, "VGCS: Uplink not free as expected!");
285 return;
286 }
287 log("VGCS: Uplink release and uplink marked free as expected!");
288 setverdict(pass);
289 return;
290 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000291 if (g_pars.asci_test.vgcs_talker_est) {
292 if (not uplink_req_conf) {
293 setverdict(fail, "VGCS: No uplink request confirm as expected!");
294 return;
295 }
Andreas Eversberg5e3dd362023-07-07 12:09:00 +0200296 /* UPLINK BUSY is automatically sent by BTS, but not by BSC. */
297 if (uplink_busy) {
298 setverdict(fail, "VGCS: Uplink set to busy, this is not expected!");
Harald Welte801ed1a2023-04-30 15:07:00 +1000299 return;
300 }
301 log("VGCS: Uplink established and uplink marked busy as expected!");
302 setverdict(pass);
303 return;
304 }
305 if (g_pars.asci_test.vgcs_talker_rel) {
306 if (not uplink_rel_ind) {
307 setverdict(fail, "VGCS: No uplink release indication as expected!");
308 return;
309 }
310 if (not uplink_free) {
311 setverdict(fail, "VGCS: Uplink not free as expected!");
312 return;
313 }
314 log("VGCS: Uplink established+released and uplink marked free as expected!");
315 setverdict(pass);
316 return;
317 }
Andreas Eversberg35874922023-07-07 13:44:04 +0200318 if (g_pars.asci_test.vgcs_uplink_seized) {
319 if (not uplink_busy) {
320 setverdict(fail, "VGCS: Uplink not busy as expected!");
321 return;
322 }
323 log("VGCS: Uplink established+released and uplink marked free as expected!");
324 setverdict(pass);
325 return;
326 }
327 if (g_pars.asci_test.vgcs_uplink_release) {
328 if (not uplink_free) {
329 setverdict(fail, "VGCS: Uplink not free as expected!");
330 return;
331 }
332 log("VGCS: Uplink established+released and uplink marked free as expected!");
333 setverdict(pass);
334 return;
335 }
Andreas Eversberga29b2f32023-07-20 17:28:41 +0200336 if (g_pars.asci_test.vgcs_uplink_reject) {
337 if (not uplink_free) {
338 setverdict(fail, "VGCS: Uplink not free as expected!");
339 return;
340 }
341 log("VGCS: Uplink rejected and uplink marked free as expected!");
342 setverdict(pass);
343 return;
344 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000345}
346
347/*
348 * VGCS/VBS resource controling connection
349 */
350
351private altstep as_eat_rsl_data() runs on MSC_ConnHdlr {
Andreas Eversbergc0870e52023-07-07 12:06:24 +0200352 [] RSL.receive(tr_RSL_UNITDATA_REQ(g_chan_nr, ?, ?)) {
353 log("VGCS: Got RSL UNITDATA REQ on channel");
354 repeat;
355 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000356 [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, ?)) {
357 log("VGCS: Got RSL DATA REQ on channel");
358 repeat;
359 }
Andreas Eversberga86ae662024-06-05 16:11:23 +0200360 [] RSL.receive(tr_RSL_SACCH_INF_MOD(g_chan_nr, ?)) {
361 log("VGCS: Got RSL SACCH INFO MODIFY on channel");
362 repeat;
363 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000364}
365
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200366private function f_delay_bts() runs on MSC_ConnHdlr {
367 timer T := 2.0;
368 T.start;
369 alt {
370 [] COORD.receive(COORD_UPLINK_REQUEST_CONFIRM) {
371 setverdict(fail, "Got UPLINK REQUEST CONFIRM from BSC. This is unexpected.");
372 }
373 [] T.timeout { }
374 }
375}
376
Harald Welte801ed1a2023-04-30 15:07:00 +1000377private function f_tc_asci_assignment(charstring id) runs on MSC_ConnHdlr {
378 var PDU_BSSAP rx_bssap;
379 /* Hack: the proper way would be to wait for the BSSMAP VGCS Assignment Result and extract the
380 * actual assigned chan_nr from it. But osmo-bsc starts acting on the lchan even before we get a
381 * chance to evaluate the BSSMAP Handover Request ACK. So we need to assume that osmo-bsc will
382 * activate TS 1 and already set up this lchan's RSL emulation
383 * before we get started. */
384 var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(1, RSL_CHAN_NR_Bm_ACCH));
385 f_rslem_register(0, new_chan_nr);
386 g_chan_nr := new_chan_nr;
387 var uint3_t expect_target_tsc := c_BtsParams[0].tsc;
388 var default eat_rsl_data;
389
390 /* Wait for the COORD ports to be connected. */
391 f_sleep(1.0);
392
393 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
394 f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);
395 var default as_media := activate(as_Media());
396
397 log("VGCS: wait for establishment of call controling connection");
398 COORD.receive(COORD_VGCS_CALL_EST);
399 log("VGCS: got establishment of call controling connection");
400
401 /* TODO: Encryption */
402 var template (value) BSSMAP_IE_ChannelType req_ch_type := ts_BSSMAP_IE_ChannelType;
403 var template BSSMAP_IE_ChannelType res_ch_type := tr_BSSMAP_IE_ChannelType('0001'B, ChRate_TCHF, Spdi_TCHF_FR);
404 var template (value) BSSMAP_IE_CellIdentifier req_cell_id := ts_CellId_CI(0);
405 var template BSSMAP_IE_CellIdentifier res_cell_id := tr_CellId_CI(0);
406 var template (value) DescriptiveGroupOrBroadcastCallReference_V callref :=
407 ts_BSSMAP_IE_GroupCallRef(11, '1'B, '0'B, '000'B, '0000'B);
408 if (g_pars.asci_test.vgcs_assign_fail) {
409 callref := ts_BSSMAP_IE_GroupCallRef(10, '1'B, '0'B, '000'B, '0000'B);
410 }
411 var template (value) PDU_BSSAP ass_req := f_gen_asci_ass_req(ch_type := req_ch_type, cell_id := req_cell_id,
412 group_call_ref := bit2oct(encvalue(callref)));
413 /* VGCS/VBS ASS REQ in SCCP CR (must be the first message) */
414 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc, ass_req));
415 BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
416
417 alt {
418 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentRes(res_ch_type, res_cell_id)) -> value rx_bssap {
419 log("VGCS: got assignment result on channel");
420 COORD.send(COORD_VGCS_ASSIGN_RES);
421 if (g_pars.asci_test.vgcs_talker_req or
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200422 g_pars.asci_test.vgcs_talker_fail or
Harald Welte801ed1a2023-04-30 15:07:00 +1000423 g_pars.asci_test.vgcs_talker_est or
Andreas Eversberga29b2f32023-07-20 17:28:41 +0200424 g_pars.asci_test.vgcs_talker_rel or
425 g_pars.asci_test.vgcs_uplink_reject) {
Harald Welte801ed1a2023-04-30 15:07:00 +1000426 log("VGCS: sending talker det");
427 RSL.send(ts_RSL_TALKER_DET(g_chan_nr));
428 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200429 if (g_pars.asci_test.vgcs_talker_fail) {
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200430 if (g_pars.asci_test.delay_bts) {
431 log("VGCS: delay sending RSL failure ind");
432 f_delay_bts();
433 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200434 log("VGCS: sending RSL failure ind");
435 RSL.send(ts_RSL_CONN_FAIL_IND(g_chan_nr, RSL_ERR_TALKER_ACC_FAIL));
436 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000437 if (g_pars.asci_test.vgcs_talker_est or
438 g_pars.asci_test.vgcs_talker_rel) {
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200439 if (g_pars.asci_test.delay_bts) {
440 log("VGCS: delay sending RSL estblish ind");
441 f_delay_bts();
442 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000443 log("VGCS: sending RSL etabish ind");
444 RSL.send(ts_RSL_EST_IND(g_chan_nr, ts_RslLinkID_DCCH(0), '1234'O));
445 }
446 if (g_pars.asci_test.vgcs_talker_rel) {
447 log("VGCS: sending RSL release ind");
448 RSL.send(ts_RSL_REL_IND(g_chan_nr, ts_RslLinkID_DCCH(0)));
449 }
450 repeat;
451 }
452 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentFail) -> value rx_bssap {
453 log("VGCS: got assignment failure on channel");
454 COORD.send(COORD_VGCS_ASSIGN_FAIL);
455 log("VGCS: got release order after assignment failure");
456 COORD.receive(COORD_VGCS_CHANNEL_REL);
457 BSSAP.send(ts_BSSMAP_ClearCommand(0));
458 BSSAP.receive(tr_BSSMAP_ClearComplete);
459 BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
460 return;
461 }
462 [] COORD.receive(COORD_VGCS_CHANNEL_REL) {
463 log("VGCS: got release order of resource controling connection");
464 eat_rsl_data := activate(as_eat_rsl_data());
465 f_perform_clear_no_rr_rel();
466 deactivate(eat_rsl_data);
467 return;
468 }
Andreas Eversbergc0870e52023-07-07 12:06:24 +0200469 [] RSL.receive(tr_RSL_UNITDATA_REQ(g_chan_nr, ?, '082B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O)) {
Harald Welte801ed1a2023-04-30 15:07:00 +1000470 log("VGCS: Got UPLINK FREE on channel");
471 COORD.send(COORD_VGCS_UPLINK_FREE);
472 repeat;
473 }
Andreas Eversbergc0870e52023-07-07 12:06:24 +0200474 [] RSL.receive(tr_RSL_UNITDATA_REQ(g_chan_nr, ?, '062A'O)) {
Harald Welte801ed1a2023-04-30 15:07:00 +1000475 log("VGCS: Got UPLINK BUSY on channel");
476 COORD.send(COORD_VGCS_UPLINK_BUSY);
477 repeat;
478 }
Andreas Eversberga86ae662024-06-05 16:11:23 +0200479 [] RSL.receive(tr_RSL_SACCH_INF_MOD(g_chan_nr, ?)) {
480 log("VGCS: Got RSL SACCH INFO MODIFY on channel");
481 repeat;
482 }
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200483 [] COORD.receive(COORD_UPLINK_REQUEST_CONFIRM) { repeat; }
Harald Welte801ed1a2023-04-30 15:07:00 +1000484 }
485
486 /* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
487
488 /* we're sure that the channel activation is done now, verify the parameters in it */
489 var RSL_Message chan_act := f_rslem_get_last_act(RSL_PROC, 0, g_chan_nr);
490 /* TODO: Encryption */
491 f_chan_act_verify_tsc(chan_act, expect_target_tsc);
492
493 if (ispresent(rx_bssap.pdu.bssmap.vGCS_VBSAssignmentResult.speechCodec)) {
494 if (not g_pars.aoip) {
495 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
496 "Expected no Speech Codec (Chosen)");
497 }
498 } else {
499 if (g_pars.aoip) {
500 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
501 "Expected Speech Codec (Chosen)");
502 }
503 }
504
505}
506
507testcase TC_vgcs_vbs_setup_only() runs on test_CT {
508 var MSC_ConnHdlr call_conn;
509 var TestHdlrParams pars := f_gen_test_hdlr_pars();
510
511 f_init(1, true);
512
513 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
514 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
515
516 pars.asci_test.vgcs_setup_ok := true;
517
518 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
519
520 call_conn.done;
521
522 f_shutdown_helper();
523}
524
525testcase TC_vgcs_vbs_assignment() runs on test_CT {
526 var MSC_ConnHdlr call_conn, chan_conn;
527 var TestHdlrParams pars := f_gen_test_hdlr_pars();
528
529 f_init(1, true);
530
531 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
532 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
533
534 pars.asci_test.vgcs_assign_ok := true;
535
536 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
537 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
538 /* Connect COORD ports of both functions. The functions will delay before using them. */
539 connect(call_conn:COORD, chan_conn:COORD);
540
541 call_conn.done;
542 chan_conn.done;
543
544 f_shutdown_helper();
545}
546
547testcase TC_vgcs_vbs_assignment_fail() runs on test_CT {
548 var MSC_ConnHdlr call_conn, chan_conn;
549 var TestHdlrParams pars := f_gen_test_hdlr_pars();
550
551 f_init(1, true);
552
553 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
554 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
555
556 pars.asci_test.vgcs_assign_fail := true;
557
558 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
559 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
560 /* Connect COORD ports of both functions. The functions will delay before using them. */
561 connect(call_conn:COORD, chan_conn:COORD);
562
563 call_conn.done;
564 chan_conn.done;
565
566 f_shutdown_helper();
567}
568
569testcase TC_vgcs_vbs_talker_req() runs on test_CT {
570 var MSC_ConnHdlr call_conn, chan_conn;
571 var TestHdlrParams pars := f_gen_test_hdlr_pars();
572
573 f_init(1, true);
574
575 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
576 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
577
578 pars.asci_test.vgcs_talker_req := true;
579
580 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
581 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
582 /* Connect COORD ports of both functions. The functions will delay before using them. */
583 connect(call_conn:COORD, chan_conn:COORD);
584
585 call_conn.done;
586 chan_conn.done;
587
588 f_shutdown_helper();
589}
590
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200591testcase TC_vgcs_vbs_talker_fail() runs on test_CT {
592 var MSC_ConnHdlr call_conn, chan_conn;
593 var TestHdlrParams pars := f_gen_test_hdlr_pars();
594
595 f_init(1, true);
596
597 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
598 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
599
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200600 /* MSC sends acknowledge before link on BTS fail. */
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200601 pars.asci_test.vgcs_talker_fail := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200602 pars.asci_test.delay_bts := true;
603
604 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
605 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
606 /* Connect COORD ports of both functions. The functions will delay before using them. */
607 connect(call_conn:COORD, chan_conn:COORD);
608
609 call_conn.done;
610 chan_conn.done;
611
612 f_shutdown_helper();
613}
614
615testcase TC_vgcs_vbs_talker_fail_late_msc() runs on test_CT {
616 var MSC_ConnHdlr call_conn, chan_conn;
617 var TestHdlrParams pars := f_gen_test_hdlr_pars();
618
619 f_init(1, true);
620
621 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
622 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
623
624 /* MSC sends acknowledge after link on BTS fail. */
625 pars.asci_test.vgcs_talker_fail := true;
626 pars.asci_test.delay_msc := true;
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200627
628 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
629 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
630 /* Connect COORD ports of both functions. The functions will delay before using them. */
631 connect(call_conn:COORD, chan_conn:COORD);
632
633 call_conn.done;
634 chan_conn.done;
635
636 f_shutdown_helper();
637}
638
Harald Welte801ed1a2023-04-30 15:07:00 +1000639testcase TC_vgcs_vbs_talker_est() runs on test_CT {
640 var MSC_ConnHdlr call_conn, chan_conn;
641 var TestHdlrParams pars := f_gen_test_hdlr_pars();
642
643 f_init(1, true);
644
645 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
646 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
647
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200648 /* MSC sends acknowledge before BTS establishes the uplink. */
Harald Welte801ed1a2023-04-30 15:07:00 +1000649 pars.asci_test.vgcs_talker_est := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200650 pars.asci_test.delay_bts := true;
651
652 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
653 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
654 /* Connect COORD ports of both functions. The functions will delay before using them. */
655 connect(call_conn:COORD, chan_conn:COORD);
656
657 call_conn.done;
658 chan_conn.done;
659
660 f_shutdown_helper();
661}
662
663testcase TC_vgcs_vbs_talker_est_late_msc() runs on test_CT {
664 var MSC_ConnHdlr call_conn, chan_conn;
665 var TestHdlrParams pars := f_gen_test_hdlr_pars();
666
667 f_init(1, true);
668
669 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
670 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
671
672 /* MSC sends acknowledge after BTS established the uplink. */
673 pars.asci_test.vgcs_talker_est := true;
674 pars.asci_test.delay_msc := true;
Harald Welte801ed1a2023-04-30 15:07:00 +1000675
676 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
677 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
678 /* Connect COORD ports of both functions. The functions will delay before using them. */
679 connect(call_conn:COORD, chan_conn:COORD);
680
681 call_conn.done;
682 chan_conn.done;
683
684 f_shutdown_helper();
685}
686
687testcase TC_vgcs_vbs_talker_rel() runs on test_CT {
688 var MSC_ConnHdlr call_conn, chan_conn;
689 var TestHdlrParams pars := f_gen_test_hdlr_pars();
690
691 f_init(1, true);
692
693 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
694 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
695
696 pars.asci_test.vgcs_talker_rel := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200697 pars.asci_test.delay_bts := true;
698
699 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
700 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
701 /* Connect COORD ports of both functions. The functions will delay before using them. */
702 connect(call_conn:COORD, chan_conn:COORD);
703
704 call_conn.done;
705 chan_conn.done;
706
707 f_shutdown_helper();
708}
709
710testcase TC_vgcs_vbs_talker_rel_late_msc() runs on test_CT {
711 var MSC_ConnHdlr call_conn, chan_conn;
712 var TestHdlrParams pars := f_gen_test_hdlr_pars();
713
714 f_init(1, true);
715
716 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
717 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
718
719 pars.asci_test.vgcs_talker_rel := true;
720 pars.asci_test.delay_msc := true;
Harald Welte801ed1a2023-04-30 15:07:00 +1000721
722 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
723 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
724 /* Connect COORD ports of both functions. The functions will delay before using them. */
725 connect(call_conn:COORD, chan_conn:COORD);
726
727 call_conn.done;
728 chan_conn.done;
729
730 f_shutdown_helper();
731}
732
Andreas Eversberga29b2f32023-07-20 17:28:41 +0200733testcase TC_vgcs_vbs_uplink_reject() runs on test_CT {
734 var MSC_ConnHdlr call_conn, chan_conn;
735 var TestHdlrParams pars := f_gen_test_hdlr_pars();
736
737 f_init(1, true);
738
739 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
740 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
741
742 pars.asci_test.vgcs_uplink_reject := true;
743
744 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
745 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
746 /* Connect COORD ports of both functions. The functions will delay before using them. */
747 connect(call_conn:COORD, chan_conn:COORD);
748
749 call_conn.done;
750 chan_conn.done;
751
752 f_shutdown_helper();
753}
754
Andreas Eversberg35874922023-07-07 13:44:04 +0200755testcase TC_vgcs_vbs_uplink_seized() runs on test_CT {
756 var MSC_ConnHdlr call_conn, chan_conn;
757 var TestHdlrParams pars := f_gen_test_hdlr_pars();
758
759 f_init(1, true);
760
761 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
762 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
763
764 pars.asci_test.vgcs_uplink_seized := true;
765
766 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
767 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
768 /* Connect COORD ports of both functions. The functions will delay before using them. */
769 connect(call_conn:COORD, chan_conn:COORD);
770
771 call_conn.done;
772 chan_conn.done;
773
774 f_shutdown_helper();
775}
776
777testcase TC_vgcs_vbs_uplink_release() runs on test_CT {
778 var MSC_ConnHdlr call_conn, chan_conn;
779 var TestHdlrParams pars := f_gen_test_hdlr_pars();
780
781 f_init(1, true);
782
783 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
784 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
785
786 pars.asci_test.vgcs_uplink_release := true;
787
788 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
789 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
790 /* Connect COORD ports of both functions. The functions will delay before using them. */
791 connect(call_conn:COORD, chan_conn:COORD);
792
793 call_conn.done;
794 chan_conn.done;
795
796 f_shutdown_helper();
797}
798
Harald Welte801ed1a2023-04-30 15:07:00 +1000799control {
800 execute( TC_vgcs_vbs_setup_only() );
801 execute( TC_vgcs_vbs_assignment() );
802 execute( TC_vgcs_vbs_assignment_fail() );
803 execute( TC_vgcs_vbs_talker_req() );
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200804 execute( TC_vgcs_vbs_talker_fail() );
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200805 execute( TC_vgcs_vbs_talker_fail_late_msc() );
Harald Welte801ed1a2023-04-30 15:07:00 +1000806 execute( TC_vgcs_vbs_talker_est() );
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200807 execute( TC_vgcs_vbs_talker_est_late_msc() );
Harald Welte801ed1a2023-04-30 15:07:00 +1000808 execute( TC_vgcs_vbs_talker_rel() );
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200809 execute( TC_vgcs_vbs_talker_rel_late_msc() );
Andreas Eversberga29b2f32023-07-20 17:28:41 +0200810 execute( TC_vgcs_vbs_uplink_reject() );
Andreas Eversberg35874922023-07-07 13:44:04 +0200811 execute( TC_vgcs_vbs_uplink_seized() );
812 execute( TC_vgcs_vbs_uplink_release() );
Harald Welte801ed1a2023-04-30 15:07:00 +1000813}
814
815
816}