blob: 4bacc1d26444888ddcbfcc13946d0991e7121025 [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
23import from MNCC_Emulation all;
Harald Welte2bb825f2018-01-22 11:31:18 +010024import from MNCC_Types all;
Harald Weltea49e36e2018-01-21 19:29:33 +010025
26import from GSUP_Emulation all;
27import from GSUP_Types all;
28import from IPA_Emulation all;
29
Harald Weltef6dd64d2017-11-19 12:09:51 +010030import from BSSAP_Types all;
Harald Weltea49e36e2018-01-21 19:29:33 +010031import from BSSAP_Adapter all;
32import from BSSAP_CodecPort all;
33import from BSSMAP_Templates all;
34import from BSSMAP_Emulation all;
35import from BSC_ConnectionHandler all;
Harald Weltef6dd64d2017-11-19 12:09:51 +010036
Harald Weltea49e36e2018-01-21 19:29:33 +010037import from MobileL3_Types all;
38import from MobileL3_CommonIE_Types all;
39import from L3_Templates all;
Harald Weltef6dd64d2017-11-19 12:09:51 +010040
Harald Weltef6dd64d2017-11-19 12:09:51 +010041
Harald Weltea49e36e2018-01-21 19:29:33 +010042type component MTC_CT extends BSSAP_Adapter_CT, CTRL_Adapter_CT {
Harald Weltef6dd64d2017-11-19 12:09:51 +010043 var boolean g_initialized := false;
Harald Weltea49e36e2018-01-21 19:29:33 +010044
45 /* no 'adapter_CT' for MNCC or GSUP */
46 var MNCC_Emulation_CT vc_MNCC;
47 var GSUP_Emulation_CT vc_GSUP;
48 var IPA_Emulation_CT vc_GSUP_IPA;
49
50 /* only to get events from IPA underneath GSUP */
51 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Weltef6dd64d2017-11-19 12:09:51 +010052}
53
54modulepar {
Harald Weltea49e36e2018-01-21 19:29:33 +010055 /* remote parameters of IUT */
56 charstring mp_msc_ip := "127.0.0.1";
57 integer mp_msc_ctrl_port := 4255;
58 integer mp_msc_vty_port := 4254;
Harald Weltef6dd64d2017-11-19 12:09:51 +010059
Harald Weltea49e36e2018-01-21 19:29:33 +010060 /* local parameters of emulated HLR */
61 charstring mp_hlr_ip := "127.0.0.1";
62 integer mp_hlr_port := 4222;
Harald Weltef6dd64d2017-11-19 12:09:51 +010063
Harald Weltea49e36e2018-01-21 19:29:33 +010064 charstring mp_msc_mncc := "/tmp/mncc";
Harald Weltef6dd64d2017-11-19 12:09:51 +010065}
66
67
Harald Weltea49e36e2018-01-21 19:29:33 +010068function f_init_mncc(charstring id) runs on MTC_CT {
69 id := id & "-MNCC";
70 var MnccOps ops := {
71 create_cb := refers(MNCC_Emulation.ExpectedCreateCallback),
72 unitdata_cb := refers(MNCC_Emulation.DummyUnitdataCallback)
73 }
74
75 vc_MNCC := MNCC_Emulation_CT.create(id);
76 map(vc_MNCC:MNCC, system:MNCC_CODEC_PT);
77 vc_MNCC.start(MNCC_Emulation.main(ops, id, mp_msc_mncc));
Harald Weltef6dd64d2017-11-19 12:09:51 +010078}
79
Harald Weltea49e36e2018-01-21 19:29:33 +010080function f_init_gsup(charstring id) runs on MTC_CT {
81 id := id & "-GSUP";
82 var GsupOps ops := {
83 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
84 }
85
86 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
87 vc_GSUP := GSUP_Emulation_CT.create(id);
88
89 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
90 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
91 /* we use this hack to get events like ASP_IPA_EVENT_UP */
92 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
93
94 vc_GSUP.start(GSUP_Emulation.main(ops, id));
95 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
96
97 /* wait for incoming connection to GSUP port before proceeding */
98 timer T := 10.0;
99 T.start;
100 alt {
101 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
102 [] T.timeout {
103 setverdict(inconc, "No connection to GSUP Port");
104 self.stop
105 }
106 }
Harald Weltef6dd64d2017-11-19 12:09:51 +0100107}
108
Harald Weltea49e36e2018-01-21 19:29:33 +0100109function f_init() runs on MTC_CT {
Harald Weltef6dd64d2017-11-19 12:09:51 +0100110
111 if (g_initialized == true) {
112 return;
113 }
114 g_initialized := true;
115
Harald Weltea49e36e2018-01-21 19:29:33 +0100116 f_bssap_init("MSC_Test", BSC_BssmapOps);
117 f_ipa_ctrl_start(mp_msc_ip, mp_msc_ctrl_port);
118 f_init_mncc("MSC_Test");
119 f_init_gsup("MSC_Test");
Harald Weltef6dd64d2017-11-19 12:09:51 +0100120}
121
122template PDU_BSSAP ts_BSSAP_BSSMAP := {
123 discriminator := '0'B,
124 spare := '0000000'B,
125 dlci := omit,
126 lengthIndicator := 0, /* overwritten by codec */
127 pdu := ?
128}
129
130template PDU_BSSAP tr_BSSAP_BSSMAP := {
131 discriminator := '0'B,
132 spare := '0000000'B,
133 dlci := omit,
134 lengthIndicator := ?,
135 pdu := {
136 bssmap := ?
137 }
138}
139
140
141type integer BssmapCause;
142
143template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
144 elementIdentifier := '04'O,
145 lengthIndicator := 0,
146 causeValue := int2bit(val, 7),
147 extensionCauseValue := '0'B,
148 spare1 := omit
149}
150
151template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {
152 pdu := {
153 bssmap := {
154 reset := {
155 messageType := '30'O,
156 cause := ts_BSSMAP_IE_Cause(cause),
157 a_InterfaceSelectorForReset := omit
158 }
159 }
160 }
161}
162
163template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {
164 pdu := {
165 bssmap := {
166 resetAck := {
167 messageType := '31'O,
168 a_InterfaceSelectorForReset := omit
169 }
170 }
171 }
172}
173
174template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {
175 pdu := {
176 bssmap := {
177 resetAck := {
178 messageType := '31'O,
179 a_InterfaceSelectorForReset := *
180 }
181 }
182 }
183}
184
185template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
186 elementIdentifier := '05'O,
187 lengthIndicator := 0,
188 cellIdentifierDiscriminator := '0000'B,
189 spare1_4 := '0000'B,
190 cellIdentification := ?
191}
192
193type uint16_t BssmapLAC;
194type uint16_t BssmapCI;
195
196/*
197template BSSMAP_IE_CellIdentifier ts_CellId_CGI(mcc, mnc, lac, ci)
198modifies ts_BSSMAP_IE_CellID := {
199 cellIdentification := {
200 cI_LAC_CGI := {
201 mnc_mcc := FIXME,
202 lac := int2oct(lac, 2),
203 ci := int2oct(ci, 2)
204 }
205 }
206}
207*/
208
209template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
210modifies ts_BSSMAP_IE_CellID := {
211 cellIdentification := {
212 cI_LAC_CI := {
213 lac := int2oct(lac, 2),
214 ci := int2oct(ci, 2)
215 }
216 }
217}
218
219template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
220modifies ts_BSSMAP_IE_CellID := {
221 cellIdentification := {
222 cI_CI := int2oct(ci, 2)
223 }
224}
225
226template BSSMAP_IE_CellIdentifier ts_CellId_none
227modifies ts_BSSMAP_IE_CellID := {
228 cellIdentification := {
229 cI_noCell := ''O
230 }
231}
232
233
234template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
235 elementIdentifier := '17'O,
236 lengthIndicator := 0,
237 layer3info := l3info
238}
239
240template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
241modifies ts_BSSAP_BSSMAP := {
242 pdu := {
243 bssmap := {
244 completeLayer3Information := {
245 messageType := '57'O,
246 cellIdentifier := cell_id,
247 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
248 chosenChannel := omit,
249 lSAIdentifier := omit,
250 aPDU := omit,
251 codecList := omit,
252 redirectAttemptFlag := omit,
253 sendSequenceNumber := omit,
254 iMSI := omit
255 }
256 }
257 }
258}
259
260template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_IE_CellIdentifierList cid_list)
261modifies ts_BSSAP_BSSMAP := {
262 pdu := {
263 bssmap := {
264 handoverRequired := {
265 messageType := '11'O,
266 cause := ts_BSSMAP_IE_Cause(cause),
267 responseRequest := omit,
268 cellIdentifierList := cid_list,
269 circuitPoolList := omit,
270 currentChannelType1 := omit,
271 speechVersion := omit,
272 queueingIndicator := omit,
273 oldToNewBSSInfo := omit,
274 sourceToTargetRNCTransparentInfo := omit,
275 sourceToTargetRNCTransparentInfoCDMA := omit,
276 gERANClassmark := omit,
277 talkerPriority := omit,
278 speechCodec := omit,
279 cSG_Identifier := omit
280 }
281 }
282 }
283}
284
285// enc_PDU_BSSAP
286
287function f_send_BSSAP_UNITDATA(template PDU_BSSAP bssap) runs on MTC_CT {
Harald Weltea49e36e2018-01-21 19:29:33 +0100288 BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, bssap))
Harald Weltef6dd64d2017-11-19 12:09:51 +0100289}
290
Harald Weltea49e36e2018-01-21 19:29:33 +0100291type function void_fn(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr;
Harald Weltef6dd64d2017-11-19 12:09:51 +0100292
Harald Weltea49e36e2018-01-21 19:29:33 +0100293function f_gen_imsi(hexstring prefix, integer suffix) return hexstring {
294 var integer suffix_len := 15 - lengthof(prefix);
295 suffix_len := suffix_len-1; /* FIXME: fix odd IMSI length */
296 return prefix & int2hex(suffix, suffix_len);
297}
298
299function f_gen_msisdn(hexstring prefix, integer suffix) return hexstring {
300 var integer suffix_len := 12 - lengthof(prefix);
301 return prefix & int2hex(suffix, suffix_len);
302}
303
304/* FIXME: move into BSC_ConnectionHandler? */
305function f_start_handler(void_fn fn, charstring id, integer imsi_suffix) runs on MTC_CT return BSC_ConnHdlr {
306 var BSC_ConnHdlr vc_conn;
307 var BSC_ConnHdlrPars pars := {
308 sccp_addr_own := g_sccp_addr_own,
309 sccp_addr_peer := g_sccp_addr_peer,
310 cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42)),
311 imsi := f_gen_imsi('26242'H, imsi_suffix),
Harald Welte82600572018-01-21 20:54:08 +0100312 msisdn := f_gen_msisdn('491239999'H, imsi_suffix),
313 cm2 := valueof(ts_CM2_default),
314 cm3 := omit
Harald Weltea49e36e2018-01-21 19:29:33 +0100315 };
316
317 vc_conn := BSC_ConnHdlr.create(id);
318 /* BSSMAP part / A interface */
319 connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
320 connect(vc_conn:BSSAP_PROC, vc_BSSMAP:PROC);
321 /* MNCC part */
322 connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);
323 connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);
324 /* GSUP part */
325 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
326 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
327
328 vc_conn.start(derefers(fn)(id, pars));
329 return vc_conn;
330}
331
332function f_sleep(float seconds) {
333 timer T := seconds;
Harald Weltef6dd64d2017-11-19 12:09:51 +0100334 T.start;
335 T.timeout;
Harald Weltea49e36e2018-01-21 19:29:33 +0100336}
Harald Weltef6dd64d2017-11-19 12:09:51 +0100337
Harald Weltea49e36e2018-01-21 19:29:33 +0100338private function f_tc_lu_imsi_noauth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
339 g_pars := pars;
Harald Welte8a121b32018-01-22 03:00:41 +0100340 f_perform_lu(false, true, true);
Harald Weltea49e36e2018-01-21 19:29:33 +0100341}
Harald Weltea49e36e2018-01-21 19:29:33 +0100342testcase TC_lu_imsi_noauth_tmsi() runs on MTC_CT {
343 var BSC_ConnHdlr vc_conn;
344 f_init();
345
346 vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_tmsi), testcasename(), 1);
347 vc_conn.done;
348}
349
350private function f_tc_lu_imsi_noauth_notmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
351 g_pars := pars;
Harald Welte8a121b32018-01-22 03:00:41 +0100352 f_perform_lu(false, false, true);
Harald Weltea49e36e2018-01-21 19:29:33 +0100353}
Harald Weltea49e36e2018-01-21 19:29:33 +0100354testcase TC_lu_imsi_noauth_notmsi() runs on MTC_CT {
355 var BSC_ConnHdlr vc_conn;
356 f_init();
357
358 vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_notmsi), testcasename(), 2);
359 vc_conn.done;
360}
361
362/* Do LU by IMSI, refuse it on GSUP and expect LU REJ back to MS */
363private function f_tc_lu_imsi_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
364 g_pars := pars;
365 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
366
367 f_create_gsup_expect(hex2str(g_pars.imsi));
368 f_bssap_compl_l3(l3_lu);
369 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
370 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 23));
371 alt {
372 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej(int2oct(23,1)))) { }
373 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
374 setverdict(fail, "Expecting LU REJ, but got ACCEPT");
375 self.stop;
376 }
377 }
378 BSSAP.receive(tr_BSSMAP_ClearCommand);
379 BSSAP.send(ts_BSSMAP_ClearComplete);
380 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
381 setverdict(pass);
382}
383testcase TC_lu_imsi_reject() runs on MTC_CT {
384 var BSC_ConnHdlr vc_conn;
385 f_init();
386
387 vc_conn := f_start_handler(refers(f_tc_lu_imsi_reject), testcasename(), 3);
388 vc_conn.done;
389}
390
391/* Do LU by IMSI, timeout on GSUP */
392private function f_tc_lu_imsi_timeout_gsup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
393 g_pars := pars;
394 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
395
396 f_create_gsup_expect(hex2str(g_pars.imsi));
397 f_bssap_compl_l3(l3_lu);
398 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
399 /* Normally the HLR would need to respond here, but we decide to force a timeout here */
400 alt {
401 /* FIXME: Expect specific reject cause */
402 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
403 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
404 setverdict(fail, "Expecting LU REJ, but got ACCEPT");
405 self.stop;
406 }
407 }
408 BSSAP.receive(tr_BSSMAP_ClearCommand);
409 BSSAP.send(ts_BSSMAP_ClearComplete);
410 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
411 setverdict(pass);
412}
413testcase TC_lu_imsi_timeout_gsup() runs on MTC_CT {
414 var BSC_ConnHdlr vc_conn;
415 f_init();
416
417 vc_conn := f_start_handler(refers(f_tc_lu_imsi_timeout_gsup), testcasename(), 4);
418 vc_conn.done;
419}
420
Harald Welte7b1b2812018-01-22 21:23:06 +0100421private function f_tc_lu_imsi_auth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
422 g_pars := pars;
423 f_perform_lu(true, true, true);
424}
425testcase TC_lu_imsi_auth_tmsi() runs on MTC_CT {
426 var BSC_ConnHdlr vc_conn;
427 f_init();
428
429 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi), testcasename(), 5);
430 vc_conn.done;
431}
432
Harald Weltea49e36e2018-01-21 19:29:33 +0100433
434/* Send CM SERVICE REQ for IMSI that has never performed LU before */
435private function f_tc_cmserv_imsi_unknown(charstring id, BSC_ConnHdlrPars pars)
436runs on BSC_ConnHdlr {
437
438 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
439 var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42));
440 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0001'B, mi));
441
442 f_create_gsup_expect(hex2str(g_pars.imsi));
443
444 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
445 f_bssap_compl_l3(l3_info);
446
447 timer T := 10.0;
Harald Weltef6dd64d2017-11-19 12:09:51 +0100448 T.start;
449 alt {
Harald Weltea49e36e2018-01-21 19:29:33 +0100450 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ)) { }
451 //[] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC)) { }
452 [] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
453 [] GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
454 setverdict(fail, "Unexpected GSUP UL REQ");
455 }
456 [] T.timeout { setverdict(inconc, "Timeout waiting for CM SERV REQ"); }
Harald Weltef6dd64d2017-11-19 12:09:51 +0100457 }
458
Harald Weltea49e36e2018-01-21 19:29:33 +0100459 alt {
460 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
461 setverdict(pass);
462 }
463 [] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
464 [] T.timeout { setverdict(inconc, "Timeout waiting for CM SERV REQ"); }
465 }
Harald Weltef6dd64d2017-11-19 12:09:51 +0100466}
Harald Weltea49e36e2018-01-21 19:29:33 +0100467testcase TC_cmserv_imsi_unknown() runs on MTC_CT {
468 var BSC_ConnHdlr vc_conn;
469 f_init();
470 vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), testcasename(), 5);
471 vc_conn.done;
472}
473
Harald Welte2bb825f2018-01-22 11:31:18 +0100474private function f_tc_lu_and_mo_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
475 g_pars := pars;
476 f_perform_lu(false, true, true);
477
478 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)), false);
479
480 var hexstring called := '12345'H;
481 var integer tid := 0;
482 var MNCC_PDU mncc;
483 f_create_mncc_expect(hex2str(called));
484
485 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(tid, called)));
486 MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(called)))) -> value mncc;
487 /* FIXME: extract call_id */
488
489 /* Call Proceeding */
490 MNCC.send(ts_MNCC_CALL_PROC_req(mncc.u.signal.callref, ts_MNCC_bcap_voice));
491 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(tid)));
492
493 /* Alerting */
494 MNCC.send(ts_MNCC_ALERT_req(mncc.u.signal.callref));
495 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(tid)));
496
497 /* Answer. This causes TCH assignment in case of "late assignment" */
498 MNCC.send(ts_MNCC_SETUP_COMPL_req(mncc.u.signal.callref));
499
500 f_sleep(3.0);
501
502 /* Hangup by "B" side */
503 MNCC.send(ts_MNCC_DISC_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(23))));
504 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(tid)));
505
506 /* Release of call */
507 MNCC.send(ts_MNCC_REL_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(42))));
508 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(tid)));
509
510 /* clearing of radio channel */
511 BSSAP.receive(tr_BSSMAP_ClearCommand);
512 BSSAP.send(ts_BSSMAP_ClearComplete);
513 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
514
515 f_sleep(5.0);
516}
517testcase TC_lu_and_mo_call() runs on MTC_CT {
518 var BSC_ConnHdlr vc_conn;
519 f_init();
520
Harald Welte071ed732018-01-23 19:53:52 +0100521 vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), testcasename(), 6);
522 vc_conn.done;
523}
524
525/* Test LU (with authentication enabled), where HLR times out sending SAI response */
526private function f_tc_lu_auth_sai_timeout(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
527 g_pars := pars;
528
529 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
530 var PDU_DTAP_MT dtap_mt;
531
532 /* tell GSUP dispatcher to send this IMSI to us */
533 f_create_gsup_expect(hex2str(g_pars.imsi));
534
535 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
536 f_bssap_compl_l3(l3_lu);
537
538 /* Send Early Classmark, just for the fun of it */
539 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
540
541 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
542 /* The HLR would normally return an auth vector here, but we fail to do so. */
543
544 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej));
545 BSSAP.receive(tr_BSSMAP_ClearCommand);
546 BSSAP.send(ts_BSSMAP_ClearComplete);
547 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
548 setverdict(pass);
549}
550testcase TC_lu_auth_sai_timeout() runs on MTC_CT {
551 var BSC_ConnHdlr vc_conn;
552 f_init();
553
554 vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_timeout), testcasename(), 7);
555 vc_conn.done;
556}
557
558/* Test LU (with authentication enabled), where HLR rejects sending SAI error */
559private function f_tc_lu_auth_sai_err(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
560 g_pars := pars;
561
562 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
563 var PDU_DTAP_MT dtap_mt;
564
565 /* tell GSUP dispatcher to send this IMSI to us */
566 f_create_gsup_expect(hex2str(g_pars.imsi));
567
568 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
569 f_bssap_compl_l3(l3_lu);
570
571 /* Send Early Classmark, just for the fun of it */
572 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
573
574 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
575 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 13));
576
577 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej));
578 BSSAP.receive(tr_BSSMAP_ClearCommand);
579 BSSAP.send(ts_BSSMAP_ClearComplete);
580 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
581 setverdict(pass);
582}
583testcase TC_lu_auth_sai_err() runs on MTC_CT {
584 var BSC_ConnHdlr vc_conn;
585 f_init();
586
587 vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_err), testcasename(), 8);
Harald Welte2bb825f2018-01-22 11:31:18 +0100588 vc_conn.done;
589}
Harald Weltea49e36e2018-01-21 19:29:33 +0100590
Harald Weltebc881782018-01-23 20:09:15 +0100591/* Test LU but BSC will send a clear request in the middle */
592private function f_tc_lu_clear_request(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
593 g_pars := pars;
594
595 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
596 var PDU_DTAP_MT dtap_mt;
597
598 /* tell GSUP dispatcher to send this IMSI to us */
599 f_create_gsup_expect(hex2str(g_pars.imsi));
600
601 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
602 f_bssap_compl_l3(l3_lu);
603
604 /* Send Early Classmark, just for the fun of it */
605 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
606
607 f_sleep(1.0);
608 /* send clear request in the middle of the LU */
609 BSSAP.send(ts_BSSMAP_ClearRequest(0));
610 BSSAP.receive(tr_BSSMAP_ClearCommand);
611 BSSAP.send(ts_BSSMAP_ClearComplete);
612 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
613 setverdict(pass);
614}
615testcase TC_lu_clear_request() runs on MTC_CT {
616 var BSC_ConnHdlr vc_conn;
617 f_init();
618
619 vc_conn := f_start_handler(refers(f_tc_lu_clear_request), testcasename(), 8);
620 vc_conn.done;
621}
622
Harald Welte66af9e62018-01-24 17:28:21 +0100623/* Test LU but BSC will send a clear request in the middle */
624private function f_tc_lu_disconnect(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
625 g_pars := pars;
626
627 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
628 var PDU_DTAP_MT dtap_mt;
629
630 /* tell GSUP dispatcher to send this IMSI to us */
631 f_create_gsup_expect(hex2str(g_pars.imsi));
632
633 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
634 f_bssap_compl_l3(l3_lu);
635
636 /* Send Early Classmark, just for the fun of it */
637 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
638
639 f_sleep(1.0);
640 /* send clear request in the middle of the LU */
641 BSSAP.send(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
642 setverdict(pass);
643}
644testcase TC_lu_disconnect() runs on MTC_CT {
645 var BSC_ConnHdlr vc_conn;
646 f_init();
647
648 vc_conn := f_start_handler(refers(f_tc_lu_disconnect), testcasename(), 9);
649 vc_conn.done;
650}
651
652
Harald Welteba7b6d92018-01-23 21:32:34 +0100653/* Test LU but with illegal mobile identity type = IMEI */
654private function f_tc_lu_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
655 g_pars := pars;
656
657 var PDU_ML3_MS_NW l3_lu := f_build_lu_imei(g_pars.imsi)
658 var PDU_DTAP_MT dtap_mt;
659
660 /* tell GSUP dispatcher to send this IMSI to us */
661 f_create_gsup_expect(hex2str(g_pars.imsi));
662
663 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
664 f_bssap_compl_l3(l3_lu);
665
666 /* Send Early Classmark, just for the fun of it */
667 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
668 /* wait for LU reject, ignore any ID REQ */
669 alt {
670 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
671 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_ID_Req)) { repeat; }
672 }
673 /* wait for normal teardown */
674 BSSAP.receive(tr_BSSMAP_ClearCommand);
675 BSSAP.send(ts_BSSMAP_ClearComplete);
676 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
677 setverdict(pass);
678}
679testcase TC_lu_by_imei() runs on MTC_CT {
680 var BSC_ConnHdlr vc_conn;
681 f_init();
682
683 vc_conn := f_start_handler(refers(f_tc_lu_by_imei), testcasename(), 9);
684 vc_conn.done;
685}
686
687/* Test LU by TMSI with unknown TMSI, expect (and answer) ID REQ. */
688private function f_tc_lu_tmsi_noauth_unknown(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
689 g_pars := pars;
690
691 var PDU_ML3_MS_NW l3_lu := f_build_lu_tmsi('01020304'O); /* FIXME: Random */
692 var PDU_DTAP_MT dtap_mt;
693
694 /* tell GSUP dispatcher to send this IMSI to us */
695 f_create_gsup_expect(hex2str(g_pars.imsi));
696
697 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
698 f_bssap_compl_l3(l3_lu);
699
700 /* Send Early Classmark, just for the fun of it */
701 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
702
703 /* Wait for + respond to ID REQ (IMSI) */
704 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_ID_Req('001'B)));
705 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_MM_ID_Rsp_IMSI(g_pars.imsi)));
706
707 /* Expect MSC to do UpdateLocation to HLR; respond to it */
708 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
709 GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
710 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
711 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
712
713 alt {
714 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) { }
715 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {
716 setverdict(fail, "Expected LU ACK, but received REJ");
717 }
718 }
719
720 /* wait for normal teardown */
721 BSSAP.receive(tr_BSSMAP_ClearCommand);
722 BSSAP.send(ts_BSSMAP_ClearComplete);
723 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
724 setverdict(pass);
725}
726testcase TC_lu_by_tmsi_noauth_unknown() runs on MTC_CT {
727 var BSC_ConnHdlr vc_conn;
728 f_init();
729
730 vc_conn := f_start_handler(refers(f_tc_lu_tmsi_noauth_unknown), testcasename(), 1);
731 vc_conn.done;
732}
733
734
Harald Welte45164da2018-01-24 12:51:27 +0100735/* Test IMSI DETACH (MI=IMSI) */
736private function f_tc_imsi_detach_by_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
737 g_pars := pars;
738
739 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
740
741 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
742 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
743
744 /* Send Early Classmark, just for the fun of it? */
745 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
746
747 /* wait for normal teardown */
748 BSSAP.receive(tr_BSSMAP_ClearCommand);
749 BSSAP.send(ts_BSSMAP_ClearComplete);
750 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
751 setverdict(pass);
752}
753testcase TC_imsi_detach_by_imsi() runs on MTC_CT {
754 var BSC_ConnHdlr vc_conn;
755 f_init();
756
757 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imsi), testcasename(), 2);
758 vc_conn.done;
759}
760
761/* Test IMSI DETACH (MI=TMSI) */
762private function f_tc_imsi_detach_by_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
763 g_pars := pars;
764
765 var MobileIdentityLV mi := valueof(ts_MI_TMSI_LV('01020304'O));
766
767 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
768 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
769
770 /* Send Early Classmark, just for the fun of it? */
771 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
772
773 /* wait for normal teardown */
774 BSSAP.receive(tr_BSSMAP_ClearCommand);
775 BSSAP.send(ts_BSSMAP_ClearComplete);
776 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
777 setverdict(pass);
778}
779testcase TC_imsi_detach_by_tmsi() runs on MTC_CT {
780 var BSC_ConnHdlr vc_conn;
781 f_init();
782
783 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_tmsi), testcasename(), 3);
784 vc_conn.done;
785}
786
787/* Test IMSI DETACH (MI=IMEI), which is illegal */
788private function f_tc_imsi_detach_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
789 g_pars := pars;
790
791 var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imsi));
792
793 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
794 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
795
796 /* Send Early Classmark, just for the fun of it? */
797 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
798
799 /* wait for normal teardown */
800 BSSAP.receive(tr_BSSMAP_ClearCommand);
801 BSSAP.send(ts_BSSMAP_ClearComplete);
802 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
803 setverdict(pass);
804}
805testcase TC_imsi_detach_by_imei() runs on MTC_CT {
806 var BSC_ConnHdlr vc_conn;
807 f_init();
808
809 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imei), testcasename(), 4);
810 vc_conn.done;
811}
812
813
814/* helper function for an emergency call. caller passes in mobile identity to use */
815private function f_emerg_call(MobileIdentityLV mi) runs on BSC_ConnHdlr {
816
817 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0010'B, mi));
818 f_bssap_compl_l3(l3_info);
819 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC));
820
821 var hexstring called := '112'H;
822 var integer tid := 0;
823 var MNCC_PDU mncc;
824 f_create_mncc_expect(hex2str(called));
825
826 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_EMERG_SETUP(tid)));
827 MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(called)))) -> value mncc;
828 /* FIXME: extract call_id */
829
830 /* Call Proceeding */
831 MNCC.send(ts_MNCC_CALL_PROC_req(mncc.u.signal.callref, ts_MNCC_bcap_voice));
832 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(tid)));
833
834 /* Alerting */
835 MNCC.send(ts_MNCC_ALERT_req(mncc.u.signal.callref));
836 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(tid)));
837
838 /* Answer. This causes TCH assignment in case of "late assignment" */
839 MNCC.send(ts_MNCC_SETUP_COMPL_req(mncc.u.signal.callref));
840
841 f_sleep(3.0);
842
843 /* Hangup by "B" side */
844 MNCC.send(ts_MNCC_DISC_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(23))));
845 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(tid)));
846
847 /* Release of call */
848 MNCC.send(ts_MNCC_REL_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(42))));
849 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(tid)));
850
851 /* clearing of radio channel */
852 BSSAP.receive(tr_BSSMAP_ClearCommand);
853 BSSAP.send(ts_BSSMAP_ClearComplete);
854 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
855
856 f_sleep(5.0);
857}
858
859/* establish an emergency call by IMEI, no SIM inserted (and hence no IMSI) */
860private function f_tc_emerg_call_imei_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
861 g_pars := pars;
862
863 var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imsi));
864 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0010'B, mi));
865 f_bssap_compl_l3(l3_info);
866 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ('05'O)));
867 setverdict(pass);
868}
869testcase TC_emerg_call_imei_reject() runs on MTC_CT {
870 var BSC_ConnHdlr vc_conn;
871 f_init();
872
873 vc_conn := f_start_handler(refers(f_tc_emerg_call_imei_reject), testcasename(), 5);
874 vc_conn.done;
875}
876
877/* establish an emergency call by IMEI, no SIM inserted (and hence no IMSI) */
878private function f_tc_emerg_call_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
879 g_pars := pars;
880 /* First perform location update to ensure subscriber is known */
881 f_perform_lu(false, true, true);
882 /* Then issue emergency call identified by IMSI */
883 f_emerg_call(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
884}
885testcase TC_emerg_call_imsi() runs on MTC_CT {
886 var BSC_ConnHdlr vc_conn;
887 f_init();
888
889 vc_conn := f_start_handler(refers(f_tc_emerg_call_imsi), testcasename(), 6);
890 vc_conn.done;
891}
892
893/* CM Service Request for VGCS -> reject */
894private function f_tc_cm_serv_req_vgcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
895 g_pars := pars;
896
897 /* First perform location update to ensure subscriber is known */
898 f_perform_lu(false, true, true);
899
900 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
901 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('1001'B, mi));
902 f_bssap_compl_l3(l3_info);
903 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
904 setverdict(pass);
905}
906testcase TC_cm_serv_req_vgcs_reject() runs on MTC_CT {
907 var BSC_ConnHdlr vc_conn;
908 f_init();
909
910 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vgcs_reject), testcasename(), 7);
911 vc_conn.done;
912}
913
914/* CM Service Request for VBS -> reject */
915private function f_tc_cm_serv_req_vbs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
916 g_pars := pars;
917
918 /* First perform location update to ensure subscriber is known */
919 f_perform_lu(false, true, true);
920
921 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
922 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('1010'B, mi));
923 f_bssap_compl_l3(l3_info);
924 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
925 setverdict(pass);
926}
927testcase TC_cm_serv_req_vbs_reject() runs on MTC_CT {
928 var BSC_ConnHdlr vc_conn;
929 f_init();
930
931 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vbs_reject), testcasename(), 8);
932 vc_conn.done;
933}
934
935/* CM Service Request for LCS -> reject */
936private function f_tc_cm_serv_req_lcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
937 g_pars := pars;
938
939 /* First perform location update to ensure subscriber is known */
940 f_perform_lu(false, true, true);
941
942 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
943 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('1011'B, mi));
944 f_bssap_compl_l3(l3_info);
945 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
946 setverdict(pass);
947}
948testcase TC_cm_serv_req_lcs_reject() runs on MTC_CT {
949 var BSC_ConnHdlr vc_conn;
950 f_init();
951
952 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_lcs_reject), testcasename(), 9);
953 vc_conn.done;
954}
955
956
Harald Welteba7b6d92018-01-23 21:32:34 +0100957/* TODO:
958 * continue to send repeated MO signalling messages to keep channel open: does MSC tmeout?
959 * malformed messages (missing IE, invalid message type): properly rejected?
960 * MT call while LU or is ongoing: Do we use existing lchan or page while lchan active?
961 * 3G/2G auth permutations
962 * encryption algorithms vs. classmark vs. vty config
963 * emergency call
964 * IMSI DETACH
965 * send new transaction after/during clear (like SMS, ...)
Harald Welte45164da2018-01-24 12:51:27 +0100966 * too long L3 INFO in DTAP
967 * too long / padded BSSAP
968 * too long / short TLV values
Harald Welteba7b6d92018-01-23 21:32:34 +0100969 */
Harald Weltef6dd64d2017-11-19 12:09:51 +0100970
971
972control {
Harald Weltea49e36e2018-01-21 19:29:33 +0100973 execute( TC_cmserv_imsi_unknown() );
974 execute( TC_lu_imsi_noauth_tmsi() );
975 //execute( TC_lu_imsi_noauth_notmsi() );
976 execute( TC_lu_imsi_reject() );
977 execute( TC_lu_imsi_timeout_gsup() );
Harald Welte2bb825f2018-01-22 11:31:18 +0100978 execute( TC_lu_and_mo_call() );
Harald Welte071ed732018-01-23 19:53:52 +0100979 execute( TC_lu_auth_sai_timeout() );
980 execute( TC_lu_auth_sai_err() );
Harald Weltee1a2f3c2018-01-24 17:28:48 +0100981 execute( TC_lu_clear_request() );
982 execute( TC_lu_disconnect() );
983 execute( TC_lu_by_imei() );
984 execute( TC_lu_by_tmsi_noauth_unknown() );
985 execute( TC_imsi_detach_by_imsi() );
986 execute( TC_imsi_detach_by_tmsi() );
987 execute( TC_imsi_detach_by_imei() );
988 execute( TC_emerg_call_imei_reject() );
989 execute( TC_emerg_call_imsi() );
990 execute( TC_cm_serv_req_vgcs_reject() );
991 execute( TC_cm_serv_req_vbs_reject() );
992 execute( TC_cm_serv_req_lcs_reject() );
Harald Weltef6dd64d2017-11-19 12:09:51 +0100993}
994
995
996}