blob: e76ed09cd4725954d754b5fbc664ae8f8236378c [file] [log] [blame]
Harald Welte96a33b02018-02-04 10:36:22 +01001module SGSN_Tests {
2
3import from General_Types all;
4import from Osmocom_Types all;
Harald Welte37692d82018-02-18 15:21:34 +01005import from Native_Functions all;
Harald Welte96a33b02018-02-04 10:36:22 +01006import from NS_Types all;
7import from NS_Emulation all;
8import from BSSGP_Types all;
9import from BSSGP_Emulation all;
Harald Welte5ac31492018-02-15 20:39:13 +010010import from Osmocom_Gb_Types all;
11
12import from MobileL3_CommonIE_Types all;
13import from MobileL3_GMM_SM_Types all;
14import from MobileL3_Types all;
15import from L3_Templates all;
16import from L3_Common all;
17
18import from GSUP_Emulation all;
19import from GSUP_Types all;
20import from IPA_Emulation all;
21
Harald Welteeded9ad2018-02-17 20:57:34 +010022import from GTP_Emulation all;
23import from GTP_Templates all;
24import from GTP_CodecPort all;
25import from GTPC_Types all;
26import from GTPU_Types all;
27
Harald Weltea2526a82018-02-18 19:03:36 +010028import from LLC_Types all;
29import from LLC_Templates all;
30
31import from SNDCP_Types all;
32
Harald Weltebd194722018-02-16 22:11:08 +010033import from TELNETasp_PortType all;
34import from Osmocom_VTY_Functions all;
35
Neels Hofmeyr8df7d152018-03-14 19:03:28 +010036import from GSM_RR_Types all;
37
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020038import from MobileL3_MM_Types all;
39
Harald Welteeded9ad2018-02-17 20:57:34 +010040
Harald Welte5ac31492018-02-15 20:39:13 +010041modulepar {
42 /* IP/port on which we run our internal GSUP/HLR emulation */
43 charstring mp_hlr_ip := "127.0.0.1";
44 integer mp_hlr_port := 4222;
Harald Welteeded9ad2018-02-17 20:57:34 +010045 charstring mp_ggsn_ip := "127.0.0.2";
Harald Welte5ac31492018-02-15 20:39:13 +010046};
47
48type record GbInstance {
49 NS_CT vc_NS,
50 BSSGP_CT vc_BSSGP,
51 BssgpConfig cfg
52};
Harald Welte96a33b02018-02-04 10:36:22 +010053
54type component test_CT {
Harald Welte5ac31492018-02-15 20:39:13 +010055 var GbInstance g_gb[3];
Harald Welte96a33b02018-02-04 10:36:22 +010056
Harald Welte5ac31492018-02-15 20:39:13 +010057 var GSUP_Emulation_CT vc_GSUP;
58 var IPA_Emulation_CT vc_GSUP_IPA;
59 /* only to get events from IPA underneath GSUP */
60 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +010061
Harald Welteeded9ad2018-02-17 20:57:34 +010062 var GTP_Emulation_CT vc_GTP;
63
Harald Weltebd194722018-02-16 22:11:08 +010064 port TELNETasp_PT SGSNVTY;
65
Harald Welte96a33b02018-02-04 10:36:22 +010066 var boolean g_initialized := false;
Pau Espin Pedroldc27e482018-07-10 14:02:49 +020067 var boolean g_use_echo := false;
Harald Welte96a33b02018-02-04 10:36:22 +010068};
69
Harald Welteeded9ad2018-02-17 20:57:34 +010070type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +010071 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +010072 timer g_Tguard;
Harald Welte5ac31492018-02-15 20:39:13 +010073}
74
75type record SGSN_ConnHdlrNetworkPars {
76 boolean expect_ptmsi,
77 boolean expect_auth,
78 boolean expect_ciph
79};
80
81type record BSSGP_ConnHdlrPars {
82 /* IMEI of the simulated ME */
83 hexstring imei,
Alexander Couzens8f0fb002018-05-02 19:30:55 +020084 /* IMSI of the simulated MS */
Harald Welte5ac31492018-02-15 20:39:13 +010085 hexstring imsi,
86 /* MSISDN of the simulated MS (probably unused) */
87 hexstring msisdn,
88 /* P-TMSI allocated to the simulated MS */
89 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +010090 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +010091 /* TLLI of the simulated MS */
92 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +010093 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +010094 RoutingAreaIdentificationV ra optional,
95 BssgpCellId bssgp_cell_id,
96 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +010097 SGSN_ConnHdlrNetworkPars net,
98 float t_guard
Harald Welte5ac31492018-02-15 20:39:13 +010099};
100
Harald Welte3fdbe822018-02-18 19:10:18 +0100101private function f_init_gb(inout GbInstance gb, charstring id) runs on test_CT {
102 gb.vc_NS := NS_CT.create(id & "-NS");
103 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP");
Harald Welte5ac31492018-02-15 20:39:13 +0100104 /* connect lower end of BSSGP emulation with NS upper port */
105 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
106 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
107 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
108
109 gb.vc_NS.start(NSStart());
110 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
111}
112
113private function f_init_gsup(charstring id) runs on test_CT {
114 id := id & "-GSUP";
115 var GsupOps ops := {
116 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
117 };
118
119 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
120 vc_GSUP := GSUP_Emulation_CT.create(id);
121
122 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
123 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
124 /* we use this hack to get events like ASP_IPA_EVENT_UP */
125 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
126
127 vc_GSUP.start(GSUP_Emulation.main(ops, id));
128 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
129
130 /* wait for incoming connection to GSUP port before proceeding */
131 timer T := 10.0;
132 T.start;
133 alt {
134 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
135 [] T.timeout {
136 setverdict(fail, "No connection to GSUP Port");
137 self.stop;
138 }
139 }
140}
141
Harald Welteeded9ad2018-02-17 20:57:34 +0100142private function f_init_gtp(charstring id) runs on test_CT {
143 id := id & "-GTP";
144
145 var GtpEmulationCfg gtp_cfg := {
146 gtpc_bind_ip := mp_ggsn_ip,
147 gtpc_bind_port := GTP1C_PORT,
148 gtpu_bind_ip := mp_ggsn_ip,
149 gtpu_bind_port := GTP1U_PORT,
150 sgsn_role := false
151 };
152
153 vc_GTP := GTP_Emulation_CT.create(id);
154 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
155}
156
Harald Weltebd194722018-02-16 22:11:08 +0100157private function f_init_vty() runs on test_CT {
158 map(self:SGSNVTY, system:SGSNVTY);
159 f_vty_set_prompts(SGSNVTY);
160 f_vty_transceive(SGSNVTY, "enable");
161 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
162}
163
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200164private function f_vty_enable_echo_interval(boolean enable) runs on test_CT {
165 if (enable) {
166 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 echo-interval 5");
167 } else {
168 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 no echo-interval");
169 }
170}
171
Harald Weltebd194722018-02-16 22:11:08 +0100172
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100173function f_init(BcdMccMnc mcc_mnc := '26242F'H) runs on test_CT {
Harald Welte96a33b02018-02-04 10:36:22 +0100174 if (g_initialized == true) {
175 return;
176 }
177 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100178 g_gb[0].cfg := {
179 nsei := 96,
180 bvci := 196,
181 cell_id := {
182 ra_id := {
183 lai := {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100184 mcc_mnc := mcc_mnc, lac := 13135},
Harald Welte5ac31492018-02-15 20:39:13 +0100185 rac := 0
186 },
187 cell_id := 20960
188 },
189 sgsn_role := false
190 };
Harald Welte96a33b02018-02-04 10:36:22 +0100191
Harald Welte3fdbe822018-02-18 19:10:18 +0100192 f_init_gb(g_gb[0], "SGSN_Test-Gb0");
Harald Welte5ac31492018-02-15 20:39:13 +0100193 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100194 f_init_gtp("SGSN_Test");
Harald Weltebd194722018-02-16 22:11:08 +0100195 f_init_vty();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200196 f_vty_enable_echo_interval(g_use_echo);
Harald Welte5ac31492018-02-15 20:39:13 +0100197}
Harald Welte96a33b02018-02-04 10:36:22 +0100198
Harald Welte5ac31492018-02-15 20:39:13 +0100199type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
200
201/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Harald Welte62e29582018-02-16 21:17:11 +0100202function f_start_handler(void_fn fn, charstring id, GbInstance gb, integer imsi_suffix,
203 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100204runs on test_CT return BSSGP_ConnHdlr {
205 var BSSGP_ConnHdlr vc_conn;
206 var SGSN_ConnHdlrNetworkPars net_pars := {
207 expect_ptmsi := true,
208 expect_auth := true,
209 expect_ciph := false
210 };
211 var BSSGP_ConnHdlrPars pars := {
212 imei := f_gen_imei(imsi_suffix),
213 imsi := f_gen_imsi(imsi_suffix),
214 msisdn := f_gen_msisdn(imsi_suffix),
215 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100216 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100217 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100218 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100219 ra := omit,
220 bssgp_cell_id := gb.cfg.cell_id,
221 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100222 net := net_pars,
223 t_guard := t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100224 };
225
226 vc_conn := BSSGP_ConnHdlr.create(id);
227 connect(vc_conn:BSSGP, gb.vc_BSSGP:BSSGP_SP);
228 connect(vc_conn:BSSGP_PROC, gb.vc_BSSGP:BSSGP_PROC);
229
230 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
231 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
232
Harald Welteeded9ad2018-02-17 20:57:34 +0100233 connect(vc_conn:GTP, vc_GTP:CLIENT);
234 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
235
Harald Welte5ac31492018-02-15 20:39:13 +0100236 vc_conn.start(f_handler_init(fn, id, pars));
237 return vc_conn;
238}
239
Harald Welte62e29582018-02-16 21:17:11 +0100240private altstep as_Tguard() runs on BSSGP_ConnHdlr {
241 [] g_Tguard.timeout {
242 setverdict(fail, "Tguard timeout");
243 self.stop;
244 }
245}
246
Harald Welte5ac31492018-02-15 20:39:13 +0100247/* first function called in every ConnHdlr */
248private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
249runs on BSSGP_ConnHdlr {
250 /* do some common stuff like setting up g_pars */
251 g_pars := pars;
252
253 /* register with BSSGP core */
254 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
255 /* tell GSUP dispatcher to send this IMSI to us */
256 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100257 /* tell GTP dispatcher to send this IMSI to us */
258 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100259
Harald Welte62e29582018-02-16 21:17:11 +0100260 g_Tguard.start(pars.t_guard);
261 activate(as_Tguard());
262
Harald Welte5ac31492018-02-15 20:39:13 +0100263 /* call the user-supplied test case function */
264 fn.apply(id);
265 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100266}
267
268/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100269 * Detach without Attach
270 * SM procedures without attach / RAU
271 * ATTACH / RAU
272 ** with / without authentication
273 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100274 * re-transmissions of LLC frames
275 * PDP Context activation
276 ** with different GGSN config in SGSN VTY
277 ** with different PDP context type (v4/v6/v46)
278 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100279 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100280 */
281
282testcase TC_wait_ns_up() runs on test_CT {
283 f_init();
284 f_sleep(20.0);
285}
286
Harald Welte5ac31492018-02-15 20:39:13 +0100287altstep as_mm_identity() runs on BSSGP_ConnHdlr {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100288 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
Harald Welte5ac31492018-02-15 20:39:13 +0100289 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
290 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
291 BSSGP.send(ts_GMM_ID_RESP(mi));
292 repeat;
293 }
294 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
295 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
296 BSSGP.send(ts_GMM_ID_RESP(mi));
297 repeat;
298 }
299}
Harald Welte96a33b02018-02-04 10:36:22 +0100300
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200301/* perform GMM authentication (if expected).
302 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
303 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
304function f_gmm_auth (boolean umts_aka_challenge := false, boolean force_gsm_sres := false) runs on BSSGP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100305 var BssgpDecoded bd;
306 var PDU_L3_MS_SGSN l3_mo;
307 var PDU_L3_SGSN_MS l3_mt;
308 var default di := activate(as_mm_identity());
309 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200310 var GSUP_IE auth_tuple;
311 var template AuthenticationParameterAUTNTLV autn;
312
313 if (umts_aka_challenge) {
314 g_pars.vec := f_gen_auth_vec_3g();
315 autn := {
316 elementIdentifier := '28'O,
317 lengthIndicator := lengthof(g_pars.vec.autn),
318 autnValue := g_pars.vec.autn
319 };
320
321 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
322 g_pars.vec.sres,
323 g_pars.vec.kc,
324 g_pars.vec.ik,
325 g_pars.vec.ck,
326 g_pars.vec.autn,
327 g_pars.vec.res));
328 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
329 } else {
330 g_pars.vec := f_gen_auth_vec_2g();
331 autn := omit;
332 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
333 g_pars.vec.sres,
334 g_pars.vec.kc));
335 log("GSUP sends only 2G auth tuple", auth_tuple);
336 }
Harald Welte5ac31492018-02-15 20:39:13 +0100337 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
338 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200339
340 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
341 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
342 BSSGP.receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
Harald Welte5ac31492018-02-15 20:39:13 +0100343 l3_mt := bd.l3_mt;
344 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200345 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
346
347 if (umts_aka_challenge and not force_gsm_sres) {
348 /* set UMTS response instead */
349 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
350 valueField := substr(g_pars.vec.res, 0, 4)
351 };
352 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
353 elementIdentifier := '21'O,
354 lengthIndicator := lengthof(g_pars.vec.res) - 4,
355 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
356 };
357 }
358
359 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100360 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
361 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
362 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
363 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
364 }
365 BSSGP.send(l3_mo);
Harald Welte76dee092018-02-16 22:12:59 +0100366 } else {
367 /* wait for identity procedure */
368 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100369 }
Harald Welte76dee092018-02-16 22:12:59 +0100370
Harald Welte5ac31492018-02-15 20:39:13 +0100371 deactivate(di);
372}
373
Harald Weltef70997d2018-02-17 10:11:19 +0100374function f_upd_ptmsi_and_tlli(OCT4 p_tmsi) runs on BSSGP_ConnHdlr {
375 g_pars.p_tmsi := p_tmsi;
376 /* update TLLI */
377 g_pars.tlli_old := g_pars.tlli;
378 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
379 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli);
380}
381
Harald Welte04683d02018-02-16 22:43:45 +0100382function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
383 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100384 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
385 if (not (g_pars.bssgp_cell_id.ra_id.lai.mcc_mnc == aa_plmn)) {
386 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
387 & "; expected " & hex2str(g_pars.bssgp_cell_id.ra_id.lai.mcc_mnc));
388 self.stop;
389 }
Harald Welte04683d02018-02-16 22:43:45 +0100390 g_pars.ra := aa.routingAreaIdentification;
391 if (ispresent(aa.allocatedPTMSI)) {
392 if (not g_pars.net.expect_ptmsi) {
393 setverdict(fail, "unexpected P-TMSI allocation");
394 self.stop;
395 }
Harald Weltef70997d2018-02-17 10:11:19 +0100396 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100397 }
398 if (ispresent(aa.msIdentity)) {
399 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
400 self.stop;
401 }
402 /* P-TMSI.sig */
403 if (ispresent(aa.ptmsiSignature)) {
404 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
405 }
406 /* updateTimer */
407 // aa.readyTimer
408 /* T3302, T3319, T3323, T3312_ext, T3324 */
409}
410
Harald Welte91636de2018-02-17 10:16:14 +0100411function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra) runs on BSSGP_ConnHdlr {
412 /* mandatory IE */
413 g_pars.ra := ra.routingAreaId;
414 if (ispresent(ra.allocatedPTMSI)) {
415 if (not g_pars.net.expect_ptmsi) {
416 setverdict(fail, "unexpected P-TMSI allocation");
417 self.stop;
418 }
419 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
420 }
421 if (ispresent(ra.msIdentity)) {
422 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
423 self.stop;
424 }
425 /* P-TMSI.sig */
426 if (ispresent(ra.ptmsiSignature)) {
427 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
428 }
429 /* updateTimer */
430 // aa.readyTimer
431 /* T3302, T3319, T3323, T3312_ext, T3324 */
432}
433
434
Harald Welte5a4fa042018-02-16 20:59:21 +0100435function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
436 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
437}
438
Harald Welte23178c52018-02-17 09:36:33 +0100439/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100440private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileL3_CommonIE_Types.MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100441 if (ispresent(g_pars.p_tmsi)) {
442 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
443 } else {
444 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
445 }
446}
447
Harald Welte311ec272018-02-17 09:40:03 +0100448private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100449 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100450 /* Expect MSC to perform LU with HLR */
451 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100452 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
453 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
454 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100455 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
456 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
457}
458
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200459private function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100460 var BssgpDecoded bd;
Harald Welte5a4fa042018-02-16 20:59:21 +0100461 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200462 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
Harald Welte5ac31492018-02-15 20:39:13 +0100463
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200464 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
465 * 3G auth vectors */
466 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
467 /* The thing is, if the solSACapability is 'omit', then the
468 * revisionLevelIndicatior is at the wrong place! */
469 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
470
471 BSSGP.send(attach_req);
472 f_gmm_auth(umts_aka_challenge, force_gsm_sres);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200473 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100474 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100475
Harald Welte04683d02018-02-16 22:43:45 +0100476 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
477 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
478 }
479 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Harald Welte5ac31492018-02-15 20:39:13 +0100480 BSSGP.send(ts_GMM_ATTACH_COMPL);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200481}
482
483private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
484 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100485 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100486}
487
488testcase TC_attach() runs on test_CT {
489 var BSSGP_ConnHdlr vc_conn;
490 f_init();
491 f_sleep(1.0);
492 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb[0], 1);
493 vc_conn.done;
494}
495
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100496testcase TC_attach_mnc3() runs on test_CT {
497 var BSSGP_ConnHdlr vc_conn;
498 f_init('023042'H);
499 f_sleep(1.0);
500 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb[0], 1001);
501 vc_conn.done;
502}
503
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200504private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
505 f_gmm_attach(true, false);
506 setverdict(pass);
507}
508testcase TC_attach_umts_aka_umts_res() runs on test_CT {
509 var BSSGP_ConnHdlr vc_conn;
510 f_init();
511 f_sleep(1.0);
512 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb[0], 1002);
513 vc_conn.done;
514}
515
516private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
517 f_gmm_attach(true, true);
518 setverdict(pass);
519}
520testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
521 var BSSGP_ConnHdlr vc_conn;
522 f_init();
523 f_sleep(1.0);
524 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb[0], 1003);
525 vc_conn.done;
526}
527
Harald Welte5b7c8122018-02-16 21:48:17 +0100528/* MS never responds to ID REQ, expect ATTACH REJECT */
529private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100530 var RoutingAreaIdentificationV old_ra := f_random_RAI();
531
Harald Welte23178c52018-02-17 09:36:33 +0100532 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100533 alt {
Harald Welte1967d472018-02-16 21:54:21 +0100534 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100535 /* don't send ID Response */
536 repeat;
537 }
Harald Welte1967d472018-02-16 21:54:21 +0100538 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100539 setverdict(pass);
540 }
Harald Welte1967d472018-02-16 21:54:21 +0100541 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100542 setverdict(fail, "Wrong Attach Reject Cause");
543 }
544 }
545}
546testcase TC_attach_auth_id_timeout() runs on test_CT {
547 var BSSGP_ConnHdlr vc_conn;
548 f_init();
549 vc_conn := f_start_handler(refers(f_TC_attach_auth_id_timeout), testcasename(), g_gb[0], 2, 40.0);
550 vc_conn.done;
551}
552
553/* HLR never responds to SAI REQ, expect ATTACH REJECT */
554private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100555 var RoutingAreaIdentificationV old_ra := f_random_RAI();
556
Harald Welte23178c52018-02-17 09:36:33 +0100557 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100558 alt {
559 [] as_mm_identity();
560 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
561 }
562 /* don't send SAI-response from HLR */
Harald Welte1967d472018-02-16 21:54:21 +0100563 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Welte5b7c8122018-02-16 21:48:17 +0100564 setverdict(pass);
565}
566testcase TC_attach_auth_sai_timeout() runs on test_CT {
567 var BSSGP_ConnHdlr vc_conn;
568 f_init();
569 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb[0], 3);
570 vc_conn.done;
571}
572
Harald Weltefe253882018-02-17 09:25:00 +0100573/* HLR rejects SAI, expect ATTACH REJECT */
574private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100575 var RoutingAreaIdentificationV old_ra := f_random_RAI();
576
Harald Welte23178c52018-02-17 09:36:33 +0100577 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +0100578 alt {
579 [] as_mm_identity();
580 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
581 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
582 }
583 }
584 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
585 setverdict(pass);
586}
587testcase TC_attach_auth_sai_reject() runs on test_CT {
588 var BSSGP_ConnHdlr vc_conn;
589 f_init();
Harald Welteb7c14e92018-02-17 09:29:16 +0100590 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb[0], 4);
Harald Weltefe253882018-02-17 09:25:00 +0100591 vc_conn.done;
592}
593
Harald Welte5b7c8122018-02-16 21:48:17 +0100594/* HLR never responds to UL REQ, expect ATTACH REJECT */
595private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100596 var BssgpDecoded bd;
Harald Welte5b7c8122018-02-16 21:48:17 +0100597 var RoutingAreaIdentificationV old_ra := f_random_RAI();
598
Harald Welte23178c52018-02-17 09:36:33 +0100599 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100600 f_gmm_auth();
601 /* Expect MSC to perform LU with HLR */
602 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
603 /* Never follow-up with ISD_REQ or UL_RES */
604 alt {
Harald Welte1967d472018-02-16 21:54:21 +0100605 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100606 setverdict(pass);
607 }
Harald Welte04683d02018-02-16 22:43:45 +0100608 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
609 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100610 setverdict(fail);
611 }
612 }
613}
614testcase TC_attach_gsup_lu_timeout() runs on test_CT {
615 var BSSGP_ConnHdlr vc_conn;
616 f_init();
617 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100618 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb[0], 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100619 vc_conn.done;
620}
621
Harald Welteb7c14e92018-02-17 09:29:16 +0100622/* HLR rejects UL REQ, expect ATTACH REJECT */
623private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
624 var BssgpDecoded bd;
Harald Welteb7c14e92018-02-17 09:29:16 +0100625 var RoutingAreaIdentificationV old_ra := f_random_RAI();
626
Harald Welte23178c52018-02-17 09:36:33 +0100627 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +0100628 f_gmm_auth();
629 /* Expect MSC to perform LU with HLR */
630 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
631 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
632 }
633 alt {
634 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
635 setverdict(pass);
636 }
637 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
638 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
639 setverdict(fail);
640 }
641 }
642}
643testcase TC_attach_gsup_lu_reject() runs on test_CT {
644 var BSSGP_ConnHdlr vc_conn;
645 f_init();
646 f_sleep(1.0);
647 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb[0], 6);
648 vc_conn.done;
649}
650
651
Harald Welte3823e2e2018-02-16 21:53:48 +0100652/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
653private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100654 var BssgpDecoded bd;
Harald Welte3823e2e2018-02-16 21:53:48 +0100655 var RoutingAreaIdentificationV old_ra := f_random_RAI();
656
Harald Welte23178c52018-02-17 09:36:33 +0100657 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +0100658 f_gmm_auth();
659 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100660 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100661
Harald Welte04683d02018-02-16 22:43:45 +0100662 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
663 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
664 }
Harald Welte3823e2e2018-02-16 21:53:48 +0100665 BSSGP.send(ts_GMM_ATTACH_COMPL);
666 setverdict(pass);
667}
Harald Welte3823e2e2018-02-16 21:53:48 +0100668testcase TC_attach_combined() runs on test_CT {
669 var BSSGP_ConnHdlr vc_conn;
670 f_init();
671 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100672 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb[0], 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100673 vc_conn.done;
674}
675
Harald Welte76dee092018-02-16 22:12:59 +0100676/* Attempt of GPRS ATTACH in 'accept all' mode */
677private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100678 var BssgpDecoded bd;
Harald Welte76dee092018-02-16 22:12:59 +0100679 var RoutingAreaIdentificationV old_ra := f_random_RAI();
680
681 g_pars.net.expect_auth := false;
682
Harald Welte23178c52018-02-17 09:36:33 +0100683 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +0100684 f_gmm_auth();
Harald Welte04683d02018-02-16 22:43:45 +0100685 BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
686 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
687 }
Harald Welte76dee092018-02-16 22:12:59 +0100688 BSSGP.send(ts_GMM_ATTACH_COMPL);
689 setverdict(pass);
690}
691testcase TC_attach_accept_all() runs on test_CT {
692 var BSSGP_ConnHdlr vc_conn;
693 f_init();
694 f_sleep(1.0);
695 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Harald Welteb7c14e92018-02-17 09:29:16 +0100696 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 8);
Harald Welte76dee092018-02-16 22:12:59 +0100697 vc_conn.done;
698}
Harald Welte5b7c8122018-02-16 21:48:17 +0100699
Harald Welteb2124b22018-02-16 22:26:56 +0100700/* Attempt of GPRS ATTACH in 'accept all' mode */
701private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +0100702 var RoutingAreaIdentificationV old_ra := f_random_RAI();
703
704 /* Simulate a foreign IMSI */
705 g_pars.imsi := '001010123456789'H;
706 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
707
708 g_pars.net.expect_auth := false;
709
Harald Welte23178c52018-02-17 09:36:33 +0100710 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +0100711 alt {
712 [] as_mm_identity();
713 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
714 setverdict(pass);
715 }
716 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
717 setverdict(pass);
718 }
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200719 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
720 setverdict(fail);
721 }
Harald Welteb2124b22018-02-16 22:26:56 +0100722 }
723}
724testcase TC_attach_closed() runs on test_CT {
725 var BSSGP_ConnHdlr vc_conn;
726 f_init();
727 f_sleep(1.0);
728 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
729 /* test with foreign IMSI: Must Reject */
Harald Welteb7c14e92018-02-17 09:29:16 +0100730 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb[0], 9);
Harald Welteb2124b22018-02-16 22:26:56 +0100731 vc_conn.done;
732 /* test with home IMSI: Must Accept */
Harald Welteb7c14e92018-02-17 09:29:16 +0100733 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb[0], 10);
Harald Welteb2124b22018-02-16 22:26:56 +0100734 vc_conn.done;
735}
736
Harald Welte04683d02018-02-16 22:43:45 +0100737/* Routing Area Update from Unknown TLLI -> REJECT */
738private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100739 var RoutingAreaIdentificationV old_ra := f_random_RAI();
740
Harald Welte23178c52018-02-17 09:36:33 +0100741 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 +0100742 alt {
743 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
744 setverdict(pass);
745 }
746 /* FIXME: Expect XID RESET? */
747 [] BSSGP.receive { repeat; }
748 }
749}
750testcase TC_rau_unknown() runs on test_CT {
751 var BSSGP_ConnHdlr vc_conn;
752 f_init();
753 f_sleep(1.0);
Harald Welteb7c14e92018-02-17 09:29:16 +0100754 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb[0], 11);
Harald Welte04683d02018-02-16 22:43:45 +0100755 vc_conn.done;
756}
757
Harald Welte91636de2018-02-17 10:16:14 +0100758private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
759 var BssgpDecoded bd;
760
761 /* first perform regular attach */
762 f_TC_attach(id);
763
764 /* then send RAU */
765 BSSGP.send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit));
766 alt {
767 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
768 f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept);
Alexander Couzens80ec1ea2018-05-12 16:44:36 +0200769 BSSGP.send(ts_GMM_RAU_COMPL);
Harald Welte91636de2018-02-17 10:16:14 +0100770 setverdict(pass);
771 }
772 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
773 setverdict(fail, "Unexpected RAU Reject");
774 }
775 [] BSSGP.receive { repeat; }
776 }
777}
778testcase TC_attach_rau() runs on test_CT {
779 var BSSGP_ConnHdlr vc_conn;
780 f_init();
781 f_sleep(1.0);
782 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb[0], 12);
783 vc_conn.done;
784}
Harald Welte04683d02018-02-16 22:43:45 +0100785
Harald Welte6abb9fe2018-02-17 15:24:48 +0100786/* general GPRS DETACH helper */
787function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge) runs on BSSGP_ConnHdlr {
788 var BssgpDecoded bd;
789 timer T := 5.0;
790 BSSGP.send(ts_GMM_DET_REQ_MO(detach_type, power_off));
791 if (expect_purge) {
792 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
793 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
794 }
795 T.start;
796 alt {
797 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
798 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
799 }
800 [power_off] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
801 g_pars.ra := omit;
802 setverdict(fail, "Unexpected ATTACH ACCEPT in no-power-off DETACH");
803 /* TODO: check if any PDP contexts are deactivated on network side? */
804 }
805 [power_off] T.timeout {
806 setverdict(pass);
807 }
808 [not power_off] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
809 g_pars.ra := omit;
810 setverdict(pass);
811 /* TODO: check if any PDP contexts are deactivated on network side? */
812 }
813 [] BSSGP.receive { repeat; }
814 }
815}
816
817/* IMSI DETACH (non-power-off) for unknown TLLI */
818private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
819 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
820}
821testcase TC_detach_unknown_nopoweroff() runs on test_CT {
822 var BSSGP_ConnHdlr vc_conn;
823 f_init();
824 f_sleep(1.0);
825 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb[0], 13);
826 vc_conn.done;
827}
828
829/* IMSI DETACH (power-off) for unknown TLLI */
830private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
831 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
832}
833testcase TC_detach_unknown_poweroff() runs on test_CT {
834 var BSSGP_ConnHdlr vc_conn;
835 f_init();
836 f_sleep(1.0);
837 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb[0], 14);
838 vc_conn.done;
839}
840
841/* IMSI DETACH (non-power-off) for known TLLI */
842private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
843 /* first perform regular attach */
844 f_TC_attach(id);
845
846 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
847}
848testcase TC_detach_nopoweroff() runs on test_CT {
849 var BSSGP_ConnHdlr vc_conn;
850 f_init();
851 f_sleep(1.0);
852 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb[0], 15);
853 vc_conn.done;
854}
855
856/* IMSI DETACH (power-off) for known TLLI */
857private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
858 /* first perform regular attach */
859 f_TC_attach(id);
860
861 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
862}
863testcase TC_detach_poweroff() runs on test_CT {
864 var BSSGP_ConnHdlr vc_conn;
865 f_init();
866 f_sleep(1.0);
867 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb[0], 16);
868 vc_conn.done;
869}
870
Harald Welteeded9ad2018-02-17 20:57:34 +0100871type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +0100872 BIT3 tid, /* L3 Transaction ID */
873 BIT4 nsapi, /* SNDCP NSAPI */
874 BIT4 sapi, /* LLC SAPI */
875 QoSV qos, /* QoS parameters */
876 PDPAddressV addr, /* IP address */
877 octetstring apn optional, /* APN name */
878 ProtocolConfigOptionsV pco optional, /* protoco config opts */
879 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +0100880 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +0100881 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +0100882
Harald Welte822f9102018-02-18 20:39:06 +0100883 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
884 OCT4 ggsn_tei_u, /* GGSN TEI User */
885 octetstring ggsn_ip_c, /* GGSN IP Control */
886 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200887 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +0100888
Harald Welte822f9102018-02-18 20:39:06 +0100889 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
890 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
891 octetstring sgsn_ip_c optional, /* SGSN IP Control */
892 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +0100893};
894
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100895
896private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
897 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
898 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
899 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
900 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
901 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
902 f_gtp_register_teid(apars.ggsn_tei_c);
903 f_gtp_register_teid(apars.ggsn_tei_u);
904}
905
Harald Welte37692d82018-02-18 15:21:34 +0100906function f_pdp_ctx_act(inout PdpActPars apars) runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100907 var boolean exp_rej := ispresent(apars.exp_rej_cause);
908 var Gtp1cUnitdata g_ud;
909
910 BSSGP.send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
911 apars.apn, apars.pco));
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100912 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
913 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
914 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
915 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
916 apars.sgsn_tei_c, apars.gtp_resp_cause,
917 apars.ggsn_tei_c, apars.ggsn_tei_u,
918 apars.nsapi,
919 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id));
Harald Welteeded9ad2018-02-17 20:57:34 +0100920 }
921 alt {
Harald Welte28307082018-02-18 12:14:18 +0100922 [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 +0100923 setverdict(pass);
924 }
Harald Welte28307082018-02-18 12:14:18 +0100925 [exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100926 setverdict(fail, "Unexpected PDP CTX ACT ACC");
927 }
Harald Welte28307082018-02-18 12:14:18 +0100928 [not exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100929 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
930 }
Harald Welte28307082018-02-18 12:14:18 +0100931 [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 +0100932 setverdict(pass);
933 }
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100934 [] as_xid(apars);
Harald Welteeded9ad2018-02-17 20:57:34 +0100935 }
936}
937
Harald Welte6f203162018-02-18 22:04:55 +0100938function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause) runs on BSSGP_ConnHdlr {
939 var boolean exp_rej := ispresent(apars.exp_rej_cause);
940 var Gtp1cUnitdata g_ud;
941
942 BSSGP.send(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
943 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
944 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
945 BSSGP.clear;
946 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
947 }
948 alt {
949 [] BSSGP.receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {
950 setverdict(pass);
951 }
952 [] as_xid(apars);
953 }
954}
955
Harald Welte57b9b7f2018-02-18 22:28:13 +0100956function f_pdp_ctx_deact_mt(inout PdpActPars apars, OCT1 cause) runs on BSSGP_ConnHdlr {
957 var Gtp1cUnitdata g_ud;
958 var integer seq_nr := 23;
959 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
960
961 BSSGP.clear;
Pau Espin Pedrol84667222018-07-13 19:08:14 +0200962 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
Harald Welte57b9b7f2018-02-18 22:28:13 +0100963
964 interleave {
965 [] BSSGP.receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?))) {
966 BSSGP.send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
967 }
968 [] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) { }
969 }
970}
971
Harald Welte6f203162018-02-18 22:04:55 +0100972
Harald Welteeded9ad2018-02-17 20:57:34 +0100973/* Table 10.5.156/3GPP TS 24.008 */
974template (value) QoSV t_QosDefault := {
975 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
976 delayClass := '100'B, /* best effort */
977 spare1 := '00'B,
978 precedenceClass := '010'B, /* normal */
979 spare2 := '0'B,
980 peakThroughput := '0000'B, /* subscribed */
981 meanThroughput := '00000'B, /* subscribed */
982 spare3 := '000'B,
983 deliverErroneusSDU := omit,
984 deliveryOrder := omit,
985 trafficClass := omit,
986 maxSDUSize := omit,
987 maxBitrateUplink := omit,
988 maxBitrateDownlink := omit,
989 sduErrorRatio := omit,
990 residualBER := omit,
991 trafficHandlingPriority := omit,
992 transferDelay := omit,
993 guaranteedBitRateUplink := omit,
994 guaranteedBitRateDownlink := omit,
995 sourceStatisticsDescriptor := omit,
996 signallingIndication := omit,
997 spare4 := omit,
998 maxBitrateDownlinkExt := omit,
999 guaranteedBitRateDownlinkExt := omit,
1000 maxBitrateUplinkExt := omit,
1001 guaranteedBitRateUplinkExt := omit,
1002 maxBitrateDownlinkExt2 := omit,
1003 guaranteedBitRateDownlinkExt2 := omit,
1004 maxBitrateUplinkExt2 := omit,
1005 guaranteedBitRateUplinkExt2 := omit
1006}
1007
1008/* 10.5.6.4 / 3GPP TS 24.008 */
1009template (value) PDPAddressV t_AddrIPv4dyn := {
1010 pdpTypeOrg := '0001'B, /* IETF */
1011 spare := '0000'B,
1012 pdpTypeNum := '21'O, /* IPv4 */
1013 addressInfo := omit
1014}
1015template (value) PDPAddressV t_AddrIPv6dyn := {
1016 pdpTypeOrg := '0001'B, /* IETF */
1017 spare := '0000'B,
1018 pdpTypeNum := '53'O, /* IPv6 */
1019 addressInfo := omit
1020}
1021
Harald Welte37692d82018-02-18 15:21:34 +01001022template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001023 tid := '000'B,
1024 nsapi := '0101'B, /* < 5 are reserved */
1025 sapi := '0011'B, /* 3/5/9/11 */
1026 qos := t_QosDefault,
1027 addr := t_AddrIPv4dyn,
1028 apn := omit,
1029 pco := omit,
1030 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001031 gtp_resp_cause := int2oct(128, 1),
1032 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001033
1034 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001035 ggsn_tei_c := f_rnd_octstring(4),
1036 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001037 ggsn_ip_c := f_inet_addr(ggsn_ip),
1038 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001039 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001040
Harald Welteeded9ad2018-02-17 20:57:34 +01001041 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001042 sgsn_tei_u := omit,
1043 sgsn_ip_c := omit,
1044 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001045}
1046
Harald Welte37692d82018-02-18 15:21:34 +01001047template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1048 connId := 1,
1049 remName := f_inet_ntoa(ip),
1050 remPort := GTP1U_PORT
1051}
1052
1053template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1054 connId := 1,
1055 remName := f_inet_ntoa(ip),
1056 remPort := GTP1C_PORT
1057}
1058
1059private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1060 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1061 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1062}
1063
1064private altstep as_xid(PdpActPars apars) runs on BSSGP_ConnHdlr {
1065 [] BSSGP.receive(tr_BD_LLC(tr_LLC_XID(?, apars.sapi))) {
1066 repeat;
1067 }
1068}
1069
1070template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1071 pDU_SN_UNITDATA := {
1072 nsapi := nsapi,
1073 moreBit := ?,
1074 snPduType := '1'B,
1075 firstSegmentIndicator := ?,
1076 spareBit := ?,
1077 pcomp := ?,
1078 dcomp := ?,
1079 npduNumber := ?,
1080 segmentNumber := ?,
1081 npduNumberContinued := ?,
1082 dataSegmentSnUnitdataPdu := payload
1083 }
1084}
1085
1086/* simple case: single segment, no compression */
1087template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1088 pDU_SN_UNITDATA := {
1089 nsapi := nsapi,
1090 moreBit := '0'B,
1091 snPduType := '1'B,
1092 firstSegmentIndicator := '1'B,
1093 spareBit := '0'B,
1094 pcomp := '0000'B,
1095 dcomp := '0000'B,
1096 npduNumber := '0000'B,
1097 segmentNumber := '0000'B,
1098 npduNumberContinued := '00'O,
1099 dataSegmentSnUnitdataPdu := payload
1100 }
1101}
1102
1103/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
1104private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1105 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1106 f_gtpu_send(apars, payload);
1107 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1108 alt {
1109 [] as_xid(apars);
1110 [] BSSGP.receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
1111 }
1112}
1113
1114private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1115 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1116 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1117 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
1118 BSSGP.send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
1119 f_gtpu_send(apars, payload);
1120 /* Expect PDU via GTP from SGSN on simulated GGSN */
1121 alt {
1122 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1123 }
1124}
1125
Harald Welteeded9ad2018-02-17 20:57:34 +01001126private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001127 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001128
1129 /* first perform regular attach */
1130 f_TC_attach(id);
1131
1132 f_pdp_ctx_act(apars);
1133}
1134testcase TC_attach_pdp_act() runs on test_CT {
1135 var BSSGP_ConnHdlr vc_conn;
1136 f_init();
1137 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb[0], 17);
1138 vc_conn.done;
1139}
Harald Welteb2124b22018-02-16 22:26:56 +01001140
Harald Welte835b15f2018-02-18 14:39:11 +01001141/* PDP Context activation for not-attached subscriber; expect fail */
1142private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001143 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welte835b15f2018-02-18 14:39:11 +01001144 BSSGP.send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
1145 apars.apn, apars.pco));
1146 alt {
1147 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
1148 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
1149 setverdict(pass);
1150 }
1151 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1152 setverdict(fail, "Unexpected GTP PDP CTX ACT");
1153 }
1154 [] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
1155 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
1156 }
1157 [] BSSGP.receive { repeat; }
1158 }
1159}
1160testcase TC_pdp_act_unattached() runs on test_CT {
1161 var BSSGP_ConnHdlr vc_conn;
1162 f_init();
1163 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb[0], 18);
1164 vc_conn.done;
1165}
1166
Harald Welte37692d82018-02-18 15:21:34 +01001167/* ATTACH + PDP CTX ACT + user plane traffic */
1168private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1169 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1170
1171 /* first perform regular attach */
1172 f_TC_attach(id);
1173 /* then activate PDP context */
1174 f_pdp_ctx_act(apars);
1175 /* then transceive a downlink PDU */
1176 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1177 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1178}
1179testcase TC_attach_pdp_act_user() runs on test_CT {
1180 var BSSGP_ConnHdlr vc_conn;
1181 f_init();
1182 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb[0], 19);
1183 vc_conn.done;
1184}
1185
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001186/* ATTACH + PDP CTX ACT; reject from GGSN */
1187private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1188 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1189
1190 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1191 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1192
1193 /* first perform regular attach */
1194 f_TC_attach(id);
1195 /* then activate PDP context */
1196 f_pdp_ctx_act(apars);
1197}
1198testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1199 var BSSGP_ConnHdlr vc_conn;
1200 f_init();
1201 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb[0], 20);
1202 vc_conn.done;
1203}
Harald Welte835b15f2018-02-18 14:39:11 +01001204
Harald Welte6f203162018-02-18 22:04:55 +01001205/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1206private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1207 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1208
1209 /* first perform regular attach */
1210 f_TC_attach(id);
1211 /* then activate PDP context */
1212 f_pdp_ctx_act(apars);
1213 /* then transceive a downlink PDU */
1214 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1215 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1216
1217 f_pdp_ctx_deact_mo(apars, '00'O);
1218}
1219testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1220 var BSSGP_ConnHdlr vc_conn;
1221 f_init();
1222 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user_deact_mo), testcasename(), g_gb[0], 21);
1223 vc_conn.done;
1224}
1225
Harald Welte57b9b7f2018-02-18 22:28:13 +01001226/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1227private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1228 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1229
1230 /* first perform regular attach */
1231 f_TC_attach(id);
1232 /* then activate PDP context */
1233 f_pdp_ctx_act(apars);
1234 /* then transceive a downlink PDU */
1235 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1236 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1237
1238 f_pdp_ctx_deact_mt(apars, '00'O);
1239}
1240testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1241 var BSSGP_ConnHdlr vc_conn;
1242 f_init();
1243 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user_deact_mt), testcasename(), g_gb[0], 22);
1244 vc_conn.done;
1245}
1246
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001247/* ATTACH + ATTACH (2nd) */
1248private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1249 g_pars.t_guard := 5.0;
1250
1251 /* first perform regular attach */
1252 f_TC_attach(id);
1253
1254 /* second to perform regular attach */
1255 f_TC_attach(id);
1256}
1257
1258
1259testcase TC_attach_second_attempt() runs on test_CT {
1260 var BSSGP_ConnHdlr vc_conn;
1261 f_init();
1262 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb[0], 22);
1263 vc_conn.done;
1264}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001265
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001266private function f_TC_attach_restart_ctr_dettach(charstring id) runs on BSSGP_ConnHdlr {
1267 var Gtp1cUnitdata g_ud;
1268 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1269
1270 /* first perform regular attach */
1271 f_TC_attach(id);
1272 /* Activate a pdp context against the GGSN */
1273 f_pdp_ctx_act(apars);
1274 /* Wait to receive first echo request and send initial Restart counter */
1275 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1276 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1277 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1278 }
1279 /* Wait to receive second echo request and send incremented Restart
1280 counter. This will fake a restarted GGSN, and pdp ctx allocated
1281 should be released by SGSN */
1282 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1283 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1284 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1285 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1286 }
1287 var OCT1 cause_network_failure := int2oct(38, 1)
1288 alt {
1289 [] BSSGP.receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true))) {
1290 BSSGP.send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
1291 setverdict(pass);
1292 }
1293 [] as_xid(apars);
1294 }
1295 setverdict(pass);
1296}
1297testcase TC_attach_restart_ctr_dettach() runs on test_CT {
1298 var BSSGP_ConnHdlr vc_conn;
1299 g_use_echo := true
1300 f_init();
1301 vc_conn := f_start_handler(refers(f_TC_attach_restart_ctr_dettach), testcasename(), g_gb[0], 23, 30.0);
1302 vc_conn.done;
1303 g_use_echo := false
1304}
1305
Alexander Couzens5e307b42018-05-22 18:12:20 +02001306private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
1307 /* MS: perform regular attach */
1308 f_TC_attach(id);
1309
1310 /* HLR: cancel the location request */
1311 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
1312 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02001313
1314 /* ensure no Detach Request got received */
1315 timer T := 5.0;
1316 T.start;
1317 alt {
1318 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(*, *, *))) {
1319 T.stop;
1320 setverdict(fail, "Unexpected GMM Detach Request");
1321 }
1322 [] T.timeout {
1323 setverdict(pass);
1324 self.stop;
1325 }
1326 [] BSSGP.receive {
1327 repeat;
1328 }
1329 }
1330}
1331
1332testcase TC_hlr_location_cancel_request_update() runs on test_CT {
1333 /* MS <-> SGSN: GMM Attach
1334 * HLR -> SGSN: Cancel Location Request
1335 * HLR <- SGSN: Cancel Location Ack
1336 */
1337 var BSSGP_ConnHdlr vc_conn;
1338 f_init();
1339 f_sleep(1.0);
1340 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb[0], 31);
1341 vc_conn.done;
1342}
1343
1344
Alexander Couzensc87967a2018-05-22 16:09:54 +02001345private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
1346 /* MS: perform regular attach */
1347 f_TC_attach(id);
1348
1349 /* HLR: cancel the location request */
1350 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
1351 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
1352 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
1353
1354 /* MS: receive a Detach Request */
1355 BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?)));
1356 BSSGP.send(ts_GMM_DET_ACCEPT_MO);
1357
1358 setverdict(pass);
1359}
1360
1361testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
1362 /* MS <-> SGSN: GMM Attach
1363 * HLR -> SGSN: Cancel Location Request
1364 * HLR <- SGSN: Cancel Location Ack
1365 * MS <- SGSN: Detach Request
1366 * SGSN-> MS: Detach Complete
1367 */
1368 var BSSGP_ConnHdlr vc_conn;
1369 f_init();
1370 f_sleep(1.0);
1371 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb[0], 29);
1372 vc_conn.done;
1373}
1374
1375
Alexander Couzens6c47f292018-05-22 17:09:49 +02001376private function f_hlr_location_cancel_request_unknown_subscriber(
1377 charstring id,
1378 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
1379
1380 /* HLR: cancel the location request */
1381 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
1382
1383 /* cause 2 = IMSI_UNKNOWN */
1384 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
1385
1386 setverdict(pass);
1387}
1388
1389private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001390 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001391}
1392
1393testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
1394 /* HLR -> SGSN: Cancel Location Request
1395 * HLR <- SGSN: Cancel Location Error
1396 */
1397
1398 var BSSGP_ConnHdlr vc_conn;
1399 f_init();
1400 f_sleep(1.0);
1401 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw), testcasename(), g_gb[0], 30);
1402 vc_conn.done;
1403}
1404
1405private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001406 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001407}
1408
1409testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
1410 /* HLR -> SGSN: Cancel Location Request
1411 * HLR <- SGSN: Cancel Location Error
1412 */
1413
1414 var BSSGP_ConnHdlr vc_conn;
1415 f_init();
1416 f_sleep(1.0);
1417 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_unknown_subscriber_update), testcasename(), g_gb[0], 30);
1418 vc_conn.done;
1419}
1420
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001421private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
1422 f_TC_attach(id);
1423 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1424}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001425
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001426testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
1427 /* MS <-> SGSN: Attach
1428 * MS -> SGSN: Detach Req (Power off)
1429 * VTY -> SGSN: Check if MS is NOT in subscriber cache
1430 */
1431 var BSSGP_ConnHdlr vc_conn;
1432 var integer id := 33;
1433 var charstring imsi := hex2str(f_gen_imsi(id));
1434
1435 f_init();
1436 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb[0], id);
1437 vc_conn.done;
1438
1439 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1440}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001441
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001442/* Attempt an attach, but loose the Identification Request (IMEI) */
1443private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
1444 var integer count_req := 0;
1445 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1446
1447 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
1448
1449 alt {
1450 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
1451 /* break */
1452 }
1453 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
1454 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
1455 BSSGP.send(ts_GMM_ID_RESP(mi));
1456 repeat;
1457 }
1458 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
1459 /* ignore ID REQ IMEI */
1460 count_req := count_req + 1;
1461 repeat;
1462 }
1463 }
1464 if (count_req != 5) {
1465 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
1466 }
1467 setverdict(pass);
1468}
1469
1470testcase TC_attach_no_imei_response() runs on test_CT {
1471 /* MS -> SGSN: Attach Request IMSI
1472 * MS <- SGSN: Identity Request IMSI (optional)
1473 * MS -> SGSN: Identity Response IMSI (optional)
1474 * MS <- SGSN: Identity Request IMEI
1475 * MS -x SGSN: no response
1476 * MS <- SGSN: re-send: Identity Request IMEI 4x
1477 * MS <- SGSN: Attach Reject
1478 */
1479 var BSSGP_ConnHdlr vc_conn;
1480 f_init();
1481 f_sleep(1.0);
1482 vc_conn := f_start_handler(refers(f_TC_attach_no_imei_response), testcasename(), g_gb[0], 32, 60.0);
1483 vc_conn.done;
1484}
1485
Alexander Couzens53f20562018-06-12 16:24:12 +02001486/* Attempt an attach, but loose the Identification Request (IMSI) */
1487private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
1488 var integer count_req := 0;
1489 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1490
1491 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
1492 g_pars.p_tmsi := 'c0000035'O;
1493
1494 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
1495
1496 alt {
1497 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
1498 /* break */
1499 }
1500 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
1501 /* ignore ID REQ IMSI */
1502 count_req := count_req + 1;
1503 repeat;
1504 }
1505 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
1506 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
1507 BSSGP.send(ts_GMM_ID_RESP(mi));
1508 repeat;
1509 }
1510 }
1511 if (count_req != 5) {
1512 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
1513 }
1514 setverdict(pass);
1515}
1516
1517testcase TC_attach_no_imsi_response() runs on test_CT {
1518 /* MS -> SGSN: Attach Request TMSI (unknown)
1519 * MS <- SGSN: Identity Request IMEI (optional)
1520 * MS -> SGSN: Identity Response IMEI (optional)
1521 * MS <- SGSN: Identity Request IMSI
1522 * MS -x SGSN: no response
1523 * MS <- SGSN: re-send: Identity Request IMSI 4x
1524 * MS <- SGSN: Attach Reject
1525 */
1526 var BSSGP_ConnHdlr vc_conn;
1527 f_init();
1528 f_sleep(1.0);
1529 vc_conn := f_start_handler(refers(f_TC_attach_no_imsi_response), testcasename(), g_gb[0], 35, 60.0);
1530 vc_conn.done;
1531}
1532
Alexander Couzenscf818962018-06-05 18:00:00 +02001533private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
1534 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
1535}
1536
1537testcase TC_attach_check_subscriber_list() runs on test_CT {
1538 /* MS <-> SGSN: Attach
1539 * VTY -> SGSN: Check if MS is in subscriber cache
1540 */
1541 var BSSGP_ConnHdlr vc_conn;
1542 var integer id := 34;
1543 var charstring imsi := hex2str(f_gen_imsi(id));
1544
1545 f_init();
1546 f_sleep(1.0);
1547 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb[0], id);
1548 vc_conn.done;
1549
1550 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1551 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
1552}
1553
Alexander Couzensf9858652018-06-07 16:14:53 +02001554private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
1555 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1556 var BssgpDecoded bd;
1557
1558 /* unregister the old IMSI */
1559 f_bssgp_client_unregister(g_pars.imsi);
1560 /* Simulate a foreign IMSI */
1561 g_pars.imsi := '001010123456789'H;
1562 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id);
1563
1564 /* there is no auth */
1565 g_pars.net.expect_auth := false;
1566
1567 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
1568 f_gmm_auth();
1569 alt {
1570 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
1571 setverdict(fail, "Received unexpected GMM Attach REJECT");
1572 }
1573 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
1574 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
1575 BSSGP.send(ts_GMM_ATTACH_COMPL);
1576 setverdict(pass);
1577 }
1578 }
1579}
1580testcase TC_attach_closed_add_vty() runs on test_CT {
1581 /* VTY-> SGSN: policy close
1582 * MS -> SGSN: Attach Request
1583 * MS <- SGSN: Identity Request IMSI
1584 * MS -> SGSN: Identity Response IMSI
1585 * MS <- SGSN: Attach Reject
1586 * VTY-> SGSN: policy imsi-acl add IMSI
1587 * MS -> SGSN: Attach Request
1588 * MS <- SGSN: Identity Request IMSI
1589 * MS -> SGSN: Identity Response IMSI
1590 * MS <- SGSN: Identity Request IMEI
1591 * MS -> SGSN: Identity Response IMEI
1592 * MS <- SGSN: Attach Accept
1593 */
1594 var BSSGP_ConnHdlr vc_conn;
1595 f_init();
1596 f_sleep(1.0);
1597 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1598 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
1599 /* test with foreign IMSI: Must Reject */
1600 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb[0], 9);
1601 vc_conn.done;
1602 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456789");
1603 /* test with same IMSI: Must Accept */
1604 vc_conn := f_start_handler(refers(f_TC_attach_closed_imsi_added), testcasename(), g_gb[0], 10);
1605 vc_conn.done;
1606}
1607
Alexander Couzens0085bd72018-06-12 19:08:44 +02001608/* Attempt an attach, but never answer a Attach Complete */
1609private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
1610 var integer count_req := 0;
1611
1612 BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
1613 f_gmm_auth();
1614
1615 alt {
1616 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
1617 /* break */
1618 }
1619 [] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
1620 /* ignore */
1621 count_req := count_req + 1;
1622 repeat;
1623 }
1624 }
1625 if (count_req != 5) {
1626 setverdict(fail, "Did not received GMM Attach Complete.");
1627 }
1628 setverdict(pass);
1629}
1630
1631testcase TC_attach_check_complete_resend() runs on test_CT {
1632 /* MS -> SGSN: Attach Request IMSI
1633 * MS <- SGSN: Identity Request *
1634 * MS -> SGSN: Identity Response *
1635 * MS <- SGSN: Attach Complete 5x
1636 */
1637 var BSSGP_ConnHdlr vc_conn;
1638 f_init();
1639 f_sleep(1.0);
1640 vc_conn := f_start_handler(refers(f_TC_attach_check_complete_resend), testcasename(), g_gb[0], 36, 60.0);
1641 vc_conn.done;
1642}
1643
Harald Welte5ac31492018-02-15 20:39:13 +01001644control {
Harald Welte5b7c8122018-02-16 21:48:17 +01001645 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01001646 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001647 execute( TC_attach_umts_aka_umts_res() );
1648 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001649 execute( TC_attach_auth_id_timeout() );
1650 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01001651 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001652 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01001653 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01001654 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01001655 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01001656 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001657 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02001658 execute( TC_attach_no_imsi_response() );
Alexander Couzensf9858652018-06-07 16:14:53 +02001659 execute( TC_attach_closed_add_vty(), 10.0 );
Alexander Couzenscf818962018-06-05 18:00:00 +02001660 execute( TC_attach_check_subscriber_list(), 10.0 );
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001661 execute( TC_attach_detach_check_subscriber_list(), 10.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02001662 execute( TC_attach_check_complete_resend() );
Alexander Couzens5e307b42018-05-22 18:12:20 +02001663 execute( TC_hlr_location_cancel_request_update(), 10.0 );
Alexander Couzens234c5882018-05-29 15:48:44 +02001664 execute( TC_hlr_location_cancel_request_withdraw(), 10.0 );
1665 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 10.0 );
1666 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 10.0 );
Harald Welte04683d02018-02-16 22:43:45 +01001667 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01001668 execute( TC_attach_rau() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01001669 execute( TC_detach_unknown_nopoweroff() );
1670 execute( TC_detach_unknown_poweroff() );
1671 execute( TC_detach_nopoweroff() );
1672 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01001673 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01001674 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01001675 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001676 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01001677 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01001678 execute( TC_attach_pdp_act_user_deact_mt() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001679 execute( TC_attach_second_attempt() );
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001680 execute( TC_attach_restart_ctr_dettach() );
Harald Welte5ac31492018-02-15 20:39:13 +01001681}
Harald Welte96a33b02018-02-04 10:36:22 +01001682
1683
1684
1685}