blob: e0ee84cde9a478ae856ccad43c851e2d12d4f27e [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
29import from GSUP_Emulation all;
30import from GSUP_Types all;
31import from IPA_Emulation all;
32
Harald Weltef6dd64d2017-11-19 12:09:51 +010033import from BSSAP_Types all;
Harald Weltea49e36e2018-01-21 19:29:33 +010034import from BSSAP_Adapter all;
35import from BSSAP_CodecPort all;
36import from BSSMAP_Templates all;
37import from BSSMAP_Emulation all;
38import from BSC_ConnectionHandler all;
Harald Weltef6dd64d2017-11-19 12:09:51 +010039
Harald Weltea49e36e2018-01-21 19:29:33 +010040import from MobileL3_Types all;
41import from MobileL3_CommonIE_Types all;
42import from L3_Templates all;
Harald Weltef6dd64d2017-11-19 12:09:51 +010043
Harald Weltef6dd64d2017-11-19 12:09:51 +010044
Harald Weltea49e36e2018-01-21 19:29:33 +010045type component MTC_CT extends BSSAP_Adapter_CT, CTRL_Adapter_CT {
Harald Weltef6dd64d2017-11-19 12:09:51 +010046 var boolean g_initialized := false;
Harald Weltea49e36e2018-01-21 19:29:33 +010047
48 /* no 'adapter_CT' for MNCC or GSUP */
49 var MNCC_Emulation_CT vc_MNCC;
50 var GSUP_Emulation_CT vc_GSUP;
51 var IPA_Emulation_CT vc_GSUP_IPA;
52
53 /* only to get events from IPA underneath GSUP */
54 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte3ca1c902018-01-24 18:51:27 +010055 /* VTY to MSC */
56 port TELNETasp_PT MSCVTY;
Harald Weltef6dd64d2017-11-19 12:09:51 +010057}
58
59modulepar {
Harald Weltea49e36e2018-01-21 19:29:33 +010060 /* remote parameters of IUT */
61 charstring mp_msc_ip := "127.0.0.1";
62 integer mp_msc_ctrl_port := 4255;
63 integer mp_msc_vty_port := 4254;
Harald Weltef6dd64d2017-11-19 12:09:51 +010064
Harald Weltea49e36e2018-01-21 19:29:33 +010065 /* local parameters of emulated HLR */
66 charstring mp_hlr_ip := "127.0.0.1";
67 integer mp_hlr_port := 4222;
Harald Weltef6dd64d2017-11-19 12:09:51 +010068
Harald Weltea49e36e2018-01-21 19:29:33 +010069 charstring mp_msc_mncc := "/tmp/mncc";
Harald Weltef6dd64d2017-11-19 12:09:51 +010070}
71
72
Harald Weltea49e36e2018-01-21 19:29:33 +010073function f_init_mncc(charstring id) runs on MTC_CT {
74 id := id & "-MNCC";
75 var MnccOps ops := {
76 create_cb := refers(MNCC_Emulation.ExpectedCreateCallback),
77 unitdata_cb := refers(MNCC_Emulation.DummyUnitdataCallback)
78 }
79
80 vc_MNCC := MNCC_Emulation_CT.create(id);
81 map(vc_MNCC:MNCC, system:MNCC_CODEC_PT);
82 vc_MNCC.start(MNCC_Emulation.main(ops, id, mp_msc_mncc));
Harald Weltef6dd64d2017-11-19 12:09:51 +010083}
84
Harald Weltea49e36e2018-01-21 19:29:33 +010085function f_init_gsup(charstring id) runs on MTC_CT {
86 id := id & "-GSUP";
87 var GsupOps ops := {
88 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
89 }
90
91 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
92 vc_GSUP := GSUP_Emulation_CT.create(id);
93
94 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
95 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
96 /* we use this hack to get events like ASP_IPA_EVENT_UP */
97 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
98
99 vc_GSUP.start(GSUP_Emulation.main(ops, id));
100 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
101
102 /* wait for incoming connection to GSUP port before proceeding */
103 timer T := 10.0;
104 T.start;
105 alt {
106 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
107 [] T.timeout {
108 setverdict(inconc, "No connection to GSUP Port");
109 self.stop
110 }
111 }
Harald Weltef6dd64d2017-11-19 12:09:51 +0100112}
113
Harald Weltea49e36e2018-01-21 19:29:33 +0100114function f_init() runs on MTC_CT {
Harald Weltef6dd64d2017-11-19 12:09:51 +0100115
116 if (g_initialized == true) {
117 return;
118 }
119 g_initialized := true;
120
Harald Weltea49e36e2018-01-21 19:29:33 +0100121 f_bssap_init("MSC_Test", BSC_BssmapOps);
122 f_ipa_ctrl_start(mp_msc_ip, mp_msc_ctrl_port);
123 f_init_mncc("MSC_Test");
124 f_init_gsup("MSC_Test");
Harald Welte3ca1c902018-01-24 18:51:27 +0100125
126 map(self:MSCVTY, system:MSCVTY);
127 f_vty_set_prompts(MSCVTY);
128 f_vty_transceive(MSCVTY, "enable");
Harald Weltef6dd64d2017-11-19 12:09:51 +0100129}
130
131template PDU_BSSAP ts_BSSAP_BSSMAP := {
132 discriminator := '0'B,
133 spare := '0000000'B,
134 dlci := omit,
135 lengthIndicator := 0, /* overwritten by codec */
136 pdu := ?
137}
138
139template PDU_BSSAP tr_BSSAP_BSSMAP := {
140 discriminator := '0'B,
141 spare := '0000000'B,
142 dlci := omit,
143 lengthIndicator := ?,
144 pdu := {
145 bssmap := ?
146 }
147}
148
149
150type integer BssmapCause;
151
152template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
153 elementIdentifier := '04'O,
154 lengthIndicator := 0,
155 causeValue := int2bit(val, 7),
156 extensionCauseValue := '0'B,
157 spare1 := omit
158}
159
160template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {
161 pdu := {
162 bssmap := {
163 reset := {
164 messageType := '30'O,
165 cause := ts_BSSMAP_IE_Cause(cause),
166 a_InterfaceSelectorForReset := omit
167 }
168 }
169 }
170}
171
172template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {
173 pdu := {
174 bssmap := {
175 resetAck := {
176 messageType := '31'O,
177 a_InterfaceSelectorForReset := omit
178 }
179 }
180 }
181}
182
183template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {
184 pdu := {
185 bssmap := {
186 resetAck := {
187 messageType := '31'O,
188 a_InterfaceSelectorForReset := *
189 }
190 }
191 }
192}
193
194template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
195 elementIdentifier := '05'O,
196 lengthIndicator := 0,
197 cellIdentifierDiscriminator := '0000'B,
198 spare1_4 := '0000'B,
199 cellIdentification := ?
200}
201
202type uint16_t BssmapLAC;
203type uint16_t BssmapCI;
204
205/*
206template BSSMAP_IE_CellIdentifier ts_CellId_CGI(mcc, mnc, lac, ci)
207modifies ts_BSSMAP_IE_CellID := {
208 cellIdentification := {
209 cI_LAC_CGI := {
210 mnc_mcc := FIXME,
211 lac := int2oct(lac, 2),
212 ci := int2oct(ci, 2)
213 }
214 }
215}
216*/
217
218template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
219modifies ts_BSSMAP_IE_CellID := {
220 cellIdentification := {
221 cI_LAC_CI := {
222 lac := int2oct(lac, 2),
223 ci := int2oct(ci, 2)
224 }
225 }
226}
227
228template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
229modifies ts_BSSMAP_IE_CellID := {
230 cellIdentification := {
231 cI_CI := int2oct(ci, 2)
232 }
233}
234
235template BSSMAP_IE_CellIdentifier ts_CellId_none
236modifies ts_BSSMAP_IE_CellID := {
237 cellIdentification := {
238 cI_noCell := ''O
239 }
240}
241
242
243template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
244 elementIdentifier := '17'O,
245 lengthIndicator := 0,
246 layer3info := l3info
247}
248
249template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
250modifies ts_BSSAP_BSSMAP := {
251 pdu := {
252 bssmap := {
253 completeLayer3Information := {
254 messageType := '57'O,
255 cellIdentifier := cell_id,
256 layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
257 chosenChannel := omit,
258 lSAIdentifier := omit,
259 aPDU := omit,
260 codecList := omit,
261 redirectAttemptFlag := omit,
262 sendSequenceNumber := omit,
263 iMSI := omit
264 }
265 }
266 }
267}
268
269template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_IE_CellIdentifierList cid_list)
270modifies ts_BSSAP_BSSMAP := {
271 pdu := {
272 bssmap := {
273 handoverRequired := {
274 messageType := '11'O,
275 cause := ts_BSSMAP_IE_Cause(cause),
276 responseRequest := omit,
277 cellIdentifierList := cid_list,
278 circuitPoolList := omit,
279 currentChannelType1 := omit,
280 speechVersion := omit,
281 queueingIndicator := omit,
282 oldToNewBSSInfo := omit,
283 sourceToTargetRNCTransparentInfo := omit,
284 sourceToTargetRNCTransparentInfoCDMA := omit,
285 gERANClassmark := omit,
286 talkerPriority := omit,
287 speechCodec := omit,
288 cSG_Identifier := omit
289 }
290 }
291 }
292}
293
294// enc_PDU_BSSAP
295
296function f_send_BSSAP_UNITDATA(template PDU_BSSAP bssap) runs on MTC_CT {
Harald Weltea49e36e2018-01-21 19:29:33 +0100297 BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, bssap))
Harald Weltef6dd64d2017-11-19 12:09:51 +0100298}
299
Harald Weltea49e36e2018-01-21 19:29:33 +0100300type function void_fn(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr;
Harald Weltef6dd64d2017-11-19 12:09:51 +0100301
Harald Welte256571e2018-01-24 18:47:19 +0100302function f_gen_imei(hexstring prefix, integer suffix) return hexstring {
303 var integer suffix_len := 15 - lengthof(prefix);
304 suffix_len := suffix_len;
305 return prefix & int2hex(suffix, suffix_len);
306}
307
Harald Weltea49e36e2018-01-21 19:29:33 +0100308function f_gen_imsi(hexstring prefix, integer suffix) return hexstring {
309 var integer suffix_len := 15 - lengthof(prefix);
310 suffix_len := suffix_len-1; /* FIXME: fix odd IMSI length */
311 return prefix & int2hex(suffix, suffix_len);
312}
313
314function f_gen_msisdn(hexstring prefix, integer suffix) return hexstring {
315 var integer suffix_len := 12 - lengthof(prefix);
316 return prefix & int2hex(suffix, suffix_len);
317}
318
319/* FIXME: move into BSC_ConnectionHandler? */
320function f_start_handler(void_fn fn, charstring id, integer imsi_suffix) runs on MTC_CT return BSC_ConnHdlr {
321 var BSC_ConnHdlr vc_conn;
322 var BSC_ConnHdlrPars pars := {
323 sccp_addr_own := g_sccp_addr_own,
324 sccp_addr_peer := g_sccp_addr_peer,
325 cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42)),
Harald Welte256571e2018-01-24 18:47:19 +0100326 imei := f_gen_imei('49999'H, imsi_suffix),
Harald Weltea49e36e2018-01-21 19:29:33 +0100327 imsi := f_gen_imsi('26242'H, imsi_suffix),
Harald Welte82600572018-01-21 20:54:08 +0100328 msisdn := f_gen_msisdn('491239999'H, imsi_suffix),
Harald Welte256571e2018-01-24 18:47:19 +0100329 tmsi := omit,
Harald Welte82600572018-01-21 20:54:08 +0100330 cm2 := valueof(ts_CM2_default),
331 cm3 := omit
Harald Weltea49e36e2018-01-21 19:29:33 +0100332 };
333
334 vc_conn := BSC_ConnHdlr.create(id);
335 /* BSSMAP part / A interface */
336 connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
337 connect(vc_conn:BSSAP_PROC, vc_BSSMAP:PROC);
338 /* MNCC part */
339 connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);
340 connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);
341 /* GSUP part */
342 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
343 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
344
345 vc_conn.start(derefers(fn)(id, pars));
346 return vc_conn;
347}
348
349function f_sleep(float seconds) {
350 timer T := seconds;
Harald Weltef6dd64d2017-11-19 12:09:51 +0100351 T.start;
352 T.timeout;
Harald Weltea49e36e2018-01-21 19:29:33 +0100353}
Harald Weltef6dd64d2017-11-19 12:09:51 +0100354
Harald Welte3ca1c902018-01-24 18:51:27 +0100355function f_vty_config(TELNETasp_PT pt, charstring config_node, charstring cmd)
356{
357 /* enter config mode; enter node */
358 f_vty_enter_config(pt);
359 f_vty_transceive(pt, config_node);
360 /* execute command */
361 f_vty_transceive(pt, cmd);
362 /* leave config mode */
363 f_vty_transceive(pt, "end");
364}
365
Harald Weltea49e36e2018-01-21 19:29:33 +0100366private function f_tc_lu_imsi_noauth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
367 g_pars := pars;
Harald Welte8a121b32018-01-22 03:00:41 +0100368 f_perform_lu(false, true, true);
Harald Weltea49e36e2018-01-21 19:29:33 +0100369}
Harald Weltea49e36e2018-01-21 19:29:33 +0100370testcase TC_lu_imsi_noauth_tmsi() runs on MTC_CT {
371 var BSC_ConnHdlr vc_conn;
372 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100373 f_vty_config(MSCVTY, "network", "authentication optional");
374 f_vty_config(MSCVTY, "msc", "assign-tmsi");
Harald Weltea49e36e2018-01-21 19:29:33 +0100375
376 vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_tmsi), testcasename(), 1);
377 vc_conn.done;
378}
379
380private function f_tc_lu_imsi_noauth_notmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
381 g_pars := pars;
Harald Welte8a121b32018-01-22 03:00:41 +0100382 f_perform_lu(false, false, true);
Harald Weltea49e36e2018-01-21 19:29:33 +0100383}
Harald Weltea49e36e2018-01-21 19:29:33 +0100384testcase TC_lu_imsi_noauth_notmsi() runs on MTC_CT {
385 var BSC_ConnHdlr vc_conn;
386 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100387 f_vty_config(MSCVTY, "network", "authentication optional");
388 f_vty_config(MSCVTY, "msc", "no assign-tmsi");
Harald Weltea49e36e2018-01-21 19:29:33 +0100389
390 vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_notmsi), testcasename(), 2);
391 vc_conn.done;
392}
393
394/* Do LU by IMSI, refuse it on GSUP and expect LU REJ back to MS */
395private function f_tc_lu_imsi_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
396 g_pars := pars;
397 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
398
399 f_create_gsup_expect(hex2str(g_pars.imsi));
400 f_bssap_compl_l3(l3_lu);
401 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
402 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 23));
403 alt {
404 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej(int2oct(23,1)))) { }
405 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
406 setverdict(fail, "Expecting LU REJ, but got ACCEPT");
407 self.stop;
408 }
409 }
410 BSSAP.receive(tr_BSSMAP_ClearCommand);
411 BSSAP.send(ts_BSSMAP_ClearComplete);
412 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
413 setverdict(pass);
414}
415testcase TC_lu_imsi_reject() runs on MTC_CT {
416 var BSC_ConnHdlr vc_conn;
417 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100418 f_vty_config(MSCVTY, "network", "authentication optional");
Harald Weltea49e36e2018-01-21 19:29:33 +0100419
420 vc_conn := f_start_handler(refers(f_tc_lu_imsi_reject), testcasename(), 3);
421 vc_conn.done;
422}
423
424/* Do LU by IMSI, timeout on GSUP */
425private function f_tc_lu_imsi_timeout_gsup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
426 g_pars := pars;
427 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
428
429 f_create_gsup_expect(hex2str(g_pars.imsi));
430 f_bssap_compl_l3(l3_lu);
431 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
432 /* Normally the HLR would need to respond here, but we decide to force a timeout here */
433 alt {
434 /* FIXME: Expect specific reject cause */
435 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
436 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
437 setverdict(fail, "Expecting LU REJ, but got ACCEPT");
438 self.stop;
439 }
440 }
441 BSSAP.receive(tr_BSSMAP_ClearCommand);
442 BSSAP.send(ts_BSSMAP_ClearComplete);
443 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
444 setverdict(pass);
445}
446testcase TC_lu_imsi_timeout_gsup() runs on MTC_CT {
447 var BSC_ConnHdlr vc_conn;
448 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100449 f_vty_config(MSCVTY, "network", "authentication optional");
Harald Weltea49e36e2018-01-21 19:29:33 +0100450
451 vc_conn := f_start_handler(refers(f_tc_lu_imsi_timeout_gsup), testcasename(), 4);
452 vc_conn.done;
453}
454
Harald Welte7b1b2812018-01-22 21:23:06 +0100455private function f_tc_lu_imsi_auth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
456 g_pars := pars;
457 f_perform_lu(true, true, true);
458}
459testcase TC_lu_imsi_auth_tmsi() runs on MTC_CT {
460 var BSC_ConnHdlr vc_conn;
461 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100462 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte7b1b2812018-01-22 21:23:06 +0100463
464 vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth_tmsi), testcasename(), 5);
465 vc_conn.done;
466}
467
Harald Weltea49e36e2018-01-21 19:29:33 +0100468
469/* Send CM SERVICE REQ for IMSI that has never performed LU before */
470private function f_tc_cmserv_imsi_unknown(charstring id, BSC_ConnHdlrPars pars)
471runs on BSC_ConnHdlr {
472
473 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
474 var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42));
475 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0001'B, mi));
476
477 f_create_gsup_expect(hex2str(g_pars.imsi));
478
479 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
480 f_bssap_compl_l3(l3_info);
481
482 timer T := 10.0;
Harald Weltef6dd64d2017-11-19 12:09:51 +0100483 T.start;
484 alt {
Harald Weltea49e36e2018-01-21 19:29:33 +0100485 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ)) { }
486 //[] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC)) { }
487 [] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
488 [] GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
489 setverdict(fail, "Unexpected GSUP UL REQ");
490 }
491 [] T.timeout { setverdict(inconc, "Timeout waiting for CM SERV REQ"); }
Harald Weltef6dd64d2017-11-19 12:09:51 +0100492 }
493
Harald Weltea49e36e2018-01-21 19:29:33 +0100494 alt {
495 [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
496 setverdict(pass);
497 }
498 [] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
499 [] T.timeout { setverdict(inconc, "Timeout waiting for CM SERV REQ"); }
500 }
Harald Weltef6dd64d2017-11-19 12:09:51 +0100501}
Harald Weltea49e36e2018-01-21 19:29:33 +0100502testcase TC_cmserv_imsi_unknown() runs on MTC_CT {
503 var BSC_ConnHdlr vc_conn;
504 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100505 f_vty_config(MSCVTY, "network", "authentication optional");
Harald Weltea49e36e2018-01-21 19:29:33 +0100506 vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), testcasename(), 5);
507 vc_conn.done;
508}
509
Harald Welte2bb825f2018-01-22 11:31:18 +0100510private function f_tc_lu_and_mo_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
511 g_pars := pars;
512 f_perform_lu(false, true, true);
513
514 f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)), false);
515
516 var hexstring called := '12345'H;
517 var integer tid := 0;
518 var MNCC_PDU mncc;
519 f_create_mncc_expect(hex2str(called));
520
521 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(tid, called)));
522 MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(called)))) -> value mncc;
523 /* FIXME: extract call_id */
524
525 /* Call Proceeding */
526 MNCC.send(ts_MNCC_CALL_PROC_req(mncc.u.signal.callref, ts_MNCC_bcap_voice));
527 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(tid)));
528
529 /* Alerting */
530 MNCC.send(ts_MNCC_ALERT_req(mncc.u.signal.callref));
531 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(tid)));
532
533 /* Answer. This causes TCH assignment in case of "late assignment" */
534 MNCC.send(ts_MNCC_SETUP_COMPL_req(mncc.u.signal.callref));
535
536 f_sleep(3.0);
537
538 /* Hangup by "B" side */
539 MNCC.send(ts_MNCC_DISC_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(23))));
540 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(tid)));
541
542 /* Release of call */
543 MNCC.send(ts_MNCC_REL_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(42))));
544 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(tid)));
545
546 /* clearing of radio channel */
547 BSSAP.receive(tr_BSSMAP_ClearCommand);
548 BSSAP.send(ts_BSSMAP_ClearComplete);
549 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
550
551 f_sleep(5.0);
552}
553testcase TC_lu_and_mo_call() runs on MTC_CT {
554 var BSC_ConnHdlr vc_conn;
555 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100556 f_vty_config(MSCVTY, "network", "authentication optional");
Harald Welte2bb825f2018-01-22 11:31:18 +0100557
Harald Welte071ed732018-01-23 19:53:52 +0100558 vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), testcasename(), 6);
559 vc_conn.done;
560}
561
562/* Test LU (with authentication enabled), where HLR times out sending SAI response */
563private function f_tc_lu_auth_sai_timeout(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
564 g_pars := pars;
565
566 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
567 var PDU_DTAP_MT dtap_mt;
568
569 /* tell GSUP dispatcher to send this IMSI to us */
570 f_create_gsup_expect(hex2str(g_pars.imsi));
571
572 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
573 f_bssap_compl_l3(l3_lu);
574
575 /* Send Early Classmark, just for the fun of it */
576 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
577
578 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
579 /* The HLR would normally return an auth vector here, but we fail to do so. */
580
581 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej));
582 BSSAP.receive(tr_BSSMAP_ClearCommand);
583 BSSAP.send(ts_BSSMAP_ClearComplete);
584 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
585 setverdict(pass);
586}
587testcase TC_lu_auth_sai_timeout() runs on MTC_CT {
588 var BSC_ConnHdlr vc_conn;
589 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100590 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte071ed732018-01-23 19:53:52 +0100591
592 vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_timeout), testcasename(), 7);
593 vc_conn.done;
594}
595
596/* Test LU (with authentication enabled), where HLR rejects sending SAI error */
597private function f_tc_lu_auth_sai_err(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
598 g_pars := pars;
599
600 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
601 var PDU_DTAP_MT dtap_mt;
602
603 /* tell GSUP dispatcher to send this IMSI to us */
604 f_create_gsup_expect(hex2str(g_pars.imsi));
605
606 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
607 f_bssap_compl_l3(l3_lu);
608
609 /* Send Early Classmark, just for the fun of it */
610 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
611
612 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
613 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 13));
614
615 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej));
616 BSSAP.receive(tr_BSSMAP_ClearCommand);
617 BSSAP.send(ts_BSSMAP_ClearComplete);
618 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
619 setverdict(pass);
620}
621testcase TC_lu_auth_sai_err() runs on MTC_CT {
622 var BSC_ConnHdlr vc_conn;
623 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100624 f_vty_config(MSCVTY, "network", "authentication required");
Harald Welte071ed732018-01-23 19:53:52 +0100625
626 vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_err), testcasename(), 8);
Harald Welte2bb825f2018-01-22 11:31:18 +0100627 vc_conn.done;
628}
Harald Weltea49e36e2018-01-21 19:29:33 +0100629
Harald Weltebc881782018-01-23 20:09:15 +0100630/* Test LU but BSC will send a clear request in the middle */
631private function f_tc_lu_clear_request(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
632 g_pars := pars;
633
634 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
635 var PDU_DTAP_MT dtap_mt;
636
637 /* tell GSUP dispatcher to send this IMSI to us */
638 f_create_gsup_expect(hex2str(g_pars.imsi));
639
640 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
641 f_bssap_compl_l3(l3_lu);
642
643 /* Send Early Classmark, just for the fun of it */
644 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
645
646 f_sleep(1.0);
647 /* send clear request in the middle of the LU */
648 BSSAP.send(ts_BSSMAP_ClearRequest(0));
649 BSSAP.receive(tr_BSSMAP_ClearCommand);
650 BSSAP.send(ts_BSSMAP_ClearComplete);
651 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
652 setverdict(pass);
653}
654testcase TC_lu_clear_request() runs on MTC_CT {
655 var BSC_ConnHdlr vc_conn;
656 f_init();
657
658 vc_conn := f_start_handler(refers(f_tc_lu_clear_request), testcasename(), 8);
659 vc_conn.done;
660}
661
Harald Welte66af9e62018-01-24 17:28:21 +0100662/* Test LU but BSC will send a clear request in the middle */
663private function f_tc_lu_disconnect(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
664 g_pars := pars;
665
666 var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
667 var PDU_DTAP_MT dtap_mt;
668
669 /* tell GSUP dispatcher to send this IMSI to us */
670 f_create_gsup_expect(hex2str(g_pars.imsi));
671
672 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
673 f_bssap_compl_l3(l3_lu);
674
675 /* Send Early Classmark, just for the fun of it */
676 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
677
678 f_sleep(1.0);
679 /* send clear request in the middle of the LU */
680 BSSAP.send(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);
681 setverdict(pass);
682}
683testcase TC_lu_disconnect() runs on MTC_CT {
684 var BSC_ConnHdlr vc_conn;
685 f_init();
686
687 vc_conn := f_start_handler(refers(f_tc_lu_disconnect), testcasename(), 9);
688 vc_conn.done;
689}
690
691
Harald Welteba7b6d92018-01-23 21:32:34 +0100692/* Test LU but with illegal mobile identity type = IMEI */
693private function f_tc_lu_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
694 g_pars := pars;
695
Harald Welte256571e2018-01-24 18:47:19 +0100696 var PDU_ML3_MS_NW l3_lu := f_build_lu_imei(g_pars.imei)
Harald Welteba7b6d92018-01-23 21:32:34 +0100697 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 /* wait for LU reject, ignore any ID REQ */
708 alt {
709 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
710 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_ID_Req)) { repeat; }
711 }
712 /* wait for normal teardown */
713 BSSAP.receive(tr_BSSMAP_ClearCommand);
714 BSSAP.send(ts_BSSMAP_ClearComplete);
715 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
716 setverdict(pass);
717}
718testcase TC_lu_by_imei() runs on MTC_CT {
719 var BSC_ConnHdlr vc_conn;
720 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100721 f_vty_config(MSCVTY, "network", "authentication optional");
Harald Welteba7b6d92018-01-23 21:32:34 +0100722
723 vc_conn := f_start_handler(refers(f_tc_lu_by_imei), testcasename(), 9);
724 vc_conn.done;
725}
726
727/* Test LU by TMSI with unknown TMSI, expect (and answer) ID REQ. */
728private function f_tc_lu_tmsi_noauth_unknown(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
729 g_pars := pars;
730
731 var PDU_ML3_MS_NW l3_lu := f_build_lu_tmsi('01020304'O); /* FIXME: Random */
732 var PDU_DTAP_MT dtap_mt;
733
734 /* tell GSUP dispatcher to send this IMSI to us */
735 f_create_gsup_expect(hex2str(g_pars.imsi));
736
737 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
738 f_bssap_compl_l3(l3_lu);
739
740 /* Send Early Classmark, just for the fun of it */
741 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
742
743 /* Wait for + respond to ID REQ (IMSI) */
744 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_ID_Req('001'B)));
745 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_MM_ID_Rsp_IMSI(g_pars.imsi)));
746
747 /* Expect MSC to do UpdateLocation to HLR; respond to it */
748 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
749 GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
750 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
751 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
752
753 alt {
754 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) { }
755 [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {
756 setverdict(fail, "Expected LU ACK, but received REJ");
757 }
758 }
759
760 /* wait for normal teardown */
761 BSSAP.receive(tr_BSSMAP_ClearCommand);
762 BSSAP.send(ts_BSSMAP_ClearComplete);
763 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
764 setverdict(pass);
765}
766testcase TC_lu_by_tmsi_noauth_unknown() runs on MTC_CT {
767 var BSC_ConnHdlr vc_conn;
768 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100769 f_vty_config(MSCVTY, "network", "authentication optional");
Harald Welteba7b6d92018-01-23 21:32:34 +0100770
771 vc_conn := f_start_handler(refers(f_tc_lu_tmsi_noauth_unknown), testcasename(), 1);
772 vc_conn.done;
773}
774
775
Harald Welte45164da2018-01-24 12:51:27 +0100776/* Test IMSI DETACH (MI=IMSI) */
777private function f_tc_imsi_detach_by_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
778 g_pars := pars;
779
780 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
781
782 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
783 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
784
785 /* Send Early Classmark, just for the fun of it? */
786 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
787
788 /* wait for normal teardown */
789 BSSAP.receive(tr_BSSMAP_ClearCommand);
790 BSSAP.send(ts_BSSMAP_ClearComplete);
791 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
792 setverdict(pass);
793}
794testcase TC_imsi_detach_by_imsi() runs on MTC_CT {
795 var BSC_ConnHdlr vc_conn;
796 f_init();
797
798 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imsi), testcasename(), 2);
799 vc_conn.done;
800}
801
802/* Test IMSI DETACH (MI=TMSI) */
803private function f_tc_imsi_detach_by_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
804 g_pars := pars;
805
806 var MobileIdentityLV mi := valueof(ts_MI_TMSI_LV('01020304'O));
807
808 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
809 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
810
811 /* Send Early Classmark, just for the fun of it? */
812 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
813
814 /* wait for normal teardown */
815 BSSAP.receive(tr_BSSMAP_ClearCommand);
816 BSSAP.send(ts_BSSMAP_ClearComplete);
817 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
818 setverdict(pass);
819}
820testcase TC_imsi_detach_by_tmsi() runs on MTC_CT {
821 var BSC_ConnHdlr vc_conn;
822 f_init();
823
824 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_tmsi), testcasename(), 3);
825 vc_conn.done;
826}
827
828/* Test IMSI DETACH (MI=IMEI), which is illegal */
829private function f_tc_imsi_detach_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
830 g_pars := pars;
831
Harald Welte256571e2018-01-24 18:47:19 +0100832 var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Harald Welte45164da2018-01-24 12:51:27 +0100833
834 /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
835 f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
836
837 /* Send Early Classmark, just for the fun of it? */
838 BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
839
840 /* wait for normal teardown */
841 BSSAP.receive(tr_BSSMAP_ClearCommand);
842 BSSAP.send(ts_BSSMAP_ClearComplete);
843 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
844 setverdict(pass);
845}
846testcase TC_imsi_detach_by_imei() runs on MTC_CT {
847 var BSC_ConnHdlr vc_conn;
848 f_init();
849
850 vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imei), testcasename(), 4);
851 vc_conn.done;
852}
853
854
855/* helper function for an emergency call. caller passes in mobile identity to use */
856private function f_emerg_call(MobileIdentityLV mi) runs on BSC_ConnHdlr {
857
858 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0010'B, mi));
859 f_bssap_compl_l3(l3_info);
860 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC));
861
862 var hexstring called := '112'H;
863 var integer tid := 0;
864 var MNCC_PDU mncc;
865 f_create_mncc_expect(hex2str(called));
866
867 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_EMERG_SETUP(tid)));
868 MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(called)))) -> value mncc;
869 /* FIXME: extract call_id */
870
871 /* Call Proceeding */
872 MNCC.send(ts_MNCC_CALL_PROC_req(mncc.u.signal.callref, ts_MNCC_bcap_voice));
873 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(tid)));
874
875 /* Alerting */
876 MNCC.send(ts_MNCC_ALERT_req(mncc.u.signal.callref));
877 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(tid)));
878
879 /* Answer. This causes TCH assignment in case of "late assignment" */
880 MNCC.send(ts_MNCC_SETUP_COMPL_req(mncc.u.signal.callref));
881
882 f_sleep(3.0);
883
884 /* Hangup by "B" side */
885 MNCC.send(ts_MNCC_DISC_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(23))));
886 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(tid)));
887
888 /* Release of call */
889 MNCC.send(ts_MNCC_REL_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(42))));
890 BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(tid)));
891
892 /* clearing of radio channel */
893 BSSAP.receive(tr_BSSMAP_ClearCommand);
894 BSSAP.send(ts_BSSMAP_ClearComplete);
895 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
896
897 f_sleep(5.0);
898}
899
900/* establish an emergency call by IMEI, no SIM inserted (and hence no IMSI) */
901private function f_tc_emerg_call_imei_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
902 g_pars := pars;
903
Harald Welte256571e2018-01-24 18:47:19 +0100904 var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Harald Welte45164da2018-01-24 12:51:27 +0100905 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0010'B, mi));
906 f_bssap_compl_l3(l3_info);
907 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ('05'O)));
908 setverdict(pass);
909}
910testcase TC_emerg_call_imei_reject() runs on MTC_CT {
911 var BSC_ConnHdlr vc_conn;
912 f_init();
913
914 vc_conn := f_start_handler(refers(f_tc_emerg_call_imei_reject), testcasename(), 5);
915 vc_conn.done;
916}
917
Harald Welted5b91402018-01-24 18:48:16 +0100918/* establish an emergency call by IMSI, SIM inserted (and hence IMSI) */
Harald Welte45164da2018-01-24 12:51:27 +0100919private function f_tc_emerg_call_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
920 g_pars := pars;
921 /* First perform location update to ensure subscriber is known */
922 f_perform_lu(false, true, true);
923 /* Then issue emergency call identified by IMSI */
924 f_emerg_call(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
925}
926testcase TC_emerg_call_imsi() runs on MTC_CT {
927 var BSC_ConnHdlr vc_conn;
928 f_init();
Harald Welte3ca1c902018-01-24 18:51:27 +0100929 f_vty_config(MSCVTY, "network", "authentication optional");
Harald Welte45164da2018-01-24 12:51:27 +0100930
931 vc_conn := f_start_handler(refers(f_tc_emerg_call_imsi), testcasename(), 6);
932 vc_conn.done;
933}
934
935/* CM Service Request for VGCS -> reject */
936private function f_tc_cm_serv_req_vgcs_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('1001'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_vgcs_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_vgcs_reject), testcasename(), 7);
953 vc_conn.done;
954}
955
956/* CM Service Request for VBS -> reject */
957private function f_tc_cm_serv_req_vbs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
958 g_pars := pars;
959
960 /* First perform location update to ensure subscriber is known */
961 f_perform_lu(false, true, true);
962
963 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
964 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('1010'B, mi));
965 f_bssap_compl_l3(l3_info);
966 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
967 setverdict(pass);
968}
969testcase TC_cm_serv_req_vbs_reject() runs on MTC_CT {
970 var BSC_ConnHdlr vc_conn;
971 f_init();
972
973 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vbs_reject), testcasename(), 8);
974 vc_conn.done;
975}
976
977/* CM Service Request for LCS -> reject */
978private function f_tc_cm_serv_req_lcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
979 g_pars := pars;
980
981 /* First perform location update to ensure subscriber is known */
982 f_perform_lu(false, true, true);
983
984 var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
985 var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('1011'B, mi));
986 f_bssap_compl_l3(l3_info);
987 BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
988 setverdict(pass);
989}
990testcase TC_cm_serv_req_lcs_reject() runs on MTC_CT {
991 var BSC_ConnHdlr vc_conn;
992 f_init();
993
994 vc_conn := f_start_handler(refers(f_tc_cm_serv_req_lcs_reject), testcasename(), 9);
995 vc_conn.done;
996}
997
998
Harald Welteba7b6d92018-01-23 21:32:34 +0100999/* TODO:
1000 * continue to send repeated MO signalling messages to keep channel open: does MSC tmeout?
1001 * malformed messages (missing IE, invalid message type): properly rejected?
1002 * MT call while LU or is ongoing: Do we use existing lchan or page while lchan active?
1003 * 3G/2G auth permutations
1004 * encryption algorithms vs. classmark vs. vty config
1005 * emergency call
1006 * IMSI DETACH
1007 * send new transaction after/during clear (like SMS, ...)
Harald Welte45164da2018-01-24 12:51:27 +01001008 * too long L3 INFO in DTAP
1009 * too long / padded BSSAP
1010 * too long / short TLV values
Harald Welteba7b6d92018-01-23 21:32:34 +01001011 */
Harald Weltef6dd64d2017-11-19 12:09:51 +01001012
1013
1014control {
Harald Weltea49e36e2018-01-21 19:29:33 +01001015 execute( TC_cmserv_imsi_unknown() );
1016 execute( TC_lu_imsi_noauth_tmsi() );
1017 //execute( TC_lu_imsi_noauth_notmsi() );
1018 execute( TC_lu_imsi_reject() );
1019 execute( TC_lu_imsi_timeout_gsup() );
Harald Welte2bb825f2018-01-22 11:31:18 +01001020 execute( TC_lu_and_mo_call() );
Harald Welte071ed732018-01-23 19:53:52 +01001021 execute( TC_lu_auth_sai_timeout() );
1022 execute( TC_lu_auth_sai_err() );
Harald Weltee1a2f3c2018-01-24 17:28:48 +01001023 execute( TC_lu_clear_request() );
1024 execute( TC_lu_disconnect() );
1025 execute( TC_lu_by_imei() );
1026 execute( TC_lu_by_tmsi_noauth_unknown() );
1027 execute( TC_imsi_detach_by_imsi() );
1028 execute( TC_imsi_detach_by_tmsi() );
1029 execute( TC_imsi_detach_by_imei() );
1030 execute( TC_emerg_call_imei_reject() );
1031 execute( TC_emerg_call_imsi() );
1032 execute( TC_cm_serv_req_vgcs_reject() );
1033 execute( TC_cm_serv_req_vbs_reject() );
1034 execute( TC_cm_serv_req_lcs_reject() );
Harald Weltef6dd64d2017-11-19 12:09:51 +01001035}
1036
1037
1038}