blob: 9209c6938fbdfde457884a67eb37fe512feab9ea [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 Weltebd194722018-02-16 22:11:08 +010027import from TELNETasp_PortType all;
28import from Osmocom_VTY_Functions all;
29
Harald Welteeded9ad2018-02-17 20:57:34 +010030
Harald Welte5ac31492018-02-15 20:39:13 +010031modulepar {
32 /* IP/port on which we run our internal GSUP/HLR emulation */
33 charstring mp_hlr_ip := "127.0.0.1";
34 integer mp_hlr_port := 4222;
Harald Welteeded9ad2018-02-17 20:57:34 +010035 charstring mp_ggsn_ip := "127.0.0.2";
Harald Welte5ac31492018-02-15 20:39:13 +010036};
37
38type record GbInstance {
39 NS_CT vc_NS,
40 BSSGP_CT vc_BSSGP,
41 BssgpConfig cfg
42};
Harald Welte96a33b02018-02-04 10:36:22 +010043
44type component test_CT {
Harald Welte5ac31492018-02-15 20:39:13 +010045 var GbInstance g_gb[3];
Harald Welte96a33b02018-02-04 10:36:22 +010046
Harald Welte5ac31492018-02-15 20:39:13 +010047 var GSUP_Emulation_CT vc_GSUP;
48 var IPA_Emulation_CT vc_GSUP_IPA;
49 /* only to get events from IPA underneath GSUP */
50 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +010051
Harald Welteeded9ad2018-02-17 20:57:34 +010052 var GTP_Emulation_CT vc_GTP;
53
Harald Weltebd194722018-02-16 22:11:08 +010054 port TELNETasp_PT SGSNVTY;
55
Harald Welte96a33b02018-02-04 10:36:22 +010056 var boolean g_initialized := false;
57};
58
Harald Welteeded9ad2018-02-17 20:57:34 +010059type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +010060 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +010061 timer g_Tguard;
Harald Welte5ac31492018-02-15 20:39:13 +010062}
63
64type record SGSN_ConnHdlrNetworkPars {
65 boolean expect_ptmsi,
66 boolean expect_auth,
67 boolean expect_ciph
68};
69
70type record BSSGP_ConnHdlrPars {
71 /* IMEI of the simulated ME */
72 hexstring imei,
73 /* IMEI of the simulated MS */
74 hexstring imsi,
75 /* MSISDN of the simulated MS (probably unused) */
76 hexstring msisdn,
77 /* P-TMSI allocated to the simulated MS */
78 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +010079 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +010080 /* TLLI of the simulated MS */
81 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +010082 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +010083 RoutingAreaIdentificationV ra optional,
84 BssgpCellId bssgp_cell_id,
85 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +010086 SGSN_ConnHdlrNetworkPars net,
87 float t_guard
Harald Welte5ac31492018-02-15 20:39:13 +010088};
89
Harald Welte5ac31492018-02-15 20:39:13 +010090private function f_init_gb(inout GbInstance gb) runs on test_CT {
91 gb.vc_NS := NS_CT.create;
92 gb.vc_BSSGP := BSSGP_CT.create;
93 /* connect lower end of BSSGP emulation with NS upper port */
94 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
95 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
96 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
97
98 gb.vc_NS.start(NSStart());
99 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
100}
101
102private function f_init_gsup(charstring id) runs on test_CT {
103 id := id & "-GSUP";
104 var GsupOps ops := {
105 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
106 };
107
108 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
109 vc_GSUP := GSUP_Emulation_CT.create(id);
110
111 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
112 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
113 /* we use this hack to get events like ASP_IPA_EVENT_UP */
114 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
115
116 vc_GSUP.start(GSUP_Emulation.main(ops, id));
117 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
118
119 /* wait for incoming connection to GSUP port before proceeding */
120 timer T := 10.0;
121 T.start;
122 alt {
123 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
124 [] T.timeout {
125 setverdict(fail, "No connection to GSUP Port");
126 self.stop;
127 }
128 }
129}
130
Harald Welteeded9ad2018-02-17 20:57:34 +0100131private function f_init_gtp(charstring id) runs on test_CT {
132 id := id & "-GTP";
133
134 var GtpEmulationCfg gtp_cfg := {
135 gtpc_bind_ip := mp_ggsn_ip,
136 gtpc_bind_port := GTP1C_PORT,
137 gtpu_bind_ip := mp_ggsn_ip,
138 gtpu_bind_port := GTP1U_PORT,
139 sgsn_role := false
140 };
141
142 vc_GTP := GTP_Emulation_CT.create(id);
143 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
144}
145
Harald Weltebd194722018-02-16 22:11:08 +0100146private function f_init_vty() runs on test_CT {
147 map(self:SGSNVTY, system:SGSNVTY);
148 f_vty_set_prompts(SGSNVTY);
149 f_vty_transceive(SGSNVTY, "enable");
150 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
151}
152
153
Harald Welte96a33b02018-02-04 10:36:22 +0100154function f_init() runs on test_CT {
155 if (g_initialized == true) {
156 return;
157 }
158 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100159 g_gb[0].cfg := {
160 nsei := 96,
161 bvci := 196,
162 cell_id := {
163 ra_id := {
164 lai := {
165 mcc_mnc := '26242F'H, lac := 13135},
166 rac := 0
167 },
168 cell_id := 20960
169 },
170 sgsn_role := false
171 };
Harald Welte96a33b02018-02-04 10:36:22 +0100172
Harald Welte5ac31492018-02-15 20:39:13 +0100173 f_init_gb(g_gb[0]);
174 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100175 f_init_gtp("SGSN_Test");
Harald Weltebd194722018-02-16 22:11:08 +0100176 f_init_vty();
Harald Welte5ac31492018-02-15 20:39:13 +0100177}
Harald Welte96a33b02018-02-04 10:36:22 +0100178
Harald Welte5ac31492018-02-15 20:39:13 +0100179type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
180
181/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Harald Welte62e29582018-02-16 21:17:11 +0100182function f_start_handler(void_fn fn, charstring id, GbInstance gb, integer imsi_suffix,
183 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100184runs on test_CT return BSSGP_ConnHdlr {
185 var BSSGP_ConnHdlr vc_conn;
186 var SGSN_ConnHdlrNetworkPars net_pars := {
187 expect_ptmsi := true,
188 expect_auth := true,
189 expect_ciph := false
190 };
191 var BSSGP_ConnHdlrPars pars := {
192 imei := f_gen_imei(imsi_suffix),
193 imsi := f_gen_imsi(imsi_suffix),
194 msisdn := f_gen_msisdn(imsi_suffix),
195 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100196 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100197 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100198 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100199 ra := omit,
200 bssgp_cell_id := gb.cfg.cell_id,
201 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100202 net := net_pars,
203 t_guard := t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100204 };
205
206 vc_conn := BSSGP_ConnHdlr.create(id);
207 connect(vc_conn:BSSGP, gb.vc_BSSGP:BSSGP_SP);
208 connect(vc_conn:BSSGP_PROC, gb.vc_BSSGP:BSSGP_PROC);
209
210 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
211 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
212
Harald Welteeded9ad2018-02-17 20:57:34 +0100213 connect(vc_conn:GTP, vc_GTP:CLIENT);
214 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
215
Harald Welte5ac31492018-02-15 20:39:13 +0100216 vc_conn.start(f_handler_init(fn, id, pars));
217 return vc_conn;
218}
219
Harald Welte62e29582018-02-16 21:17:11 +0100220private altstep as_Tguard() runs on BSSGP_ConnHdlr {
221 [] g_Tguard.timeout {
222 setverdict(fail, "Tguard timeout");
223 self.stop;
224 }
225}
226
Harald Welte5ac31492018-02-15 20:39:13 +0100227/* first function called in every ConnHdlr */
228private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
229runs on BSSGP_ConnHdlr {
230 /* do some common stuff like setting up g_pars */
231 g_pars := pars;
232
233 /* register with BSSGP core */
234 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
235 /* tell GSUP dispatcher to send this IMSI to us */
236 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100237 /* tell GTP dispatcher to send this IMSI to us */
238 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100239
Harald Welte62e29582018-02-16 21:17:11 +0100240 g_Tguard.start(pars.t_guard);
241 activate(as_Tguard());
242
Harald Welte5ac31492018-02-15 20:39:13 +0100243 /* call the user-supplied test case function */
244 fn.apply(id);
245 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100246}
247
248/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100249 * Detach without Attach
250 * SM procedures without attach / RAU
251 * ATTACH / RAU
252 ** with / without authentication
253 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100254 ** reject from HLR on SAI
255 ** reject from HLR on UL
256 * re-transmissions of LLC frames
257 * PDP Context activation
258 ** with different GGSN config in SGSN VTY
259 ** with different PDP context type (v4/v6/v46)
260 ** timeout from GGSN
261 ** reject from GGSN
262 */
263
264testcase TC_wait_ns_up() runs on test_CT {
265 f_init();
266 f_sleep(20.0);
267}
268
Harald Welte5ac31492018-02-15 20:39:13 +0100269altstep as_mm_identity() runs on BSSGP_ConnHdlr {
270 var MobileIdentityLV mi;
271 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
272 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
273 BSSGP.send(ts_GMM_ID_RESP(mi));
274 repeat;
275 }
276 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
277 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
278 BSSGP.send(ts_GMM_ID_RESP(mi));
279 repeat;
280 }
281}
Harald Welte96a33b02018-02-04 10:36:22 +0100282
Harald Welte311ec272018-02-17 09:40:03 +0100283/* perform GMM authentication (if expected) */
Harald Welte5ac31492018-02-15 20:39:13 +0100284function f_gmm_auth () runs on BSSGP_ConnHdlr {
285 var BssgpDecoded bd;
286 var PDU_L3_MS_SGSN l3_mo;
287 var PDU_L3_SGSN_MS l3_mt;
288 var default di := activate(as_mm_identity());
289 if (g_pars.net.expect_auth) {
290 g_pars.vec := f_gen_auth_vec_2g();
291 var GSUP_IE auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
292 g_pars.vec.sres,
293 g_pars.vec.kc));
294 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
295 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
296 BSSGP.receive(tr_BD_L3_MT(tr_GMM_AUTH_REQ(g_pars.vec.rand))) -> value bd;
297 l3_mt := bd.l3_mt;
298 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
299 l3_mo := valueof(ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres));
300 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
301 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
302 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
303 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
304 }
305 BSSGP.send(l3_mo);
Harald Welte76dee092018-02-16 22:12:59 +0100306 } else {
307 /* wait for identity procedure */
308 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100309 }
Harald Welte76dee092018-02-16 22:12:59 +0100310
Harald Welte5ac31492018-02-15 20:39:13 +0100311 deactivate(di);
312}
313
Harald Weltef70997d2018-02-17 10:11:19 +0100314function f_upd_ptmsi_and_tlli(OCT4 p_tmsi) runs on BSSGP_ConnHdlr {
315 g_pars.p_tmsi := p_tmsi;
316 /* update TLLI */
317 g_pars.tlli_old := g_pars.tlli;
318 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
319 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli);
320}
321
Harald Welte04683d02018-02-16 22:43:45 +0100322function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
323 /* mandatory IE */
324 g_pars.ra := aa.routingAreaIdentification;
325 if (ispresent(aa.allocatedPTMSI)) {
326 if (not g_pars.net.expect_ptmsi) {
327 setverdict(fail, "unexpected P-TMSI allocation");
328 self.stop;
329 }
Harald Weltef70997d2018-02-17 10:11:19 +0100330 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100331 }
332 if (ispresent(aa.msIdentity)) {
333 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
334 self.stop;
335 }
336 /* P-TMSI.sig */
337 if (ispresent(aa.ptmsiSignature)) {
338 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
339 }
340 /* updateTimer */
341 // aa.readyTimer
342 /* T3302, T3319, T3323, T3312_ext, T3324 */
343}
344
Harald Welte91636de2018-02-17 10:16:14 +0100345function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra) runs on BSSGP_ConnHdlr {
346 /* mandatory IE */
347 g_pars.ra := ra.routingAreaId;
348 if (ispresent(ra.allocatedPTMSI)) {
349 if (not g_pars.net.expect_ptmsi) {
350 setverdict(fail, "unexpected P-TMSI allocation");
351 self.stop;
352 }
353 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
354 }
355 if (ispresent(ra.msIdentity)) {
356 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
357 self.stop;
358 }
359 /* P-TMSI.sig */
360 if (ispresent(ra.ptmsiSignature)) {
361 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
362 }
363 /* updateTimer */
364 // aa.readyTimer
365 /* T3302, T3319, T3323, T3312_ext, T3324 */
366}
367
368
Harald Welte5a4fa042018-02-16 20:59:21 +0100369function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
370 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
371}
372
Harald Welte23178c52018-02-17 09:36:33 +0100373/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
374private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileIdentityLV {
375 if (ispresent(g_pars.p_tmsi)) {
376 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
377 } else {
378 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
379 }
380}
381
Harald Welte311ec272018-02-17 09:40:03 +0100382private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100383 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100384 /* Expect MSC to perform LU with HLR */
385 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100386 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
387 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
388 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100389 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
390 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
391}
392
Harald Welte5ac31492018-02-15 20:39:13 +0100393private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100394 var BssgpDecoded bd;
Harald Welte5a4fa042018-02-16 20:59:21 +0100395 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte5ac31492018-02-15 20:39:13 +0100396
Harald Welte23178c52018-02-17 09:36:33 +0100397 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5ac31492018-02-15 20:39:13 +0100398 f_gmm_auth();
399 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100400 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100401
Harald Welte04683d02018-02-16 22:43:45 +0100402 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
403 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
404 }
405 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Harald Welte5ac31492018-02-15 20:39:13 +0100406 BSSGP.send(ts_GMM_ATTACH_COMPL);
Harald Welte5a4fa042018-02-16 20:59:21 +0100407 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100408}
409
410testcase TC_attach() runs on test_CT {
411 var BSSGP_ConnHdlr vc_conn;
412 f_init();
413 f_sleep(1.0);
414 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb[0], 1);
415 vc_conn.done;
416}
417
Harald Welte5b7c8122018-02-16 21:48:17 +0100418/* MS never responds to ID REQ, expect ATTACH REJECT */
419private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100420 var RoutingAreaIdentificationV old_ra := f_random_RAI();
421
Harald Welte23178c52018-02-17 09:36:33 +0100422 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100423 alt {
Harald Welte1967d472018-02-16 21:54:21 +0100424 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100425 /* don't send ID Response */
426 repeat;
427 }
Harald Welte1967d472018-02-16 21:54:21 +0100428 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100429 setverdict(pass);
430 }
Harald Welte1967d472018-02-16 21:54:21 +0100431 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100432 setverdict(fail, "Wrong Attach Reject Cause");
433 }
434 }
435}
436testcase TC_attach_auth_id_timeout() runs on test_CT {
437 var BSSGP_ConnHdlr vc_conn;
438 f_init();
439 vc_conn := f_start_handler(refers(f_TC_attach_auth_id_timeout), testcasename(), g_gb[0], 2, 40.0);
440 vc_conn.done;
441}
442
443/* HLR never responds to SAI REQ, expect ATTACH REJECT */
444private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100445 var RoutingAreaIdentificationV old_ra := f_random_RAI();
446
Harald Welte23178c52018-02-17 09:36:33 +0100447 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100448 alt {
449 [] as_mm_identity();
450 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
451 }
452 /* don't send SAI-response from HLR */
Harald Welte1967d472018-02-16 21:54:21 +0100453 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Welte5b7c8122018-02-16 21:48:17 +0100454 setverdict(pass);
455}
456testcase TC_attach_auth_sai_timeout() runs on test_CT {
457 var BSSGP_ConnHdlr vc_conn;
458 f_init();
459 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb[0], 3);
460 vc_conn.done;
461}
462
Harald Weltefe253882018-02-17 09:25:00 +0100463/* HLR rejects SAI, expect ATTACH REJECT */
464private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100465 var RoutingAreaIdentificationV old_ra := f_random_RAI();
466
Harald Welte23178c52018-02-17 09:36:33 +0100467 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +0100468 alt {
469 [] as_mm_identity();
470 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
471 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
472 }
473 }
474 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
475 setverdict(pass);
476}
477testcase TC_attach_auth_sai_reject() runs on test_CT {
478 var BSSGP_ConnHdlr vc_conn;
479 f_init();
Harald Welteb7c14e92018-02-17 09:29:16 +0100480 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb[0], 4);
Harald Weltefe253882018-02-17 09:25:00 +0100481 vc_conn.done;
482}
483
Harald Welte5b7c8122018-02-16 21:48:17 +0100484/* HLR never responds to UL REQ, expect ATTACH REJECT */
485private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100486 var BssgpDecoded bd;
Harald Welte5b7c8122018-02-16 21:48:17 +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, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100490 f_gmm_auth();
491 /* Expect MSC to perform LU with HLR */
492 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
493 /* Never follow-up with ISD_REQ or UL_RES */
494 alt {
Harald Welte1967d472018-02-16 21:54:21 +0100495 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100496 setverdict(pass);
497 }
Harald Welte04683d02018-02-16 22:43:45 +0100498 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
499 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100500 setverdict(fail);
501 }
502 }
503}
504testcase TC_attach_gsup_lu_timeout() runs on test_CT {
505 var BSSGP_ConnHdlr vc_conn;
506 f_init();
507 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100508 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb[0], 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100509 vc_conn.done;
510}
511
Harald Welteb7c14e92018-02-17 09:29:16 +0100512/* HLR rejects UL REQ, expect ATTACH REJECT */
513private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
514 var BssgpDecoded bd;
Harald Welteb7c14e92018-02-17 09:29:16 +0100515 var RoutingAreaIdentificationV old_ra := f_random_RAI();
516
Harald Welte23178c52018-02-17 09:36:33 +0100517 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +0100518 f_gmm_auth();
519 /* Expect MSC to perform LU with HLR */
520 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
521 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
522 }
523 alt {
524 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
525 setverdict(pass);
526 }
527 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
528 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
529 setverdict(fail);
530 }
531 }
532}
533testcase TC_attach_gsup_lu_reject() runs on test_CT {
534 var BSSGP_ConnHdlr vc_conn;
535 f_init();
536 f_sleep(1.0);
537 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb[0], 6);
538 vc_conn.done;
539}
540
541
Harald Welte3823e2e2018-02-16 21:53:48 +0100542/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
543private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100544 var BssgpDecoded bd;
Harald Welte3823e2e2018-02-16 21:53:48 +0100545 var RoutingAreaIdentificationV old_ra := f_random_RAI();
546
Harald Welte23178c52018-02-17 09:36:33 +0100547 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +0100548 f_gmm_auth();
549 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100550 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100551
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 Welte3823e2e2018-02-16 21:53:48 +0100555 BSSGP.send(ts_GMM_ATTACH_COMPL);
556 setverdict(pass);
557}
Harald Welte3823e2e2018-02-16 21:53:48 +0100558testcase TC_attach_combined() runs on test_CT {
559 var BSSGP_ConnHdlr vc_conn;
560 f_init();
561 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100562 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb[0], 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100563 vc_conn.done;
564}
565
Harald Welte76dee092018-02-16 22:12:59 +0100566/* Attempt of GPRS ATTACH in 'accept all' mode */
567private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100568 var BssgpDecoded bd;
Harald Welte76dee092018-02-16 22:12:59 +0100569 var RoutingAreaIdentificationV old_ra := f_random_RAI();
570
571 g_pars.net.expect_auth := false;
572
Harald Welte23178c52018-02-17 09:36:33 +0100573 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +0100574 f_gmm_auth();
Harald Welte04683d02018-02-16 22:43:45 +0100575 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
576 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
577 }
Harald Welte76dee092018-02-16 22:12:59 +0100578 BSSGP.send(ts_GMM_ATTACH_COMPL);
579 setverdict(pass);
580}
581testcase TC_attach_accept_all() runs on test_CT {
582 var BSSGP_ConnHdlr vc_conn;
583 f_init();
584 f_sleep(1.0);
585 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Harald Welteb7c14e92018-02-17 09:29:16 +0100586 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 8);
Harald Welte76dee092018-02-16 22:12:59 +0100587 vc_conn.done;
588}
Harald Welte5b7c8122018-02-16 21:48:17 +0100589
Harald Welteb2124b22018-02-16 22:26:56 +0100590/* Attempt of GPRS ATTACH in 'accept all' mode */
591private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +0100592 var RoutingAreaIdentificationV old_ra := f_random_RAI();
593
594 /* Simulate a foreign IMSI */
595 g_pars.imsi := '001010123456789'H;
596 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
597
598 g_pars.net.expect_auth := false;
599
Harald Welte23178c52018-02-17 09:36:33 +0100600 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +0100601 alt {
602 [] as_mm_identity();
603 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
604 setverdict(pass);
605 }
606 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
607 setverdict(pass);
608 }
609 }
610}
611testcase TC_attach_closed() runs on test_CT {
612 var BSSGP_ConnHdlr vc_conn;
613 f_init();
614 f_sleep(1.0);
615 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
616 /* test with foreign IMSI: Must Reject */
Harald Welteb7c14e92018-02-17 09:29:16 +0100617 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb[0], 9);
Harald Welteb2124b22018-02-16 22:26:56 +0100618 vc_conn.done;
619 /* test with home IMSI: Must Accept */
Harald Welteb7c14e92018-02-17 09:29:16 +0100620 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 10);
Harald Welteb2124b22018-02-16 22:26:56 +0100621 vc_conn.done;
622}
623
Harald Welte04683d02018-02-16 22:43:45 +0100624/* Routing Area Update from Unknown TLLI -> REJECT */
625private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100626 var RoutingAreaIdentificationV old_ra := f_random_RAI();
627
Harald Welte23178c52018-02-17 09:36:33 +0100628 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 +0100629 alt {
630 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
631 setverdict(pass);
632 }
633 /* FIXME: Expect XID RESET? */
634 [] BSSGP.receive { repeat; }
635 }
636}
637testcase TC_rau_unknown() runs on test_CT {
638 var BSSGP_ConnHdlr vc_conn;
639 f_init();
640 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100641 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb[0], 11);
Harald Welte04683d02018-02-16 22:43:45 +0100642 vc_conn.done;
643}
644
Harald Welte91636de2018-02-17 10:16:14 +0100645private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
646 var BssgpDecoded bd;
647
648 /* first perform regular attach */
649 f_TC_attach(id);
650
651 /* then send RAU */
652 BSSGP.send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit));
653 alt {
654 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
655 f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept);
656 setverdict(pass);
657 }
658 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
659 setverdict(fail, "Unexpected RAU Reject");
660 }
661 [] BSSGP.receive { repeat; }
662 }
663}
664testcase TC_attach_rau() runs on test_CT {
665 var BSSGP_ConnHdlr vc_conn;
666 f_init();
667 f_sleep(1.0);
668 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb[0], 12);
669 vc_conn.done;
670}
Harald Welte04683d02018-02-16 22:43:45 +0100671
Harald Welte6abb9fe2018-02-17 15:24:48 +0100672/* general GPRS DETACH helper */
673function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge) runs on BSSGP_ConnHdlr {
674 var BssgpDecoded bd;
675 timer T := 5.0;
676 BSSGP.send(ts_GMM_DET_REQ_MO(detach_type, power_off));
677 if (expect_purge) {
678 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
679 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
680 }
681 T.start;
682 alt {
683 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
684 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
685 }
686 [power_off] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
687 g_pars.ra := omit;
688 setverdict(fail, "Unexpected ATTACH ACCEPT in no-power-off DETACH");
689 /* TODO: check if any PDP contexts are deactivated on network side? */
690 }
691 [power_off] T.timeout {
692 setverdict(pass);
693 }
694 [not power_off] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
695 g_pars.ra := omit;
696 setverdict(pass);
697 /* TODO: check if any PDP contexts are deactivated on network side? */
698 }
699 [] BSSGP.receive { repeat; }
700 }
701}
702
703/* IMSI DETACH (non-power-off) for unknown TLLI */
704private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
705 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
706}
707testcase TC_detach_unknown_nopoweroff() runs on test_CT {
708 var BSSGP_ConnHdlr vc_conn;
709 f_init();
710 f_sleep(1.0);
711 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb[0], 13);
712 vc_conn.done;
713}
714
715/* IMSI DETACH (power-off) for unknown TLLI */
716private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
717 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
718}
719testcase TC_detach_unknown_poweroff() runs on test_CT {
720 var BSSGP_ConnHdlr vc_conn;
721 f_init();
722 f_sleep(1.0);
723 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb[0], 14);
724 vc_conn.done;
725}
726
727/* IMSI DETACH (non-power-off) for known TLLI */
728private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
729 /* first perform regular attach */
730 f_TC_attach(id);
731
732 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
733}
734testcase TC_detach_nopoweroff() runs on test_CT {
735 var BSSGP_ConnHdlr vc_conn;
736 f_init();
737 f_sleep(1.0);
738 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb[0], 15);
739 vc_conn.done;
740}
741
742/* IMSI DETACH (power-off) for known TLLI */
743private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
744 /* first perform regular attach */
745 f_TC_attach(id);
746
747 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
748}
749testcase TC_detach_poweroff() runs on test_CT {
750 var BSSGP_ConnHdlr vc_conn;
751 f_init();
752 f_sleep(1.0);
753 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb[0], 16);
754 vc_conn.done;
755}
756
Harald Welteeded9ad2018-02-17 20:57:34 +0100757type record PdpActPars {
758 BIT3 tid,
759 BIT4 nsapi,
760 BIT4 sapi,
761 QoSV qos,
762 PDPAddressV addr,
763 octetstring apn optional,
764 ProtocolConfigOptionsV pco optional,
765 OCT1 exp_rej_cause optional,
Harald Welte6abb9fe2018-02-17 15:24:48 +0100766
Harald Welteeded9ad2018-02-17 20:57:34 +0100767 OCT4 ggsn_tei_c,
768 OCT4 ggsn_tei_u,
769 octetstring ggsn_ip_c,
770 octetstring ggsn_ip_u,
771
772 GtpPeer sgsn,
773 OCT4 sgsn_tei_c optional,
774 OCT4 sgsn_tei_u optional
775};
776
777function f_pdp_ctx_act(PdpActPars apars) runs on BSSGP_ConnHdlr {
778 var boolean exp_rej := ispresent(apars.exp_rej_cause);
779 var Gtp1cUnitdata g_ud;
780
781 BSSGP.send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
782 apars.apn, apars.pco));
783 if (not exp_rej) {
784 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
785 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
786 var GTPC_PDUs gtpc_rx := g_ud.gtpc.gtpc_pdu;
787 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
788 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
789 var OCT1 cause := int2oct(128, 1);
790 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
791 apars.sgsn_tei_c, cause,
792 apars.ggsn_tei_c, apars.ggsn_tei_u,
793 apars.nsapi,
794 apars.ggsn_ip_c, apars.ggsn_ip_u));
795 }
796 }
797 alt {
798 [exp_rej] BSSGP.receive(tr_BD_L3(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause))) {
799 setverdict(pass);
800 }
801 [exp_rej] BSSGP.receive(tr_BD_L3(tr_SM_ACT_PDP_ACCEPT)) {
802 setverdict(fail, "Unexpected PDP CTX ACT ACC");
803 }
804 [not exp_rej] BSSGP.receive(tr_BD_L3(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
805 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
806 }
807 [not exp_rej] BSSGP.receive(tr_BD_L3(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi))) {
808 setverdict(pass);
809 }
810 }
811}
812
813/* Table 10.5.156/3GPP TS 24.008 */
814template (value) QoSV t_QosDefault := {
815 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
816 delayClass := '100'B, /* best effort */
817 spare1 := '00'B,
818 precedenceClass := '010'B, /* normal */
819 spare2 := '0'B,
820 peakThroughput := '0000'B, /* subscribed */
821 meanThroughput := '00000'B, /* subscribed */
822 spare3 := '000'B,
823 deliverErroneusSDU := omit,
824 deliveryOrder := omit,
825 trafficClass := omit,
826 maxSDUSize := omit,
827 maxBitrateUplink := omit,
828 maxBitrateDownlink := omit,
829 sduErrorRatio := omit,
830 residualBER := omit,
831 trafficHandlingPriority := omit,
832 transferDelay := omit,
833 guaranteedBitRateUplink := omit,
834 guaranteedBitRateDownlink := omit,
835 sourceStatisticsDescriptor := omit,
836 signallingIndication := omit,
837 spare4 := omit,
838 maxBitrateDownlinkExt := omit,
839 guaranteedBitRateDownlinkExt := omit,
840 maxBitrateUplinkExt := omit,
841 guaranteedBitRateUplinkExt := omit,
842 maxBitrateDownlinkExt2 := omit,
843 guaranteedBitRateDownlinkExt2 := omit,
844 maxBitrateUplinkExt2 := omit,
845 guaranteedBitRateUplinkExt2 := omit
846}
847
848/* 10.5.6.4 / 3GPP TS 24.008 */
849template (value) PDPAddressV t_AddrIPv4dyn := {
850 pdpTypeOrg := '0001'B, /* IETF */
851 spare := '0000'B,
852 pdpTypeNum := '21'O, /* IPv4 */
853 addressInfo := omit
854}
855template (value) PDPAddressV t_AddrIPv6dyn := {
856 pdpTypeOrg := '0001'B, /* IETF */
857 spare := '0000'B,
858 pdpTypeNum := '53'O, /* IPv6 */
859 addressInfo := omit
860}
861
862template (value) PdpActPars t_PdpActPars := {
863 tid := '000'B,
864 nsapi := '0101'B, /* < 5 are reserved */
865 sapi := '0011'B, /* 3/5/9/11 */
866 qos := t_QosDefault,
867 addr := t_AddrIPv4dyn,
868 apn := omit,
869 pco := omit,
870 exp_rej_cause := omit,
871
872 /* FIXME: make below dynamic !! */
873 ggsn_tei_c := '00010000'O,
874 ggsn_tei_u := '00020000'O,
875 ggsn_ip_c := '7F000001'O,
876 ggsn_ip_u := '7F000001'O,
877
878 sgsn := { },
879 sgsn_tei_c := omit,
880 sgsn_tei_u := omit
881}
882
883private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
884 var PdpActPars apars := valueof(t_PdpActPars);
885
886 /* first perform regular attach */
887 f_TC_attach(id);
888
889 f_pdp_ctx_act(apars);
890}
891testcase TC_attach_pdp_act() runs on test_CT {
892 var BSSGP_ConnHdlr vc_conn;
893 f_init();
894 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb[0], 17);
895 vc_conn.done;
896}
Harald Welteb2124b22018-02-16 22:26:56 +0100897
Harald Welte5ac31492018-02-15 20:39:13 +0100898
899control {
Harald Welte5b7c8122018-02-16 21:48:17 +0100900 execute( TC_attach() );
901 execute( TC_attach_auth_id_timeout() );
902 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +0100903 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +0100904 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +0100905 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +0100906 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +0100907 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +0100908 execute( TC_attach_closed() );
Harald Welte04683d02018-02-16 22:43:45 +0100909 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +0100910 execute( TC_attach_rau() );
Harald Welte6abb9fe2018-02-17 15:24:48 +0100911 execute( TC_detach_unknown_nopoweroff() );
912 execute( TC_detach_unknown_poweroff() );
913 execute( TC_detach_nopoweroff() );
914 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +0100915 execute( TC_attach_pdp_act() );
Harald Welte5ac31492018-02-15 20:39:13 +0100916}
Harald Welte96a33b02018-02-04 10:36:22 +0100917
918
919
920}