blob: 3616a62043c2e38ddbb04cde0c40a0c90fa3f26d [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";
Alexander Couzens2c12b242018-07-31 00:30:11 +020046
47 NSConfiguration mp_nsconfig := {
48 local_udp_port := 23000,
49 local_ip := "127.0.0.1",
50 remote_udp_port := 21000,
51 remote_ip := "127.0.0.1",
52 nsvci := 0,
53 nsei := 2342
54 };
Harald Welte5ac31492018-02-15 20:39:13 +010055};
56
57type record GbInstance {
58 NS_CT vc_NS,
59 BSSGP_CT vc_BSSGP,
60 BssgpConfig cfg
61};
Harald Welte96a33b02018-02-04 10:36:22 +010062
Alexander Couzens51114d12018-07-31 18:41:56 +020063type record length(3) of GbInstance GbInstances;
64type record length(3) of BssgpCellId BssgpCellIds;
65
Harald Welte96a33b02018-02-04 10:36:22 +010066type component test_CT {
Alexander Couzens51114d12018-07-31 18:41:56 +020067 var GbInstances g_gb;
Harald Welte96a33b02018-02-04 10:36:22 +010068
Harald Welte5ac31492018-02-15 20:39:13 +010069 var GSUP_Emulation_CT vc_GSUP;
70 var IPA_Emulation_CT vc_GSUP_IPA;
71 /* only to get events from IPA underneath GSUP */
72 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +010073
Harald Welteeded9ad2018-02-17 20:57:34 +010074 var GTP_Emulation_CT vc_GTP;
75
Harald Weltebd194722018-02-16 22:11:08 +010076 port TELNETasp_PT SGSNVTY;
77
Harald Welte96a33b02018-02-04 10:36:22 +010078 var boolean g_initialized := false;
Pau Espin Pedroldc27e482018-07-10 14:02:49 +020079 var boolean g_use_echo := false;
Harald Welte96a33b02018-02-04 10:36:22 +010080};
81
Harald Welteeded9ad2018-02-17 20:57:34 +010082type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +010083 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +010084 timer g_Tguard;
Harald Welte5ac31492018-02-15 20:39:13 +010085}
86
87type record SGSN_ConnHdlrNetworkPars {
88 boolean expect_ptmsi,
89 boolean expect_auth,
90 boolean expect_ciph
91};
92
93type record BSSGP_ConnHdlrPars {
94 /* IMEI of the simulated ME */
95 hexstring imei,
Alexander Couzens8f0fb002018-05-02 19:30:55 +020096 /* IMSI of the simulated MS */
Harald Welte5ac31492018-02-15 20:39:13 +010097 hexstring imsi,
98 /* MSISDN of the simulated MS (probably unused) */
99 hexstring msisdn,
100 /* P-TMSI allocated to the simulated MS */
101 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +0100102 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100103 /* TLLI of the simulated MS */
104 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +0100105 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100106 RoutingAreaIdentificationV ra optional,
Alexander Couzens51114d12018-07-31 18:41:56 +0200107 BssgpCellIds bssgp_cell_id,
Harald Welte5ac31492018-02-15 20:39:13 +0100108 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +0100109 SGSN_ConnHdlrNetworkPars net,
110 float t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100111};
112
Alexander Couzens51114d12018-07-31 18:41:56 +0200113private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
114 gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset));
115 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset));
Harald Welte5ac31492018-02-15 20:39:13 +0100116 /* connect lower end of BSSGP emulation with NS upper port */
117 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
118 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
119 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
120
Alexander Couzens2c12b242018-07-31 00:30:11 +0200121 gb.vc_NS.start(NSStart(mp_nsconfig));
Harald Welte5ac31492018-02-15 20:39:13 +0100122 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
123}
124
125private function f_init_gsup(charstring id) runs on test_CT {
126 id := id & "-GSUP";
127 var GsupOps ops := {
128 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
129 };
130
131 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
132 vc_GSUP := GSUP_Emulation_CT.create(id);
133
134 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
135 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
136 /* we use this hack to get events like ASP_IPA_EVENT_UP */
137 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
138
139 vc_GSUP.start(GSUP_Emulation.main(ops, id));
140 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
141
142 /* wait for incoming connection to GSUP port before proceeding */
143 timer T := 10.0;
144 T.start;
145 alt {
146 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
147 [] T.timeout {
148 setverdict(fail, "No connection to GSUP Port");
Daniel Willmannafce8662018-07-06 23:11:32 +0200149 mtc.stop;
Harald Welte5ac31492018-02-15 20:39:13 +0100150 }
151 }
152}
153
Harald Welteeded9ad2018-02-17 20:57:34 +0100154private function f_init_gtp(charstring id) runs on test_CT {
155 id := id & "-GTP";
156
157 var GtpEmulationCfg gtp_cfg := {
158 gtpc_bind_ip := mp_ggsn_ip,
159 gtpc_bind_port := GTP1C_PORT,
160 gtpu_bind_ip := mp_ggsn_ip,
161 gtpu_bind_port := GTP1U_PORT,
162 sgsn_role := false
163 };
164
165 vc_GTP := GTP_Emulation_CT.create(id);
166 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
167}
168
Harald Weltebd194722018-02-16 22:11:08 +0100169private function f_init_vty() runs on test_CT {
170 map(self:SGSNVTY, system:SGSNVTY);
171 f_vty_set_prompts(SGSNVTY);
172 f_vty_transceive(SGSNVTY, "enable");
173 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
174}
175
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200176private function f_vty_enable_echo_interval(boolean enable) runs on test_CT {
177 if (enable) {
178 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 echo-interval 5");
179 } else {
180 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 no echo-interval");
181 }
182}
183
Harald Weltebd194722018-02-16 22:11:08 +0100184
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100185function f_init(BcdMccMnc mcc_mnc := '26242F'H) runs on test_CT {
Harald Welte96a33b02018-02-04 10:36:22 +0100186 if (g_initialized == true) {
187 return;
188 }
189 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100190 g_gb[0].cfg := {
191 nsei := 96,
192 bvci := 196,
193 cell_id := {
194 ra_id := {
195 lai := {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100196 mcc_mnc := mcc_mnc, lac := 13135},
Harald Welte5ac31492018-02-15 20:39:13 +0100197 rac := 0
198 },
199 cell_id := 20960
200 },
201 sgsn_role := false
202 };
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200203 g_gb[1].cfg := {
204 nsei := 97,
205 bvci := 210,
206 cell_id := {
207 ra_id := {
208 lai := {
209 mcc_mnc := mcc_mnc, lac := 13200},
210 rac := 0
211 },
212 cell_id := 20961
213 },
214 sgsn_role := false
215 };
216 g_gb[2].cfg := {
217 nsei := 98,
218 bvci := 220,
219 cell_id := {
220 ra_id := {
221 lai := {
222 mcc_mnc := mcc_mnc, lac := 13300},
223 rac := 0
224 },
225 cell_id := 20962
226 },
227 sgsn_role := false
228 };
Harald Welte96a33b02018-02-04 10:36:22 +0100229
Alexander Couzens51114d12018-07-31 18:41:56 +0200230 f_init_gb(g_gb[0], "SGSN_Test-Gb0", 0);
231 f_init_gb(g_gb[1], "SGSN_Test-Gb1", 1);
232 f_init_gb(g_gb[2], "SGSN_Test-Gb2", 2);
Harald Welte5ac31492018-02-15 20:39:13 +0100233 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100234 f_init_gtp("SGSN_Test");
Harald Weltebd194722018-02-16 22:11:08 +0100235 f_init_vty();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200236 f_vty_enable_echo_interval(g_use_echo);
Harald Welte5ac31492018-02-15 20:39:13 +0100237}
Harald Welte96a33b02018-02-04 10:36:22 +0100238
Harald Welte5ac31492018-02-15 20:39:13 +0100239type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
240
241/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Alexander Couzens51114d12018-07-31 18:41:56 +0200242function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix,
Harald Welte62e29582018-02-16 21:17:11 +0100243 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100244runs on test_CT return BSSGP_ConnHdlr {
245 var BSSGP_ConnHdlr vc_conn;
246 var SGSN_ConnHdlrNetworkPars net_pars := {
247 expect_ptmsi := true,
248 expect_auth := true,
249 expect_ciph := false
250 };
251 var BSSGP_ConnHdlrPars pars := {
252 imei := f_gen_imei(imsi_suffix),
253 imsi := f_gen_imsi(imsi_suffix),
254 msisdn := f_gen_msisdn(imsi_suffix),
255 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100256 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100257 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100258 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100259 ra := omit,
Alexander Couzens51114d12018-07-31 18:41:56 +0200260 bssgp_cell_id := { gb[0].cfg.cell_id, gb[1].cfg.cell_id, gb[2].cfg.cell_id },
Harald Welte5ac31492018-02-15 20:39:13 +0100261 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100262 net := net_pars,
263 t_guard := t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100264 };
265
266 vc_conn := BSSGP_ConnHdlr.create(id);
Alexander Couzens51114d12018-07-31 18:41:56 +0200267 connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP:BSSGP_SP);
268 connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP:BSSGP_PROC);
269 connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP:BSSGP_SP);
270 connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP:BSSGP_PROC);
271 connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP:BSSGP_SP);
272 connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP:BSSGP_PROC);
Harald Welte5ac31492018-02-15 20:39:13 +0100273
274 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
275 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
276
Harald Welteeded9ad2018-02-17 20:57:34 +0100277 connect(vc_conn:GTP, vc_GTP:CLIENT);
278 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
279
Harald Welte5ac31492018-02-15 20:39:13 +0100280 vc_conn.start(f_handler_init(fn, id, pars));
281 return vc_conn;
282}
283
Harald Welte62e29582018-02-16 21:17:11 +0100284private altstep as_Tguard() runs on BSSGP_ConnHdlr {
285 [] g_Tguard.timeout {
286 setverdict(fail, "Tguard timeout");
Daniel Willmannafce8662018-07-06 23:11:32 +0200287 mtc.stop;
Harald Welte62e29582018-02-16 21:17:11 +0100288 }
289}
290
Harald Welte5ac31492018-02-15 20:39:13 +0100291/* first function called in every ConnHdlr */
292private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
293runs on BSSGP_ConnHdlr {
294 /* do some common stuff like setting up g_pars */
295 g_pars := pars;
296
297 /* register with BSSGP core */
Alexander Couzens51114d12018-07-31 18:41:56 +0200298 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welte5ac31492018-02-15 20:39:13 +0100299 /* tell GSUP dispatcher to send this IMSI to us */
300 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100301 /* tell GTP dispatcher to send this IMSI to us */
302 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100303
Harald Welte62e29582018-02-16 21:17:11 +0100304 g_Tguard.start(pars.t_guard);
305 activate(as_Tguard());
306
Harald Welte5ac31492018-02-15 20:39:13 +0100307 /* call the user-supplied test case function */
308 fn.apply(id);
309 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100310}
311
312/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100313 * Detach without Attach
314 * SM procedures without attach / RAU
315 * ATTACH / RAU
316 ** with / without authentication
317 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100318 * re-transmissions of LLC frames
319 * PDP Context activation
320 ** with different GGSN config in SGSN VTY
321 ** with different PDP context type (v4/v6/v46)
322 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100323 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100324 */
325
326testcase TC_wait_ns_up() runs on test_CT {
327 f_init();
328 f_sleep(20.0);
329}
330
Harald Welte5ac31492018-02-15 20:39:13 +0100331altstep as_mm_identity() runs on BSSGP_ConnHdlr {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100332 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200333 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Harald Welte5ac31492018-02-15 20:39:13 +0100334 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens0e510e62018-07-28 23:06:00 +0200335 BSSGP[0].send(ts_GMM_ID_RESP(mi));
Harald Welte5ac31492018-02-15 20:39:13 +0100336 repeat;
337 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200338 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Harald Welte5ac31492018-02-15 20:39:13 +0100339 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens0e510e62018-07-28 23:06:00 +0200340 BSSGP[0].send(ts_GMM_ID_RESP(mi));
Harald Welte5ac31492018-02-15 20:39:13 +0100341 repeat;
342 }
343}
Harald Welte96a33b02018-02-04 10:36:22 +0100344
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200345/* perform GMM authentication (if expected).
346 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
347 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
348function f_gmm_auth (boolean umts_aka_challenge := false, boolean force_gsm_sres := false) runs on BSSGP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100349 var BssgpDecoded bd;
350 var PDU_L3_MS_SGSN l3_mo;
351 var PDU_L3_SGSN_MS l3_mt;
352 var default di := activate(as_mm_identity());
353 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200354 var GSUP_IE auth_tuple;
355 var template AuthenticationParameterAUTNTLV autn;
356
357 if (umts_aka_challenge) {
358 g_pars.vec := f_gen_auth_vec_3g();
359 autn := {
360 elementIdentifier := '28'O,
361 lengthIndicator := lengthof(g_pars.vec.autn),
362 autnValue := g_pars.vec.autn
363 };
364
365 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
366 g_pars.vec.sres,
367 g_pars.vec.kc,
368 g_pars.vec.ik,
369 g_pars.vec.ck,
370 g_pars.vec.autn,
371 g_pars.vec.res));
372 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
373 } else {
374 g_pars.vec := f_gen_auth_vec_2g();
375 autn := omit;
376 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
377 g_pars.vec.sres,
378 g_pars.vec.kc));
379 log("GSUP sends only 2G auth tuple", auth_tuple);
380 }
Harald Welte5ac31492018-02-15 20:39:13 +0100381 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
382 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200383
384 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
385 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200386 BSSGP[0].receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
Harald Welte5ac31492018-02-15 20:39:13 +0100387 l3_mt := bd.l3_mt;
388 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200389 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
390
391 if (umts_aka_challenge and not force_gsm_sres) {
392 /* set UMTS response instead */
393 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
394 valueField := substr(g_pars.vec.res, 0, 4)
395 };
396 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
397 elementIdentifier := '21'O,
398 lengthIndicator := lengthof(g_pars.vec.res) - 4,
399 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
400 };
401 }
402
403 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100404 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
405 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
406 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
407 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
408 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200409 BSSGP[0].send(l3_mo);
Harald Welte76dee092018-02-16 22:12:59 +0100410 } else {
411 /* wait for identity procedure */
412 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100413 }
Harald Welte76dee092018-02-16 22:12:59 +0100414
Harald Welte5ac31492018-02-15 20:39:13 +0100415 deactivate(di);
416}
417
Harald Weltef70997d2018-02-17 10:11:19 +0100418function f_upd_ptmsi_and_tlli(OCT4 p_tmsi) runs on BSSGP_ConnHdlr {
419 g_pars.p_tmsi := p_tmsi;
420 /* update TLLI */
421 g_pars.tlli_old := g_pars.tlli;
422 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
423 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli);
424}
425
Harald Welte04683d02018-02-16 22:43:45 +0100426function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
427 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100428 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Alexander Couzens51114d12018-07-31 18:41:56 +0200429 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100430 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Alexander Couzens51114d12018-07-31 18:41:56 +0200431 & "; expected " & hex2str(g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200432 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100433 }
Harald Welte04683d02018-02-16 22:43:45 +0100434 g_pars.ra := aa.routingAreaIdentification;
435 if (ispresent(aa.allocatedPTMSI)) {
436 if (not g_pars.net.expect_ptmsi) {
437 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200438 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100439 }
Harald Weltef70997d2018-02-17 10:11:19 +0100440 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100441 }
442 if (ispresent(aa.msIdentity)) {
443 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200444 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100445 }
446 /* P-TMSI.sig */
447 if (ispresent(aa.ptmsiSignature)) {
448 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
449 }
450 /* updateTimer */
451 // aa.readyTimer
452 /* T3302, T3319, T3323, T3312_ext, T3324 */
453}
454
Harald Welte91636de2018-02-17 10:16:14 +0100455function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra) runs on BSSGP_ConnHdlr {
456 /* mandatory IE */
457 g_pars.ra := ra.routingAreaId;
458 if (ispresent(ra.allocatedPTMSI)) {
459 if (not g_pars.net.expect_ptmsi) {
460 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200461 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100462 }
463 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
464 }
465 if (ispresent(ra.msIdentity)) {
466 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200467 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100468 }
469 /* P-TMSI.sig */
470 if (ispresent(ra.ptmsiSignature)) {
471 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
472 }
473 /* updateTimer */
474 // aa.readyTimer
475 /* T3302, T3319, T3323, T3312_ext, T3324 */
476}
477
478
Harald Welte5a4fa042018-02-16 20:59:21 +0100479function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
480 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
481}
482
Harald Welte23178c52018-02-17 09:36:33 +0100483/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100484private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileL3_CommonIE_Types.MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100485 if (ispresent(g_pars.p_tmsi)) {
486 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
487 } else {
488 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
489 }
490}
491
Harald Welte311ec272018-02-17 09:40:03 +0100492private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100493 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100494 /* Expect MSC to perform LU with HLR */
495 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100496 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
497 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
498 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100499 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
500 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
501}
502
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200503private function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100504 var BssgpDecoded bd;
Harald Welte5a4fa042018-02-16 20:59:21 +0100505 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200506 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 +0100507
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200508 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
509 * 3G auth vectors */
510 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
511 /* The thing is, if the solSACapability is 'omit', then the
512 * revisionLevelIndicatior is at the wrong place! */
513 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
514
Alexander Couzens0e510e62018-07-28 23:06:00 +0200515 BSSGP[0].send(attach_req);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200516 f_gmm_auth(umts_aka_challenge, force_gsm_sres);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200517 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100518 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100519
Alexander Couzens0e510e62018-07-28 23:06:00 +0200520 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100521 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
522 }
523 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200524 BSSGP[0].send(ts_GMM_ATTACH_COMPL);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200525}
526
527private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
528 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100529 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100530}
531
532testcase TC_attach() runs on test_CT {
533 var BSSGP_ConnHdlr vc_conn;
534 f_init();
535 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200536 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100537 vc_conn.done;
538}
539
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100540testcase TC_attach_mnc3() runs on test_CT {
541 var BSSGP_ConnHdlr vc_conn;
542 f_init('023042'H);
543 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200544 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100545 vc_conn.done;
546}
547
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200548private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
549 f_gmm_attach(true, false);
550 setverdict(pass);
551}
552testcase TC_attach_umts_aka_umts_res() runs on test_CT {
553 var BSSGP_ConnHdlr vc_conn;
554 f_init();
555 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200556 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200557 vc_conn.done;
558}
559
560private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
561 f_gmm_attach(true, true);
562 setverdict(pass);
563}
564testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
565 var BSSGP_ConnHdlr vc_conn;
566 f_init();
567 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200568 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200569 vc_conn.done;
570}
571
Harald Welte5b7c8122018-02-16 21:48:17 +0100572/* MS never responds to ID REQ, expect ATTACH REJECT */
573private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100574 var RoutingAreaIdentificationV old_ra := f_random_RAI();
575
Alexander Couzens0e510e62018-07-28 23:06:00 +0200576 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100577 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200578 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100579 /* don't send ID Response */
580 repeat;
581 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200582 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100583 setverdict(pass);
584 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200585 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100586 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +0200587 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100588 }
589 }
590}
591testcase TC_attach_auth_id_timeout() runs on test_CT {
592 var BSSGP_ConnHdlr vc_conn;
593 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200594 vc_conn := f_start_handler(refers(f_TC_attach_auth_id_timeout), testcasename(), g_gb, 2, 40.0);
Harald Welte5b7c8122018-02-16 21:48:17 +0100595 vc_conn.done;
596}
597
598/* HLR never responds to SAI REQ, expect ATTACH REJECT */
599private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100600 var RoutingAreaIdentificationV old_ra := f_random_RAI();
601
Alexander Couzens0e510e62018-07-28 23:06:00 +0200602 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100603 alt {
604 [] as_mm_identity();
605 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
606 }
607 /* don't send SAI-response from HLR */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200608 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Welte5b7c8122018-02-16 21:48:17 +0100609 setverdict(pass);
610}
611testcase TC_attach_auth_sai_timeout() runs on test_CT {
612 var BSSGP_ConnHdlr vc_conn;
613 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200614 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +0100615 vc_conn.done;
616}
617
Harald Weltefe253882018-02-17 09:25:00 +0100618/* HLR rejects SAI, expect ATTACH REJECT */
619private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100620 var RoutingAreaIdentificationV old_ra := f_random_RAI();
621
Alexander Couzens0e510e62018-07-28 23:06:00 +0200622 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +0100623 alt {
624 [] as_mm_identity();
625 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
626 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
627 }
628 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200629 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Weltefe253882018-02-17 09:25:00 +0100630 setverdict(pass);
631}
632testcase TC_attach_auth_sai_reject() runs on test_CT {
633 var BSSGP_ConnHdlr vc_conn;
634 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200635 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +0100636 vc_conn.done;
637}
638
Harald Welte5b7c8122018-02-16 21:48:17 +0100639/* HLR never responds to UL REQ, expect ATTACH REJECT */
640private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100641 var BssgpDecoded bd;
Harald Welte5b7c8122018-02-16 21:48:17 +0100642 var RoutingAreaIdentificationV old_ra := f_random_RAI();
643
Alexander Couzens0e510e62018-07-28 23:06:00 +0200644 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100645 f_gmm_auth();
646 /* Expect MSC to perform LU with HLR */
647 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
648 /* Never follow-up with ISD_REQ or UL_RES */
649 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200650 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100651 setverdict(pass);
652 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200653 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100654 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100655 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200656 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100657 }
658 }
659}
660testcase TC_attach_gsup_lu_timeout() runs on test_CT {
661 var BSSGP_ConnHdlr vc_conn;
662 f_init();
663 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200664 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100665 vc_conn.done;
666}
667
Harald Welteb7c14e92018-02-17 09:29:16 +0100668/* HLR rejects UL REQ, expect ATTACH REJECT */
669private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
670 var BssgpDecoded bd;
Harald Welteb7c14e92018-02-17 09:29:16 +0100671 var RoutingAreaIdentificationV old_ra := f_random_RAI();
672
Alexander Couzens0e510e62018-07-28 23:06:00 +0200673 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +0100674 f_gmm_auth();
675 /* Expect MSC to perform LU with HLR */
676 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
677 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
678 }
679 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200680 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welteb7c14e92018-02-17 09:29:16 +0100681 setverdict(pass);
682 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200683 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welteb7c14e92018-02-17 09:29:16 +0100684 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
685 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200686 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +0100687 }
688 }
689}
690testcase TC_attach_gsup_lu_reject() runs on test_CT {
691 var BSSGP_ConnHdlr vc_conn;
692 f_init();
693 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200694 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +0100695 vc_conn.done;
696}
697
698
Harald Welte3823e2e2018-02-16 21:53:48 +0100699/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
700private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100701 var BssgpDecoded bd;
Harald Welte3823e2e2018-02-16 21:53:48 +0100702 var RoutingAreaIdentificationV old_ra := f_random_RAI();
703
Alexander Couzens0e510e62018-07-28 23:06:00 +0200704 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +0100705 f_gmm_auth();
706 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100707 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100708
Alexander Couzens0e510e62018-07-28 23:06:00 +0200709 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100710 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
711 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200712 BSSGP[0].send(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +0100713 setverdict(pass);
714}
Harald Welte3823e2e2018-02-16 21:53:48 +0100715testcase TC_attach_combined() runs on test_CT {
716 var BSSGP_ConnHdlr vc_conn;
717 f_init();
718 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200719 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100720 vc_conn.done;
721}
722
Harald Welte76dee092018-02-16 22:12:59 +0100723/* Attempt of GPRS ATTACH in 'accept all' mode */
724private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100725 var BssgpDecoded bd;
Harald Welte76dee092018-02-16 22:12:59 +0100726 var RoutingAreaIdentificationV old_ra := f_random_RAI();
727
728 g_pars.net.expect_auth := false;
729
Alexander Couzens0e510e62018-07-28 23:06:00 +0200730 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +0100731 f_gmm_auth();
Alexander Couzens0e510e62018-07-28 23:06:00 +0200732 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100733 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
734 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200735 BSSGP[0].send(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +0100736 setverdict(pass);
737}
738testcase TC_attach_accept_all() runs on test_CT {
739 var BSSGP_ConnHdlr vc_conn;
740 f_init();
741 f_sleep(1.0);
742 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +0200743 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +0100744 vc_conn.done;
745}
Harald Welte5b7c8122018-02-16 21:48:17 +0100746
Harald Welteb2124b22018-02-16 22:26:56 +0100747/* Attempt of GPRS ATTACH in 'accept all' mode */
748private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +0100749 var RoutingAreaIdentificationV old_ra := f_random_RAI();
750
751 /* Simulate a foreign IMSI */
752 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +0200753 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welteb2124b22018-02-16 22:26:56 +0100754
755 g_pars.net.expect_auth := false;
756
Alexander Couzens0e510e62018-07-28 23:06:00 +0200757 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +0100758 alt {
759 [] as_mm_identity();
Alexander Couzens0e510e62018-07-28 23:06:00 +0200760 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
Harald Welteb2124b22018-02-16 22:26:56 +0100761 setverdict(pass);
762 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200763 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welteb2124b22018-02-16 22:26:56 +0100764 setverdict(pass);
765 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200766 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200767 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200768 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200769 }
Harald Welteb2124b22018-02-16 22:26:56 +0100770 }
771}
772testcase TC_attach_closed() runs on test_CT {
773 var BSSGP_ConnHdlr vc_conn;
774 f_init();
775 f_sleep(1.0);
776 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
777 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +0200778 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +0100779 vc_conn.done;
780 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +0200781 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +0100782 vc_conn.done;
783}
784
Harald Welte04683d02018-02-16 22:43:45 +0100785/* Routing Area Update from Unknown TLLI -> REJECT */
786private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100787 var RoutingAreaIdentificationV old_ra := f_random_RAI();
788
Alexander Couzens0e510e62018-07-28 23:06:00 +0200789 BSSGP[0].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 +0100790 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200791 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
Harald Welte04683d02018-02-16 22:43:45 +0100792 setverdict(pass);
793 }
794 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200795 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +0100796 }
797}
798testcase TC_rau_unknown() runs on test_CT {
799 var BSSGP_ConnHdlr vc_conn;
800 f_init();
801 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200802 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +0100803 vc_conn.done;
804}
805
Harald Welte91636de2018-02-17 10:16:14 +0100806private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
807 var BssgpDecoded bd;
808
809 /* first perform regular attach */
810 f_TC_attach(id);
811
812 /* then send RAU */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200813 BSSGP[0].send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit));
Harald Welte91636de2018-02-17 10:16:14 +0100814 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200815 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
Harald Welte91636de2018-02-17 10:16:14 +0100816 f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept);
Alexander Couzens0e510e62018-07-28 23:06:00 +0200817 BSSGP[0].send(ts_GMM_RAU_COMPL);
Harald Welte91636de2018-02-17 10:16:14 +0100818 setverdict(pass);
819 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200820 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
Harald Welte91636de2018-02-17 10:16:14 +0100821 setverdict(fail, "Unexpected RAU Reject");
Daniel Willmannafce8662018-07-06 23:11:32 +0200822 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100823 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200824 [] BSSGP[0].receive { repeat; }
Harald Welte91636de2018-02-17 10:16:14 +0100825 }
826}
827testcase TC_attach_rau() runs on test_CT {
828 var BSSGP_ConnHdlr vc_conn;
829 f_init();
830 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200831 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +0100832 vc_conn.done;
833}
Harald Welte04683d02018-02-16 22:43:45 +0100834
Harald Welte6abb9fe2018-02-17 15:24:48 +0100835/* general GPRS DETACH helper */
836function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge) runs on BSSGP_ConnHdlr {
837 var BssgpDecoded bd;
838 timer T := 5.0;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200839 BSSGP[0].send(ts_GMM_DET_REQ_MO(detach_type, power_off));
Harald Welte6abb9fe2018-02-17 15:24:48 +0100840 if (expect_purge) {
841 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
842 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
843 }
844 T.start;
845 alt {
846 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
847 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +0200848 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100849 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200850 [power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100851 g_pars.ra := omit;
852 setverdict(fail, "Unexpected ATTACH ACCEPT in no-power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +0200853 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100854 /* TODO: check if any PDP contexts are deactivated on network side? */
855 }
856 [power_off] T.timeout {
857 setverdict(pass);
858 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200859 [not power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100860 g_pars.ra := omit;
861 setverdict(pass);
862 /* TODO: check if any PDP contexts are deactivated on network side? */
863 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200864 [] BSSGP[0].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +0100865 }
866}
867
868/* IMSI DETACH (non-power-off) for unknown TLLI */
869private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
870 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
871}
872testcase TC_detach_unknown_nopoweroff() runs on test_CT {
873 var BSSGP_ConnHdlr vc_conn;
874 f_init();
875 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200876 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100877 vc_conn.done;
878}
879
880/* IMSI DETACH (power-off) for unknown TLLI */
881private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
882 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
883}
884testcase TC_detach_unknown_poweroff() runs on test_CT {
885 var BSSGP_ConnHdlr vc_conn;
886 f_init();
887 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200888 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100889 vc_conn.done;
890}
891
892/* IMSI DETACH (non-power-off) for known TLLI */
893private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
894 /* first perform regular attach */
895 f_TC_attach(id);
896
897 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
898}
899testcase TC_detach_nopoweroff() runs on test_CT {
900 var BSSGP_ConnHdlr vc_conn;
901 f_init();
902 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200903 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100904 vc_conn.done;
905}
906
907/* IMSI DETACH (power-off) for known TLLI */
908private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
909 /* first perform regular attach */
910 f_TC_attach(id);
911
912 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
913}
914testcase TC_detach_poweroff() runs on test_CT {
915 var BSSGP_ConnHdlr vc_conn;
916 f_init();
917 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200918 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100919 vc_conn.done;
920}
921
Harald Welteeded9ad2018-02-17 20:57:34 +0100922type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +0100923 BIT3 tid, /* L3 Transaction ID */
924 BIT4 nsapi, /* SNDCP NSAPI */
925 BIT4 sapi, /* LLC SAPI */
926 QoSV qos, /* QoS parameters */
927 PDPAddressV addr, /* IP address */
928 octetstring apn optional, /* APN name */
929 ProtocolConfigOptionsV pco optional, /* protoco config opts */
930 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +0100931 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +0100932 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +0100933
Harald Welte822f9102018-02-18 20:39:06 +0100934 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
935 OCT4 ggsn_tei_u, /* GGSN TEI User */
936 octetstring ggsn_ip_c, /* GGSN IP Control */
937 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200938 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +0100939
Harald Welte822f9102018-02-18 20:39:06 +0100940 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
941 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
942 octetstring sgsn_ip_c optional, /* SGSN IP Control */
943 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +0100944};
945
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100946
947private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
948 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
949 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
950 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
951 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
952 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
953 f_gtp_register_teid(apars.ggsn_tei_c);
954 f_gtp_register_teid(apars.ggsn_tei_u);
955}
956
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200957function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false) runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100958 var boolean exp_rej := ispresent(apars.exp_rej_cause);
959 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200960 var template Recovery_gtpc recovery := omit;
961
962 if (send_recovery) {
963 recovery := ts_Recovery(apars.ggsn_restart_ctr);
964 }
Harald Welteeded9ad2018-02-17 20:57:34 +0100965
Alexander Couzens0e510e62018-07-28 23:06:00 +0200966 BSSGP[0].send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
Harald Welteeded9ad2018-02-17 20:57:34 +0100967 apars.apn, apars.pco));
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100968 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
969 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
970 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
971 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
972 apars.sgsn_tei_c, apars.gtp_resp_cause,
973 apars.ggsn_tei_c, apars.ggsn_tei_u,
974 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200975 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
976 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +0100977 }
978 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200979 [exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause))) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100980 setverdict(pass);
981 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200982 [exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100983 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +0200984 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +0100985 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200986 [not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100987 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +0200988 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +0100989 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200990 [not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi))) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100991 setverdict(pass);
992 }
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100993 [] as_xid(apars);
Harald Welteeded9ad2018-02-17 20:57:34 +0100994 }
995}
996
Harald Welte6f203162018-02-18 22:04:55 +0100997function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause) runs on BSSGP_ConnHdlr {
998 var boolean exp_rej := ispresent(apars.exp_rej_cause);
999 var Gtp1cUnitdata g_ud;
1000
Alexander Couzens0e510e62018-07-28 23:06:00 +02001001 BSSGP[0].send(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
Harald Welte6f203162018-02-18 22:04:55 +01001002 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1003 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001004 BSSGP[0].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001005 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1006 }
1007 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001008 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {
Harald Welte6f203162018-02-18 22:04:55 +01001009 setverdict(pass);
1010 }
1011 [] as_xid(apars);
1012 }
1013}
1014
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001015function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false) runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001016 var Gtp1cUnitdata g_ud;
1017 var integer seq_nr := 23;
1018 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1019
Alexander Couzens0e510e62018-07-28 23:06:00 +02001020 BSSGP[0].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001021 if (error_ind) {
1022 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1023 } else {
1024 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1025 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001026
1027 timer T := 5.0;
1028 T.start;
1029
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001030 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001031 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
1032 BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Harald Welte57b9b7f2018-02-18 22:28:13 +01001033 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001034 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1035 repeat;
1036 }
1037 [] T.timeout {
1038 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1039 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001040 }
1041}
1042
Harald Welte6f203162018-02-18 22:04:55 +01001043
Harald Welteeded9ad2018-02-17 20:57:34 +01001044/* Table 10.5.156/3GPP TS 24.008 */
1045template (value) QoSV t_QosDefault := {
1046 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1047 delayClass := '100'B, /* best effort */
1048 spare1 := '00'B,
1049 precedenceClass := '010'B, /* normal */
1050 spare2 := '0'B,
1051 peakThroughput := '0000'B, /* subscribed */
1052 meanThroughput := '00000'B, /* subscribed */
1053 spare3 := '000'B,
1054 deliverErroneusSDU := omit,
1055 deliveryOrder := omit,
1056 trafficClass := omit,
1057 maxSDUSize := omit,
1058 maxBitrateUplink := omit,
1059 maxBitrateDownlink := omit,
1060 sduErrorRatio := omit,
1061 residualBER := omit,
1062 trafficHandlingPriority := omit,
1063 transferDelay := omit,
1064 guaranteedBitRateUplink := omit,
1065 guaranteedBitRateDownlink := omit,
1066 sourceStatisticsDescriptor := omit,
1067 signallingIndication := omit,
1068 spare4 := omit,
1069 maxBitrateDownlinkExt := omit,
1070 guaranteedBitRateDownlinkExt := omit,
1071 maxBitrateUplinkExt := omit,
1072 guaranteedBitRateUplinkExt := omit,
1073 maxBitrateDownlinkExt2 := omit,
1074 guaranteedBitRateDownlinkExt2 := omit,
1075 maxBitrateUplinkExt2 := omit,
1076 guaranteedBitRateUplinkExt2 := omit
1077}
1078
1079/* 10.5.6.4 / 3GPP TS 24.008 */
1080template (value) PDPAddressV t_AddrIPv4dyn := {
1081 pdpTypeOrg := '0001'B, /* IETF */
1082 spare := '0000'B,
1083 pdpTypeNum := '21'O, /* IPv4 */
1084 addressInfo := omit
1085}
1086template (value) PDPAddressV t_AddrIPv6dyn := {
1087 pdpTypeOrg := '0001'B, /* IETF */
1088 spare := '0000'B,
1089 pdpTypeNum := '53'O, /* IPv6 */
1090 addressInfo := omit
1091}
1092
Harald Welte37692d82018-02-18 15:21:34 +01001093template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001094 tid := '000'B,
1095 nsapi := '0101'B, /* < 5 are reserved */
1096 sapi := '0011'B, /* 3/5/9/11 */
1097 qos := t_QosDefault,
1098 addr := t_AddrIPv4dyn,
1099 apn := omit,
1100 pco := omit,
1101 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001102 gtp_resp_cause := int2oct(128, 1),
1103 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001104
1105 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001106 ggsn_tei_c := f_rnd_octstring(4),
1107 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001108 ggsn_ip_c := f_inet_addr(ggsn_ip),
1109 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001110 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001111
Harald Welteeded9ad2018-02-17 20:57:34 +01001112 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001113 sgsn_tei_u := omit,
1114 sgsn_ip_c := omit,
1115 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001116}
1117
Harald Welte37692d82018-02-18 15:21:34 +01001118template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1119 connId := 1,
1120 remName := f_inet_ntoa(ip),
1121 remPort := GTP1U_PORT
1122}
1123
1124template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1125 connId := 1,
1126 remName := f_inet_ntoa(ip),
1127 remPort := GTP1C_PORT
1128}
1129
1130private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1131 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1132 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1133}
1134
1135private altstep as_xid(PdpActPars apars) runs on BSSGP_ConnHdlr {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001136 [] BSSGP[0].receive(tr_BD_LLC(tr_LLC_XID(?, apars.sapi))) {
Harald Welte37692d82018-02-18 15:21:34 +01001137 repeat;
1138 }
1139}
1140
1141template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1142 pDU_SN_UNITDATA := {
1143 nsapi := nsapi,
1144 moreBit := ?,
1145 snPduType := '1'B,
1146 firstSegmentIndicator := ?,
1147 spareBit := ?,
1148 pcomp := ?,
1149 dcomp := ?,
1150 npduNumber := ?,
1151 segmentNumber := ?,
1152 npduNumberContinued := ?,
1153 dataSegmentSnUnitdataPdu := payload
1154 }
1155}
1156
1157/* simple case: single segment, no compression */
1158template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1159 pDU_SN_UNITDATA := {
1160 nsapi := nsapi,
1161 moreBit := '0'B,
1162 snPduType := '1'B,
1163 firstSegmentIndicator := '1'B,
1164 spareBit := '0'B,
1165 pcomp := '0000'B,
1166 dcomp := '0000'B,
1167 npduNumber := '0000'B,
1168 segmentNumber := '0000'B,
1169 npduNumberContinued := '00'O,
1170 dataSegmentSnUnitdataPdu := payload
1171 }
1172}
1173
1174/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
1175private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1176 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1177 f_gtpu_send(apars, payload);
1178 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1179 alt {
1180 [] as_xid(apars);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001181 [] BSSGP[0].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
Harald Welte37692d82018-02-18 15:21:34 +01001182 }
1183}
1184
Pau Espin Pedrol8be4d192018-07-18 13:43:44 +02001185/* Transceive given 'payload' as MT message from Gb -> OsmoSGSN -> GTP */
Harald Welte37692d82018-02-18 15:21:34 +01001186private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1187 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1188 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1189 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001190 BSSGP[0].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
Harald Welte37692d82018-02-18 15:21:34 +01001191 /* Expect PDU via GTP from SGSN on simulated GGSN */
1192 alt {
1193 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1194 }
1195}
1196
Harald Welteeded9ad2018-02-17 20:57:34 +01001197private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001198 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001199
1200 /* first perform regular attach */
1201 f_TC_attach(id);
1202
1203 f_pdp_ctx_act(apars);
1204}
1205testcase TC_attach_pdp_act() runs on test_CT {
1206 var BSSGP_ConnHdlr vc_conn;
1207 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001208 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001209 vc_conn.done;
1210}
Harald Welteb2124b22018-02-16 22:26:56 +01001211
Harald Welte835b15f2018-02-18 14:39:11 +01001212/* PDP Context activation for not-attached subscriber; expect fail */
1213private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001214 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001215 BSSGP[0].send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
Harald Welte835b15f2018-02-18 14:39:11 +01001216 apars.apn, apars.pco));
1217 alt {
1218 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001219 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001220 setverdict(pass);
1221 }
1222 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1223 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001224 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001225 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001226 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001227 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001228 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001229 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001230 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001231 }
1232}
1233testcase TC_pdp_act_unattached() runs on test_CT {
1234 var BSSGP_ConnHdlr vc_conn;
1235 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001236 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001237 vc_conn.done;
1238}
1239
Harald Welte37692d82018-02-18 15:21:34 +01001240/* ATTACH + PDP CTX ACT + user plane traffic */
1241private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1242 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1243
1244 /* first perform regular attach */
1245 f_TC_attach(id);
1246 /* then activate PDP context */
1247 f_pdp_ctx_act(apars);
1248 /* then transceive a downlink PDU */
1249 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1250 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1251}
1252testcase TC_attach_pdp_act_user() runs on test_CT {
1253 var BSSGP_ConnHdlr vc_conn;
1254 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001255 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001256 vc_conn.done;
1257}
1258
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001259/* ATTACH + PDP CTX ACT; reject from GGSN */
1260private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1261 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1262
1263 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1264 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1265
1266 /* first perform regular attach */
1267 f_TC_attach(id);
1268 /* then activate PDP context */
1269 f_pdp_ctx_act(apars);
1270}
1271testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1272 var BSSGP_ConnHdlr vc_conn;
1273 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001274 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001275 vc_conn.done;
1276}
Harald Welte835b15f2018-02-18 14:39:11 +01001277
Harald Welte6f203162018-02-18 22:04:55 +01001278/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1279private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1280 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1281
1282 /* first perform regular attach */
1283 f_TC_attach(id);
1284 /* then activate PDP context */
1285 f_pdp_ctx_act(apars);
1286 /* then transceive a downlink PDU */
1287 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1288 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1289
1290 f_pdp_ctx_deact_mo(apars, '00'O);
1291}
1292testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1293 var BSSGP_ConnHdlr vc_conn;
1294 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001295 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user_deact_mo), testcasename(), g_gb, 21);
Harald Welte6f203162018-02-18 22:04:55 +01001296 vc_conn.done;
1297}
1298
Harald Welte57b9b7f2018-02-18 22:28:13 +01001299/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1300private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1301 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1302
1303 /* first perform regular attach */
1304 f_TC_attach(id);
1305 /* then activate PDP context */
1306 f_pdp_ctx_act(apars);
1307 /* then transceive a downlink PDU */
1308 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1309 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1310
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001311 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001312}
1313testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1314 var BSSGP_ConnHdlr vc_conn;
1315 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001316 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user_deact_mt), testcasename(), g_gb, 22);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001317 vc_conn.done;
1318}
1319
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001320/* ATTACH + ATTACH (2nd) */
1321private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1322 g_pars.t_guard := 5.0;
1323
1324 /* first perform regular attach */
1325 f_TC_attach(id);
1326
1327 /* second to perform regular attach */
1328 f_TC_attach(id);
1329}
1330
1331
1332testcase TC_attach_second_attempt() runs on test_CT {
1333 var BSSGP_ConnHdlr vc_conn;
1334 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001335 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001336 vc_conn.done;
1337}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001338
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001339private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001340 var Gtp1cUnitdata g_ud;
1341 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1342
1343 /* first perform regular attach */
1344 f_TC_attach(id);
1345 /* Activate a pdp context against the GGSN */
1346 f_pdp_ctx_act(apars);
1347 /* Wait to receive first echo request and send initial Restart counter */
1348 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1349 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1350 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1351 }
1352 /* Wait to receive second echo request and send incremented Restart
1353 counter. This will fake a restarted GGSN, and pdp ctx allocated
1354 should be released by SGSN */
1355 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1356 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1357 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1358 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1359 }
1360 var OCT1 cause_network_failure := int2oct(38, 1)
1361 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001362 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true))) {
1363 BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001364 setverdict(pass);
1365 }
1366 [] as_xid(apars);
1367 }
1368 setverdict(pass);
1369}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001370/* ATTACH + trigger Recovery procedure through EchoResp */
1371testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001372 var BSSGP_ConnHdlr vc_conn;
1373 g_use_echo := true
1374 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001375 vc_conn := f_start_handler(refers(f_TC_attach_restart_ctr_echo), testcasename(), g_gb, 23, 30.0);
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001376 vc_conn.done;
1377 g_use_echo := false
1378}
1379
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001380private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1381 var Gtp1cUnitdata g_ud;
1382 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1383 var integer seq_nr := 23;
1384 var GtpPeer peer;
1385 /* first perform regular attach */
1386 f_TC_attach(id);
1387
1388 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1389 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1390 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1391 f_pdp_ctx_act(apars, true);
1392
1393 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1394/* received. */
1395 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1396
1397 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1398 would be great to have an active pdp context here before triggering
1399 Recovery, and making sure the the DEACT request is sent by the SGSN.
1400 */
1401
1402 /* Activate a pdp context against the GGSN, send incremented Recovery
1403 IE. This should trigger the recovery path, but still this specific
1404 CTX activation should work. */
1405 apars.exp_rej_cause := omit; /* default value for tests */
1406 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
1407 f_pdp_ctx_act(apars, true);
1408
1409 setverdict(pass);
1410}
1411/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1412testcase TC_attach_restart_ctr_create() runs on test_CT {
1413 var BSSGP_ConnHdlr vc_conn;
1414 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001415 vc_conn := f_start_handler(refers(f_TC_attach_restart_ctr_create), testcasename(), g_gb, 24, 30.0);
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001416 vc_conn.done;
1417}
1418
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001419/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
1420private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
1421 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1422 var integer seq_nr := 23;
1423 var GtpPeer peer;
1424 var integer i;
1425
1426 /* first perform regular attach */
1427 f_TC_attach(id);
1428 /* then activate PDP context */
1429 f_pdp_ctx_act(apars);
1430
Alexander Couzens0e510e62018-07-28 23:06:00 +02001431 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001432 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1433 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1434
1435 for (i := 0; i < 5; i := i+1) {
1436 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001437 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001438 [] as_xid(apars);
1439 }
1440 }
1441
1442 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
1443
Alexander Couzens0e510e62018-07-28 23:06:00 +02001444 BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001445 setverdict(pass);
1446}
1447testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
1448 var BSSGP_ConnHdlr vc_conn;
1449 f_init();
1450 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001451 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_mt_t3395_expire), testcasename(), g_gb, 25, 60.0);
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001452 vc_conn.done;
1453}
1454
Alexander Couzens5e307b42018-05-22 18:12:20 +02001455private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
1456 /* MS: perform regular attach */
1457 f_TC_attach(id);
1458
1459 /* HLR: cancel the location request */
1460 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
1461 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02001462
1463 /* ensure no Detach Request got received */
1464 timer T := 5.0;
1465 T.start;
1466 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001467 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(*, *, *))) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001468 T.stop;
1469 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02001470 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001471 }
1472 [] T.timeout {
1473 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02001474 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001475 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001476 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001477 repeat;
1478 }
1479 }
1480}
1481
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001482/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
1483private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
1484 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1485
1486 /* first perform regular attach */
1487 f_TC_attach(id);
1488 /* then activate PDP context */
1489 f_pdp_ctx_act(apars);
1490 /* then transceive a downlink PDU */
1491 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1492
1493 /* Send Error indication as response from upload PDU and expect deact towards MS */
1494 f_pdp_ctx_deact_mt(apars, true);
1495}
1496testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
1497 var BSSGP_ConnHdlr vc_conn;
1498 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001499 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user_error_ind_ggsn), testcasename(), g_gb, 26);
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001500 vc_conn.done;
1501}
1502
Alexander Couzens5e307b42018-05-22 18:12:20 +02001503testcase TC_hlr_location_cancel_request_update() runs on test_CT {
1504 /* MS <-> SGSN: GMM Attach
1505 * HLR -> SGSN: Cancel Location Request
1506 * HLR <- SGSN: Cancel Location Ack
1507 */
1508 var BSSGP_ConnHdlr vc_conn;
1509 f_init();
1510 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001511 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02001512 vc_conn.done;
1513}
1514
1515
Alexander Couzensc87967a2018-05-22 16:09:54 +02001516private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
1517 /* MS: perform regular attach */
1518 f_TC_attach(id);
1519
1520 /* HLR: cancel the location request */
1521 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
1522 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
1523 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
1524
1525 /* MS: receive a Detach Request */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001526 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?)));
1527 BSSGP[0].send(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001528
1529 setverdict(pass);
1530}
1531
1532testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
1533 /* MS <-> SGSN: GMM Attach
1534 * HLR -> SGSN: Cancel Location Request
1535 * HLR <- SGSN: Cancel Location Ack
1536 * MS <- SGSN: Detach Request
1537 * SGSN-> MS: Detach Complete
1538 */
1539 var BSSGP_ConnHdlr vc_conn;
1540 f_init();
1541 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001542 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001543 vc_conn.done;
1544}
1545
1546
Alexander Couzens6c47f292018-05-22 17:09:49 +02001547private function f_hlr_location_cancel_request_unknown_subscriber(
1548 charstring id,
1549 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
1550
1551 /* HLR: cancel the location request */
1552 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
1553
1554 /* cause 2 = IMSI_UNKNOWN */
1555 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
1556
1557 setverdict(pass);
1558}
1559
1560private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001561 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001562}
1563
1564testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
1565 /* HLR -> SGSN: Cancel Location Request
1566 * HLR <- SGSN: Cancel Location Error
1567 */
1568
1569 var BSSGP_ConnHdlr vc_conn;
1570 f_init();
1571 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001572 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw), testcasename(), g_gb, 30);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001573 vc_conn.done;
1574}
1575
1576private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001577 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001578}
1579
1580testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
1581 /* HLR -> SGSN: Cancel Location Request
1582 * HLR <- SGSN: Cancel Location Error
1583 */
1584
1585 var BSSGP_ConnHdlr vc_conn;
1586 f_init();
1587 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001588 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_unknown_subscriber_update), testcasename(), g_gb, 30);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001589 vc_conn.done;
1590}
1591
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001592private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
1593 f_TC_attach(id);
1594 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1595}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001596
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001597testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
1598 /* MS <-> SGSN: Attach
1599 * MS -> SGSN: Detach Req (Power off)
1600 * VTY -> SGSN: Check if MS is NOT in subscriber cache
1601 */
1602 var BSSGP_ConnHdlr vc_conn;
1603 var integer id := 33;
1604 var charstring imsi := hex2str(f_gen_imsi(id));
1605
1606 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001607 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001608 vc_conn.done;
1609
1610 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1611}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001612
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001613/* Attempt an attach, but loose the Identification Request (IMEI) */
1614private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
1615 var integer count_req := 0;
1616 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1617
Alexander Couzens0e510e62018-07-28 23:06:00 +02001618 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001619
1620 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001621 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001622 /* break */
1623 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001624 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001625 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001626 BSSGP[0].send(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001627 repeat;
1628 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001629 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001630 /* ignore ID REQ IMEI */
1631 count_req := count_req + 1;
1632 repeat;
1633 }
1634 }
1635 if (count_req != 5) {
1636 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001637 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001638 }
1639 setverdict(pass);
1640}
1641
1642testcase TC_attach_no_imei_response() runs on test_CT {
1643 /* MS -> SGSN: Attach Request IMSI
1644 * MS <- SGSN: Identity Request IMSI (optional)
1645 * MS -> SGSN: Identity Response IMSI (optional)
1646 * MS <- SGSN: Identity Request IMEI
1647 * MS -x SGSN: no response
1648 * MS <- SGSN: re-send: Identity Request IMEI 4x
1649 * MS <- SGSN: Attach Reject
1650 */
1651 var BSSGP_ConnHdlr vc_conn;
1652 f_init();
1653 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001654 vc_conn := f_start_handler(refers(f_TC_attach_no_imei_response), testcasename(), g_gb, 32, 60.0);
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001655 vc_conn.done;
1656}
1657
Alexander Couzens53f20562018-06-12 16:24:12 +02001658/* Attempt an attach, but loose the Identification Request (IMSI) */
1659private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
1660 var integer count_req := 0;
1661 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1662
1663 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
1664 g_pars.p_tmsi := 'c0000035'O;
1665
Alexander Couzens0e510e62018-07-28 23:06:00 +02001666 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens53f20562018-06-12 16:24:12 +02001667
1668 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001669 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001670 /* break */
1671 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001672 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001673 /* ignore ID REQ IMSI */
1674 count_req := count_req + 1;
1675 repeat;
1676 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001677 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001678 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001679 BSSGP[0].send(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02001680 repeat;
1681 }
1682 }
1683 if (count_req != 5) {
1684 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001685 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02001686 }
1687 setverdict(pass);
1688}
1689
1690testcase TC_attach_no_imsi_response() runs on test_CT {
1691 /* MS -> SGSN: Attach Request TMSI (unknown)
1692 * MS <- SGSN: Identity Request IMEI (optional)
1693 * MS -> SGSN: Identity Response IMEI (optional)
1694 * MS <- SGSN: Identity Request IMSI
1695 * MS -x SGSN: no response
1696 * MS <- SGSN: re-send: Identity Request IMSI 4x
1697 * MS <- SGSN: Attach Reject
1698 */
1699 var BSSGP_ConnHdlr vc_conn;
1700 f_init();
1701 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001702 vc_conn := f_start_handler(refers(f_TC_attach_no_imsi_response), testcasename(), g_gb, 35, 60.0);
Alexander Couzens53f20562018-06-12 16:24:12 +02001703 vc_conn.done;
1704}
1705
Alexander Couzenscf818962018-06-05 18:00:00 +02001706private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
1707 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
1708}
1709
1710testcase TC_attach_check_subscriber_list() runs on test_CT {
1711 /* MS <-> SGSN: Attach
1712 * VTY -> SGSN: Check if MS is in subscriber cache
1713 */
1714 var BSSGP_ConnHdlr vc_conn;
1715 var integer id := 34;
1716 var charstring imsi := hex2str(f_gen_imsi(id));
1717
1718 f_init();
1719 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001720 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02001721 vc_conn.done;
1722
1723 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1724 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
1725}
1726
Alexander Couzensf9858652018-06-07 16:14:53 +02001727private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
1728 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1729 var BssgpDecoded bd;
1730
1731 /* unregister the old IMSI */
1732 f_bssgp_client_unregister(g_pars.imsi);
1733 /* Simulate a foreign IMSI */
1734 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +02001735 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Alexander Couzensf9858652018-06-07 16:14:53 +02001736
1737 /* there is no auth */
1738 g_pars.net.expect_auth := false;
1739
Alexander Couzens0e510e62018-07-28 23:06:00 +02001740 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02001741 f_gmm_auth();
1742 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001743 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzensf9858652018-06-07 16:14:53 +02001744 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001745 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02001746 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001747 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
Alexander Couzensf9858652018-06-07 16:14:53 +02001748 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001749 BSSGP[0].send(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02001750 setverdict(pass);
1751 }
1752 }
1753}
1754testcase TC_attach_closed_add_vty() runs on test_CT {
1755 /* VTY-> SGSN: policy close
1756 * MS -> SGSN: Attach Request
1757 * MS <- SGSN: Identity Request IMSI
1758 * MS -> SGSN: Identity Response IMSI
1759 * MS <- SGSN: Attach Reject
1760 * VTY-> SGSN: policy imsi-acl add IMSI
1761 * MS -> SGSN: Attach Request
1762 * MS <- SGSN: Identity Request IMSI
1763 * MS -> SGSN: Identity Response IMSI
1764 * MS <- SGSN: Identity Request IMEI
1765 * MS -> SGSN: Identity Response IMEI
1766 * MS <- SGSN: Attach Accept
1767 */
1768 var BSSGP_ConnHdlr vc_conn;
1769 f_init();
1770 f_sleep(1.0);
1771 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1772 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
1773 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001774 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02001775 vc_conn.done;
1776 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456789");
1777 /* test with same IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001778 vc_conn := f_start_handler(refers(f_TC_attach_closed_imsi_added), testcasename(), g_gb, 10);
Alexander Couzensf9858652018-06-07 16:14:53 +02001779 vc_conn.done;
1780}
1781
Alexander Couzens0085bd72018-06-12 19:08:44 +02001782/* Attempt an attach, but never answer a Attach Complete */
1783private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
1784 var integer count_req := 0;
1785
Alexander Couzens0e510e62018-07-28 23:06:00 +02001786 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens0085bd72018-06-12 19:08:44 +02001787 f_gmm_auth();
1788
1789 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001790 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001791 /* break */
1792 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001793 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001794 /* ignore */
1795 count_req := count_req + 1;
1796 repeat;
1797 }
1798 }
1799 if (count_req != 5) {
1800 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02001801 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02001802 }
1803 setverdict(pass);
1804}
1805
1806testcase TC_attach_check_complete_resend() runs on test_CT {
1807 /* MS -> SGSN: Attach Request IMSI
1808 * MS <- SGSN: Identity Request *
1809 * MS -> SGSN: Identity Response *
1810 * MS <- SGSN: Attach Complete 5x
1811 */
1812 var BSSGP_ConnHdlr vc_conn;
1813 f_init();
1814 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001815 vc_conn := f_start_handler(refers(f_TC_attach_check_complete_resend), testcasename(), g_gb, 36, 60.0);
Alexander Couzens0085bd72018-06-12 19:08:44 +02001816 vc_conn.done;
1817}
1818
Harald Welte5ac31492018-02-15 20:39:13 +01001819control {
Harald Welte5b7c8122018-02-16 21:48:17 +01001820 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01001821 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001822 execute( TC_attach_umts_aka_umts_res() );
1823 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001824 execute( TC_attach_auth_id_timeout() );
1825 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01001826 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001827 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01001828 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01001829 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01001830 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01001831 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001832 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02001833 execute( TC_attach_no_imsi_response() );
Alexander Couzensf9858652018-06-07 16:14:53 +02001834 execute( TC_attach_closed_add_vty(), 10.0 );
Alexander Couzenscf818962018-06-05 18:00:00 +02001835 execute( TC_attach_check_subscriber_list(), 10.0 );
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001836 execute( TC_attach_detach_check_subscriber_list(), 10.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02001837 execute( TC_attach_check_complete_resend() );
Alexander Couzens5e307b42018-05-22 18:12:20 +02001838 execute( TC_hlr_location_cancel_request_update(), 10.0 );
Alexander Couzens234c5882018-05-29 15:48:44 +02001839 execute( TC_hlr_location_cancel_request_withdraw(), 10.0 );
1840 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 10.0 );
1841 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 10.0 );
Harald Welte04683d02018-02-16 22:43:45 +01001842 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01001843 execute( TC_attach_rau() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01001844 execute( TC_detach_unknown_nopoweroff() );
1845 execute( TC_detach_unknown_poweroff() );
1846 execute( TC_detach_nopoweroff() );
1847 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01001848 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01001849 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01001850 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001851 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01001852 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01001853 execute( TC_attach_pdp_act_user_deact_mt() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001854 execute( TC_attach_second_attempt() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001855 execute( TC_attach_restart_ctr_echo() );
1856 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001857 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001858 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Harald Welte5ac31492018-02-15 20:39:13 +01001859}
Harald Welte96a33b02018-02-04 10:36:22 +01001860
1861
1862
1863}