blob: be1af57ee263d034c25a19999b4e81c520ece134 [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,
69 /* TLLI of the simulated MS */
70 OCT4 tlli,
71 RoutingAreaIdentificationV ra optional,
72 BssgpCellId bssgp_cell_id,
73 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +010074 SGSN_ConnHdlrNetworkPars net,
75 float t_guard
Harald Welte5ac31492018-02-15 20:39:13 +010076};
77
Harald Welte5ac31492018-02-15 20:39:13 +010078private function f_init_gb(inout GbInstance gb) runs on test_CT {
79 gb.vc_NS := NS_CT.create;
80 gb.vc_BSSGP := BSSGP_CT.create;
81 /* connect lower end of BSSGP emulation with NS upper port */
82 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
83 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
84 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
85
86 gb.vc_NS.start(NSStart());
87 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
88}
89
90private function f_init_gsup(charstring id) runs on test_CT {
91 id := id & "-GSUP";
92 var GsupOps ops := {
93 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
94 };
95
96 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
97 vc_GSUP := GSUP_Emulation_CT.create(id);
98
99 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
100 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
101 /* we use this hack to get events like ASP_IPA_EVENT_UP */
102 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
103
104 vc_GSUP.start(GSUP_Emulation.main(ops, id));
105 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
106
107 /* wait for incoming connection to GSUP port before proceeding */
108 timer T := 10.0;
109 T.start;
110 alt {
111 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
112 [] T.timeout {
113 setverdict(fail, "No connection to GSUP Port");
114 self.stop;
115 }
116 }
117}
118
Harald Weltebd194722018-02-16 22:11:08 +0100119private function f_init_vty() runs on test_CT {
120 map(self:SGSNVTY, system:SGSNVTY);
121 f_vty_set_prompts(SGSNVTY);
122 f_vty_transceive(SGSNVTY, "enable");
123 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
124}
125
126
Harald Welte96a33b02018-02-04 10:36:22 +0100127function f_init() runs on test_CT {
128 if (g_initialized == true) {
129 return;
130 }
131 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100132 g_gb[0].cfg := {
133 nsei := 96,
134 bvci := 196,
135 cell_id := {
136 ra_id := {
137 lai := {
138 mcc_mnc := '26242F'H, lac := 13135},
139 rac := 0
140 },
141 cell_id := 20960
142 },
143 sgsn_role := false
144 };
Harald Welte96a33b02018-02-04 10:36:22 +0100145
Harald Welte5ac31492018-02-15 20:39:13 +0100146 f_init_gb(g_gb[0]);
147 f_init_gsup("SGSN_Test");
Harald Weltebd194722018-02-16 22:11:08 +0100148 f_init_vty();
Harald Welte5ac31492018-02-15 20:39:13 +0100149}
Harald Welte96a33b02018-02-04 10:36:22 +0100150
Harald Welte5ac31492018-02-15 20:39:13 +0100151type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
152
153/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Harald Welte62e29582018-02-16 21:17:11 +0100154function f_start_handler(void_fn fn, charstring id, GbInstance gb, integer imsi_suffix,
155 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100156runs on test_CT return BSSGP_ConnHdlr {
157 var BSSGP_ConnHdlr vc_conn;
158 var SGSN_ConnHdlrNetworkPars net_pars := {
159 expect_ptmsi := true,
160 expect_auth := true,
161 expect_ciph := false
162 };
163 var BSSGP_ConnHdlrPars pars := {
164 imei := f_gen_imei(imsi_suffix),
165 imsi := f_gen_imsi(imsi_suffix),
166 msisdn := f_gen_msisdn(imsi_suffix),
167 p_tmsi := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100168 tlli := f_gprs_tlli_random(),
Harald Welte5ac31492018-02-15 20:39:13 +0100169 ra := omit,
170 bssgp_cell_id := gb.cfg.cell_id,
171 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100172 net := net_pars,
173 t_guard := t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100174 };
175
176 vc_conn := BSSGP_ConnHdlr.create(id);
177 connect(vc_conn:BSSGP, gb.vc_BSSGP:BSSGP_SP);
178 connect(vc_conn:BSSGP_PROC, gb.vc_BSSGP:BSSGP_PROC);
179
180 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
181 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
182
183 vc_conn.start(f_handler_init(fn, id, pars));
184 return vc_conn;
185}
186
Harald Welte62e29582018-02-16 21:17:11 +0100187private altstep as_Tguard() runs on BSSGP_ConnHdlr {
188 [] g_Tguard.timeout {
189 setverdict(fail, "Tguard timeout");
190 self.stop;
191 }
192}
193
Harald Welte5ac31492018-02-15 20:39:13 +0100194/* first function called in every ConnHdlr */
195private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
196runs on BSSGP_ConnHdlr {
197 /* do some common stuff like setting up g_pars */
198 g_pars := pars;
199
200 /* register with BSSGP core */
201 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
202 /* tell GSUP dispatcher to send this IMSI to us */
203 f_create_gsup_expect(hex2str(g_pars.imsi));
204
Harald Welte62e29582018-02-16 21:17:11 +0100205 g_Tguard.start(pars.t_guard);
206 activate(as_Tguard());
207
Harald Welte5ac31492018-02-15 20:39:13 +0100208 /* call the user-supplied test case function */
209 fn.apply(id);
210 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100211}
212
213/* TODO:
214 * RAU without Attach
215 * Detach without Attach
216 * SM procedures without attach / RAU
217 * ATTACH / RAU
218 ** with / without authentication
219 ** with / without P-TMSI allocation
220 ** timeout from HLR on SAI
221 ** timeout from HLR on UL
222 ** reject from HLR on SAI
223 ** reject from HLR on UL
224 * re-transmissions of LLC frames
225 * PDP Context activation
226 ** with different GGSN config in SGSN VTY
227 ** with different PDP context type (v4/v6/v46)
228 ** timeout from GGSN
229 ** reject from GGSN
230 */
231
232testcase TC_wait_ns_up() runs on test_CT {
233 f_init();
234 f_sleep(20.0);
235}
236
Harald Welte5ac31492018-02-15 20:39:13 +0100237altstep as_mm_identity() runs on BSSGP_ConnHdlr {
238 var MobileIdentityLV mi;
239 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
240 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
241 BSSGP.send(ts_GMM_ID_RESP(mi));
242 repeat;
243 }
244 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
245 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
246 BSSGP.send(ts_GMM_ID_RESP(mi));
247 repeat;
248 }
249}
Harald Welte96a33b02018-02-04 10:36:22 +0100250
Harald Welte5ac31492018-02-15 20:39:13 +0100251function f_gmm_auth () runs on BSSGP_ConnHdlr {
252 var BssgpDecoded bd;
253 var PDU_L3_MS_SGSN l3_mo;
254 var PDU_L3_SGSN_MS l3_mt;
255 var default di := activate(as_mm_identity());
256 if (g_pars.net.expect_auth) {
257 g_pars.vec := f_gen_auth_vec_2g();
258 var GSUP_IE auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
259 g_pars.vec.sres,
260 g_pars.vec.kc));
261 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
262 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
263 BSSGP.receive(tr_BD_L3_MT(tr_GMM_AUTH_REQ(g_pars.vec.rand))) -> value bd;
264 l3_mt := bd.l3_mt;
265 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
266 l3_mo := valueof(ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres));
267 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
268 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
269 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
270 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
271 }
272 BSSGP.send(l3_mo);
Harald Welte76dee092018-02-16 22:12:59 +0100273 } else {
274 /* wait for identity procedure */
275 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100276 }
Harald Welte76dee092018-02-16 22:12:59 +0100277
Harald Welte5ac31492018-02-15 20:39:13 +0100278 deactivate(di);
279}
280
Harald Welte5a4fa042018-02-16 20:59:21 +0100281function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
282 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
283}
284
Harald Welte5ac31492018-02-15 20:39:13 +0100285private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
286 var MobileIdentityLV mi;
Harald Welte5a4fa042018-02-16 20:59:21 +0100287 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte5ac31492018-02-15 20:39:13 +0100288
289 if (ispresent(g_pars.p_tmsi)) {
290 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
291 } else {
292 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
293 }
294
295 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
296 f_gmm_auth();
297 /* Expect MSC to perform LU with HLR */
298 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
299 GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
300 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
301 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
302
Harald Welte1967d472018-02-16 21:54:21 +0100303 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)));
Harald Welte5ac31492018-02-15 20:39:13 +0100304 BSSGP.send(ts_GMM_ATTACH_COMPL);
Harald Welte5a4fa042018-02-16 20:59:21 +0100305 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100306}
307
308testcase TC_attach() runs on test_CT {
309 var BSSGP_ConnHdlr vc_conn;
310 f_init();
311 f_sleep(1.0);
312 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb[0], 1);
313 vc_conn.done;
314}
315
Harald Welte5b7c8122018-02-16 21:48:17 +0100316/* MS never responds to ID REQ, expect ATTACH REJECT */
317private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
318 var MobileIdentityLV mi;
319 var RoutingAreaIdentificationV old_ra := f_random_RAI();
320
321 if (ispresent(g_pars.p_tmsi)) {
322 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
323 } else {
324 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
325 }
326
327 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
328 alt {
Harald Welte1967d472018-02-16 21:54:21 +0100329 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100330 /* don't send ID Response */
331 repeat;
332 }
Harald Welte1967d472018-02-16 21:54:21 +0100333 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100334 setverdict(pass);
335 }
Harald Welte1967d472018-02-16 21:54:21 +0100336 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100337 setverdict(fail, "Wrong Attach Reject Cause");
338 }
339 }
340}
341testcase TC_attach_auth_id_timeout() runs on test_CT {
342 var BSSGP_ConnHdlr vc_conn;
343 f_init();
344 vc_conn := f_start_handler(refers(f_TC_attach_auth_id_timeout), testcasename(), g_gb[0], 2, 40.0);
345 vc_conn.done;
346}
347
348/* HLR never responds to SAI REQ, expect ATTACH REJECT */
349private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
350 var MobileIdentityLV mi;
351 var RoutingAreaIdentificationV old_ra := f_random_RAI();
352
353 if (ispresent(g_pars.p_tmsi)) {
354 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
355 } else {
356 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
357 }
358
359 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
360 alt {
361 [] as_mm_identity();
362 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
363 }
364 /* don't send SAI-response from HLR */
Harald Welte1967d472018-02-16 21:54:21 +0100365 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Welte5b7c8122018-02-16 21:48:17 +0100366 setverdict(pass);
367}
368testcase TC_attach_auth_sai_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_sai_timeout), testcasename(), g_gb[0], 3);
372 vc_conn.done;
373}
374
375/* HLR never responds to UL REQ, expect ATTACH REJECT */
376private function f_TC_attach_gsup_lu_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 f_gmm_auth();
388 /* Expect MSC to perform LU with HLR */
389 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
390 /* Never follow-up with ISD_REQ or UL_RES */
391 alt {
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 }
Harald Welte1967d472018-02-16 21:54:21 +0100395 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100396 setverdict(fail);
397 }
398 }
399}
400testcase TC_attach_gsup_lu_timeout() runs on test_CT {
401 var BSSGP_ConnHdlr vc_conn;
402 f_init();
403 f_sleep(1.0);
404 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb[0], 4);
405 vc_conn.done;
406}
407
Harald Welte3823e2e2018-02-16 21:53:48 +0100408/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
409private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
410 var MobileIdentityLV mi;
411 var RoutingAreaIdentificationV old_ra := f_random_RAI();
412
413 if (ispresent(g_pars.p_tmsi)) {
414 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
415 } else {
416 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
417 }
418
419 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, true, false, omit, omit));
420 f_gmm_auth();
421 /* Expect MSC to perform LU with HLR */
422 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
423 GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
424 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
425 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
426
Harald Welte1967d472018-02-16 21:54:21 +0100427 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)));
Harald Welte3823e2e2018-02-16 21:53:48 +0100428 BSSGP.send(ts_GMM_ATTACH_COMPL);
429 setverdict(pass);
430}
431
432testcase TC_attach_combined() runs on test_CT {
433 var BSSGP_ConnHdlr vc_conn;
434 f_init();
435 f_sleep(1.0);
436 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb[0], 5);
437 vc_conn.done;
438}
439
Harald Welte76dee092018-02-16 22:12:59 +0100440/* Attempt of GPRS ATTACH in 'accept all' mode */
441private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
442 var MobileIdentityLV mi;
443 var RoutingAreaIdentificationV old_ra := f_random_RAI();
444
445 g_pars.net.expect_auth := false;
446
447 if (ispresent(g_pars.p_tmsi)) {
448 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
449 } else {
450 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
451 }
452
453 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
454 f_gmm_auth();
455 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)));
456 BSSGP.send(ts_GMM_ATTACH_COMPL);
457 setverdict(pass);
458}
459testcase TC_attach_accept_all() runs on test_CT {
460 var BSSGP_ConnHdlr vc_conn;
461 f_init();
462 f_sleep(1.0);
463 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
464 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 6);
465 vc_conn.done;
466}
Harald Welte5b7c8122018-02-16 21:48:17 +0100467
Harald Welteb2124b22018-02-16 22:26:56 +0100468/* Attempt of GPRS ATTACH in 'accept all' mode */
469private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
470 var MobileIdentityLV mi;
471 var RoutingAreaIdentificationV old_ra := f_random_RAI();
472
473 /* Simulate a foreign IMSI */
474 g_pars.imsi := '001010123456789'H;
475 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
476
477 g_pars.net.expect_auth := false;
478
479 if (ispresent(g_pars.p_tmsi)) {
480 mi := valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
481 } else {
482 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
483 }
484 BSSGP.send(ts_GMM_ATTACH_REQ(mi, old_ra, false, false, omit, omit));
485 alt {
486 [] as_mm_identity();
487 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
488 setverdict(pass);
489 }
490 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
491 setverdict(pass);
492 }
493 }
494}
495testcase TC_attach_closed() runs on test_CT {
496 var BSSGP_ConnHdlr vc_conn;
497 f_init();
498 f_sleep(1.0);
499 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
500 /* test with foreign IMSI: Must Reject */
501 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb[0], 7);
502 vc_conn.done;
503 /* test with home IMSI: Must Accept */
504 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 8);
505 vc_conn.done;
506}
507
508
Harald Welte5ac31492018-02-15 20:39:13 +0100509
510control {
Harald Welte5b7c8122018-02-16 21:48:17 +0100511 execute( TC_attach() );
512 execute( TC_attach_auth_id_timeout() );
513 execute( TC_attach_auth_sai_timeout() );
514 execute( TC_attach_gsup_lu_timeout() );
Harald Welte3823e2e2018-02-16 21:53:48 +0100515 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +0100516 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +0100517 execute( TC_attach_closed() );
Harald Welte5ac31492018-02-15 20:39:13 +0100518}
Harald Welte96a33b02018-02-04 10:36:22 +0100519
520
521
522}