blob: cb2b41e61862d27726c4448eec2227058232e636 [file] [log] [blame]
Harald Welte28d943e2017-11-25 15:00:50 +01001module BSC_Tests {
2
Harald Welte21b46bd2017-12-17 19:46:32 +01003/* Integration Tests for OsmoBSC
4 * (C) 2017 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 * This test suite tests OsmoBSC while emulating both multiple BTS + MS as
11 * well as the MSC. See README for more details.
12 *
13 * There are test cases that run in so-called 'handler mode' and test cases
14 * that run directly on top of the BSSAP and RSL CodecPorts. The "handler mode"
15 * tests abstract the multiplexing/demultiplexing of multiple SCCP connections
16 * and/or RSL channels and are hence suitable for higher-level test cases, while
17 * the "raw" tests directly on top of the CodecPorts are more suitable for lower-
18 * level testing.
19 */
20
Harald Welte4003d112017-12-09 22:35:39 +010021import from General_Types all;
Harald Welte28d943e2017-11-25 15:00:50 +010022import from Osmocom_Types all;
Harald Welteae026692017-12-09 01:03:01 +010023import from GSM_Types all;
Harald Welte28d943e2017-11-25 15:00:50 +010024import from IPL4asp_Types all;
25
Harald Welte6f521d82017-12-11 19:52:02 +010026import from BSSAP_Types all;
Harald Welteae026692017-12-09 01:03:01 +010027import from BSSAP_Adapter all;
28import from BSSAP_CodecPort all;
29import from BSSMAP_Templates all;
Harald Welte28d943e2017-11-25 15:00:50 +010030import from IPA_Emulation all;
Harald Welteae026692017-12-09 01:03:01 +010031import from IPA_Types all;
32import from RSL_Types all;
Harald Welte624f9632017-12-16 19:26:04 +010033import from RSL_Emulation all;
Daniel Willmann191e0d92018-01-17 12:44:35 +010034import from MGCP_Emulation all;
Harald Welte28d943e2017-11-25 15:00:50 +010035
Harald Welte96c94412017-12-09 03:12:45 +010036import from Osmocom_CTRL_Functions all;
Harald Weltea5d2ab22017-12-09 14:21:42 +010037import from Osmocom_CTRL_Types all;
Harald Welteffe55fc2018-01-17 22:39:54 +010038import from Osmocom_CTRL_Adapter all;
Harald Welte96c94412017-12-09 03:12:45 +010039
Harald Welte6f521d82017-12-11 19:52:02 +010040import from MobileL3_CommonIE_Types all;
Harald Weltee3bd6582018-01-31 22:51:25 +010041import from MobileL3_Types all;
Harald Welte6f521d82017-12-11 19:52:02 +010042import from L3_Templates all;
43import from GSM_RR_Types all;
44
Harald Welte5d1a2202017-12-13 19:51:29 +010045const integer NUM_BTS := 3;
Harald Welteae026692017-12-09 01:03:01 +010046const float T3101_MAX := 12.0;
Harald Welte28d943e2017-11-25 15:00:50 +010047
Harald Welte799c97b2017-12-14 17:50:30 +010048/* make sure to sync this with the osmo-bts.cfg you're using */
49const integer NUM_TCHF_PER_BTS := 5;
Harald Weltedd8cbf32018-01-28 12:07:52 +010050const integer NUM_SDCCH_PER_BTS := 4;
Harald Welte799c97b2017-12-14 17:50:30 +010051
Harald Welte4003d112017-12-09 22:35:39 +010052
Harald Welte21b46bd2017-12-17 19:46:32 +010053/* per-BTS state which we keep */
Harald Welte96c94412017-12-09 03:12:45 +010054type record BTS_State {
Harald Welte21b46bd2017-12-17 19:46:32 +010055 /* component reference to the IPA_Client component used for RSL */
Harald Weltea5d2ab22017-12-09 14:21:42 +010056 IPA_Client rsl
Harald Welte96c94412017-12-09 03:12:45 +010057}
58
Harald Weltea4ca4462018-02-09 00:17:14 +010059type component test_CT extends CTRL_Adapter_CT {
Harald Welte21b46bd2017-12-17 19:46:32 +010060 /* Array of per-BTS state */
Harald Welte96c94412017-12-09 03:12:45 +010061 var BTS_State bts[NUM_BTS];
Harald Welte21b46bd2017-12-17 19:46:32 +010062 /* array of per-BTS RSL test ports */
Harald Welteae026692017-12-09 01:03:01 +010063 port IPA_RSL_PT IPA_RSL[NUM_BTS];
Harald Weltea5d2ab22017-12-09 14:21:42 +010064
Daniel Willmann191e0d92018-01-17 12:44:35 +010065 var MGCP_Emulation_CT vc_MGCP;
66
Harald Weltea4ca4462018-02-09 00:17:14 +010067 var BSSAP_Adapter g_bssap;
68 /* for old legacy-tests only */
69 port BSSAP_CODEC_PT BSSAP;
70
Harald Welte21b46bd2017-12-17 19:46:32 +010071 /* are we initialized yet */
Harald Welte28d943e2017-11-25 15:00:50 +010072 var boolean g_initialized := false;
Harald Welte21b46bd2017-12-17 19:46:32 +010073
74 /* global test case guard timer */
Harald Welteae026692017-12-09 01:03:01 +010075 timer T_guard := 30.0;
76
Harald Welte28d943e2017-11-25 15:00:50 +010077}
78
79modulepar {
Harald Welte21b46bd2017-12-17 19:46:32 +010080 /* IP address at which the BSC can be reached */
Harald Welte696ddb62017-12-08 14:01:43 +010081 charstring mp_bsc_ip := "127.0.0.1";
Harald Welte21b46bd2017-12-17 19:46:32 +010082 /* port number to which to establish the IPA RSL connections */
Harald Welte696ddb62017-12-08 14:01:43 +010083 integer mp_bsc_rsl_port := 3003;
Harald Welte21b46bd2017-12-17 19:46:32 +010084 /* port number to which to establish the IPA CTRL connection */
Harald Welte96c94412017-12-09 03:12:45 +010085 integer mp_bsc_ctrl_port := 4249;
Daniel Willmann191e0d92018-01-17 12:44:35 +010086 /* IP address at which the test binds */
87 charstring mp_test_ip := "127.0.0.1";
Harald Weltea4ca4462018-02-09 00:17:14 +010088
89 BSSAP_Configuration mp_bssap_cfg := {
90 sccp_service_type := "mtp3_itu",
91 sctp_addr := { 23905, "127.0.0.1", 2905, "127.0.0.1" },
92 own_pc := 185,
93 own_ssn := 254,
94 peer_pc := 187,
95 peer_ssn := 254,
96 sio := '83'O
97 };
98}
99
100private function f_legacy_bssap_reset() runs on test_CT {
101 var BSSAP_N_UNITDATA_ind ud_ind;
102 timer T := 5.0;
103 BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, ts_BSSMAP_Reset(0)));
104 T.start;
105 alt {
106 [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_bssap.sccp_addr_own, g_bssap.sccp_addr_peer, tr_BSSMAP_ResetAck)) {
107 log("Received RESET-ACK in response to RESET, we're ready to go!");
108 }
109 [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {
110 log("Respoding to inbound RESET with RESET-ACK");
111 BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,
112 ts_BSSMAP_ResetAck));
113 repeat;
114 }
115 [] BSSAP.receive { repeat; }
116 [] T.timeout { setverdict(fail, "Waiting for RESET-ACK after sending RESET"); }
117 }
Harald Welte28d943e2017-11-25 15:00:50 +0100118}
119
Harald Welteae026692017-12-09 01:03:01 +0100120type record IPA_Client {
Harald Welte21b46bd2017-12-17 19:46:32 +0100121 /* IPA Emulation component reference */
Harald Welteae026692017-12-09 01:03:01 +0100122 IPA_Emulation_CT vc_IPA,
Harald Welte21b46bd2017-12-17 19:46:32 +0100123 /* Unit-ID and other CCM parameters to use for IPA client emulation */
Harald Welteae026692017-12-09 01:03:01 +0100124 IPA_CCM_Parameters ccm_pars,
Harald Welte21b46bd2017-12-17 19:46:32 +0100125 /* String identifier for this IPA Client */
Harald Welte624f9632017-12-16 19:26:04 +0100126 charstring id,
Harald Welte21b46bd2017-12-17 19:46:32 +0100127 /* Associated RSL Emulation Component (if any). Only used in "Handler mode" */
Harald Welte624f9632017-12-16 19:26:04 +0100128 RSL_Emulation_CT vc_RSL optional
Harald Welte28d943e2017-11-25 15:00:50 +0100129}
130
Harald Welte21b46bd2017-12-17 19:46:32 +0100131/*! Start the IPA/RSL related bits for one IPA_Client.
132 * \param clnt IPA_Client for which to establish
133 * \param bsc_host IP address / hostname of the BSC
134 * \param bsc_port TCP port number of the BSC
135 * \param i number identifying this BTS
136 * \param handler_mode Start an RSL_Emulation_CT component (true) or not (false) */
Harald Welte624f9632017-12-16 19:26:04 +0100137function f_ipa_rsl_start(inout IPA_Client clnt, charstring bsc_host, PortNumber bsc_port, integer i,
138 boolean handler_mode := false)
Harald Welte28d943e2017-11-25 15:00:50 +0100139runs on test_CT {
Harald Welteae026692017-12-09 01:03:01 +0100140 timer T := 10.0;
141
Harald Welte96c94412017-12-09 03:12:45 +0100142 clnt.id := "IPA" & int2str(i) & "-RSL";
Harald Welteae026692017-12-09 01:03:01 +0100143 clnt.vc_IPA := IPA_Emulation_CT.create(clnt.id & "-IPA");
144 clnt.ccm_pars := c_IPA_default_ccm_pars;
145 clnt.ccm_pars.name := "Osmocom TTCN-3 BTS Simulator";
146 clnt.ccm_pars.unit_id := int2str(1234+i) & "/0/0";
Harald Welte624f9632017-12-16 19:26:04 +0100147 if (handler_mode) {
148 clnt.vc_RSL := RSL_Emulation_CT.create(clnt.id & "-RSL");
149 }
Harald Welteae026692017-12-09 01:03:01 +0100150
151 map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
Harald Welte624f9632017-12-16 19:26:04 +0100152 if (handler_mode) {
153 connect(clnt.vc_IPA:IPA_RSL_PORT, clnt.vc_RSL:IPA_PT);
154 } else {
155 connect(clnt.vc_IPA:IPA_RSL_PORT, self:IPA_RSL[i]);
156 }
Harald Welteae026692017-12-09 01:03:01 +0100157
Harald Welte5d1a2202017-12-13 19:51:29 +0100158 clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", 10000+i, clnt.ccm_pars));
Harald Welte624f9632017-12-16 19:26:04 +0100159 if (handler_mode) {
160 clnt.vc_RSL.start(RSL_Emulation.main());
161 return;
162 }
Harald Welteae026692017-12-09 01:03:01 +0100163
164 /* wait for IPA RSL link to connect and send ID ACK */
165 T.start;
166 alt {
167 [] IPA_RSL[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_ID_ACK}) {
168 T.stop;
169 IPA_RSL[i].send(ts_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,ts_RSL_PAGING_LOAD_IND(23)));
170 }
Harald Welte60e823a2017-12-10 14:10:59 +0100171 [] IPA_RSL[i].receive(ASP_IPA_Event:?) { repeat }
Harald Welteae026692017-12-09 01:03:01 +0100172 [] IPA_RSL[i].receive { repeat }
173 [] T.timeout {
Harald Welte96c94412017-12-09 03:12:45 +0100174 setverdict(fail, "Timeout RSL waiting for ASP_IPA_EVENT_ID_ACK");
Harald Welteae026692017-12-09 01:03:01 +0100175 self.stop;
176 }
177 }
178}
179
Harald Welte21b46bd2017-12-17 19:46:32 +0100180/* Wait for the OML connection to be brought up by the external osmo-bts-omldummy */
Harald Weltea5d2ab22017-12-09 14:21:42 +0100181function f_wait_oml(integer bts_nr, charstring status, float secs_max) runs on test_CT {
182 timer T := secs_max;
183 T.start;
184 while (true) {
185 if (f_ctrl_get_bts(IPA_CTRL, bts_nr, "oml-connection-state") == status) {
186 T.stop;
Harald Weltebd868bd2017-12-10 18:28:40 +0100187 /* the 'degraded' state exists from OML connection time, and we have to wait
188 * until all MO's are initialized */
189 T.start(1.0);
190 T.timeout;
Harald Weltea5d2ab22017-12-09 14:21:42 +0100191 return;
192 }
Harald Weltef0d6ac62017-12-17 17:02:21 +0100193 f_sleep(0.1);
Harald Weltea5d2ab22017-12-09 14:21:42 +0100194 if (not T.running) {
195 setverdict(fail, "Timeout waiting for oml-connection-state ", status);
196 self.stop;
197 }
198 }
199}
200
Harald Welte21b46bd2017-12-17 19:46:32 +0100201/* sleep for given number of (fractional) seconds */
Harald Welteae026692017-12-09 01:03:01 +0100202function f_sleep(float seconds) {
203 timer T := seconds;
204 T.start;
205 T.timeout;
206}
207
Harald Welte21b46bd2017-12-17 19:46:32 +0100208/* global altstep for global guard timer; also takes care of responding RESET witH RESET-ACK */
Harald Welteae026692017-12-09 01:03:01 +0100209altstep as_Tguard() runs on test_CT {
Harald Welte60e823a2017-12-10 14:10:59 +0100210 var BSSAP_N_UNITDATA_ind ud_ind;
Harald Welteae026692017-12-09 01:03:01 +0100211 [] T_guard.timeout { setverdict(fail, "Timeout of T_guard"); }
Harald Welte60e823a2017-12-10 14:10:59 +0100212 /* always respond with RESET ACK to RESET */
213 [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {
214 BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,
215 ts_BSSMAP_ResetAck));
Harald Welte69c1c262017-12-13 21:02:08 +0100216 repeat;
Harald Welte60e823a2017-12-10 14:10:59 +0100217 }
Harald Welte28d943e2017-11-25 15:00:50 +0100218}
219
Daniel Willmann191e0d92018-01-17 12:44:35 +0100220function f_init_mgcp(charstring id) runs on test_CT {
221 id := id & "-MGCP";
222
223 var MGCPOps ops := {
224 create_cb := refers(MGCP_Emulation.ExpectedCreateCallback),
225 unitdata_cb := refers(MGCP_Emulation.DummyUnitdataCallback)
226 };
227 var MGCP_conn_parameters mgcp_pars := {
228 callagent_ip := mp_bsc_ip,
Harald Welte9e4273e2018-01-29 22:01:22 +0100229 callagent_udp_port := -1,
Daniel Willmann191e0d92018-01-17 12:44:35 +0100230 mgw_ip := mp_test_ip,
231 mgw_udp_port := 2427
232 };
233
234 vc_MGCP := MGCP_Emulation_CT.create(id);
235 vc_MGCP.start(MGCP_Emulation.main(ops, mgcp_pars, id));
236}
237
Harald Welte21b46bd2017-12-17 19:46:32 +0100238/* global initialization function
239 * \param nr_bts Number of BTSs we should start/bring up
240 * \param handler_mode Start an RSL_Emulation_CT component (true) or not (false) */
Harald Welte89d42e82017-12-17 16:42:41 +0100241function f_init(integer nr_bts := NUM_BTS, boolean handler_mode := false) runs on test_CT {
Harald Welte28d943e2017-11-25 15:00:50 +0100242 var integer i;
Harald Welte28d943e2017-11-25 15:00:50 +0100243
Harald Welteae026692017-12-09 01:03:01 +0100244 if (g_initialized) {
245 return;
Harald Welte28d943e2017-11-25 15:00:50 +0100246 }
Harald Welteae026692017-12-09 01:03:01 +0100247 g_initialized := true;
248
249 /* Call a function of our 'parent component' BSSAP_Adapter_CT to start the
250 * MSC-side BSSAP emulation */
Harald Welte67089ee2018-01-17 22:19:03 +0100251 if (handler_mode) {
Harald Weltea4ca4462018-02-09 00:17:14 +0100252 f_bssap_init(g_bssap, mp_bssap_cfg, "VirtMSC", MSC_BssmapOps);
Harald Welte67089ee2018-01-17 22:19:03 +0100253 } else {
Harald Weltea4ca4462018-02-09 00:17:14 +0100254 f_bssap_init(g_bssap, mp_bssap_cfg, "VirtMSC", omit);
255 connect(self:BSSAP, g_bssap.vc_SCCP:SCCP_SP_PORT);
256 f_legacy_bssap_reset();
Harald Welte67089ee2018-01-17 22:19:03 +0100257 }
Harald Welteffe55fc2018-01-17 22:39:54 +0100258 f_ipa_ctrl_start(mp_bsc_ip, mp_bsc_ctrl_port);
Harald Welte28d943e2017-11-25 15:00:50 +0100259
Daniel Willmann191e0d92018-01-17 12:44:35 +0100260 f_init_mgcp("VirtMSC");
261
Harald Welte89d42e82017-12-17 16:42:41 +0100262 for (i := 0; i < nr_bts; i := i+1) {
Harald Weltea5d2ab22017-12-09 14:21:42 +0100263 /* wait until osmo-bts-omldummy has respawned */
264 f_wait_oml(i, "degraded", 5.0);
265 /* start RSL connection */
Harald Welte624f9632017-12-16 19:26:04 +0100266 f_ipa_rsl_start(bts[i].rsl, mp_bsc_ip, mp_bsc_rsl_port, i, handler_mode);
Harald Weltea5d2ab22017-12-09 14:21:42 +0100267 /* wait until BSC tells us "connected" */
268 f_wait_oml(i, "connected", 5.0);
Harald Welte696ddb62017-12-08 14:01:43 +0100269 }
270
Harald Welteae026692017-12-09 01:03:01 +0100271 T_guard.start;
272 activate(as_Tguard());
Harald Welte28d943e2017-11-25 15:00:50 +0100273}
274
Harald Welte21b46bd2017-12-17 19:46:32 +0100275/* expect to receive a RSL message matching a specified templaten on a given BTS / stream */
Harald Welteae026692017-12-09 01:03:01 +0100276function f_exp_ipa_rx(integer bts_nr, template RSL_Message t_rx, float t_secs := 2.0, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)
277runs on test_CT return RSL_Message {
278 var ASP_RSL_Unitdata rx_rsl_ud;
279 timer T := t_secs;
280
281 T.start;
282 alt {
283 [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(sid, t_rx)) -> value rx_rsl_ud {
284 T.stop;
285 }
286 [] IPA_RSL[bts_nr].receive { repeat; }
Harald Welteb2917702017-12-10 15:48:52 +0100287 [] T.timeout {
288 setverdict(fail, "Timeout expecting ", t_rx);
289 self.stop;
290 }
Harald Welteae026692017-12-09 01:03:01 +0100291 }
292 return rx_rsl_ud.rsl;
293}
294
Harald Welte21b46bd2017-12-17 19:46:32 +0100295/* helper function to transmit RSL on a given BTS/stream */
Harald Welteae026692017-12-09 01:03:01 +0100296function f_ipa_tx(integer bts_nr, template RSL_Message t_tx, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)
297runs on test_CT {
298 IPA_RSL[bts_nr].send(ts_ASP_RSL_UD(sid, t_tx));
299}
300
301
Harald Welte4003d112017-12-09 22:35:39 +0100302/* verify we get a CHAN_ACT after CHAN RQD */
Harald Welteae026692017-12-09 01:03:01 +0100303testcase TC_chan_act_noreply() runs on test_CT {
304 var BSSAP_N_UNITDATA_ind ud_ind;
Harald Welte28d943e2017-11-25 15:00:50 +0100305
Harald Welte89d42e82017-12-17 16:42:41 +0100306 f_init(1);
Harald Welte28d943e2017-11-25 15:00:50 +0100307
Harald Welteae026692017-12-09 01:03:01 +0100308 IPA_RSL[0].send(ts_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,ts_RSL_CHAN_RQD('23'O, 23)));
309 f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
310 setverdict(pass);
Harald Welte28d943e2017-11-25 15:00:50 +0100311}
312
Harald Welte4003d112017-12-09 22:35:39 +0100313/* verify if the "chreq:total" counter increments as expected */
314testcase TC_chan_act_counter() runs on test_CT {
315 var BSSAP_N_UNITDATA_ind ud_ind;
316 var integer chreq_total;
317
Harald Welte89d42e82017-12-17 16:42:41 +0100318 f_init(1);
Harald Welte4003d112017-12-09 22:35:39 +0100319
320 chreq_total := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total");
321 IPA_RSL[0].send(ts_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,ts_RSL_CHAN_RQD('23'O, 23)));
322 f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
323 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total", chreq_total+1);
324
325 setverdict(pass);
326}
327
Harald Welteae026692017-12-09 01:03:01 +0100328/* CHAN RQD -> CHAN ACT -> CHAN ACT ACK -> RF CHAN REL */
329testcase TC_chan_act_ack_noest() runs on test_CT {
330 var RSL_Message rx_rsl;
331
Harald Welte89d42e82017-12-17 16:42:41 +0100332 f_init(1);
Harald Welteae026692017-12-09 01:03:01 +0100333
334 /* Send CHAN RQD and wait for allocation; acknowledge it */
Harald Welted6939652017-12-13 21:02:46 +0100335 var RslChannelNr chan_nr := f_chreq_act_ack();
Harald Welteae026692017-12-09 01:03:01 +0100336
337 /* expect BSC to disable the channel again if there's no RLL EST IND */
338 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
339
340 setverdict(pass);
341}
342
343/* Test behavior if MSC never answers to CR */
344testcase TC_chan_act_ack_est_ind_noreply() runs on test_CT {
Harald Weltef77aef62018-01-28 15:35:42 +0100345 var RslLinkId main_dcch := valueof(ts_RslLinkID_DCCH(0));
346 var IpaStreamId sid := IPAC_PROTO_RSL_TRX0;
Harald Welteae026692017-12-09 01:03:01 +0100347 var RSL_Message rx_rsl;
Harald Weltef77aef62018-01-28 15:35:42 +0100348 var ASP_RSL_Unitdata rx_rsl_ud;
Harald Welteae026692017-12-09 01:03:01 +0100349
Harald Welte89d42e82017-12-17 16:42:41 +0100350 f_init(1);
Harald Welteae026692017-12-09 01:03:01 +0100351
352 /* Send CHAN RQD and wait for allocation; acknowledge it */
Harald Welted6939652017-12-13 21:02:46 +0100353 var RslChannelNr chan_nr := f_chreq_act_ack();
Harald Welteae026692017-12-09 01:03:01 +0100354
355 var octetstring l3 := '00010203040506'O
356 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
357
358 BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3)));
359
360 /* expect BSC to disable the channel again if there's no response from MSC */
Harald Weltef77aef62018-01-28 15:35:42 +0100361 /* MS waits 20s (T3210) at LU; 10s (T3230) at CM SERV REQ and 5s (T3220) AT detach */
362 IPA_RSL[0].clear;
363 alt {
364 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(sid, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL))) -> value rx_rsl_ud { }
365 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(sid, tr_RSL_REL_REQ(chan_nr, ?))) -> value rx_rsl_ud {
366 f_ipa_tx(0, ts_RSL_REL_CONF(chan_nr, main_dcch));
367 repeat;
368 }
369 }
Harald Welteae026692017-12-09 01:03:01 +0100370
371 setverdict(pass);
372}
373
374/* Test behavior if MSC answers with CREF to CR */
375testcase TC_chan_act_ack_est_ind_refused() runs on test_CT {
376 var BSSAP_N_CONNECT_ind rx_c_ind;
377 var RSL_Message rx_rsl;
378
Harald Welte89d42e82017-12-17 16:42:41 +0100379 f_init(1);
Harald Welteae026692017-12-09 01:03:01 +0100380
381 /* Send CHAN RQD and wait for allocation; acknowledge it */
Harald Welted6939652017-12-13 21:02:46 +0100382 var RslChannelNr chan_nr := f_chreq_act_ack();
Harald Welteae026692017-12-09 01:03:01 +0100383
384 var octetstring l3 := '00010203040506'O
385 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
386
387 BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
388 BSSAP.send(ts_BSSAP_DISC_req(rx_c_ind.connectionId, 0));
389
390 /* expect BSC to disable the channel */
Harald Welte725844b2018-01-28 16:18:32 +0100391 f_expect_chan_rel(0, chan_nr);
Harald Welteae026692017-12-09 01:03:01 +0100392 setverdict(pass);
393}
394
Harald Welte618ef642017-12-14 14:58:20 +0100395/* CHAN RQD -> CHAN ACT -> CHAN ACT NACK -> RF CHAN REL */
396testcase TC_chan_act_nack() runs on test_CT {
397 var RSL_Message rx_rsl;
398 var integer chact_nack;
399
Harald Welte89d42e82017-12-17 16:42:41 +0100400 f_init(1);
Harald Welte618ef642017-12-14 14:58:20 +0100401
402 chact_nack := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "chan_act:nack");
403
404 f_ipa_tx(0, ts_RSL_CHAN_RQD('33'O, 33));
405 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
406 var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
407
408 f_ipa_tx(0, ts_RSL_CHAN_ACT_NACK(chan_nr, RSL_ERR_EQUIPMENT_FAIL));
409
410 /* wait for some time to hope the NACK arrives before the CTRL GET below */
411 f_sleep(0.5);
412
413 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chan_act:nack", chact_nack+1);
414
415 setverdict(pass);
416}
417
Harald Welte799c97b2017-12-14 17:50:30 +0100418/* Test for channel exhaustion due to RACH overload */
419testcase TC_chan_exhaustion() runs on test_CT {
420 var ASP_RSL_Unitdata rsl_ud;
421 var integer i;
422 var integer chreq_total, chreq_nochan;
423
Harald Welte89d42e82017-12-17 16:42:41 +0100424 f_init(1);
Harald Welte799c97b2017-12-14 17:50:30 +0100425
426 chreq_total := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total");
427 chreq_nochan := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:no_channel");
428
429 /* expect 5xTCH/F to succeed */
Harald Weltedd8cbf32018-01-28 12:07:52 +0100430 for (i := 0; i < NUM_TCHF_PER_BTS + NUM_SDCCH_PER_BTS; i := i+1) {
Harald Welte799c97b2017-12-14 17:50:30 +0100431 f_chreq_act_ack('23'O, i);
432 }
433
434 IPA_RSL[0].clear;
435
Harald Weltedd8cbf32018-01-28 12:07:52 +0100436 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total",
437 chreq_total+NUM_TCHF_PER_BTS+NUM_SDCCH_PER_BTS);
Harald Welte799c97b2017-12-14 17:50:30 +0100438
439 /* now expect additional channel activations to fail */
440 f_ipa_tx(0, ts_RSL_CHAN_RQD('42'O, 42));
441
442 alt {
443 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
444 tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV))) {
445 setverdict(fail, "Received CHAN ACT ACK without resources?!?");
446 }
447 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_IMM_ASSIGN(?))) -> value rsl_ud {
448 var GsmRrMessage rr;
449 /* match on IMM ASS REJ */
450 rr := dec_GsmRrMessage(rsl_ud.rsl.ies[1].body.full_imm_ass_info.payload);
451 if (rr.header.message_type == IMMEDIATE_ASSIGNMENT_REJECT) {
452 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total",
Harald Weltedd8cbf32018-01-28 12:07:52 +0100453 chreq_total+NUM_TCHF_PER_BTS+NUM_SDCCH_PER_BTS+1);
Harald Welte799c97b2017-12-14 17:50:30 +0100454 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:no_channel",
455 chreq_nochan+1);
456 setverdict(pass);
457 } else {
458 repeat;
459 }
460 }
461 [] IPA_RSL[0].receive { repeat; }
462 }
463}
464
Harald Weltecfe2c962017-12-15 12:09:32 +0100465/***********************************************************************
466 * Assignment Testing
467 ***********************************************************************/
468
469/* Verify that the BSC refuses any BSSAP connection from the MSC (They are all BSC->MSC direction) */
470testcase TC_outbound_connect() runs on test_CT {
Harald Welte89d42e82017-12-17 16:42:41 +0100471 f_init(1);
Harald Weltecfe2c962017-12-15 12:09:32 +0100472
Harald Weltea4ca4462018-02-09 00:17:14 +0100473 BSSAP.send(ts_BSSAP_CONNECT_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, 2342, ts_BSSMAP_AssignmentReq));
Harald Weltecfe2c962017-12-15 12:09:32 +0100474 BSSAP.receive(tr_BSSAP_DISC_ind(2342, ?, ?));
475 setverdict(pass);
476}
477
Harald Welte16a4adf2017-12-14 18:54:01 +0100478/* Test behavior if MSC answers with CREF to CR */
479testcase TC_assignment_cic_only() runs on test_CT {
480 var BSSAP_N_CONNECT_ind rx_c_ind;
481 var RSL_Message rx_rsl;
482 var DchanTuple dt;
483
Harald Welte89d42e82017-12-17 16:42:41 +0100484 f_init(1);
Harald Welte16a4adf2017-12-14 18:54:01 +0100485
486 dt := f_est_dchan('23'O, 23, '00000000'O);
487 /* send assignment without AoIP IEs */
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100488 BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_AssignmentReq(ts_BSSMAP_IE_CIC(0, 1))));
Harald Welte16a4adf2017-12-14 18:54:01 +0100489 alt {
490 [] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentComplete)) {
491 setverdict(fail, "AoIP BSC cannot accept ASSIGNMENT without AoIP Transport IE");
492 }
Harald Welte235ebf12017-12-15 14:18:16 +0100493 /* TODO: Actually expect GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP */
Harald Welte16a4adf2017-12-14 18:54:01 +0100494 [] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentFail)) {
495 setverdict(pass);
496 }
497 [] BSSAP.receive { repeat; }
498 }
499}
500
Harald Welte235ebf12017-12-15 14:18:16 +0100501/* Run everything required up to sending a caller-specified assignment command and expect response */
502function f_assignment_exp(PDU_BSSAP ass_cmd, template PDU_BSSAP exp, charstring fail_text)
503runs on test_CT {
504 var BSSAP_N_CONNECT_ind rx_c_ind;
505 var RSL_Message rx_rsl;
506 var DchanTuple dt;
507
Harald Welte89d42e82017-12-17 16:42:41 +0100508 f_init(1);
Harald Welte235ebf12017-12-15 14:18:16 +0100509
510 dt := f_est_dchan('23'O, 23, '00000000'O);
511 /* send assignment without AoIP IEs */
512 BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ass_cmd));
513 alt {
514 [] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentComplete)) {
515 if (ischosen(exp.pdu.bssmap.assignmentComplete)) {
516 setverdict(pass);
517 } else {
518 setverdict(fail, fail_text);
519 }
520 }
521 [] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentFail)) {
522 if (ischosen(exp.pdu.bssmap.assignmentFailure)) {
523 setverdict(pass);
524 } else {
525 setverdict(fail, fail_text);
526 }
527 }
528 [] BSSAP.receive { repeat; }
529 }
530}
531testcase TC_assignment_csd() runs on test_CT {
532 var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail;
533 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
534 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
535 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelTypeCSD);
536 //exp_fail.pdu.bssmap.assignmentFailure.cause.causeValue := int2bit(enum2int(GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL), 7);
537 f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for CSD");
538}
539
540testcase TC_assignment_ctm() runs on test_CT {
541 var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail;
542 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
543 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
544 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelTypeCTM);
545 //exp_fail.pdu.bssmap.assignmentFailure.cause.causeValue := int2bit(enum2int(GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL), 7);
546 f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for Speech+CTM");
547}
548
Harald Welte4003d112017-12-09 22:35:39 +0100549type record DchanTuple {
550 integer sccp_conn_id,
551 RslChannelNr rsl_chan_nr
Harald Weltea5d2ab22017-12-09 14:21:42 +0100552}
553
Harald Welted6939652017-12-13 21:02:46 +0100554/* Send CHAN RQD and wait for allocation; acknowledge it */
555private function f_chreq_act_ack(OCT1 ra := '23'O, GsmFrameNumber fn := 23)
556runs on test_CT return RslChannelNr {
557 var RSL_Message rx_rsl;
558 f_ipa_tx(0, ts_RSL_CHAN_RQD(ra, fn));
559 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
560 var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
561 f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
562 return chan_nr;
563}
564
Harald Welte4003d112017-12-09 22:35:39 +0100565/* helper function to establish a dedicated channel via BTS and MSC */
566function f_est_dchan(OCT1 ra, GsmFrameNumber fn, octetstring l3)
567runs on test_CT return DchanTuple {
568 var BSSAP_N_CONNECT_ind rx_c_ind;
Harald Welte4003d112017-12-09 22:35:39 +0100569 var DchanTuple dt;
Harald Weltea5d2ab22017-12-09 14:21:42 +0100570
Harald Welte4003d112017-12-09 22:35:39 +0100571 /* Send CHAN RQD and wait for allocation; acknowledge it */
Harald Welted6939652017-12-13 21:02:46 +0100572 dt.rsl_chan_nr := f_chreq_act_ack(ra, fn);
Harald Welte4003d112017-12-09 22:35:39 +0100573
574 f_ipa_tx(0, ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
575
576 BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
577 dt.sccp_conn_id := rx_c_ind.connectionId;
578 BSSAP.send(ts_BSSAP_CONNECT_res(dt.sccp_conn_id));
579
580 return dt;
Harald Weltea5d2ab22017-12-09 14:21:42 +0100581}
582
Harald Welte4003d112017-12-09 22:35:39 +0100583/* Test behavior of channel release after unilateral RLL REL IND (DISC from MS) */
584testcase TC_chan_rel_rll_rel_ind() runs on test_CT {
585 var RSL_Message rx_rsl;
586 var DchanTuple dt;
Harald Welte96c94412017-12-09 03:12:45 +0100587
Harald Welte89d42e82017-12-17 16:42:41 +0100588 f_init(1);
Harald Welte96c94412017-12-09 03:12:45 +0100589
Harald Welte4003d112017-12-09 22:35:39 +0100590 dt := f_est_dchan('23'O, 23, '00010203040506'O);
591
592 /* simulate RLL REL IND */
593 f_ipa_tx(0, ts_RSL_REL_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0))));
594
595 /* expect BSC to disable the channel */
596 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
597 /* respond with CHAN REL ACK */
598 f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
599
600 /* expect DISC_IND on MSC side */
601 BSSAP.receive(tr_BSSAP_DISC_ind(dt.sccp_conn_id, ?, ?));
602
603 setverdict(pass);
604}
605
606/* Test behavior of channel release after CONN FAIL IND from BTS */
607testcase TC_chan_rel_conn_fail() runs on test_CT {
608 var BSSAP_N_DATA_ind rx_di;
609 var RSL_Message rx_rsl;
610 var DchanTuple dt;
611
Harald Welte89d42e82017-12-17 16:42:41 +0100612 f_init(1);
Harald Welte4003d112017-12-09 22:35:39 +0100613
614 dt := f_est_dchan('23'O, 23, '00010203040506'O);
615
616 /* simulate CONN FAIL IND */
Harald Weltea8ed9062017-12-14 09:46:01 +0100617 f_ipa_tx(0, ts_RSL_CONN_FAIL_IND(dt.rsl_chan_nr, RSL_ERR_RADIO_LINK_FAIL));
Harald Welte4003d112017-12-09 22:35:39 +0100618 /* TODO: different cause values? */
619
Harald Welte4003d112017-12-09 22:35:39 +0100620 /* expect Clear Request from BSC */
621 BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearRequest)) -> value rx_di;
622
623 /* Instruct BSC to clear channel */
624 var BssmapCause cause := bit2int(rx_di.userData.pdu.bssmap.clearRequest.cause.causeValue);
625 BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
626
Harald Welte6ff76ea2018-01-28 13:08:01 +0100627 /* expect BSC to disable the channel */
628 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
629 /* respond with CHAN REL ACK */
630 f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
631
Harald Welte4003d112017-12-09 22:35:39 +0100632 /* expect Clear Complete from BSC */
633 BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete));
634
635 /* release the SCCP connection */
636 BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
637
638 /* wait for SCCP emulation to do its job */
639 f_sleep(1.0);
640
641 setverdict(pass);
642}
643
Harald Welte91d54a52018-01-28 15:35:07 +0100644function f_expect_chan_rel(integer bts_nr, RslChannelNr rsl_chan_nr, boolean flush := true,
645 boolean handle_rll_rel := true) runs on test_CT {
646
647 var RslLinkId main_dcch := valueof(ts_RslLinkID_DCCH(0));
648 if (flush) {
649 /* Clear the queue, it might still contain stuff like IMMEDIATE ASSIGN */
650 IPA_RSL[bts_nr].clear;
651 }
652 alt {
653 /* ignore DEACTIVATE SACCH (if any) */
654 [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
655 tr_RSL_DEACT_SACCH(rsl_chan_nr))) {
656 repeat;
657 }
658 /* acknowledge RLL release (if any)*/
659 [handle_rll_rel] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
660 tr_RSL_REL_REQ(rsl_chan_nr, ?))) {
661 /* FIXME: Why are we getting this for LinkID SACCH? */
662 f_ipa_tx(0, ts_RSL_REL_CONF(rsl_chan_nr, main_dcch));
663 repeat;
664 }
665 /* Expect RF channel release from BSC on Abis */
666 [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
667 tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL))) {
668 /* respond with CHAN REL ACK */
669 f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(rsl_chan_nr));
670 }
671 /* ignore any user data */
672 [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_MsgTypeR(?))) {
673 repeat;
674 }
675 }
676}
677
Harald Welte4003d112017-12-09 22:35:39 +0100678/* Test behavior of channel release after hard Clear Command from MSC */
679testcase TC_chan_rel_hard_clear() runs on test_CT {
680 var BSSAP_N_DATA_ind rx_di;
Harald Welte4003d112017-12-09 22:35:39 +0100681 var DchanTuple dt;
Harald Welte4003d112017-12-09 22:35:39 +0100682
Harald Welte89d42e82017-12-17 16:42:41 +0100683 f_init(1);
Harald Welte4003d112017-12-09 22:35:39 +0100684
685 dt := f_est_dchan('23'O, 23, '00010203040506'O);
686
687 /* Instruct BSC to clear channel */
688 var BssmapCause cause := 0;
689 BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
690
691 /* expect Clear Complete from BSC on A */
692 BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete)) {
693 /* release the SCCP connection */
694 BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
695 }
696
Harald Welte91d54a52018-01-28 15:35:07 +0100697 f_expect_chan_rel(0, dt.rsl_chan_nr);
Harald Welte4003d112017-12-09 22:35:39 +0100698 setverdict(pass);
699}
700
Harald Welted8c36cd2017-12-09 23:05:31 +0100701/* Test behavior of channel release after hard RLSD from MSC */
702testcase TC_chan_rel_hard_rlsd() runs on test_CT {
Harald Welted8c36cd2017-12-09 23:05:31 +0100703 var DchanTuple dt;
Harald Welted8c36cd2017-12-09 23:05:31 +0100704
Harald Welte89d42e82017-12-17 16:42:41 +0100705 f_init(1);
Harald Welted8c36cd2017-12-09 23:05:31 +0100706
707 dt := f_est_dchan('23'O, 23, '00010203040506'O);
708
709 /* release the SCCP connection */
710 BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
711
Harald Welte91d54a52018-01-28 15:35:07 +0100712 f_expect_chan_rel(0, dt.rsl_chan_nr);
Harald Welted8c36cd2017-12-09 23:05:31 +0100713 setverdict(pass);
714}
715
Harald Welte85804d42017-12-10 14:11:58 +0100716/* Test behavior of channel release after BSSMAP RESET from MSC */
717testcase TC_chan_rel_a_reset() runs on test_CT {
Harald Welte85804d42017-12-10 14:11:58 +0100718 var DchanTuple dt;
Harald Welte85804d42017-12-10 14:11:58 +0100719
Harald Welte89d42e82017-12-17 16:42:41 +0100720 f_init(1);
Harald Welte85804d42017-12-10 14:11:58 +0100721
722 dt := f_est_dchan('23'O, 23, '00010203040506'O);
723
724 /* Clear the queue, it might still contain stuff like IMMEDIATE ASSIGN */
725 IPA_RSL[0].clear;
726
727 /* perform BSSAP RESET, expect RESET ACK and DISC.ind on connection */
Harald Weltea4ca4462018-02-09 00:17:14 +0100728 BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, ts_BSSMAP_Reset(0)));
Harald Welte85804d42017-12-10 14:11:58 +0100729 interleave {
Harald Weltea4ca4462018-02-09 00:17:14 +0100730 [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_bssap.sccp_addr_own, g_bssap.sccp_addr_peer, tr_BSSMAP_ResetAck)) { }
Harald Welte85804d42017-12-10 14:11:58 +0100731 [] BSSAP.receive(tr_BSSAP_DISC_ind(dt.sccp_conn_id, ?, ?)) { }
732 }
733
Philipp Maiere8f38ed2018-02-09 10:30:31 +0100734 f_expect_chan_rel(0, dt.rsl_chan_nr, false);
Harald Welte85804d42017-12-10 14:11:58 +0100735 setverdict(pass);
736}
737
Harald Welte5cd20ed2017-12-13 21:03:20 +0100738/* Test behavior if RSL EST IND for non-active channel */
739testcase TC_rll_est_ind_inact_lchan() runs on test_CT {
740 timer T := 2.0;
741
Harald Welte89d42e82017-12-17 16:42:41 +0100742 f_init(1);
Harald Welte5cd20ed2017-12-13 21:03:20 +0100743
744 var octetstring l3 := '00010203040506'O;
745 var RslChannelNr chan_nr := valueof(t_RslChanNr_Bm(6));
746 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
747
748 T.start;
749 alt {
750 [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) {
751 setverdict(fail, "MSC received COMPL L3 for non-active lchan");
752 }
753 [] BSSAP.receive {}
754 [] IPA_RSL[0].receive {}
755 [] T.timeout {}
756 }
757
758 setverdict(pass);
759}
760
761/* Test behavior if RSL EST IND for invalid SAPI */
762testcase TC_rll_est_ind_inval_sapi1() runs on test_CT {
763 var RslChannelNr chan_nr;
764
Harald Welte89d42e82017-12-17 16:42:41 +0100765 f_init(1);
Harald Welte5cd20ed2017-12-13 21:03:20 +0100766
767 chan_nr := f_chreq_act_ack()
768
769 var octetstring l3 := '00010203040506'O;
770 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(1)), l3));
771
772 timer T := 2.0;
773 T.start;
774 alt {
775 [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) {
776 setverdict(fail, "MSC received COMPL L3 for invalid SAPI 1");
777 }
778 [] BSSAP.receive { repeat; }
779 [] IPA_RSL[0].receive { repeat; }
780 [] T.timeout {}
781 }
782
783 setverdict(pass);
784}
785
786/* Test behavior if RSL EST IND for invalid SAPI */
787testcase TC_rll_est_ind_inval_sapi3() runs on test_CT {
788 timer T := 2.0;
789
Harald Welte89d42e82017-12-17 16:42:41 +0100790 f_init(1);
Harald Welte5cd20ed2017-12-13 21:03:20 +0100791
792 var RslChannelNr chan_nr := f_chreq_act_ack();
793
794 var octetstring l3 := '00010203040506'O;
795 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(3)), l3));
796
797 T.start;
798 alt {
799 [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) {
800 setverdict(fail, "MSC received COMPL L3 for invalid SAPI 3");
801 }
802 [] BSSAP.receive { repeat; }
803 [] IPA_RSL[0].receive { repeat; }
804 [] T.timeout {}
805 }
806
807 setverdict(pass);
808}
809
810/* Test behavior if RSL EST IND for invalid SACCH */
811testcase TC_rll_est_ind_inval_sacch() runs on test_CT {
812 timer T := 2.0;
813
Harald Welte89d42e82017-12-17 16:42:41 +0100814 f_init(1);
Harald Welte5cd20ed2017-12-13 21:03:20 +0100815
816 var RslChannelNr chan_nr := f_chreq_act_ack();
817
818 var octetstring l3 := '00010203040506'O;
819 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_SACCH(0)), l3));
820
821 T.start;
822 alt {
823 [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) {
824 setverdict(fail, "MSC received COMPL L3 for invalid Link SACCH");
825 }
826 [] BSSAP.receive { repeat; }
827 [] IPA_RSL[0].receive { repeat; }
828 [] T.timeout {}
829 }
830
831 setverdict(pass);
832}
833
834
835
Harald Welte4003d112017-12-09 22:35:39 +0100836
837testcase TC_ctrl_msc_connection_status() runs on test_CT {
838 var charstring ctrl_resp;
839
Harald Welte89d42e82017-12-17 16:42:41 +0100840 f_init(1);
Harald Welte4003d112017-12-09 22:35:39 +0100841
842 /* See https://osmocom.org/issues/2729 */
843 f_ctrl_get_exp(IPA_CTRL, "msc_connection_status", "connected");
844 setverdict(pass);
845}
846
Stefan Sperlingb041b3d2018-01-03 17:14:55 +0100847testcase TC_ctrl_msc0_connection_status() runs on test_CT {
848 var charstring ctrl_resp;
849
850 f_init(1);
Stefan Sperlingb041b3d2018-01-03 17:14:55 +0100851
852 f_ctrl_get_exp(IPA_CTRL, "msc.0.connection_status", "connected");
853 setverdict(pass);
854}
855
Harald Welte4003d112017-12-09 22:35:39 +0100856testcase TC_ctrl() runs on test_CT {
857 var charstring ctrl_resp;
858
Harald Welte89d42e82017-12-17 16:42:41 +0100859 f_init(1);
Harald Welte4003d112017-12-09 22:35:39 +0100860
861 /* all below values must match the osmo-bsc.cfg config file used */
862
863 f_ctrl_get_exp(IPA_CTRL, "mcc", "1");
864 f_ctrl_get_exp(IPA_CTRL, "mnc", "1");
Harald Welte44bdaa52017-12-17 17:01:47 +0100865 f_ctrl_get_exp(IPA_CTRL, "number-of-bts", "3");
Harald Welte4003d112017-12-09 22:35:39 +0100866
867 var integer bts_nr := 0;
868 f_ctrl_get_exp_bts(IPA_CTRL, bts_nr, "location-area-code", "1");
869 f_ctrl_get_exp_bts(IPA_CTRL, bts_nr, "cell-identity", "0");
870 f_ctrl_get_exp_bts(IPA_CTRL, bts_nr, "oml-connection-state", "connected");
871 f_ctrl_get_exp_bts(IPA_CTRL, bts_nr, "gprs-mode", "gprs");
872 f_ctrl_get_exp_bts(IPA_CTRL, bts_nr, "rf_state", "operational,unlocked,on");
873 f_ctrl_get_exp_trx(IPA_CTRL, bts_nr, 0, "arfcn", "871");
874 f_ctrl_get_exp_trx(IPA_CTRL, bts_nr, 0, "max-power-reduction", "20");
875
876 var integer uptime := str2int(f_ctrl_get_bts(IPA_CTRL, bts_nr, "oml-uptime"));
877 f_sleep(2.0);
878 if (str2int(f_ctrl_get_bts(IPA_CTRL, bts_nr, "oml-uptime")) < uptime+1) {
879 setverdict(fail, "oml-uptime not incrementing as expected");
880 }
881 /* TODO: Disconnect RSL, imply that OML is disconnected and check for uptime zero? */
882
883 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bsc", 0, "paging:attempted", 0);
884
885 setverdict(pass);
Harald Welte96c94412017-12-09 03:12:45 +0100886}
887
Harald Welte6f521d82017-12-11 19:52:02 +0100888function f_bssap_tx_ud(template PDU_BSSAP bssap) runs on test_CT {
Harald Weltea4ca4462018-02-09 00:17:14 +0100889 BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, bssap));
Harald Welte6f521d82017-12-11 19:52:02 +0100890}
891
892
893/***********************************************************************
894 * Paging Testing
895 ***********************************************************************/
896
897type record Cell_Identity {
898 GsmMcc mcc,
899 GsmMnc mnc,
900 GsmLac lac,
901 GsmCellId ci
902};
903private const Cell_Identity cid := { '001'H, '001'H, 1, 0 };
904
Harald Welte5d1a2202017-12-13 19:51:29 +0100905type set of integer BtsIdList;
906
907private function f_bts_in_list(integer bts_id, BtsIdList bts_ids) return boolean {
908 for (var integer j := 0; j < sizeof(bts_ids); j := j + 1) {
909 if (bts_id == bts_ids[j]) {
910 return true;
911 }
912 }
913 return false;
914}
Harald Welte6f521d82017-12-11 19:52:02 +0100915
916/* core paging test helper function; used by most paging test cases */
917private function f_pageing_helper(hexstring imsi,
918 template BSSMAP_FIELD_CellIdentificationList cid_list,
Harald Welte5d1a2202017-12-13 19:51:29 +0100919 BtsIdList bts_ids := { 0 },
Harald Welte6f521d82017-12-11 19:52:02 +0100920 template RSL_ChanNeeded rsl_chneed := omit,
921 template OCT4 tmsi := omit) runs on test_CT
922{
923 var template BSSMAP_IE_ChannelNeeded bssmap_chneed;
924 var MobileIdentity mi;
925 var template octetstring id_enc; /* FIXME */
926 var RSL_Message rx_rsl;
927 var integer paging_group := hex2int(imsi[lengthof(imsi)-1]);
Harald Welte5d1a2202017-12-13 19:51:29 +0100928 var integer i;
Harald Welte6f521d82017-12-11 19:52:02 +0100929
930 f_init();
Harald Welte6f521d82017-12-11 19:52:02 +0100931
932 /* Clear the queue, it might still contain stuff like BCCH FILLING */
Harald Welte5d1a2202017-12-13 19:51:29 +0100933 for (i := 0; i < sizeof(bts_ids); i := i + 1) {
934 IPA_RSL[bts_ids[i]].clear;
935 }
Harald Welte6f521d82017-12-11 19:52:02 +0100936
937 if (isvalue(rsl_chneed)) {
938 /* The values of 08.08 3.2.2.36 and 08.58 9.3.40 are luckily identical */
939 bssmap_chneed := ts_BSSMAP_IE_ChanNeeded(int2bit(enum2int(valueof(rsl_chneed)),2));
940 } else {
941 bssmap_chneed := omit;
942 }
943
944 f_bssap_tx_ud(ts_BSSMAP_Paging(imsi, cid_list, tmsi, bssmap_chneed));
945
946/* FIXME: Disabled due to bugs in both GSM_RR_Types and MobileL3_CommonIE_Types IMSI encoder
947 if (isvalue(tmsi)) {
948 mi := valueof(t_Osmo_MI_TMSI(oct2int(valueof(tmsi))));
949 } else {
950 mi := valueof(ts_Osmo_MI_IMSI(imsi));
951 }
952 id_enc := enc_MobileIdentity(mi);
953*/
954 id_enc := ?;
Harald Welte5d1a2202017-12-13 19:51:29 +0100955 for (i := 0; i < sizeof(bts_ids); i := i + 1) {
956 rx_rsl := f_exp_ipa_rx(bts_ids[i], tr_RSL_PAGING_CMD(id_enc));
957 /* check channel type, paging group */
958 if (rx_rsl.ies[1].body.paging_group != paging_group) {
959 setverdict(fail, "Paging for wrong paging group");
960 }
961 if (ispresent(rsl_chneed) and
962 rx_rsl.ies[3].body.chan_needed.chan_needed != valueof(rsl_chneed)) {
963 setverdict(fail, "RSL Channel Needed != BSSMAP Channel Needed");
964 }
Harald Welte6f521d82017-12-11 19:52:02 +0100965 }
Harald Welte2fccd982018-01-31 15:48:19 +0100966 f_sleep(2.0);
Harald Welte5d1a2202017-12-13 19:51:29 +0100967 /* do a quick check on all not-included BTSs if they received paging */
968 for (i := 0; i < NUM_BTS; i := i + 1) {
969 timer T := 0.1;
970 if (f_bts_in_list(i, bts_ids)) {
971 continue;
972 }
973 T.start;
974 alt {
975 [] IPA_RSL[i].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(id_enc))) {
976 setverdict(fail, "Paging on BTS ", i, " which is not part of ", bts_ids);
977 }
978 [] IPA_RSL[i].receive { repeat; }
979 [] T.timeout { }
980 }
Harald Welte6f521d82017-12-11 19:52:02 +0100981 }
982
983 setverdict(pass);
984}
985
Harald Welte5d1a2202017-12-13 19:51:29 +0100986const BtsIdList c_BtsId_all := { 0, 1, 2 };
Harald Welte751d3eb2018-01-31 15:51:06 +0100987const BtsIdList c_BtsId_none := { };
Harald Welte5d1a2202017-12-13 19:51:29 +0100988const BtsIdList c_BtsId_LAC1 := { 0, 1 };
989const BtsIdList c_BtsId_LAC2 := { 2 };
990
Harald Welte6f521d82017-12-11 19:52:02 +0100991/* PAGING by IMSI + TMSI */
992testcase TC_paging_imsi_nochan() runs on test_CT {
993 var BSSMAP_FIELD_CellIdentificationList cid_list;
994 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5cfa8672018-01-28 18:28:25 +0100995 var integer i;
996
997 f_init();
Harald Welte5cfa8672018-01-28 18:28:25 +0100998
999 /* Clear the queue, it might still contain stuff like BCCH FILLING */
1000 for (i := 0; i < NUM_BTS; i := i + 1) {
1001 IPA_RSL[i].clear;
1002 }
1003
1004 f_bssap_tx_ud(ts_BSSMAP_Paging('001010123456789'H, cid_list, omit, omit));
1005
1006 /* wait for some time until when paging messages would appear */
1007 f_sleep(3.0);
1008
1009 for (i := 0; i < NUM_BTS; i := i + 1) {
1010 timer T := 0.01;
1011 T.start;
1012 alt {
1013 [] IPA_RSL[i].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(?))) {
1014 setverdict(fail, "Received unexpected paging");
1015 }
1016 [] T.timeout {}
1017 }
1018 }
1019 setverdict(pass);
Harald Welte6f521d82017-12-11 19:52:02 +01001020}
1021
1022/* PAGING by IMSI + TMSI */
1023testcase TC_paging_tmsi_nochan() runs on test_CT {
1024 var BSSMAP_FIELD_CellIdentificationList cid_list;
1025 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001026 f_pageing_helper('001010100000001'H, cid_list, c_BtsId_all, omit, 'A1B2C301'O);
Harald Welte6f521d82017-12-11 19:52:02 +01001027}
1028
1029/* Paging with different "channel needed' values */
1030testcase TC_paging_tmsi_any() runs on test_CT {
1031 var BSSMAP_FIELD_CellIdentificationList cid_list;
1032 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001033 f_pageing_helper('001010100000002'H, cid_list, c_BtsId_all, RSL_CHANNEED_ANY, 'A1B2C302'O);
Harald Welte6f521d82017-12-11 19:52:02 +01001034}
1035testcase TC_paging_tmsi_sdcch() runs on test_CT {
1036 var BSSMAP_FIELD_CellIdentificationList cid_list;
1037 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001038 f_pageing_helper('001010100000003'H, cid_list, c_BtsId_all, RSL_CHANNEED_SDCCH, 'A1B2C303'O);
Harald Welte6f521d82017-12-11 19:52:02 +01001039}
1040testcase TC_paging_tmsi_tch_f() runs on test_CT {
1041 var BSSMAP_FIELD_CellIdentificationList cid_list;
1042 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001043 f_pageing_helper('001010000000004'H, cid_list, c_BtsId_all, RSL_CHANNEED_TCH_F, 'A1B2C304'O);
Harald Welte6f521d82017-12-11 19:52:02 +01001044}
1045testcase TC_paging_tmsi_tch_hf() runs on test_CT {
1046 var BSSMAP_FIELD_CellIdentificationList cid_list;
1047 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001048 f_pageing_helper('001010000000005'H, cid_list, c_BtsId_all, RSL_CHANNEED_TCH_ForH, 'A1B2C305'O);
Harald Welte6f521d82017-12-11 19:52:02 +01001049}
1050
1051/* Paging by CGI */
1052testcase TC_paging_imsi_nochan_cgi() runs on test_CT {
1053 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1054 cid_list := { cIl_CGI := { ts_BSSMAP_CI_CGI(cid.mcc, cid.mnc, cid.lac, cid.ci) } };
Harald Welte5d1a2202017-12-13 19:51:29 +01001055 f_pageing_helper('001010000000006'H, cid_list, { 0 });
Harald Welte6f521d82017-12-11 19:52:02 +01001056}
1057
1058/* Paging by LAC+CI */
1059testcase TC_paging_imsi_nochan_lac_ci() runs on test_CT {
1060 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1061 cid_list := { cIl_LAC_CI := { ts_BSSMAP_CI_LAC_CI(cid.lac, cid.ci) } };
Harald Welte5d1a2202017-12-13 19:51:29 +01001062 f_pageing_helper('001010000000007'H, cid_list, { 0 });
Harald Welte6f521d82017-12-11 19:52:02 +01001063}
1064
1065/* Paging by CI */
1066testcase TC_paging_imsi_nochan_ci() runs on test_CT {
1067 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1068 cid_list := { cIl_CI := { ts_BSSMAP_CI_CI(cid.ci) } };
Harald Welte5d1a2202017-12-13 19:51:29 +01001069 f_pageing_helper('001010000000008'H, cid_list, { 0 });
Harald Welte6f521d82017-12-11 19:52:02 +01001070}
1071
1072/* Paging by LAI */
1073testcase TC_paging_imsi_nochan_lai() runs on test_CT {
1074 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1075 cid_list := { cIl_LAI := { ts_BSSMAP_CI_LAI(cid.mcc, cid.mnc, cid.lac) } };
Harald Welte5d1a2202017-12-13 19:51:29 +01001076 f_pageing_helper('001010000000009'H, cid_list, c_BtsId_LAC1);
Harald Welte6f521d82017-12-11 19:52:02 +01001077}
1078
1079/* Paging by LAC */
1080testcase TC_paging_imsi_nochan_lac() runs on test_CT {
1081 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1082 cid_list := { cIl_LAC := { ts_BSSMAP_CI_LAC(cid.lac) } };
Harald Welte5d1a2202017-12-13 19:51:29 +01001083 f_pageing_helper('001010000000010'H, cid_list, c_BtsId_LAC1);
Harald Welte6f521d82017-12-11 19:52:02 +01001084}
1085
1086/* Paging by "all in BSS" */
1087testcase TC_paging_imsi_nochan_all() runs on test_CT {
1088 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1089 cid_list := { cIl_allInBSS := ''O };
Harald Welte5d1a2202017-12-13 19:51:29 +01001090 f_pageing_helper('001010000000011'H, cid_list, c_BtsId_all);
Harald Welte6f521d82017-12-11 19:52:02 +01001091}
1092
1093/* Paging by PLMN+LAC+RNC */
Harald Welte751d3eb2018-01-31 15:51:06 +01001094testcase TC_paging_imsi_nochan_plmn_lac_rnc() runs on test_CT {
1095 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1096 cid_list := { cIl_PLMN_LAC_RNC := { ts_BSSMAP_CI_PLMN_LAC_RNC(cid.mcc, cid.mnc, cid.lac, 12) } };
Harald Weltebeb9dbc2018-01-31 15:56:00 +01001097 f_pageing_helper('001010000000012'H, cid_list, c_BtsId_all);
Harald Welte751d3eb2018-01-31 15:51:06 +01001098}
Harald Welte6f521d82017-12-11 19:52:02 +01001099
Harald Welte751d3eb2018-01-31 15:51:06 +01001100/* Paging by RNC */
1101testcase TC_paging_imsi_nochan_rnc() runs on test_CT {
1102 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1103 cid_list := { cIl_RNC := { int2oct(13, 2) } };
Harald Weltebeb9dbc2018-01-31 15:56:00 +01001104 f_pageing_helper('001010000000013'H, cid_list, c_BtsId_all);
Harald Welte751d3eb2018-01-31 15:51:06 +01001105}
1106
1107/* Paging by LAC+RNC */
1108testcase TC_paging_imsi_nochan_lac_rnc() runs on test_CT {
1109 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1110 cid_list := { cIl_LAC_RNC := { ts_BSSMAP_CI_LAC_RNC(cid.lac, 14) } };
Harald Weltebeb9dbc2018-01-31 15:56:00 +01001111 f_pageing_helper('001010000000014'H, cid_list, c_BtsId_all);
Harald Welte751d3eb2018-01-31 15:51:06 +01001112}
1113
Harald Welte6f521d82017-12-11 19:52:02 +01001114/* Paging on multiple cells (multiple entries in list): Verify all of them page */
Harald Welte751d3eb2018-01-31 15:51:06 +01001115testcase TC_paging_imsi_nochan_lacs() runs on test_CT {
1116 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1117 cid_list := { cIl_LAC := { ts_BSSMAP_CI_LAC(1), ts_BSSMAP_CI_LAC(2) } };
1118 f_pageing_helper('001010000000015'H, cid_list, c_BtsId_all);
1119}
1120
1121/* Paging on empty list: Verify none of them page */
1122testcase TC_paging_imsi_nochan_lacs_empty() runs on test_CT {
1123 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1124 cid_list := { cIl_LAC := { } };
1125 f_pageing_helper('001010000000016'H, cid_list, c_BtsId_none);
1126}
1127
Harald Welte6f521d82017-12-11 19:52:02 +01001128/* Verify paging retransmission interval + count */
1129/* Verify paging stops after channel establishment */
Harald Welte6f521d82017-12-11 19:52:02 +01001130/* Test behavior under paging overload */
Harald Welteae026692017-12-09 01:03:01 +01001131
Harald Weltee65d40e2017-12-13 00:09:06 +01001132/* Verify PCH load */
1133testcase TC_paging_imsi_load() runs on test_CT {
1134 var BSSMAP_FIELD_CellIdentificationList cid_list;
1135 timer T := 4.0;
1136 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001137 f_pageing_helper('001010123456789'H, cid_list, c_BtsId_all);
Harald Weltee65d40e2017-12-13 00:09:06 +01001138
1139 /* tell BSC there is no paging space anymore */
1140 f_ipa_tx(0, ts_RSL_PAGING_LOAD_IND(0));
1141
1142 /* Wait for 4 seconds if any more PAGING CMD are received on RSL. Normally,
1143 * there would be 8 retransmissions during 4 seconds */
1144 T.start;
1145 alt {
1146 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(?))) {
1147 setverdict(fail, "Received PAGING after LOAD_IND(0)");
1148 self.stop;
1149 }
1150 [] T.timeout {
1151 setverdict(pass);
1152 }
1153 }
1154}
1155
Harald Welte235ebf12017-12-15 14:18:16 +01001156/* Verify Paging Counter */
Harald Welte1ff69992017-12-14 12:31:17 +01001157testcase TC_paging_counter() runs on test_CT {
1158 var BSSMAP_FIELD_CellIdentificationList cid_list;
1159 timer T := 4.0;
1160 var integer i;
1161 var integer paging_attempted_bsc;
1162 var integer paging_attempted_bts[NUM_BTS];
1163 var integer paging_expired_bts[NUM_BTS];
1164 cid_list := valueof(ts_BSSMAP_CIL_noCell);
1165
1166 f_init();
1167
1168 /* read counters before paging */
1169 paging_attempted_bsc := f_ctrl_get_ratectr_abs(IPA_CTRL, "bsc", 0, "paging:attempted");
1170 for (i := 0; i < NUM_BTS; i := i+1) {
1171 paging_attempted_bts[i] := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", i, "paging:attempted");
1172 paging_expired_bts[i] := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", i, "paging:expired");
1173 }
1174
1175 f_pageing_helper('001230000000001'H, cid_list, c_BtsId_all);
1176
1177 /* expect the attempted pages on BSC and each BTSs to have incremented by one */
1178 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bsc", 0, "paging:attempted", paging_attempted_bsc+1);
1179 for (i := 0; i < NUM_BTS; i := i+1) {
1180 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", i, "paging:attempted",
1181 paging_attempted_bts[i]+1);
1182 }
1183
1184 /* assume that 12s later the paging on all BTSs have expired and hence incremented by 1 */
1185 f_sleep(12.0);
1186 for (i := 0; i < NUM_BTS; i := i+1) {
1187 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", i, "paging:expired",
1188 paging_expired_bts[i]+1);
1189 }
1190 setverdict(pass);
1191
1192}
1193
1194
Harald Welte10985002017-12-12 09:29:15 +01001195/* Verify paging stops after A-RESET */
1196testcase TC_paging_imsi_a_reset() runs on test_CT {
1197 var BSSMAP_FIELD_CellIdentificationList cid_list;
1198 timer T := 3.0;
1199 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001200 f_pageing_helper('001010123456789'H, cid_list, c_BtsId_all);
Harald Welte10985002017-12-12 09:29:15 +01001201
1202 /* Perform a BSSMAP Reset and wait for ACK */
Harald Weltea4ca4462018-02-09 00:17:14 +01001203 BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, ts_BSSMAP_Reset(0)));
Harald Welte10985002017-12-12 09:29:15 +01001204 alt {
Harald Weltea4ca4462018-02-09 00:17:14 +01001205 [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_bssap.sccp_addr_own, g_bssap.sccp_addr_peer, tr_BSSMAP_ResetAck)) { }
Harald Welte10985002017-12-12 09:29:15 +01001206 [] BSSAP.receive { repeat; }
1207 }
1208
1209 /* Clear the queue, it might still contain stuff like BCCH FILLING */
1210 IPA_RSL[0].clear;
1211
1212 /* Wait for 3 seconds if any more PAGING CMD are received on RSL */
1213 T.start;
1214 alt {
1215 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(?))) {
1216 setverdict(fail, "Received PAGING after A-RESET");
1217 self.stop;
1218 }
Harald Welte5d1a2202017-12-13 19:51:29 +01001219 [] IPA_RSL[1].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(?))) {
1220 setverdict(fail, "Received PAGING after A-RESET");
1221 self.stop;
1222 }
1223 [] IPA_RSL[2].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(?))) {
1224 setverdict(fail, "Received PAGING after A-RESET");
1225 self.stop;
1226 }
Harald Welte10985002017-12-12 09:29:15 +01001227 [] T.timeout {
1228 setverdict(pass);
1229 }
1230 }
1231}
Harald Welteae026692017-12-09 01:03:01 +01001232
Harald Welte4e9b9cc2017-12-14 18:31:02 +01001233/* Test RSL link drop causes counter increment */
1234testcase TC_rsl_drop_counter() runs on test_CT {
1235 var integer rsl_fail;
1236
Harald Welte89d42e82017-12-17 16:42:41 +01001237 f_init(1);
Harald Welte4e9b9cc2017-12-14 18:31:02 +01001238
1239 rsl_fail := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "rsl_fail");
1240
1241 bts[0].rsl.vc_IPA.stop;
1242
1243 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "rsl_fail", rsl_fail+1);
1244
1245 setverdict(pass);
1246}
1247
1248/* TODO: Test OML link drop causes counter increment */
1249
Harald Weltec1a2fff2017-12-17 11:06:19 +01001250/***********************************************************************
1251 * "New world" test cases using RSL_Emulation + BSSMAP_Emulation
1252 ***********************************************************************/
1253
1254import from BSSMAP_Emulation all;
1255import from RSL_Emulation all;
1256import from MSC_ConnectionHandler all;
1257
1258type function void_fn(charstring id) runs on MSC_ConnHdlr;
1259
1260/* helper function to create, connect and start a MSC_ConnHdlr component */
1261function f_start_handler(void_fn fn, charstring id) runs on test_CT return MSC_ConnHdlr {
1262 var MSC_ConnHdlr vc_conn;
1263
1264 vc_conn := MSC_ConnHdlr.create(id);
Harald Weltea4ca4462018-02-09 00:17:14 +01001265 connect(vc_conn:BSSMAPEM, g_bssap.vc_BSSMAP:PROC);
Daniel Willmann191e0d92018-01-17 12:44:35 +01001266 connect(vc_conn:MGCP_PROC, vc_MGCP:MGCP_PROC);
Harald Weltec1a2fff2017-12-17 11:06:19 +01001267 connect(vc_conn:RSL, bts[0].rsl.vc_RSL:CLIENT_PT);
Harald Weltef70df652018-01-29 22:00:23 +01001268 connect(vc_conn:RSL_PROC, bts[0].rsl.vc_RSL:RSL_PROC);
Harald Weltea4ca4462018-02-09 00:17:14 +01001269 connect(vc_conn:BSSAP, g_bssap.vc_BSSMAP:CLIENT);
Daniel Willmann191e0d92018-01-17 12:44:35 +01001270 connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);
Harald Weltec1a2fff2017-12-17 11:06:19 +01001271 vc_conn.start(derefers(fn)(id));
1272 return vc_conn;
1273}
1274
Harald Welte552620d2017-12-16 23:21:36 +01001275private function f_tc_assignment_fr_a5_0(charstring id) runs on MSC_ConnHdlr {
1276 var TestHdlrParams pars := valueof(t_def_TestHdlrPars);
1277 var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?);
1278 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
1279 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
1280 const OCT8 kc := '0001020304050607'O;
Harald Weltec1a2fff2017-12-17 11:06:19 +01001281
Harald Welte552620d2017-12-16 23:21:36 +01001282 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
1283 ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
Harald Welte73cd2712017-12-17 00:44:52 +01001284
Harald Welte552620d2017-12-16 23:21:36 +01001285 f_establish_fully(pars, ass_cmd, exp_compl);
Harald Welte73cd2712017-12-17 00:44:52 +01001286 f_cipher_mode('01'O, kc);
Harald Welte552620d2017-12-16 23:21:36 +01001287}
1288
1289testcase TC_assignment_fr_a5_0() runs on test_CT {
1290 var MSC_ConnHdlr vc_conn;
1291
Harald Welte89d42e82017-12-17 16:42:41 +01001292 f_init(1, true);
Harald Welte552620d2017-12-16 23:21:36 +01001293 f_sleep(1.0);
1294
1295 vc_conn := f_start_handler(refers(f_tc_assignment_fr_a5_0), testcasename());
1296 vc_conn.done;
1297}
1298
1299
1300
1301private function f_tc_assignment_fr_a5_1(charstring id) runs on MSC_ConnHdlr {
Harald Weltec1a2fff2017-12-17 11:06:19 +01001302 var TestHdlrParams pars := valueof(t_def_TestHdlrPars);
1303
1304 var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?);
1305 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
1306 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
1307 const OCT8 kc := '0001020304050607'O;
1308
1309 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
1310 ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
Harald Weltec1a2fff2017-12-17 11:06:19 +01001311
1312 f_establish_fully(pars, ass_cmd, exp_compl);
Harald Welte73cd2712017-12-17 00:44:52 +01001313 f_cipher_mode('02'O, kc);
Harald Weltec1a2fff2017-12-17 11:06:19 +01001314}
1315
Harald Welte552620d2017-12-16 23:21:36 +01001316testcase TC_assignment_fr_a5_1() runs on test_CT {
Harald Weltec1a2fff2017-12-17 11:06:19 +01001317 var MSC_ConnHdlr vc_conn;
1318
Harald Welte89d42e82017-12-17 16:42:41 +01001319 f_init(1, true);
Harald Weltec1a2fff2017-12-17 11:06:19 +01001320 f_sleep(1.0);
1321
Harald Welte552620d2017-12-16 23:21:36 +01001322 vc_conn := f_start_handler(refers(f_tc_assignment_fr_a5_1), testcasename());
Harald Weltec1a2fff2017-12-17 11:06:19 +01001323 vc_conn.done;
1324}
1325
Harald Welte552620d2017-12-16 23:21:36 +01001326/* Expect ASSIGNMENT FAIL if mandatory IE is missing */
1327private function f_tc_assignment_fr_a5_1_codec_missing(charstring id) runs on MSC_ConnHdlr {
1328 var TestHdlrParams pars := valueof(t_def_TestHdlrPars);
1329 var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail;
1330 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
1331 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
1332 const OCT8 kc := '0001020304050607'O;
1333
1334 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
Harald Welte552620d2017-12-16 23:21:36 +01001335 f_establish_fully(pars, ass_cmd, exp_fail);
1336}
1337
1338testcase TC_assignment_fr_a5_1_codec_missing() runs on test_CT {
1339 var MSC_ConnHdlr vc_conn;
1340
Harald Welte89d42e82017-12-17 16:42:41 +01001341 f_init(1, true);
Harald Welte552620d2017-12-16 23:21:36 +01001342 f_sleep(1.0);
1343
1344 vc_conn := f_start_handler(refers(f_tc_assignment_fr_a5_1_codec_missing), testcasename());
1345 vc_conn.done;
1346}
1347
1348
1349private function f_tc_assignment_fr_a5_3(charstring id ) runs on MSC_ConnHdlr {
1350 var TestHdlrParams pars := valueof(t_def_TestHdlrPars);
1351 var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?);
1352 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
1353 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
1354 const OCT8 kc := '0001020304050607'O;
1355
1356 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
1357 ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
Harald Welte73cd2712017-12-17 00:44:52 +01001358
Harald Welte552620d2017-12-16 23:21:36 +01001359 f_establish_fully(pars, ass_cmd, exp_compl);
Harald Welte73cd2712017-12-17 00:44:52 +01001360 f_cipher_mode('08'O, kc);
Harald Welte552620d2017-12-16 23:21:36 +01001361}
1362
1363testcase TC_assignment_fr_a5_3() runs on test_CT {
1364 var MSC_ConnHdlr vc_conn;
1365
Harald Welte89d42e82017-12-17 16:42:41 +01001366 f_init(1, true);
Harald Welte552620d2017-12-16 23:21:36 +01001367 f_sleep(1.0);
1368
1369 vc_conn := f_start_handler(refers(f_tc_assignment_fr_a5_3), testcasename());
1370 vc_conn.done;
1371}
1372
1373
1374private function f_tc_assignment_fr_a5_4(charstring id) runs on MSC_ConnHdlr {
1375 var TestHdlrParams pars := valueof(t_def_TestHdlrPars);
Harald Welte38b2a102017-12-23 02:42:58 +01001376 var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?);
Harald Welte552620d2017-12-16 23:21:36 +01001377 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
1378 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
1379 const OCT8 kc := '0001020304050607'O;
1380 const OCT16 kc128 := kc & kc;
1381
1382 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
1383 ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
Harald Welte38b2a102017-12-23 02:42:58 +01001384 f_establish_fully(pars, ass_cmd, exp_compl);
1385 f_cipher_mode('10'O, kc, kc128, true);
Harald Welte552620d2017-12-16 23:21:36 +01001386 /* TODO: expect GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED cause value */
Harald Welte552620d2017-12-16 23:21:36 +01001387}
1388
1389testcase TC_assignment_fr_a5_4() runs on test_CT {
1390 var MSC_ConnHdlr vc_conn;
1391
Harald Welte89d42e82017-12-17 16:42:41 +01001392 f_init(1, true);
Harald Welte552620d2017-12-16 23:21:36 +01001393 f_sleep(1.0);
1394
1395 vc_conn := f_start_handler(refers(f_tc_assignment_fr_a5_4), testcasename());
1396 vc_conn.done;
1397}
1398
1399
Harald Welte4532e0a2017-12-23 02:05:44 +01001400private function f_tc_assignment_sign(charstring id) runs on MSC_ConnHdlr {
1401 var TestHdlrParams pars := valueof(t_def_TestHdlrPars);
1402 var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, omit);
1403 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, omit));
1404
1405 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelTypeSIGNAL);
1406 f_establish_fully(pars, ass_cmd, exp_compl);
1407}
1408
1409testcase TC_assignment_sign() runs on test_CT {
1410 var MSC_ConnHdlr vc_conn;
1411
1412 f_init(1, true);
1413 f_sleep(1.0);
1414
1415 vc_conn := f_start_handler(refers(f_tc_assignment_sign), testcasename());
1416 vc_conn.done;
1417}
1418
Harald Welte898113b2018-01-31 18:32:21 +01001419/* test if L3 RR CLASSMARK CHANGE is translated to BSSMAP CLASSMARK UPDATE */
1420private function f_tc_classmark(charstring id) runs on MSC_ConnHdlr {
1421 var TestHdlrParams pars := valueof(t_def_TestHdlrPars);
1422 f_create_chan_and_exp(pars);
1423 /* we should now have a COMPL_L3 at the MSC */
1424 BSSAP.receive(tr_BSSMAP_ComplL3);
1425
1426 f_rsl_send_l3(ts_RRM_CM_CHG(valueof(ts_CM2)));
1427 BSSAP.receive(tr_BSSMAP_ClassmarkUpd(?, omit));
1428 setverdict(pass);
1429}
1430testcase TC_classmark() runs on test_CT {
1431 var MSC_ConnHdlr vc_conn;
1432 f_init(1, true);
1433 f_sleep(1.0);
1434 vc_conn := f_start_handler(refers(f_tc_classmark), testcasename());
1435 vc_conn.done;
1436}
1437
Harald Weltee3bd6582018-01-31 22:51:25 +01001438private function f_est_single_l3(template PDU_ML3_MS_NW l3) runs on MSC_ConnHdlr {
Harald Welte898113b2018-01-31 18:32:21 +01001439 var TestHdlrParams pars := valueof(t_def_TestHdlrPars);
1440 f_create_chan_and_exp(pars);
1441 /* we should now have a COMPL_L3 at the MSC */
1442 BSSAP.receive(tr_BSSMAP_ComplL3);
1443
Harald Weltee3bd6582018-01-31 22:51:25 +01001444 /* send the single message we want to send */
1445 f_rsl_send_l3(l3);
1446}
1447
1448private function f_bssap_expect_nothing(float sec := 5.00) runs on MSC_ConnHdlr {
1449 timer T := sec;
1450 var PDU_BSSAP bssap;
Harald Welte898113b2018-01-31 18:32:21 +01001451 T.start;
1452 alt {
Harald Weltee3bd6582018-01-31 22:51:25 +01001453 [] BSSAP.receive(PDU_BSSAP:?) -> value bssap {
1454 setverdict(fail, "Unexpected BSSMAP ", bssap);
1455 self.stop;
Harald Welte898113b2018-01-31 18:32:21 +01001456 }
1457 [] T.timeout {
1458 setverdict(pass);
1459 }
1460 }
1461}
1462
Harald Weltee3bd6582018-01-31 22:51:25 +01001463/* unsolicited ASSIGNMENT FAIL (without ASSIGN) from MS shouldn't bring BSC down */
1464private function f_tc_unsol_ass_fail(charstring id) runs on MSC_ConnHdlr {
1465 f_est_single_l3(ts_RRM_AssignmentFailure('00'O));
1466 f_bssap_expect_nothing();
1467}
Harald Welte898113b2018-01-31 18:32:21 +01001468testcase TC_unsol_ass_fail() runs on test_CT {
1469 var MSC_ConnHdlr vc_conn;
1470 f_init(1, true);
1471 f_sleep(1.0);
1472 vc_conn := f_start_handler(refers(f_tc_unsol_ass_fail), testcasename());
1473 vc_conn.done;
1474}
Harald Welte552620d2017-12-16 23:21:36 +01001475
Harald Welteea99a002018-01-31 20:46:43 +01001476
1477/* unsolicited ASSIGNMENT COMPLETE (without ASSIGN) from MS shouldn't bring BSC down */
1478private function f_tc_unsol_ass_compl(charstring id) runs on MSC_ConnHdlr {
Harald Weltee3bd6582018-01-31 22:51:25 +01001479 f_est_single_l3(ts_RRM_AssignmentComplete('00'O));
1480 f_bssap_expect_nothing();
Harald Welteea99a002018-01-31 20:46:43 +01001481}
1482testcase TC_unsol_ass_compl() runs on test_CT {
1483 var MSC_ConnHdlr vc_conn;
1484 f_init(1, true);
1485 f_sleep(1.0);
1486 vc_conn := f_start_handler(refers(f_tc_unsol_ass_compl), testcasename());
1487 vc_conn.done;
1488}
1489
1490
Harald Weltefbf9b5e2018-01-31 20:41:23 +01001491/* unsolicited HANDOVER FAIL (without ASSIGN) from MS shouldn't bring BSC down */
1492private function f_tc_unsol_ho_fail(charstring id) runs on MSC_ConnHdlr {
Harald Weltee3bd6582018-01-31 22:51:25 +01001493 f_est_single_l3(ts_RRM_HandoverFailure('00'O));
1494 f_bssap_expect_nothing();
Harald Weltefbf9b5e2018-01-31 20:41:23 +01001495}
Harald Weltefbf9b5e2018-01-31 20:41:23 +01001496testcase TC_unsol_ho_fail() runs on test_CT {
1497 var MSC_ConnHdlr vc_conn;
1498 f_init(1, true);
1499 f_sleep(1.0);
1500 vc_conn := f_start_handler(refers(f_tc_unsol_ho_fail), testcasename());
1501 vc_conn.done;
1502}
1503
1504
Harald Weltee3bd6582018-01-31 22:51:25 +01001505/* short message from MS should be ignored */
1506private function f_tc_err_82_short_msg(charstring id) runs on MSC_ConnHdlr {
1507 var TestHdlrParams pars := valueof(t_def_TestHdlrPars);
1508 f_create_chan_and_exp(pars);
1509 /* we should now have a COMPL_L3 at the MSC */
1510 BSSAP.receive(tr_BSSMAP_ComplL3);
1511
1512 /* send short message */
1513 RSL.send(ts_RSL_DATA_IND(g_chan_nr, valueof(ts_RslLinkID_DCCH(0)), ''O));
1514 f_bssap_expect_nothing();
1515}
1516testcase TC_err_82_short_msg() runs on test_CT {
1517 var MSC_ConnHdlr vc_conn;
1518 f_init(1, true);
1519 f_sleep(1.0);
1520 vc_conn := f_start_handler(refers(f_tc_err_82_short_msg), testcasename());
1521 vc_conn.done;
1522}
1523
1524
Harald Weltee9e02e42018-01-31 23:36:25 +01001525/* 24.008 8.4 Unknown message must trigger RR STATUS */
1526private function f_tc_err_84_unknown_msg(charstring id) runs on MSC_ConnHdlr {
1527 f_est_single_l3(ts_RRM_UL_REL('00'O));
1528 timer T := 3.0
1529 alt {
1530 [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, decmatch tr_RRM_RR_STATUS)) {
1531 setverdict(pass);
1532 }
1533 [] BSSAP.receive { setverdict(fail, "unexpected BSSAP"); }
1534 [] T.timeout { setverdict(inconc); }
1535 }
1536}
1537testcase TC_err_84_unknown_msg() runs on test_CT {
1538 var MSC_ConnHdlr vc_conn;
1539 f_init(1, true);
1540 f_sleep(1.0);
1541 vc_conn := f_start_handler(refers(f_tc_err_84_unknown_msg), testcasename());
1542 vc_conn.done;
1543}
1544
1545
Harald Welte552620d2017-12-16 23:21:36 +01001546
Harald Welte28d943e2017-11-25 15:00:50 +01001547control {
Harald Welte898113b2018-01-31 18:32:21 +01001548 /* CTRL interface testing */
Harald Welte4003d112017-12-09 22:35:39 +01001549 execute( TC_ctrl_msc_connection_status() );
Stefan Sperlingb041b3d2018-01-03 17:14:55 +01001550 execute( TC_ctrl_msc0_connection_status() );
Harald Welte96c94412017-12-09 03:12:45 +01001551 execute( TC_ctrl() );
Harald Welte898113b2018-01-31 18:32:21 +01001552
1553 /* RSL DCHAN Channel ACtivation / Deactivation */
Harald Welteae026692017-12-09 01:03:01 +01001554 execute( TC_chan_act_noreply() );
Harald Welte4003d112017-12-09 22:35:39 +01001555 execute( TC_chan_act_counter() );
Harald Welteae026692017-12-09 01:03:01 +01001556 execute( TC_chan_act_ack_noest() );
1557 execute( TC_chan_act_ack_est_ind_noreply() );
1558 execute( TC_chan_act_ack_est_ind_refused() );
Harald Welte618ef642017-12-14 14:58:20 +01001559 execute( TC_chan_act_nack() );
Harald Welte799c97b2017-12-14 17:50:30 +01001560 execute( TC_chan_exhaustion() );
Harald Welte4003d112017-12-09 22:35:39 +01001561 execute( TC_chan_rel_rll_rel_ind() );
1562 execute( TC_chan_rel_conn_fail() );
1563 execute( TC_chan_rel_hard_clear() );
Harald Welted8c36cd2017-12-09 23:05:31 +01001564 execute( TC_chan_rel_hard_rlsd() );
Harald Welte85804d42017-12-10 14:11:58 +01001565 execute( TC_chan_rel_a_reset() );
Harald Welte6f521d82017-12-11 19:52:02 +01001566
Harald Weltecfe2c962017-12-15 12:09:32 +01001567 execute( TC_outbound_connect() );
Harald Welte898113b2018-01-31 18:32:21 +01001568
1569 /* Assignment related */
Harald Welte16a4adf2017-12-14 18:54:01 +01001570 execute( TC_assignment_cic_only() );
Harald Welte235ebf12017-12-15 14:18:16 +01001571 execute( TC_assignment_csd() );
1572 execute( TC_assignment_ctm() );
1573 execute( TC_assignment_sign() );
1574 execute( TC_assignment_fr_a5_0() );
1575 execute( TC_assignment_fr_a5_1() );
Harald Weltef1b64e22017-12-15 14:55:14 +01001576 execute( TC_assignment_fr_a5_1_codec_missing() );
Harald Welte235ebf12017-12-15 14:18:16 +01001577 execute( TC_assignment_fr_a5_3() );
1578 execute( TC_assignment_fr_a5_4() );
Harald Welte16a4adf2017-12-14 18:54:01 +01001579
Harald Welte898113b2018-01-31 18:32:21 +01001580 /* RLL Establish Indication on inactive DCHAN / SAPI */
Harald Welte5cd20ed2017-12-13 21:03:20 +01001581 execute( TC_rll_est_ind_inact_lchan() );
1582 execute( TC_rll_est_ind_inval_sapi1() );
1583 execute( TC_rll_est_ind_inval_sapi3() );
1584 execute( TC_rll_est_ind_inval_sacch() );
1585
Harald Welte898113b2018-01-31 18:32:21 +01001586 /* Paging related tests */
Harald Welte6f521d82017-12-11 19:52:02 +01001587 execute( TC_paging_imsi_nochan() );
1588 execute( TC_paging_tmsi_nochan() );
1589 execute( TC_paging_tmsi_any() );
1590 execute( TC_paging_tmsi_sdcch() );
1591 execute( TC_paging_tmsi_tch_f() );
1592 execute( TC_paging_tmsi_tch_hf() );
1593 execute( TC_paging_imsi_nochan_cgi() );
1594 execute( TC_paging_imsi_nochan_lac_ci() );
1595 execute( TC_paging_imsi_nochan_ci() );
1596 execute( TC_paging_imsi_nochan_lai() );
1597 execute( TC_paging_imsi_nochan_lac() );
1598 execute( TC_paging_imsi_nochan_all() );
Harald Welte751d3eb2018-01-31 15:51:06 +01001599 execute( TC_paging_imsi_nochan_plmn_lac_rnc() );
1600 execute( TC_paging_imsi_nochan_rnc() );
1601 execute( TC_paging_imsi_nochan_lac_rnc() );
1602 execute( TC_paging_imsi_nochan_lacs() );
1603 execute( TC_paging_imsi_nochan_lacs_empty() );
Harald Welte10985002017-12-12 09:29:15 +01001604 execute( TC_paging_imsi_a_reset() );
Harald Weltee65d40e2017-12-13 00:09:06 +01001605 execute( TC_paging_imsi_load() );
Harald Welte4e9b9cc2017-12-14 18:31:02 +01001606
1607 execute( TC_rsl_drop_counter() );
Harald Welte898113b2018-01-31 18:32:21 +01001608
1609 execute( TC_classmark() );
1610 execute( TC_unsol_ass_fail() );
Harald Welteea99a002018-01-31 20:46:43 +01001611 execute( TC_unsol_ass_compl() );
Harald Weltefbf9b5e2018-01-31 20:41:23 +01001612 execute( TC_unsol_ho_fail() );
Harald Weltee3bd6582018-01-31 22:51:25 +01001613 execute( TC_err_82_short_msg() );
Harald Weltee9e02e42018-01-31 23:36:25 +01001614 execute( TC_err_84_unknown_msg() );
Harald Welte28d943e2017-11-25 15:00:50 +01001615}
1616
1617}