blob: 976cf0d6d6bdb2e78452b6cbce2c8f30f9968dc9 [file] [log] [blame]
Harald Weltef6dd64d2017-11-19 12:09:51 +01001module MSC_Tests {
2
3import from General_Types all;
4import from Osmocom_Types all;
5
6import from M3UA_Types all;
7import from M3UA_Emulation all;
8
9import from MTP3asp_Types all;
10import from MTP3asp_PortType all;
11
12import from SCCPasp_Types all;
13import from SCCP_Types all;
14import from SCCP_Emulation all;
15
16import from SCTPasp_Types all;
17import from SCTPasp_PortType all;
18
Harald Weltea49e36e2018-01-21 19:29:33 +010019import from Osmocom_CTRL_Functions all;
20import from Osmocom_CTRL_Types all;
21import from Osmocom_CTRL_Adapter all;
22
Harald Welte3ca1c902018-01-24 18:51:27 +010023import from TELNETasp_PortType all;
24import from Osmocom_VTY_Functions all;
25
Harald Weltea49e36e2018-01-21 19:29:33 +010026import from MNCC_Emulation all;
Harald Welte2bb825f2018-01-22 11:31:18 +010027import from MNCC_Types all;
Harald Weltea49e36e2018-01-21 19:29:33 +010028
Harald Welte4aa970c2018-01-26 10:38:09 +010029import from MGCP_Emulation all;
30import from MGCP_Types all;
31import from MGCP_Templates all;
32import from SDP_Types all;
33
Harald Weltea49e36e2018-01-21 19:29:33 +010034import from GSUP_Emulation all;
35import from GSUP_Types all;
36import from IPA_Emulation all;
37
Harald Weltef6dd64d2017-11-19 12:09:51 +010038import from BSSAP_Types all;
Harald Weltea49e36e2018-01-21 19:29:33 +010039import from BSSAP_Adapter all;
40import from BSSAP_CodecPort all;
41import from BSSMAP_Templates all;
42import from BSSMAP_Emulation all;
43import from BSC_ConnectionHandler all;
Harald Weltef6dd64d2017-11-19 12:09:51 +010044
Harald Weltea49e36e2018-01-21 19:29:33 +010045import from MobileL3_Types all;
46import from MobileL3_CommonIE_Types all;
47import from L3_Templates all;
Harald Welte158a7ca2018-02-16 18:11:31 +010048import from L3_Common all;
Harald Weltef6dd64d2017-11-19 12:09:51 +010049
Harald Weltef6dd64d2017-11-19 12:09:51 +010050
Harald Weltea4ca4462018-02-09 00:17:14 +010051type component MTC_CT extends CTRL_Adapter_CT {
Harald Weltef6dd64d2017-11-19 12:09:51 +010052 var boolean g_initialized := false;
Harald Weltea49e36e2018-01-21 19:29:33 +010053
Harald Weltea4ca4462018-02-09 00:17:14 +010054 var BSSAP_Adapter g_bssap;
55
Harald Weltea49e36e2018-01-21 19:29:33 +010056 /* no 'adapter_CT' for MNCC or GSUP */
57 var MNCC_Emulation_CT vc_MNCC;
Harald Welte4aa970c2018-01-26 10:38:09 +010058 var MGCP_Emulation_CT vc_MGCP;
Harald Weltea49e36e2018-01-21 19:29:33 +010059 var GSUP_Emulation_CT vc_GSUP;
60 var IPA_Emulation_CT vc_GSUP_IPA;
61
62 /* only to get events from IPA underneath GSUP */
63 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte3ca1c902018-01-24 18:51:27 +010064 /* VTY to MSC */
65 port TELNETasp_PT MSCVTY;
Harald Weltef6dd64d2017-11-19 12:09:51 +010066}
67
68modulepar {
Harald Weltea49e36e2018-01-21 19:29:33 +010069 /* remote parameters of IUT */
70 charstring mp_msc_ip := "127.0.0.1";
71 integer mp_msc_ctrl_port := 4255;
72 integer mp_msc_vty_port := 4254;
Harald Weltef6dd64d2017-11-19 12:09:51 +010073
Harald Weltea49e36e2018-01-21 19:29:33 +010074 /* local parameters of emulated HLR */
75 charstring mp_hlr_ip := "127.0.0.1";
76 integer mp_hlr_port := 4222;
Harald Welte6126fb02018-01-27 20:08:24 +010077 charstring mp_mgw_ip := "127.0.0.1";
78 integer mp_mgw_port := 2427;
Harald Weltef6dd64d2017-11-19 12:09:51 +010079
Harald Weltea49e36e2018-01-21 19:29:33 +010080 charstring mp_msc_mncc := "/tmp/mncc";
Harald Weltea4ca4462018-02-09 00:17:14 +010081
82 BSSAP_Configuration mp_bssap_cfg := {
83 sccp_service_type := "mtp3_itu",
84 sctp_addr := { 23905, "127.0.0.1", 2905, "127.0.0.1" },
85 own_pc := 185,
86 own_ssn := 254,
87 peer_pc := 187,
88 peer_ssn := 254
89 };
Harald Weltef6dd64d2017-11-19 12:09:51 +010090}
91
92
Harald Weltea49e36e2018-01-21 19:29:33 +010093function f_init_mncc(charstring id) runs on MTC_CT {
94 id := id & "-MNCC";
95 var MnccOps ops := {
96 create_cb := refers(MNCC_Emulation.ExpectedCreateCallback),
97 unitdata_cb := refers(MNCC_Emulation.DummyUnitdataCallback)
98 }
99
100 vc_MNCC := MNCC_Emulation_CT.create(id);
101 map(vc_MNCC:MNCC, system:MNCC_CODEC_PT);
102 vc_MNCC.start(MNCC_Emulation.main(ops, id, mp_msc_mncc));
Harald Weltef6dd64d2017-11-19 12:09:51 +0100103}
104
Harald Welte4aa970c2018-01-26 10:38:09 +0100105function f_init_mgcp(charstring id) runs on MTC_CT {
106 id := id & "-MGCP";
107 var MGCPOps ops := {
108 create_cb := refers(MGCP_Emulation.ExpectedCreateCallback),
109 unitdata_cb := refers(MGCP_Emulation.DummyUnitdataCallback)
110 }
111 var MGCP_conn_parameters pars := {
Harald Welte6126fb02018-01-27 20:08:24 +0100112 callagent_ip := mp_msc_ip,
Harald Welte4aa970c2018-01-26 10:38:09 +0100113 callagent_udp_port := -1,
Harald Welte6126fb02018-01-27 20:08:24 +0100114 mgw_ip := mp_mgw_ip,
115 mgw_udp_port := mp_mgw_port
Harald Welte4aa970c2018-01-26 10:38:09 +0100116 }
117
118 vc_MGCP := MGCP_Emulation_CT.create(id);
119 map(vc_MGCP:MGCP, system:MGCP_CODEC_PT);
120 vc_MGCP.start(MGCP_Emulation.main(ops, pars, id));
121}
122
Harald Weltea49e36e2018-01-21 19:29:33 +0100123function f_init_gsup(charstring id) runs on MTC_CT {
124 id := id & "-GSUP";
125 var GsupOps ops := {
126 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
127 }
128
129 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
130 vc_GSUP := GSUP_Emulation_CT.create(id);
131
132 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
133 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
134 /* we use this hack to get events like ASP_IPA_EVENT_UP */
135 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
136
137 vc_GSUP.start(GSUP_Emulation.main(ops, id));
138 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
139
140 /* wait for incoming connection to GSUP port before proceeding */
141 timer T := 10.0;
142 T.start;
143 alt {
144 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
145 [] T.timeout {
146 setverdict(inconc, "No connection to GSUP Port");
147 self.stop
148 }
149 }
Harald Weltef6dd64d2017-11-19 12:09:51 +0100150}
151
Harald Weltea49e36e2018-01-21 19:29:33 +0100152function f_init() runs on MTC_CT {
Harald Weltef6dd64d2017-11-19 12:09:51 +0100153
154 if (g_initialized == true) {
155 return;
156 }
157 g_initialized := true;
158
Harald Weltea4ca4462018-02-09 00:17:14 +0100159 f_bssap_init(g_bssap, mp_bssap_cfg, "MSC_Test", BSC_BssmapOps);
Harald Weltea49e36e2018-01-21 19:29:33 +0100160 f_ipa_ctrl_start(mp_msc_ip, mp_msc_ctrl_port);
161 f_init_mncc("MSC_Test");
Harald Welte4aa970c2018-01-26 10:38:09 +0100162 f_init_mgcp("MSC_Test");
Harald Weltea49e36e2018-01-21 19:29:33 +0100163 f_init_gsup("MSC_Test");
Harald Welte3ca1c902018-01-24 18:51:27 +0100164
165 map(self:MSCVTY, system:MSCVTY);
166 f_vty_set_prompts(MSCVTY);
167 f_vty_transceive(MSCVTY, "enable");
Harald Welteb14c77a2018-01-25 17:25:44 +0100168
169 /* set some defaults */
170 f_vty_config(MSCVTY, "network", "authentication optional");
171 f_vty_config(MSCVTY, "msc", "assign-tmsi");
172 f_vty_config(MSCVTY, "network", "encryption a5 0");
Harald Weltef6dd64d2017-11-19 12:09:51 +0100173}
174
175template PDU_BSSAP ts_BSSAP_BSSMAP := {
176 discriminator := '0'B,
177 spare := '0000000'B,
178 dlci := omit,
179 lengthIndicator := 0, /* overwritten by codec */
180 pdu := ?
181}
182
183template PDU_BSSAP tr_BSSAP_BSSMAP := {
184 discriminator := '0'B,
185 spare := '0000000'B,
186 dlci := omit,
187 lengthIndicator := ?,
188 pdu := {
189 bssmap := ?
190 }
191}
192
193
194type integer BssmapCause;
195
196template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
197 elementIdentifier := '04'O,
198 lengthIndicator := 0,
199 causeValue := int2bit(val, 7),
200 extensionCauseValue := '0'B,
201 spare1 := omit
202}
203
204template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {
205 pdu := {
206 bssmap := {
207 reset := {
208 messageType := '30'O,
209 cause := ts_BSSMAP_IE_Cause(cause),
210 a_InterfaceSelectorForReset := omit
211 }
212 }
213 }
214}
215
216template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {
217 pdu := {
218 bssmap := {
219 resetAck := {
220 messageType := '31'O,
221 a_InterfaceSelectorForReset := omit
222 }
223 }
224 }
225}
226
227template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {
228 pdu := {
229 bssmap := {
230 resetAck := {
231 messageType := '31'O,
232 a_InterfaceSelectorForReset := *
233 }
234 }
235 }
236}
237
238template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
239 elementIdentifier := '05'O,
240 lengthIndicator := 0,
241 cellIdentifierDiscriminator := '0000'B,
242 spare1_4 := '0000'B,
243 cellIdentification := ?
244}
245
246type uint16_t BssmapLAC;
247type uint16_t BssmapCI;
248
249/*
250template BSSMAP_IE_CellIdentifier ts_CellId_CGI(mcc, mnc, lac, ci)
251modifies ts_BSSMAP_IE_CellID := {
252 cellIdentification := {
253 cI_LAC_CGI := {
254 mnc_mcc := FIXME,
255 lac := int2oct(lac, 2),
256 ci := int2oct(ci, 2)
257 }
258 }
259}
260*/
261
262template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
263modifies ts_BSSMAP_IE_CellID := {
264 cellIdentification := {
265 cI_LAC_CI := {
266 lac := int2oct(lac, 2),
267 ci := int2oct(ci, 2)
268 }
269 }
270}
271
272template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
273modifies ts_BSSMAP_IE_CellID := {
274 cellIdentification := {
275 cI_CI := int2oct(ci, 2)
276 }
277}
278
279template BSSMAP_IE_CellIdentifier ts_CellId_none
280modifies ts_BSSMAP_IE_CellID := {
281 cellIdentification := {
282 cI_noCell := ''O
283 }
284}
285
286
287template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
288 elementIdentifier := '17'O,
289 lengthIndicator := 0,
290 layer3info := l3info
291}
292
293template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
294modifies ts_BSSAP_BSSMAP := {
295 pdu := {
296 bssmap := {
297 completeLayer3Information := {
298 messageType := '57'O,
299 cellIdentifier := cell_id,
300 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
301 chosenChannel := omit,
302 lSAIdentifier := omit,
303 aPDU := omit,
304 codecList := omit,
305 redirectAttemptFlag := omit,
306 sendSequenceNumber := omit,
307 iMSI := omit
308 }
309 }
310 }
311}
312
313template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_IE_CellIdentifierList cid_list)
314modifies ts_BSSAP_BSSMAP := {
315 pdu := {
316 bssmap := {
317 handoverRequired := {
318 messageType := '11'O,
319 cause := ts_BSSMAP_IE_Cause(cause),
320 responseRequest := omit,
321 cellIdentifierList := cid_list,
322 circuitPoolList := omit,
323 currentChannelType1 := omit,
324 speechVersion := omit,
325 queueingIndicator := omit,
326 oldToNewBSSInfo := omit,
327 sourceToTargetRNCTransparentInfo := omit,
328 sourceToTargetRNCTransparentInfoCDMA := omit,
329 gERANClassmark := omit,
330 talkerPriority := omit,
331 speechCodec := omit,
332 cSG_Identifier := omit
333 }
334 }
335 }
336}
337
Harald Weltea49e36e2018-01-21 19:29:33 +0100338type function void_fn(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr;
Harald Weltef6dd64d2017-11-19 12:09:51 +0100339
Harald Weltea49e36e2018-01-21 19:29:33 +0100340/* FIXME: move into BSC_ConnectionHandler? */
Neels Hofmeyr9adaa702018-03-01 20:23:19 +0100341function f_init_pars(integer imsi_suffix) runs on MTC_CT return BSC_ConnHdlrPars {
Harald Weltede371492018-01-27 23:44:41 +0100342 var BSC_ConnHdlrNetworkPars net_pars := {
343 kc_support := '0A'O, /* A5/1 and A5/3 enabled */
344 expect_tmsi := true,
345 expect_auth := false,
346 expect_ciph := false
347 };
Harald Weltea49e36e2018-01-21 19:29:33 +0100348 var BSC_ConnHdlrPars pars := {
Harald Weltea4ca4462018-02-09 00:17:14 +0100349 sccp_addr_own := g_bssap.sccp_addr_own,
350 sccp_addr_peer := g_bssap.sccp_addr_peer,
Harald Weltea49e36e2018-01-21 19:29:33 +0100351 cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42)),
Harald Welte81b7f9d2018-01-24 19:06:24 +0100352 imei := f_gen_imei(imsi_suffix),
353 imsi := f_gen_imsi(imsi_suffix),
354 msisdn := f_gen_msisdn(imsi_suffix),
Harald Welte256571e2018-01-24 18:47:19 +0100355 tmsi := omit,
Harald Welte9de84792018-01-28 01:06:35 +0100356 cm1 := valueof(ts_CM1),
Harald Welte82600572018-01-21 20:54:08 +0100357 cm2 := valueof(ts_CM2_default),
Harald Welte16114282018-01-24 22:41:21 +0100358 cm3 := omit,
Harald Weltede371492018-01-27 23:44:41 +0100359 vec := omit,
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100360 net := net_pars,
361 send_early_cm := true
Harald Weltea49e36e2018-01-21 19:29:33 +0100362 };
Neels Hofmeyr9adaa702018-03-01 20:23:19 +0100363 return pars;
364}
365
366function f_start_handler_with_pars(void_fn fn, BSC_ConnHdlrPars pars) runs on MTC_CT return BSC_ConnHdlr {
367 var BSC_ConnHdlr vc_conn;
368 var charstring id := testcasename();
Harald Weltea49e36e2018-01-21 19:29:33 +0100369
370 vc_conn := BSC_ConnHdlr.create(id);
371 /* BSSMAP part / A interface */
Harald Weltea4ca4462018-02-09 00:17:14 +0100372 connect(vc_conn:BSSAP, g_bssap.vc_BSSMAP:CLIENT);
373 connect(vc_conn:BSSAP_PROC, g_bssap.vc_BSSMAP:PROC);
Harald Weltea49e36e2018-01-21 19:29:33 +0100374 /* MNCC part */
375 connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);
376 connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);
Harald Welte4aa970c2018-01-26 10:38:09 +0100377 /* MGCP part */
378 connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);
379 connect(vc_conn:MGCP_PROC, vc_MGCP:MGCP_PROC);
Harald Weltea49e36e2018-01-21 19:29:33 +0100380 /* GSUP part */
381 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
382 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
383
Harald Weltea10db902018-01-27 12:44:49 +0100384 /* We cannot use vc_conn.start(f_init_handler(fn, id, pars)); as we cannot have
385 * a stand-alone 'derefers()' call, see https://www.eclipse.org/forums/index.php/t/1091364/ */
Harald Weltea49e36e2018-01-21 19:29:33 +0100386 vc_conn.start(derefers(fn)(id, pars));
387 return vc_conn;
388}
389
Neels Hofmeyr9adaa702018-03-01 20:23:19 +0100390function f_start_handler(void_fn fn, integer imsi_suffix) runs on MTC_CT return BSC_ConnHdlr {
391 return f_start_handler_with_pars(fn, f_init_pars(imsi_suffix));
392}
393
Harald Weltea49e36e2018-01-21 19:29:33 +0100394private function f_tc_lu_imsi_noauth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100395 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100396 f_perform_lu();
Harald Weltea49e36e2018-01-21 19:29:33 +0100397}
Harald Weltea49e36e2018-01-21 19:29:33 +0100398testcase TC_lu_imsi_noauth_tmsi() runs on MTC_CT {
399 var BSC_ConnHdlr vc_conn;
400 f_init();
401
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100402 vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_tmsi), 1);
Harald Weltea49e36e2018-01-21 19:29:33 +0100403 vc_conn.done;
404}
405
406private function f_tc_lu_imsi_noauth_notmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltede371492018-01-27 23:44:41 +0100407 pars.net.expect_tmsi := false;
Harald Weltea10db902018-01-27 12:44:49 +0100408 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100409 f_perform_lu();
Harald Weltea49e36e2018-01-21 19:29:33 +0100410}
Harald Weltea49e36e2018-01-21 19:29:33 +0100411testcase TC_lu_imsi_noauth_notmsi() runs on MTC_CT {
412 var BSC_ConnHdlr vc_conn;
413 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100414 f_vty_config(MSCVTY, "msc", "no assign-tmsi");
Harald Weltea49e36e2018-01-21 19:29:33 +0100415
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100416 vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_notmsi), 2);
Harald Weltea49e36e2018-01-21 19:29:33 +0100417 vc_conn.done;
418}
419
420/* Do LU by IMSI, refuse it on GSUP and expect LU REJ back to MS */
421private function f_tc_lu_imsi_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100422 f_init_handler(pars);
Harald Weltea49e36e2018-01-21 19:29:33 +0100423 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
424
425 f_create_gsup_expect(hex2str(g_pars.imsi));
426 f_bssap_compl_l3(l3_lu);
427 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
428 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 23));
429 alt {
430 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej(int2oct(23,1)))) { }
431 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
432 setverdict(fail, "Expecting LU REJ, but got ACCEPT");
433 self.stop;
434 }
435 }
Harald Welte1ddc7162018-01-27 14:25:46 +0100436 f_expect_clear();
Harald Weltea49e36e2018-01-21 19:29:33 +0100437}
438testcase TC_lu_imsi_reject() runs on MTC_CT {
439 var BSC_ConnHdlr vc_conn;
440 f_init();
441
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100442 vc_conn := f_start_handler(refers(f_tc_lu_imsi_reject), 3);
Harald Weltea49e36e2018-01-21 19:29:33 +0100443 vc_conn.done;
444}
445
446/* Do LU by IMSI, timeout on GSUP */
447private function f_tc_lu_imsi_timeout_gsup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100448 f_init_handler(pars);
Harald Weltea49e36e2018-01-21 19:29:33 +0100449 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
450
451 f_create_gsup_expect(hex2str(g_pars.imsi));
452 f_bssap_compl_l3(l3_lu);
453 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
454 /* Normally the HLR would need to respond here, but we decide to force a timeout here */
455 alt {
456 /* FIXME: Expect specific reject cause */
457 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
458 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
459 setverdict(fail, "Expecting LU REJ, but got ACCEPT");
460 self.stop;
461 }
462 }
Harald Welte1ddc7162018-01-27 14:25:46 +0100463 f_expect_clear();
Harald Weltea49e36e2018-01-21 19:29:33 +0100464}
465testcase TC_lu_imsi_timeout_gsup() runs on MTC_CT {
466 var BSC_ConnHdlr vc_conn;
467 f_init();
468
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100469 vc_conn := f_start_handler(refers(f_tc_lu_imsi_timeout_gsup), 4);
Harald Weltea49e36e2018-01-21 19:29:33 +0100470 vc_conn.done;
471}
472
Harald Welte7b1b2812018-01-22 21:23:06 +0100473private function f_tc_lu_imsi_auth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltede371492018-01-27 23:44:41 +0100474 pars.net.expect_auth := true;
Harald Weltea10db902018-01-27 12:44:49 +0100475 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100476 f_perform_lu();
Harald Welte7b1b2812018-01-22 21:23:06 +0100477}
478testcase TC_lu_imsi_auth_tmsi() runs on MTC_CT {
479 var BSC_ConnHdlr vc_conn;
480 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100481 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte7b1b2812018-01-22 21:23:06 +0100482
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100483 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi), 5);
Harald Welte7b1b2812018-01-22 21:23:06 +0100484 vc_conn.done;
485}
486
Harald Weltea49e36e2018-01-21 19:29:33 +0100487
488/* Send CM SERVICE REQ for IMSI that has never performed LU before */
489private function f_tc_cmserv_imsi_unknown(charstring id, BSC_ConnHdlrPars pars)
490runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100491 f_init_handler(pars);
Harald Weltea49e36e2018-01-21 19:29:33 +0100492
493 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
494 var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100495 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, mi));
Harald Weltea49e36e2018-01-21 19:29:33 +0100496
497 f_create_gsup_expect(hex2str(g_pars.imsi));
498
499 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
500 f_bssap_compl_l3(l3_info);
501
502 timer T := 10.0;
Harald Weltef6dd64d2017-11-19 12:09:51 +0100503 T.start;
504 alt {
Harald Weltea49e36e2018-01-21 19:29:33 +0100505 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ)) { }
506 //[] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC)) { }
507 [] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
508 [] GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
509 setverdict(fail, "Unexpected GSUP UL REQ");
510 }
Daniel Willmann90829d62018-02-15 17:45:14 +0100511 [] T.timeout { setverdict(fail, "Timeout waiting for CM SERV REQ"); }
Harald Weltef6dd64d2017-11-19 12:09:51 +0100512 }
513
Harald Welte1ddc7162018-01-27 14:25:46 +0100514 f_expect_clear();
Harald Weltef6dd64d2017-11-19 12:09:51 +0100515}
Harald Weltea49e36e2018-01-21 19:29:33 +0100516testcase TC_cmserv_imsi_unknown() runs on MTC_CT {
517 var BSC_ConnHdlr vc_conn;
518 f_init();
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100519 vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), 6);
Harald Weltea49e36e2018-01-21 19:29:33 +0100520 vc_conn.done;
521}
522
Harald Welte2bb825f2018-01-22 11:31:18 +0100523private function f_tc_lu_and_mo_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100524 f_init_handler(pars);
Harald Welteb71901a2018-01-26 19:16:05 +0100525 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
526 cpars.bss_rtp_port := 1110;
527 cpars.mgcp_connection_id_bss := '22222'H;
528 cpars.mgcp_connection_id_mss := '33333'H;
Harald Welte2bb825f2018-01-22 11:31:18 +0100529
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100530 f_perform_lu();
Harald Welteb71901a2018-01-26 19:16:05 +0100531 f_mo_call(cpars);
Harald Welte2bb825f2018-01-22 11:31:18 +0100532}
533testcase TC_lu_and_mo_call() runs on MTC_CT {
534 var BSC_ConnHdlr vc_conn;
535 f_init();
536
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100537 vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), 7);
Harald Welte071ed732018-01-23 19:53:52 +0100538 vc_conn.done;
539}
540
541/* Test LU (with authentication enabled), where HLR times out sending SAI response */
542private function f_tc_lu_auth_sai_timeout(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100543 f_init_handler(pars);
Harald Welte071ed732018-01-23 19:53:52 +0100544
545 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
546 var PDU_DTAP_MT dtap_mt;
547
548 /* tell GSUP dispatcher to send this IMSI to us */
549 f_create_gsup_expect(hex2str(g_pars.imsi));
550
551 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
552 f_bssap_compl_l3(l3_lu);
553
554 /* Send Early Classmark, just for the fun of it */
555 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
556
557 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
558 /* The HLR would normally return an auth vector here, but we fail to do so. */
559
560 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej));
Harald Welte1ddc7162018-01-27 14:25:46 +0100561 f_expect_clear();
Harald Welte071ed732018-01-23 19:53:52 +0100562}
563testcase TC_lu_auth_sai_timeout() runs on MTC_CT {
564 var BSC_ConnHdlr vc_conn;
565 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100566 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte071ed732018-01-23 19:53:52 +0100567
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100568 vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_timeout), 8);
Harald Welte071ed732018-01-23 19:53:52 +0100569 vc_conn.done;
570}
571
572/* Test LU (with authentication enabled), where HLR rejects sending SAI error */
573private function f_tc_lu_auth_sai_err(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100574 f_init_handler(pars);
Harald Welte071ed732018-01-23 19:53:52 +0100575
576 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
577 var PDU_DTAP_MT dtap_mt;
578
579 /* tell GSUP dispatcher to send this IMSI to us */
580 f_create_gsup_expect(hex2str(g_pars.imsi));
581
582 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
583 f_bssap_compl_l3(l3_lu);
584
585 /* Send Early Classmark, just for the fun of it */
586 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
587
588 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
589 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 13));
590
591 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej));
Harald Welte1ddc7162018-01-27 14:25:46 +0100592 f_expect_clear();
Harald Welte071ed732018-01-23 19:53:52 +0100593}
594testcase TC_lu_auth_sai_err() runs on MTC_CT {
595 var BSC_ConnHdlr vc_conn;
596 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100597 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte071ed732018-01-23 19:53:52 +0100598
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100599 vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_err), 9);
Harald Welte2bb825f2018-01-22 11:31:18 +0100600 vc_conn.done;
601}
Harald Weltea49e36e2018-01-21 19:29:33 +0100602
Harald Weltebc881782018-01-23 20:09:15 +0100603/* Test LU but BSC will send a clear request in the middle */
604private function f_tc_lu_clear_request(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100605 f_init_handler(pars);
Harald Weltebc881782018-01-23 20:09:15 +0100606
607 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
608 var PDU_DTAP_MT dtap_mt;
609
610 /* tell GSUP dispatcher to send this IMSI to us */
611 f_create_gsup_expect(hex2str(g_pars.imsi));
612
613 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
614 f_bssap_compl_l3(l3_lu);
615
616 /* Send Early Classmark, just for the fun of it */
617 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
618
619 f_sleep(1.0);
620 /* send clear request in the middle of the LU */
621 BSSAP.send(ts_BSSMAP_ClearRequest(0));
622 BSSAP.receive(tr_BSSMAP_ClearCommand);
623 BSSAP.send(ts_BSSMAP_ClearComplete);
Harald Welte89a32492018-01-27 19:07:28 +0100624 alt {
625 /* See https://osmocom.org/issues/2862 */
626 [] BSSAP.receive(tr_BSSMAP_ClearCommand) { repeat; }
627 [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
628 }
Harald Weltebc881782018-01-23 20:09:15 +0100629 setverdict(pass);
630}
631testcase TC_lu_clear_request() runs on MTC_CT {
632 var BSC_ConnHdlr vc_conn;
633 f_init();
634
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100635 vc_conn := f_start_handler(refers(f_tc_lu_clear_request), 10);
Harald Weltebc881782018-01-23 20:09:15 +0100636 vc_conn.done;
637}
638
Harald Welte66af9e62018-01-24 17:28:21 +0100639/* Test LU but BSC will send a clear request in the middle */
640private function f_tc_lu_disconnect(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100641 f_init_handler(pars);
Harald Welte66af9e62018-01-24 17:28:21 +0100642
643 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
644 var PDU_DTAP_MT dtap_mt;
645
646 /* tell GSUP dispatcher to send this IMSI to us */
647 f_create_gsup_expect(hex2str(g_pars.imsi));
648
649 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
650 f_bssap_compl_l3(l3_lu);
651
652 /* Send Early Classmark, just for the fun of it */
653 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
654
655 f_sleep(1.0);
656 /* send clear request in the middle of the LU */
657 BSSAP.send(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
658 setverdict(pass);
659}
660testcase TC_lu_disconnect() runs on MTC_CT {
661 var BSC_ConnHdlr vc_conn;
662 f_init();
663
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100664 vc_conn := f_start_handler(refers(f_tc_lu_disconnect), 11);
Harald Welte66af9e62018-01-24 17:28:21 +0100665 vc_conn.done;
666}
667
668
Harald Welteba7b6d92018-01-23 21:32:34 +0100669/* Test LU but with illegal mobile identity type = IMEI */
670private function f_tc_lu_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100671 f_init_handler(pars);
Harald Welteba7b6d92018-01-23 21:32:34 +0100672
Harald Welte256571e2018-01-24 18:47:19 +0100673 var PDU_ML3_MS_NW l3_lu := f_build_lu_imei(g_pars.imei)
Harald Welteba7b6d92018-01-23 21:32:34 +0100674 var PDU_DTAP_MT dtap_mt;
675
676 /* tell GSUP dispatcher to send this IMSI to us */
677 f_create_gsup_expect(hex2str(g_pars.imsi));
678
679 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
680 f_bssap_compl_l3(l3_lu);
681
682 /* Send Early Classmark, just for the fun of it */
683 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
684 /* wait for LU reject, ignore any ID REQ */
685 alt {
686 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
687 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_ID_Req)) { repeat; }
688 }
689 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100690 f_expect_clear();
Harald Welteba7b6d92018-01-23 21:32:34 +0100691}
692testcase TC_lu_by_imei() runs on MTC_CT {
693 var BSC_ConnHdlr vc_conn;
694 f_init();
695
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100696 vc_conn := f_start_handler(refers(f_tc_lu_by_imei), 12);
Harald Welteba7b6d92018-01-23 21:32:34 +0100697 vc_conn.done;
698}
699
700/* Test LU by TMSI with unknown TMSI, expect (and answer) ID REQ. */
701private function f_tc_lu_tmsi_noauth_unknown(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100702 f_init_handler(pars);
Harald Welteba7b6d92018-01-23 21:32:34 +0100703
704 var PDU_ML3_MS_NW l3_lu := f_build_lu_tmsi('01020304'O); /* FIXME: Random */
705 var PDU_DTAP_MT dtap_mt;
706
707 /* tell GSUP dispatcher to send this IMSI to us */
708 f_create_gsup_expect(hex2str(g_pars.imsi));
709
710 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
711 f_bssap_compl_l3(l3_lu);
712
713 /* Send Early Classmark, just for the fun of it */
714 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
715
716 /* Wait for + respond to ID REQ (IMSI) */
717 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_ID_Req('001'B)));
718 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_MM_ID_Rsp_IMSI(g_pars.imsi)));
719
720 /* Expect MSC to do UpdateLocation to HLR; respond to it */
721 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
722 GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
723 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
724 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
725
726 alt {
Harald Welte7ec4fa82018-01-27 10:57:40 +0100727 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
728 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_TmsiRealloc_Cmpl));
729 }
Harald Welteba7b6d92018-01-23 21:32:34 +0100730 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {
731 setverdict(fail, "Expected LU ACK, but received REJ");
732 }
733 }
734
735 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100736 f_expect_clear();
Harald Welteba7b6d92018-01-23 21:32:34 +0100737}
738testcase TC_lu_by_tmsi_noauth_unknown() runs on MTC_CT {
739 var BSC_ConnHdlr vc_conn;
740 f_init();
741
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100742 vc_conn := f_start_handler(refers(f_tc_lu_tmsi_noauth_unknown), 13);
Harald Welteba7b6d92018-01-23 21:32:34 +0100743 vc_conn.done;
744}
745
746
Harald Welte45164da2018-01-24 12:51:27 +0100747/* Test IMSI DETACH (MI=IMSI) */
748private function f_tc_imsi_detach_by_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100749 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100750
751 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
752
753 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
754 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
755
756 /* Send Early Classmark, just for the fun of it? */
757 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
758
759 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100760 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100761}
762testcase TC_imsi_detach_by_imsi() runs on MTC_CT {
763 var BSC_ConnHdlr vc_conn;
764 f_init();
765
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100766 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imsi), 14);
Harald Welte45164da2018-01-24 12:51:27 +0100767 vc_conn.done;
768}
769
770/* Test IMSI DETACH (MI=TMSI) */
771private function f_tc_imsi_detach_by_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100772 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100773
774 var MobileIdentityLV mi := valueof(ts_MI_TMSI_LV('01020304'O));
775
776 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
777 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
778
779 /* Send Early Classmark, just for the fun of it? */
780 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
781
782 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100783 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100784}
785testcase TC_imsi_detach_by_tmsi() runs on MTC_CT {
786 var BSC_ConnHdlr vc_conn;
787 f_init();
788
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100789 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_tmsi), 15);
Harald Welte45164da2018-01-24 12:51:27 +0100790 vc_conn.done;
791}
792
793/* Test IMSI DETACH (MI=IMEI), which is illegal */
794private function f_tc_imsi_detach_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100795 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100796
Harald Welte256571e2018-01-24 18:47:19 +0100797 var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Harald Welte45164da2018-01-24 12:51:27 +0100798
799 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
800 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
801
802 /* Send Early Classmark, just for the fun of it? */
803 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
804
805 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100806 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100807}
808testcase TC_imsi_detach_by_imei() runs on MTC_CT {
809 var BSC_ConnHdlr vc_conn;
810 f_init();
811
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100812 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imei), 16);
Harald Welte45164da2018-01-24 12:51:27 +0100813 vc_conn.done;
814}
815
816
817/* helper function for an emergency call. caller passes in mobile identity to use */
818private function f_emerg_call(MobileIdentityLV mi) runs on BSC_ConnHdlr {
Harald Welte0bef21e2018-02-10 09:48:23 +0100819 var CallParameters cpars := valueof(t_CallParams('112'H, 0));
820 cpars.emergency := true;
Harald Welte45164da2018-01-24 12:51:27 +0100821
Harald Welte0bef21e2018-02-10 09:48:23 +0100822 f_mo_call(cpars);
Harald Welte45164da2018-01-24 12:51:27 +0100823}
824
825/* establish an emergency call by IMEI, no SIM inserted (and hence no IMSI) */
826private function f_tc_emerg_call_imei_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100827 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100828
Harald Welte256571e2018-01-24 18:47:19 +0100829 var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100830 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_EMERG_CALL, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100831 f_bssap_compl_l3(l3_info);
832 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ('05'O)));
Harald Welte1ddc7162018-01-27 14:25:46 +0100833 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100834}
835testcase TC_emerg_call_imei_reject() runs on MTC_CT {
836 var BSC_ConnHdlr vc_conn;
837 f_init();
838
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100839 vc_conn := f_start_handler(refers(f_tc_emerg_call_imei_reject), 17);
Harald Welte45164da2018-01-24 12:51:27 +0100840 vc_conn.done;
841}
842
Harald Welted5b91402018-01-24 18:48:16 +0100843/* establish an emergency call by IMSI, SIM inserted (and hence IMSI) */
Harald Welte45164da2018-01-24 12:51:27 +0100844private function f_tc_emerg_call_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100845 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100846 /* First perform location update to ensure subscriber is known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100847 f_perform_lu();
Harald Welte45164da2018-01-24 12:51:27 +0100848 /* Then issue emergency call identified by IMSI */
849 f_emerg_call(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
850}
851testcase TC_emerg_call_imsi() runs on MTC_CT {
852 var BSC_ConnHdlr vc_conn;
853 f_init();
854
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100855 vc_conn := f_start_handler(refers(f_tc_emerg_call_imsi), 18);
Harald Welte45164da2018-01-24 12:51:27 +0100856 vc_conn.done;
857}
858
859/* CM Service Request for VGCS -> reject */
860private function f_tc_cm_serv_req_vgcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100861 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100862
863 /* First perform location update to ensure subscriber is known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100864 f_perform_lu();
Harald Welte45164da2018-01-24 12:51:27 +0100865
866 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100867 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_VGCS, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100868 f_bssap_compl_l3(l3_info);
869 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100870 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100871}
872testcase TC_cm_serv_req_vgcs_reject() runs on MTC_CT {
873 var BSC_ConnHdlr vc_conn;
874 f_init();
875
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100876 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vgcs_reject), 19);
Harald Welte45164da2018-01-24 12:51:27 +0100877 vc_conn.done;
878}
879
880/* CM Service Request for VBS -> reject */
881private function f_tc_cm_serv_req_vbs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100882 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100883
884 /* First perform location update to ensure subscriber is known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100885 f_perform_lu();
Harald Welte45164da2018-01-24 12:51:27 +0100886
887 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100888 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_VBS, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100889 f_bssap_compl_l3(l3_info);
890 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100891 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100892}
893testcase TC_cm_serv_req_vbs_reject() runs on MTC_CT {
894 var BSC_ConnHdlr vc_conn;
895 f_init();
896
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100897 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vbs_reject), 20);
Harald Welte45164da2018-01-24 12:51:27 +0100898 vc_conn.done;
899}
900
901/* CM Service Request for LCS -> reject */
902private function f_tc_cm_serv_req_lcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100903 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100904
905 /* First perform location update to ensure subscriber is known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100906 f_perform_lu();
Harald Welte45164da2018-01-24 12:51:27 +0100907
908 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100909 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_LCS, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100910 f_bssap_compl_l3(l3_info);
911 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100912 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100913}
914testcase TC_cm_serv_req_lcs_reject() runs on MTC_CT {
915 var BSC_ConnHdlr vc_conn;
916 f_init();
917
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100918 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_lcs_reject), 21);
Harald Welte45164da2018-01-24 12:51:27 +0100919 vc_conn.done;
920}
921
Harald Welte0195ab12018-01-24 21:50:20 +0100922/* CM Re-Establishment Request */
923private function f_tc_cm_reest_req_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100924 f_init_handler(pars);
Harald Welte0195ab12018-01-24 21:50:20 +0100925
926 /* First perform location update to ensure subscriber is known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100927 f_perform_lu();
Harald Welte0195ab12018-01-24 21:50:20 +0100928
929 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
930 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_REEST_REQ(0, mi));
931 f_bssap_compl_l3(l3_info);
932 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100933 f_expect_clear();
Harald Welte0195ab12018-01-24 21:50:20 +0100934}
935testcase TC_cm_reest_req_reject() runs on MTC_CT {
936 var BSC_ConnHdlr vc_conn;
937 f_init();
Harald Welte0195ab12018-01-24 21:50:20 +0100938
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100939 vc_conn := f_start_handler(refers(f_tc_cm_reest_req_reject), 22);
Harald Welte0195ab12018-01-24 21:50:20 +0100940 vc_conn.done;
941}
942
Harald Weltec638f4d2018-01-24 22:00:36 +0100943/* Test LU (with authentication enabled), with wrong response from MS */
944private function f_tc_lu_auth_2G_fail(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100945 f_init_handler(pars);
Harald Weltec638f4d2018-01-24 22:00:36 +0100946
947 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
948
949 /* tell GSUP dispatcher to send this IMSI to us */
950 f_create_gsup_expect(hex2str(g_pars.imsi));
951
952 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
953 f_bssap_compl_l3(l3_lu);
954
955 /* Send Early Classmark, just for the fun of it */
956 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
957
958 var AuthVector vec := f_gen_auth_vec_2g();
959 var GSUP_IE auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(vec.rand, vec.sres, vec.kc));
960 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
961 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
962
963 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_AUTH_REQ(vec.rand)));
964 /* Send back wrong auth response */
965 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MT_MM_AUTH_RESP_2G('00000000'O)));
966
967 /* Expect GSUP AUTH FAIL REP to HLR */
968 GSUP.receive(tr_GSUP_AUTH_FAIL_IND(g_pars.imsi));
969
970 /* Expect LU REJECT with Cause == Illegal MS */
971 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej('03'O)));
Harald Welte1ddc7162018-01-27 14:25:46 +0100972 f_expect_clear();
Harald Weltec638f4d2018-01-24 22:00:36 +0100973}
974testcase TC_lu_auth_2G_fail() runs on MTC_CT {
975 var BSC_ConnHdlr vc_conn;
976 f_init();
977 f_vty_config(MSCVTY, "network", "authentication required");
Harald Weltec638f4d2018-01-24 22:00:36 +0100978
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100979 vc_conn := f_start_handler(refers(f_tc_lu_auth_2G_fail), 23);
Harald Weltec638f4d2018-01-24 22:00:36 +0100980 vc_conn.done;
981}
982
Harald Weltede371492018-01-27 23:44:41 +0100983/* A5/1 + A5/3 permitted on network side, and MS capable to do it */
Harald Welte16114282018-01-24 22:41:21 +0100984private function f_tc_lu_imsi_auth_tmsi_encr_13_13(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltede371492018-01-27 23:44:41 +0100985 pars.net.expect_auth := true;
986 pars.net.expect_ciph := true;
Harald Weltea10db902018-01-27 12:44:49 +0100987 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100988 f_perform_lu();
Harald Welte16114282018-01-24 22:41:21 +0100989}
990testcase TC_lu_imsi_auth_tmsi_encr_13_13() runs on MTC_CT {
991 var BSC_ConnHdlr vc_conn;
992 f_init();
993 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte16114282018-01-24 22:41:21 +0100994 f_vty_config(MSCVTY, "network", "encryption a5 1 3");
995
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100996 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_13_13), 24);
Harald Welte16114282018-01-24 22:41:21 +0100997 vc_conn.done;
998}
999
Harald Welte1af6ea82018-01-25 18:33:15 +01001000/* Test Complete L3 without payload */
1001private function f_tc_cl3_no_payload(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001002 f_init_handler(pars);
Harald Welte1af6ea82018-01-25 18:33:15 +01001003
1004 /* Send Complete L3 Info with empty L3 frame */
1005 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
1006 valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, ''O))));
1007
Harald Weltef466eb42018-01-27 14:26:54 +01001008 timer T := 5.0;
1009 T.start;
Harald Welte1af6ea82018-01-25 18:33:15 +01001010 alt {
1011 [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
1012 /* Expect LU REJECT with Cause == Illegal MS */
1013 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1014 BSSAP.send(ts_BSSMAP_ClearComplete);
1015 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1016 }
Harald Weltef466eb42018-01-27 14:26:54 +01001017 [] T.timeout {
Daniel Willmann90829d62018-02-15 17:45:14 +01001018 setverdict(fail, "Timeout waiting for ClearCommand or SCCP Release");
Harald Weltef466eb42018-01-27 14:26:54 +01001019 self.stop;
1020 }
Harald Welte1af6ea82018-01-25 18:33:15 +01001021 }
1022 setverdict(pass);
1023}
1024testcase TC_cl3_no_payload() runs on MTC_CT {
1025 var BSC_ConnHdlr vc_conn;
1026 f_init();
1027
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001028 vc_conn := f_start_handler(refers(f_tc_cl3_no_payload), 25);
Harald Welte1af6ea82018-01-25 18:33:15 +01001029 vc_conn.done;
1030}
1031
1032/* Test Complete L3 with random payload */
1033private function f_tc_cl3_rnd_payload(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001034 f_init_handler(pars);
Harald Welte1af6ea82018-01-25 18:33:15 +01001035
1036 var integer len := float2int(rnd() * 256.0);
1037 var octetstring payl := f_rnd_octstring(len);
1038
1039 /* Send Complete L3 Info with empty L3 frame */
1040 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
1041 valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, payl))));
1042
Harald Weltef466eb42018-01-27 14:26:54 +01001043 timer T := 5.0;
1044 T.start;
Harald Welte1af6ea82018-01-25 18:33:15 +01001045 alt {
1046 /* Immediate disconnect */
1047 [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
1048 /* Expect LU REJECT with Cause == Illegal MS */
1049 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1050 BSSAP.send(ts_BSSMAP_ClearComplete);
1051 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1052 }
1053 [] BSSAP.receive(tr_PDU_DTAP_MT(?)) { repeat; }
Harald Weltef466eb42018-01-27 14:26:54 +01001054 [] T.timeout {
Daniel Willmann90829d62018-02-15 17:45:14 +01001055 setverdict(fail, "Timeout waiting for ClearCommand or SCCP Release");
Harald Weltef466eb42018-01-27 14:26:54 +01001056 self.stop;
1057 }
Harald Welte1af6ea82018-01-25 18:33:15 +01001058 }
1059 setverdict(pass);
1060}
1061testcase TC_cl3_rnd_payload() runs on MTC_CT {
1062 var BSC_ConnHdlr vc_conn;
1063 f_init();
1064
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001065 vc_conn := f_start_handler(refers(f_tc_cl3_rnd_payload), 26);
Harald Welte1af6ea82018-01-25 18:33:15 +01001066 vc_conn.done;
1067}
1068
Harald Welte116e4332018-01-26 22:17:48 +01001069/* Test Complete L3 with random payload */
1070private function f_tc_establish_and_nothing(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001071 f_init_handler(pars);
Harald Welte116e4332018-01-26 22:17:48 +01001072
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001073 f_perform_lu();
Harald Welte116e4332018-01-26 22:17:48 +01001074
Harald Weltede371492018-01-27 23:44:41 +01001075 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte1ddc7162018-01-27 14:25:46 +01001076 f_expect_clear();
Harald Welte116e4332018-01-26 22:17:48 +01001077}
1078testcase TC_establish_and_nothing() runs on MTC_CT {
1079 var BSC_ConnHdlr vc_conn;
1080 f_init();
1081
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001082 vc_conn := f_start_handler(refers(f_tc_establish_and_nothing), 27);
Harald Welte116e4332018-01-26 22:17:48 +01001083 vc_conn.done;
1084}
1085
Harald Welte12510c52018-01-26 22:26:24 +01001086/* Test MO Call SETUP with no response from MNCC */
1087private function f_tc_mo_setup_and_nothing(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001088 f_init_handler(pars);
1089
Harald Welte12510c52018-01-26 22:26:24 +01001090 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1091
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001092 f_perform_lu();
Harald Welte12510c52018-01-26 22:26:24 +01001093
Harald Weltede371492018-01-27 23:44:41 +01001094 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte12510c52018-01-26 22:26:24 +01001095 f_create_mncc_expect(hex2str(cpars.called_party));
1096 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1097
1098 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
1099
Harald Welte1ddc7162018-01-27 14:25:46 +01001100 f_expect_clear(30.0);
Harald Welte12510c52018-01-26 22:26:24 +01001101}
1102testcase TC_mo_setup_and_nothing() runs on MTC_CT {
1103 var BSC_ConnHdlr vc_conn;
1104 f_init();
1105
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001106 vc_conn := f_start_handler(refers(f_tc_mo_setup_and_nothing), 28);
Harald Welte12510c52018-01-26 22:26:24 +01001107 vc_conn.done;
1108}
1109
Harald Welte3ab88002018-01-26 22:37:25 +01001110/* Test MO Call with no response to RAN-side CRCX */
1111private function f_tc_mo_crcx_ran_timeout(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001112 f_init_handler(pars);
Harald Welte3ab88002018-01-26 22:37:25 +01001113 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1114 var MNCC_PDU mncc;
1115 var MgcpCommand mgcp_cmd;
1116
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001117 f_perform_lu();
Harald Welte3ab88002018-01-26 22:37:25 +01001118
Harald Weltede371492018-01-27 23:44:41 +01001119 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte3ab88002018-01-26 22:37:25 +01001120 f_create_mncc_expect(hex2str(cpars.called_party));
1121 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1122
1123 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
1124 MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc;
1125 cpars.mncc_callref := mncc.u.signal.callref;
1126 MNCC.send(ts_MNCC_CALL_PROC_req(cpars.mncc_callref, cpars.mncc_bearer_cap));
1127 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(cpars.transaction_id)));
1128
1129 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
Harald Welte1852a842018-01-26 22:53:36 +01001130 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1131 cpars.mgcp_ep := mgcp_cmd.line.ep;
Harald Welte3ab88002018-01-26 22:37:25 +01001132 /* never respond to this */
1133
Harald Welte1ddc7162018-01-27 14:25:46 +01001134 f_expect_clear(30.0);
Harald Welte3ab88002018-01-26 22:37:25 +01001135}
1136testcase TC_mo_crcx_ran_timeout() runs on MTC_CT {
1137 var BSC_ConnHdlr vc_conn;
1138 f_init();
1139
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001140 vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_timeout), 29);
Harald Welte3ab88002018-01-26 22:37:25 +01001141 vc_conn.done;
1142}
1143
Harald Welte0cc82d92018-01-26 22:52:34 +01001144/* Test MO Call with reject to RAN-side CRCX */
1145private function f_tc_mo_crcx_ran_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001146 f_init_handler(pars);
Harald Welte0cc82d92018-01-26 22:52:34 +01001147 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1148 var MNCC_PDU mncc;
1149 var MgcpCommand mgcp_cmd;
1150
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001151 f_perform_lu();
Harald Welte0cc82d92018-01-26 22:52:34 +01001152
Harald Weltede371492018-01-27 23:44:41 +01001153 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte0cc82d92018-01-26 22:52:34 +01001154 f_create_mncc_expect(hex2str(cpars.called_party));
1155 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1156
1157 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
1158 MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc;
1159 cpars.mncc_callref := mncc.u.signal.callref;
1160 MNCC.send(ts_MNCC_CALL_PROC_req(cpars.mncc_callref, cpars.mncc_bearer_cap));
1161 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(cpars.transaction_id)));
1162
1163 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
1164 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1165 cpars.mgcp_ep := mgcp_cmd.line.ep;
1166 /* Respond to CRCX with error */
1167 var MgcpResponse mgcp_rsp := {
1168 line := {
1169 code := "542",
1170 trans_id := mgcp_cmd.line.trans_id,
1171 string := "FORCED_FAIL"
1172 },
1173 params := omit,
1174 sdp := omit
1175 }
1176 MGCP.send(mgcp_rsp);
1177
1178 timer T := 30.0;
1179 T.start;
1180 alt {
1181 [] T.timeout { setverdict(fail, "Timeout waiting for channel release"); self.stop; }
1182 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1183 BSSAP.send(ts_BSSMAP_ClearComplete);
1184 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1185 setverdict(pass);
1186 }
Daniel Willmann5868e622018-02-15 17:42:59 +01001187 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id))) {
1188 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_REL_COMPL(cpars.transaction_id)));
1189 repeat;
1190 }
1191 [] BSSAP.receive {
1192 repeat;
1193 }
Harald Welte0cc82d92018-01-26 22:52:34 +01001194 [] MNCC.receive { repeat; }
1195 [] GSUP.receive { repeat; }
1196 [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {
1197 MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));
1198 f_create_mgcp_delete_ep(cpars.mgcp_ep);
Harald Welteec6e5b42018-01-27 12:45:15 +01001199 repeat;
Harald Welte0cc82d92018-01-26 22:52:34 +01001200 }
1201 [] MGCP.receive { repeat; }
1202 }
1203}
1204testcase TC_mo_crcx_ran_reject() runs on MTC_CT {
1205 var BSC_ConnHdlr vc_conn;
1206 f_init();
1207
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001208 vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_reject), 30);
Harald Welte0cc82d92018-01-26 22:52:34 +01001209 vc_conn.done;
1210}
1211
Harald Welte3ab88002018-01-26 22:37:25 +01001212
Harald Welte812f7a42018-01-27 00:49:18 +01001213/* helper function to start a MT call: MNCC SETUP; Paging; DChan est.; DTAP SETUP */
1214private function f_mt_call_start(inout CallParameters cpars) runs on BSC_ConnHdlr {
1215 var MNCC_PDU mncc;
1216 var MgcpCommand mgcp_cmd;
1217 var OCT4 tmsi;
1218
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001219 f_perform_lu();
Harald Welte812f7a42018-01-27 00:49:18 +01001220 if (isvalue(g_pars.tmsi)) {
1221 tmsi := g_pars.tmsi;
1222 } else {
1223 tmsi := 'FFFFFFFF'O;
1224 }
1225 f_bssmap_register_imsi(g_pars.imsi, tmsi);
1226
1227 /* Allocate call reference and send SETUP via MNCC to MSC */
1228 cpars.mncc_callref := f_rnd_int(2147483648);
1229 MNCC.send(ts_MNCC_SETUP_req(cpars.mncc_callref, hex2str(g_pars.msisdn),
1230 hex2str(cpars.called_party), hex2str(g_pars.imsi)));
1231
1232 /* MSC->BSC: expect PAGING from MSC */
1233 BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));
1234 /* MS -> MSC: PAGING RESPONSE */
Harald Welte081b19a2018-02-10 09:11:13 +01001235 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)), EST_TYPE_PAG_RESP);
Harald Welte812f7a42018-01-27 00:49:18 +01001236
1237 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1238
1239 /* MSC->MS: SETUP */
1240 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_SETUP(cpars.transaction_id, *, cpars.called_party)));
1241}
1242
1243/* Test MT Call */
1244private function f_tc_mt_crcx_ran_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001245 f_init_handler(pars);
Harald Welte812f7a42018-01-27 00:49:18 +01001246 var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
1247 var MNCC_PDU mncc;
1248 var MgcpCommand mgcp_cmd;
1249
1250 f_mt_call_start(cpars);
1251
1252 /* MS->MSC: CALL CONFIRMED */
1253 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CALL_CONF(cpars.transaction_id)));
1254
1255 MNCC.receive(tr_MNCC_CALL_CONF_ind(cpars.mncc_callref));
1256
1257 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
1258 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1259 cpars.mgcp_ep := mgcp_cmd.line.ep;
1260 /* Respond to CRCX with error */
1261 var MgcpResponse mgcp_rsp := {
1262 line := {
1263 code := "542",
1264 trans_id := mgcp_cmd.line.trans_id,
1265 string := "FORCED_FAIL"
1266 },
1267 params := omit,
1268 sdp := omit
1269 }
1270 MGCP.send(mgcp_rsp);
1271
1272 timer T := 30.0;
1273 T.start;
1274 alt {
1275 [] T.timeout { setverdict(fail, "Timeout waiting for channel release"); self.stop; }
1276 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1277 BSSAP.send(ts_BSSMAP_ClearComplete);
1278 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1279 setverdict(pass);
1280 }
1281 [] BSSAP.receive { repeat; }
1282 [] MNCC.receive { repeat; }
1283 [] GSUP.receive { repeat; }
1284 [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {
1285 MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));
1286 f_create_mgcp_delete_ep(cpars.mgcp_ep);
1287 repeat;
1288 }
1289 [] MGCP.receive { repeat; }
1290 }
1291}
1292testcase TC_mt_crcx_ran_reject() runs on MTC_CT {
1293 var BSC_ConnHdlr vc_conn;
1294 f_init();
1295
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001296 vc_conn := f_start_handler(refers(f_tc_mt_crcx_ran_reject), 31);
Harald Welte812f7a42018-01-27 00:49:18 +01001297 vc_conn.done;
1298}
1299
1300
1301/* Test MT Call T310 timer */
1302private function f_tc_mt_t310(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltead2952e2018-01-27 14:12:46 +01001303 f_init_handler(pars, 200.0);
Harald Welte812f7a42018-01-27 00:49:18 +01001304 var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
1305 var MNCC_PDU mncc;
1306 var MgcpCommand mgcp_cmd;
1307
1308 f_mt_call_start(cpars);
1309
1310 /* MS->MSC: CALL CONFIRMED */
1311 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CALL_CONF(cpars.transaction_id)));
1312 MNCC.receive(tr_MNCC_CALL_CONF_ind(cpars.mncc_callref));
1313
1314 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
1315 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1316 cpars.mgcp_ep := mgcp_cmd.line.ep;
1317 /* FIXME: Respond to CRCX */
1318
1319 /* old libosmocore T310 default timeout is 180s. so let's wait 190 */
1320 timer T := 190.0;
1321 T.start;
1322 alt {
1323 [] T.timeout { setverdict(fail, "Timeout waiting for T310"); self.stop; }
1324 [] MNCC.receive(tr_MNCC_DISC_ind(cpars.mncc_callref)) {
1325 MNCC.send(ts_MNCC_REL_req(cpars.mncc_callref, valueof(ts_MNCC_cause(23))));
1326 }
1327 }
1328 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(cpars.transaction_id)));
1329 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id)));
1330 /* FIXME: We're sending this with TIflag 0: allocated by sender, which is wrong */
1331 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_REL_COMPL(cpars.transaction_id)));
1332
1333 alt {
1334 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1335 BSSAP.send(ts_BSSMAP_ClearComplete);
1336 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1337 setverdict(pass);
1338 }
1339 [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {
1340 MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));
1341 f_create_mgcp_delete_ep(cpars.mgcp_ep);
1342 repeat;
1343 }
1344 }
1345}
1346testcase TC_mt_t310() runs on MTC_CT {
1347 var BSC_ConnHdlr vc_conn;
1348 f_init();
1349
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001350 vc_conn := f_start_handler(refers(f_tc_mt_t310), 32);
Harald Welte812f7a42018-01-27 00:49:18 +01001351 vc_conn.done;
1352}
1353
Harald Welte167458a2018-01-27 15:58:16 +01001354/* Perform successful LU + MO call, then GSUP LocationCancel. Subscriber must be denied CM SERV */
1355private function f_tc_gsup_cancel(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1356 f_init_handler(pars);
1357 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1358 cpars.bss_rtp_port := 1110;
1359 cpars.mgcp_connection_id_bss := '22222'H;
1360 cpars.mgcp_connection_id_mss := '33333'H;
1361
1362 /* Location Update to make subscriber known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001363 f_perform_lu();
Harald Welte167458a2018-01-27 15:58:16 +01001364
1365 /* First MO call should succeed */
1366 f_mo_call(cpars);
1367
1368 /* Cancel the subscriber in the VLR */
1369 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
1370 alt {
1371 [] GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi)) { }
1372 [] GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi)) {
1373 setverdict(fail, "Received GSUP Location Cancel Error");
1374 self.stop;
1375 }
1376 }
1377
1378 /* Follow-up transactions should fail */
1379 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
1380 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, mi));
1381 f_bssap_compl_l3(l3_info);
1382 alt {
1383 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ)) { }
1384 [] BSSAP.receive {
1385 setverdict(fail, "Received unexpected BSSAP instead of CM SERV REJ");
1386 self.stop;
1387 }
1388 }
1389 setverdict(pass);
1390}
1391testcase TC_gsup_cancel() runs on MTC_CT {
1392 var BSC_ConnHdlr vc_conn;
1393 f_init();
1394
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001395 vc_conn := f_start_handler(refers(f_tc_gsup_cancel), 33);
Harald Welte167458a2018-01-27 15:58:16 +01001396 vc_conn.done;
1397}
1398
Harald Welte9de84792018-01-28 01:06:35 +01001399/* A5/1 only permitted on network side, and MS capable to do it */
1400private function f_tc_lu_imsi_auth_tmsi_encr_1_13(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1401 pars.net.expect_auth := true;
1402 pars.net.expect_ciph := true;
1403 pars.net.kc_support := '02'O; /* A5/1 only */
1404 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001405 f_perform_lu();
Harald Welte9de84792018-01-28 01:06:35 +01001406}
1407testcase TC_lu_imsi_auth_tmsi_encr_1_13() runs on MTC_CT {
1408 var BSC_ConnHdlr vc_conn;
1409 f_init();
1410 f_vty_config(MSCVTY, "network", "authentication required");
1411 f_vty_config(MSCVTY, "network", "encryption a5 1");
1412
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001413 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_1_13), 34);
Harald Welte9de84792018-01-28 01:06:35 +01001414 vc_conn.done;
1415}
1416
1417/* A5/3 only permitted on network side, and MS capable to do it */
1418private function f_tc_lu_imsi_auth_tmsi_encr_3_13(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1419 pars.net.expect_auth := true;
1420 pars.net.expect_ciph := true;
1421 pars.net.kc_support := '08'O; /* A5/3 only */
1422 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001423 f_perform_lu();
Harald Welte9de84792018-01-28 01:06:35 +01001424}
1425testcase TC_lu_imsi_auth_tmsi_encr_3_13() runs on MTC_CT {
1426 var BSC_ConnHdlr vc_conn;
1427 f_init();
1428 f_vty_config(MSCVTY, "network", "authentication required");
1429 f_vty_config(MSCVTY, "network", "encryption a5 3");
1430
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001431 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_3_13), 35);
Harald Welte9de84792018-01-28 01:06:35 +01001432 vc_conn.done;
1433}
1434
1435/* A5/3 only permitted on network side, and MS with only A5/1 support */
1436private function f_tc_lu_imsi_auth_tmsi_encr_3_1(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1437 pars.net.expect_auth := true;
1438 pars.net.expect_ciph := true;
1439 pars.net.kc_support := '08'O; /* A5/3 only */
1440 pars.cm2.classmarkInformationType2_oct5.a5_3 := '0'B;
1441 f_init_handler(pars, 15.0);
1442
1443 /* cannot use f_perform_lu() as we expect a reject */
1444 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
1445 f_create_gsup_expect(hex2str(g_pars.imsi));
1446 f_bssap_compl_l3(l3_lu);
Neels Hofmeyr29b8da02018-03-01 18:09:45 +01001447 if (pars.send_early_cm) {
1448 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
1449 } else {
1450 pars.cm1.esind := '0'B;
1451 }
Harald Welte9de84792018-01-28 01:06:35 +01001452 f_mm_auth();
1453 alt {
1454 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
1455 [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(?,?)) {
1456 setverdict(fail, "CipherModeCommand despite no A5 intersection");
1457 self.stop;
1458 }
1459 [] BSSAP.receive {
1460 setverdict(inconc, "Unknown/unexpected BSSAP received");
1461 self.stop;
1462 }
1463 }
1464 setverdict(pass);
1465}
1466testcase TC_lu_imsi_auth_tmsi_encr_3_1() runs on MTC_CT {
1467 var BSC_ConnHdlr vc_conn;
1468 f_init();
1469 f_vty_config(MSCVTY, "network", "authentication required");
1470 f_vty_config(MSCVTY, "network", "encryption a5 3");
1471
Neels Hofmeyr29b8da02018-03-01 18:09:45 +01001472 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_3_1), 360);
1473 vc_conn.done;
1474}
1475testcase TC_lu_imsi_auth_tmsi_encr_3_1_no_cm() runs on MTC_CT {
1476 var BSC_ConnHdlrPars pars;
1477 var BSC_ConnHdlr vc_conn;
1478 f_init();
1479 f_vty_config(MSCVTY, "network", "authentication required");
1480 f_vty_config(MSCVTY, "network", "encryption a5 3");
1481
1482 pars := f_init_pars(361);
1483 pars.send_early_cm := false;
1484 vc_conn := f_start_handler_with_pars(refers(f_tc_lu_imsi_auth_tmsi_encr_3_1), pars);
Harald Welte9de84792018-01-28 01:06:35 +01001485 vc_conn.done;
1486}
Neels Hofmeyr1b3c6e32018-03-01 17:52:21 +01001487testcase TC_lu_imsi_auth_tmsi_encr_3_1_log_msc_debug() runs on MTC_CT {
1488 var BSC_ConnHdlr vc_conn;
1489 f_init();
1490 f_vty_config(MSCVTY, "network", "authentication required");
1491 f_vty_config(MSCVTY, "network", "encryption a5 3");
1492
1493 /* Make sure the MSC category is on DEBUG level to trigger the log
1494 * message that is reported in OS#2947 to trigger the segfault */
1495 f_vty_config(MSCVTY, "log stderr", "logging level msc debug");
1496
1497 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_3_1), 362);
1498 vc_conn.done;
1499}
Harald Welte9de84792018-01-28 01:06:35 +01001500
1501/* A5/1 + A5/3 only permitted on network side, and MS with only A5/2 support */
1502private function f_tc_lu_imsi_auth_tmsi_encr_13_2(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1503 pars.net.expect_auth := true;
1504 pars.net.expect_ciph := true;
1505 pars.net.kc_support := '0A'O; /* A5/1 + A5/3 */
1506 pars.cm1.a5_1 := '1'B;
1507 pars.cm2.a5_1 := '1'B;
1508 pars.cm2.classmarkInformationType2_oct5.a5_3 := '0'B;
1509 pars.cm2.classmarkInformationType2_oct5.a5_2 := '1'B;
1510 f_init_handler(pars, 15.0);
1511
1512 /* cannot use f_perform_lu() as we expect a reject */
1513 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
1514 f_create_gsup_expect(hex2str(g_pars.imsi));
1515 f_bssap_compl_l3(l3_lu);
1516 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
1517 f_mm_auth();
1518 alt {
1519 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
1520 [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(?,?)) {
1521 setverdict(fail, "CipherModeCommand despite no A5 intersection");
1522 self.stop;
1523 }
1524 [] BSSAP.receive {
1525 setverdict(inconc, "Unknown/unexpected BSSAP received");
1526 self.stop;
1527 }
1528 }
1529 setverdict(pass);
1530}
1531testcase TC_lu_imsi_auth_tmsi_encr_13_2() runs on MTC_CT {
1532 var BSC_ConnHdlr vc_conn;
1533 f_init();
1534 f_vty_config(MSCVTY, "network", "authentication required");
1535 f_vty_config(MSCVTY, "network", "encryption a5 1 3");
1536
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001537 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_13_2), 37);
Harald Welte9de84792018-01-28 01:06:35 +01001538 vc_conn.done;
1539}
1540
1541/* A5/0 + A5/1 + A5/3 only permitted on network side, and MS with only A5/2 support */
1542private function f_tc_lu_imsi_auth_tmsi_encr_013_2(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1543 pars.net.expect_auth := true;
1544 pars.net.expect_ciph := true;
1545 pars.net.kc_support := '0B'O; /* A5/1 + A5/3 */
1546 pars.cm1.a5_1 := '1'B;
1547 pars.cm2.a5_1 := '1'B;
1548 pars.cm2.classmarkInformationType2_oct5.a5_3 := '0'B;
1549 pars.cm2.classmarkInformationType2_oct5.a5_2 := '1'B;
1550 f_init_handler(pars, 15.0);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001551 f_perform_lu();
Harald Welte9de84792018-01-28 01:06:35 +01001552}
1553testcase TC_lu_imsi_auth_tmsi_encr_013_2() runs on MTC_CT {
1554 var BSC_ConnHdlr vc_conn;
1555 f_init();
1556 f_vty_config(MSCVTY, "network", "authentication required");
1557 f_vty_config(MSCVTY, "network", "encryption a5 0 1 3");
1558
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001559 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_013_2), 38);
Harald Welte9de84792018-01-28 01:06:35 +01001560 vc_conn.done;
1561}
1562
Harald Welte33ec09b2018-02-10 15:34:46 +01001563/* LU followed by MT call (including paging) */
1564private function f_tc_lu_and_mt_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1565 f_init_handler(pars);
1566 //FIXME: odd digits var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1567 var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
1568 cpars.bss_rtp_port := 1110;
1569 cpars.mgcp_connection_id_bss := '10004'H;
1570 cpars.mgcp_connection_id_mss := '10005'H;
1571
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001572 f_perform_lu();
Harald Welte33ec09b2018-02-10 15:34:46 +01001573 f_mt_call(cpars);
1574}
1575testcase TC_lu_and_mt_call() runs on MTC_CT {
1576 var BSC_ConnHdlr vc_conn;
1577 f_init();
1578
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001579 vc_conn := f_start_handler(refers(f_tc_lu_and_mt_call), 39);
Harald Welte33ec09b2018-02-10 15:34:46 +01001580 vc_conn.done;
1581}
1582
Daniel Willmann8b084372018-02-04 13:35:26 +01001583/* Test MO Call SETUP with DTMF */
1584private function f_tc_mo_setup_dtmf_dup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1585 f_init_handler(pars);
1586 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1587 cpars.bss_rtp_port := 1110;
1588 cpars.mgcp_connection_id_bss := '22222'H;
1589 cpars.mgcp_connection_id_mss := '33333'H;
1590
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001591 f_perform_lu();
Daniel Willmann8b084372018-02-04 13:35:26 +01001592 f_mo_seq_dtmf_dup(cpars);
1593}
1594testcase TC_mo_setup_and_dtmf_dup() runs on MTC_CT {
1595 var BSC_ConnHdlr vc_conn;
1596 f_init();
1597
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001598 vc_conn := f_start_handler(refers(f_tc_mo_setup_dtmf_dup), 39);
Daniel Willmann8b084372018-02-04 13:35:26 +01001599 vc_conn.done;
1600}
Harald Welte9de84792018-01-28 01:06:35 +01001601
1602
Harald Welte12510c52018-01-26 22:26:24 +01001603
Harald Welte45164da2018-01-24 12:51:27 +01001604
Harald Welteba7b6d92018-01-23 21:32:34 +01001605/* TODO:
1606 * continue to send repeated MO signalling messages to keep channel open: does MSC tmeout?
1607 * malformed messages (missing IE, invalid message type): properly rejected?
1608 * MT call while LU or is ongoing: Do we use existing lchan or page while lchan active?
1609 * 3G/2G auth permutations
1610 * encryption algorithms vs. classmark vs. vty config
Harald Welteba7b6d92018-01-23 21:32:34 +01001611 * send new transaction after/during clear (like SMS, ...)
Harald Welte45164da2018-01-24 12:51:27 +01001612 * too long L3 INFO in DTAP
1613 * too long / padded BSSAP
1614 * too long / short TLV values
Harald Welteba7b6d92018-01-23 21:32:34 +01001615 */
Harald Weltef6dd64d2017-11-19 12:09:51 +01001616
1617
1618control {
Harald Weltea49e36e2018-01-21 19:29:33 +01001619 execute( TC_lu_imsi_noauth_tmsi() );
Harald Welted2328a22018-01-27 14:27:16 +01001620 execute( TC_lu_imsi_noauth_notmsi() );
Harald Weltea49e36e2018-01-21 19:29:33 +01001621 execute( TC_lu_imsi_reject() );
1622 execute( TC_lu_imsi_timeout_gsup() );
Harald Welted2328a22018-01-27 14:27:16 +01001623 execute( TC_lu_imsi_auth_tmsi() );
1624 execute( TC_cmserv_imsi_unknown() );
Harald Welte2bb825f2018-01-22 11:31:18 +01001625 execute( TC_lu_and_mo_call() );
Harald Welte071ed732018-01-23 19:53:52 +01001626 execute( TC_lu_auth_sai_timeout() );
1627 execute( TC_lu_auth_sai_err() );
Harald Weltee1a2f3c2018-01-24 17:28:48 +01001628 execute( TC_lu_clear_request() );
1629 execute( TC_lu_disconnect() );
1630 execute( TC_lu_by_imei() );
1631 execute( TC_lu_by_tmsi_noauth_unknown() );
1632 execute( TC_imsi_detach_by_imsi() );
1633 execute( TC_imsi_detach_by_tmsi() );
1634 execute( TC_imsi_detach_by_imei() );
1635 execute( TC_emerg_call_imei_reject() );
1636 execute( TC_emerg_call_imsi() );
1637 execute( TC_cm_serv_req_vgcs_reject() );
1638 execute( TC_cm_serv_req_vbs_reject() );
1639 execute( TC_cm_serv_req_lcs_reject() );
Harald Welte0195ab12018-01-24 21:50:20 +01001640 execute( TC_cm_reest_req_reject() );
Harald Welte1af6ea82018-01-25 18:33:15 +01001641 execute( TC_lu_auth_2G_fail() );
1642 execute( TC_lu_imsi_auth_tmsi_encr_13_13() );
1643 execute( TC_cl3_no_payload() );
1644 execute( TC_cl3_rnd_payload() );
Harald Welte1852a842018-01-26 22:53:36 +01001645 execute( TC_establish_and_nothing() );
1646 execute( TC_mo_setup_and_nothing() );
1647 execute( TC_mo_crcx_ran_timeout() );
1648 execute( TC_mo_crcx_ran_reject() );
Harald Welted2328a22018-01-27 14:27:16 +01001649 execute( TC_mt_crcx_ran_reject() );
Daniel Willmann8b084372018-02-04 13:35:26 +01001650 execute( TC_mo_setup_and_dtmf_dup() );
Harald Welteaa54cf82018-01-30 08:15:32 +01001651 //execute( TC_mt_t310() );
Harald Welte167458a2018-01-27 15:58:16 +01001652 execute( TC_gsup_cancel() );
Harald Welte9de84792018-01-28 01:06:35 +01001653 execute( TC_lu_imsi_auth_tmsi_encr_1_13() );
1654 execute( TC_lu_imsi_auth_tmsi_encr_3_13() );
1655 execute( TC_lu_imsi_auth_tmsi_encr_3_1() );
Neels Hofmeyr29b8da02018-03-01 18:09:45 +01001656 execute( TC_lu_imsi_auth_tmsi_encr_3_1_no_cm() );
Harald Welte9de84792018-01-28 01:06:35 +01001657 execute( TC_lu_imsi_auth_tmsi_encr_13_2() );
1658 execute( TC_lu_imsi_auth_tmsi_encr_013_2() );
Harald Welte33ec09b2018-02-10 15:34:46 +01001659
1660 execute( TC_lu_and_mt_call() );
1661
Neels Hofmeyr1b3c6e32018-03-01 17:52:21 +01001662 /* Run this last: at the time of writing this test crashes the MSC */
1663 execute( TC_lu_imsi_auth_tmsi_encr_3_1_log_msc_debug() );
Harald Weltef6dd64d2017-11-19 12:09:51 +01001664}
1665
1666
1667}