blob: c82441514998633659aa2cb8d528802b8e2217cb [file] [log] [blame]
Harald Welte28d943e2017-11-25 15:00:50 +01001module BSC_Tests {
2
Harald Welte4003d112017-12-09 22:35:39 +01003import from General_Types all;
Harald Welte28d943e2017-11-25 15:00:50 +01004import from Osmocom_Types all;
Harald Welteae026692017-12-09 01:03:01 +01005import from GSM_Types all;
Harald Welte28d943e2017-11-25 15:00:50 +01006import from IPL4asp_Types all;
7
Harald Welte6f521d82017-12-11 19:52:02 +01008import from BSSAP_Types all;
Harald Welteae026692017-12-09 01:03:01 +01009import from BSSAP_Adapter all;
10import from BSSAP_CodecPort all;
11import from BSSMAP_Templates all;
Harald Welte28d943e2017-11-25 15:00:50 +010012import from IPA_Emulation all;
Harald Welteae026692017-12-09 01:03:01 +010013import from IPA_Types all;
14import from RSL_Types all;
Harald Welte624f9632017-12-16 19:26:04 +010015import from RSL_Emulation all;
Harald Welte28d943e2017-11-25 15:00:50 +010016
Harald Welte96c94412017-12-09 03:12:45 +010017import from Osmocom_CTRL_Functions all;
Harald Weltea5d2ab22017-12-09 14:21:42 +010018import from Osmocom_CTRL_Types all;
Harald Welte96c94412017-12-09 03:12:45 +010019
Harald Welte6f521d82017-12-11 19:52:02 +010020import from MobileL3_CommonIE_Types all;
21import from L3_Templates all;
22import from GSM_RR_Types all;
23
Harald Welteae026692017-12-09 01:03:01 +010024import from RSL_Tests all;
Harald Welte28d943e2017-11-25 15:00:50 +010025
Harald Welte5d1a2202017-12-13 19:51:29 +010026const integer NUM_BTS := 3;
Harald Welteae026692017-12-09 01:03:01 +010027const float T3101_MAX := 12.0;
Harald Welte28d943e2017-11-25 15:00:50 +010028
Harald Welte799c97b2017-12-14 17:50:30 +010029/* make sure to sync this with the osmo-bts.cfg you're using */
30const integer NUM_TCHF_PER_BTS := 5;
31
Harald Welte4003d112017-12-09 22:35:39 +010032
33/* BSC specific CTRL helper functions */
34function f_ctrl_get_bts(IPA_CTRL_PT pt, integer bts_nr, charstring suffix) return CtrlValue {
35 return f_ctrl_get(pt, "bts." & int2str(bts_nr) & "." & suffix);
36}
37
38template charstring ts_bts(integer bts_nr) := "bts." & int2str(bts_nr) & ".";
39template charstring ts_bts_trx(integer bts_nr, integer trx_nr ) :=
40 valueof(ts_bts(bts_nr)) & "trx." & int2str(trx_nr) & ".";
41
42function f_ctrl_get_exp_bts(IPA_CTRL_PT pt, integer bts_nr, CtrlVariable suffix, template CtrlValue exp) {
43 f_ctrl_get_exp(pt, valueof(ts_bts(bts_nr)) & suffix, exp);
44}
45
46function f_ctrl_get_exp_trx(IPA_CTRL_PT pt, integer bts_nr, integer trx_nr, CtrlVariable suffix,
47 template CtrlValue exp)
48{
49 f_ctrl_get_exp(pt, valueof(ts_bts_trx(bts_nr, trx_nr)) & suffix, exp);
50}
51
52
53
Harald Welte96c94412017-12-09 03:12:45 +010054type record BTS_State {
Harald Weltea5d2ab22017-12-09 14:21:42 +010055 IPA_Client rsl
Harald Welte96c94412017-12-09 03:12:45 +010056}
57
Harald Welteae026692017-12-09 01:03:01 +010058type component test_CT extends BSSAP_Adapter_CT {
Harald Welte96c94412017-12-09 03:12:45 +010059 var BTS_State bts[NUM_BTS];
Harald Welteae026692017-12-09 01:03:01 +010060 port IPA_RSL_PT IPA_RSL[NUM_BTS];
Harald Weltea5d2ab22017-12-09 14:21:42 +010061
62 var IPA_Client ctrl;
63 port IPA_CTRL_PT IPA_CTRL;
Harald Welte28d943e2017-11-25 15:00:50 +010064
65 var boolean g_initialized := false;
Harald Welteae026692017-12-09 01:03:01 +010066 timer T_guard := 30.0;
67
Harald Welte28d943e2017-11-25 15:00:50 +010068}
69
70modulepar {
Harald Welte696ddb62017-12-08 14:01:43 +010071 charstring mp_bsc_ip := "127.0.0.1";
72 integer mp_bsc_rsl_port := 3003;
Harald Welte96c94412017-12-09 03:12:45 +010073 integer mp_bsc_ctrl_port := 4249;
Harald Welte28d943e2017-11-25 15:00:50 +010074}
75
Harald Welteae026692017-12-09 01:03:01 +010076type record IPA_Client {
77 IPA_Emulation_CT vc_IPA,
78 IPA_CCM_Parameters ccm_pars,
Harald Welte624f9632017-12-16 19:26:04 +010079 charstring id,
80
81 RSL_Emulation_CT vc_RSL optional
Harald Welte28d943e2017-11-25 15:00:50 +010082}
83
Harald Welte624f9632017-12-16 19:26:04 +010084function f_ipa_rsl_start(inout IPA_Client clnt, charstring bsc_host, PortNumber bsc_port, integer i,
85 boolean handler_mode := false)
Harald Welte28d943e2017-11-25 15:00:50 +010086runs on test_CT {
Harald Welteae026692017-12-09 01:03:01 +010087 timer T := 10.0;
88
Harald Welte96c94412017-12-09 03:12:45 +010089 clnt.id := "IPA" & int2str(i) & "-RSL";
Harald Welteae026692017-12-09 01:03:01 +010090 clnt.vc_IPA := IPA_Emulation_CT.create(clnt.id & "-IPA");
91 clnt.ccm_pars := c_IPA_default_ccm_pars;
92 clnt.ccm_pars.name := "Osmocom TTCN-3 BTS Simulator";
93 clnt.ccm_pars.unit_id := int2str(1234+i) & "/0/0";
Harald Welte624f9632017-12-16 19:26:04 +010094 if (handler_mode) {
95 clnt.vc_RSL := RSL_Emulation_CT.create(clnt.id & "-RSL");
96 }
Harald Welteae026692017-12-09 01:03:01 +010097
98 map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
Harald Welte624f9632017-12-16 19:26:04 +010099 if (handler_mode) {
100 connect(clnt.vc_IPA:IPA_RSL_PORT, clnt.vc_RSL:IPA_PT);
101 } else {
102 connect(clnt.vc_IPA:IPA_RSL_PORT, self:IPA_RSL[i]);
103 }
Harald Welteae026692017-12-09 01:03:01 +0100104
Harald Welte5d1a2202017-12-13 19:51:29 +0100105 clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", 10000+i, clnt.ccm_pars));
Harald Welte624f9632017-12-16 19:26:04 +0100106 if (handler_mode) {
107 clnt.vc_RSL.start(RSL_Emulation.main());
108 return;
109 }
Harald Welteae026692017-12-09 01:03:01 +0100110
111 /* wait for IPA RSL link to connect and send ID ACK */
112 T.start;
113 alt {
114 [] IPA_RSL[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_ID_ACK}) {
115 T.stop;
116 IPA_RSL[i].send(ts_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,ts_RSL_PAGING_LOAD_IND(23)));
117 }
Harald Welte60e823a2017-12-10 14:10:59 +0100118 [] IPA_RSL[i].receive(ASP_IPA_Event:?) { repeat }
Harald Welteae026692017-12-09 01:03:01 +0100119 [] IPA_RSL[i].receive { repeat }
120 [] T.timeout {
Harald Welte96c94412017-12-09 03:12:45 +0100121 setverdict(fail, "Timeout RSL waiting for ASP_IPA_EVENT_ID_ACK");
Harald Welteae026692017-12-09 01:03:01 +0100122 self.stop;
123 }
124 }
125}
126
Harald Welte96c94412017-12-09 03:12:45 +0100127function f_ipa_ctrl_start(inout IPA_Client clnt, charstring bsc_host, PortNumber bsc_port, integer i)
128runs on test_CT {
129 timer T := 10.0;
130
131 clnt.id := "IPA" & int2str(i) & "-CTRL";
132 clnt.vc_IPA := IPA_Emulation_CT.create(clnt.id & "-IPA");
133
134 map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
Harald Weltea5d2ab22017-12-09 14:21:42 +0100135 connect(clnt.vc_IPA:IPA_CTRL_PORT, self:IPA_CTRL);
Harald Welte96c94412017-12-09 03:12:45 +0100136
137 clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", -1));
138
139 /* wait for IPA CTRL link to connect and send UP */
140 T.start;
141 alt {
Harald Weltea5d2ab22017-12-09 14:21:42 +0100142 [] IPA_CTRL.receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP}) { }
Harald Welte96c94412017-12-09 03:12:45 +0100143 [] T.timeout {
144 setverdict(fail, "Timeout CTRL waiting for ASP_IPA_EVENT_UP");
145 self.stop;
146 }
147 }
148}
149
150
Harald Weltea5d2ab22017-12-09 14:21:42 +0100151function f_wait_oml(integer bts_nr, charstring status, float secs_max) runs on test_CT {
152 timer T := secs_max;
153 T.start;
154 while (true) {
155 if (f_ctrl_get_bts(IPA_CTRL, bts_nr, "oml-connection-state") == status) {
156 T.stop;
Harald Weltebd868bd2017-12-10 18:28:40 +0100157 /* the 'degraded' state exists from OML connection time, and we have to wait
158 * until all MO's are initialized */
159 T.start(1.0);
160 T.timeout;
Harald Weltea5d2ab22017-12-09 14:21:42 +0100161 return;
162 }
Harald Weltebd868bd2017-12-10 18:28:40 +0100163 f_sleep(0.5);
Harald Weltea5d2ab22017-12-09 14:21:42 +0100164 if (not T.running) {
165 setverdict(fail, "Timeout waiting for oml-connection-state ", status);
166 self.stop;
167 }
168 }
169}
170
Harald Welteae026692017-12-09 01:03:01 +0100171function f_sleep(float seconds) {
172 timer T := seconds;
173 T.start;
174 T.timeout;
175}
176
177altstep as_Tguard() runs on test_CT {
Harald Welte60e823a2017-12-10 14:10:59 +0100178 var BSSAP_N_UNITDATA_ind ud_ind;
Harald Welteae026692017-12-09 01:03:01 +0100179 [] T_guard.timeout { setverdict(fail, "Timeout of T_guard"); }
Harald Welte60e823a2017-12-10 14:10:59 +0100180 /* always respond with RESET ACK to RESET */
181 [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {
182 BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,
183 ts_BSSMAP_ResetAck));
Harald Welte69c1c262017-12-13 21:02:08 +0100184 repeat;
Harald Welte60e823a2017-12-10 14:10:59 +0100185 }
Harald Welte28d943e2017-11-25 15:00:50 +0100186}
187
Harald Welte624f9632017-12-16 19:26:04 +0100188function f_init(boolean handler_mode := false) runs on test_CT {
Harald Welte28d943e2017-11-25 15:00:50 +0100189 var integer i;
Harald Welte28d943e2017-11-25 15:00:50 +0100190
Harald Welteae026692017-12-09 01:03:01 +0100191 if (g_initialized) {
192 return;
Harald Welte28d943e2017-11-25 15:00:50 +0100193 }
Harald Welteae026692017-12-09 01:03:01 +0100194 g_initialized := true;
195
196 /* Call a function of our 'parent component' BSSAP_Adapter_CT to start the
197 * MSC-side BSSAP emulation */
Harald Welte624f9632017-12-16 19:26:04 +0100198 f_bssap_init("VirtMSC", handler_mode);
Harald Weltea5d2ab22017-12-09 14:21:42 +0100199 f_ipa_ctrl_start(ctrl, mp_bsc_ip, mp_bsc_ctrl_port, 0);
Harald Welte28d943e2017-11-25 15:00:50 +0100200
Harald Welte696ddb62017-12-08 14:01:43 +0100201 for (i := 0; i < NUM_BTS; i := i+1) {
Harald Weltea5d2ab22017-12-09 14:21:42 +0100202 /* wait until osmo-bts-omldummy has respawned */
203 f_wait_oml(i, "degraded", 5.0);
204 /* start RSL connection */
Harald Welte624f9632017-12-16 19:26:04 +0100205 f_ipa_rsl_start(bts[i].rsl, mp_bsc_ip, mp_bsc_rsl_port, i, handler_mode);
Harald Weltea5d2ab22017-12-09 14:21:42 +0100206 /* wait until BSC tells us "connected" */
207 f_wait_oml(i, "connected", 5.0);
Harald Welte696ddb62017-12-08 14:01:43 +0100208 }
Harald Welteae026692017-12-09 01:03:01 +0100209 f_sleep(0.5);
Harald Welte696ddb62017-12-08 14:01:43 +0100210
Harald Welteae026692017-12-09 01:03:01 +0100211 T_guard.start;
212 activate(as_Tguard());
Harald Welte28d943e2017-11-25 15:00:50 +0100213}
214
Harald Welteae026692017-12-09 01:03:01 +0100215function f_exp_ipa_rx(integer bts_nr, template RSL_Message t_rx, float t_secs := 2.0, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)
216runs on test_CT return RSL_Message {
217 var ASP_RSL_Unitdata rx_rsl_ud;
218 timer T := t_secs;
219
220 T.start;
221 alt {
222 [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(sid, t_rx)) -> value rx_rsl_ud {
223 T.stop;
224 }
225 [] IPA_RSL[bts_nr].receive { repeat; }
Harald Welteb2917702017-12-10 15:48:52 +0100226 [] T.timeout {
227 setverdict(fail, "Timeout expecting ", t_rx);
228 self.stop;
229 }
Harald Welteae026692017-12-09 01:03:01 +0100230 }
231 return rx_rsl_ud.rsl;
232}
233
234function f_ipa_tx(integer bts_nr, template RSL_Message t_tx, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)
235runs on test_CT {
236 IPA_RSL[bts_nr].send(ts_ASP_RSL_UD(sid, t_tx));
237}
238
239
Harald Welte4003d112017-12-09 22:35:39 +0100240/* verify we get a CHAN_ACT after CHAN RQD */
Harald Welteae026692017-12-09 01:03:01 +0100241testcase TC_chan_act_noreply() runs on test_CT {
242 var BSSAP_N_UNITDATA_ind ud_ind;
Harald Welte28d943e2017-11-25 15:00:50 +0100243
244 f_init();
Harald Welteae026692017-12-09 01:03:01 +0100245 f_bssap_reset();
Harald Welte28d943e2017-11-25 15:00:50 +0100246
Harald Welteae026692017-12-09 01:03:01 +0100247 IPA_RSL[0].send(ts_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,ts_RSL_CHAN_RQD('23'O, 23)));
248 f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
249 setverdict(pass);
Harald Welte28d943e2017-11-25 15:00:50 +0100250}
251
Harald Welte4003d112017-12-09 22:35:39 +0100252/* verify if the "chreq:total" counter increments as expected */
253testcase TC_chan_act_counter() runs on test_CT {
254 var BSSAP_N_UNITDATA_ind ud_ind;
255 var integer chreq_total;
256
257 f_init();
258 f_bssap_reset();
259
260 chreq_total := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total");
261 IPA_RSL[0].send(ts_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,ts_RSL_CHAN_RQD('23'O, 23)));
262 f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
263 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total", chreq_total+1);
264
265 setverdict(pass);
266}
267
Harald Welteae026692017-12-09 01:03:01 +0100268/* CHAN RQD -> CHAN ACT -> CHAN ACT ACK -> RF CHAN REL */
269testcase TC_chan_act_ack_noest() runs on test_CT {
270 var RSL_Message rx_rsl;
271
272 f_init();
273 f_bssap_reset();
274
275 /* Send CHAN RQD and wait for allocation; acknowledge it */
Harald Welted6939652017-12-13 21:02:46 +0100276 var RslChannelNr chan_nr := f_chreq_act_ack();
Harald Welteae026692017-12-09 01:03:01 +0100277
278 /* expect BSC to disable the channel again if there's no RLL EST IND */
279 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
280
281 setverdict(pass);
282}
283
284/* Test behavior if MSC never answers to CR */
285testcase TC_chan_act_ack_est_ind_noreply() runs on test_CT {
286 var RSL_Message rx_rsl;
287
288 f_init();
289 f_bssap_reset();
290
291 /* Send CHAN RQD and wait for allocation; acknowledge it */
Harald Welted6939652017-12-13 21:02:46 +0100292 var RslChannelNr chan_nr := f_chreq_act_ack();
Harald Welteae026692017-12-09 01:03:01 +0100293
294 var octetstring l3 := '00010203040506'O
295 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
296
297 BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3)));
298
299 /* expect BSC to disable the channel again if there's no response from MSC */
300 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
301
302 setverdict(pass);
303}
304
305/* Test behavior if MSC answers with CREF to CR */
306testcase TC_chan_act_ack_est_ind_refused() runs on test_CT {
307 var BSSAP_N_CONNECT_ind rx_c_ind;
308 var RSL_Message rx_rsl;
309
310 f_init();
311 f_bssap_reset();
312
313 /* Send CHAN RQD and wait for allocation; acknowledge it */
Harald Welted6939652017-12-13 21:02:46 +0100314 var RslChannelNr chan_nr := f_chreq_act_ack();
Harald Welteae026692017-12-09 01:03:01 +0100315
316 var octetstring l3 := '00010203040506'O
317 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
318
319 BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
320 BSSAP.send(ts_BSSAP_DISC_req(rx_c_ind.connectionId, 0));
321
322 /* expect BSC to disable the channel */
323 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
324
325 setverdict(pass);
326}
327
Harald Welte618ef642017-12-14 14:58:20 +0100328/* CHAN RQD -> CHAN ACT -> CHAN ACT NACK -> RF CHAN REL */
329testcase TC_chan_act_nack() runs on test_CT {
330 var RSL_Message rx_rsl;
331 var integer chact_nack;
332
333 f_init();
334 f_bssap_reset();
335
336 chact_nack := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "chan_act:nack");
337
338 f_ipa_tx(0, ts_RSL_CHAN_RQD('33'O, 33));
339 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
340 var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
341
342 f_ipa_tx(0, ts_RSL_CHAN_ACT_NACK(chan_nr, RSL_ERR_EQUIPMENT_FAIL));
343
344 /* wait for some time to hope the NACK arrives before the CTRL GET below */
345 f_sleep(0.5);
346
347 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chan_act:nack", chact_nack+1);
348
349 setverdict(pass);
350}
351
Harald Welte799c97b2017-12-14 17:50:30 +0100352/* Test for channel exhaustion due to RACH overload */
353testcase TC_chan_exhaustion() runs on test_CT {
354 var ASP_RSL_Unitdata rsl_ud;
355 var integer i;
356 var integer chreq_total, chreq_nochan;
357
358 f_init();
359 f_bssap_reset();
360
361 chreq_total := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total");
362 chreq_nochan := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:no_channel");
363
364 /* expect 5xTCH/F to succeed */
365 for (i := 0; i < NUM_TCHF_PER_BTS; i := i+1) {
366 f_chreq_act_ack('23'O, i);
367 }
368
369 IPA_RSL[0].clear;
370
371 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total", chreq_total+NUM_TCHF_PER_BTS);
372
373 /* now expect additional channel activations to fail */
374 f_ipa_tx(0, ts_RSL_CHAN_RQD('42'O, 42));
375
376 alt {
377 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
378 tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV))) {
379 setverdict(fail, "Received CHAN ACT ACK without resources?!?");
380 }
381 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_IMM_ASSIGN(?))) -> value rsl_ud {
382 var GsmRrMessage rr;
383 /* match on IMM ASS REJ */
384 rr := dec_GsmRrMessage(rsl_ud.rsl.ies[1].body.full_imm_ass_info.payload);
385 if (rr.header.message_type == IMMEDIATE_ASSIGNMENT_REJECT) {
386 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:total",
387 chreq_total+NUM_TCHF_PER_BTS+1);
388 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "chreq:no_channel",
389 chreq_nochan+1);
390 setverdict(pass);
391 } else {
392 repeat;
393 }
394 }
395 [] IPA_RSL[0].receive { repeat; }
396 }
397}
398
Harald Weltecfe2c962017-12-15 12:09:32 +0100399/***********************************************************************
400 * Assignment Testing
401 ***********************************************************************/
402
403/* Verify that the BSC refuses any BSSAP connection from the MSC (They are all BSC->MSC direction) */
404testcase TC_outbound_connect() runs on test_CT {
405 f_init();
406 f_bssap_reset();
407
408 BSSAP.send(ts_BSSAP_CONNECT_req(g_sccp_addr_peer, g_sccp_addr_own, 2342, ts_BSSMAP_AssignmentReq));
409 BSSAP.receive(tr_BSSAP_DISC_ind(2342, ?, ?));
410 setverdict(pass);
411}
412
Harald Welte16a4adf2017-12-14 18:54:01 +0100413/* Test behavior if MSC answers with CREF to CR */
414testcase TC_assignment_cic_only() runs on test_CT {
415 var BSSAP_N_CONNECT_ind rx_c_ind;
416 var RSL_Message rx_rsl;
417 var DchanTuple dt;
418
419 f_init();
420 f_bssap_reset();
421
422 dt := f_est_dchan('23'O, 23, '00000000'O);
423 /* send assignment without AoIP IEs */
Harald Weltecc7e4dc2017-12-14 21:55:10 +0100424 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 +0100425 alt {
426 [] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentComplete)) {
427 setverdict(fail, "AoIP BSC cannot accept ASSIGNMENT without AoIP Transport IE");
428 }
Harald Welte235ebf12017-12-15 14:18:16 +0100429 /* TODO: Actually expect GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP */
Harald Welte16a4adf2017-12-14 18:54:01 +0100430 [] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentFail)) {
431 setverdict(pass);
432 }
433 [] BSSAP.receive { repeat; }
434 }
435}
436
Harald Welte235ebf12017-12-15 14:18:16 +0100437/* Run everything required up to sending a caller-specified assignment command and expect response */
438function f_assignment_exp(PDU_BSSAP ass_cmd, template PDU_BSSAP exp, charstring fail_text)
439runs on test_CT {
440 var BSSAP_N_CONNECT_ind rx_c_ind;
441 var RSL_Message rx_rsl;
442 var DchanTuple dt;
443
444 f_init();
445 f_bssap_reset();
446
447 dt := f_est_dchan('23'O, 23, '00000000'O);
448 /* send assignment without AoIP IEs */
449 BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ass_cmd));
450 alt {
451 [] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentComplete)) {
452 if (ischosen(exp.pdu.bssmap.assignmentComplete)) {
453 setverdict(pass);
454 } else {
455 setverdict(fail, fail_text);
456 }
457 }
458 [] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentFail)) {
459 if (ischosen(exp.pdu.bssmap.assignmentFailure)) {
460 setverdict(pass);
461 } else {
462 setverdict(fail, fail_text);
463 }
464 }
465 [] BSSAP.receive { repeat; }
466 }
467}
468testcase TC_assignment_csd() runs on test_CT {
469 var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail;
470 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
471 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
472 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelTypeCSD);
473 //exp_fail.pdu.bssmap.assignmentFailure.cause.causeValue := int2bit(enum2int(GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL), 7);
474 f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for CSD");
475}
476
477testcase TC_assignment_ctm() runs on test_CT {
478 var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail;
479 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
480 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
481 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelTypeCTM);
482 //exp_fail.pdu.bssmap.assignmentFailure.cause.causeValue := int2bit(enum2int(GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL), 7);
483 f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for Speech+CTM");
484}
485
486testcase TC_assignment_sign() runs on test_CT {
487 var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, omit);
488 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
489 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
490
491 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelTypeSIGNAL);
492 f_assignment_exp(ass_cmd, exp_compl, "BSC failed SIGNALLING assignment");
493}
494
495testcase TC_assignment_fr_a5_0() runs on test_CT {
496 var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?);
497 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
498 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
499 const OCT8 kc := '0001020304050607'O;
500
501 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
Harald Weltef1b64e22017-12-15 14:55:14 +0100502 ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
Harald Welte235ebf12017-12-15 14:18:16 +0100503 ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
504 valueof(ts_BSSMAP_IE_EncrInfo(kc, '01'O));
505 f_assignment_exp(ass_cmd, exp_compl, "BSC failed TCH/F FR A5/0 assignment");
506}
507
508testcase TC_assignment_fr_a5_1() runs on test_CT {
509 var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?);
510 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
511 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
512 const OCT8 kc := '0001020304050607'O;
513
514 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
Harald Weltef1b64e22017-12-15 14:55:14 +0100515 ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
Harald Welte235ebf12017-12-15 14:18:16 +0100516 ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
517 valueof(ts_BSSMAP_IE_EncrInfo(kc, '02'O));
518 f_assignment_exp(ass_cmd, exp_compl, "BSC failed TCH/F FR A5/1 assignment");
519}
520
Harald Weltef1b64e22017-12-15 14:55:14 +0100521/* Exxpet ASSIGNMENT FAIL if mandatory IE is missing */
522testcase TC_assignment_fr_a5_1_codec_missing() runs on test_CT {
523 var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail;
524 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
525 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
526 const OCT8 kc := '0001020304050607'O;
527
528 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
529 ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
530 valueof(ts_BSSMAP_IE_EncrInfo(kc, '02'O));
531 f_assignment_exp(ass_cmd, exp_fail, "BSC didn't reject missing mandatory speech codec IE");
532}
533
534
Harald Welte235ebf12017-12-15 14:18:16 +0100535
536testcase TC_assignment_fr_a5_3() runs on test_CT {
537 var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?);
538 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
539 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
540 const OCT8 kc := '0001020304050607'O;
541
542 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
Harald Weltef1b64e22017-12-15 14:55:14 +0100543 ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
Harald Welte235ebf12017-12-15 14:18:16 +0100544 ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
545 valueof(ts_BSSMAP_IE_EncrInfo(kc, '08'O));
546 f_assignment_exp(ass_cmd, exp_compl, "BSC failed TCH/F FR A5/3 assignment");
547}
548
549testcase TC_assignment_fr_a5_4() runs on test_CT {
550 var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail;
551 var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
552 var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
553 const OCT8 kc := '0001020304050607'O;
554 const OCT16 kc128 := kc & kc;
555
556 ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
Harald Weltef1b64e22017-12-15 14:55:14 +0100557 ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
Harald Welte235ebf12017-12-15 14:18:16 +0100558 ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
559 valueof(ts_BSSMAP_IE_EncrInfo(kc, '10'O));
560 ass_cmd.pdu.bssmap.assignmentRequest.kC128 := valueof(ts_BSSMAP_IE_Kc128(kc128));
561 /* TODO: expect GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED cause value */
562 f_assignment_exp(ass_cmd, exp_fail, "BSC accepted TCH/F FR A5/4 assignment");
563}
564
565
566
Harald Welte618ef642017-12-14 14:58:20 +0100567
Harald Welte4003d112017-12-09 22:35:39 +0100568type record DchanTuple {
569 integer sccp_conn_id,
570 RslChannelNr rsl_chan_nr
Harald Weltea5d2ab22017-12-09 14:21:42 +0100571}
572
Harald Welted6939652017-12-13 21:02:46 +0100573/* Send CHAN RQD and wait for allocation; acknowledge it */
574private function f_chreq_act_ack(OCT1 ra := '23'O, GsmFrameNumber fn := 23)
575runs on test_CT return RslChannelNr {
576 var RSL_Message rx_rsl;
577 f_ipa_tx(0, ts_RSL_CHAN_RQD(ra, fn));
578 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
579 var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
580 f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, fn+10));
581 return chan_nr;
582}
583
Harald Welte4003d112017-12-09 22:35:39 +0100584/* helper function to establish a dedicated channel via BTS and MSC */
585function f_est_dchan(OCT1 ra, GsmFrameNumber fn, octetstring l3)
586runs on test_CT return DchanTuple {
587 var BSSAP_N_CONNECT_ind rx_c_ind;
Harald Welte4003d112017-12-09 22:35:39 +0100588 var DchanTuple dt;
Harald Weltea5d2ab22017-12-09 14:21:42 +0100589
Harald Welte4003d112017-12-09 22:35:39 +0100590 /* Send CHAN RQD and wait for allocation; acknowledge it */
Harald Welted6939652017-12-13 21:02:46 +0100591 dt.rsl_chan_nr := f_chreq_act_ack(ra, fn);
Harald Welte4003d112017-12-09 22:35:39 +0100592
593 f_ipa_tx(0, ts_RSL_EST_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
594
595 BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
596 dt.sccp_conn_id := rx_c_ind.connectionId;
597 BSSAP.send(ts_BSSAP_CONNECT_res(dt.sccp_conn_id));
598
599 return dt;
Harald Weltea5d2ab22017-12-09 14:21:42 +0100600}
601
Harald Welte4003d112017-12-09 22:35:39 +0100602/* Test behavior of channel release after unilateral RLL REL IND (DISC from MS) */
603testcase TC_chan_rel_rll_rel_ind() runs on test_CT {
604 var RSL_Message rx_rsl;
605 var DchanTuple dt;
Harald Welte96c94412017-12-09 03:12:45 +0100606
607 f_init();
608 f_bssap_reset();
609
Harald Welte4003d112017-12-09 22:35:39 +0100610 dt := f_est_dchan('23'O, 23, '00010203040506'O);
611
612 /* simulate RLL REL IND */
613 f_ipa_tx(0, ts_RSL_REL_IND(dt.rsl_chan_nr, valueof(ts_RslLinkID_DCCH(0))));
614
615 /* expect BSC to disable the channel */
616 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
617 /* respond with CHAN REL ACK */
618 f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
619
620 /* expect DISC_IND on MSC side */
621 BSSAP.receive(tr_BSSAP_DISC_ind(dt.sccp_conn_id, ?, ?));
622
623 setverdict(pass);
624}
625
626/* Test behavior of channel release after CONN FAIL IND from BTS */
627testcase TC_chan_rel_conn_fail() runs on test_CT {
628 var BSSAP_N_DATA_ind rx_di;
629 var RSL_Message rx_rsl;
630 var DchanTuple dt;
631
632 f_init();
633 f_bssap_reset();
634
635 dt := f_est_dchan('23'O, 23, '00010203040506'O);
636
637 /* simulate CONN FAIL IND */
Harald Weltea8ed9062017-12-14 09:46:01 +0100638 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 +0100639 /* TODO: different cause values? */
640
641 /* expect BSC to disable the channel */
642 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
643 /* respond with CHAN REL ACK */
644 f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
645
646 /* expect Clear Request from BSC */
647 BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearRequest)) -> value rx_di;
648
649 /* Instruct BSC to clear channel */
650 var BssmapCause cause := bit2int(rx_di.userData.pdu.bssmap.clearRequest.cause.causeValue);
651 BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
652
653 /* expect Clear Complete from BSC */
654 BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete));
655
656 /* release the SCCP connection */
657 BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
658
659 /* wait for SCCP emulation to do its job */
660 f_sleep(1.0);
661
662 setverdict(pass);
663}
664
665/* Test behavior of channel release after hard Clear Command from MSC */
666testcase TC_chan_rel_hard_clear() runs on test_CT {
667 var BSSAP_N_DATA_ind rx_di;
Harald Welte4003d112017-12-09 22:35:39 +0100668 var DchanTuple dt;
669 var RslLinkId main_dcch := valueof(ts_RslLinkID_DCCH(0));
670
671 f_init();
672 f_bssap_reset();
673
674 dt := f_est_dchan('23'O, 23, '00010203040506'O);
675
676 /* Instruct BSC to clear channel */
677 var BssmapCause cause := 0;
678 BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
679
680 /* expect Clear Complete from BSC on A */
681 BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete)) {
682 /* release the SCCP connection */
683 BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
684 }
685
686 /* Clear the queue, it might still contain stuff like IMMEDIATE ASSIGN */
687 IPA_RSL[0].clear;
688 alt {
689 /* ignore DEACTIVATE SACCH (if any) */
690 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
691 tr_RSL_DEACT_SACCH(dt.rsl_chan_nr))) {
692 repeat;
693 }
694 /* acknowledge RLL release (if any)*/
695 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
696 tr_RSL_REL_REQ(dt.rsl_chan_nr, ?))) {
697 /* FIXME: Why are we getting this for LinkID SACCH? */
698 f_ipa_tx(0, ts_RSL_REL_CONF(dt.rsl_chan_nr, main_dcch));
699 repeat;
700 }
701 /* Expect RF channel release from BSC on Abis */
702 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
703 tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL))) {
704 /* respond with CHAN REL ACK */
705 f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
706 }
707 }
708
709 setverdict(pass);
710}
711
Harald Welted8c36cd2017-12-09 23:05:31 +0100712/* Test behavior of channel release after hard RLSD from MSC */
713testcase TC_chan_rel_hard_rlsd() runs on test_CT {
Harald Welted8c36cd2017-12-09 23:05:31 +0100714 var DchanTuple dt;
715 var RslLinkId main_dcch := valueof(ts_RslLinkID_DCCH(0));
716
717 f_init();
718 f_bssap_reset();
719
720 dt := f_est_dchan('23'O, 23, '00010203040506'O);
721
722 /* release the SCCP connection */
723 BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
724
725 /* Clear the queue, it might still contain stuff like IMMEDIATE ASSIGN */
726 IPA_RSL[0].clear;
727 alt {
728 /* ignore DEACTIVATE SACCH (if any) */
729 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
730 tr_RSL_DEACT_SACCH(dt.rsl_chan_nr))) {
731 repeat;
732 }
733 /* acknowledge RLL release (if any)*/
734 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
735 tr_RSL_REL_REQ(dt.rsl_chan_nr, ?))) {
736 /* FIXME: Why are we getting this for LinkID SACCH? */
737 f_ipa_tx(0, ts_RSL_REL_CONF(dt.rsl_chan_nr, main_dcch));
738 repeat;
739 }
740 /* Expect RF channel release from BSC on Abis */
741 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
742 tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL))) {
743 /* respond with CHAN REL ACK */
744 f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
745 }
746 }
747
748 setverdict(pass);
749}
750
Harald Welte85804d42017-12-10 14:11:58 +0100751/* Test behavior of channel release after BSSMAP RESET from MSC */
752testcase TC_chan_rel_a_reset() runs on test_CT {
Harald Welte85804d42017-12-10 14:11:58 +0100753 var DchanTuple dt;
754 var RslLinkId main_dcch := valueof(ts_RslLinkID_DCCH(0));
755
756 f_init();
757 f_bssap_reset();
758
759 dt := f_est_dchan('23'O, 23, '00010203040506'O);
760
761 /* Clear the queue, it might still contain stuff like IMMEDIATE ASSIGN */
762 IPA_RSL[0].clear;
763
764 /* perform BSSAP RESET, expect RESET ACK and DISC.ind on connection */
765 BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, ts_BSSMAP_Reset(0)));
766 interleave {
767 [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_sccp_addr_own, g_sccp_addr_peer, tr_BSSMAP_ResetAck)) { }
768 [] BSSAP.receive(tr_BSSAP_DISC_ind(dt.sccp_conn_id, ?, ?)) { }
769 }
770
771 alt {
772 /* ignore DEACTIVATE SACCH (if any) */
773 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
774 tr_RSL_DEACT_SACCH(dt.rsl_chan_nr))) {
775 repeat;
776 }
777 /* acknowledge RLL release (if any)*/
778 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
779 tr_RSL_REL_REQ(dt.rsl_chan_nr, ?))) {
780 /* FIXME: Why are we getting this for LinkID SACCH? */
781 f_ipa_tx(0, ts_RSL_REL_CONF(dt.rsl_chan_nr, main_dcch));
782 repeat;
783 }
784 /* Expect RF channel release from BSC on Abis */
785 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,
786 tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL))) {
787 /* respond with CHAN REL ACK */
788 f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
789 }
790 /* ignore any user data */
791 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_MsgTypeR(?))) {
792 repeat;
793 }
794 }
795
796 setverdict(pass);
797}
798
Harald Welte5cd20ed2017-12-13 21:03:20 +0100799/* Test behavior if RSL EST IND for non-active channel */
800testcase TC_rll_est_ind_inact_lchan() runs on test_CT {
801 timer T := 2.0;
802
803 f_init();
804 f_bssap_reset();
805
806 var octetstring l3 := '00010203040506'O;
807 var RslChannelNr chan_nr := valueof(t_RslChanNr_Bm(6));
808 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
809
810 T.start;
811 alt {
812 [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) {
813 setverdict(fail, "MSC received COMPL L3 for non-active lchan");
814 }
815 [] BSSAP.receive {}
816 [] IPA_RSL[0].receive {}
817 [] T.timeout {}
818 }
819
820 setverdict(pass);
821}
822
823/* Test behavior if RSL EST IND for invalid SAPI */
824testcase TC_rll_est_ind_inval_sapi1() runs on test_CT {
825 var RslChannelNr chan_nr;
826
827 f_init();
828 f_bssap_reset();
829
830 chan_nr := f_chreq_act_ack()
831
832 var octetstring l3 := '00010203040506'O;
833 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(1)), l3));
834
835 timer T := 2.0;
836 T.start;
837 alt {
838 [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) {
839 setverdict(fail, "MSC received COMPL L3 for invalid SAPI 1");
840 }
841 [] BSSAP.receive { repeat; }
842 [] IPA_RSL[0].receive { repeat; }
843 [] T.timeout {}
844 }
845
846 setverdict(pass);
847}
848
849/* Test behavior if RSL EST IND for invalid SAPI */
850testcase TC_rll_est_ind_inval_sapi3() runs on test_CT {
851 timer T := 2.0;
852
853 f_init();
854 f_bssap_reset();
855
856 var RslChannelNr chan_nr := f_chreq_act_ack();
857
858 var octetstring l3 := '00010203040506'O;
859 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(3)), l3));
860
861 T.start;
862 alt {
863 [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) {
864 setverdict(fail, "MSC received COMPL L3 for invalid SAPI 3");
865 }
866 [] BSSAP.receive { repeat; }
867 [] IPA_RSL[0].receive { repeat; }
868 [] T.timeout {}
869 }
870
871 setverdict(pass);
872}
873
874/* Test behavior if RSL EST IND for invalid SACCH */
875testcase TC_rll_est_ind_inval_sacch() runs on test_CT {
876 timer T := 2.0;
877
878 f_init();
879 f_bssap_reset();
880
881 var RslChannelNr chan_nr := f_chreq_act_ack();
882
883 var octetstring l3 := '00010203040506'O;
884 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_SACCH(0)), l3));
885
886 T.start;
887 alt {
888 [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) {
889 setverdict(fail, "MSC received COMPL L3 for invalid Link SACCH");
890 }
891 [] BSSAP.receive { repeat; }
892 [] IPA_RSL[0].receive { repeat; }
893 [] T.timeout {}
894 }
895
896 setverdict(pass);
897}
898
899
900
Harald Welte4003d112017-12-09 22:35:39 +0100901
902testcase TC_ctrl_msc_connection_status() runs on test_CT {
903 var charstring ctrl_resp;
904
905 f_init();
906 f_bssap_reset();
907
908 /* See https://osmocom.org/issues/2729 */
909 f_ctrl_get_exp(IPA_CTRL, "msc_connection_status", "connected");
910 setverdict(pass);
911}
912
913testcase TC_ctrl() runs on test_CT {
914 var charstring ctrl_resp;
915
916 f_init();
917 f_bssap_reset();
918
919 /* all below values must match the osmo-bsc.cfg config file used */
920
921 f_ctrl_get_exp(IPA_CTRL, "mcc", "1");
922 f_ctrl_get_exp(IPA_CTRL, "mnc", "1");
923 f_ctrl_get_exp(IPA_CTRL, "short-name", "OsmoBSC");
924 f_ctrl_get_exp(IPA_CTRL, "long-name", "OsmoBSC");
925 f_ctrl_get_exp(IPA_CTRL, "number-of-bts", "1");
926
927 var integer bts_nr := 0;
928 f_ctrl_get_exp_bts(IPA_CTRL, bts_nr, "location-area-code", "1");
929 f_ctrl_get_exp_bts(IPA_CTRL, bts_nr, "cell-identity", "0");
930 f_ctrl_get_exp_bts(IPA_CTRL, bts_nr, "oml-connection-state", "connected");
931 f_ctrl_get_exp_bts(IPA_CTRL, bts_nr, "gprs-mode", "gprs");
932 f_ctrl_get_exp_bts(IPA_CTRL, bts_nr, "rf_state", "operational,unlocked,on");
933 f_ctrl_get_exp_trx(IPA_CTRL, bts_nr, 0, "arfcn", "871");
934 f_ctrl_get_exp_trx(IPA_CTRL, bts_nr, 0, "max-power-reduction", "20");
935
936 var integer uptime := str2int(f_ctrl_get_bts(IPA_CTRL, bts_nr, "oml-uptime"));
937 f_sleep(2.0);
938 if (str2int(f_ctrl_get_bts(IPA_CTRL, bts_nr, "oml-uptime")) < uptime+1) {
939 setverdict(fail, "oml-uptime not incrementing as expected");
940 }
941 /* TODO: Disconnect RSL, imply that OML is disconnected and check for uptime zero? */
942
943 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bsc", 0, "paging:attempted", 0);
944
945 setverdict(pass);
Harald Welte96c94412017-12-09 03:12:45 +0100946}
947
Harald Welte6f521d82017-12-11 19:52:02 +0100948function f_bssap_tx_ud(template PDU_BSSAP bssap) runs on test_CT {
949 BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, bssap));
950}
951
952
953/***********************************************************************
954 * Paging Testing
955 ***********************************************************************/
956
957type record Cell_Identity {
958 GsmMcc mcc,
959 GsmMnc mnc,
960 GsmLac lac,
961 GsmCellId ci
962};
963private const Cell_Identity cid := { '001'H, '001'H, 1, 0 };
964
Harald Welte5d1a2202017-12-13 19:51:29 +0100965type set of integer BtsIdList;
966
967private function f_bts_in_list(integer bts_id, BtsIdList bts_ids) return boolean {
968 for (var integer j := 0; j < sizeof(bts_ids); j := j + 1) {
969 if (bts_id == bts_ids[j]) {
970 return true;
971 }
972 }
973 return false;
974}
Harald Welte6f521d82017-12-11 19:52:02 +0100975
976/* core paging test helper function; used by most paging test cases */
977private function f_pageing_helper(hexstring imsi,
978 template BSSMAP_FIELD_CellIdentificationList cid_list,
Harald Welte5d1a2202017-12-13 19:51:29 +0100979 BtsIdList bts_ids := { 0 },
Harald Welte6f521d82017-12-11 19:52:02 +0100980 template RSL_ChanNeeded rsl_chneed := omit,
981 template OCT4 tmsi := omit) runs on test_CT
982{
983 var template BSSMAP_IE_ChannelNeeded bssmap_chneed;
984 var MobileIdentity mi;
985 var template octetstring id_enc; /* FIXME */
986 var RSL_Message rx_rsl;
987 var integer paging_group := hex2int(imsi[lengthof(imsi)-1]);
Harald Welte5d1a2202017-12-13 19:51:29 +0100988 var integer i;
Harald Welte6f521d82017-12-11 19:52:02 +0100989
990 f_init();
991 f_bssap_reset();
992
993 /* Clear the queue, it might still contain stuff like BCCH FILLING */
Harald Welte5d1a2202017-12-13 19:51:29 +0100994 for (i := 0; i < sizeof(bts_ids); i := i + 1) {
995 IPA_RSL[bts_ids[i]].clear;
996 }
Harald Welte6f521d82017-12-11 19:52:02 +0100997
998 if (isvalue(rsl_chneed)) {
999 /* The values of 08.08 3.2.2.36 and 08.58 9.3.40 are luckily identical */
1000 bssmap_chneed := ts_BSSMAP_IE_ChanNeeded(int2bit(enum2int(valueof(rsl_chneed)),2));
1001 } else {
1002 bssmap_chneed := omit;
1003 }
1004
1005 f_bssap_tx_ud(ts_BSSMAP_Paging(imsi, cid_list, tmsi, bssmap_chneed));
1006
1007/* FIXME: Disabled due to bugs in both GSM_RR_Types and MobileL3_CommonIE_Types IMSI encoder
1008 if (isvalue(tmsi)) {
1009 mi := valueof(t_Osmo_MI_TMSI(oct2int(valueof(tmsi))));
1010 } else {
1011 mi := valueof(ts_Osmo_MI_IMSI(imsi));
1012 }
1013 id_enc := enc_MobileIdentity(mi);
1014*/
1015 id_enc := ?;
Harald Welte5d1a2202017-12-13 19:51:29 +01001016 for (i := 0; i < sizeof(bts_ids); i := i + 1) {
1017 rx_rsl := f_exp_ipa_rx(bts_ids[i], tr_RSL_PAGING_CMD(id_enc));
1018 /* check channel type, paging group */
1019 if (rx_rsl.ies[1].body.paging_group != paging_group) {
1020 setverdict(fail, "Paging for wrong paging group");
1021 }
1022 if (ispresent(rsl_chneed) and
1023 rx_rsl.ies[3].body.chan_needed.chan_needed != valueof(rsl_chneed)) {
1024 setverdict(fail, "RSL Channel Needed != BSSMAP Channel Needed");
1025 }
Harald Welte6f521d82017-12-11 19:52:02 +01001026 }
Harald Welte5d1a2202017-12-13 19:51:29 +01001027 /* do a quick check on all not-included BTSs if they received paging */
1028 for (i := 0; i < NUM_BTS; i := i + 1) {
1029 timer T := 0.1;
1030 if (f_bts_in_list(i, bts_ids)) {
1031 continue;
1032 }
1033 T.start;
1034 alt {
1035 [] IPA_RSL[i].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(id_enc))) {
1036 setverdict(fail, "Paging on BTS ", i, " which is not part of ", bts_ids);
1037 }
1038 [] IPA_RSL[i].receive { repeat; }
1039 [] T.timeout { }
1040 }
Harald Welte6f521d82017-12-11 19:52:02 +01001041 }
1042
1043 setverdict(pass);
1044}
1045
Harald Welte5d1a2202017-12-13 19:51:29 +01001046const BtsIdList c_BtsId_all := { 0, 1, 2 };
1047const BtsIdList c_BtsId_LAC1 := { 0, 1 };
1048const BtsIdList c_BtsId_LAC2 := { 2 };
1049
Harald Welte6f521d82017-12-11 19:52:02 +01001050/* PAGING by IMSI + TMSI */
1051testcase TC_paging_imsi_nochan() runs on test_CT {
1052 var BSSMAP_FIELD_CellIdentificationList cid_list;
1053 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001054 f_pageing_helper('001010123456789'H, cid_list, c_BtsId_all);
Harald Welte6f521d82017-12-11 19:52:02 +01001055}
1056
1057/* PAGING by IMSI + TMSI */
1058testcase TC_paging_tmsi_nochan() runs on test_CT {
1059 var BSSMAP_FIELD_CellIdentificationList cid_list;
1060 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001061 f_pageing_helper('001010100000001'H, cid_list, c_BtsId_all, omit, 'A1B2C301'O);
Harald Welte6f521d82017-12-11 19:52:02 +01001062}
1063
1064/* Paging with different "channel needed' values */
1065testcase TC_paging_tmsi_any() runs on test_CT {
1066 var BSSMAP_FIELD_CellIdentificationList cid_list;
1067 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001068 f_pageing_helper('001010100000002'H, cid_list, c_BtsId_all, RSL_CHANNEED_ANY, 'A1B2C302'O);
Harald Welte6f521d82017-12-11 19:52:02 +01001069}
1070testcase TC_paging_tmsi_sdcch() runs on test_CT {
1071 var BSSMAP_FIELD_CellIdentificationList cid_list;
1072 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001073 f_pageing_helper('001010100000003'H, cid_list, c_BtsId_all, RSL_CHANNEED_SDCCH, 'A1B2C303'O);
Harald Welte6f521d82017-12-11 19:52:02 +01001074}
1075testcase TC_paging_tmsi_tch_f() runs on test_CT {
1076 var BSSMAP_FIELD_CellIdentificationList cid_list;
1077 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001078 f_pageing_helper('001010000000004'H, cid_list, c_BtsId_all, RSL_CHANNEED_TCH_F, 'A1B2C304'O);
Harald Welte6f521d82017-12-11 19:52:02 +01001079}
1080testcase TC_paging_tmsi_tch_hf() runs on test_CT {
1081 var BSSMAP_FIELD_CellIdentificationList cid_list;
1082 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001083 f_pageing_helper('001010000000005'H, cid_list, c_BtsId_all, RSL_CHANNEED_TCH_ForH, 'A1B2C305'O);
Harald Welte6f521d82017-12-11 19:52:02 +01001084}
1085
1086/* Paging by CGI */
1087testcase TC_paging_imsi_nochan_cgi() runs on test_CT {
1088 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1089 cid_list := { cIl_CGI := { ts_BSSMAP_CI_CGI(cid.mcc, cid.mnc, cid.lac, cid.ci) } };
Harald Welte5d1a2202017-12-13 19:51:29 +01001090 f_pageing_helper('001010000000006'H, cid_list, { 0 });
Harald Welte6f521d82017-12-11 19:52:02 +01001091}
1092
1093/* Paging by LAC+CI */
1094testcase TC_paging_imsi_nochan_lac_ci() runs on test_CT {
1095 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1096 cid_list := { cIl_LAC_CI := { ts_BSSMAP_CI_LAC_CI(cid.lac, cid.ci) } };
Harald Welte5d1a2202017-12-13 19:51:29 +01001097 f_pageing_helper('001010000000007'H, cid_list, { 0 });
Harald Welte6f521d82017-12-11 19:52:02 +01001098}
1099
1100/* Paging by CI */
1101testcase TC_paging_imsi_nochan_ci() runs on test_CT {
1102 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1103 cid_list := { cIl_CI := { ts_BSSMAP_CI_CI(cid.ci) } };
Harald Welte5d1a2202017-12-13 19:51:29 +01001104 f_pageing_helper('001010000000008'H, cid_list, { 0 });
Harald Welte6f521d82017-12-11 19:52:02 +01001105}
1106
1107/* Paging by LAI */
1108testcase TC_paging_imsi_nochan_lai() runs on test_CT {
1109 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1110 cid_list := { cIl_LAI := { ts_BSSMAP_CI_LAI(cid.mcc, cid.mnc, cid.lac) } };
Harald Welte5d1a2202017-12-13 19:51:29 +01001111 f_pageing_helper('001010000000009'H, cid_list, c_BtsId_LAC1);
Harald Welte6f521d82017-12-11 19:52:02 +01001112}
1113
1114/* Paging by LAC */
1115testcase TC_paging_imsi_nochan_lac() runs on test_CT {
1116 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1117 cid_list := { cIl_LAC := { ts_BSSMAP_CI_LAC(cid.lac) } };
Harald Welte5d1a2202017-12-13 19:51:29 +01001118 f_pageing_helper('001010000000010'H, cid_list, c_BtsId_LAC1);
Harald Welte6f521d82017-12-11 19:52:02 +01001119}
1120
1121/* Paging by "all in BSS" */
1122testcase TC_paging_imsi_nochan_all() runs on test_CT {
1123 var template BSSMAP_FIELD_CellIdentificationList cid_list;
1124 cid_list := { cIl_allInBSS := ''O };
Harald Welte5d1a2202017-12-13 19:51:29 +01001125 f_pageing_helper('001010000000011'H, cid_list, c_BtsId_all);
Harald Welte6f521d82017-12-11 19:52:02 +01001126}
1127
1128/* Paging by PLMN+LAC+RNC */
1129/* Paging by RNC */
1130/* Paging by LAC+RNC */
1131
1132/* Paging on multiple cells (multiple in one LAC): Verify all of them page */
1133/* Paging on multiple cells (multiple entries in list): Verify all of them page */
1134/* Verify paging retransmission interval + count */
1135/* Verify paging stops after channel establishment */
Harald Welte6f521d82017-12-11 19:52:02 +01001136/* Test behavior under paging overload */
Harald Welteae026692017-12-09 01:03:01 +01001137
Harald Weltee65d40e2017-12-13 00:09:06 +01001138/* Verify PCH load */
1139testcase TC_paging_imsi_load() runs on test_CT {
1140 var BSSMAP_FIELD_CellIdentificationList cid_list;
1141 timer T := 4.0;
1142 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001143 f_pageing_helper('001010123456789'H, cid_list, c_BtsId_all);
Harald Weltee65d40e2017-12-13 00:09:06 +01001144
1145 /* tell BSC there is no paging space anymore */
1146 f_ipa_tx(0, ts_RSL_PAGING_LOAD_IND(0));
1147
1148 /* Wait for 4 seconds if any more PAGING CMD are received on RSL. Normally,
1149 * there would be 8 retransmissions during 4 seconds */
1150 T.start;
1151 alt {
1152 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(?))) {
1153 setverdict(fail, "Received PAGING after LOAD_IND(0)");
1154 self.stop;
1155 }
1156 [] T.timeout {
1157 setverdict(pass);
1158 }
1159 }
1160}
1161
Harald Welte235ebf12017-12-15 14:18:16 +01001162/* Verify Paging Counter */
Harald Welte1ff69992017-12-14 12:31:17 +01001163testcase TC_paging_counter() runs on test_CT {
1164 var BSSMAP_FIELD_CellIdentificationList cid_list;
1165 timer T := 4.0;
1166 var integer i;
1167 var integer paging_attempted_bsc;
1168 var integer paging_attempted_bts[NUM_BTS];
1169 var integer paging_expired_bts[NUM_BTS];
1170 cid_list := valueof(ts_BSSMAP_CIL_noCell);
1171
1172 f_init();
1173
1174 /* read counters before paging */
1175 paging_attempted_bsc := f_ctrl_get_ratectr_abs(IPA_CTRL, "bsc", 0, "paging:attempted");
1176 for (i := 0; i < NUM_BTS; i := i+1) {
1177 paging_attempted_bts[i] := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", i, "paging:attempted");
1178 paging_expired_bts[i] := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", i, "paging:expired");
1179 }
1180
1181 f_pageing_helper('001230000000001'H, cid_list, c_BtsId_all);
1182
1183 /* expect the attempted pages on BSC and each BTSs to have incremented by one */
1184 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bsc", 0, "paging:attempted", paging_attempted_bsc+1);
1185 for (i := 0; i < NUM_BTS; i := i+1) {
1186 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", i, "paging:attempted",
1187 paging_attempted_bts[i]+1);
1188 }
1189
1190 /* assume that 12s later the paging on all BTSs have expired and hence incremented by 1 */
1191 f_sleep(12.0);
1192 for (i := 0; i < NUM_BTS; i := i+1) {
1193 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", i, "paging:expired",
1194 paging_expired_bts[i]+1);
1195 }
1196 setverdict(pass);
1197
1198}
1199
1200
Harald Welte10985002017-12-12 09:29:15 +01001201/* Verify paging stops after A-RESET */
1202testcase TC_paging_imsi_a_reset() runs on test_CT {
1203 var BSSMAP_FIELD_CellIdentificationList cid_list;
1204 timer T := 3.0;
1205 cid_list := valueof(ts_BSSMAP_CIL_noCell);
Harald Welte5d1a2202017-12-13 19:51:29 +01001206 f_pageing_helper('001010123456789'H, cid_list, c_BtsId_all);
Harald Welte10985002017-12-12 09:29:15 +01001207
1208 /* Perform a BSSMAP Reset and wait for ACK */
1209 BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, ts_BSSMAP_Reset(0)));
1210 alt {
1211 [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_sccp_addr_own, g_sccp_addr_peer, tr_BSSMAP_ResetAck)) { }
1212 [] BSSAP.receive { repeat; }
1213 }
1214
1215 /* Clear the queue, it might still contain stuff like BCCH FILLING */
1216 IPA_RSL[0].clear;
1217
1218 /* Wait for 3 seconds if any more PAGING CMD are received on RSL */
1219 T.start;
1220 alt {
1221 [] IPA_RSL[0].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(?))) {
1222 setverdict(fail, "Received PAGING after A-RESET");
1223 self.stop;
1224 }
Harald Welte5d1a2202017-12-13 19:51:29 +01001225 [] IPA_RSL[1].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(?))) {
1226 setverdict(fail, "Received PAGING after A-RESET");
1227 self.stop;
1228 }
1229 [] IPA_RSL[2].receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, tr_RSL_PAGING_CMD(?))) {
1230 setverdict(fail, "Received PAGING after A-RESET");
1231 self.stop;
1232 }
Harald Welte10985002017-12-12 09:29:15 +01001233 [] T.timeout {
1234 setverdict(pass);
1235 }
1236 }
1237}
Harald Welteae026692017-12-09 01:03:01 +01001238
Harald Welte4e9b9cc2017-12-14 18:31:02 +01001239/* Test RSL link drop causes counter increment */
1240testcase TC_rsl_drop_counter() runs on test_CT {
1241 var integer rsl_fail;
1242
1243 f_init();
1244 f_bssap_reset();
1245
1246 rsl_fail := f_ctrl_get_ratectr_abs(IPA_CTRL, "bts", 0, "rsl_fail");
1247
1248 bts[0].rsl.vc_IPA.stop;
1249
1250 f_ctrl_get_exp_ratectr_abs(IPA_CTRL, "bts", 0, "rsl_fail", rsl_fail+1);
1251
1252 setverdict(pass);
1253}
1254
1255/* TODO: Test OML link drop causes counter increment */
1256
Harald Welte28d943e2017-11-25 15:00:50 +01001257control {
Harald Welte4003d112017-12-09 22:35:39 +01001258 execute( TC_ctrl_msc_connection_status() );
Harald Welte96c94412017-12-09 03:12:45 +01001259 execute( TC_ctrl() );
Harald Welteae026692017-12-09 01:03:01 +01001260 execute( TC_chan_act_noreply() );
Harald Welte4003d112017-12-09 22:35:39 +01001261 execute( TC_chan_act_counter() );
Harald Welteae026692017-12-09 01:03:01 +01001262 execute( TC_chan_act_ack_noest() );
1263 execute( TC_chan_act_ack_est_ind_noreply() );
1264 execute( TC_chan_act_ack_est_ind_refused() );
Harald Welte618ef642017-12-14 14:58:20 +01001265 execute( TC_chan_act_nack() );
Harald Welte799c97b2017-12-14 17:50:30 +01001266 execute( TC_chan_exhaustion() );
Harald Welte4003d112017-12-09 22:35:39 +01001267 execute( TC_chan_rel_rll_rel_ind() );
1268 execute( TC_chan_rel_conn_fail() );
1269 execute( TC_chan_rel_hard_clear() );
Harald Welted8c36cd2017-12-09 23:05:31 +01001270 execute( TC_chan_rel_hard_rlsd() );
Harald Welte85804d42017-12-10 14:11:58 +01001271 execute( TC_chan_rel_a_reset() );
Harald Welte6f521d82017-12-11 19:52:02 +01001272
Harald Weltecfe2c962017-12-15 12:09:32 +01001273 execute( TC_outbound_connect() );
Harald Welte16a4adf2017-12-14 18:54:01 +01001274 execute( TC_assignment_cic_only() );
Harald Welte235ebf12017-12-15 14:18:16 +01001275 execute( TC_assignment_csd() );
1276 execute( TC_assignment_ctm() );
1277 execute( TC_assignment_sign() );
1278 execute( TC_assignment_fr_a5_0() );
1279 execute( TC_assignment_fr_a5_1() );
Harald Weltef1b64e22017-12-15 14:55:14 +01001280 execute( TC_assignment_fr_a5_1_codec_missing() );
Harald Welte235ebf12017-12-15 14:18:16 +01001281 execute( TC_assignment_fr_a5_3() );
1282 execute( TC_assignment_fr_a5_4() );
Harald Welte16a4adf2017-12-14 18:54:01 +01001283
Harald Welte5cd20ed2017-12-13 21:03:20 +01001284 execute( TC_rll_est_ind_inact_lchan() );
1285 execute( TC_rll_est_ind_inval_sapi1() );
1286 execute( TC_rll_est_ind_inval_sapi3() );
1287 execute( TC_rll_est_ind_inval_sacch() );
1288
Harald Welte6f521d82017-12-11 19:52:02 +01001289 execute( TC_paging_imsi_nochan() );
1290 execute( TC_paging_tmsi_nochan() );
1291 execute( TC_paging_tmsi_any() );
1292 execute( TC_paging_tmsi_sdcch() );
1293 execute( TC_paging_tmsi_tch_f() );
1294 execute( TC_paging_tmsi_tch_hf() );
1295 execute( TC_paging_imsi_nochan_cgi() );
1296 execute( TC_paging_imsi_nochan_lac_ci() );
1297 execute( TC_paging_imsi_nochan_ci() );
1298 execute( TC_paging_imsi_nochan_lai() );
1299 execute( TC_paging_imsi_nochan_lac() );
1300 execute( TC_paging_imsi_nochan_all() );
Harald Welte10985002017-12-12 09:29:15 +01001301 execute( TC_paging_imsi_a_reset() );
Harald Weltee65d40e2017-12-13 00:09:06 +01001302 execute( TC_paging_imsi_load() );
Harald Welte4e9b9cc2017-12-14 18:31:02 +01001303
1304 execute( TC_rsl_drop_counter() );
Harald Welte28d943e2017-11-25 15:00:50 +01001305}
1306
1307}