blob: 9f8dd69d09d9497bd2231e7166ee8583ba61ad02 [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 Weltef6dd64d2017-11-19 12:09:51 +0100591
592
593control {
Harald Weltea49e36e2018-01-21 19:29:33 +0100594 execute( TC_cmserv_imsi_unknown() );
595 execute( TC_lu_imsi_noauth_tmsi() );
596 //execute( TC_lu_imsi_noauth_notmsi() );
597 execute( TC_lu_imsi_reject() );
598 execute( TC_lu_imsi_timeout_gsup() );
Harald Welte2bb825f2018-01-22 11:31:18 +0100599 execute( TC_lu_and_mo_call() );
Harald Welte071ed732018-01-23 19:53:52 +0100600 execute( TC_lu_auth_sai_timeout() );
601 execute( TC_lu_auth_sai_err() );
Harald Weltef6dd64d2017-11-19 12:09:51 +0100602}
603
604
605}