blob: a3816920f3614081af09f983b1fcd4e85ee0746d [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 Welteeded9ad2018-02-17 20:57:34 +010021import from GTP_Emulation all;
22import from GTP_Templates all;
23import from GTP_CodecPort all;
24import from GTPC_Types all;
25import from GTPU_Types all;
26
Harald Weltea2526a82018-02-18 19:03:36 +010027import from LLC_Types all;
28import from LLC_Templates all;
29
30import from SNDCP_Types all;
31
Harald Weltebd194722018-02-16 22:11:08 +010032import from TELNETasp_PortType all;
33import from Osmocom_VTY_Functions all;
34
Harald Welteeded9ad2018-02-17 20:57:34 +010035
Harald Welte5ac31492018-02-15 20:39:13 +010036modulepar {
37 /* IP/port on which we run our internal GSUP/HLR emulation */
38 charstring mp_hlr_ip := "127.0.0.1";
39 integer mp_hlr_port := 4222;
Harald Welteeded9ad2018-02-17 20:57:34 +010040 charstring mp_ggsn_ip := "127.0.0.2";
Harald Welte5ac31492018-02-15 20:39:13 +010041};
42
43type record GbInstance {
44 NS_CT vc_NS,
45 BSSGP_CT vc_BSSGP,
46 BssgpConfig cfg
47};
Harald Welte96a33b02018-02-04 10:36:22 +010048
49type component test_CT {
Harald Welte5ac31492018-02-15 20:39:13 +010050 var GbInstance g_gb[3];
Harald Welte96a33b02018-02-04 10:36:22 +010051
Harald Welte5ac31492018-02-15 20:39:13 +010052 var GSUP_Emulation_CT vc_GSUP;
53 var IPA_Emulation_CT vc_GSUP_IPA;
54 /* only to get events from IPA underneath GSUP */
55 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +010056
Harald Welteeded9ad2018-02-17 20:57:34 +010057 var GTP_Emulation_CT vc_GTP;
58
Harald Weltebd194722018-02-16 22:11:08 +010059 port TELNETasp_PT SGSNVTY;
60
Harald Welte96a33b02018-02-04 10:36:22 +010061 var boolean g_initialized := false;
62};
63
Harald Welteeded9ad2018-02-17 20:57:34 +010064type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +010065 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +010066 timer g_Tguard;
Harald Welte5ac31492018-02-15 20:39:13 +010067}
68
69type record SGSN_ConnHdlrNetworkPars {
70 boolean expect_ptmsi,
71 boolean expect_auth,
72 boolean expect_ciph
73};
74
75type record BSSGP_ConnHdlrPars {
76 /* IMEI of the simulated ME */
77 hexstring imei,
78 /* IMEI of the simulated MS */
79 hexstring imsi,
80 /* MSISDN of the simulated MS (probably unused) */
81 hexstring msisdn,
82 /* P-TMSI allocated to the simulated MS */
83 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +010084 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +010085 /* TLLI of the simulated MS */
86 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +010087 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +010088 RoutingAreaIdentificationV ra optional,
89 BssgpCellId bssgp_cell_id,
90 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +010091 SGSN_ConnHdlrNetworkPars net,
92 float t_guard
Harald Welte5ac31492018-02-15 20:39:13 +010093};
94
Harald Welte5ac31492018-02-15 20:39:13 +010095private function f_init_gb(inout GbInstance gb) runs on test_CT {
96 gb.vc_NS := NS_CT.create;
97 gb.vc_BSSGP := BSSGP_CT.create;
98 /* connect lower end of BSSGP emulation with NS upper port */
99 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
100 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
101 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
102
103 gb.vc_NS.start(NSStart());
104 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
105}
106
107private function f_init_gsup(charstring id) runs on test_CT {
108 id := id & "-GSUP";
109 var GsupOps ops := {
110 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
111 };
112
113 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
114 vc_GSUP := GSUP_Emulation_CT.create(id);
115
116 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
117 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
118 /* we use this hack to get events like ASP_IPA_EVENT_UP */
119 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
120
121 vc_GSUP.start(GSUP_Emulation.main(ops, id));
122 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
123
124 /* wait for incoming connection to GSUP port before proceeding */
125 timer T := 10.0;
126 T.start;
127 alt {
128 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
129 [] T.timeout {
130 setverdict(fail, "No connection to GSUP Port");
131 self.stop;
132 }
133 }
134}
135
Harald Welteeded9ad2018-02-17 20:57:34 +0100136private function f_init_gtp(charstring id) runs on test_CT {
137 id := id & "-GTP";
138
139 var GtpEmulationCfg gtp_cfg := {
140 gtpc_bind_ip := mp_ggsn_ip,
141 gtpc_bind_port := GTP1C_PORT,
142 gtpu_bind_ip := mp_ggsn_ip,
143 gtpu_bind_port := GTP1U_PORT,
144 sgsn_role := false
145 };
146
147 vc_GTP := GTP_Emulation_CT.create(id);
148 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
149}
150
Harald Weltebd194722018-02-16 22:11:08 +0100151private function f_init_vty() runs on test_CT {
152 map(self:SGSNVTY, system:SGSNVTY);
153 f_vty_set_prompts(SGSNVTY);
154 f_vty_transceive(SGSNVTY, "enable");
155 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
156}
157
158
Harald Welte96a33b02018-02-04 10:36:22 +0100159function f_init() runs on test_CT {
160 if (g_initialized == true) {
161 return;
162 }
163 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100164 g_gb[0].cfg := {
165 nsei := 96,
166 bvci := 196,
167 cell_id := {
168 ra_id := {
169 lai := {
170 mcc_mnc := '26242F'H, lac := 13135},
171 rac := 0
172 },
173 cell_id := 20960
174 },
175 sgsn_role := false
176 };
Harald Welte96a33b02018-02-04 10:36:22 +0100177
Harald Welte5ac31492018-02-15 20:39:13 +0100178 f_init_gb(g_gb[0]);
179 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100180 f_init_gtp("SGSN_Test");
Harald Weltebd194722018-02-16 22:11:08 +0100181 f_init_vty();
Harald Welte5ac31492018-02-15 20:39:13 +0100182}
Harald Welte96a33b02018-02-04 10:36:22 +0100183
Harald Welte5ac31492018-02-15 20:39:13 +0100184type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
185
186/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Harald Welte62e29582018-02-16 21:17:11 +0100187function f_start_handler(void_fn fn, charstring id, GbInstance gb, integer imsi_suffix,
188 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100189runs on test_CT return BSSGP_ConnHdlr {
190 var BSSGP_ConnHdlr vc_conn;
191 var SGSN_ConnHdlrNetworkPars net_pars := {
192 expect_ptmsi := true,
193 expect_auth := true,
194 expect_ciph := false
195 };
196 var BSSGP_ConnHdlrPars pars := {
197 imei := f_gen_imei(imsi_suffix),
198 imsi := f_gen_imsi(imsi_suffix),
199 msisdn := f_gen_msisdn(imsi_suffix),
200 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100201 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100202 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100203 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100204 ra := omit,
205 bssgp_cell_id := gb.cfg.cell_id,
206 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100207 net := net_pars,
208 t_guard := t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100209 };
210
211 vc_conn := BSSGP_ConnHdlr.create(id);
212 connect(vc_conn:BSSGP, gb.vc_BSSGP:BSSGP_SP);
213 connect(vc_conn:BSSGP_PROC, gb.vc_BSSGP:BSSGP_PROC);
214
215 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
216 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
217
Harald Welteeded9ad2018-02-17 20:57:34 +0100218 connect(vc_conn:GTP, vc_GTP:CLIENT);
219 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
220
Harald Welte5ac31492018-02-15 20:39:13 +0100221 vc_conn.start(f_handler_init(fn, id, pars));
222 return vc_conn;
223}
224
Harald Welte62e29582018-02-16 21:17:11 +0100225private altstep as_Tguard() runs on BSSGP_ConnHdlr {
226 [] g_Tguard.timeout {
227 setverdict(fail, "Tguard timeout");
228 self.stop;
229 }
230}
231
Harald Welte5ac31492018-02-15 20:39:13 +0100232/* first function called in every ConnHdlr */
233private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
234runs on BSSGP_ConnHdlr {
235 /* do some common stuff like setting up g_pars */
236 g_pars := pars;
237
238 /* register with BSSGP core */
239 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
240 /* tell GSUP dispatcher to send this IMSI to us */
241 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100242 /* tell GTP dispatcher to send this IMSI to us */
243 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100244
Harald Welte62e29582018-02-16 21:17:11 +0100245 g_Tguard.start(pars.t_guard);
246 activate(as_Tguard());
247
Harald Welte5ac31492018-02-15 20:39:13 +0100248 /* call the user-supplied test case function */
249 fn.apply(id);
250 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100251}
252
253/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100254 * Detach without Attach
255 * SM procedures without attach / RAU
256 * ATTACH / RAU
257 ** with / without authentication
258 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100259 ** reject from HLR on SAI
260 ** reject from HLR on UL
261 * re-transmissions of LLC frames
262 * PDP Context activation
263 ** with different GGSN config in SGSN VTY
264 ** with different PDP context type (v4/v6/v46)
265 ** timeout from GGSN
266 ** reject from GGSN
267 */
268
269testcase TC_wait_ns_up() runs on test_CT {
270 f_init();
271 f_sleep(20.0);
272}
273
Harald Welte5ac31492018-02-15 20:39:13 +0100274altstep as_mm_identity() runs on BSSGP_ConnHdlr {
275 var MobileIdentityLV mi;
276 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
277 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
278 BSSGP.send(ts_GMM_ID_RESP(mi));
279 repeat;
280 }
281 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
282 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
283 BSSGP.send(ts_GMM_ID_RESP(mi));
284 repeat;
285 }
286}
Harald Welte96a33b02018-02-04 10:36:22 +0100287
Harald Welte311ec272018-02-17 09:40:03 +0100288/* perform GMM authentication (if expected) */
Harald Welte5ac31492018-02-15 20:39:13 +0100289function f_gmm_auth () runs on BSSGP_ConnHdlr {
290 var BssgpDecoded bd;
291 var PDU_L3_MS_SGSN l3_mo;
292 var PDU_L3_SGSN_MS l3_mt;
293 var default di := activate(as_mm_identity());
294 if (g_pars.net.expect_auth) {
295 g_pars.vec := f_gen_auth_vec_2g();
296 var GSUP_IE auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
297 g_pars.vec.sres,
298 g_pars.vec.kc));
299 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
300 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
301 BSSGP.receive(tr_BD_L3_MT(tr_GMM_AUTH_REQ(g_pars.vec.rand))) -> value bd;
302 l3_mt := bd.l3_mt;
303 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
304 l3_mo := valueof(ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres));
305 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
306 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
307 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
308 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
309 }
310 BSSGP.send(l3_mo);
Harald Welte76dee092018-02-16 22:12:59 +0100311 } else {
312 /* wait for identity procedure */
313 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100314 }
Harald Welte76dee092018-02-16 22:12:59 +0100315
Harald Welte5ac31492018-02-15 20:39:13 +0100316 deactivate(di);
317}
318
Harald Weltef70997d2018-02-17 10:11:19 +0100319function f_upd_ptmsi_and_tlli(OCT4 p_tmsi) runs on BSSGP_ConnHdlr {
320 g_pars.p_tmsi := p_tmsi;
321 /* update TLLI */
322 g_pars.tlli_old := g_pars.tlli;
323 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
324 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli);
325}
326
Harald Welte04683d02018-02-16 22:43:45 +0100327function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
328 /* mandatory IE */
329 g_pars.ra := aa.routingAreaIdentification;
330 if (ispresent(aa.allocatedPTMSI)) {
331 if (not g_pars.net.expect_ptmsi) {
332 setverdict(fail, "unexpected P-TMSI allocation");
333 self.stop;
334 }
Harald Weltef70997d2018-02-17 10:11:19 +0100335 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100336 }
337 if (ispresent(aa.msIdentity)) {
338 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
339 self.stop;
340 }
341 /* P-TMSI.sig */
342 if (ispresent(aa.ptmsiSignature)) {
343 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
344 }
345 /* updateTimer */
346 // aa.readyTimer
347 /* T3302, T3319, T3323, T3312_ext, T3324 */
348}
349
Harald Welte91636de2018-02-17 10:16:14 +0100350function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra) runs on BSSGP_ConnHdlr {
351 /* mandatory IE */
352 g_pars.ra := ra.routingAreaId;
353 if (ispresent(ra.allocatedPTMSI)) {
354 if (not g_pars.net.expect_ptmsi) {
355 setverdict(fail, "unexpected P-TMSI allocation");
356 self.stop;
357 }
358 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
359 }
360 if (ispresent(ra.msIdentity)) {
361 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
362 self.stop;
363 }
364 /* P-TMSI.sig */
365 if (ispresent(ra.ptmsiSignature)) {
366 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
367 }
368 /* updateTimer */
369 // aa.readyTimer
370 /* T3302, T3319, T3323, T3312_ext, T3324 */
371}
372
373
Harald Welte5a4fa042018-02-16 20:59:21 +0100374function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
375 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
376}
377
Harald Welte23178c52018-02-17 09:36:33 +0100378/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
379private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileIdentityLV {
380 if (ispresent(g_pars.p_tmsi)) {
381 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
382 } else {
383 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
384 }
385}
386
Harald Welte311ec272018-02-17 09:40:03 +0100387private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100388 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100389 /* Expect MSC to perform LU with HLR */
390 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100391 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
392 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
393 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100394 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
395 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
396}
397
Harald Welte5ac31492018-02-15 20:39:13 +0100398private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100399 var BssgpDecoded bd;
Harald Welte5a4fa042018-02-16 20:59:21 +0100400 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte5ac31492018-02-15 20:39:13 +0100401
Harald Welte23178c52018-02-17 09:36:33 +0100402 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5ac31492018-02-15 20:39:13 +0100403 f_gmm_auth();
404 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100405 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100406
Harald Welte04683d02018-02-16 22:43:45 +0100407 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
408 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
409 }
410 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Harald Welte5ac31492018-02-15 20:39:13 +0100411 BSSGP.send(ts_GMM_ATTACH_COMPL);
Harald Welte5a4fa042018-02-16 20:59:21 +0100412 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100413}
414
415testcase TC_attach() runs on test_CT {
416 var BSSGP_ConnHdlr vc_conn;
417 f_init();
418 f_sleep(1.0);
419 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb[0], 1);
420 vc_conn.done;
421}
422
Harald Welte5b7c8122018-02-16 21:48:17 +0100423/* MS never responds to ID REQ, expect ATTACH REJECT */
424private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100425 var RoutingAreaIdentificationV old_ra := f_random_RAI();
426
Harald Welte23178c52018-02-17 09:36:33 +0100427 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100428 alt {
Harald Welte1967d472018-02-16 21:54:21 +0100429 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100430 /* don't send ID Response */
431 repeat;
432 }
Harald Welte1967d472018-02-16 21:54:21 +0100433 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100434 setverdict(pass);
435 }
Harald Welte1967d472018-02-16 21:54:21 +0100436 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100437 setverdict(fail, "Wrong Attach Reject Cause");
438 }
439 }
440}
441testcase TC_attach_auth_id_timeout() runs on test_CT {
442 var BSSGP_ConnHdlr vc_conn;
443 f_init();
444 vc_conn := f_start_handler(refers(f_TC_attach_auth_id_timeout), testcasename(), g_gb[0], 2, 40.0);
445 vc_conn.done;
446}
447
448/* HLR never responds to SAI REQ, expect ATTACH REJECT */
449private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100450 var RoutingAreaIdentificationV old_ra := f_random_RAI();
451
Harald Welte23178c52018-02-17 09:36:33 +0100452 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100453 alt {
454 [] as_mm_identity();
455 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
456 }
457 /* don't send SAI-response from HLR */
Harald Welte1967d472018-02-16 21:54:21 +0100458 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Welte5b7c8122018-02-16 21:48:17 +0100459 setverdict(pass);
460}
461testcase TC_attach_auth_sai_timeout() runs on test_CT {
462 var BSSGP_ConnHdlr vc_conn;
463 f_init();
464 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb[0], 3);
465 vc_conn.done;
466}
467
Harald Weltefe253882018-02-17 09:25:00 +0100468/* HLR rejects SAI, expect ATTACH REJECT */
469private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100470 var RoutingAreaIdentificationV old_ra := f_random_RAI();
471
Harald Welte23178c52018-02-17 09:36:33 +0100472 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +0100473 alt {
474 [] as_mm_identity();
475 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
476 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
477 }
478 }
479 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
480 setverdict(pass);
481}
482testcase TC_attach_auth_sai_reject() runs on test_CT {
483 var BSSGP_ConnHdlr vc_conn;
484 f_init();
Harald Welteb7c14e92018-02-17 09:29:16 +0100485 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb[0], 4);
Harald Weltefe253882018-02-17 09:25:00 +0100486 vc_conn.done;
487}
488
Harald Welte5b7c8122018-02-16 21:48:17 +0100489/* HLR never responds to UL REQ, expect ATTACH REJECT */
490private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100491 var BssgpDecoded bd;
Harald Welte5b7c8122018-02-16 21:48:17 +0100492 var RoutingAreaIdentificationV old_ra := f_random_RAI();
493
Harald Welte23178c52018-02-17 09:36:33 +0100494 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100495 f_gmm_auth();
496 /* Expect MSC to perform LU with HLR */
497 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
498 /* Never follow-up with ISD_REQ or UL_RES */
499 alt {
Harald Welte1967d472018-02-16 21:54:21 +0100500 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100501 setverdict(pass);
502 }
Harald Welte04683d02018-02-16 22:43:45 +0100503 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
504 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100505 setverdict(fail);
506 }
507 }
508}
509testcase TC_attach_gsup_lu_timeout() runs on test_CT {
510 var BSSGP_ConnHdlr vc_conn;
511 f_init();
512 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100513 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb[0], 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100514 vc_conn.done;
515}
516
Harald Welteb7c14e92018-02-17 09:29:16 +0100517/* HLR rejects UL REQ, expect ATTACH REJECT */
518private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
519 var BssgpDecoded bd;
Harald Welteb7c14e92018-02-17 09:29:16 +0100520 var RoutingAreaIdentificationV old_ra := f_random_RAI();
521
Harald Welte23178c52018-02-17 09:36:33 +0100522 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +0100523 f_gmm_auth();
524 /* Expect MSC to perform LU with HLR */
525 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
526 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
527 }
528 alt {
529 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
530 setverdict(pass);
531 }
532 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
533 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
534 setverdict(fail);
535 }
536 }
537}
538testcase TC_attach_gsup_lu_reject() runs on test_CT {
539 var BSSGP_ConnHdlr vc_conn;
540 f_init();
541 f_sleep(1.0);
542 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb[0], 6);
543 vc_conn.done;
544}
545
546
Harald Welte3823e2e2018-02-16 21:53:48 +0100547/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
548private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100549 var BssgpDecoded bd;
Harald Welte3823e2e2018-02-16 21:53:48 +0100550 var RoutingAreaIdentificationV old_ra := f_random_RAI();
551
Harald Welte23178c52018-02-17 09:36:33 +0100552 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +0100553 f_gmm_auth();
554 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100555 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100556
Harald Welte04683d02018-02-16 22:43:45 +0100557 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
558 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
559 }
Harald Welte3823e2e2018-02-16 21:53:48 +0100560 BSSGP.send(ts_GMM_ATTACH_COMPL);
561 setverdict(pass);
562}
Harald Welte3823e2e2018-02-16 21:53:48 +0100563testcase TC_attach_combined() runs on test_CT {
564 var BSSGP_ConnHdlr vc_conn;
565 f_init();
566 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100567 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb[0], 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100568 vc_conn.done;
569}
570
Harald Welte76dee092018-02-16 22:12:59 +0100571/* Attempt of GPRS ATTACH in 'accept all' mode */
572private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100573 var BssgpDecoded bd;
Harald Welte76dee092018-02-16 22:12:59 +0100574 var RoutingAreaIdentificationV old_ra := f_random_RAI();
575
576 g_pars.net.expect_auth := false;
577
Harald Welte23178c52018-02-17 09:36:33 +0100578 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +0100579 f_gmm_auth();
Harald Welte04683d02018-02-16 22:43:45 +0100580 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
581 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
582 }
Harald Welte76dee092018-02-16 22:12:59 +0100583 BSSGP.send(ts_GMM_ATTACH_COMPL);
584 setverdict(pass);
585}
586testcase TC_attach_accept_all() runs on test_CT {
587 var BSSGP_ConnHdlr vc_conn;
588 f_init();
589 f_sleep(1.0);
590 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Harald Welteb7c14e92018-02-17 09:29:16 +0100591 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 8);
Harald Welte76dee092018-02-16 22:12:59 +0100592 vc_conn.done;
593}
Harald Welte5b7c8122018-02-16 21:48:17 +0100594
Harald Welteb2124b22018-02-16 22:26:56 +0100595/* Attempt of GPRS ATTACH in 'accept all' mode */
596private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +0100597 var RoutingAreaIdentificationV old_ra := f_random_RAI();
598
599 /* Simulate a foreign IMSI */
600 g_pars.imsi := '001010123456789'H;
601 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
602
603 g_pars.net.expect_auth := false;
604
Harald Welte23178c52018-02-17 09:36:33 +0100605 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +0100606 alt {
607 [] as_mm_identity();
608 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
609 setverdict(pass);
610 }
611 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
612 setverdict(pass);
613 }
614 }
615}
616testcase TC_attach_closed() runs on test_CT {
617 var BSSGP_ConnHdlr vc_conn;
618 f_init();
619 f_sleep(1.0);
620 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
621 /* test with foreign IMSI: Must Reject */
Harald Welteb7c14e92018-02-17 09:29:16 +0100622 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb[0], 9);
Harald Welteb2124b22018-02-16 22:26:56 +0100623 vc_conn.done;
624 /* test with home IMSI: Must Accept */
Harald Welteb7c14e92018-02-17 09:29:16 +0100625 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 10);
Harald Welteb2124b22018-02-16 22:26:56 +0100626 vc_conn.done;
627}
628
Harald Welte04683d02018-02-16 22:43:45 +0100629/* Routing Area Update from Unknown TLLI -> REJECT */
630private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100631 var RoutingAreaIdentificationV old_ra := f_random_RAI();
632
Harald Welte23178c52018-02-17 09:36:33 +0100633 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 +0100634 alt {
635 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
636 setverdict(pass);
637 }
638 /* FIXME: Expect XID RESET? */
639 [] BSSGP.receive { repeat; }
640 }
641}
642testcase TC_rau_unknown() runs on test_CT {
643 var BSSGP_ConnHdlr vc_conn;
644 f_init();
645 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100646 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb[0], 11);
Harald Welte04683d02018-02-16 22:43:45 +0100647 vc_conn.done;
648}
649
Harald Welte91636de2018-02-17 10:16:14 +0100650private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
651 var BssgpDecoded bd;
652
653 /* first perform regular attach */
654 f_TC_attach(id);
655
656 /* then send RAU */
657 BSSGP.send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit));
658 alt {
659 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
660 f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept);
661 setverdict(pass);
662 }
663 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
664 setverdict(fail, "Unexpected RAU Reject");
665 }
666 [] BSSGP.receive { repeat; }
667 }
668}
669testcase TC_attach_rau() runs on test_CT {
670 var BSSGP_ConnHdlr vc_conn;
671 f_init();
672 f_sleep(1.0);
673 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb[0], 12);
674 vc_conn.done;
675}
Harald Welte04683d02018-02-16 22:43:45 +0100676
Harald Welte6abb9fe2018-02-17 15:24:48 +0100677/* general GPRS DETACH helper */
678function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge) runs on BSSGP_ConnHdlr {
679 var BssgpDecoded bd;
680 timer T := 5.0;
681 BSSGP.send(ts_GMM_DET_REQ_MO(detach_type, power_off));
682 if (expect_purge) {
683 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
684 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
685 }
686 T.start;
687 alt {
688 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
689 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
690 }
691 [power_off] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
692 g_pars.ra := omit;
693 setverdict(fail, "Unexpected ATTACH ACCEPT in no-power-off DETACH");
694 /* TODO: check if any PDP contexts are deactivated on network side? */
695 }
696 [power_off] T.timeout {
697 setverdict(pass);
698 }
699 [not power_off] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
700 g_pars.ra := omit;
701 setverdict(pass);
702 /* TODO: check if any PDP contexts are deactivated on network side? */
703 }
704 [] BSSGP.receive { repeat; }
705 }
706}
707
708/* IMSI DETACH (non-power-off) for unknown TLLI */
709private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
710 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
711}
712testcase TC_detach_unknown_nopoweroff() runs on test_CT {
713 var BSSGP_ConnHdlr vc_conn;
714 f_init();
715 f_sleep(1.0);
716 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb[0], 13);
717 vc_conn.done;
718}
719
720/* IMSI DETACH (power-off) for unknown TLLI */
721private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
722 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
723}
724testcase TC_detach_unknown_poweroff() runs on test_CT {
725 var BSSGP_ConnHdlr vc_conn;
726 f_init();
727 f_sleep(1.0);
728 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb[0], 14);
729 vc_conn.done;
730}
731
732/* IMSI DETACH (non-power-off) for known TLLI */
733private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
734 /* first perform regular attach */
735 f_TC_attach(id);
736
737 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
738}
739testcase TC_detach_nopoweroff() runs on test_CT {
740 var BSSGP_ConnHdlr vc_conn;
741 f_init();
742 f_sleep(1.0);
743 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb[0], 15);
744 vc_conn.done;
745}
746
747/* IMSI DETACH (power-off) for known TLLI */
748private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
749 /* first perform regular attach */
750 f_TC_attach(id);
751
752 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
753}
754testcase TC_detach_poweroff() runs on test_CT {
755 var BSSGP_ConnHdlr vc_conn;
756 f_init();
757 f_sleep(1.0);
758 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb[0], 16);
759 vc_conn.done;
760}
761
Harald Welteeded9ad2018-02-17 20:57:34 +0100762type record PdpActPars {
763 BIT3 tid,
764 BIT4 nsapi,
765 BIT4 sapi,
766 QoSV qos,
767 PDPAddressV addr,
768 octetstring apn optional,
769 ProtocolConfigOptionsV pco optional,
770 OCT1 exp_rej_cause optional,
Harald Welte7aff2ca2018-02-18 15:34:50 +0100771 OCT4 chg_id,
Harald Welte6abb9fe2018-02-17 15:24:48 +0100772
Harald Welteeded9ad2018-02-17 20:57:34 +0100773 OCT4 ggsn_tei_c,
774 OCT4 ggsn_tei_u,
775 octetstring ggsn_ip_c,
776 octetstring ggsn_ip_u,
777
Harald Welteeded9ad2018-02-17 20:57:34 +0100778 OCT4 sgsn_tei_c optional,
Harald Weltef8af5d62018-02-18 15:06:42 +0100779 OCT4 sgsn_tei_u optional,
780 octetstring sgsn_ip_c optional,
781 octetstring sgsn_ip_u optional
Harald Welteeded9ad2018-02-17 20:57:34 +0100782};
783
784function f_pdp_ctx_act(PdpActPars apars) runs on BSSGP_ConnHdlr {
785 var boolean exp_rej := ispresent(apars.exp_rej_cause);
786 var Gtp1cUnitdata g_ud;
787
788 BSSGP.send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
789 apars.apn, apars.pco));
790 if (not exp_rej) {
791 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
792 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
793 var GTPC_PDUs gtpc_rx := g_ud.gtpc.gtpc_pdu;
794 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
795 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
Harald Weltef8af5d62018-02-18 15:06:42 +0100796 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
797 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
Harald Welteeded9ad2018-02-17 20:57:34 +0100798 var OCT1 cause := int2oct(128, 1);
799 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
800 apars.sgsn_tei_c, cause,
801 apars.ggsn_tei_c, apars.ggsn_tei_u,
802 apars.nsapi,
Harald Welte7aff2ca2018-02-18 15:34:50 +0100803 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id));
Harald Welteeded9ad2018-02-17 20:57:34 +0100804 }
805 }
806 alt {
Harald Welte28307082018-02-18 12:14:18 +0100807 [exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause))) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100808 setverdict(pass);
809 }
Harald Welte28307082018-02-18 12:14:18 +0100810 [exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100811 setverdict(fail, "Unexpected PDP CTX ACT ACC");
812 }
Harald Welte28307082018-02-18 12:14:18 +0100813 [not exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100814 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
815 }
Harald Welte28307082018-02-18 12:14:18 +0100816 [not exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi))) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100817 setverdict(pass);
818 }
819 }
820}
821
822/* Table 10.5.156/3GPP TS 24.008 */
823template (value) QoSV t_QosDefault := {
824 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
825 delayClass := '100'B, /* best effort */
826 spare1 := '00'B,
827 precedenceClass := '010'B, /* normal */
828 spare2 := '0'B,
829 peakThroughput := '0000'B, /* subscribed */
830 meanThroughput := '00000'B, /* subscribed */
831 spare3 := '000'B,
832 deliverErroneusSDU := omit,
833 deliveryOrder := omit,
834 trafficClass := omit,
835 maxSDUSize := omit,
836 maxBitrateUplink := omit,
837 maxBitrateDownlink := omit,
838 sduErrorRatio := omit,
839 residualBER := omit,
840 trafficHandlingPriority := omit,
841 transferDelay := omit,
842 guaranteedBitRateUplink := omit,
843 guaranteedBitRateDownlink := omit,
844 sourceStatisticsDescriptor := omit,
845 signallingIndication := omit,
846 spare4 := omit,
847 maxBitrateDownlinkExt := omit,
848 guaranteedBitRateDownlinkExt := omit,
849 maxBitrateUplinkExt := omit,
850 guaranteedBitRateUplinkExt := omit,
851 maxBitrateDownlinkExt2 := omit,
852 guaranteedBitRateDownlinkExt2 := omit,
853 maxBitrateUplinkExt2 := omit,
854 guaranteedBitRateUplinkExt2 := omit
855}
856
857/* 10.5.6.4 / 3GPP TS 24.008 */
858template (value) PDPAddressV t_AddrIPv4dyn := {
859 pdpTypeOrg := '0001'B, /* IETF */
860 spare := '0000'B,
861 pdpTypeNum := '21'O, /* IPv4 */
862 addressInfo := omit
863}
864template (value) PDPAddressV t_AddrIPv6dyn := {
865 pdpTypeOrg := '0001'B, /* IETF */
866 spare := '0000'B,
867 pdpTypeNum := '53'O, /* IPv6 */
868 addressInfo := omit
869}
870
871template (value) PdpActPars t_PdpActPars := {
872 tid := '000'B,
873 nsapi := '0101'B, /* < 5 are reserved */
874 sapi := '0011'B, /* 3/5/9/11 */
875 qos := t_QosDefault,
876 addr := t_AddrIPv4dyn,
877 apn := omit,
878 pco := omit,
879 exp_rej_cause := omit,
Harald Welte7aff2ca2018-02-18 15:34:50 +0100880 chg_id := '00000001'O,
Harald Welteeded9ad2018-02-17 20:57:34 +0100881
882 /* FIXME: make below dynamic !! */
883 ggsn_tei_c := '00010000'O,
884 ggsn_tei_u := '00020000'O,
Harald Weltef58a0222018-02-18 15:45:02 +0100885 ggsn_ip_c := '7F000002'O,
886 ggsn_ip_u := '7F000002'O,
Harald Welteeded9ad2018-02-17 20:57:34 +0100887
Harald Welteeded9ad2018-02-17 20:57:34 +0100888 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +0100889 sgsn_tei_u := omit,
890 sgsn_ip_c := omit,
891 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +0100892}
893
894private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
895 var PdpActPars apars := valueof(t_PdpActPars);
896
897 /* first perform regular attach */
898 f_TC_attach(id);
899
900 f_pdp_ctx_act(apars);
901}
902testcase TC_attach_pdp_act() runs on test_CT {
903 var BSSGP_ConnHdlr vc_conn;
904 f_init();
905 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb[0], 17);
906 vc_conn.done;
907}
Harald Welteb2124b22018-02-16 22:26:56 +0100908
Harald Welte835b15f2018-02-18 14:39:11 +0100909/* PDP Context activation for not-attached subscriber; expect fail */
910private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
911 var PdpActPars apars := valueof(t_PdpActPars);
912 BSSGP.send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
913 apars.apn, apars.pco));
914 alt {
915 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
916 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
917 setverdict(pass);
918 }
919 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
920 setverdict(fail, "Unexpected GTP PDP CTX ACT");
921 }
922 [] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
923 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
924 }
925 [] BSSGP.receive { repeat; }
926 }
927}
928testcase TC_pdp_act_unattached() runs on test_CT {
929 var BSSGP_ConnHdlr vc_conn;
930 f_init();
931 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb[0], 18);
932 vc_conn.done;
933}
934
935
Harald Welte5ac31492018-02-15 20:39:13 +0100936
937control {
Harald Welte5b7c8122018-02-16 21:48:17 +0100938 execute( TC_attach() );
939 execute( TC_attach_auth_id_timeout() );
940 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +0100941 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +0100942 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +0100943 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +0100944 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +0100945 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +0100946 execute( TC_attach_closed() );
Harald Welte04683d02018-02-16 22:43:45 +0100947 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +0100948 execute( TC_attach_rau() );
Harald Welte6abb9fe2018-02-17 15:24:48 +0100949 execute( TC_detach_unknown_nopoweroff() );
950 execute( TC_detach_unknown_poweroff() );
951 execute( TC_detach_nopoweroff() );
952 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +0100953 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +0100954 execute( TC_pdp_act_unattached() );
Harald Welte5ac31492018-02-15 20:39:13 +0100955}
Harald Welte96a33b02018-02-04 10:36:22 +0100956
957
958
959}