blob: 7347cafcc5a014387e5ea98df7bc09f7c5cc3def [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 Hofmeyre9b8eeb2018-03-01 20:29:58 +0100341function f_start_handler(void_fn fn, integer imsi_suffix) runs on MTC_CT return BSC_ConnHdlr {
Harald Weltea49e36e2018-01-21 19:29:33 +0100342 var BSC_ConnHdlr vc_conn;
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100343 var charstring id := testcasename();
Harald Weltede371492018-01-27 23:44:41 +0100344 var BSC_ConnHdlrNetworkPars net_pars := {
345 kc_support := '0A'O, /* A5/1 and A5/3 enabled */
346 expect_tmsi := true,
347 expect_auth := false,
348 expect_ciph := false
349 };
Harald Weltea49e36e2018-01-21 19:29:33 +0100350 var BSC_ConnHdlrPars pars := {
Harald Weltea4ca4462018-02-09 00:17:14 +0100351 sccp_addr_own := g_bssap.sccp_addr_own,
352 sccp_addr_peer := g_bssap.sccp_addr_peer,
Harald Weltea49e36e2018-01-21 19:29:33 +0100353 cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42)),
Harald Welte81b7f9d2018-01-24 19:06:24 +0100354 imei := f_gen_imei(imsi_suffix),
355 imsi := f_gen_imsi(imsi_suffix),
356 msisdn := f_gen_msisdn(imsi_suffix),
Harald Welte256571e2018-01-24 18:47:19 +0100357 tmsi := omit,
Harald Welte9de84792018-01-28 01:06:35 +0100358 cm1 := valueof(ts_CM1),
Harald Welte82600572018-01-21 20:54:08 +0100359 cm2 := valueof(ts_CM2_default),
Harald Welte16114282018-01-24 22:41:21 +0100360 cm3 := omit,
Harald Weltede371492018-01-27 23:44:41 +0100361 vec := omit,
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100362 net := net_pars,
363 send_early_cm := true
Harald Weltea49e36e2018-01-21 19:29:33 +0100364 };
365
366 vc_conn := BSC_ConnHdlr.create(id);
367 /* BSSMAP part / A interface */
Harald Weltea4ca4462018-02-09 00:17:14 +0100368 connect(vc_conn:BSSAP, g_bssap.vc_BSSMAP:CLIENT);
369 connect(vc_conn:BSSAP_PROC, g_bssap.vc_BSSMAP:PROC);
Harald Weltea49e36e2018-01-21 19:29:33 +0100370 /* MNCC part */
371 connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);
372 connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);
Harald Welte4aa970c2018-01-26 10:38:09 +0100373 /* MGCP part */
374 connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);
375 connect(vc_conn:MGCP_PROC, vc_MGCP:MGCP_PROC);
Harald Weltea49e36e2018-01-21 19:29:33 +0100376 /* GSUP part */
377 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
378 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
379
Harald Weltea10db902018-01-27 12:44:49 +0100380 /* We cannot use vc_conn.start(f_init_handler(fn, id, pars)); as we cannot have
381 * a stand-alone 'derefers()' call, see https://www.eclipse.org/forums/index.php/t/1091364/ */
Harald Weltea49e36e2018-01-21 19:29:33 +0100382 vc_conn.start(derefers(fn)(id, pars));
383 return vc_conn;
384}
385
Harald Weltea49e36e2018-01-21 19:29:33 +0100386private function f_tc_lu_imsi_noauth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100387 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100388 f_perform_lu();
Harald Weltea49e36e2018-01-21 19:29:33 +0100389}
Harald Weltea49e36e2018-01-21 19:29:33 +0100390testcase TC_lu_imsi_noauth_tmsi() runs on MTC_CT {
391 var BSC_ConnHdlr vc_conn;
392 f_init();
393
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100394 vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_tmsi), 1);
Harald Weltea49e36e2018-01-21 19:29:33 +0100395 vc_conn.done;
396}
397
398private function f_tc_lu_imsi_noauth_notmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltede371492018-01-27 23:44:41 +0100399 pars.net.expect_tmsi := false;
Harald Weltea10db902018-01-27 12:44:49 +0100400 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100401 f_perform_lu();
Harald Weltea49e36e2018-01-21 19:29:33 +0100402}
Harald Weltea49e36e2018-01-21 19:29:33 +0100403testcase TC_lu_imsi_noauth_notmsi() runs on MTC_CT {
404 var BSC_ConnHdlr vc_conn;
405 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100406 f_vty_config(MSCVTY, "msc", "no assign-tmsi");
Harald Weltea49e36e2018-01-21 19:29:33 +0100407
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100408 vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_notmsi), 2);
Harald Weltea49e36e2018-01-21 19:29:33 +0100409 vc_conn.done;
410}
411
412/* Do LU by IMSI, refuse it on GSUP and expect LU REJ back to MS */
413private function f_tc_lu_imsi_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100414 f_init_handler(pars);
Harald Weltea49e36e2018-01-21 19:29:33 +0100415 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
416
417 f_create_gsup_expect(hex2str(g_pars.imsi));
418 f_bssap_compl_l3(l3_lu);
419 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
420 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 23));
421 alt {
422 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej(int2oct(23,1)))) { }
423 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
424 setverdict(fail, "Expecting LU REJ, but got ACCEPT");
425 self.stop;
426 }
427 }
Harald Welte1ddc7162018-01-27 14:25:46 +0100428 f_expect_clear();
Harald Weltea49e36e2018-01-21 19:29:33 +0100429}
430testcase TC_lu_imsi_reject() runs on MTC_CT {
431 var BSC_ConnHdlr vc_conn;
432 f_init();
433
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100434 vc_conn := f_start_handler(refers(f_tc_lu_imsi_reject), 3);
Harald Weltea49e36e2018-01-21 19:29:33 +0100435 vc_conn.done;
436}
437
438/* Do LU by IMSI, timeout on GSUP */
439private function f_tc_lu_imsi_timeout_gsup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100440 f_init_handler(pars);
Harald Weltea49e36e2018-01-21 19:29:33 +0100441 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
442
443 f_create_gsup_expect(hex2str(g_pars.imsi));
444 f_bssap_compl_l3(l3_lu);
445 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
446 /* Normally the HLR would need to respond here, but we decide to force a timeout here */
447 alt {
448 /* FIXME: Expect specific reject cause */
449 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
450 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
451 setverdict(fail, "Expecting LU REJ, but got ACCEPT");
452 self.stop;
453 }
454 }
Harald Welte1ddc7162018-01-27 14:25:46 +0100455 f_expect_clear();
Harald Weltea49e36e2018-01-21 19:29:33 +0100456}
457testcase TC_lu_imsi_timeout_gsup() runs on MTC_CT {
458 var BSC_ConnHdlr vc_conn;
459 f_init();
460
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100461 vc_conn := f_start_handler(refers(f_tc_lu_imsi_timeout_gsup), 4);
Harald Weltea49e36e2018-01-21 19:29:33 +0100462 vc_conn.done;
463}
464
Harald Welte7b1b2812018-01-22 21:23:06 +0100465private function f_tc_lu_imsi_auth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltede371492018-01-27 23:44:41 +0100466 pars.net.expect_auth := true;
Harald Weltea10db902018-01-27 12:44:49 +0100467 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100468 f_perform_lu();
Harald Welte7b1b2812018-01-22 21:23:06 +0100469}
470testcase TC_lu_imsi_auth_tmsi() runs on MTC_CT {
471 var BSC_ConnHdlr vc_conn;
472 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100473 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte7b1b2812018-01-22 21:23:06 +0100474
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100475 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi), 5);
Harald Welte7b1b2812018-01-22 21:23:06 +0100476 vc_conn.done;
477}
478
Harald Weltea49e36e2018-01-21 19:29:33 +0100479
480/* Send CM SERVICE REQ for IMSI that has never performed LU before */
481private function f_tc_cmserv_imsi_unknown(charstring id, BSC_ConnHdlrPars pars)
482runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100483 f_init_handler(pars);
Harald Weltea49e36e2018-01-21 19:29:33 +0100484
485 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
486 var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100487 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, mi));
Harald Weltea49e36e2018-01-21 19:29:33 +0100488
489 f_create_gsup_expect(hex2str(g_pars.imsi));
490
491 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
492 f_bssap_compl_l3(l3_info);
493
494 timer T := 10.0;
Harald Weltef6dd64d2017-11-19 12:09:51 +0100495 T.start;
496 alt {
Harald Weltea49e36e2018-01-21 19:29:33 +0100497 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ)) { }
498 //[] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC)) { }
499 [] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
500 [] GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
501 setverdict(fail, "Unexpected GSUP UL REQ");
502 }
Daniel Willmann90829d62018-02-15 17:45:14 +0100503 [] T.timeout { setverdict(fail, "Timeout waiting for CM SERV REQ"); }
Harald Weltef6dd64d2017-11-19 12:09:51 +0100504 }
505
Harald Welte1ddc7162018-01-27 14:25:46 +0100506 f_expect_clear();
Harald Weltef6dd64d2017-11-19 12:09:51 +0100507}
Harald Weltea49e36e2018-01-21 19:29:33 +0100508testcase TC_cmserv_imsi_unknown() runs on MTC_CT {
509 var BSC_ConnHdlr vc_conn;
510 f_init();
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100511 vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), 6);
Harald Weltea49e36e2018-01-21 19:29:33 +0100512 vc_conn.done;
513}
514
Harald Welte2bb825f2018-01-22 11:31:18 +0100515private function f_tc_lu_and_mo_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100516 f_init_handler(pars);
Harald Welteb71901a2018-01-26 19:16:05 +0100517 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
518 cpars.bss_rtp_port := 1110;
519 cpars.mgcp_connection_id_bss := '22222'H;
520 cpars.mgcp_connection_id_mss := '33333'H;
Harald Welte2bb825f2018-01-22 11:31:18 +0100521
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100522 f_perform_lu();
Harald Welteb71901a2018-01-26 19:16:05 +0100523 f_mo_call(cpars);
Harald Welte2bb825f2018-01-22 11:31:18 +0100524}
525testcase TC_lu_and_mo_call() runs on MTC_CT {
526 var BSC_ConnHdlr vc_conn;
527 f_init();
528
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100529 vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), 7);
Harald Welte071ed732018-01-23 19:53:52 +0100530 vc_conn.done;
531}
532
533/* Test LU (with authentication enabled), where HLR times out sending SAI response */
534private function f_tc_lu_auth_sai_timeout(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100535 f_init_handler(pars);
Harald Welte071ed732018-01-23 19:53:52 +0100536
537 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
538 var PDU_DTAP_MT dtap_mt;
539
540 /* tell GSUP dispatcher to send this IMSI to us */
541 f_create_gsup_expect(hex2str(g_pars.imsi));
542
543 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
544 f_bssap_compl_l3(l3_lu);
545
546 /* Send Early Classmark, just for the fun of it */
547 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
548
549 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
550 /* The HLR would normally return an auth vector here, but we fail to do so. */
551
552 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej));
Harald Welte1ddc7162018-01-27 14:25:46 +0100553 f_expect_clear();
Harald Welte071ed732018-01-23 19:53:52 +0100554}
555testcase TC_lu_auth_sai_timeout() runs on MTC_CT {
556 var BSC_ConnHdlr vc_conn;
557 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100558 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte071ed732018-01-23 19:53:52 +0100559
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100560 vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_timeout), 8);
Harald Welte071ed732018-01-23 19:53:52 +0100561 vc_conn.done;
562}
563
564/* Test LU (with authentication enabled), where HLR rejects sending SAI error */
565private function f_tc_lu_auth_sai_err(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100566 f_init_handler(pars);
Harald Welte071ed732018-01-23 19:53:52 +0100567
568 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
569 var PDU_DTAP_MT dtap_mt;
570
571 /* tell GSUP dispatcher to send this IMSI to us */
572 f_create_gsup_expect(hex2str(g_pars.imsi));
573
574 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
575 f_bssap_compl_l3(l3_lu);
576
577 /* Send Early Classmark, just for the fun of it */
578 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
579
580 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
581 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 13));
582
583 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej));
Harald Welte1ddc7162018-01-27 14:25:46 +0100584 f_expect_clear();
Harald Welte071ed732018-01-23 19:53:52 +0100585}
586testcase TC_lu_auth_sai_err() runs on MTC_CT {
587 var BSC_ConnHdlr vc_conn;
588 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100589 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte071ed732018-01-23 19:53:52 +0100590
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100591 vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_err), 9);
Harald Welte2bb825f2018-01-22 11:31:18 +0100592 vc_conn.done;
593}
Harald Weltea49e36e2018-01-21 19:29:33 +0100594
Harald Weltebc881782018-01-23 20:09:15 +0100595/* Test LU but BSC will send a clear request in the middle */
596private function f_tc_lu_clear_request(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100597 f_init_handler(pars);
Harald Weltebc881782018-01-23 20:09:15 +0100598
599 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
600 var PDU_DTAP_MT dtap_mt;
601
602 /* tell GSUP dispatcher to send this IMSI to us */
603 f_create_gsup_expect(hex2str(g_pars.imsi));
604
605 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
606 f_bssap_compl_l3(l3_lu);
607
608 /* Send Early Classmark, just for the fun of it */
609 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
610
611 f_sleep(1.0);
612 /* send clear request in the middle of the LU */
613 BSSAP.send(ts_BSSMAP_ClearRequest(0));
614 BSSAP.receive(tr_BSSMAP_ClearCommand);
615 BSSAP.send(ts_BSSMAP_ClearComplete);
Harald Welte89a32492018-01-27 19:07:28 +0100616 alt {
617 /* See https://osmocom.org/issues/2862 */
618 [] BSSAP.receive(tr_BSSMAP_ClearCommand) { repeat; }
619 [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
620 }
Harald Weltebc881782018-01-23 20:09:15 +0100621 setverdict(pass);
622}
623testcase TC_lu_clear_request() runs on MTC_CT {
624 var BSC_ConnHdlr vc_conn;
625 f_init();
626
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100627 vc_conn := f_start_handler(refers(f_tc_lu_clear_request), 10);
Harald Weltebc881782018-01-23 20:09:15 +0100628 vc_conn.done;
629}
630
Harald Welte66af9e62018-01-24 17:28:21 +0100631/* Test LU but BSC will send a clear request in the middle */
632private function f_tc_lu_disconnect(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100633 f_init_handler(pars);
Harald Welte66af9e62018-01-24 17:28:21 +0100634
635 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
636 var PDU_DTAP_MT dtap_mt;
637
638 /* tell GSUP dispatcher to send this IMSI to us */
639 f_create_gsup_expect(hex2str(g_pars.imsi));
640
641 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
642 f_bssap_compl_l3(l3_lu);
643
644 /* Send Early Classmark, just for the fun of it */
645 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
646
647 f_sleep(1.0);
648 /* send clear request in the middle of the LU */
649 BSSAP.send(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
650 setverdict(pass);
651}
652testcase TC_lu_disconnect() runs on MTC_CT {
653 var BSC_ConnHdlr vc_conn;
654 f_init();
655
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100656 vc_conn := f_start_handler(refers(f_tc_lu_disconnect), 11);
Harald Welte66af9e62018-01-24 17:28:21 +0100657 vc_conn.done;
658}
659
660
Harald Welteba7b6d92018-01-23 21:32:34 +0100661/* Test LU but with illegal mobile identity type = IMEI */
662private function f_tc_lu_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100663 f_init_handler(pars);
Harald Welteba7b6d92018-01-23 21:32:34 +0100664
Harald Welte256571e2018-01-24 18:47:19 +0100665 var PDU_ML3_MS_NW l3_lu := f_build_lu_imei(g_pars.imei)
Harald Welteba7b6d92018-01-23 21:32:34 +0100666 var PDU_DTAP_MT dtap_mt;
667
668 /* tell GSUP dispatcher to send this IMSI to us */
669 f_create_gsup_expect(hex2str(g_pars.imsi));
670
671 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
672 f_bssap_compl_l3(l3_lu);
673
674 /* Send Early Classmark, just for the fun of it */
675 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
676 /* wait for LU reject, ignore any ID REQ */
677 alt {
678 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
679 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_ID_Req)) { repeat; }
680 }
681 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100682 f_expect_clear();
Harald Welteba7b6d92018-01-23 21:32:34 +0100683}
684testcase TC_lu_by_imei() runs on MTC_CT {
685 var BSC_ConnHdlr vc_conn;
686 f_init();
687
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100688 vc_conn := f_start_handler(refers(f_tc_lu_by_imei), 12);
Harald Welteba7b6d92018-01-23 21:32:34 +0100689 vc_conn.done;
690}
691
692/* Test LU by TMSI with unknown TMSI, expect (and answer) ID REQ. */
693private function f_tc_lu_tmsi_noauth_unknown(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100694 f_init_handler(pars);
Harald Welteba7b6d92018-01-23 21:32:34 +0100695
696 var PDU_ML3_MS_NW l3_lu := f_build_lu_tmsi('01020304'O); /* FIXME: Random */
697 var PDU_DTAP_MT dtap_mt;
698
699 /* tell GSUP dispatcher to send this IMSI to us */
700 f_create_gsup_expect(hex2str(g_pars.imsi));
701
702 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
703 f_bssap_compl_l3(l3_lu);
704
705 /* Send Early Classmark, just for the fun of it */
706 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
707
708 /* Wait for + respond to ID REQ (IMSI) */
709 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_ID_Req('001'B)));
710 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_MM_ID_Rsp_IMSI(g_pars.imsi)));
711
712 /* Expect MSC to do UpdateLocation to HLR; respond to it */
713 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
714 GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
715 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
716 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
717
718 alt {
Harald Welte7ec4fa82018-01-27 10:57:40 +0100719 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
720 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_TmsiRealloc_Cmpl));
721 }
Harald Welteba7b6d92018-01-23 21:32:34 +0100722 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {
723 setverdict(fail, "Expected LU ACK, but received REJ");
724 }
725 }
726
727 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100728 f_expect_clear();
Harald Welteba7b6d92018-01-23 21:32:34 +0100729}
730testcase TC_lu_by_tmsi_noauth_unknown() runs on MTC_CT {
731 var BSC_ConnHdlr vc_conn;
732 f_init();
733
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100734 vc_conn := f_start_handler(refers(f_tc_lu_tmsi_noauth_unknown), 13);
Harald Welteba7b6d92018-01-23 21:32:34 +0100735 vc_conn.done;
736}
737
738
Harald Welte45164da2018-01-24 12:51:27 +0100739/* Test IMSI DETACH (MI=IMSI) */
740private function f_tc_imsi_detach_by_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100741 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100742
743 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
744
745 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
746 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
747
748 /* Send Early Classmark, just for the fun of it? */
749 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
750
751 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100752 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100753}
754testcase TC_imsi_detach_by_imsi() runs on MTC_CT {
755 var BSC_ConnHdlr vc_conn;
756 f_init();
757
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100758 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imsi), 14);
Harald Welte45164da2018-01-24 12:51:27 +0100759 vc_conn.done;
760}
761
762/* Test IMSI DETACH (MI=TMSI) */
763private function f_tc_imsi_detach_by_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100764 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100765
766 var MobileIdentityLV mi := valueof(ts_MI_TMSI_LV('01020304'O));
767
768 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
769 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
770
771 /* Send Early Classmark, just for the fun of it? */
772 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
773
774 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100775 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100776}
777testcase TC_imsi_detach_by_tmsi() runs on MTC_CT {
778 var BSC_ConnHdlr vc_conn;
779 f_init();
780
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100781 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_tmsi), 15);
Harald Welte45164da2018-01-24 12:51:27 +0100782 vc_conn.done;
783}
784
785/* Test IMSI DETACH (MI=IMEI), which is illegal */
786private function f_tc_imsi_detach_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100787 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100788
Harald Welte256571e2018-01-24 18:47:19 +0100789 var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Harald Welte45164da2018-01-24 12:51:27 +0100790
791 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
792 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
793
794 /* Send Early Classmark, just for the fun of it? */
795 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
796
797 /* wait for normal teardown */
Harald Welte1ddc7162018-01-27 14:25:46 +0100798 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100799}
800testcase TC_imsi_detach_by_imei() runs on MTC_CT {
801 var BSC_ConnHdlr vc_conn;
802 f_init();
803
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100804 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imei), 16);
Harald Welte45164da2018-01-24 12:51:27 +0100805 vc_conn.done;
806}
807
808
809/* helper function for an emergency call. caller passes in mobile identity to use */
810private function f_emerg_call(MobileIdentityLV mi) runs on BSC_ConnHdlr {
Harald Welte0bef21e2018-02-10 09:48:23 +0100811 var CallParameters cpars := valueof(t_CallParams('112'H, 0));
812 cpars.emergency := true;
Harald Welte45164da2018-01-24 12:51:27 +0100813
Harald Welte0bef21e2018-02-10 09:48:23 +0100814 f_mo_call(cpars);
Harald Welte45164da2018-01-24 12:51:27 +0100815}
816
817/* establish an emergency call by IMEI, no SIM inserted (and hence no IMSI) */
818private function f_tc_emerg_call_imei_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100819 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100820
Harald Welte256571e2018-01-24 18:47:19 +0100821 var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100822 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_EMERG_CALL, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100823 f_bssap_compl_l3(l3_info);
824 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ('05'O)));
Harald Welte1ddc7162018-01-27 14:25:46 +0100825 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100826}
827testcase TC_emerg_call_imei_reject() runs on MTC_CT {
828 var BSC_ConnHdlr vc_conn;
829 f_init();
830
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100831 vc_conn := f_start_handler(refers(f_tc_emerg_call_imei_reject), 17);
Harald Welte45164da2018-01-24 12:51:27 +0100832 vc_conn.done;
833}
834
Harald Welted5b91402018-01-24 18:48:16 +0100835/* establish an emergency call by IMSI, SIM inserted (and hence IMSI) */
Harald Welte45164da2018-01-24 12:51:27 +0100836private function f_tc_emerg_call_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100837 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100838 /* First perform location update to ensure subscriber is known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100839 f_perform_lu();
Harald Welte45164da2018-01-24 12:51:27 +0100840 /* Then issue emergency call identified by IMSI */
841 f_emerg_call(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
842}
843testcase TC_emerg_call_imsi() runs on MTC_CT {
844 var BSC_ConnHdlr vc_conn;
845 f_init();
846
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100847 vc_conn := f_start_handler(refers(f_tc_emerg_call_imsi), 18);
Harald Welte45164da2018-01-24 12:51:27 +0100848 vc_conn.done;
849}
850
851/* CM Service Request for VGCS -> reject */
852private function f_tc_cm_serv_req_vgcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100853 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100854
855 /* First perform location update to ensure subscriber is known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100856 f_perform_lu();
Harald Welte45164da2018-01-24 12:51:27 +0100857
858 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100859 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_VGCS, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100860 f_bssap_compl_l3(l3_info);
861 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100862 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100863}
864testcase TC_cm_serv_req_vgcs_reject() runs on MTC_CT {
865 var BSC_ConnHdlr vc_conn;
866 f_init();
867
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100868 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vgcs_reject), 19);
Harald Welte45164da2018-01-24 12:51:27 +0100869 vc_conn.done;
870}
871
872/* CM Service Request for VBS -> reject */
873private function f_tc_cm_serv_req_vbs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100874 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100875
876 /* First perform location update to ensure subscriber is known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100877 f_perform_lu();
Harald Welte45164da2018-01-24 12:51:27 +0100878
879 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100880 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_VBS, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100881 f_bssap_compl_l3(l3_info);
882 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100883 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100884}
885testcase TC_cm_serv_req_vbs_reject() runs on MTC_CT {
886 var BSC_ConnHdlr vc_conn;
887 f_init();
888
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100889 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vbs_reject), 20);
Harald Welte45164da2018-01-24 12:51:27 +0100890 vc_conn.done;
891}
892
893/* CM Service Request for LCS -> reject */
894private function f_tc_cm_serv_req_lcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100895 f_init_handler(pars);
Harald Welte45164da2018-01-24 12:51:27 +0100896
897 /* First perform location update to ensure subscriber is known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100898 f_perform_lu();
Harald Welte45164da2018-01-24 12:51:27 +0100899
900 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Harald Welte6ed6bf92018-01-24 21:09:15 +0100901 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_LCS, mi));
Harald Welte45164da2018-01-24 12:51:27 +0100902 f_bssap_compl_l3(l3_info);
903 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100904 f_expect_clear();
Harald Welte45164da2018-01-24 12:51:27 +0100905}
906testcase TC_cm_serv_req_lcs_reject() runs on MTC_CT {
907 var BSC_ConnHdlr vc_conn;
908 f_init();
909
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100910 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_lcs_reject), 21);
Harald Welte45164da2018-01-24 12:51:27 +0100911 vc_conn.done;
912}
913
Harald Welte0195ab12018-01-24 21:50:20 +0100914/* CM Re-Establishment Request */
915private function f_tc_cm_reest_req_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100916 f_init_handler(pars);
Harald Welte0195ab12018-01-24 21:50:20 +0100917
918 /* First perform location update to ensure subscriber is known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100919 f_perform_lu();
Harald Welte0195ab12018-01-24 21:50:20 +0100920
921 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
922 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_REEST_REQ(0, mi));
923 f_bssap_compl_l3(l3_info);
924 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
Harald Welte1ddc7162018-01-27 14:25:46 +0100925 f_expect_clear();
Harald Welte0195ab12018-01-24 21:50:20 +0100926}
927testcase TC_cm_reest_req_reject() runs on MTC_CT {
928 var BSC_ConnHdlr vc_conn;
929 f_init();
Harald Welte0195ab12018-01-24 21:50:20 +0100930
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100931 vc_conn := f_start_handler(refers(f_tc_cm_reest_req_reject), 22);
Harald Welte0195ab12018-01-24 21:50:20 +0100932 vc_conn.done;
933}
934
Harald Weltec638f4d2018-01-24 22:00:36 +0100935/* Test LU (with authentication enabled), with wrong response from MS */
936private function f_tc_lu_auth_2G_fail(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100937 f_init_handler(pars);
Harald Weltec638f4d2018-01-24 22:00:36 +0100938
939 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
940
941 /* tell GSUP dispatcher to send this IMSI to us */
942 f_create_gsup_expect(hex2str(g_pars.imsi));
943
944 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
945 f_bssap_compl_l3(l3_lu);
946
947 /* Send Early Classmark, just for the fun of it */
948 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
949
950 var AuthVector vec := f_gen_auth_vec_2g();
951 var GSUP_IE auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(vec.rand, vec.sres, vec.kc));
952 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
953 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
954
955 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_AUTH_REQ(vec.rand)));
956 /* Send back wrong auth response */
957 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MT_MM_AUTH_RESP_2G('00000000'O)));
958
959 /* Expect GSUP AUTH FAIL REP to HLR */
960 GSUP.receive(tr_GSUP_AUTH_FAIL_IND(g_pars.imsi));
961
962 /* Expect LU REJECT with Cause == Illegal MS */
963 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej('03'O)));
Harald Welte1ddc7162018-01-27 14:25:46 +0100964 f_expect_clear();
Harald Weltec638f4d2018-01-24 22:00:36 +0100965}
966testcase TC_lu_auth_2G_fail() runs on MTC_CT {
967 var BSC_ConnHdlr vc_conn;
968 f_init();
969 f_vty_config(MSCVTY, "network", "authentication required");
Harald Weltec638f4d2018-01-24 22:00:36 +0100970
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100971 vc_conn := f_start_handler(refers(f_tc_lu_auth_2G_fail), 23);
Harald Weltec638f4d2018-01-24 22:00:36 +0100972 vc_conn.done;
973}
974
Harald Weltede371492018-01-27 23:44:41 +0100975/* A5/1 + A5/3 permitted on network side, and MS capable to do it */
Harald Welte16114282018-01-24 22:41:21 +0100976private 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 +0100977 pars.net.expect_auth := true;
978 pars.net.expect_ciph := true;
Harald Weltea10db902018-01-27 12:44:49 +0100979 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +0100980 f_perform_lu();
Harald Welte16114282018-01-24 22:41:21 +0100981}
982testcase TC_lu_imsi_auth_tmsi_encr_13_13() runs on MTC_CT {
983 var BSC_ConnHdlr vc_conn;
984 f_init();
985 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte16114282018-01-24 22:41:21 +0100986 f_vty_config(MSCVTY, "network", "encryption a5 1 3");
987
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +0100988 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_13_13), 24);
Harald Welte16114282018-01-24 22:41:21 +0100989 vc_conn.done;
990}
991
Harald Welte1af6ea82018-01-25 18:33:15 +0100992/* Test Complete L3 without payload */
993private function f_tc_cl3_no_payload(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +0100994 f_init_handler(pars);
Harald Welte1af6ea82018-01-25 18:33:15 +0100995
996 /* Send Complete L3 Info with empty L3 frame */
997 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
998 valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, ''O))));
999
Harald Weltef466eb42018-01-27 14:26:54 +01001000 timer T := 5.0;
1001 T.start;
Harald Welte1af6ea82018-01-25 18:33:15 +01001002 alt {
1003 [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
1004 /* Expect LU REJECT with Cause == Illegal MS */
1005 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1006 BSSAP.send(ts_BSSMAP_ClearComplete);
1007 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1008 }
Harald Weltef466eb42018-01-27 14:26:54 +01001009 [] T.timeout {
Daniel Willmann90829d62018-02-15 17:45:14 +01001010 setverdict(fail, "Timeout waiting for ClearCommand or SCCP Release");
Harald Weltef466eb42018-01-27 14:26:54 +01001011 self.stop;
1012 }
Harald Welte1af6ea82018-01-25 18:33:15 +01001013 }
1014 setverdict(pass);
1015}
1016testcase TC_cl3_no_payload() runs on MTC_CT {
1017 var BSC_ConnHdlr vc_conn;
1018 f_init();
1019
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001020 vc_conn := f_start_handler(refers(f_tc_cl3_no_payload), 25);
Harald Welte1af6ea82018-01-25 18:33:15 +01001021 vc_conn.done;
1022}
1023
1024/* Test Complete L3 with random payload */
1025private function f_tc_cl3_rnd_payload(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001026 f_init_handler(pars);
Harald Welte1af6ea82018-01-25 18:33:15 +01001027
1028 var integer len := float2int(rnd() * 256.0);
1029 var octetstring payl := f_rnd_octstring(len);
1030
1031 /* Send Complete L3 Info with empty L3 frame */
1032 BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
1033 valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, payl))));
1034
Harald Weltef466eb42018-01-27 14:26:54 +01001035 timer T := 5.0;
1036 T.start;
Harald Welte1af6ea82018-01-25 18:33:15 +01001037 alt {
1038 /* Immediate disconnect */
1039 [] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
1040 /* Expect LU REJECT with Cause == Illegal MS */
1041 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1042 BSSAP.send(ts_BSSMAP_ClearComplete);
1043 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1044 }
1045 [] BSSAP.receive(tr_PDU_DTAP_MT(?)) { repeat; }
Harald Weltef466eb42018-01-27 14:26:54 +01001046 [] T.timeout {
Daniel Willmann90829d62018-02-15 17:45:14 +01001047 setverdict(fail, "Timeout waiting for ClearCommand or SCCP Release");
Harald Weltef466eb42018-01-27 14:26:54 +01001048 self.stop;
1049 }
Harald Welte1af6ea82018-01-25 18:33:15 +01001050 }
1051 setverdict(pass);
1052}
1053testcase TC_cl3_rnd_payload() runs on MTC_CT {
1054 var BSC_ConnHdlr vc_conn;
1055 f_init();
1056
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001057 vc_conn := f_start_handler(refers(f_tc_cl3_rnd_payload), 26);
Harald Welte1af6ea82018-01-25 18:33:15 +01001058 vc_conn.done;
1059}
1060
Harald Welte116e4332018-01-26 22:17:48 +01001061/* Test Complete L3 with random payload */
1062private function f_tc_establish_and_nothing(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001063 f_init_handler(pars);
Harald Welte116e4332018-01-26 22:17:48 +01001064
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001065 f_perform_lu();
Harald Welte116e4332018-01-26 22:17:48 +01001066
Harald Weltede371492018-01-27 23:44:41 +01001067 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte1ddc7162018-01-27 14:25:46 +01001068 f_expect_clear();
Harald Welte116e4332018-01-26 22:17:48 +01001069}
1070testcase TC_establish_and_nothing() runs on MTC_CT {
1071 var BSC_ConnHdlr vc_conn;
1072 f_init();
1073
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001074 vc_conn := f_start_handler(refers(f_tc_establish_and_nothing), 27);
Harald Welte116e4332018-01-26 22:17:48 +01001075 vc_conn.done;
1076}
1077
Harald Welte12510c52018-01-26 22:26:24 +01001078/* Test MO Call SETUP with no response from MNCC */
1079private function f_tc_mo_setup_and_nothing(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001080 f_init_handler(pars);
1081
Harald Welte12510c52018-01-26 22:26:24 +01001082 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1083
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001084 f_perform_lu();
Harald Welte12510c52018-01-26 22:26:24 +01001085
Harald Weltede371492018-01-27 23:44:41 +01001086 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte12510c52018-01-26 22:26:24 +01001087 f_create_mncc_expect(hex2str(cpars.called_party));
1088 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1089
1090 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
1091
Harald Welte1ddc7162018-01-27 14:25:46 +01001092 f_expect_clear(30.0);
Harald Welte12510c52018-01-26 22:26:24 +01001093}
1094testcase TC_mo_setup_and_nothing() runs on MTC_CT {
1095 var BSC_ConnHdlr vc_conn;
1096 f_init();
1097
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001098 vc_conn := f_start_handler(refers(f_tc_mo_setup_and_nothing), 28);
Harald Welte12510c52018-01-26 22:26:24 +01001099 vc_conn.done;
1100}
1101
Harald Welte3ab88002018-01-26 22:37:25 +01001102/* Test MO Call with no response to RAN-side CRCX */
1103private function f_tc_mo_crcx_ran_timeout(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001104 f_init_handler(pars);
Harald Welte3ab88002018-01-26 22:37:25 +01001105 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1106 var MNCC_PDU mncc;
1107 var MgcpCommand mgcp_cmd;
1108
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001109 f_perform_lu();
Harald Welte3ab88002018-01-26 22:37:25 +01001110
Harald Weltede371492018-01-27 23:44:41 +01001111 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte3ab88002018-01-26 22:37:25 +01001112 f_create_mncc_expect(hex2str(cpars.called_party));
1113 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1114
1115 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
1116 MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc;
1117 cpars.mncc_callref := mncc.u.signal.callref;
1118 MNCC.send(ts_MNCC_CALL_PROC_req(cpars.mncc_callref, cpars.mncc_bearer_cap));
1119 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(cpars.transaction_id)));
1120
1121 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
Harald Welte1852a842018-01-26 22:53:36 +01001122 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1123 cpars.mgcp_ep := mgcp_cmd.line.ep;
Harald Welte3ab88002018-01-26 22:37:25 +01001124 /* never respond to this */
1125
Harald Welte1ddc7162018-01-27 14:25:46 +01001126 f_expect_clear(30.0);
Harald Welte3ab88002018-01-26 22:37:25 +01001127}
1128testcase TC_mo_crcx_ran_timeout() runs on MTC_CT {
1129 var BSC_ConnHdlr vc_conn;
1130 f_init();
1131
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001132 vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_timeout), 29);
Harald Welte3ab88002018-01-26 22:37:25 +01001133 vc_conn.done;
1134}
1135
Harald Welte0cc82d92018-01-26 22:52:34 +01001136/* Test MO Call with reject to RAN-side CRCX */
1137private function f_tc_mo_crcx_ran_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001138 f_init_handler(pars);
Harald Welte0cc82d92018-01-26 22:52:34 +01001139 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1140 var MNCC_PDU mncc;
1141 var MgcpCommand mgcp_cmd;
1142
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001143 f_perform_lu();
Harald Welte0cc82d92018-01-26 22:52:34 +01001144
Harald Weltede371492018-01-27 23:44:41 +01001145 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
Harald Welte0cc82d92018-01-26 22:52:34 +01001146 f_create_mncc_expect(hex2str(cpars.called_party));
1147 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1148
1149 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
1150 MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc;
1151 cpars.mncc_callref := mncc.u.signal.callref;
1152 MNCC.send(ts_MNCC_CALL_PROC_req(cpars.mncc_callref, cpars.mncc_bearer_cap));
1153 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(cpars.transaction_id)));
1154
1155 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
1156 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1157 cpars.mgcp_ep := mgcp_cmd.line.ep;
1158 /* Respond to CRCX with error */
1159 var MgcpResponse mgcp_rsp := {
1160 line := {
1161 code := "542",
1162 trans_id := mgcp_cmd.line.trans_id,
1163 string := "FORCED_FAIL"
1164 },
1165 params := omit,
1166 sdp := omit
1167 }
1168 MGCP.send(mgcp_rsp);
1169
1170 timer T := 30.0;
1171 T.start;
1172 alt {
1173 [] T.timeout { setverdict(fail, "Timeout waiting for channel release"); self.stop; }
1174 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1175 BSSAP.send(ts_BSSMAP_ClearComplete);
1176 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1177 setverdict(pass);
1178 }
Daniel Willmann5868e622018-02-15 17:42:59 +01001179 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id))) {
1180 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_REL_COMPL(cpars.transaction_id)));
1181 repeat;
1182 }
1183 [] BSSAP.receive {
1184 repeat;
1185 }
Harald Welte0cc82d92018-01-26 22:52:34 +01001186 [] MNCC.receive { repeat; }
1187 [] GSUP.receive { repeat; }
1188 [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {
1189 MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));
1190 f_create_mgcp_delete_ep(cpars.mgcp_ep);
Harald Welteec6e5b42018-01-27 12:45:15 +01001191 repeat;
Harald Welte0cc82d92018-01-26 22:52:34 +01001192 }
1193 [] MGCP.receive { repeat; }
1194 }
1195}
1196testcase TC_mo_crcx_ran_reject() runs on MTC_CT {
1197 var BSC_ConnHdlr vc_conn;
1198 f_init();
1199
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001200 vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_reject), 30);
Harald Welte0cc82d92018-01-26 22:52:34 +01001201 vc_conn.done;
1202}
1203
Harald Welte3ab88002018-01-26 22:37:25 +01001204
Harald Welte812f7a42018-01-27 00:49:18 +01001205/* helper function to start a MT call: MNCC SETUP; Paging; DChan est.; DTAP SETUP */
1206private function f_mt_call_start(inout CallParameters cpars) runs on BSC_ConnHdlr {
1207 var MNCC_PDU mncc;
1208 var MgcpCommand mgcp_cmd;
1209 var OCT4 tmsi;
1210
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001211 f_perform_lu();
Harald Welte812f7a42018-01-27 00:49:18 +01001212 if (isvalue(g_pars.tmsi)) {
1213 tmsi := g_pars.tmsi;
1214 } else {
1215 tmsi := 'FFFFFFFF'O;
1216 }
1217 f_bssmap_register_imsi(g_pars.imsi, tmsi);
1218
1219 /* Allocate call reference and send SETUP via MNCC to MSC */
1220 cpars.mncc_callref := f_rnd_int(2147483648);
1221 MNCC.send(ts_MNCC_SETUP_req(cpars.mncc_callref, hex2str(g_pars.msisdn),
1222 hex2str(cpars.called_party), hex2str(g_pars.imsi)));
1223
1224 /* MSC->BSC: expect PAGING from MSC */
1225 BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));
1226 /* MS -> MSC: PAGING RESPONSE */
Harald Welte081b19a2018-02-10 09:11:13 +01001227 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)), EST_TYPE_PAG_RESP);
Harald Welte812f7a42018-01-27 00:49:18 +01001228
1229 f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
1230
1231 /* MSC->MS: SETUP */
1232 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_SETUP(cpars.transaction_id, *, cpars.called_party)));
1233}
1234
1235/* Test MT Call */
1236private function f_tc_mt_crcx_ran_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltea10db902018-01-27 12:44:49 +01001237 f_init_handler(pars);
Harald Welte812f7a42018-01-27 00:49:18 +01001238 var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
1239 var MNCC_PDU mncc;
1240 var MgcpCommand mgcp_cmd;
1241
1242 f_mt_call_start(cpars);
1243
1244 /* MS->MSC: CALL CONFIRMED */
1245 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CALL_CONF(cpars.transaction_id)));
1246
1247 MNCC.receive(tr_MNCC_CALL_CONF_ind(cpars.mncc_callref));
1248
1249 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
1250 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1251 cpars.mgcp_ep := mgcp_cmd.line.ep;
1252 /* Respond to CRCX with error */
1253 var MgcpResponse mgcp_rsp := {
1254 line := {
1255 code := "542",
1256 trans_id := mgcp_cmd.line.trans_id,
1257 string := "FORCED_FAIL"
1258 },
1259 params := omit,
1260 sdp := omit
1261 }
1262 MGCP.send(mgcp_rsp);
1263
1264 timer T := 30.0;
1265 T.start;
1266 alt {
1267 [] T.timeout { setverdict(fail, "Timeout waiting for channel release"); self.stop; }
1268 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1269 BSSAP.send(ts_BSSMAP_ClearComplete);
1270 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1271 setverdict(pass);
1272 }
1273 [] BSSAP.receive { repeat; }
1274 [] MNCC.receive { repeat; }
1275 [] GSUP.receive { repeat; }
1276 [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {
1277 MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));
1278 f_create_mgcp_delete_ep(cpars.mgcp_ep);
1279 repeat;
1280 }
1281 [] MGCP.receive { repeat; }
1282 }
1283}
1284testcase TC_mt_crcx_ran_reject() runs on MTC_CT {
1285 var BSC_ConnHdlr vc_conn;
1286 f_init();
1287
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001288 vc_conn := f_start_handler(refers(f_tc_mt_crcx_ran_reject), 31);
Harald Welte812f7a42018-01-27 00:49:18 +01001289 vc_conn.done;
1290}
1291
1292
1293/* Test MT Call T310 timer */
1294private function f_tc_mt_t310(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
Harald Weltead2952e2018-01-27 14:12:46 +01001295 f_init_handler(pars, 200.0);
Harald Welte812f7a42018-01-27 00:49:18 +01001296 var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
1297 var MNCC_PDU mncc;
1298 var MgcpCommand mgcp_cmd;
1299
1300 f_mt_call_start(cpars);
1301
1302 /* MS->MSC: CALL CONFIRMED */
1303 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CALL_CONF(cpars.transaction_id)));
1304 MNCC.receive(tr_MNCC_CALL_CONF_ind(cpars.mncc_callref));
1305
1306 MGCP.receive(tr_CRCX) -> value mgcp_cmd;
1307 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
1308 cpars.mgcp_ep := mgcp_cmd.line.ep;
1309 /* FIXME: Respond to CRCX */
1310
1311 /* old libosmocore T310 default timeout is 180s. so let's wait 190 */
1312 timer T := 190.0;
1313 T.start;
1314 alt {
1315 [] T.timeout { setverdict(fail, "Timeout waiting for T310"); self.stop; }
1316 [] MNCC.receive(tr_MNCC_DISC_ind(cpars.mncc_callref)) {
1317 MNCC.send(ts_MNCC_REL_req(cpars.mncc_callref, valueof(ts_MNCC_cause(23))));
1318 }
1319 }
1320 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(cpars.transaction_id)));
1321 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id)));
1322 /* FIXME: We're sending this with TIflag 0: allocated by sender, which is wrong */
1323 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_REL_COMPL(cpars.transaction_id)));
1324
1325 alt {
1326 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
1327 BSSAP.send(ts_BSSMAP_ClearComplete);
1328 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
1329 setverdict(pass);
1330 }
1331 [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {
1332 MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));
1333 f_create_mgcp_delete_ep(cpars.mgcp_ep);
1334 repeat;
1335 }
1336 }
1337}
1338testcase TC_mt_t310() runs on MTC_CT {
1339 var BSC_ConnHdlr vc_conn;
1340 f_init();
1341
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001342 vc_conn := f_start_handler(refers(f_tc_mt_t310), 32);
Harald Welte812f7a42018-01-27 00:49:18 +01001343 vc_conn.done;
1344}
1345
Harald Welte167458a2018-01-27 15:58:16 +01001346/* Perform successful LU + MO call, then GSUP LocationCancel. Subscriber must be denied CM SERV */
1347private function f_tc_gsup_cancel(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1348 f_init_handler(pars);
1349 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1350 cpars.bss_rtp_port := 1110;
1351 cpars.mgcp_connection_id_bss := '22222'H;
1352 cpars.mgcp_connection_id_mss := '33333'H;
1353
1354 /* Location Update to make subscriber known */
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001355 f_perform_lu();
Harald Welte167458a2018-01-27 15:58:16 +01001356
1357 /* First MO call should succeed */
1358 f_mo_call(cpars);
1359
1360 /* Cancel the subscriber in the VLR */
1361 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
1362 alt {
1363 [] GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi)) { }
1364 [] GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi)) {
1365 setverdict(fail, "Received GSUP Location Cancel Error");
1366 self.stop;
1367 }
1368 }
1369
1370 /* Follow-up transactions should fail */
1371 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
1372 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, mi));
1373 f_bssap_compl_l3(l3_info);
1374 alt {
1375 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ)) { }
1376 [] BSSAP.receive {
1377 setverdict(fail, "Received unexpected BSSAP instead of CM SERV REJ");
1378 self.stop;
1379 }
1380 }
1381 setverdict(pass);
1382}
1383testcase TC_gsup_cancel() runs on MTC_CT {
1384 var BSC_ConnHdlr vc_conn;
1385 f_init();
1386
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001387 vc_conn := f_start_handler(refers(f_tc_gsup_cancel), 33);
Harald Welte167458a2018-01-27 15:58:16 +01001388 vc_conn.done;
1389}
1390
Harald Welte9de84792018-01-28 01:06:35 +01001391/* A5/1 only permitted on network side, and MS capable to do it */
1392private function f_tc_lu_imsi_auth_tmsi_encr_1_13(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1393 pars.net.expect_auth := true;
1394 pars.net.expect_ciph := true;
1395 pars.net.kc_support := '02'O; /* A5/1 only */
1396 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001397 f_perform_lu();
Harald Welte9de84792018-01-28 01:06:35 +01001398}
1399testcase TC_lu_imsi_auth_tmsi_encr_1_13() runs on MTC_CT {
1400 var BSC_ConnHdlr vc_conn;
1401 f_init();
1402 f_vty_config(MSCVTY, "network", "authentication required");
1403 f_vty_config(MSCVTY, "network", "encryption a5 1");
1404
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001405 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_1_13), 34);
Harald Welte9de84792018-01-28 01:06:35 +01001406 vc_conn.done;
1407}
1408
1409/* A5/3 only permitted on network side, and MS capable to do it */
1410private function f_tc_lu_imsi_auth_tmsi_encr_3_13(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1411 pars.net.expect_auth := true;
1412 pars.net.expect_ciph := true;
1413 pars.net.kc_support := '08'O; /* A5/3 only */
1414 f_init_handler(pars);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001415 f_perform_lu();
Harald Welte9de84792018-01-28 01:06:35 +01001416}
1417testcase TC_lu_imsi_auth_tmsi_encr_3_13() runs on MTC_CT {
1418 var BSC_ConnHdlr vc_conn;
1419 f_init();
1420 f_vty_config(MSCVTY, "network", "authentication required");
1421 f_vty_config(MSCVTY, "network", "encryption a5 3");
1422
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001423 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_3_13), 35);
Harald Welte9de84792018-01-28 01:06:35 +01001424 vc_conn.done;
1425}
1426
1427/* A5/3 only permitted on network side, and MS with only A5/1 support */
1428private function f_tc_lu_imsi_auth_tmsi_encr_3_1(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1429 pars.net.expect_auth := true;
1430 pars.net.expect_ciph := true;
1431 pars.net.kc_support := '08'O; /* A5/3 only */
1432 pars.cm2.classmarkInformationType2_oct5.a5_3 := '0'B;
1433 f_init_handler(pars, 15.0);
1434
1435 /* cannot use f_perform_lu() as we expect a reject */
1436 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
1437 f_create_gsup_expect(hex2str(g_pars.imsi));
1438 f_bssap_compl_l3(l3_lu);
1439 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
1440 f_mm_auth();
1441 alt {
1442 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
1443 [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(?,?)) {
1444 setverdict(fail, "CipherModeCommand despite no A5 intersection");
1445 self.stop;
1446 }
1447 [] BSSAP.receive {
1448 setverdict(inconc, "Unknown/unexpected BSSAP received");
1449 self.stop;
1450 }
1451 }
1452 setverdict(pass);
1453}
1454testcase TC_lu_imsi_auth_tmsi_encr_3_1() runs on MTC_CT {
1455 var BSC_ConnHdlr vc_conn;
1456 f_init();
1457 f_vty_config(MSCVTY, "network", "authentication required");
1458 f_vty_config(MSCVTY, "network", "encryption a5 3");
1459
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001460 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_3_1), 36);
Harald Welte9de84792018-01-28 01:06:35 +01001461 vc_conn.done;
1462}
1463
1464/* A5/1 + A5/3 only permitted on network side, and MS with only A5/2 support */
1465private function f_tc_lu_imsi_auth_tmsi_encr_13_2(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1466 pars.net.expect_auth := true;
1467 pars.net.expect_ciph := true;
1468 pars.net.kc_support := '0A'O; /* A5/1 + A5/3 */
1469 pars.cm1.a5_1 := '1'B;
1470 pars.cm2.a5_1 := '1'B;
1471 pars.cm2.classmarkInformationType2_oct5.a5_3 := '0'B;
1472 pars.cm2.classmarkInformationType2_oct5.a5_2 := '1'B;
1473 f_init_handler(pars, 15.0);
1474
1475 /* cannot use f_perform_lu() as we expect a reject */
1476 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
1477 f_create_gsup_expect(hex2str(g_pars.imsi));
1478 f_bssap_compl_l3(l3_lu);
1479 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
1480 f_mm_auth();
1481 alt {
1482 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
1483 [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(?,?)) {
1484 setverdict(fail, "CipherModeCommand despite no A5 intersection");
1485 self.stop;
1486 }
1487 [] BSSAP.receive {
1488 setverdict(inconc, "Unknown/unexpected BSSAP received");
1489 self.stop;
1490 }
1491 }
1492 setverdict(pass);
1493}
1494testcase TC_lu_imsi_auth_tmsi_encr_13_2() runs on MTC_CT {
1495 var BSC_ConnHdlr vc_conn;
1496 f_init();
1497 f_vty_config(MSCVTY, "network", "authentication required");
1498 f_vty_config(MSCVTY, "network", "encryption a5 1 3");
1499
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001500 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_13_2), 37);
Harald Welte9de84792018-01-28 01:06:35 +01001501 vc_conn.done;
1502}
1503
1504/* A5/0 + A5/1 + A5/3 only permitted on network side, and MS with only A5/2 support */
1505private function f_tc_lu_imsi_auth_tmsi_encr_013_2(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1506 pars.net.expect_auth := true;
1507 pars.net.expect_ciph := true;
1508 pars.net.kc_support := '0B'O; /* A5/1 + A5/3 */
1509 pars.cm1.a5_1 := '1'B;
1510 pars.cm2.a5_1 := '1'B;
1511 pars.cm2.classmarkInformationType2_oct5.a5_3 := '0'B;
1512 pars.cm2.classmarkInformationType2_oct5.a5_2 := '1'B;
1513 f_init_handler(pars, 15.0);
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001514 f_perform_lu();
Harald Welte9de84792018-01-28 01:06:35 +01001515}
1516testcase TC_lu_imsi_auth_tmsi_encr_013_2() runs on MTC_CT {
1517 var BSC_ConnHdlr vc_conn;
1518 f_init();
1519 f_vty_config(MSCVTY, "network", "authentication required");
1520 f_vty_config(MSCVTY, "network", "encryption a5 0 1 3");
1521
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001522 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi_encr_013_2), 38);
Harald Welte9de84792018-01-28 01:06:35 +01001523 vc_conn.done;
1524}
1525
Harald Welte33ec09b2018-02-10 15:34:46 +01001526/* LU followed by MT call (including paging) */
1527private function f_tc_lu_and_mt_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1528 f_init_handler(pars);
1529 //FIXME: odd digits var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1530 var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
1531 cpars.bss_rtp_port := 1110;
1532 cpars.mgcp_connection_id_bss := '10004'H;
1533 cpars.mgcp_connection_id_mss := '10005'H;
1534
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001535 f_perform_lu();
Harald Welte33ec09b2018-02-10 15:34:46 +01001536 f_mt_call(cpars);
1537}
1538testcase TC_lu_and_mt_call() runs on MTC_CT {
1539 var BSC_ConnHdlr vc_conn;
1540 f_init();
1541
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001542 vc_conn := f_start_handler(refers(f_tc_lu_and_mt_call), 39);
Harald Welte33ec09b2018-02-10 15:34:46 +01001543 vc_conn.done;
1544}
1545
Daniel Willmann8b084372018-02-04 13:35:26 +01001546/* Test MO Call SETUP with DTMF */
1547private function f_tc_mo_setup_dtmf_dup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
1548 f_init_handler(pars);
1549 var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
1550 cpars.bss_rtp_port := 1110;
1551 cpars.mgcp_connection_id_bss := '22222'H;
1552 cpars.mgcp_connection_id_mss := '33333'H;
1553
Neels Hofmeyrc1f105a2018-03-01 20:00:19 +01001554 f_perform_lu();
Daniel Willmann8b084372018-02-04 13:35:26 +01001555 f_mo_seq_dtmf_dup(cpars);
1556}
1557testcase TC_mo_setup_and_dtmf_dup() runs on MTC_CT {
1558 var BSC_ConnHdlr vc_conn;
1559 f_init();
1560
Neels Hofmeyre9b8eeb2018-03-01 20:29:58 +01001561 vc_conn := f_start_handler(refers(f_tc_mo_setup_dtmf_dup), 39);
Daniel Willmann8b084372018-02-04 13:35:26 +01001562 vc_conn.done;
1563}
Harald Welte9de84792018-01-28 01:06:35 +01001564
1565
Harald Welte12510c52018-01-26 22:26:24 +01001566
Harald Welte45164da2018-01-24 12:51:27 +01001567
Harald Welteba7b6d92018-01-23 21:32:34 +01001568/* TODO:
1569 * continue to send repeated MO signalling messages to keep channel open: does MSC tmeout?
1570 * malformed messages (missing IE, invalid message type): properly rejected?
1571 * MT call while LU or is ongoing: Do we use existing lchan or page while lchan active?
1572 * 3G/2G auth permutations
1573 * encryption algorithms vs. classmark vs. vty config
Harald Welteba7b6d92018-01-23 21:32:34 +01001574 * send new transaction after/during clear (like SMS, ...)
Harald Welte45164da2018-01-24 12:51:27 +01001575 * too long L3 INFO in DTAP
1576 * too long / padded BSSAP
1577 * too long / short TLV values
Harald Welteba7b6d92018-01-23 21:32:34 +01001578 */
Harald Weltef6dd64d2017-11-19 12:09:51 +01001579
1580
1581control {
Harald Weltea49e36e2018-01-21 19:29:33 +01001582 execute( TC_lu_imsi_noauth_tmsi() );
Harald Welted2328a22018-01-27 14:27:16 +01001583 execute( TC_lu_imsi_noauth_notmsi() );
Harald Weltea49e36e2018-01-21 19:29:33 +01001584 execute( TC_lu_imsi_reject() );
1585 execute( TC_lu_imsi_timeout_gsup() );
Harald Welted2328a22018-01-27 14:27:16 +01001586 execute( TC_lu_imsi_auth_tmsi() );
1587 execute( TC_cmserv_imsi_unknown() );
Harald Welte2bb825f2018-01-22 11:31:18 +01001588 execute( TC_lu_and_mo_call() );
Harald Welte071ed732018-01-23 19:53:52 +01001589 execute( TC_lu_auth_sai_timeout() );
1590 execute( TC_lu_auth_sai_err() );
Harald Weltee1a2f3c2018-01-24 17:28:48 +01001591 execute( TC_lu_clear_request() );
1592 execute( TC_lu_disconnect() );
1593 execute( TC_lu_by_imei() );
1594 execute( TC_lu_by_tmsi_noauth_unknown() );
1595 execute( TC_imsi_detach_by_imsi() );
1596 execute( TC_imsi_detach_by_tmsi() );
1597 execute( TC_imsi_detach_by_imei() );
1598 execute( TC_emerg_call_imei_reject() );
1599 execute( TC_emerg_call_imsi() );
1600 execute( TC_cm_serv_req_vgcs_reject() );
1601 execute( TC_cm_serv_req_vbs_reject() );
1602 execute( TC_cm_serv_req_lcs_reject() );
Harald Welte0195ab12018-01-24 21:50:20 +01001603 execute( TC_cm_reest_req_reject() );
Harald Welte1af6ea82018-01-25 18:33:15 +01001604 execute( TC_lu_auth_2G_fail() );
1605 execute( TC_lu_imsi_auth_tmsi_encr_13_13() );
1606 execute( TC_cl3_no_payload() );
1607 execute( TC_cl3_rnd_payload() );
Harald Welte1852a842018-01-26 22:53:36 +01001608 execute( TC_establish_and_nothing() );
1609 execute( TC_mo_setup_and_nothing() );
1610 execute( TC_mo_crcx_ran_timeout() );
1611 execute( TC_mo_crcx_ran_reject() );
Harald Welted2328a22018-01-27 14:27:16 +01001612 execute( TC_mt_crcx_ran_reject() );
Daniel Willmann8b084372018-02-04 13:35:26 +01001613 execute( TC_mo_setup_and_dtmf_dup() );
Harald Welteaa54cf82018-01-30 08:15:32 +01001614 //execute( TC_mt_t310() );
Harald Welte167458a2018-01-27 15:58:16 +01001615 execute( TC_gsup_cancel() );
Harald Welte9de84792018-01-28 01:06:35 +01001616 execute( TC_lu_imsi_auth_tmsi_encr_1_13() );
1617 execute( TC_lu_imsi_auth_tmsi_encr_3_13() );
1618 execute( TC_lu_imsi_auth_tmsi_encr_3_1() );
1619 execute( TC_lu_imsi_auth_tmsi_encr_13_2() );
1620 execute( TC_lu_imsi_auth_tmsi_encr_013_2() );
Harald Welte33ec09b2018-02-10 15:34:46 +01001621
1622 execute( TC_lu_and_mt_call() );
1623
Harald Weltef6dd64d2017-11-19 12:09:51 +01001624}
1625
1626
1627}