blob: c46ec8001c786593212955397a579d79b02eb5b6 [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? */
341function f_start_handler(void_fn fn, charstring id, integer imsi_suffix) runs on MTC_CT return BSC_ConnHdlr {
342 var BSC_ConnHdlr vc_conn;
Harald Weltede371492018-01-27 23:44:41 +0100343 var BSC_ConnHdlrNetworkPars net_pars := {
344 kc_support := '0A'O, /* A5/1 and A5/3 enabled */
345 expect_tmsi := true,
346 expect_auth := false,
347 expect_ciph := false
348 };
Harald Weltea49e36e2018-01-21 19:29:33 +0100349 var BSC_ConnHdlrPars pars := {
Harald Weltea4ca4462018-02-09 00:17:14 +0100350 sccp_addr_own := g_bssap.sccp_addr_own,
351 sccp_addr_peer := g_bssap.sccp_addr_peer,
Harald Weltea49e36e2018-01-21 19:29:33 +0100352 cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42)),
Harald Welte81b7f9d2018-01-24 19:06:24 +0100353 imei := f_gen_imei(imsi_suffix),
354 imsi := f_gen_imsi(imsi_suffix),
355 msisdn := f_gen_msisdn(imsi_suffix),
Harald Welte256571e2018-01-24 18:47:19 +0100356 tmsi := omit,
Harald Welte9de84792018-01-28 01:06:35 +0100357 cm1 := valueof(ts_CM1),
Harald Welte82600572018-01-21 20:54:08 +0100358 cm2 := valueof(ts_CM2_default),
Harald Welte16114282018-01-24 22:41:21 +0100359 cm3 := omit,
Harald Weltede371492018-01-27 23:44:41 +0100360 vec := omit,
361 net := net_pars
Harald Weltea49e36e2018-01-21 19:29:33 +0100362 };
363
364 vc_conn := BSC_ConnHdlr.create(id);
365 /* BSSMAP part / A interface */
Harald Weltea4ca4462018-02-09 00:17:14 +0100366 connect(vc_conn:BSSAP, g_bssap.vc_BSSMAP:CLIENT);
367 connect(vc_conn:BSSAP_PROC, g_bssap.vc_BSSMAP:PROC);
Harald Weltea49e36e2018-01-21 19:29:33 +0100368 /* MNCC part */
369 connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);
370 connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);
Harald Welte4aa970c2018-01-26 10:38:09 +0100371 /* MGCP part */
372 connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);
373 connect(vc_conn:MGCP_PROC, vc_MGCP:MGCP_PROC);
Harald Weltea49e36e2018-01-21 19:29:33 +0100374 /* GSUP part */
375 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
376 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
377
Harald Weltea10db902018-01-27 12:44:49 +0100378 /* We cannot use vc_conn.start(f_init_handler(fn, id, pars)); as we cannot have
379 * a stand-alone 'derefers()' call, see https://www.eclipse.org/forums/index.php/t/1091364/ */
Harald Weltea49e36e2018-01-21 19:29:33 +0100380 vc_conn.start(derefers(fn)(id, pars));
381 return vc_conn;
382}
383
Harald Welte3ca1c902018-01-24 18:51:27 +0100384function f_vty_config(TELNETasp_PT pt, charstring config_node, charstring cmd)
385{
386 /* enter config mode; enter node */
387 f_vty_enter_config(pt);
388 f_vty_transceive(pt, config_node);
389 /* execute command */
390 f_vty_transceive(pt, cmd);
391 /* leave config mode */
392 f_vty_transceive(pt, "end");
393}
394
Harald Weltea49e36e2018-01-21 19:29:33 +0100395private function f_tc_lu_imsi_noauth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100396 f_init_handler(pars);
Harald Weltede371492018-01-27 23:44:41 +0100397 f_perform_lu(true);
Harald Weltea49e36e2018-01-21 19:29:33 +0100398}
Harald Weltea49e36e2018-01-21 19:29:33 +0100399testcase TC_lu_imsi_noauth_tmsi() runs on MTC_CT {
400 var BSC_ConnHdlr vc_conn;
401 f_init();
402
403 vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_tmsi), testcasename(), 1);
404 vc_conn.done;
405}
406
407private function f_tc_lu_imsi_noauth_notmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltede371492018-01-27 23:44:41 +0100408 pars.net.expect_tmsi := false;
Harald Weltea10db902018-01-27 12:44:49 +0100409 f_init_handler(pars);
Harald Weltede371492018-01-27 23:44:41 +0100410 f_perform_lu(true);
Harald Weltea49e36e2018-01-21 19:29:33 +0100411}
Harald Weltea49e36e2018-01-21 19:29:33 +0100412testcase TC_lu_imsi_noauth_notmsi() runs on MTC_CT {
413 var BSC_ConnHdlr vc_conn;
414 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100415 f_vty_config(MSCVTY, "msc", "no assign-tmsi");
Harald Weltea49e36e2018-01-21 19:29:33 +0100416
417 vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_notmsi), testcasename(), 2);
418 vc_conn.done;
419}
420
421/* Do LU by IMSI, refuse it on GSUP and expect LU REJ back to MS */
422private function f_tc_lu_imsi_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100423 f_init_handler(pars);
Harald Weltea49e36e2018-01-21 19:29:33 +0100424 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
425
426 f_create_gsup_expect(hex2str(g_pars.imsi));
427 f_bssap_compl_l3(l3_lu);
428 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
429 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 23));
430 alt {
431 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej(int2oct(23,1)))) { }
432 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
433 setverdict(fail, "Expecting LU REJ, but got ACCEPT");
434 self.stop;
435 }
436 }
Harald Welte1ddc7162018-01-27 14:25:46 +0100437 f_expect_clear();
Harald Weltea49e36e2018-01-21 19:29:33 +0100438}
439testcase TC_lu_imsi_reject() runs on MTC_CT {
440 var BSC_ConnHdlr vc_conn;
441 f_init();
442
443 vc_conn := f_start_handler(refers(f_tc_lu_imsi_reject), testcasename(), 3);
444 vc_conn.done;
445}
446
447/* Do LU by IMSI, timeout on GSUP */
448private function f_tc_lu_imsi_timeout_gsup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100449 f_init_handler(pars);
Harald Weltea49e36e2018-01-21 19:29:33 +0100450 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
451
452 f_create_gsup_expect(hex2str(g_pars.imsi));
453 f_bssap_compl_l3(l3_lu);
454 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
455 /* Normally the HLR would need to respond here, but we decide to force a timeout here */
456 alt {
457 /* FIXME: Expect specific reject cause */
458 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
459 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
460 setverdict(fail, "Expecting LU REJ, but got ACCEPT");
461 self.stop;
462 }
463 }
Harald Welte1ddc7162018-01-27 14:25:46 +0100464 f_expect_clear();
Harald Weltea49e36e2018-01-21 19:29:33 +0100465}
466testcase TC_lu_imsi_timeout_gsup() runs on MTC_CT {
467 var BSC_ConnHdlr vc_conn;
468 f_init();
469
470 vc_conn := f_start_handler(refers(f_tc_lu_imsi_timeout_gsup), testcasename(), 4);
471 vc_conn.done;
472}
473
Harald Welte7b1b2812018-01-22 21:23:06 +0100474private function f_tc_lu_imsi_auth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltede371492018-01-27 23:44:41 +0100475 pars.net.expect_auth := true;
Harald Weltea10db902018-01-27 12:44:49 +0100476 f_init_handler(pars);
Harald Weltede371492018-01-27 23:44:41 +0100477 f_perform_lu(true);
Harald Welte7b1b2812018-01-22 21:23:06 +0100478}
479testcase TC_lu_imsi_auth_tmsi() runs on MTC_CT {
480 var BSC_ConnHdlr vc_conn;
481 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100482 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte7b1b2812018-01-22 21:23:06 +0100483
484 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi), testcasename(), 5);
485 vc_conn.done;
486}
487
Harald Weltea49e36e2018-01-21 19:29:33 +0100488
489/* Send CM SERVICE REQ for IMSI that has never performed LU before */
490private function f_tc_cmserv_imsi_unknown(charstring id, BSC_ConnHdlrPars pars)
491runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100492 f_init_handler(pars);
Harald Weltea49e36e2018-01-21 19:29:33 +0100493
494 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
495 var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100496 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, mi));
Harald Weltea49e36e2018-01-21 19:29:33 +0100497
498 f_create_gsup_expect(hex2str(g_pars.imsi));
499
500 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
501 f_bssap_compl_l3(l3_info);
502
503 timer T := 10.0;
Harald Weltef6dd64d2017-11-19 12:09:51 +0100504 T.start;
505 alt {
Harald Weltea49e36e2018-01-21 19:29:33 +0100506 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ)) { }
507 //[] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC)) { }
508 [] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
509 [] GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
510 setverdict(fail, "Unexpected GSUP UL REQ");
511 }
Daniel Willmann90829d62018-02-15 17:45:14 +0100512 [] T.timeout { setverdict(fail, "Timeout waiting for CM SERV REQ"); }
Harald Weltef6dd64d2017-11-19 12:09:51 +0100513 }
514
Harald Welte1ddc7162018-01-27 14:25:46 +0100515 f_expect_clear();
Harald Weltef6dd64d2017-11-19 12:09:51 +0100516}
Harald Weltea49e36e2018-01-21 19:29:33 +0100517testcase TC_cmserv_imsi_unknown() runs on MTC_CT {
518 var BSC_ConnHdlr vc_conn;
519 f_init();
Harald Welte81b7f9d2018-01-24 19:06:24 +0100520 vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), testcasename(), 6);
Harald Weltea49e36e2018-01-21 19:29:33 +0100521 vc_conn.done;
522}
523
Harald Welte2bb825f2018-01-22 11:31:18 +0100524private function f_tc_lu_and_mo_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100525 f_init_handler(pars);
Harald Welteb71901a2018-01-26 19:16:05 +0100526 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
527 cpars.bss_rtp_port := 1110;
528 cpars.mgcp_connection_id_bss := '22222'H;
529 cpars.mgcp_connection_id_mss := '33333'H;
Harald Welte2bb825f2018-01-22 11:31:18 +0100530
Harald Weltede371492018-01-27 23:44:41 +0100531 f_perform_lu(true);
Harald Welteb71901a2018-01-26 19:16:05 +0100532 f_mo_call(cpars);
Harald Welte2bb825f2018-01-22 11:31:18 +0100533}
534testcase TC_lu_and_mo_call() runs on MTC_CT {
535 var BSC_ConnHdlr vc_conn;
536 f_init();
537
Harald Welte81b7f9d2018-01-24 19:06:24 +0100538 vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), testcasename(), 7);
Harald Welte071ed732018-01-23 19:53:52 +0100539 vc_conn.done;
540}
541
542/* Test LU (with authentication enabled), where HLR times out sending SAI response */
543private function f_tc_lu_auth_sai_timeout(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100544 f_init_handler(pars);
Harald Welte071ed732018-01-23 19:53:52 +0100545
546 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
547 var PDU_DTAP_MT dtap_mt;
548
549 /* tell GSUP dispatcher to send this IMSI to us */
550 f_create_gsup_expect(hex2str(g_pars.imsi));
551
552 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
553 f_bssap_compl_l3(l3_lu);
554
555 /* Send Early Classmark, just for the fun of it */
556 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
557
558 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
559 /* The HLR would normally return an auth vector here, but we fail to do so. */
560
561 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej));
Harald Welte1ddc7162018-01-27 14:25:46 +0100562 f_expect_clear();
Harald Welte071ed732018-01-23 19:53:52 +0100563}
564testcase TC_lu_auth_sai_timeout() runs on MTC_CT {
565 var BSC_ConnHdlr vc_conn;
566 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100567 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte071ed732018-01-23 19:53:52 +0100568
Harald Welte81b7f9d2018-01-24 19:06:24 +0100569 vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_timeout), testcasename(), 8);
Harald Welte071ed732018-01-23 19:53:52 +0100570 vc_conn.done;
571}
572
573/* Test LU (with authentication enabled), where HLR rejects sending SAI error */
574private function f_tc_lu_auth_sai_err(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100575 f_init_handler(pars);
Harald Welte071ed732018-01-23 19:53:52 +0100576
577 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
578 var PDU_DTAP_MT dtap_mt;
579
580 /* tell GSUP dispatcher to send this IMSI to us */
581 f_create_gsup_expect(hex2str(g_pars.imsi));
582
583 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
584 f_bssap_compl_l3(l3_lu);
585
586 /* Send Early Classmark, just for the fun of it */
587 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
588
589 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
590 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 13));
591
592 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej));
Harald Welte1ddc7162018-01-27 14:25:46 +0100593 f_expect_clear();
Harald Welte071ed732018-01-23 19:53:52 +0100594}
595testcase TC_lu_auth_sai_err() runs on MTC_CT {
596 var BSC_ConnHdlr vc_conn;
597 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100598 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte071ed732018-01-23 19:53:52 +0100599
Harald Welte81b7f9d2018-01-24 19:06:24 +0100600 vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_err), testcasename(), 9);
Harald Welte2bb825f2018-01-22 11:31:18 +0100601 vc_conn.done;
602}
Harald Weltea49e36e2018-01-21 19:29:33 +0100603
Harald Weltebc881782018-01-23 20:09:15 +0100604/* Test LU but BSC will send a clear request in the middle */
605private function f_tc_lu_clear_request(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100606 f_init_handler(pars);
Harald Weltebc881782018-01-23 20:09:15 +0100607
608 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
609 var PDU_DTAP_MT dtap_mt;
610
611 /* tell GSUP dispatcher to send this IMSI to us */
612 f_create_gsup_expect(hex2str(g_pars.imsi));
613
614 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
615 f_bssap_compl_l3(l3_lu);
616
617 /* Send Early Classmark, just for the fun of it */
618 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
619
620 f_sleep(1.0);
621 /* send clear request in the middle of the LU */
622 BSSAP.send(ts_BSSMAP_ClearRequest(0));
623 BSSAP.receive(tr_BSSMAP_ClearCommand);
624 BSSAP.send(ts_BSSMAP_ClearComplete);
Harald Welte89a32492018-01-27 19:07:28 +0100625 alt {
626 /* See https://osmocom.org/issues/2862 */
627 [] BSSAP.receive(tr_BSSMAP_ClearCommand) { repeat; }
628 [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
629 }
Harald Weltebc881782018-01-23 20:09:15 +0100630 setverdict(pass);
631}
632testcase TC_lu_clear_request() runs on MTC_CT {
633 var BSC_ConnHdlr vc_conn;
634 f_init();
635
Harald Welte81b7f9d2018-01-24 19:06:24 +0100636 vc_conn := f_start_handler(refers(f_tc_lu_clear_request), testcasename(), 10);
Harald Weltebc881782018-01-23 20:09:15 +0100637 vc_conn.done;
638}
639
Harald Welte66af9e62018-01-24 17:28:21 +0100640/* Test LU but BSC will send a clear request in the middle */
641private function f_tc_lu_disconnect(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100642 f_init_handler(pars);
Harald Welte66af9e62018-01-24 17:28:21 +0100643
644 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
645 var PDU_DTAP_MT dtap_mt;
646
647 /* tell GSUP dispatcher to send this IMSI to us */
648 f_create_gsup_expect(hex2str(g_pars.imsi));
649
650 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
651 f_bssap_compl_l3(l3_lu);
652
653 /* Send Early Classmark, just for the fun of it */
654 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
655
656 f_sleep(1.0);
657 /* send clear request in the middle of the LU */
658 BSSAP.send(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
659 setverdict(pass);
660}
661testcase TC_lu_disconnect() runs on MTC_CT {
662 var BSC_ConnHdlr vc_conn;
663 f_init();
664
Harald Welte81b7f9d2018-01-24 19:06:24 +0100665 vc_conn := f_start_handler(refers(f_tc_lu_disconnect), testcasename(), 11);
Harald Welte66af9e62018-01-24 17:28:21 +0100666 vc_conn.done;
667}
668
669
Harald Welteba7b6d92018-01-23 21:32:34 +0100670/* Test LU but with illegal mobile identity type = IMEI */
671private function f_tc_lu_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100672 f_init_handler(pars);
Harald Welteba7b6d92018-01-23 21:32:34 +0100673
Harald Welte256571e2018-01-24 18:47:19 +0100674 var PDU_ML3_MS_NW l3_lu := f_build_lu_imei(g_pars.imei)
Harald Welteba7b6d92018-01-23 21:32:34 +0100675 var PDU_DTAP_MT dtap_mt;
676
677 /* tell GSUP dispatcher to send this IMSI to us */
678 f_create_gsup_expect(hex2str(g_pars.imsi));
679
680 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
681 f_bssap_compl_l3(l3_lu);
682
683 /* Send Early Classmark, just for the fun of it */
684 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
685 /* wait for LU reject, ignore any ID REQ */
686 alt {
687 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
688 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_ID_Req)) { repeat; }
689 }
690 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100691 f_expect_clear();
Harald Welteba7b6d92018-01-23 21:32:34 +0100692}
693testcase TC_lu_by_imei() runs on MTC_CT {
694 var BSC_ConnHdlr vc_conn;
695 f_init();
696
Harald Welte81b7f9d2018-01-24 19:06:24 +0100697 vc_conn := f_start_handler(refers(f_tc_lu_by_imei), testcasename(), 12);
Harald Welteba7b6d92018-01-23 21:32:34 +0100698 vc_conn.done;
699}
700
701/* Test LU by TMSI with unknown TMSI, expect (and answer) ID REQ. */
702private function f_tc_lu_tmsi_noauth_unknown(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100703 f_init_handler(pars);
Harald Welteba7b6d92018-01-23 21:32:34 +0100704
705 var PDU_ML3_MS_NW l3_lu := f_build_lu_tmsi('01020304'O); /* FIXME: Random */
706 var PDU_DTAP_MT dtap_mt;
707
708 /* tell GSUP dispatcher to send this IMSI to us */
709 f_create_gsup_expect(hex2str(g_pars.imsi));
710
711 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
712 f_bssap_compl_l3(l3_lu);
713
714 /* Send Early Classmark, just for the fun of it */
715 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
716
717 /* Wait for + respond to ID REQ (IMSI) */
718 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_ID_Req('001'B)));
719 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_MM_ID_Rsp_IMSI(g_pars.imsi)));
720
721 /* Expect MSC to do UpdateLocation to HLR; respond to it */
722 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
723 GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
724 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
725 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
726
727 alt {
Harald Welte7ec4fa82018-01-27 10:57:40 +0100728 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
729 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_TmsiRealloc_Cmpl));
730 }
Harald Welteba7b6d92018-01-23 21:32:34 +0100731 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {
732 setverdict(fail, "Expected LU ACK, but received REJ");
733 }
734 }
735
736 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100737 f_expect_clear();
Harald Welteba7b6d92018-01-23 21:32:34 +0100738}
739testcase TC_lu_by_tmsi_noauth_unknown() runs on MTC_CT {
740 var BSC_ConnHdlr vc_conn;
741 f_init();
742
Harald Welte81b7f9d2018-01-24 19:06:24 +0100743 vc_conn := f_start_handler(refers(f_tc_lu_tmsi_noauth_unknown), testcasename(), 13);
Harald Welteba7b6d92018-01-23 21:32:34 +0100744 vc_conn.done;
745}
746
747
Harald Welte45164da2018-01-24 12:51:27 +0100748/* Test IMSI DETACH (MI=IMSI) */
749private function f_tc_imsi_detach_by_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100750 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100751
752 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
753
754 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
755 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
756
757 /* Send Early Classmark, just for the fun of it? */
758 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
759
760 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100761 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100762}
763testcase TC_imsi_detach_by_imsi() runs on MTC_CT {
764 var BSC_ConnHdlr vc_conn;
765 f_init();
766
Harald Welte81b7f9d2018-01-24 19:06:24 +0100767 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imsi), testcasename(), 14);
Harald Welte45164da2018-01-24 12:51:27 +0100768 vc_conn.done;
769}
770
771/* Test IMSI DETACH (MI=TMSI) */
772private function f_tc_imsi_detach_by_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100773 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100774
775 var MobileIdentityLV mi := valueof(ts_MI_TMSI_LV('01020304'O));
776
777 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
778 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
779
780 /* Send Early Classmark, just for the fun of it? */
781 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
782
783 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100784 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100785}
786testcase TC_imsi_detach_by_tmsi() runs on MTC_CT {
787 var BSC_ConnHdlr vc_conn;
788 f_init();
789
Harald Welte81b7f9d2018-01-24 19:06:24 +0100790 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_tmsi), testcasename(), 15);
Harald Welte45164da2018-01-24 12:51:27 +0100791 vc_conn.done;
792}
793
794/* Test IMSI DETACH (MI=IMEI), which is illegal */
795private function f_tc_imsi_detach_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100796 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100797
Harald Welte256571e2018-01-24 18:47:19 +0100798 var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Harald Welte45164da2018-01-24 12:51:27 +0100799
800 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
801 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
802
803 /* Send Early Classmark, just for the fun of it? */
804 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
805
806 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100807 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100808}
809testcase TC_imsi_detach_by_imei() runs on MTC_CT {
810 var BSC_ConnHdlr vc_conn;
811 f_init();
812
Harald Welte81b7f9d2018-01-24 19:06:24 +0100813 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imei), testcasename(), 16);
Harald Welte45164da2018-01-24 12:51:27 +0100814 vc_conn.done;
815}
816
817
818/* helper function for an emergency call. caller passes in mobile identity to use */
819private function f_emerg_call(MobileIdentityLV mi) runs on BSC_ConnHdlr {
Harald Welte0bef21e2018-02-10 09:48:23 +0100820 var CallParameters cpars := valueof(t_CallParams('112'H, 0));
821 cpars.emergency := true;
Harald Welte45164da2018-01-24 12:51:27 +0100822
Harald Welte0bef21e2018-02-10 09:48:23 +0100823 f_mo_call(cpars);
Harald Welte45164da2018-01-24 12:51:27 +0100824}
825
826/* establish an emergency call by IMEI, no SIM inserted (and hence no IMSI) */
827private function f_tc_emerg_call_imei_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100828 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100829
Harald Welte256571e2018-01-24 18:47:19 +0100830 var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100831 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_EMERG_CALL, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100832 f_bssap_compl_l3(l3_info);
833 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ('05'O)));
Harald Welte1ddc7162018-01-27 14:25:46 +0100834 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100835}
836testcase TC_emerg_call_imei_reject() runs on MTC_CT {
837 var BSC_ConnHdlr vc_conn;
838 f_init();
839
Harald Welte81b7f9d2018-01-24 19:06:24 +0100840 vc_conn := f_start_handler(refers(f_tc_emerg_call_imei_reject), testcasename(), 17);
Harald Welte45164da2018-01-24 12:51:27 +0100841 vc_conn.done;
842}
843
Harald Welted5b91402018-01-24 18:48:16 +0100844/* establish an emergency call by IMSI, SIM inserted (and hence IMSI) */
Harald Welte45164da2018-01-24 12:51:27 +0100845private function f_tc_emerg_call_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100846 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100847 /* First perform location update to ensure subscriber is known */
Harald Weltede371492018-01-27 23:44:41 +0100848 f_perform_lu(true);
Harald Welte45164da2018-01-24 12:51:27 +0100849 /* Then issue emergency call identified by IMSI */
850 f_emerg_call(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
851}
852testcase TC_emerg_call_imsi() runs on MTC_CT {
853 var BSC_ConnHdlr vc_conn;
854 f_init();
855
Harald Welte81b7f9d2018-01-24 19:06:24 +0100856 vc_conn := f_start_handler(refers(f_tc_emerg_call_imsi), testcasename(), 18);
Harald Welte45164da2018-01-24 12:51:27 +0100857 vc_conn.done;
858}
859
860/* CM Service Request for VGCS -> reject */
861private function f_tc_cm_serv_req_vgcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100862 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100863
864 /* First perform location update to ensure subscriber is known */
Harald Weltede371492018-01-27 23:44:41 +0100865 f_perform_lu(true);
Harald Welte45164da2018-01-24 12:51:27 +0100866
867 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100868 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_VGCS, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100869 f_bssap_compl_l3(l3_info);
870 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100871 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100872}
873testcase TC_cm_serv_req_vgcs_reject() runs on MTC_CT {
874 var BSC_ConnHdlr vc_conn;
875 f_init();
876
Harald Welte81b7f9d2018-01-24 19:06:24 +0100877 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vgcs_reject), testcasename(), 19);
Harald Welte45164da2018-01-24 12:51:27 +0100878 vc_conn.done;
879}
880
881/* CM Service Request for VBS -> reject */
882private function f_tc_cm_serv_req_vbs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100883 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100884
885 /* First perform location update to ensure subscriber is known */
Harald Weltede371492018-01-27 23:44:41 +0100886 f_perform_lu(true);
Harald Welte45164da2018-01-24 12:51:27 +0100887
888 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100889 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_VBS, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100890 f_bssap_compl_l3(l3_info);
891 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100892 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100893}
894testcase TC_cm_serv_req_vbs_reject() runs on MTC_CT {
895 var BSC_ConnHdlr vc_conn;
896 f_init();
897
Harald Welte81b7f9d2018-01-24 19:06:24 +0100898 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vbs_reject), testcasename(), 20);
Harald Welte45164da2018-01-24 12:51:27 +0100899 vc_conn.done;
900}
901
902/* CM Service Request for LCS -> reject */
903private function f_tc_cm_serv_req_lcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100904 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100905
906 /* First perform location update to ensure subscriber is known */
Harald Weltede371492018-01-27 23:44:41 +0100907 f_perform_lu(true);
Harald Welte45164da2018-01-24 12:51:27 +0100908
909 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100910 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_LCS, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100911 f_bssap_compl_l3(l3_info);
912 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100913 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100914}
915testcase TC_cm_serv_req_lcs_reject() runs on MTC_CT {
916 var BSC_ConnHdlr vc_conn;
917 f_init();
918
Harald Welte81b7f9d2018-01-24 19:06:24 +0100919 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_lcs_reject), testcasename(), 21);
Harald Welte45164da2018-01-24 12:51:27 +0100920 vc_conn.done;
921}
922
Harald Welte0195ab12018-01-24 21:50:20 +0100923/* CM Re-Establishment Request */
924private function f_tc_cm_reest_req_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100925 f_init_handler(pars);
Harald Welte0195ab12018-01-24 21:50:20 +0100926
927 /* First perform location update to ensure subscriber is known */
Harald Weltede371492018-01-27 23:44:41 +0100928 f_perform_lu(true);
Harald Welte0195ab12018-01-24 21:50:20 +0100929
930 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
931 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_REEST_REQ(0, mi));
932 f_bssap_compl_l3(l3_info);
933 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100934 f_expect_clear();
Harald Welte0195ab12018-01-24 21:50:20 +0100935}
936testcase TC_cm_reest_req_reject() runs on MTC_CT {
937 var BSC_ConnHdlr vc_conn;
938 f_init();
Harald Welte0195ab12018-01-24 21:50:20 +0100939
940 vc_conn := f_start_handler(refers(f_tc_cm_reest_req_reject), testcasename(), 22);
941 vc_conn.done;
942}
943
Harald Weltec638f4d2018-01-24 22:00:36 +0100944/* Test LU (with authentication enabled), with wrong response from MS */
945private function f_tc_lu_auth_2G_fail(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100946 f_init_handler(pars);
Harald Weltec638f4d2018-01-24 22:00:36 +0100947
948 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
949
950 /* tell GSUP dispatcher to send this IMSI to us */
951 f_create_gsup_expect(hex2str(g_pars.imsi));
952
953 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
954 f_bssap_compl_l3(l3_lu);
955
956 /* Send Early Classmark, just for the fun of it */
957 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
958
959 var AuthVector vec := f_gen_auth_vec_2g();
960 var GSUP_IE auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(vec.rand, vec.sres, vec.kc));
961 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
962 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
963
964 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_AUTH_REQ(vec.rand)));
965 /* Send back wrong auth response */
966 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MT_MM_AUTH_RESP_2G('00000000'O)));
967
968 /* Expect GSUP AUTH FAIL REP to HLR */
969 GSUP.receive(tr_GSUP_AUTH_FAIL_IND(g_pars.imsi));
970
971 /* Expect LU REJECT with Cause == Illegal MS */
972 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej('03'O)));
Harald Welte1ddc7162018-01-27 14:25:46 +0100973 f_expect_clear();
Harald Weltec638f4d2018-01-24 22:00:36 +0100974}
975testcase TC_lu_auth_2G_fail() runs on MTC_CT {
976 var BSC_ConnHdlr vc_conn;
977 f_init();
978 f_vty_config(MSCVTY, "network", "authentication required");
Harald Weltec638f4d2018-01-24 22:00:36 +0100979
980 vc_conn := f_start_handler(refers(f_tc_lu_auth_2G_fail), testcasename(), 23);
981 vc_conn.done;
982}
983
Harald Weltede371492018-01-27 23:44:41 +0100984/* A5/1 + A5/3 permitted on network side, and MS capable to do it */
Harald Welte16114282018-01-24 22:41:21 +0100985private 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 +0100986 pars.net.expect_auth := true;
987 pars.net.expect_ciph := true;
Harald Weltea10db902018-01-27 12:44:49 +0100988 f_init_handler(pars);
Harald Weltede371492018-01-27 23:44:41 +0100989 f_perform_lu(true);
Harald Welte16114282018-01-24 22:41:21 +0100990}
991testcase TC_lu_imsi_auth_tmsi_encr_13_13() runs on MTC_CT {
992 var BSC_ConnHdlr vc_conn;
993 f_init();
994 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte16114282018-01-24 22:41:21 +0100995 f_vty_config(MSCVTY, "network", "encryption a5 1 3");
996
997 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_13_13), testcasename(), 24);
998 vc_conn.done;
999}
1000
Harald Welte1af6ea82018-01-25 18:33:15 +01001001/* Test Complete L3 without payload */
1002private function f_tc_cl3_no_payload(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001003 f_init_handler(pars);
Harald Welte1af6ea82018-01-25 18:33:15 +01001004
1005 /* Send Complete L3 Info with empty L3 frame */
1006 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
1007 valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, ''O))));
1008
Harald Weltef466eb42018-01-27 14:26:54 +01001009 timer T := 5.0;
1010 T.start;
Harald Welte1af6ea82018-01-25 18:33:15 +01001011 alt {
1012 [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
1013 /* Expect LU REJECT with Cause == Illegal MS */
1014 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1015 BSSAP.send(ts_BSSMAP_ClearComplete);
1016 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1017 }
Harald Weltef466eb42018-01-27 14:26:54 +01001018 [] T.timeout {
Daniel Willmann90829d62018-02-15 17:45:14 +01001019 setverdict(fail, "Timeout waiting for ClearCommand or SCCP Release");
Harald Weltef466eb42018-01-27 14:26:54 +01001020 self.stop;
1021 }
Harald Welte1af6ea82018-01-25 18:33:15 +01001022 }
1023 setverdict(pass);
1024}
1025testcase TC_cl3_no_payload() runs on MTC_CT {
1026 var BSC_ConnHdlr vc_conn;
1027 f_init();
1028
Daniel Willmann4bd99552018-02-02 18:27:14 +01001029 vc_conn := f_start_handler(refers(f_tc_cl3_no_payload), testcasename(), 25);
Harald Welte1af6ea82018-01-25 18:33:15 +01001030 vc_conn.done;
1031}
1032
1033/* Test Complete L3 with random payload */
1034private function f_tc_cl3_rnd_payload(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001035 f_init_handler(pars);
Harald Welte1af6ea82018-01-25 18:33:15 +01001036
1037 var integer len := float2int(rnd() * 256.0);
1038 var octetstring payl := f_rnd_octstring(len);
1039
1040 /* Send Complete L3 Info with empty L3 frame */
1041 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
1042 valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, payl))));
1043
Harald Weltef466eb42018-01-27 14:26:54 +01001044 timer T := 5.0;
1045 T.start;
Harald Welte1af6ea82018-01-25 18:33:15 +01001046 alt {
1047 /* Immediate disconnect */
1048 [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
1049 /* Expect LU REJECT with Cause == Illegal MS */
1050 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1051 BSSAP.send(ts_BSSMAP_ClearComplete);
1052 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1053 }
1054 [] BSSAP.receive(tr_PDU_DTAP_MT(?)) { repeat; }
Harald Weltef466eb42018-01-27 14:26:54 +01001055 [] T.timeout {
Daniel Willmann90829d62018-02-15 17:45:14 +01001056 setverdict(fail, "Timeout waiting for ClearCommand or SCCP Release");
Harald Weltef466eb42018-01-27 14:26:54 +01001057 self.stop;
1058 }
Harald Welte1af6ea82018-01-25 18:33:15 +01001059 }
1060 setverdict(pass);
1061}
1062testcase TC_cl3_rnd_payload() runs on MTC_CT {
1063 var BSC_ConnHdlr vc_conn;
1064 f_init();
1065
Daniel Willmann4bd99552018-02-02 18:27:14 +01001066 vc_conn := f_start_handler(refers(f_tc_cl3_rnd_payload), testcasename(), 26);
Harald Welte1af6ea82018-01-25 18:33:15 +01001067 vc_conn.done;
1068}
1069
Harald Welte116e4332018-01-26 22:17:48 +01001070/* Test Complete L3 with random payload */
1071private function f_tc_establish_and_nothing(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001072 f_init_handler(pars);
Harald Welte116e4332018-01-26 22:17:48 +01001073
Harald Weltede371492018-01-27 23:44:41 +01001074 f_perform_lu(true);
Harald Welte116e4332018-01-26 22:17:48 +01001075
Harald Weltede371492018-01-27 23:44:41 +01001076 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte1ddc7162018-01-27 14:25:46 +01001077 f_expect_clear();
Harald Welte116e4332018-01-26 22:17:48 +01001078}
1079testcase TC_establish_and_nothing() runs on MTC_CT {
1080 var BSC_ConnHdlr vc_conn;
1081 f_init();
1082
Daniel Willmann4bd99552018-02-02 18:27:14 +01001083 vc_conn := f_start_handler(refers(f_tc_establish_and_nothing), testcasename(), 27);
Harald Welte116e4332018-01-26 22:17:48 +01001084 vc_conn.done;
1085}
1086
Harald Welte12510c52018-01-26 22:26:24 +01001087/* Test MO Call SETUP with no response from MNCC */
1088private function f_tc_mo_setup_and_nothing(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001089 f_init_handler(pars);
1090
Harald Welte12510c52018-01-26 22:26:24 +01001091 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1092
Harald Weltede371492018-01-27 23:44:41 +01001093 f_perform_lu(true);
Harald Welte12510c52018-01-26 22:26:24 +01001094
Harald Weltede371492018-01-27 23:44:41 +01001095 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte12510c52018-01-26 22:26:24 +01001096 f_create_mncc_expect(hex2str(cpars.called_party));
1097 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1098
1099 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
1100
Harald Welte1ddc7162018-01-27 14:25:46 +01001101 f_expect_clear(30.0);
Harald Welte12510c52018-01-26 22:26:24 +01001102}
1103testcase TC_mo_setup_and_nothing() runs on MTC_CT {
1104 var BSC_ConnHdlr vc_conn;
1105 f_init();
1106
Daniel Willmann4bd99552018-02-02 18:27:14 +01001107 vc_conn := f_start_handler(refers(f_tc_mo_setup_and_nothing), testcasename(), 28);
Harald Welte12510c52018-01-26 22:26:24 +01001108 vc_conn.done;
1109}
1110
Harald Welte3ab88002018-01-26 22:37:25 +01001111/* Test MO Call with no response to RAN-side CRCX */
1112private function f_tc_mo_crcx_ran_timeout(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001113 f_init_handler(pars);
Harald Welte3ab88002018-01-26 22:37:25 +01001114 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1115 var MNCC_PDU mncc;
1116 var MgcpCommand mgcp_cmd;
1117
Harald Weltede371492018-01-27 23:44:41 +01001118 f_perform_lu(true);
Harald Welte3ab88002018-01-26 22:37:25 +01001119
Harald Weltede371492018-01-27 23:44:41 +01001120 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte3ab88002018-01-26 22:37:25 +01001121 f_create_mncc_expect(hex2str(cpars.called_party));
1122 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1123
1124 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
1125 MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc;
1126 cpars.mncc_callref := mncc.u.signal.callref;
1127 MNCC.send(ts_MNCC_CALL_PROC_req(cpars.mncc_callref, cpars.mncc_bearer_cap));
1128 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(cpars.transaction_id)));
1129
1130 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
Harald Welte1852a842018-01-26 22:53:36 +01001131 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1132 cpars.mgcp_ep := mgcp_cmd.line.ep;
Harald Welte3ab88002018-01-26 22:37:25 +01001133 /* never respond to this */
1134
Harald Welte1ddc7162018-01-27 14:25:46 +01001135 f_expect_clear(30.0);
Harald Welte3ab88002018-01-26 22:37:25 +01001136}
1137testcase TC_mo_crcx_ran_timeout() runs on MTC_CT {
1138 var BSC_ConnHdlr vc_conn;
1139 f_init();
1140
Daniel Willmann4bd99552018-02-02 18:27:14 +01001141 vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_timeout), testcasename(), 29);
Harald Welte3ab88002018-01-26 22:37:25 +01001142 vc_conn.done;
1143}
1144
Harald Welte0cc82d92018-01-26 22:52:34 +01001145/* Test MO Call with reject to RAN-side CRCX */
1146private function f_tc_mo_crcx_ran_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001147 f_init_handler(pars);
Harald Welte0cc82d92018-01-26 22:52:34 +01001148 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1149 var MNCC_PDU mncc;
1150 var MgcpCommand mgcp_cmd;
1151
Harald Weltede371492018-01-27 23:44:41 +01001152 f_perform_lu(true);
Harald Welte0cc82d92018-01-26 22:52:34 +01001153
Harald Weltede371492018-01-27 23:44:41 +01001154 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte0cc82d92018-01-26 22:52:34 +01001155 f_create_mncc_expect(hex2str(cpars.called_party));
1156 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1157
1158 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
1159 MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc;
1160 cpars.mncc_callref := mncc.u.signal.callref;
1161 MNCC.send(ts_MNCC_CALL_PROC_req(cpars.mncc_callref, cpars.mncc_bearer_cap));
1162 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(cpars.transaction_id)));
1163
1164 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
1165 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1166 cpars.mgcp_ep := mgcp_cmd.line.ep;
1167 /* Respond to CRCX with error */
1168 var MgcpResponse mgcp_rsp := {
1169 line := {
1170 code := "542",
1171 trans_id := mgcp_cmd.line.trans_id,
1172 string := "FORCED_FAIL"
1173 },
1174 params := omit,
1175 sdp := omit
1176 }
1177 MGCP.send(mgcp_rsp);
1178
1179 timer T := 30.0;
1180 T.start;
1181 alt {
1182 [] T.timeout { setverdict(fail, "Timeout waiting for channel release"); self.stop; }
1183 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1184 BSSAP.send(ts_BSSMAP_ClearComplete);
1185 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1186 setverdict(pass);
1187 }
Daniel Willmann5868e622018-02-15 17:42:59 +01001188 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id))) {
1189 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_REL_COMPL(cpars.transaction_id)));
1190 repeat;
1191 }
1192 [] BSSAP.receive {
1193 repeat;
1194 }
Harald Welte0cc82d92018-01-26 22:52:34 +01001195 [] MNCC.receive { repeat; }
1196 [] GSUP.receive { repeat; }
1197 [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {
1198 MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));
1199 f_create_mgcp_delete_ep(cpars.mgcp_ep);
Harald Welteec6e5b42018-01-27 12:45:15 +01001200 repeat;
Harald Welte0cc82d92018-01-26 22:52:34 +01001201 }
1202 [] MGCP.receive { repeat; }
1203 }
1204}
1205testcase TC_mo_crcx_ran_reject() runs on MTC_CT {
1206 var BSC_ConnHdlr vc_conn;
1207 f_init();
1208
Daniel Willmann4bd99552018-02-02 18:27:14 +01001209 vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_reject), testcasename(), 30);
Harald Welte0cc82d92018-01-26 22:52:34 +01001210 vc_conn.done;
1211}
1212
Harald Welte3ab88002018-01-26 22:37:25 +01001213
Harald Welte812f7a42018-01-27 00:49:18 +01001214/* helper function to start a MT call: MNCC SETUP; Paging; DChan est.; DTAP SETUP */
1215private function f_mt_call_start(inout CallParameters cpars) runs on BSC_ConnHdlr {
1216 var MNCC_PDU mncc;
1217 var MgcpCommand mgcp_cmd;
1218 var OCT4 tmsi;
1219
Harald Weltede371492018-01-27 23:44:41 +01001220 f_perform_lu(true);
Harald Welte812f7a42018-01-27 00:49:18 +01001221 if (isvalue(g_pars.tmsi)) {
1222 tmsi := g_pars.tmsi;
1223 } else {
1224 tmsi := 'FFFFFFFF'O;
1225 }
1226 f_bssmap_register_imsi(g_pars.imsi, tmsi);
1227
1228 /* Allocate call reference and send SETUP via MNCC to MSC */
1229 cpars.mncc_callref := f_rnd_int(2147483648);
1230 MNCC.send(ts_MNCC_SETUP_req(cpars.mncc_callref, hex2str(g_pars.msisdn),
1231 hex2str(cpars.called_party), hex2str(g_pars.imsi)));
1232
1233 /* MSC->BSC: expect PAGING from MSC */
1234 BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));
1235 /* MS -> MSC: PAGING RESPONSE */
Harald Welte081b19a2018-02-10 09:11:13 +01001236 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)), EST_TYPE_PAG_RESP);
Harald Welte812f7a42018-01-27 00:49:18 +01001237
1238 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1239
1240 /* MSC->MS: SETUP */
1241 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_SETUP(cpars.transaction_id, *, cpars.called_party)));
1242}
1243
1244/* Test MT Call */
1245private function f_tc_mt_crcx_ran_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001246 f_init_handler(pars);
Harald Welte812f7a42018-01-27 00:49:18 +01001247 var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
1248 var MNCC_PDU mncc;
1249 var MgcpCommand mgcp_cmd;
1250
1251 f_mt_call_start(cpars);
1252
1253 /* MS->MSC: CALL CONFIRMED */
1254 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CALL_CONF(cpars.transaction_id)));
1255
1256 MNCC.receive(tr_MNCC_CALL_CONF_ind(cpars.mncc_callref));
1257
1258 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
1259 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1260 cpars.mgcp_ep := mgcp_cmd.line.ep;
1261 /* Respond to CRCX with error */
1262 var MgcpResponse mgcp_rsp := {
1263 line := {
1264 code := "542",
1265 trans_id := mgcp_cmd.line.trans_id,
1266 string := "FORCED_FAIL"
1267 },
1268 params := omit,
1269 sdp := omit
1270 }
1271 MGCP.send(mgcp_rsp);
1272
1273 timer T := 30.0;
1274 T.start;
1275 alt {
1276 [] T.timeout { setverdict(fail, "Timeout waiting for channel release"); self.stop; }
1277 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1278 BSSAP.send(ts_BSSMAP_ClearComplete);
1279 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1280 setverdict(pass);
1281 }
1282 [] BSSAP.receive { repeat; }
1283 [] MNCC.receive { repeat; }
1284 [] GSUP.receive { repeat; }
1285 [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {
1286 MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));
1287 f_create_mgcp_delete_ep(cpars.mgcp_ep);
1288 repeat;
1289 }
1290 [] MGCP.receive { repeat; }
1291 }
1292}
1293testcase TC_mt_crcx_ran_reject() runs on MTC_CT {
1294 var BSC_ConnHdlr vc_conn;
1295 f_init();
1296
Daniel Willmann4bd99552018-02-02 18:27:14 +01001297 vc_conn := f_start_handler(refers(f_tc_mt_crcx_ran_reject), testcasename(), 31);
Harald Welte812f7a42018-01-27 00:49:18 +01001298 vc_conn.done;
1299}
1300
1301
1302/* Test MT Call T310 timer */
1303private function f_tc_mt_t310(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltead2952e2018-01-27 14:12:46 +01001304 f_init_handler(pars, 200.0);
Harald Welte812f7a42018-01-27 00:49:18 +01001305 var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
1306 var MNCC_PDU mncc;
1307 var MgcpCommand mgcp_cmd;
1308
1309 f_mt_call_start(cpars);
1310
1311 /* MS->MSC: CALL CONFIRMED */
1312 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CALL_CONF(cpars.transaction_id)));
1313 MNCC.receive(tr_MNCC_CALL_CONF_ind(cpars.mncc_callref));
1314
1315 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
1316 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1317 cpars.mgcp_ep := mgcp_cmd.line.ep;
1318 /* FIXME: Respond to CRCX */
1319
1320 /* old libosmocore T310 default timeout is 180s. so let's wait 190 */
1321 timer T := 190.0;
1322 T.start;
1323 alt {
1324 [] T.timeout { setverdict(fail, "Timeout waiting for T310"); self.stop; }
1325 [] MNCC.receive(tr_MNCC_DISC_ind(cpars.mncc_callref)) {
1326 MNCC.send(ts_MNCC_REL_req(cpars.mncc_callref, valueof(ts_MNCC_cause(23))));
1327 }
1328 }
1329 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(cpars.transaction_id)));
1330 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id)));
1331 /* FIXME: We're sending this with TIflag 0: allocated by sender, which is wrong */
1332 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_REL_COMPL(cpars.transaction_id)));
1333
1334 alt {
1335 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1336 BSSAP.send(ts_BSSMAP_ClearComplete);
1337 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1338 setverdict(pass);
1339 }
1340 [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {
1341 MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));
1342 f_create_mgcp_delete_ep(cpars.mgcp_ep);
1343 repeat;
1344 }
1345 }
1346}
1347testcase TC_mt_t310() runs on MTC_CT {
1348 var BSC_ConnHdlr vc_conn;
1349 f_init();
1350
Daniel Willmann4bd99552018-02-02 18:27:14 +01001351 vc_conn := f_start_handler(refers(f_tc_mt_t310), testcasename(), 32);
Harald Welte812f7a42018-01-27 00:49:18 +01001352 vc_conn.done;
1353}
1354
Harald Welte167458a2018-01-27 15:58:16 +01001355/* Perform successful LU + MO call, then GSUP LocationCancel. Subscriber must be denied CM SERV */
1356private function f_tc_gsup_cancel(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1357 f_init_handler(pars);
1358 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1359 cpars.bss_rtp_port := 1110;
1360 cpars.mgcp_connection_id_bss := '22222'H;
1361 cpars.mgcp_connection_id_mss := '33333'H;
1362
1363 /* Location Update to make subscriber known */
Harald Weltede371492018-01-27 23:44:41 +01001364 f_perform_lu(true);
Harald Welte167458a2018-01-27 15:58:16 +01001365
1366 /* First MO call should succeed */
1367 f_mo_call(cpars);
1368
1369 /* Cancel the subscriber in the VLR */
1370 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
1371 alt {
1372 [] GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi)) { }
1373 [] GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi)) {
1374 setverdict(fail, "Received GSUP Location Cancel Error");
1375 self.stop;
1376 }
1377 }
1378
1379 /* Follow-up transactions should fail */
1380 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
1381 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, mi));
1382 f_bssap_compl_l3(l3_info);
1383 alt {
1384 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ)) { }
1385 [] BSSAP.receive {
1386 setverdict(fail, "Received unexpected BSSAP instead of CM SERV REJ");
1387 self.stop;
1388 }
1389 }
1390 setverdict(pass);
1391}
1392testcase TC_gsup_cancel() runs on MTC_CT {
1393 var BSC_ConnHdlr vc_conn;
1394 f_init();
1395
Daniel Willmann4bd99552018-02-02 18:27:14 +01001396 vc_conn := f_start_handler(refers(f_tc_gsup_cancel), testcasename(), 33);
Harald Welte167458a2018-01-27 15:58:16 +01001397 vc_conn.done;
1398}
1399
Harald Welte9de84792018-01-28 01:06:35 +01001400/* A5/1 only permitted on network side, and MS capable to do it */
1401private function f_tc_lu_imsi_auth_tmsi_encr_1_13(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1402 pars.net.expect_auth := true;
1403 pars.net.expect_ciph := true;
1404 pars.net.kc_support := '02'O; /* A5/1 only */
1405 f_init_handler(pars);
1406 f_perform_lu(true);
1407}
1408testcase TC_lu_imsi_auth_tmsi_encr_1_13() runs on MTC_CT {
1409 var BSC_ConnHdlr vc_conn;
1410 f_init();
1411 f_vty_config(MSCVTY, "network", "authentication required");
1412 f_vty_config(MSCVTY, "network", "encryption a5 1");
1413
Daniel Willmann4bd99552018-02-02 18:27:14 +01001414 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_1_13), testcasename(), 34);
Harald Welte9de84792018-01-28 01:06:35 +01001415 vc_conn.done;
1416}
1417
1418/* A5/3 only permitted on network side, and MS capable to do it */
1419private function f_tc_lu_imsi_auth_tmsi_encr_3_13(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1420 pars.net.expect_auth := true;
1421 pars.net.expect_ciph := true;
1422 pars.net.kc_support := '08'O; /* A5/3 only */
1423 f_init_handler(pars);
1424 f_perform_lu(true);
1425}
1426testcase TC_lu_imsi_auth_tmsi_encr_3_13() runs on MTC_CT {
1427 var BSC_ConnHdlr vc_conn;
1428 f_init();
1429 f_vty_config(MSCVTY, "network", "authentication required");
1430 f_vty_config(MSCVTY, "network", "encryption a5 3");
1431
Daniel Willmann4bd99552018-02-02 18:27:14 +01001432 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_3_13), testcasename(), 35);
Harald Welte9de84792018-01-28 01:06:35 +01001433 vc_conn.done;
1434}
1435
1436/* A5/3 only permitted on network side, and MS with only A5/1 support */
1437private function f_tc_lu_imsi_auth_tmsi_encr_3_1(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1438 pars.net.expect_auth := true;
1439 pars.net.expect_ciph := true;
1440 pars.net.kc_support := '08'O; /* A5/3 only */
1441 pars.cm2.classmarkInformationType2_oct5.a5_3 := '0'B;
1442 f_init_handler(pars, 15.0);
1443
1444 /* cannot use f_perform_lu() as we expect a reject */
1445 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
1446 f_create_gsup_expect(hex2str(g_pars.imsi));
1447 f_bssap_compl_l3(l3_lu);
1448 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
1449 f_mm_auth();
1450 alt {
1451 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
1452 [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(?,?)) {
1453 setverdict(fail, "CipherModeCommand despite no A5 intersection");
1454 self.stop;
1455 }
1456 [] BSSAP.receive {
1457 setverdict(inconc, "Unknown/unexpected BSSAP received");
1458 self.stop;
1459 }
1460 }
1461 setverdict(pass);
1462}
1463testcase TC_lu_imsi_auth_tmsi_encr_3_1() runs on MTC_CT {
1464 var BSC_ConnHdlr vc_conn;
1465 f_init();
1466 f_vty_config(MSCVTY, "network", "authentication required");
1467 f_vty_config(MSCVTY, "network", "encryption a5 3");
1468
Daniel Willmann4bd99552018-02-02 18:27:14 +01001469 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_3_1), testcasename(), 36);
Harald Welte9de84792018-01-28 01:06:35 +01001470 vc_conn.done;
1471}
1472
1473/* A5/1 + A5/3 only permitted on network side, and MS with only A5/2 support */
1474private function f_tc_lu_imsi_auth_tmsi_encr_13_2(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1475 pars.net.expect_auth := true;
1476 pars.net.expect_ciph := true;
1477 pars.net.kc_support := '0A'O; /* A5/1 + A5/3 */
1478 pars.cm1.a5_1 := '1'B;
1479 pars.cm2.a5_1 := '1'B;
1480 pars.cm2.classmarkInformationType2_oct5.a5_3 := '0'B;
1481 pars.cm2.classmarkInformationType2_oct5.a5_2 := '1'B;
1482 f_init_handler(pars, 15.0);
1483
1484 /* cannot use f_perform_lu() as we expect a reject */
1485 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
1486 f_create_gsup_expect(hex2str(g_pars.imsi));
1487 f_bssap_compl_l3(l3_lu);
1488 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
1489 f_mm_auth();
1490 alt {
1491 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
1492 [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(?,?)) {
1493 setverdict(fail, "CipherModeCommand despite no A5 intersection");
1494 self.stop;
1495 }
1496 [] BSSAP.receive {
1497 setverdict(inconc, "Unknown/unexpected BSSAP received");
1498 self.stop;
1499 }
1500 }
1501 setverdict(pass);
1502}
1503testcase TC_lu_imsi_auth_tmsi_encr_13_2() runs on MTC_CT {
1504 var BSC_ConnHdlr vc_conn;
1505 f_init();
1506 f_vty_config(MSCVTY, "network", "authentication required");
1507 f_vty_config(MSCVTY, "network", "encryption a5 1 3");
1508
Daniel Willmann4bd99552018-02-02 18:27:14 +01001509 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_13_2), testcasename(), 37);
Harald Welte9de84792018-01-28 01:06:35 +01001510 vc_conn.done;
1511}
1512
1513/* A5/0 + A5/1 + A5/3 only permitted on network side, and MS with only A5/2 support */
1514private function f_tc_lu_imsi_auth_tmsi_encr_013_2(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1515 pars.net.expect_auth := true;
1516 pars.net.expect_ciph := true;
1517 pars.net.kc_support := '0B'O; /* A5/1 + A5/3 */
1518 pars.cm1.a5_1 := '1'B;
1519 pars.cm2.a5_1 := '1'B;
1520 pars.cm2.classmarkInformationType2_oct5.a5_3 := '0'B;
1521 pars.cm2.classmarkInformationType2_oct5.a5_2 := '1'B;
1522 f_init_handler(pars, 15.0);
1523 f_perform_lu(true);
1524}
1525testcase TC_lu_imsi_auth_tmsi_encr_013_2() runs on MTC_CT {
1526 var BSC_ConnHdlr vc_conn;
1527 f_init();
1528 f_vty_config(MSCVTY, "network", "authentication required");
1529 f_vty_config(MSCVTY, "network", "encryption a5 0 1 3");
1530
Daniel Willmann4bd99552018-02-02 18:27:14 +01001531 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_013_2), testcasename(), 38);
Harald Welte9de84792018-01-28 01:06:35 +01001532 vc_conn.done;
1533}
1534
Harald Welte33ec09b2018-02-10 15:34:46 +01001535/* LU followed by MT call (including paging) */
1536private function f_tc_lu_and_mt_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1537 f_init_handler(pars);
1538 //FIXME: odd digits var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1539 var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
1540 cpars.bss_rtp_port := 1110;
1541 cpars.mgcp_connection_id_bss := '10004'H;
1542 cpars.mgcp_connection_id_mss := '10005'H;
1543
1544 f_perform_lu(true);
1545 f_mt_call(cpars);
1546}
1547testcase TC_lu_and_mt_call() runs on MTC_CT {
1548 var BSC_ConnHdlr vc_conn;
1549 f_init();
1550
1551 vc_conn := f_start_handler(refers(f_tc_lu_and_mt_call), testcasename(), 39);
1552 vc_conn.done;
1553}
1554
Daniel Willmann8b084372018-02-04 13:35:26 +01001555/* Test MO Call SETUP with DTMF */
1556private function f_tc_mo_setup_dtmf_dup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1557 f_init_handler(pars);
1558 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1559 cpars.bss_rtp_port := 1110;
1560 cpars.mgcp_connection_id_bss := '22222'H;
1561 cpars.mgcp_connection_id_mss := '33333'H;
1562
1563 f_perform_lu(true);
1564 f_mo_seq_dtmf_dup(cpars);
1565}
1566testcase TC_mo_setup_and_dtmf_dup() runs on MTC_CT {
1567 var BSC_ConnHdlr vc_conn;
1568 f_init();
1569
1570 vc_conn := f_start_handler(refers(f_tc_mo_setup_dtmf_dup), testcasename(), 39);
1571 vc_conn.done;
1572}
Harald Welte9de84792018-01-28 01:06:35 +01001573
1574
Harald Welte12510c52018-01-26 22:26:24 +01001575
Harald Welte45164da2018-01-24 12:51:27 +01001576
Harald Welteba7b6d92018-01-23 21:32:34 +01001577/* TODO:
1578 * continue to send repeated MO signalling messages to keep channel open: does MSC tmeout?
1579 * malformed messages (missing IE, invalid message type): properly rejected?
1580 * MT call while LU or is ongoing: Do we use existing lchan or page while lchan active?
1581 * 3G/2G auth permutations
1582 * encryption algorithms vs. classmark vs. vty config
Harald Welteba7b6d92018-01-23 21:32:34 +01001583 * send new transaction after/during clear (like SMS, ...)
Harald Welte45164da2018-01-24 12:51:27 +01001584 * too long L3 INFO in DTAP
1585 * too long / padded BSSAP
1586 * too long / short TLV values
Harald Welteba7b6d92018-01-23 21:32:34 +01001587 */
Harald Weltef6dd64d2017-11-19 12:09:51 +01001588
1589
1590control {
Harald Weltea49e36e2018-01-21 19:29:33 +01001591 execute( TC_lu_imsi_noauth_tmsi() );
Harald Welted2328a22018-01-27 14:27:16 +01001592 execute( TC_lu_imsi_noauth_notmsi() );
Harald Weltea49e36e2018-01-21 19:29:33 +01001593 execute( TC_lu_imsi_reject() );
1594 execute( TC_lu_imsi_timeout_gsup() );
Harald Welted2328a22018-01-27 14:27:16 +01001595 execute( TC_lu_imsi_auth_tmsi() );
1596 execute( TC_cmserv_imsi_unknown() );
Harald Welte2bb825f2018-01-22 11:31:18 +01001597 execute( TC_lu_and_mo_call() );
Harald Welte071ed732018-01-23 19:53:52 +01001598 execute( TC_lu_auth_sai_timeout() );
1599 execute( TC_lu_auth_sai_err() );
Harald Weltee1a2f3c2018-01-24 17:28:48 +01001600 execute( TC_lu_clear_request() );
1601 execute( TC_lu_disconnect() );
1602 execute( TC_lu_by_imei() );
1603 execute( TC_lu_by_tmsi_noauth_unknown() );
1604 execute( TC_imsi_detach_by_imsi() );
1605 execute( TC_imsi_detach_by_tmsi() );
1606 execute( TC_imsi_detach_by_imei() );
1607 execute( TC_emerg_call_imei_reject() );
1608 execute( TC_emerg_call_imsi() );
1609 execute( TC_cm_serv_req_vgcs_reject() );
1610 execute( TC_cm_serv_req_vbs_reject() );
1611 execute( TC_cm_serv_req_lcs_reject() );
Harald Welte0195ab12018-01-24 21:50:20 +01001612 execute( TC_cm_reest_req_reject() );
Harald Welte1af6ea82018-01-25 18:33:15 +01001613 execute( TC_lu_auth_2G_fail() );
1614 execute( TC_lu_imsi_auth_tmsi_encr_13_13() );
1615 execute( TC_cl3_no_payload() );
1616 execute( TC_cl3_rnd_payload() );
Harald Welte1852a842018-01-26 22:53:36 +01001617 execute( TC_establish_and_nothing() );
1618 execute( TC_mo_setup_and_nothing() );
1619 execute( TC_mo_crcx_ran_timeout() );
1620 execute( TC_mo_crcx_ran_reject() );
Harald Welted2328a22018-01-27 14:27:16 +01001621 execute( TC_mt_crcx_ran_reject() );
Daniel Willmann8b084372018-02-04 13:35:26 +01001622 execute( TC_mo_setup_and_dtmf_dup() );
Harald Welteaa54cf82018-01-30 08:15:32 +01001623 //execute( TC_mt_t310() );
Harald Welte167458a2018-01-27 15:58:16 +01001624 execute( TC_gsup_cancel() );
Harald Welte9de84792018-01-28 01:06:35 +01001625 execute( TC_lu_imsi_auth_tmsi_encr_1_13() );
1626 execute( TC_lu_imsi_auth_tmsi_encr_3_13() );
1627 execute( TC_lu_imsi_auth_tmsi_encr_3_1() );
1628 execute( TC_lu_imsi_auth_tmsi_encr_13_2() );
1629 execute( TC_lu_imsi_auth_tmsi_encr_013_2() );
Harald Welte33ec09b2018-02-10 15:34:46 +01001630
1631 execute( TC_lu_and_mt_call() );
1632
Harald Weltef6dd64d2017-11-19 12:09:51 +01001633}
1634
1635
1636}