blob: e4a0cca42121e2b92282b9e985101c05950ed3ed [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";
45
46template (value) DescriptiveGroupOrBroadcastCallReference_V
47 ts_BSSMAP_IE_GroupCallRef(integer cr,
48 BIT1 sf,
49 BIT1 af,
50 BIT3 prio,
51 BIT4 ci) := {
52 binaryCodingOfGroupOrBroadcastCallReference := int2bit(cr, 27),
53 sF := sf,
54 aF := af,
55 callPriority := prio,
56 cipheringInformation := ci,
57 spare := '0000'B
58}
59
60function f_gen_asci_ass_req(integer bssap_idx := 0,
61 template (value) BSSMAP_IE_ChannelType ch_type := ts_BSSMAP_IE_ChannelType,
62 template (value) OCT1 ass_requirement := '00'O,
63 template (value) BSSMAP_IE_CellIdentifier cell_id := ts_CellId_CI(0),
64 template (value) GroupCallRef group_call_ref := '0000001000'O,
65 charstring aoip_tla :="1.2.3.4")
66runs on MSC_ConnHdlr return template (value) PDU_BSSAP {
67 if (mp_bssap_cfg[bssap_idx].transport == BSSAP_TRANSPORT_AoIP) {
68 var template (value) BSSMAP_IE_AoIP_TransportLayerAddress tla :=
69 f_ts_BSSMAP_IE_AoIP_TLA(aoip_tla, 2342);
70 var template (value) BSSMAP_IE_SpeechCodecList codec_list :=
71 ts_BSSMAP_IE_CodecList({ts_CodecFR});
72 return ts_BSSMAP_VGCS_VBS_AssignmentReq(ch_type, ass_requirement, cell_id,
73 group_call_ref, omit, tla, omit, codec_list);
74 } else {
75 var template (value) BSSMAP_IE_CircuitIdentityCode cic := ts_BSSMAP_IE_CIC(0,1);
76 return ts_BSSMAP_VGCS_VBS_AssignmentReq(ch_type, ass_requirement, cell_id,
77 group_call_ref, cic, omit, omit, omit);
78 }
79}
80
81/*
82 * VGCS/VBS call controling connection
83 */
84
85private function f_tc_vgcs_vbs_setup(charstring id) runs on MSC_ConnHdlr {
86 var PDU_BSSAP rx_bssap;
87 var template (value) DescriptiveGroupOrBroadcastCallReference_V callref :=
88 ts_BSSMAP_IE_GroupCallRef(11, '1'B, '0'B, '000'B, '0000'B);
89 var template (value) PDU_BSSAP setup_req := ts_BSSMAP_VGCS_VBS_Setup(bit2oct(encvalue(callref)), omit);
90 var boolean uplink_free := false;
91 var boolean uplink_busy := false;
92 var boolean uplink_req := false;
93 var boolean uplink_req_conf := false;
94 var boolean uplink_rel_ind := false;
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +020095 var boolean uplink_rel_ind_failure := false;
Harald Welte801ed1a2023-04-30 15:07:00 +100096 var boolean assign_res := false;
97 var boolean assign_fail := false;
98 /* Note: This timer is used to receive messages after the expected event.
Andreas Eversberg35874922023-07-07 13:44:04 +020099 * After timeout, the outcome of the test is checked.
100 * The timeout must be large enough, so all the messages pass before checking the outcome. */
101 timer T := 1.0;
Harald Welte801ed1a2023-04-30 15:07:00 +1000102
103 /* Wait for the COORD ports to be connected. */
104 f_sleep(1.0);
105
106 /* VGCS/VBS SETUP REQ in SCCP CR (must be the first message) */
107 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc, setup_req));
108 BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
109
110 alt {
111 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_SetupAck) -> value rx_bssap {
112 log("VGCS: got setup ack");
113 if (not g_pars.asci_test.vgcs_setup_ok) {
114 COORD.send(COORD_VGCS_CALL_EST);
115 repeat;
116 }
117 BSSAP.send(ts_BSSMAP_ClearCommand(0));
118 BSSAP.receive(tr_BSSMAP_ClearComplete);
119 BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
120 setverdict(pass);
121 return;
122 }
123 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_SetupRefuse) -> value rx_bssap {
124 log("VGCS: got setup refuse");
125 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
126 "Expected ASCI Setup to succeed, but got fail");
127 return;
128 }
129 [] BSSAP.receive(tr_BSSMAP_UplinkReq) -> value rx_bssap {
130 log("VGCS: received uplink req");
131 uplink_req := true;
132 BSSAP.send(ts_BSSMAP_UplinkReqAck(omit));
133 if (g_pars.asci_test.vgcs_talker_req) {
134 T.start;
135 }
136 repeat;
137 }
138 [] BSSAP.receive(tr_BSSMAP_UplinkReqConf(?, omit, '1234'O)) -> value rx_bssap {
139 log("VGCS: received uplink req confirm");
140 uplink_req_conf := true;
141 if (g_pars.asci_test.vgcs_talker_est) {
142 T.start;
143 }
144 repeat;
145 }
146 [] BSSAP.receive(tr_BSSMAP_UplinkRelInd(GSM0808_CAUSE_CALL_CONTROL, omit)) -> value rx_bssap {
147 log("VGCS: received uplink rel ind");
148 uplink_rel_ind := true;
149 if (g_pars.asci_test.vgcs_talker_rel) {
150 T.start;
151 }
152 repeat;
153 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200154 [] BSSAP.receive(tr_BSSMAP_UplinkRelInd(GSM0808_CAUSE_RADIO_INTERFACE_FAILURE, omit)) -> value rx_bssap {
155 log("VGCS: received uplink rel ind, caused by failure");
156 uplink_rel_ind_failure := true;
157 if (g_pars.asci_test.vgcs_talker_fail) {
158 T.start;
159 }
160 repeat;
161 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000162 [] COORD.receive(COORD_VGCS_ASSIGN_RES) {
163 log("VGCS: got assignment result at call control");
164 assign_res := true;
165 if (g_pars.asci_test.vgcs_assign_ok) {
166 T.start;
167 }
Andreas Eversberg35874922023-07-07 13:44:04 +0200168 if (g_pars.asci_test.vgcs_uplink_seized or
169 g_pars.asci_test.vgcs_uplink_release) {
170 log("VGCS: sending Uplink Seized Cmd");
171 BSSAP.send(ts_BSSMAP_UplinkSeizedCmd(9, omit, omit, omit));
Andreas Eversberge1506022023-07-20 18:08:33 +0200172 T.start;
Andreas Eversberg35874922023-07-07 13:44:04 +0200173 }
174 if (g_pars.asci_test.vgcs_uplink_release) {
175 log("VGCS: sending Uplink Release Cmd");
176 BSSAP.send(ts_BSSMAP_UplinkRelCmd(9));
Andreas Eversberge1506022023-07-20 18:08:33 +0200177 T.start;
Andreas Eversberg35874922023-07-07 13:44:04 +0200178 }
179 if (g_pars.asci_test.vgcs_uplink_seized or
180 g_pars.asci_test.vgcs_uplink_release) {
181 T.start;
182 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000183 repeat;
184 }
185 [] COORD.receive(COORD_VGCS_ASSIGN_FAIL) {
186 log("VGCS: got assignment failure at call control");
187 assign_fail := true;
188 if (g_pars.asci_test.vgcs_assign_fail) {
189 T.start;
190 }
191 repeat;
192 }
193 [] COORD.receive(COORD_VGCS_UPLINK_FREE) {
194 log("VGCS: Got UPLINK FREE at call control");
195 uplink_busy := false;
196 uplink_free := true;
197 repeat;
198 }
199 [] COORD.receive(COORD_VGCS_UPLINK_BUSY) {
200 log("VGCS: Got UPLINK BUSY at call control");
201 uplink_busy := true;
202 uplink_free := false;
203 repeat;
204 }
205 [] T.timeout { }
206 }
207
208 /* After timeout: Release Channel and Call and see if the outcome of the test is as expected. */
209 COORD.send(COORD_VGCS_CHANNEL_REL);
210 BSSAP.send(ts_BSSMAP_ClearCommand(0));
211 BSSAP.receive(tr_BSSMAP_ClearComplete);
212 BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
213
214 if (g_pars.asci_test.vgcs_assign_ok) {
215 if (not assign_res) {
216 setverdict(fail, "VGCS: Assignment did not pass as expected!");
217 return;
218 }
219 if (not uplink_free) {
220 setverdict(fail, "VGCS: Uplink not free as expected!");
221 return;
222 }
223 log("VGCS: Channel assigned and uplink marked free as expected!");
224 setverdict(pass);
225 return;
226 }
227 if (g_pars.asci_test.vgcs_assign_fail) {
228 if (not assign_fail) {
229 setverdict(fail, "VGCS: Assignment did not fail as expected!");
230 return;
231 }
232 log("VGCS: Channel assignment failed as expected!");
233 setverdict(pass);
234 return;
235 }
236 if (g_pars.asci_test.vgcs_talker_req) {
237 if (not uplink_req) {
238 setverdict(fail, "VGCS: No uplink request as expected!");
239 return;
240 }
Andreas Eversberg5e3dd362023-07-07 12:09:00 +0200241 /* UPLINK BUSY is automatically sent by BTS, but not by BSC. */
242 if (uplink_busy) {
243 setverdict(fail, "VGCS: Uplink set to busy, this is not expected!");
Harald Welte801ed1a2023-04-30 15:07:00 +1000244 return;
245 }
246 log("VGCS: Uplink requested and uplink marked busy as expected!");
247 setverdict(pass);
248 return;
249 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200250 if (g_pars.asci_test.vgcs_talker_fail) {
251 if (not uplink_rel_ind_failure) {
252 setverdict(fail, "VGCS: No uplink release indication as expected!");
253 return;
254 }
255 if (not uplink_free) {
256 setverdict(fail, "VGCS: Uplink not free as expected!");
257 return;
258 }
259 log("VGCS: Uplink release and uplink marked free as expected!");
260 setverdict(pass);
261 return;
262 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000263 if (g_pars.asci_test.vgcs_talker_est) {
264 if (not uplink_req_conf) {
265 setverdict(fail, "VGCS: No uplink request confirm as expected!");
266 return;
267 }
Andreas Eversberg5e3dd362023-07-07 12:09:00 +0200268 /* UPLINK BUSY is automatically sent by BTS, but not by BSC. */
269 if (uplink_busy) {
270 setverdict(fail, "VGCS: Uplink set to busy, this is not expected!");
Harald Welte801ed1a2023-04-30 15:07:00 +1000271 return;
272 }
273 log("VGCS: Uplink established and uplink marked busy as expected!");
274 setverdict(pass);
275 return;
276 }
277 if (g_pars.asci_test.vgcs_talker_rel) {
278 if (not uplink_rel_ind) {
279 setverdict(fail, "VGCS: No uplink release indication as expected!");
280 return;
281 }
282 if (not uplink_free) {
283 setverdict(fail, "VGCS: Uplink not free as expected!");
284 return;
285 }
286 log("VGCS: Uplink established+released and uplink marked free as expected!");
287 setverdict(pass);
288 return;
289 }
Andreas Eversberg35874922023-07-07 13:44:04 +0200290 if (g_pars.asci_test.vgcs_uplink_seized) {
291 if (not uplink_busy) {
292 setverdict(fail, "VGCS: Uplink not busy as expected!");
293 return;
294 }
295 log("VGCS: Uplink established+released and uplink marked free as expected!");
296 setverdict(pass);
297 return;
298 }
299 if (g_pars.asci_test.vgcs_uplink_release) {
300 if (not uplink_free) {
301 setverdict(fail, "VGCS: Uplink not free as expected!");
302 return;
303 }
304 log("VGCS: Uplink established+released and uplink marked free as expected!");
305 setverdict(pass);
306 return;
307 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000308}
309
310/*
311 * VGCS/VBS resource controling connection
312 */
313
314private altstep as_eat_rsl_data() runs on MSC_ConnHdlr {
Andreas Eversbergc0870e52023-07-07 12:06:24 +0200315 [] RSL.receive(tr_RSL_UNITDATA_REQ(g_chan_nr, ?, ?)) {
316 log("VGCS: Got RSL UNITDATA REQ on channel");
317 repeat;
318 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000319 [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, ?)) {
320 log("VGCS: Got RSL DATA REQ on channel");
321 repeat;
322 }
323}
324
325private function f_tc_asci_assignment(charstring id) runs on MSC_ConnHdlr {
326 var PDU_BSSAP rx_bssap;
327 /* Hack: the proper way would be to wait for the BSSMAP VGCS Assignment Result and extract the
328 * actual assigned chan_nr from it. But osmo-bsc starts acting on the lchan even before we get a
329 * chance to evaluate the BSSMAP Handover Request ACK. So we need to assume that osmo-bsc will
330 * activate TS 1 and already set up this lchan's RSL emulation
331 * before we get started. */
332 var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(1, RSL_CHAN_NR_Bm_ACCH));
333 f_rslem_register(0, new_chan_nr);
334 g_chan_nr := new_chan_nr;
335 var uint3_t expect_target_tsc := c_BtsParams[0].tsc;
336 var default eat_rsl_data;
337
338 /* Wait for the COORD ports to be connected. */
339 f_sleep(1.0);
340
341 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
342 f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);
343 var default as_media := activate(as_Media());
344
345 log("VGCS: wait for establishment of call controling connection");
346 COORD.receive(COORD_VGCS_CALL_EST);
347 log("VGCS: got establishment of call controling connection");
348
349 /* TODO: Encryption */
350 var template (value) BSSMAP_IE_ChannelType req_ch_type := ts_BSSMAP_IE_ChannelType;
351 var template BSSMAP_IE_ChannelType res_ch_type := tr_BSSMAP_IE_ChannelType('0001'B, ChRate_TCHF, Spdi_TCHF_FR);
352 var template (value) BSSMAP_IE_CellIdentifier req_cell_id := ts_CellId_CI(0);
353 var template BSSMAP_IE_CellIdentifier res_cell_id := tr_CellId_CI(0);
354 var template (value) DescriptiveGroupOrBroadcastCallReference_V callref :=
355 ts_BSSMAP_IE_GroupCallRef(11, '1'B, '0'B, '000'B, '0000'B);
356 if (g_pars.asci_test.vgcs_assign_fail) {
357 callref := ts_BSSMAP_IE_GroupCallRef(10, '1'B, '0'B, '000'B, '0000'B);
358 }
359 var template (value) PDU_BSSAP ass_req := f_gen_asci_ass_req(ch_type := req_ch_type, cell_id := req_cell_id,
360 group_call_ref := bit2oct(encvalue(callref)));
361 /* VGCS/VBS ASS REQ in SCCP CR (must be the first message) */
362 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc, ass_req));
363 BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
364
365 alt {
366 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentRes(res_ch_type, res_cell_id)) -> value rx_bssap {
367 log("VGCS: got assignment result on channel");
368 COORD.send(COORD_VGCS_ASSIGN_RES);
369 if (g_pars.asci_test.vgcs_talker_req or
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200370 g_pars.asci_test.vgcs_talker_fail or
Harald Welte801ed1a2023-04-30 15:07:00 +1000371 g_pars.asci_test.vgcs_talker_est or
372 g_pars.asci_test.vgcs_talker_rel) {
373 log("VGCS: sending talker det");
374 RSL.send(ts_RSL_TALKER_DET(g_chan_nr));
375 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200376 if (g_pars.asci_test.vgcs_talker_fail) {
377 log("VGCS: sending RSL failure ind");
378 RSL.send(ts_RSL_CONN_FAIL_IND(g_chan_nr, RSL_ERR_TALKER_ACC_FAIL));
379 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000380 if (g_pars.asci_test.vgcs_talker_est or
381 g_pars.asci_test.vgcs_talker_rel) {
382 log("VGCS: sending RSL etabish ind");
383 RSL.send(ts_RSL_EST_IND(g_chan_nr, ts_RslLinkID_DCCH(0), '1234'O));
384 }
385 if (g_pars.asci_test.vgcs_talker_rel) {
386 log("VGCS: sending RSL release ind");
387 RSL.send(ts_RSL_REL_IND(g_chan_nr, ts_RslLinkID_DCCH(0)));
388 }
389 repeat;
390 }
391 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentFail) -> value rx_bssap {
392 log("VGCS: got assignment failure on channel");
393 COORD.send(COORD_VGCS_ASSIGN_FAIL);
394 log("VGCS: got release order after assignment failure");
395 COORD.receive(COORD_VGCS_CHANNEL_REL);
396 BSSAP.send(ts_BSSMAP_ClearCommand(0));
397 BSSAP.receive(tr_BSSMAP_ClearComplete);
398 BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
399 return;
400 }
401 [] COORD.receive(COORD_VGCS_CHANNEL_REL) {
402 log("VGCS: got release order of resource controling connection");
403 eat_rsl_data := activate(as_eat_rsl_data());
404 f_perform_clear_no_rr_rel();
405 deactivate(eat_rsl_data);
406 return;
407 }
Andreas Eversbergc0870e52023-07-07 12:06:24 +0200408 [] RSL.receive(tr_RSL_UNITDATA_REQ(g_chan_nr, ?, '082B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O)) {
Harald Welte801ed1a2023-04-30 15:07:00 +1000409 log("VGCS: Got UPLINK FREE on channel");
410 COORD.send(COORD_VGCS_UPLINK_FREE);
411 repeat;
412 }
Andreas Eversbergc0870e52023-07-07 12:06:24 +0200413 [] RSL.receive(tr_RSL_UNITDATA_REQ(g_chan_nr, ?, '062A'O)) {
Harald Welte801ed1a2023-04-30 15:07:00 +1000414 log("VGCS: Got UPLINK BUSY on channel");
415 COORD.send(COORD_VGCS_UPLINK_BUSY);
416 repeat;
417 }
418 }
419
420 /* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
421
422 /* we're sure that the channel activation is done now, verify the parameters in it */
423 var RSL_Message chan_act := f_rslem_get_last_act(RSL_PROC, 0, g_chan_nr);
424 /* TODO: Encryption */
425 f_chan_act_verify_tsc(chan_act, expect_target_tsc);
426
427 if (ispresent(rx_bssap.pdu.bssmap.vGCS_VBSAssignmentResult.speechCodec)) {
428 if (not g_pars.aoip) {
429 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
430 "Expected no Speech Codec (Chosen)");
431 }
432 } else {
433 if (g_pars.aoip) {
434 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
435 "Expected Speech Codec (Chosen)");
436 }
437 }
438
439}
440
441testcase TC_vgcs_vbs_setup_only() runs on test_CT {
442 var MSC_ConnHdlr call_conn;
443 var TestHdlrParams pars := f_gen_test_hdlr_pars();
444
445 f_init(1, true);
446
447 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
448 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
449
450 pars.asci_test.vgcs_setup_ok := true;
451
452 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
453
454 call_conn.done;
455
456 f_shutdown_helper();
457}
458
459testcase TC_vgcs_vbs_assignment() runs on test_CT {
460 var MSC_ConnHdlr call_conn, chan_conn;
461 var TestHdlrParams pars := f_gen_test_hdlr_pars();
462
463 f_init(1, true);
464
465 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
466 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
467
468 pars.asci_test.vgcs_assign_ok := true;
469
470 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
471 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
472 /* Connect COORD ports of both functions. The functions will delay before using them. */
473 connect(call_conn:COORD, chan_conn:COORD);
474
475 call_conn.done;
476 chan_conn.done;
477
478 f_shutdown_helper();
479}
480
481testcase TC_vgcs_vbs_assignment_fail() runs on test_CT {
482 var MSC_ConnHdlr call_conn, chan_conn;
483 var TestHdlrParams pars := f_gen_test_hdlr_pars();
484
485 f_init(1, true);
486
487 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
488 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
489
490 pars.asci_test.vgcs_assign_fail := true;
491
492 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
493 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
494 /* Connect COORD ports of both functions. The functions will delay before using them. */
495 connect(call_conn:COORD, chan_conn:COORD);
496
497 call_conn.done;
498 chan_conn.done;
499
500 f_shutdown_helper();
501}
502
503testcase TC_vgcs_vbs_talker_req() runs on test_CT {
504 var MSC_ConnHdlr call_conn, chan_conn;
505 var TestHdlrParams pars := f_gen_test_hdlr_pars();
506
507 f_init(1, true);
508
509 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
510 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
511
512 pars.asci_test.vgcs_talker_req := true;
513
514 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
515 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
516 /* Connect COORD ports of both functions. The functions will delay before using them. */
517 connect(call_conn:COORD, chan_conn:COORD);
518
519 call_conn.done;
520 chan_conn.done;
521
522 f_shutdown_helper();
523}
524
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200525testcase TC_vgcs_vbs_talker_fail() 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_talker_fail := 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
Harald Welte801ed1a2023-04-30 15:07:00 +1000547testcase TC_vgcs_vbs_talker_est() 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_talker_est := 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_rel() 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_rel := 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 Eversberg35874922023-07-07 13:44:04 +0200591testcase TC_vgcs_vbs_uplink_seized() 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
600 pars.asci_test.vgcs_uplink_seized := true;
601
602 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
603 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
604 /* Connect COORD ports of both functions. The functions will delay before using them. */
605 connect(call_conn:COORD, chan_conn:COORD);
606
607 call_conn.done;
608 chan_conn.done;
609
610 f_shutdown_helper();
611}
612
613testcase TC_vgcs_vbs_uplink_release() runs on test_CT {
614 var MSC_ConnHdlr call_conn, chan_conn;
615 var TestHdlrParams pars := f_gen_test_hdlr_pars();
616
617 f_init(1, true);
618
619 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
620 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
621
622 pars.asci_test.vgcs_uplink_release := true;
623
624 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
625 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
626 /* Connect COORD ports of both functions. The functions will delay before using them. */
627 connect(call_conn:COORD, chan_conn:COORD);
628
629 call_conn.done;
630 chan_conn.done;
631
632 f_shutdown_helper();
633}
634
Harald Welte801ed1a2023-04-30 15:07:00 +1000635control {
636 execute( TC_vgcs_vbs_setup_only() );
637 execute( TC_vgcs_vbs_assignment() );
638 execute( TC_vgcs_vbs_assignment_fail() );
639 execute( TC_vgcs_vbs_talker_req() );
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200640 execute( TC_vgcs_vbs_talker_fail() );
Harald Welte801ed1a2023-04-30 15:07:00 +1000641 execute( TC_vgcs_vbs_talker_est() );
642 execute( TC_vgcs_vbs_talker_rel() );
Andreas Eversberg35874922023-07-07 13:44:04 +0200643 execute( TC_vgcs_vbs_uplink_seized() );
644 execute( TC_vgcs_vbs_uplink_release() );
Harald Welte801ed1a2023-04-30 15:07:00 +1000645}
646
647
648}