blob: 490fbc28950382701c737b04f5eadae36e8ec154 [file] [log] [blame]
Harald Welte96a33b02018-02-04 10:36:22 +01001module SGSN_Tests {
2
3import from General_Types all;
4import from Osmocom_Types all;
5import from NS_Types all;
6import from NS_Emulation all;
7import from BSSGP_Types all;
8import from BSSGP_Emulation all;
Harald Welte5ac31492018-02-15 20:39:13 +01009import from Osmocom_Gb_Types all;
10
11import from MobileL3_CommonIE_Types all;
12import from MobileL3_GMM_SM_Types all;
13import from MobileL3_Types all;
14import from L3_Templates all;
15import from L3_Common all;
16
17import from GSUP_Emulation all;
18import from GSUP_Types all;
19import from IPA_Emulation all;
20
Harald Weltebd194722018-02-16 22:11:08 +010021import from TELNETasp_PortType all;
22import from Osmocom_VTY_Functions all;
23
Harald Welte5ac31492018-02-15 20:39:13 +010024modulepar {
25 /* IP/port on which we run our internal GSUP/HLR emulation */
26 charstring mp_hlr_ip := "127.0.0.1";
27 integer mp_hlr_port := 4222;
28};
29
30type record GbInstance {
31 NS_CT vc_NS,
32 BSSGP_CT vc_BSSGP,
33 BssgpConfig cfg
34};
Harald Welte96a33b02018-02-04 10:36:22 +010035
36type component test_CT {
Harald Welte5ac31492018-02-15 20:39:13 +010037 var GbInstance g_gb[3];
Harald Welte96a33b02018-02-04 10:36:22 +010038
Harald Welte5ac31492018-02-15 20:39:13 +010039 var GSUP_Emulation_CT vc_GSUP;
40 var IPA_Emulation_CT vc_GSUP_IPA;
41 /* only to get events from IPA underneath GSUP */
42 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +010043
Harald Weltebd194722018-02-16 22:11:08 +010044 port TELNETasp_PT SGSNVTY;
45
Harald Welte96a33b02018-02-04 10:36:22 +010046 var boolean g_initialized := false;
47};
48
Harald Welte5ac31492018-02-15 20:39:13 +010049type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr {
50 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +010051 timer g_Tguard;
Harald Welte5ac31492018-02-15 20:39:13 +010052}
53
54type record SGSN_ConnHdlrNetworkPars {
55 boolean expect_ptmsi,
56 boolean expect_auth,
57 boolean expect_ciph
58};
59
60type record BSSGP_ConnHdlrPars {
61 /* IMEI of the simulated ME */
62 hexstring imei,
63 /* IMEI of the simulated MS */
64 hexstring imsi,
65 /* MSISDN of the simulated MS (probably unused) */
66 hexstring msisdn,
67 /* P-TMSI allocated to the simulated MS */
68 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +010069 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +010070 /* TLLI of the simulated MS */
71 OCT4 tlli,
72 RoutingAreaIdentificationV ra optional,
73 BssgpCellId bssgp_cell_id,
74 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +010075 SGSN_ConnHdlrNetworkPars net,
76 float t_guard
Harald Welte5ac31492018-02-15 20:39:13 +010077};
78
Harald Welte5ac31492018-02-15 20:39:13 +010079private function f_init_gb(inout GbInstance gb) runs on test_CT {
80 gb.vc_NS := NS_CT.create;
81 gb.vc_BSSGP := BSSGP_CT.create;
82 /* connect lower end of BSSGP emulation with NS upper port */
83 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
84 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
85 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
86
87 gb.vc_NS.start(NSStart());
88 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
89}
90
91private function f_init_gsup(charstring id) runs on test_CT {
92 id := id & "-GSUP";
93 var GsupOps ops := {
94 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
95 };
96
97 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
98 vc_GSUP := GSUP_Emulation_CT.create(id);
99
100 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
101 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
102 /* we use this hack to get events like ASP_IPA_EVENT_UP */
103 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
104
105 vc_GSUP.start(GSUP_Emulation.main(ops, id));
106 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
107
108 /* wait for incoming connection to GSUP port before proceeding */
109 timer T := 10.0;
110 T.start;
111 alt {
112 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
113 [] T.timeout {
114 setverdict(fail, "No connection to GSUP Port");
115 self.stop;
116 }
117 }
118}
119
Harald Weltebd194722018-02-16 22:11:08 +0100120private function f_init_vty() runs on test_CT {
121 map(self:SGSNVTY, system:SGSNVTY);
122 f_vty_set_prompts(SGSNVTY);
123 f_vty_transceive(SGSNVTY, "enable");
124 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
125}
126
127
Harald Welte96a33b02018-02-04 10:36:22 +0100128function f_init() runs on test_CT {
129 if (g_initialized == true) {
130 return;
131 }
132 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100133 g_gb[0].cfg := {
134 nsei := 96,
135 bvci := 196,
136 cell_id := {
137 ra_id := {
138 lai := {
139 mcc_mnc := '26242F'H, lac := 13135},
140 rac := 0
141 },
142 cell_id := 20960
143 },
144 sgsn_role := false
145 };
Harald Welte96a33b02018-02-04 10:36:22 +0100146
Harald Welte5ac31492018-02-15 20:39:13 +0100147 f_init_gb(g_gb[0]);
148 f_init_gsup("SGSN_Test");
Harald Weltebd194722018-02-16 22:11:08 +0100149 f_init_vty();
Harald Welte5ac31492018-02-15 20:39:13 +0100150}
Harald Welte96a33b02018-02-04 10:36:22 +0100151
Harald Welte5ac31492018-02-15 20:39:13 +0100152type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
153
154/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Harald Welte62e29582018-02-16 21:17:11 +0100155function f_start_handler(void_fn fn, charstring id, GbInstance gb, integer imsi_suffix,
156 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100157runs on test_CT return BSSGP_ConnHdlr {
158 var BSSGP_ConnHdlr vc_conn;
159 var SGSN_ConnHdlrNetworkPars net_pars := {
160 expect_ptmsi := true,
161 expect_auth := true,
162 expect_ciph := false
163 };
164 var BSSGP_ConnHdlrPars pars := {
165 imei := f_gen_imei(imsi_suffix),
166 imsi := f_gen_imsi(imsi_suffix),
167 msisdn := f_gen_msisdn(imsi_suffix),
168 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100169 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100170 tlli := f_gprs_tlli_random(),
Harald Welte5ac31492018-02-15 20:39:13 +0100171 ra := omit,
172 bssgp_cell_id := gb.cfg.cell_id,
173 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100174 net := net_pars,
175 t_guard := t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100176 };
177
178 vc_conn := BSSGP_ConnHdlr.create(id);
179 connect(vc_conn:BSSGP, gb.vc_BSSGP:BSSGP_SP);
180 connect(vc_conn:BSSGP_PROC, gb.vc_BSSGP:BSSGP_PROC);
181
182 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
183 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
184
185 vc_conn.start(f_handler_init(fn, id, pars));
186 return vc_conn;
187}
188
Harald Welte62e29582018-02-16 21:17:11 +0100189private altstep as_Tguard() runs on BSSGP_ConnHdlr {
190 [] g_Tguard.timeout {
191 setverdict(fail, "Tguard timeout");
192 self.stop;
193 }
194}
195
Harald Welte5ac31492018-02-15 20:39:13 +0100196/* first function called in every ConnHdlr */
197private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
198runs on BSSGP_ConnHdlr {
199 /* do some common stuff like setting up g_pars */
200 g_pars := pars;
201
202 /* register with BSSGP core */
203 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
204 /* tell GSUP dispatcher to send this IMSI to us */
205 f_create_gsup_expect(hex2str(g_pars.imsi));
206
Harald Welte62e29582018-02-16 21:17:11 +0100207 g_Tguard.start(pars.t_guard);
208 activate(as_Tguard());
209
Harald Welte5ac31492018-02-15 20:39:13 +0100210 /* call the user-supplied test case function */
211 fn.apply(id);
212 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100213}
214
215/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100216 * Detach without Attach
217 * SM procedures without attach / RAU
218 * ATTACH / RAU
219 ** with / without authentication
220 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100221 ** reject from HLR on SAI
222 ** reject from HLR on UL
223 * re-transmissions of LLC frames
224 * PDP Context activation
225 ** with different GGSN config in SGSN VTY
226 ** with different PDP context type (v4/v6/v46)
227 ** timeout from GGSN
228 ** reject from GGSN
229 */
230
231testcase TC_wait_ns_up() runs on test_CT {
232 f_init();
233 f_sleep(20.0);
234}
235
Harald Welte5ac31492018-02-15 20:39:13 +0100236altstep as_mm_identity() runs on BSSGP_ConnHdlr {
237 var MobileIdentityLV mi;
238 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
239 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
240 BSSGP.send(ts_GMM_ID_RESP(mi));
241 repeat;
242 }
243 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
244 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
245 BSSGP.send(ts_GMM_ID_RESP(mi));
246 repeat;
247 }
248}
Harald Welte96a33b02018-02-04 10:36:22 +0100249
Harald Welte5ac31492018-02-15 20:39:13 +0100250function f_gmm_auth () runs on BSSGP_ConnHdlr {
251 var BssgpDecoded bd;
252 var PDU_L3_MS_SGSN l3_mo;
253 var PDU_L3_SGSN_MS l3_mt;
254 var default di := activate(as_mm_identity());
255 if (g_pars.net.expect_auth) {
256 g_pars.vec := f_gen_auth_vec_2g();
257 var GSUP_IE auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
258 g_pars.vec.sres,
259 g_pars.vec.kc));
260 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
261 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
262 BSSGP.receive(tr_BD_L3_MT(tr_GMM_AUTH_REQ(g_pars.vec.rand))) -> value bd;
263 l3_mt := bd.l3_mt;
264 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
265 l3_mo := valueof(ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres));
266 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
267 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
268 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
269 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
270 }
271 BSSGP.send(l3_mo);
Harald Welte76dee092018-02-16 22:12:59 +0100272 } else {
273 /* wait for identity procedure */
274 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100275 }
Harald Welte76dee092018-02-16 22:12:59 +0100276
Harald Welte5ac31492018-02-15 20:39:13 +0100277 deactivate(di);
278}
279
Harald Welte04683d02018-02-16 22:43:45 +0100280function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
281 /* mandatory IE */
282 g_pars.ra := aa.routingAreaIdentification;
283 if (ispresent(aa.allocatedPTMSI)) {
284 if (not g_pars.net.expect_ptmsi) {
285 setverdict(fail, "unexpected P-TMSI allocation");
286 self.stop;
287 }
288 g_pars.p_tmsi := aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets;
289 /* update TLLI? */
290 }
291 if (ispresent(aa.msIdentity)) {
292 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
293 self.stop;
294 }
295 /* P-TMSI.sig */
296 if (ispresent(aa.ptmsiSignature)) {
297 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
298 }
299 /* updateTimer */
300 // aa.readyTimer
301 /* T3302, T3319, T3323, T3312_ext, T3324 */
302}
303
Harald Welte5a4fa042018-02-16 20:59:21 +0100304function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
305 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
306}
307
Harald Welte5ac31492018-02-15 20:39:13 +0100308private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100309 var BssgpDecoded bd;
Harald Welte5ac31492018-02-15 20:39:13 +0100310 var MobileIdentityLV mi;
Harald Welte5a4fa042018-02-16 20:59:21 +0100311 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte5ac31492018-02-15 20:39:13 +0100312
313 if (ispresent(g_pars.p_tmsi)) {
314 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
315 } else {
316 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
317 }
318
319 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
320 f_gmm_auth();
321 /* Expect MSC to perform LU with HLR */
322 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
323 GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
324 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
325 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
326
Harald Welte04683d02018-02-16 22:43:45 +0100327 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
328 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
329 }
330 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Harald Welte5ac31492018-02-15 20:39:13 +0100331 BSSGP.send(ts_GMM_ATTACH_COMPL);
Harald Welte5a4fa042018-02-16 20:59:21 +0100332 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100333}
334
335testcase TC_attach() runs on test_CT {
336 var BSSGP_ConnHdlr vc_conn;
337 f_init();
338 f_sleep(1.0);
339 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb[0], 1);
340 vc_conn.done;
341}
342
Harald Welte5b7c8122018-02-16 21:48:17 +0100343/* MS never responds to ID REQ, expect ATTACH REJECT */
344private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
345 var MobileIdentityLV mi;
346 var RoutingAreaIdentificationV old_ra := f_random_RAI();
347
348 if (ispresent(g_pars.p_tmsi)) {
349 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
350 } else {
351 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
352 }
353
354 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
355 alt {
Harald Welte1967d472018-02-16 21:54:21 +0100356 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100357 /* don't send ID Response */
358 repeat;
359 }
Harald Welte1967d472018-02-16 21:54:21 +0100360 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100361 setverdict(pass);
362 }
Harald Welte1967d472018-02-16 21:54:21 +0100363 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100364 setverdict(fail, "Wrong Attach Reject Cause");
365 }
366 }
367}
368testcase TC_attach_auth_id_timeout() runs on test_CT {
369 var BSSGP_ConnHdlr vc_conn;
370 f_init();
371 vc_conn := f_start_handler(refers(f_TC_attach_auth_id_timeout), testcasename(), g_gb[0], 2, 40.0);
372 vc_conn.done;
373}
374
375/* HLR never responds to SAI REQ, expect ATTACH REJECT */
376private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
377 var MobileIdentityLV mi;
378 var RoutingAreaIdentificationV old_ra := f_random_RAI();
379
380 if (ispresent(g_pars.p_tmsi)) {
381 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
382 } else {
383 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
384 }
385
386 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
387 alt {
388 [] as_mm_identity();
389 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
390 }
391 /* don't send SAI-response from HLR */
Harald Welte1967d472018-02-16 21:54:21 +0100392 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Welte5b7c8122018-02-16 21:48:17 +0100393 setverdict(pass);
394}
395testcase TC_attach_auth_sai_timeout() runs on test_CT {
396 var BSSGP_ConnHdlr vc_conn;
397 f_init();
398 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb[0], 3);
399 vc_conn.done;
400}
401
Harald Weltefe253882018-02-17 09:25:00 +0100402/* HLR rejects SAI, expect ATTACH REJECT */
403private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
404 var MobileIdentityLV mi;
405 var RoutingAreaIdentificationV old_ra := f_random_RAI();
406
407 if (ispresent(g_pars.p_tmsi)) {
408 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
409 } else {
410 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
411 }
412
413 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
414 alt {
415 [] as_mm_identity();
416 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
417 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
418 }
419 }
420 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
421 setverdict(pass);
422}
423testcase TC_attach_auth_sai_reject() runs on test_CT {
424 var BSSGP_ConnHdlr vc_conn;
425 f_init();
Harald Welteb7c14e92018-02-17 09:29:16 +0100426 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb[0], 4);
Harald Weltefe253882018-02-17 09:25:00 +0100427 vc_conn.done;
428}
429
Harald Welte5b7c8122018-02-16 21:48:17 +0100430/* HLR never responds to UL REQ, expect ATTACH REJECT */
431private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100432 var BssgpDecoded bd;
Harald Welte5b7c8122018-02-16 21:48:17 +0100433 var MobileIdentityLV mi;
434 var RoutingAreaIdentificationV old_ra := f_random_RAI();
435
436 if (ispresent(g_pars.p_tmsi)) {
437 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
438 } else {
439 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
440 }
441
442 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
443 f_gmm_auth();
444 /* Expect MSC to perform LU with HLR */
445 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
446 /* Never follow-up with ISD_REQ or UL_RES */
447 alt {
Harald Welte1967d472018-02-16 21:54:21 +0100448 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100449 setverdict(pass);
450 }
Harald Welte04683d02018-02-16 22:43:45 +0100451 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
452 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100453 setverdict(fail);
454 }
455 }
456}
457testcase TC_attach_gsup_lu_timeout() runs on test_CT {
458 var BSSGP_ConnHdlr vc_conn;
459 f_init();
460 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100461 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb[0], 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100462 vc_conn.done;
463}
464
Harald Welteb7c14e92018-02-17 09:29:16 +0100465/* HLR rejects UL REQ, expect ATTACH REJECT */
466private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
467 var BssgpDecoded bd;
468 var MobileIdentityLV mi;
469 var RoutingAreaIdentificationV old_ra := f_random_RAI();
470
471 if (ispresent(g_pars.p_tmsi)) {
472 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
473 } else {
474 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
475 }
476
477 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
478 f_gmm_auth();
479 /* Expect MSC to perform LU with HLR */
480 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
481 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
482 }
483 alt {
484 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
485 setverdict(pass);
486 }
487 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
488 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
489 setverdict(fail);
490 }
491 }
492}
493testcase TC_attach_gsup_lu_reject() runs on test_CT {
494 var BSSGP_ConnHdlr vc_conn;
495 f_init();
496 f_sleep(1.0);
497 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb[0], 6);
498 vc_conn.done;
499}
500
501
Harald Welte3823e2e2018-02-16 21:53:48 +0100502/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
503private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100504 var BssgpDecoded bd;
Harald Welte3823e2e2018-02-16 21:53:48 +0100505 var MobileIdentityLV mi;
506 var RoutingAreaIdentificationV old_ra := f_random_RAI();
507
508 if (ispresent(g_pars.p_tmsi)) {
509 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
510 } else {
511 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
512 }
513
514 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, true, false, omit, omit));
515 f_gmm_auth();
516 /* Expect MSC to perform LU with HLR */
517 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
518 GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
519 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
520 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
521
Harald Welte04683d02018-02-16 22:43:45 +0100522 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
523 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
524 }
Harald Welte3823e2e2018-02-16 21:53:48 +0100525 BSSGP.send(ts_GMM_ATTACH_COMPL);
526 setverdict(pass);
527}
Harald Welte3823e2e2018-02-16 21:53:48 +0100528testcase TC_attach_combined() runs on test_CT {
529 var BSSGP_ConnHdlr vc_conn;
530 f_init();
531 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100532 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb[0], 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100533 vc_conn.done;
534}
535
Harald Welte76dee092018-02-16 22:12:59 +0100536/* Attempt of GPRS ATTACH in 'accept all' mode */
537private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100538 var BssgpDecoded bd;
Harald Welte76dee092018-02-16 22:12:59 +0100539 var MobileIdentityLV mi;
540 var RoutingAreaIdentificationV old_ra := f_random_RAI();
541
542 g_pars.net.expect_auth := false;
543
544 if (ispresent(g_pars.p_tmsi)) {
545 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
546 } else {
547 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
548 }
549
550 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
551 f_gmm_auth();
Harald Welte04683d02018-02-16 22:43:45 +0100552 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
553 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
554 }
Harald Welte76dee092018-02-16 22:12:59 +0100555 BSSGP.send(ts_GMM_ATTACH_COMPL);
556 setverdict(pass);
557}
558testcase TC_attach_accept_all() runs on test_CT {
559 var BSSGP_ConnHdlr vc_conn;
560 f_init();
561 f_sleep(1.0);
562 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Harald Welteb7c14e92018-02-17 09:29:16 +0100563 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 8);
Harald Welte76dee092018-02-16 22:12:59 +0100564 vc_conn.done;
565}
Harald Welte5b7c8122018-02-16 21:48:17 +0100566
Harald Welteb2124b22018-02-16 22:26:56 +0100567/* Attempt of GPRS ATTACH in 'accept all' mode */
568private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
569 var MobileIdentityLV mi;
570 var RoutingAreaIdentificationV old_ra := f_random_RAI();
571
572 /* Simulate a foreign IMSI */
573 g_pars.imsi := '001010123456789'H;
574 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
575
576 g_pars.net.expect_auth := false;
577
578 if (ispresent(g_pars.p_tmsi)) {
579 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
580 } else {
581 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
582 }
583 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
584 alt {
585 [] as_mm_identity();
586 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
587 setverdict(pass);
588 }
589 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
590 setverdict(pass);
591 }
592 }
593}
594testcase TC_attach_closed() runs on test_CT {
595 var BSSGP_ConnHdlr vc_conn;
596 f_init();
597 f_sleep(1.0);
598 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
599 /* test with foreign IMSI: Must Reject */
Harald Welteb7c14e92018-02-17 09:29:16 +0100600 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb[0], 9);
Harald Welteb2124b22018-02-16 22:26:56 +0100601 vc_conn.done;
602 /* test with home IMSI: Must Accept */
Harald Welteb7c14e92018-02-17 09:29:16 +0100603 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 10);
Harald Welteb2124b22018-02-16 22:26:56 +0100604 vc_conn.done;
605}
606
Harald Welte04683d02018-02-16 22:43:45 +0100607/* Routing Area Update from Unknown TLLI -> REJECT */
608private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
609 var MobileIdentityLV mi;
610 var RoutingAreaIdentificationV old_ra := f_random_RAI();
611
612 if (ispresent(g_pars.p_tmsi)) {
613 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
614 } else {
615 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
616 }
617
618 BSSGP.send(ts_GMM_RAU_REQ(mi, GPRS_UPD_T_RA, old_ra, false, omit, omit));
619 alt {
620 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
621 setverdict(pass);
622 }
623 /* FIXME: Expect XID RESET? */
624 [] BSSGP.receive { repeat; }
625 }
626}
627testcase TC_rau_unknown() runs on test_CT {
628 var BSSGP_ConnHdlr vc_conn;
629 f_init();
630 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100631 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb[0], 11);
Harald Welte04683d02018-02-16 22:43:45 +0100632 vc_conn.done;
633}
634
635
Harald Welteb2124b22018-02-16 22:26:56 +0100636
Harald Welte5ac31492018-02-15 20:39:13 +0100637
638control {
Harald Welte5b7c8122018-02-16 21:48:17 +0100639 execute( TC_attach() );
640 execute( TC_attach_auth_id_timeout() );
641 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +0100642 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +0100643 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +0100644 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +0100645 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +0100646 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +0100647 execute( TC_attach_closed() );
Harald Welte04683d02018-02-16 22:43:45 +0100648 execute( TC_rau_unknown() );
Harald Welte5ac31492018-02-15 20:39:13 +0100649}
Harald Welte96a33b02018-02-04 10:36:22 +0100650
651
652
653}