blob: 78b4902b4db28fcee6afff4cde7ec40c1dd38688 [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 }
149 log("VGCS: sending uplink req ack");
Harald Welte801ed1a2023-04-30 15:07:00 +1000150 BSSAP.send(ts_BSSMAP_UplinkReqAck(omit));
151 if (g_pars.asci_test.vgcs_talker_req) {
152 T.start;
153 }
154 repeat;
155 }
156 [] BSSAP.receive(tr_BSSMAP_UplinkReqConf(?, omit, '1234'O)) -> value rx_bssap {
157 log("VGCS: received uplink req confirm");
158 uplink_req_conf := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200159 COORD.send(COORD_UPLINK_REQUEST_CONFIRM);
Harald Welte801ed1a2023-04-30 15:07:00 +1000160 if (g_pars.asci_test.vgcs_talker_est) {
161 T.start;
162 }
163 repeat;
164 }
165 [] BSSAP.receive(tr_BSSMAP_UplinkRelInd(GSM0808_CAUSE_CALL_CONTROL, omit)) -> value rx_bssap {
166 log("VGCS: received uplink rel ind");
167 uplink_rel_ind := true;
168 if (g_pars.asci_test.vgcs_talker_rel) {
169 T.start;
170 }
171 repeat;
172 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200173 [] BSSAP.receive(tr_BSSMAP_UplinkRelInd(GSM0808_CAUSE_RADIO_INTERFACE_FAILURE, omit)) -> value rx_bssap {
174 log("VGCS: received uplink rel ind, caused by failure");
175 uplink_rel_ind_failure := true;
176 if (g_pars.asci_test.vgcs_talker_fail) {
177 T.start;
178 }
179 repeat;
180 }
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200181 [] BSSAP.receive(tr_BSSMAP_UplinkRelInd(?, omit)) -> value rx_bssap {
182 setverdict(fail, "VGCS: received uplink rel ind, caused by failure with invalid cause: ", rx_bssap);
183 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000184 [] COORD.receive(COORD_VGCS_ASSIGN_RES) {
185 log("VGCS: got assignment result at call control");
186 assign_res := true;
187 if (g_pars.asci_test.vgcs_assign_ok) {
188 T.start;
189 }
Andreas Eversberg35874922023-07-07 13:44:04 +0200190 if (g_pars.asci_test.vgcs_uplink_seized or
191 g_pars.asci_test.vgcs_uplink_release) {
192 log("VGCS: sending Uplink Seized Cmd");
193 BSSAP.send(ts_BSSMAP_UplinkSeizedCmd(9, omit, omit, omit));
Andreas Eversberge1506022023-07-20 18:08:33 +0200194 T.start;
Andreas Eversberg35874922023-07-07 13:44:04 +0200195 }
196 if (g_pars.asci_test.vgcs_uplink_release) {
197 log("VGCS: sending Uplink Release Cmd");
198 BSSAP.send(ts_BSSMAP_UplinkRelCmd(9));
Andreas Eversberge1506022023-07-20 18:08:33 +0200199 T.start;
Andreas Eversberg35874922023-07-07 13:44:04 +0200200 }
201 if (g_pars.asci_test.vgcs_uplink_seized or
202 g_pars.asci_test.vgcs_uplink_release) {
203 T.start;
204 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000205 repeat;
206 }
207 [] COORD.receive(COORD_VGCS_ASSIGN_FAIL) {
208 log("VGCS: got assignment failure at call control");
209 assign_fail := true;
210 if (g_pars.asci_test.vgcs_assign_fail) {
211 T.start;
212 }
213 repeat;
214 }
215 [] COORD.receive(COORD_VGCS_UPLINK_FREE) {
216 log("VGCS: Got UPLINK FREE at call control");
217 uplink_busy := false;
218 uplink_free := true;
219 repeat;
220 }
221 [] COORD.receive(COORD_VGCS_UPLINK_BUSY) {
222 log("VGCS: Got UPLINK BUSY at call control");
223 uplink_busy := true;
224 uplink_free := false;
225 repeat;
226 }
227 [] T.timeout { }
228 }
229
230 /* After timeout: Release Channel and Call and see if the outcome of the test is as expected. */
231 COORD.send(COORD_VGCS_CHANNEL_REL);
232 BSSAP.send(ts_BSSMAP_ClearCommand(0));
233 BSSAP.receive(tr_BSSMAP_ClearComplete);
234 BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
235
236 if (g_pars.asci_test.vgcs_assign_ok) {
237 if (not assign_res) {
238 setverdict(fail, "VGCS: Assignment did not pass as expected!");
239 return;
240 }
241 if (not uplink_free) {
242 setverdict(fail, "VGCS: Uplink not free as expected!");
243 return;
244 }
245 log("VGCS: Channel assigned and uplink marked free as expected!");
246 setverdict(pass);
247 return;
248 }
249 if (g_pars.asci_test.vgcs_assign_fail) {
250 if (not assign_fail) {
251 setverdict(fail, "VGCS: Assignment did not fail as expected!");
252 return;
253 }
254 log("VGCS: Channel assignment failed as expected!");
255 setverdict(pass);
256 return;
257 }
258 if (g_pars.asci_test.vgcs_talker_req) {
259 if (not uplink_req) {
260 setverdict(fail, "VGCS: No uplink request as expected!");
261 return;
262 }
Andreas Eversberg5e3dd362023-07-07 12:09:00 +0200263 /* UPLINK BUSY is automatically sent by BTS, but not by BSC. */
264 if (uplink_busy) {
265 setverdict(fail, "VGCS: Uplink set to busy, this is not expected!");
Harald Welte801ed1a2023-04-30 15:07:00 +1000266 return;
267 }
268 log("VGCS: Uplink requested and uplink marked busy as expected!");
269 setverdict(pass);
270 return;
271 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200272 if (g_pars.asci_test.vgcs_talker_fail) {
273 if (not uplink_rel_ind_failure) {
274 setverdict(fail, "VGCS: No uplink release indication as expected!");
275 return;
276 }
277 if (not uplink_free) {
278 setverdict(fail, "VGCS: Uplink not free as expected!");
279 return;
280 }
281 log("VGCS: Uplink release and uplink marked free as expected!");
282 setverdict(pass);
283 return;
284 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000285 if (g_pars.asci_test.vgcs_talker_est) {
286 if (not uplink_req_conf) {
287 setverdict(fail, "VGCS: No uplink request confirm as expected!");
288 return;
289 }
Andreas Eversberg5e3dd362023-07-07 12:09:00 +0200290 /* UPLINK BUSY is automatically sent by BTS, but not by BSC. */
291 if (uplink_busy) {
292 setverdict(fail, "VGCS: Uplink set to busy, this is not expected!");
Harald Welte801ed1a2023-04-30 15:07:00 +1000293 return;
294 }
295 log("VGCS: Uplink established and uplink marked busy as expected!");
296 setverdict(pass);
297 return;
298 }
299 if (g_pars.asci_test.vgcs_talker_rel) {
300 if (not uplink_rel_ind) {
301 setverdict(fail, "VGCS: No uplink release indication as expected!");
302 return;
303 }
304 if (not uplink_free) {
305 setverdict(fail, "VGCS: Uplink not free as expected!");
306 return;
307 }
308 log("VGCS: Uplink established+released and uplink marked free as expected!");
309 setverdict(pass);
310 return;
311 }
Andreas Eversberg35874922023-07-07 13:44:04 +0200312 if (g_pars.asci_test.vgcs_uplink_seized) {
313 if (not uplink_busy) {
314 setverdict(fail, "VGCS: Uplink not busy as expected!");
315 return;
316 }
317 log("VGCS: Uplink established+released and uplink marked free as expected!");
318 setverdict(pass);
319 return;
320 }
321 if (g_pars.asci_test.vgcs_uplink_release) {
322 if (not uplink_free) {
323 setverdict(fail, "VGCS: Uplink not free as expected!");
324 return;
325 }
326 log("VGCS: Uplink established+released and uplink marked free as expected!");
327 setverdict(pass);
328 return;
329 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000330}
331
332/*
333 * VGCS/VBS resource controling connection
334 */
335
336private altstep as_eat_rsl_data() runs on MSC_ConnHdlr {
Andreas Eversbergc0870e52023-07-07 12:06:24 +0200337 [] RSL.receive(tr_RSL_UNITDATA_REQ(g_chan_nr, ?, ?)) {
338 log("VGCS: Got RSL UNITDATA REQ on channel");
339 repeat;
340 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000341 [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, ?)) {
342 log("VGCS: Got RSL DATA REQ on channel");
343 repeat;
344 }
345}
346
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200347private function f_delay_bts() runs on MSC_ConnHdlr {
348 timer T := 2.0;
349 T.start;
350 alt {
351 [] COORD.receive(COORD_UPLINK_REQUEST_CONFIRM) {
352 setverdict(fail, "Got UPLINK REQUEST CONFIRM from BSC. This is unexpected.");
353 }
354 [] T.timeout { }
355 }
356}
357
Harald Welte801ed1a2023-04-30 15:07:00 +1000358private function f_tc_asci_assignment(charstring id) runs on MSC_ConnHdlr {
359 var PDU_BSSAP rx_bssap;
360 /* Hack: the proper way would be to wait for the BSSMAP VGCS Assignment Result and extract the
361 * actual assigned chan_nr from it. But osmo-bsc starts acting on the lchan even before we get a
362 * chance to evaluate the BSSMAP Handover Request ACK. So we need to assume that osmo-bsc will
363 * activate TS 1 and already set up this lchan's RSL emulation
364 * before we get started. */
365 var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(1, RSL_CHAN_NR_Bm_ACCH));
366 f_rslem_register(0, new_chan_nr);
367 g_chan_nr := new_chan_nr;
368 var uint3_t expect_target_tsc := c_BtsParams[0].tsc;
369 var default eat_rsl_data;
370
371 /* Wait for the COORD ports to be connected. */
372 f_sleep(1.0);
373
374 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
375 f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);
376 var default as_media := activate(as_Media());
377
378 log("VGCS: wait for establishment of call controling connection");
379 COORD.receive(COORD_VGCS_CALL_EST);
380 log("VGCS: got establishment of call controling connection");
381
382 /* TODO: Encryption */
383 var template (value) BSSMAP_IE_ChannelType req_ch_type := ts_BSSMAP_IE_ChannelType;
384 var template BSSMAP_IE_ChannelType res_ch_type := tr_BSSMAP_IE_ChannelType('0001'B, ChRate_TCHF, Spdi_TCHF_FR);
385 var template (value) BSSMAP_IE_CellIdentifier req_cell_id := ts_CellId_CI(0);
386 var template BSSMAP_IE_CellIdentifier res_cell_id := tr_CellId_CI(0);
387 var template (value) DescriptiveGroupOrBroadcastCallReference_V callref :=
388 ts_BSSMAP_IE_GroupCallRef(11, '1'B, '0'B, '000'B, '0000'B);
389 if (g_pars.asci_test.vgcs_assign_fail) {
390 callref := ts_BSSMAP_IE_GroupCallRef(10, '1'B, '0'B, '000'B, '0000'B);
391 }
392 var template (value) PDU_BSSAP ass_req := f_gen_asci_ass_req(ch_type := req_ch_type, cell_id := req_cell_id,
393 group_call_ref := bit2oct(encvalue(callref)));
394 /* VGCS/VBS ASS REQ in SCCP CR (must be the first message) */
395 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc, ass_req));
396 BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);
397
398 alt {
399 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentRes(res_ch_type, res_cell_id)) -> value rx_bssap {
400 log("VGCS: got assignment result on channel");
401 COORD.send(COORD_VGCS_ASSIGN_RES);
402 if (g_pars.asci_test.vgcs_talker_req or
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200403 g_pars.asci_test.vgcs_talker_fail or
Harald Welte801ed1a2023-04-30 15:07:00 +1000404 g_pars.asci_test.vgcs_talker_est or
405 g_pars.asci_test.vgcs_talker_rel) {
406 log("VGCS: sending talker det");
407 RSL.send(ts_RSL_TALKER_DET(g_chan_nr));
408 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200409 if (g_pars.asci_test.vgcs_talker_fail) {
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200410 if (g_pars.asci_test.delay_bts) {
411 log("VGCS: delay sending RSL failure ind");
412 f_delay_bts();
413 }
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200414 log("VGCS: sending RSL failure ind");
415 RSL.send(ts_RSL_CONN_FAIL_IND(g_chan_nr, RSL_ERR_TALKER_ACC_FAIL));
416 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000417 if (g_pars.asci_test.vgcs_talker_est or
418 g_pars.asci_test.vgcs_talker_rel) {
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200419 if (g_pars.asci_test.delay_bts) {
420 log("VGCS: delay sending RSL estblish ind");
421 f_delay_bts();
422 }
Harald Welte801ed1a2023-04-30 15:07:00 +1000423 log("VGCS: sending RSL etabish ind");
424 RSL.send(ts_RSL_EST_IND(g_chan_nr, ts_RslLinkID_DCCH(0), '1234'O));
425 }
426 if (g_pars.asci_test.vgcs_talker_rel) {
427 log("VGCS: sending RSL release ind");
428 RSL.send(ts_RSL_REL_IND(g_chan_nr, ts_RslLinkID_DCCH(0)));
429 }
430 repeat;
431 }
432 [] BSSAP.receive(tr_BSSMAP_VGCS_VBS_AssignmentFail) -> value rx_bssap {
433 log("VGCS: got assignment failure on channel");
434 COORD.send(COORD_VGCS_ASSIGN_FAIL);
435 log("VGCS: got release order after assignment failure");
436 COORD.receive(COORD_VGCS_CHANNEL_REL);
437 BSSAP.send(ts_BSSMAP_ClearCommand(0));
438 BSSAP.receive(tr_BSSMAP_ClearComplete);
439 BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
440 return;
441 }
442 [] COORD.receive(COORD_VGCS_CHANNEL_REL) {
443 log("VGCS: got release order of resource controling connection");
444 eat_rsl_data := activate(as_eat_rsl_data());
445 f_perform_clear_no_rr_rel();
446 deactivate(eat_rsl_data);
447 return;
448 }
Andreas Eversbergc0870e52023-07-07 12:06:24 +0200449 [] RSL.receive(tr_RSL_UNITDATA_REQ(g_chan_nr, ?, '082B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O)) {
Harald Welte801ed1a2023-04-30 15:07:00 +1000450 log("VGCS: Got UPLINK FREE on channel");
451 COORD.send(COORD_VGCS_UPLINK_FREE);
452 repeat;
453 }
Andreas Eversbergc0870e52023-07-07 12:06:24 +0200454 [] RSL.receive(tr_RSL_UNITDATA_REQ(g_chan_nr, ?, '062A'O)) {
Harald Welte801ed1a2023-04-30 15:07:00 +1000455 log("VGCS: Got UPLINK BUSY on channel");
456 COORD.send(COORD_VGCS_UPLINK_BUSY);
457 repeat;
458 }
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200459 [] COORD.receive(COORD_UPLINK_REQUEST_CONFIRM) { repeat; }
Harald Welte801ed1a2023-04-30 15:07:00 +1000460 }
461
462 /* The RSL Emulation magically accepts the Chan Activ behind the scenes. */
463
464 /* we're sure that the channel activation is done now, verify the parameters in it */
465 var RSL_Message chan_act := f_rslem_get_last_act(RSL_PROC, 0, g_chan_nr);
466 /* TODO: Encryption */
467 f_chan_act_verify_tsc(chan_act, expect_target_tsc);
468
469 if (ispresent(rx_bssap.pdu.bssmap.vGCS_VBSAssignmentResult.speechCodec)) {
470 if (not g_pars.aoip) {
471 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
472 "Expected no Speech Codec (Chosen)");
473 }
474 } else {
475 if (g_pars.aoip) {
476 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
477 "Expected Speech Codec (Chosen)");
478 }
479 }
480
481}
482
483testcase TC_vgcs_vbs_setup_only() runs on test_CT {
484 var MSC_ConnHdlr call_conn;
485 var TestHdlrParams pars := f_gen_test_hdlr_pars();
486
487 f_init(1, true);
488
489 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
490 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
491
492 pars.asci_test.vgcs_setup_ok := true;
493
494 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
495
496 call_conn.done;
497
498 f_shutdown_helper();
499}
500
501testcase TC_vgcs_vbs_assignment() runs on test_CT {
502 var MSC_ConnHdlr call_conn, chan_conn;
503 var TestHdlrParams pars := f_gen_test_hdlr_pars();
504
505 f_init(1, true);
506
507 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
508 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
509
510 pars.asci_test.vgcs_assign_ok := true;
511
512 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
513 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
514 /* Connect COORD ports of both functions. The functions will delay before using them. */
515 connect(call_conn:COORD, chan_conn:COORD);
516
517 call_conn.done;
518 chan_conn.done;
519
520 f_shutdown_helper();
521}
522
523testcase TC_vgcs_vbs_assignment_fail() runs on test_CT {
524 var MSC_ConnHdlr call_conn, chan_conn;
525 var TestHdlrParams pars := f_gen_test_hdlr_pars();
526
527 f_init(1, true);
528
529 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
530 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
531
532 pars.asci_test.vgcs_assign_fail := true;
533
534 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
535 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
536 /* Connect COORD ports of both functions. The functions will delay before using them. */
537 connect(call_conn:COORD, chan_conn:COORD);
538
539 call_conn.done;
540 chan_conn.done;
541
542 f_shutdown_helper();
543}
544
545testcase TC_vgcs_vbs_talker_req() runs on test_CT {
546 var MSC_ConnHdlr call_conn, chan_conn;
547 var TestHdlrParams pars := f_gen_test_hdlr_pars();
548
549 f_init(1, true);
550
551 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
552 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
553
554 pars.asci_test.vgcs_talker_req := true;
555
556 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
557 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
558 /* Connect COORD ports of both functions. The functions will delay before using them. */
559 connect(call_conn:COORD, chan_conn:COORD);
560
561 call_conn.done;
562 chan_conn.done;
563
564 f_shutdown_helper();
565}
566
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200567testcase TC_vgcs_vbs_talker_fail() runs on test_CT {
568 var MSC_ConnHdlr call_conn, chan_conn;
569 var TestHdlrParams pars := f_gen_test_hdlr_pars();
570
571 f_init(1, true);
572
573 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
574 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
575
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200576 /* MSC sends acknowledge before link on BTS fail. */
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200577 pars.asci_test.vgcs_talker_fail := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200578 pars.asci_test.delay_bts := 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
591testcase TC_vgcs_vbs_talker_fail_late_msc() 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 /* MSC sends acknowledge after link on BTS fail. */
601 pars.asci_test.vgcs_talker_fail := true;
602 pars.asci_test.delay_msc := true;
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200603
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
Harald Welte801ed1a2023-04-30 15:07:00 +1000615testcase TC_vgcs_vbs_talker_est() 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
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200624 /* MSC sends acknowledge before BTS establishes the uplink. */
Harald Welte801ed1a2023-04-30 15:07:00 +1000625 pars.asci_test.vgcs_talker_est := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200626 pars.asci_test.delay_bts := true;
627
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
639testcase TC_vgcs_vbs_talker_est_late_msc() 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
648 /* MSC sends acknowledge after BTS established the uplink. */
649 pars.asci_test.vgcs_talker_est := true;
650 pars.asci_test.delay_msc := true;
Harald Welte801ed1a2023-04-30 15:07:00 +1000651
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_rel() 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 pars.asci_test.vgcs_talker_rel := true;
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200673 pars.asci_test.delay_bts := true;
674
675 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
676 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
677 /* Connect COORD ports of both functions. The functions will delay before using them. */
678 connect(call_conn:COORD, chan_conn:COORD);
679
680 call_conn.done;
681 chan_conn.done;
682
683 f_shutdown_helper();
684}
685
686testcase TC_vgcs_vbs_talker_rel_late_msc() runs on test_CT {
687 var MSC_ConnHdlr call_conn, chan_conn;
688 var TestHdlrParams pars := f_gen_test_hdlr_pars();
689
690 f_init(1, true);
691
692 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
693 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
694
695 pars.asci_test.vgcs_talker_rel := true;
696 pars.asci_test.delay_msc := true;
Harald Welte801ed1a2023-04-30 15:07:00 +1000697
698 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
699 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
700 /* Connect COORD ports of both functions. The functions will delay before using them. */
701 connect(call_conn:COORD, chan_conn:COORD);
702
703 call_conn.done;
704 chan_conn.done;
705
706 f_shutdown_helper();
707}
708
Andreas Eversberg35874922023-07-07 13:44:04 +0200709testcase TC_vgcs_vbs_uplink_seized() runs on test_CT {
710 var MSC_ConnHdlr call_conn, chan_conn;
711 var TestHdlrParams pars := f_gen_test_hdlr_pars();
712
713 f_init(1, true);
714
715 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
716 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
717
718 pars.asci_test.vgcs_uplink_seized := true;
719
720 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
721 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
722 /* Connect COORD ports of both functions. The functions will delay before using them. */
723 connect(call_conn:COORD, chan_conn:COORD);
724
725 call_conn.done;
726 chan_conn.done;
727
728 f_shutdown_helper();
729}
730
731testcase TC_vgcs_vbs_uplink_release() runs on test_CT {
732 var MSC_ConnHdlr call_conn, chan_conn;
733 var TestHdlrParams pars := f_gen_test_hdlr_pars();
734
735 f_init(1, true);
736
737 pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
738 pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
739
740 pars.asci_test.vgcs_uplink_release := true;
741
742 call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
743 chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
744 /* Connect COORD ports of both functions. The functions will delay before using them. */
745 connect(call_conn:COORD, chan_conn:COORD);
746
747 call_conn.done;
748 chan_conn.done;
749
750 f_shutdown_helper();
751}
752
Harald Welte801ed1a2023-04-30 15:07:00 +1000753control {
754 execute( TC_vgcs_vbs_setup_only() );
755 execute( TC_vgcs_vbs_assignment() );
756 execute( TC_vgcs_vbs_assignment_fail() );
757 execute( TC_vgcs_vbs_talker_req() );
Andreas Eversbergcfdbb3e2023-07-20 12:22:58 +0200758 execute( TC_vgcs_vbs_talker_fail() );
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200759 execute( TC_vgcs_vbs_talker_fail_late_msc() );
Harald Welte801ed1a2023-04-30 15:07:00 +1000760 execute( TC_vgcs_vbs_talker_est() );
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200761 execute( TC_vgcs_vbs_talker_est_late_msc() );
Harald Welte801ed1a2023-04-30 15:07:00 +1000762 execute( TC_vgcs_vbs_talker_rel() );
Andreas Eversberg28d6b812023-07-20 13:07:26 +0200763 execute( TC_vgcs_vbs_talker_rel_late_msc() );
Andreas Eversberg35874922023-07-07 13:44:04 +0200764 execute( TC_vgcs_vbs_uplink_seized() );
765 execute( TC_vgcs_vbs_uplink_release() );
Harald Welte801ed1a2023-04-30 15:07:00 +1000766}
767
768
769}