blob: a59bde3c217d40925e56b9e8dd9b3a8d78d156fb [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,
Harald Weltef70997d2018-02-17 10:11:19 +010072 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +010073 RoutingAreaIdentificationV ra optional,
74 BssgpCellId bssgp_cell_id,
75 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +010076 SGSN_ConnHdlrNetworkPars net,
77 float t_guard
Harald Welte5ac31492018-02-15 20:39:13 +010078};
79
Harald Welte5ac31492018-02-15 20:39:13 +010080private function f_init_gb(inout GbInstance gb) runs on test_CT {
81 gb.vc_NS := NS_CT.create;
82 gb.vc_BSSGP := BSSGP_CT.create;
83 /* connect lower end of BSSGP emulation with NS upper port */
84 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
85 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
86 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
87
88 gb.vc_NS.start(NSStart());
89 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
90}
91
92private function f_init_gsup(charstring id) runs on test_CT {
93 id := id & "-GSUP";
94 var GsupOps ops := {
95 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
96 };
97
98 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
99 vc_GSUP := GSUP_Emulation_CT.create(id);
100
101 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
102 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
103 /* we use this hack to get events like ASP_IPA_EVENT_UP */
104 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
105
106 vc_GSUP.start(GSUP_Emulation.main(ops, id));
107 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
108
109 /* wait for incoming connection to GSUP port before proceeding */
110 timer T := 10.0;
111 T.start;
112 alt {
113 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
114 [] T.timeout {
115 setverdict(fail, "No connection to GSUP Port");
116 self.stop;
117 }
118 }
119}
120
Harald Weltebd194722018-02-16 22:11:08 +0100121private function f_init_vty() runs on test_CT {
122 map(self:SGSNVTY, system:SGSNVTY);
123 f_vty_set_prompts(SGSNVTY);
124 f_vty_transceive(SGSNVTY, "enable");
125 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
126}
127
128
Harald Welte96a33b02018-02-04 10:36:22 +0100129function f_init() runs on test_CT {
130 if (g_initialized == true) {
131 return;
132 }
133 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100134 g_gb[0].cfg := {
135 nsei := 96,
136 bvci := 196,
137 cell_id := {
138 ra_id := {
139 lai := {
140 mcc_mnc := '26242F'H, lac := 13135},
141 rac := 0
142 },
143 cell_id := 20960
144 },
145 sgsn_role := false
146 };
Harald Welte96a33b02018-02-04 10:36:22 +0100147
Harald Welte5ac31492018-02-15 20:39:13 +0100148 f_init_gb(g_gb[0]);
149 f_init_gsup("SGSN_Test");
Harald Weltebd194722018-02-16 22:11:08 +0100150 f_init_vty();
Harald Welte5ac31492018-02-15 20:39:13 +0100151}
Harald Welte96a33b02018-02-04 10:36:22 +0100152
Harald Welte5ac31492018-02-15 20:39:13 +0100153type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
154
155/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Harald Welte62e29582018-02-16 21:17:11 +0100156function f_start_handler(void_fn fn, charstring id, GbInstance gb, integer imsi_suffix,
157 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100158runs on test_CT return BSSGP_ConnHdlr {
159 var BSSGP_ConnHdlr vc_conn;
160 var SGSN_ConnHdlrNetworkPars net_pars := {
161 expect_ptmsi := true,
162 expect_auth := true,
163 expect_ciph := false
164 };
165 var BSSGP_ConnHdlrPars pars := {
166 imei := f_gen_imei(imsi_suffix),
167 imsi := f_gen_imsi(imsi_suffix),
168 msisdn := f_gen_msisdn(imsi_suffix),
169 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100170 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100171 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100172 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100173 ra := omit,
174 bssgp_cell_id := gb.cfg.cell_id,
175 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100176 net := net_pars,
177 t_guard := t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100178 };
179
180 vc_conn := BSSGP_ConnHdlr.create(id);
181 connect(vc_conn:BSSGP, gb.vc_BSSGP:BSSGP_SP);
182 connect(vc_conn:BSSGP_PROC, gb.vc_BSSGP:BSSGP_PROC);
183
184 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
185 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
186
187 vc_conn.start(f_handler_init(fn, id, pars));
188 return vc_conn;
189}
190
Harald Welte62e29582018-02-16 21:17:11 +0100191private altstep as_Tguard() runs on BSSGP_ConnHdlr {
192 [] g_Tguard.timeout {
193 setverdict(fail, "Tguard timeout");
194 self.stop;
195 }
196}
197
Harald Welte5ac31492018-02-15 20:39:13 +0100198/* first function called in every ConnHdlr */
199private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
200runs on BSSGP_ConnHdlr {
201 /* do some common stuff like setting up g_pars */
202 g_pars := pars;
203
204 /* register with BSSGP core */
205 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
206 /* tell GSUP dispatcher to send this IMSI to us */
207 f_create_gsup_expect(hex2str(g_pars.imsi));
208
Harald Welte62e29582018-02-16 21:17:11 +0100209 g_Tguard.start(pars.t_guard);
210 activate(as_Tguard());
211
Harald Welte5ac31492018-02-15 20:39:13 +0100212 /* call the user-supplied test case function */
213 fn.apply(id);
214 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100215}
216
217/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100218 * Detach without Attach
219 * SM procedures without attach / RAU
220 * ATTACH / RAU
221 ** with / without authentication
222 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100223 ** reject from HLR on SAI
224 ** reject from HLR on UL
225 * re-transmissions of LLC frames
226 * PDP Context activation
227 ** with different GGSN config in SGSN VTY
228 ** with different PDP context type (v4/v6/v46)
229 ** timeout from GGSN
230 ** reject from GGSN
231 */
232
233testcase TC_wait_ns_up() runs on test_CT {
234 f_init();
235 f_sleep(20.0);
236}
237
Harald Welte5ac31492018-02-15 20:39:13 +0100238altstep as_mm_identity() runs on BSSGP_ConnHdlr {
239 var MobileIdentityLV mi;
240 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
241 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
242 BSSGP.send(ts_GMM_ID_RESP(mi));
243 repeat;
244 }
245 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
246 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
247 BSSGP.send(ts_GMM_ID_RESP(mi));
248 repeat;
249 }
250}
Harald Welte96a33b02018-02-04 10:36:22 +0100251
Harald Welte311ec272018-02-17 09:40:03 +0100252/* perform GMM authentication (if expected) */
Harald Welte5ac31492018-02-15 20:39:13 +0100253function f_gmm_auth () runs on BSSGP_ConnHdlr {
254 var BssgpDecoded bd;
255 var PDU_L3_MS_SGSN l3_mo;
256 var PDU_L3_SGSN_MS l3_mt;
257 var default di := activate(as_mm_identity());
258 if (g_pars.net.expect_auth) {
259 g_pars.vec := f_gen_auth_vec_2g();
260 var GSUP_IE auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
261 g_pars.vec.sres,
262 g_pars.vec.kc));
263 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
264 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
265 BSSGP.receive(tr_BD_L3_MT(tr_GMM_AUTH_REQ(g_pars.vec.rand))) -> value bd;
266 l3_mt := bd.l3_mt;
267 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
268 l3_mo := valueof(ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres));
269 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
270 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
271 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
272 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
273 }
274 BSSGP.send(l3_mo);
Harald Welte76dee092018-02-16 22:12:59 +0100275 } else {
276 /* wait for identity procedure */
277 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100278 }
Harald Welte76dee092018-02-16 22:12:59 +0100279
Harald Welte5ac31492018-02-15 20:39:13 +0100280 deactivate(di);
281}
282
Harald Weltef70997d2018-02-17 10:11:19 +0100283function f_upd_ptmsi_and_tlli(OCT4 p_tmsi) runs on BSSGP_ConnHdlr {
284 g_pars.p_tmsi := p_tmsi;
285 /* update TLLI */
286 g_pars.tlli_old := g_pars.tlli;
287 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
288 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli);
289}
290
Harald Welte04683d02018-02-16 22:43:45 +0100291function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
292 /* mandatory IE */
293 g_pars.ra := aa.routingAreaIdentification;
294 if (ispresent(aa.allocatedPTMSI)) {
295 if (not g_pars.net.expect_ptmsi) {
296 setverdict(fail, "unexpected P-TMSI allocation");
297 self.stop;
298 }
Harald Weltef70997d2018-02-17 10:11:19 +0100299 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100300 }
301 if (ispresent(aa.msIdentity)) {
302 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
303 self.stop;
304 }
305 /* P-TMSI.sig */
306 if (ispresent(aa.ptmsiSignature)) {
307 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
308 }
309 /* updateTimer */
310 // aa.readyTimer
311 /* T3302, T3319, T3323, T3312_ext, T3324 */
312}
313
Harald Welte5a4fa042018-02-16 20:59:21 +0100314function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
315 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
316}
317
Harald Welte23178c52018-02-17 09:36:33 +0100318/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
319private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileIdentityLV {
320 if (ispresent(g_pars.p_tmsi)) {
321 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
322 } else {
323 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
324 }
325}
326
Harald Welte311ec272018-02-17 09:40:03 +0100327private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
328 /* Expect MSC to perform LU with HLR */
329 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
330 GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
331 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
332 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
333}
334
Harald Welte5ac31492018-02-15 20:39:13 +0100335private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100336 var BssgpDecoded bd;
Harald Welte5a4fa042018-02-16 20:59:21 +0100337 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte5ac31492018-02-15 20:39:13 +0100338
Harald Welte23178c52018-02-17 09:36:33 +0100339 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5ac31492018-02-15 20:39:13 +0100340 f_gmm_auth();
341 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100342 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100343
Harald Welte04683d02018-02-16 22:43:45 +0100344 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
345 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
346 }
347 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Harald Welte5ac31492018-02-15 20:39:13 +0100348 BSSGP.send(ts_GMM_ATTACH_COMPL);
Harald Welte5a4fa042018-02-16 20:59:21 +0100349 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100350}
351
352testcase TC_attach() runs on test_CT {
353 var BSSGP_ConnHdlr vc_conn;
354 f_init();
355 f_sleep(1.0);
356 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb[0], 1);
357 vc_conn.done;
358}
359
Harald Welte5b7c8122018-02-16 21:48:17 +0100360/* MS never responds to ID REQ, expect ATTACH REJECT */
361private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100362 var RoutingAreaIdentificationV old_ra := f_random_RAI();
363
Harald Welte23178c52018-02-17 09:36:33 +0100364 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100365 alt {
Harald Welte1967d472018-02-16 21:54:21 +0100366 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100367 /* don't send ID Response */
368 repeat;
369 }
Harald Welte1967d472018-02-16 21:54:21 +0100370 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100371 setverdict(pass);
372 }
Harald Welte1967d472018-02-16 21:54:21 +0100373 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100374 setverdict(fail, "Wrong Attach Reject Cause");
375 }
376 }
377}
378testcase TC_attach_auth_id_timeout() runs on test_CT {
379 var BSSGP_ConnHdlr vc_conn;
380 f_init();
381 vc_conn := f_start_handler(refers(f_TC_attach_auth_id_timeout), testcasename(), g_gb[0], 2, 40.0);
382 vc_conn.done;
383}
384
385/* HLR never responds to SAI REQ, expect ATTACH REJECT */
386private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100387 var RoutingAreaIdentificationV old_ra := f_random_RAI();
388
Harald Welte23178c52018-02-17 09:36:33 +0100389 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100390 alt {
391 [] as_mm_identity();
392 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
393 }
394 /* don't send SAI-response from HLR */
Harald Welte1967d472018-02-16 21:54:21 +0100395 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Welte5b7c8122018-02-16 21:48:17 +0100396 setverdict(pass);
397}
398testcase TC_attach_auth_sai_timeout() runs on test_CT {
399 var BSSGP_ConnHdlr vc_conn;
400 f_init();
401 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb[0], 3);
402 vc_conn.done;
403}
404
Harald Weltefe253882018-02-17 09:25:00 +0100405/* HLR rejects SAI, expect ATTACH REJECT */
406private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100407 var RoutingAreaIdentificationV old_ra := f_random_RAI();
408
Harald Welte23178c52018-02-17 09:36:33 +0100409 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +0100410 alt {
411 [] as_mm_identity();
412 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
413 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
414 }
415 }
416 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
417 setverdict(pass);
418}
419testcase TC_attach_auth_sai_reject() runs on test_CT {
420 var BSSGP_ConnHdlr vc_conn;
421 f_init();
Harald Welteb7c14e92018-02-17 09:29:16 +0100422 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb[0], 4);
Harald Weltefe253882018-02-17 09:25:00 +0100423 vc_conn.done;
424}
425
Harald Welte5b7c8122018-02-16 21:48:17 +0100426/* HLR never responds to UL REQ, expect ATTACH REJECT */
427private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100428 var BssgpDecoded bd;
Harald Welte5b7c8122018-02-16 21:48:17 +0100429 var RoutingAreaIdentificationV old_ra := f_random_RAI();
430
Harald Welte23178c52018-02-17 09:36:33 +0100431 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100432 f_gmm_auth();
433 /* Expect MSC to perform LU with HLR */
434 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
435 /* Never follow-up with ISD_REQ or UL_RES */
436 alt {
Harald Welte1967d472018-02-16 21:54:21 +0100437 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100438 setverdict(pass);
439 }
Harald Welte04683d02018-02-16 22:43:45 +0100440 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
441 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100442 setverdict(fail);
443 }
444 }
445}
446testcase TC_attach_gsup_lu_timeout() runs on test_CT {
447 var BSSGP_ConnHdlr vc_conn;
448 f_init();
449 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100450 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb[0], 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100451 vc_conn.done;
452}
453
Harald Welteb7c14e92018-02-17 09:29:16 +0100454/* HLR rejects UL REQ, expect ATTACH REJECT */
455private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
456 var BssgpDecoded bd;
Harald Welteb7c14e92018-02-17 09:29:16 +0100457 var RoutingAreaIdentificationV old_ra := f_random_RAI();
458
Harald Welte23178c52018-02-17 09:36:33 +0100459 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +0100460 f_gmm_auth();
461 /* Expect MSC to perform LU with HLR */
462 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
463 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
464 }
465 alt {
466 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
467 setverdict(pass);
468 }
469 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
470 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
471 setverdict(fail);
472 }
473 }
474}
475testcase TC_attach_gsup_lu_reject() runs on test_CT {
476 var BSSGP_ConnHdlr vc_conn;
477 f_init();
478 f_sleep(1.0);
479 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb[0], 6);
480 vc_conn.done;
481}
482
483
Harald Welte3823e2e2018-02-16 21:53:48 +0100484/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
485private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100486 var BssgpDecoded bd;
Harald Welte3823e2e2018-02-16 21:53:48 +0100487 var RoutingAreaIdentificationV old_ra := f_random_RAI();
488
Harald Welte23178c52018-02-17 09:36:33 +0100489 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +0100490 f_gmm_auth();
491 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100492 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100493
Harald Welte04683d02018-02-16 22:43:45 +0100494 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
495 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
496 }
Harald Welte3823e2e2018-02-16 21:53:48 +0100497 BSSGP.send(ts_GMM_ATTACH_COMPL);
498 setverdict(pass);
499}
Harald Welte3823e2e2018-02-16 21:53:48 +0100500testcase TC_attach_combined() runs on test_CT {
501 var BSSGP_ConnHdlr vc_conn;
502 f_init();
503 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100504 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb[0], 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100505 vc_conn.done;
506}
507
Harald Welte76dee092018-02-16 22:12:59 +0100508/* Attempt of GPRS ATTACH in 'accept all' mode */
509private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100510 var BssgpDecoded bd;
Harald Welte76dee092018-02-16 22:12:59 +0100511 var RoutingAreaIdentificationV old_ra := f_random_RAI();
512
513 g_pars.net.expect_auth := false;
514
Harald Welte23178c52018-02-17 09:36:33 +0100515 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +0100516 f_gmm_auth();
Harald Welte04683d02018-02-16 22:43:45 +0100517 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
518 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
519 }
Harald Welte76dee092018-02-16 22:12:59 +0100520 BSSGP.send(ts_GMM_ATTACH_COMPL);
521 setverdict(pass);
522}
523testcase TC_attach_accept_all() runs on test_CT {
524 var BSSGP_ConnHdlr vc_conn;
525 f_init();
526 f_sleep(1.0);
527 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Harald Welteb7c14e92018-02-17 09:29:16 +0100528 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 8);
Harald Welte76dee092018-02-16 22:12:59 +0100529 vc_conn.done;
530}
Harald Welte5b7c8122018-02-16 21:48:17 +0100531
Harald Welteb2124b22018-02-16 22:26:56 +0100532/* Attempt of GPRS ATTACH in 'accept all' mode */
533private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +0100534 var RoutingAreaIdentificationV old_ra := f_random_RAI();
535
536 /* Simulate a foreign IMSI */
537 g_pars.imsi := '001010123456789'H;
538 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
539
540 g_pars.net.expect_auth := false;
541
Harald Welte23178c52018-02-17 09:36:33 +0100542 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +0100543 alt {
544 [] as_mm_identity();
545 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
546 setverdict(pass);
547 }
548 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
549 setverdict(pass);
550 }
551 }
552}
553testcase TC_attach_closed() runs on test_CT {
554 var BSSGP_ConnHdlr vc_conn;
555 f_init();
556 f_sleep(1.0);
557 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
558 /* test with foreign IMSI: Must Reject */
Harald Welteb7c14e92018-02-17 09:29:16 +0100559 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb[0], 9);
Harald Welteb2124b22018-02-16 22:26:56 +0100560 vc_conn.done;
561 /* test with home IMSI: Must Accept */
Harald Welteb7c14e92018-02-17 09:29:16 +0100562 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 10);
Harald Welteb2124b22018-02-16 22:26:56 +0100563 vc_conn.done;
564}
565
Harald Welte04683d02018-02-16 22:43:45 +0100566/* Routing Area Update from Unknown TLLI -> REJECT */
567private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100568 var RoutingAreaIdentificationV old_ra := f_random_RAI();
569
Harald Welte23178c52018-02-17 09:36:33 +0100570 BSSGP.send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, old_ra, false, omit, omit));
Harald Welte04683d02018-02-16 22:43:45 +0100571 alt {
572 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
573 setverdict(pass);
574 }
575 /* FIXME: Expect XID RESET? */
576 [] BSSGP.receive { repeat; }
577 }
578}
579testcase TC_rau_unknown() runs on test_CT {
580 var BSSGP_ConnHdlr vc_conn;
581 f_init();
582 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100583 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb[0], 11);
Harald Welte04683d02018-02-16 22:43:45 +0100584 vc_conn.done;
585}
586
587
Harald Welteb2124b22018-02-16 22:26:56 +0100588
Harald Welte5ac31492018-02-15 20:39:13 +0100589
590control {
Harald Welte5b7c8122018-02-16 21:48:17 +0100591 execute( TC_attach() );
592 execute( TC_attach_auth_id_timeout() );
593 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +0100594 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +0100595 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +0100596 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +0100597 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +0100598 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +0100599 execute( TC_attach_closed() );
Harald Welte04683d02018-02-16 22:43:45 +0100600 execute( TC_rau_unknown() );
Harald Welte5ac31492018-02-15 20:39:13 +0100601}
Harald Welte96a33b02018-02-04 10:36:22 +0100602
603
604
605}