blob: a97e0db70d4990fbd7f64df806f67e3b24d565d5 [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 }
360}
361
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200362private function f_delay_bts() runs on MSC_ConnHdlr {
363 timer T := 2.0;
364 T.start;
365 alt {
366 [] COORD.receive(COORD_UPLINK_REQUEST_CONFIRM) {
367 setverdict(fail, "Got UPLINK REQUEST CONFIRM from BSC. This is unexpected.");
368 }
369 [] T.timeout { }
370 }
371}
372
Harald Welte801ed1a2023-04-30 15:07:00 +1000373private function f_tc_asci_assignment(charstring id) runs on MSC_ConnHdlr {
374 var PDU_BSSAP rx_bssap;
375 /* Hack: the proper way would be to wait for the BSSMAP VGCS Assignment Result and extract the
376 * actual assigned chan_nr from it. But osmo-bsc starts acting on the lchan even before we get a
377 * chance to evaluate the BSSMAP Handover Request ACK. So we need to assume that osmo-bsc will
378 * activate TS 1 and already set up this lchan's RSL emulation
379 * before we get started. */
380 var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(1, RSL_CHAN_NR_Bm_ACCH));
381 f_rslem_register(0, new_chan_nr);
382 g_chan_nr := new_chan_nr;
383 var uint3_t expect_target_tsc := c_BtsParams[0].tsc;
384 var default eat_rsl_data;
385
386 /* Wait for the COORD ports to be connected. */
387 f_sleep(1.0);
388
389 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
390 f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);
391 var default as_media := activate(as_Media());
392
393 log("VGCS: wait for establishment of call controling connection");
394 COORD.receive(COORD_VGCS_CALL_EST);
395 log("VGCS: got establishment of call controling connection");
396
397 /* TODO: Encryption */
398 var template (value) BSSMAP_IE_ChannelType req_ch_type := ts_BSSMAP_IE_ChannelType;
399 var template BSSMAP_IE_ChannelType res_ch_type := tr_BSSMAP_IE_ChannelType('0001'B, ChRate_TCHF, Spdi_TCHF_FR);
400 var template (value) BSSMAP_IE_CellIdentifier req_cell_id := ts_CellId_CI(0);
401 var template BSSMAP_IE_CellIdentifier res_cell_id := tr_CellId_CI(0);
402 var template (value) DescriptiveGroupOrBroadcastCallReference_V callref :=
403 ts_BSSMAP_IE_GroupCallRef(11, '1'B, '0'B, '000'B, '0000'B);
404 if (g_pars.asci_test.vgcs_assign_fail) {
405 callref := ts_BSSMAP_IE_GroupCallRef(10, '1'B, '0'B, '000'B, '0000'B);
406 }
407 var template (value) PDU_BSSAP ass_req := f_gen_asci_ass_req(ch_type := req_ch_type, cell_id := req_cell_id,
408 group_call_ref := bit2oct(encvalue(callref)));
409 /* VGCS/VBS ASS REQ in SCCP CR (must be the first message) */
410 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc, ass_req));
411 BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
412
413 alt {
414 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentRes(res_ch_type, res_cell_id)) -> value rx_bssap {
415 log("VGCS: got assignment result on channel");
416 COORD.send(COORD_VGCS_ASSIGN_RES);
417 if (g_pars.asci_test.vgcs_talker_req or
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200418 g_pars.asci_test.vgcs_talker_fail or
Harald Welte801ed1a2023-04-30 15:07:00 +1000419 g_pars.asci_test.vgcs_talker_est or
Andreas Eversberga29b2f32023-07-20 17:28:41 +0200420 g_pars.asci_test.vgcs_talker_rel or
421 g_pars.asci_test.vgcs_uplink_reject) {
Harald Welte801ed1a2023-04-30 15:07:00 +1000422 log("VGCS: sending talker det");
423 RSL.send(ts_RSL_TALKER_DET(g_chan_nr));
424 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200425 if (g_pars.asci_test.vgcs_talker_fail) {
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200426 if (g_pars.asci_test.delay_bts) {
427 log("VGCS: delay sending RSL failure ind");
428 f_delay_bts();
429 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200430 log("VGCS: sending RSL failure ind");
431 RSL.send(ts_RSL_CONN_FAIL_IND(g_chan_nr, RSL_ERR_TALKER_ACC_FAIL));
432 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000433 if (g_pars.asci_test.vgcs_talker_est or
434 g_pars.asci_test.vgcs_talker_rel) {
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200435 if (g_pars.asci_test.delay_bts) {
436 log("VGCS: delay sending RSL estblish ind");
437 f_delay_bts();
438 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000439 log("VGCS: sending RSL etabish ind");
440 RSL.send(ts_RSL_EST_IND(g_chan_nr, ts_RslLinkID_DCCH(0), '1234'O));
441 }
442 if (g_pars.asci_test.vgcs_talker_rel) {
443 log("VGCS: sending RSL release ind");
444 RSL.send(ts_RSL_REL_IND(g_chan_nr, ts_RslLinkID_DCCH(0)));
445 }
446 repeat;
447 }
448 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentFail) -> value rx_bssap {
449 log("VGCS: got assignment failure on channel");
450 COORD.send(COORD_VGCS_ASSIGN_FAIL);
451 log("VGCS: got release order after assignment failure");
452 COORD.receive(COORD_VGCS_CHANNEL_REL);
453 BSSAP.send(ts_BSSMAP_ClearCommand(0));
454 BSSAP.receive(tr_BSSMAP_ClearComplete);
455 BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
456 return;
457 }
458 [] COORD.receive(COORD_VGCS_CHANNEL_REL) {
459 log("VGCS: got release order of resource controling connection");
460 eat_rsl_data := activate(as_eat_rsl_data());
461 f_perform_clear_no_rr_rel();
462 deactivate(eat_rsl_data);
463 return;
464 }
Andreas Eversbergc0870e52023-07-07 12:06:24 +0200465 [] RSL.receive(tr_RSL_UNITDATA_REQ(g_chan_nr, ?, '082B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O)) {
Harald Welte801ed1a2023-04-30 15:07:00 +1000466 log("VGCS: Got UPLINK FREE on channel");
467 COORD.send(COORD_VGCS_UPLINK_FREE);
468 repeat;
469 }
Andreas Eversbergc0870e52023-07-07 12:06:24 +0200470 [] RSL.receive(tr_RSL_UNITDATA_REQ(g_chan_nr, ?, '062A'O)) {
Harald Welte801ed1a2023-04-30 15:07:00 +1000471 log("VGCS: Got UPLINK BUSY on channel");
472 COORD.send(COORD_VGCS_UPLINK_BUSY);
473 repeat;
474 }
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200475 [] COORD.receive(COORD_UPLINK_REQUEST_CONFIRM) { repeat; }
Harald Welte801ed1a2023-04-30 15:07:00 +1000476 }
477
478 /* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
479
480 /* we're sure that the channel activation is done now, verify the parameters in it */
481 var RSL_Message chan_act := f_rslem_get_last_act(RSL_PROC, 0, g_chan_nr);
482 /* TODO: Encryption */
483 f_chan_act_verify_tsc(chan_act, expect_target_tsc);
484
485 if (ispresent(rx_bssap.pdu.bssmap.vGCS_VBSAssignmentResult.speechCodec)) {
486 if (not g_pars.aoip) {
487 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
488 "Expected no Speech Codec (Chosen)");
489 }
490 } else {
491 if (g_pars.aoip) {
492 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
493 "Expected Speech Codec (Chosen)");
494 }
495 }
496
497}
498
499testcase TC_vgcs_vbs_setup_only() runs on test_CT {
500 var MSC_ConnHdlr call_conn;
501 var TestHdlrParams pars := f_gen_test_hdlr_pars();
502
503 f_init(1, true);
504
505 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
506 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
507
508 pars.asci_test.vgcs_setup_ok := true;
509
510 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
511
512 call_conn.done;
513
514 f_shutdown_helper();
515}
516
517testcase TC_vgcs_vbs_assignment() runs on test_CT {
518 var MSC_ConnHdlr call_conn, chan_conn;
519 var TestHdlrParams pars := f_gen_test_hdlr_pars();
520
521 f_init(1, true);
522
523 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
524 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
525
526 pars.asci_test.vgcs_assign_ok := true;
527
528 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
529 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
530 /* Connect COORD ports of both functions. The functions will delay before using them. */
531 connect(call_conn:COORD, chan_conn:COORD);
532
533 call_conn.done;
534 chan_conn.done;
535
536 f_shutdown_helper();
537}
538
539testcase TC_vgcs_vbs_assignment_fail() runs on test_CT {
540 var MSC_ConnHdlr call_conn, chan_conn;
541 var TestHdlrParams pars := f_gen_test_hdlr_pars();
542
543 f_init(1, true);
544
545 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
546 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
547
548 pars.asci_test.vgcs_assign_fail := true;
549
550 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
551 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
552 /* Connect COORD ports of both functions. The functions will delay before using them. */
553 connect(call_conn:COORD, chan_conn:COORD);
554
555 call_conn.done;
556 chan_conn.done;
557
558 f_shutdown_helper();
559}
560
561testcase TC_vgcs_vbs_talker_req() runs on test_CT {
562 var MSC_ConnHdlr call_conn, chan_conn;
563 var TestHdlrParams pars := f_gen_test_hdlr_pars();
564
565 f_init(1, true);
566
567 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
568 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
569
570 pars.asci_test.vgcs_talker_req := true;
571
572 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
573 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
574 /* Connect COORD ports of both functions. The functions will delay before using them. */
575 connect(call_conn:COORD, chan_conn:COORD);
576
577 call_conn.done;
578 chan_conn.done;
579
580 f_shutdown_helper();
581}
582
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200583testcase TC_vgcs_vbs_talker_fail() runs on test_CT {
584 var MSC_ConnHdlr call_conn, chan_conn;
585 var TestHdlrParams pars := f_gen_test_hdlr_pars();
586
587 f_init(1, true);
588
589 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
590 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
591
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200592 /* MSC sends acknowledge before link on BTS fail. */
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200593 pars.asci_test.vgcs_talker_fail := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200594 pars.asci_test.delay_bts := true;
595
596 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
597 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
598 /* Connect COORD ports of both functions. The functions will delay before using them. */
599 connect(call_conn:COORD, chan_conn:COORD);
600
601 call_conn.done;
602 chan_conn.done;
603
604 f_shutdown_helper();
605}
606
607testcase TC_vgcs_vbs_talker_fail_late_msc() runs on test_CT {
608 var MSC_ConnHdlr call_conn, chan_conn;
609 var TestHdlrParams pars := f_gen_test_hdlr_pars();
610
611 f_init(1, true);
612
613 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
614 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
615
616 /* MSC sends acknowledge after link on BTS fail. */
617 pars.asci_test.vgcs_talker_fail := true;
618 pars.asci_test.delay_msc := true;
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200619
620 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
621 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
622 /* Connect COORD ports of both functions. The functions will delay before using them. */
623 connect(call_conn:COORD, chan_conn:COORD);
624
625 call_conn.done;
626 chan_conn.done;
627
628 f_shutdown_helper();
629}
630
Harald Welte801ed1a2023-04-30 15:07:00 +1000631testcase TC_vgcs_vbs_talker_est() runs on test_CT {
632 var MSC_ConnHdlr call_conn, chan_conn;
633 var TestHdlrParams pars := f_gen_test_hdlr_pars();
634
635 f_init(1, true);
636
637 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
638 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
639
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200640 /* MSC sends acknowledge before BTS establishes the uplink. */
Harald Welte801ed1a2023-04-30 15:07:00 +1000641 pars.asci_test.vgcs_talker_est := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200642 pars.asci_test.delay_bts := true;
643
644 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
645 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
646 /* Connect COORD ports of both functions. The functions will delay before using them. */
647 connect(call_conn:COORD, chan_conn:COORD);
648
649 call_conn.done;
650 chan_conn.done;
651
652 f_shutdown_helper();
653}
654
655testcase TC_vgcs_vbs_talker_est_late_msc() runs on test_CT {
656 var MSC_ConnHdlr call_conn, chan_conn;
657 var TestHdlrParams pars := f_gen_test_hdlr_pars();
658
659 f_init(1, true);
660
661 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
662 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
663
664 /* MSC sends acknowledge after BTS established the uplink. */
665 pars.asci_test.vgcs_talker_est := true;
666 pars.asci_test.delay_msc := true;
Harald Welte801ed1a2023-04-30 15:07:00 +1000667
668 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
669 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
670 /* Connect COORD ports of both functions. The functions will delay before using them. */
671 connect(call_conn:COORD, chan_conn:COORD);
672
673 call_conn.done;
674 chan_conn.done;
675
676 f_shutdown_helper();
677}
678
679testcase TC_vgcs_vbs_talker_rel() runs on test_CT {
680 var MSC_ConnHdlr call_conn, chan_conn;
681 var TestHdlrParams pars := f_gen_test_hdlr_pars();
682
683 f_init(1, true);
684
685 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
686 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
687
688 pars.asci_test.vgcs_talker_rel := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200689 pars.asci_test.delay_bts := true;
690
691 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
692 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
693 /* Connect COORD ports of both functions. The functions will delay before using them. */
694 connect(call_conn:COORD, chan_conn:COORD);
695
696 call_conn.done;
697 chan_conn.done;
698
699 f_shutdown_helper();
700}
701
702testcase TC_vgcs_vbs_talker_rel_late_msc() runs on test_CT {
703 var MSC_ConnHdlr call_conn, chan_conn;
704 var TestHdlrParams pars := f_gen_test_hdlr_pars();
705
706 f_init(1, true);
707
708 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
709 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
710
711 pars.asci_test.vgcs_talker_rel := true;
712 pars.asci_test.delay_msc := true;
Harald Welte801ed1a2023-04-30 15:07:00 +1000713
714 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
715 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
716 /* Connect COORD ports of both functions. The functions will delay before using them. */
717 connect(call_conn:COORD, chan_conn:COORD);
718
719 call_conn.done;
720 chan_conn.done;
721
722 f_shutdown_helper();
723}
724
Andreas Eversberga29b2f32023-07-20 17:28:41 +0200725testcase TC_vgcs_vbs_uplink_reject() runs on test_CT {
726 var MSC_ConnHdlr call_conn, chan_conn;
727 var TestHdlrParams pars := f_gen_test_hdlr_pars();
728
729 f_init(1, true);
730
731 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
732 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
733
734 pars.asci_test.vgcs_uplink_reject := true;
735
736 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
737 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
738 /* Connect COORD ports of both functions. The functions will delay before using them. */
739 connect(call_conn:COORD, chan_conn:COORD);
740
741 call_conn.done;
742 chan_conn.done;
743
744 f_shutdown_helper();
745}
746
Andreas Eversberg35874922023-07-07 13:44:04 +0200747testcase TC_vgcs_vbs_uplink_seized() runs on test_CT {
748 var MSC_ConnHdlr call_conn, chan_conn;
749 var TestHdlrParams pars := f_gen_test_hdlr_pars();
750
751 f_init(1, true);
752
753 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
754 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
755
756 pars.asci_test.vgcs_uplink_seized := true;
757
758 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
759 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
760 /* Connect COORD ports of both functions. The functions will delay before using them. */
761 connect(call_conn:COORD, chan_conn:COORD);
762
763 call_conn.done;
764 chan_conn.done;
765
766 f_shutdown_helper();
767}
768
769testcase TC_vgcs_vbs_uplink_release() runs on test_CT {
770 var MSC_ConnHdlr call_conn, chan_conn;
771 var TestHdlrParams pars := f_gen_test_hdlr_pars();
772
773 f_init(1, true);
774
775 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
776 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
777
778 pars.asci_test.vgcs_uplink_release := true;
779
780 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
781 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
782 /* Connect COORD ports of both functions. The functions will delay before using them. */
783 connect(call_conn:COORD, chan_conn:COORD);
784
785 call_conn.done;
786 chan_conn.done;
787
788 f_shutdown_helper();
789}
790
Harald Welte801ed1a2023-04-30 15:07:00 +1000791control {
792 execute( TC_vgcs_vbs_setup_only() );
793 execute( TC_vgcs_vbs_assignment() );
794 execute( TC_vgcs_vbs_assignment_fail() );
795 execute( TC_vgcs_vbs_talker_req() );
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200796 execute( TC_vgcs_vbs_talker_fail() );
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200797 execute( TC_vgcs_vbs_talker_fail_late_msc() );
Harald Welte801ed1a2023-04-30 15:07:00 +1000798 execute( TC_vgcs_vbs_talker_est() );
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200799 execute( TC_vgcs_vbs_talker_est_late_msc() );
Harald Welte801ed1a2023-04-30 15:07:00 +1000800 execute( TC_vgcs_vbs_talker_rel() );
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200801 execute( TC_vgcs_vbs_talker_rel_late_msc() );
Andreas Eversberga29b2f32023-07-20 17:28:41 +0200802 execute( TC_vgcs_vbs_uplink_reject() );
Andreas Eversberg35874922023-07-07 13:44:04 +0200803 execute( TC_vgcs_vbs_uplink_seized() );
804 execute( TC_vgcs_vbs_uplink_release() );
Harald Welte801ed1a2023-04-30 15:07:00 +1000805}
806
807
808}