blob: 336f38ec2f06946f587239ac8386517e4392df20 [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
Alexander Couzens5dce90d2018-07-31 03:16:37 +0200812 f_routing_area_update(g_pars.ra);
813
Harald Welte91636de2018-02-17 10:16:14 +0100814}
815testcase TC_attach_rau() runs on test_CT {
816 var BSSGP_ConnHdlr vc_conn;
817 f_init();
818 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200819 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +0100820 vc_conn.done;
821}
Harald Welte04683d02018-02-16 22:43:45 +0100822
Harald Welte6abb9fe2018-02-17 15:24:48 +0100823/* general GPRS DETACH helper */
824function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge) runs on BSSGP_ConnHdlr {
825 var BssgpDecoded bd;
826 timer T := 5.0;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200827 BSSGP[0].send(ts_GMM_DET_REQ_MO(detach_type, power_off));
Harald Welte6abb9fe2018-02-17 15:24:48 +0100828 if (expect_purge) {
829 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
830 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
831 }
832 T.start;
833 alt {
834 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
835 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +0200836 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100837 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200838 [power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100839 g_pars.ra := omit;
840 setverdict(fail, "Unexpected ATTACH ACCEPT in no-power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +0200841 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100842 /* TODO: check if any PDP contexts are deactivated on network side? */
843 }
844 [power_off] T.timeout {
845 setverdict(pass);
846 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200847 [not power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100848 g_pars.ra := omit;
849 setverdict(pass);
850 /* TODO: check if any PDP contexts are deactivated on network side? */
851 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200852 [] BSSGP[0].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +0100853 }
854}
855
856/* IMSI DETACH (non-power-off) for unknown TLLI */
857private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
858 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
859}
860testcase TC_detach_unknown_nopoweroff() runs on test_CT {
861 var BSSGP_ConnHdlr vc_conn;
862 f_init();
863 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200864 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100865 vc_conn.done;
866}
867
868/* IMSI DETACH (power-off) for unknown TLLI */
869private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
870 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
871}
872testcase TC_detach_unknown_poweroff() 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_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100877 vc_conn.done;
878}
879
880/* IMSI DETACH (non-power-off) for known TLLI */
881private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
882 /* first perform regular attach */
883 f_TC_attach(id);
884
885 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
886}
887testcase TC_detach_nopoweroff() runs on test_CT {
888 var BSSGP_ConnHdlr vc_conn;
889 f_init();
890 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200891 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100892 vc_conn.done;
893}
894
895/* IMSI DETACH (power-off) for known TLLI */
896private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
897 /* first perform regular attach */
898 f_TC_attach(id);
899
900 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
901}
902testcase TC_detach_poweroff() runs on test_CT {
903 var BSSGP_ConnHdlr vc_conn;
904 f_init();
905 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200906 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100907 vc_conn.done;
908}
909
Harald Welteeded9ad2018-02-17 20:57:34 +0100910type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +0100911 BIT3 tid, /* L3 Transaction ID */
912 BIT4 nsapi, /* SNDCP NSAPI */
913 BIT4 sapi, /* LLC SAPI */
914 QoSV qos, /* QoS parameters */
915 PDPAddressV addr, /* IP address */
916 octetstring apn optional, /* APN name */
917 ProtocolConfigOptionsV pco optional, /* protoco config opts */
918 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +0100919 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +0100920 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +0100921
Harald Welte822f9102018-02-18 20:39:06 +0100922 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
923 OCT4 ggsn_tei_u, /* GGSN TEI User */
924 octetstring ggsn_ip_c, /* GGSN IP Control */
925 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200926 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +0100927
Harald Welte822f9102018-02-18 20:39:06 +0100928 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
929 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
930 octetstring sgsn_ip_c optional, /* SGSN IP Control */
931 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +0100932};
933
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100934
935private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
936 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
937 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
938 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
939 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
940 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
941 f_gtp_register_teid(apars.ggsn_tei_c);
942 f_gtp_register_teid(apars.ggsn_tei_u);
943}
944
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200945function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false) runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100946 var boolean exp_rej := ispresent(apars.exp_rej_cause);
947 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200948 var template Recovery_gtpc recovery := omit;
949
950 if (send_recovery) {
951 recovery := ts_Recovery(apars.ggsn_restart_ctr);
952 }
Harald Welteeded9ad2018-02-17 20:57:34 +0100953
Alexander Couzens0e510e62018-07-28 23:06:00 +0200954 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 +0100955 apars.apn, apars.pco));
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100956 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
957 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
958 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
959 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
960 apars.sgsn_tei_c, apars.gtp_resp_cause,
961 apars.ggsn_tei_c, apars.ggsn_tei_u,
962 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200963 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
964 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +0100965 }
966 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200967 [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 +0100968 setverdict(pass);
969 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200970 [exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100971 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +0200972 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +0100973 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200974 [not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100975 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +0200976 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +0100977 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200978 [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 +0100979 setverdict(pass);
980 }
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100981 [] as_xid(apars);
Harald Welteeded9ad2018-02-17 20:57:34 +0100982 }
983}
984
Harald Welte6f203162018-02-18 22:04:55 +0100985function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause) runs on BSSGP_ConnHdlr {
986 var boolean exp_rej := ispresent(apars.exp_rej_cause);
987 var Gtp1cUnitdata g_ud;
988
Alexander Couzens0e510e62018-07-28 23:06:00 +0200989 BSSGP[0].send(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
Harald Welte6f203162018-02-18 22:04:55 +0100990 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
991 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzens0e510e62018-07-28 23:06:00 +0200992 BSSGP[0].clear;
Harald Welte6f203162018-02-18 22:04:55 +0100993 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
994 }
995 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200996 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {
Harald Welte6f203162018-02-18 22:04:55 +0100997 setverdict(pass);
998 }
999 [] as_xid(apars);
1000 }
1001}
1002
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001003function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false) runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001004 var Gtp1cUnitdata g_ud;
1005 var integer seq_nr := 23;
1006 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1007
Alexander Couzens0e510e62018-07-28 23:06:00 +02001008 BSSGP[0].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001009 if (error_ind) {
1010 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1011 } else {
1012 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1013 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001014
1015 timer T := 5.0;
1016 T.start;
1017
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001018 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001019 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
1020 BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Harald Welte57b9b7f2018-02-18 22:28:13 +01001021 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001022 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1023 repeat;
1024 }
1025 [] T.timeout {
1026 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1027 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001028 }
1029}
1030
Harald Welte6f203162018-02-18 22:04:55 +01001031
Harald Welteeded9ad2018-02-17 20:57:34 +01001032/* Table 10.5.156/3GPP TS 24.008 */
1033template (value) QoSV t_QosDefault := {
1034 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1035 delayClass := '100'B, /* best effort */
1036 spare1 := '00'B,
1037 precedenceClass := '010'B, /* normal */
1038 spare2 := '0'B,
1039 peakThroughput := '0000'B, /* subscribed */
1040 meanThroughput := '00000'B, /* subscribed */
1041 spare3 := '000'B,
1042 deliverErroneusSDU := omit,
1043 deliveryOrder := omit,
1044 trafficClass := omit,
1045 maxSDUSize := omit,
1046 maxBitrateUplink := omit,
1047 maxBitrateDownlink := omit,
1048 sduErrorRatio := omit,
1049 residualBER := omit,
1050 trafficHandlingPriority := omit,
1051 transferDelay := omit,
1052 guaranteedBitRateUplink := omit,
1053 guaranteedBitRateDownlink := omit,
1054 sourceStatisticsDescriptor := omit,
1055 signallingIndication := omit,
1056 spare4 := omit,
1057 maxBitrateDownlinkExt := omit,
1058 guaranteedBitRateDownlinkExt := omit,
1059 maxBitrateUplinkExt := omit,
1060 guaranteedBitRateUplinkExt := omit,
1061 maxBitrateDownlinkExt2 := omit,
1062 guaranteedBitRateDownlinkExt2 := omit,
1063 maxBitrateUplinkExt2 := omit,
1064 guaranteedBitRateUplinkExt2 := omit
1065}
1066
1067/* 10.5.6.4 / 3GPP TS 24.008 */
1068template (value) PDPAddressV t_AddrIPv4dyn := {
1069 pdpTypeOrg := '0001'B, /* IETF */
1070 spare := '0000'B,
1071 pdpTypeNum := '21'O, /* IPv4 */
1072 addressInfo := omit
1073}
1074template (value) PDPAddressV t_AddrIPv6dyn := {
1075 pdpTypeOrg := '0001'B, /* IETF */
1076 spare := '0000'B,
1077 pdpTypeNum := '53'O, /* IPv6 */
1078 addressInfo := omit
1079}
1080
Harald Welte37692d82018-02-18 15:21:34 +01001081template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001082 tid := '000'B,
1083 nsapi := '0101'B, /* < 5 are reserved */
1084 sapi := '0011'B, /* 3/5/9/11 */
1085 qos := t_QosDefault,
1086 addr := t_AddrIPv4dyn,
1087 apn := omit,
1088 pco := omit,
1089 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001090 gtp_resp_cause := int2oct(128, 1),
1091 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001092
1093 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001094 ggsn_tei_c := f_rnd_octstring(4),
1095 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001096 ggsn_ip_c := f_inet_addr(ggsn_ip),
1097 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001098 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001099
Harald Welteeded9ad2018-02-17 20:57:34 +01001100 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001101 sgsn_tei_u := omit,
1102 sgsn_ip_c := omit,
1103 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001104}
1105
Harald Welte37692d82018-02-18 15:21:34 +01001106template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1107 connId := 1,
1108 remName := f_inet_ntoa(ip),
1109 remPort := GTP1U_PORT
1110}
1111
1112template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1113 connId := 1,
1114 remName := f_inet_ntoa(ip),
1115 remPort := GTP1C_PORT
1116}
1117
1118private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1119 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1120 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1121}
1122
1123private altstep as_xid(PdpActPars apars) runs on BSSGP_ConnHdlr {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001124 [] BSSGP[0].receive(tr_BD_LLC(tr_LLC_XID(?, apars.sapi))) {
Harald Welte37692d82018-02-18 15:21:34 +01001125 repeat;
1126 }
1127}
1128
1129template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1130 pDU_SN_UNITDATA := {
1131 nsapi := nsapi,
1132 moreBit := ?,
1133 snPduType := '1'B,
1134 firstSegmentIndicator := ?,
1135 spareBit := ?,
1136 pcomp := ?,
1137 dcomp := ?,
1138 npduNumber := ?,
1139 segmentNumber := ?,
1140 npduNumberContinued := ?,
1141 dataSegmentSnUnitdataPdu := payload
1142 }
1143}
1144
1145/* simple case: single segment, no compression */
1146template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1147 pDU_SN_UNITDATA := {
1148 nsapi := nsapi,
1149 moreBit := '0'B,
1150 snPduType := '1'B,
1151 firstSegmentIndicator := '1'B,
1152 spareBit := '0'B,
1153 pcomp := '0000'B,
1154 dcomp := '0000'B,
1155 npduNumber := '0000'B,
1156 segmentNumber := '0000'B,
1157 npduNumberContinued := '00'O,
1158 dataSegmentSnUnitdataPdu := payload
1159 }
1160}
1161
1162/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
1163private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1164 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1165 f_gtpu_send(apars, payload);
1166 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1167 alt {
1168 [] as_xid(apars);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001169 [] BSSGP[0].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
Harald Welte37692d82018-02-18 15:21:34 +01001170 }
1171}
1172
Pau Espin Pedrol8be4d192018-07-18 13:43:44 +02001173/* Transceive given 'payload' as MT message from Gb -> OsmoSGSN -> GTP */
Harald Welte37692d82018-02-18 15:21:34 +01001174private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1175 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1176 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1177 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001178 BSSGP[0].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
Harald Welte37692d82018-02-18 15:21:34 +01001179 /* Expect PDU via GTP from SGSN on simulated GGSN */
1180 alt {
1181 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1182 }
1183}
1184
Harald Welteeded9ad2018-02-17 20:57:34 +01001185private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001186 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001187
1188 /* first perform regular attach */
1189 f_TC_attach(id);
1190
1191 f_pdp_ctx_act(apars);
1192}
1193testcase TC_attach_pdp_act() runs on test_CT {
1194 var BSSGP_ConnHdlr vc_conn;
1195 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001196 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001197 vc_conn.done;
1198}
Harald Welteb2124b22018-02-16 22:26:56 +01001199
Harald Welte835b15f2018-02-18 14:39:11 +01001200/* PDP Context activation for not-attached subscriber; expect fail */
1201private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001202 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001203 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 +01001204 apars.apn, apars.pco));
1205 alt {
1206 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001207 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001208 setverdict(pass);
1209 }
1210 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1211 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001212 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001213 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001214 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001215 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001216 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001217 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001218 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001219 }
1220}
1221testcase TC_pdp_act_unattached() runs on test_CT {
1222 var BSSGP_ConnHdlr vc_conn;
1223 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001224 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001225 vc_conn.done;
1226}
1227
Harald Welte37692d82018-02-18 15:21:34 +01001228/* ATTACH + PDP CTX ACT + user plane traffic */
1229private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1230 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1231
1232 /* first perform regular attach */
1233 f_TC_attach(id);
1234 /* then activate PDP context */
1235 f_pdp_ctx_act(apars);
1236 /* then transceive a downlink PDU */
1237 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1238 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1239}
1240testcase TC_attach_pdp_act_user() runs on test_CT {
1241 var BSSGP_ConnHdlr vc_conn;
1242 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001243 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001244 vc_conn.done;
1245}
1246
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001247/* ATTACH + PDP CTX ACT; reject from GGSN */
1248private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1249 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1250
1251 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1252 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1253
1254 /* first perform regular attach */
1255 f_TC_attach(id);
1256 /* then activate PDP context */
1257 f_pdp_ctx_act(apars);
1258}
1259testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1260 var BSSGP_ConnHdlr vc_conn;
1261 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001262 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001263 vc_conn.done;
1264}
Harald Welte835b15f2018-02-18 14:39:11 +01001265
Harald Welte6f203162018-02-18 22:04:55 +01001266/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1267private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1268 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1269
1270 /* first perform regular attach */
1271 f_TC_attach(id);
1272 /* then activate PDP context */
1273 f_pdp_ctx_act(apars);
1274 /* then transceive a downlink PDU */
1275 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1276 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1277
1278 f_pdp_ctx_deact_mo(apars, '00'O);
1279}
1280testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1281 var BSSGP_ConnHdlr vc_conn;
1282 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001283 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 +01001284 vc_conn.done;
1285}
1286
Harald Welte57b9b7f2018-02-18 22:28:13 +01001287/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1288private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1289 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1290
1291 /* first perform regular attach */
1292 f_TC_attach(id);
1293 /* then activate PDP context */
1294 f_pdp_ctx_act(apars);
1295 /* then transceive a downlink PDU */
1296 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1297 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1298
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001299 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001300}
1301testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1302 var BSSGP_ConnHdlr vc_conn;
1303 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001304 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 +01001305 vc_conn.done;
1306}
1307
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001308/* ATTACH + ATTACH (2nd) */
1309private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1310 g_pars.t_guard := 5.0;
1311
1312 /* first perform regular attach */
1313 f_TC_attach(id);
1314
1315 /* second to perform regular attach */
1316 f_TC_attach(id);
1317}
1318
1319
1320testcase TC_attach_second_attempt() runs on test_CT {
1321 var BSSGP_ConnHdlr vc_conn;
1322 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001323 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001324 vc_conn.done;
1325}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001326
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001327private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001328 var Gtp1cUnitdata g_ud;
1329 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1330
1331 /* first perform regular attach */
1332 f_TC_attach(id);
1333 /* Activate a pdp context against the GGSN */
1334 f_pdp_ctx_act(apars);
1335 /* Wait to receive first echo request and send initial Restart counter */
1336 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1337 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1338 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1339 }
1340 /* Wait to receive second echo request and send incremented Restart
1341 counter. This will fake a restarted GGSN, and pdp ctx allocated
1342 should be released by SGSN */
1343 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1344 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1345 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1346 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1347 }
1348 var OCT1 cause_network_failure := int2oct(38, 1)
1349 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001350 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true))) {
1351 BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001352 setverdict(pass);
1353 }
1354 [] as_xid(apars);
1355 }
1356 setverdict(pass);
1357}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001358/* ATTACH + trigger Recovery procedure through EchoResp */
1359testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001360 var BSSGP_ConnHdlr vc_conn;
1361 g_use_echo := true
1362 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001363 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 +02001364 vc_conn.done;
1365 g_use_echo := false
1366}
1367
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001368private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1369 var Gtp1cUnitdata g_ud;
1370 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1371 var integer seq_nr := 23;
1372 var GtpPeer peer;
1373 /* first perform regular attach */
1374 f_TC_attach(id);
1375
1376 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1377 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1378 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1379 f_pdp_ctx_act(apars, true);
1380
1381 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1382/* received. */
1383 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1384
1385 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1386 would be great to have an active pdp context here before triggering
1387 Recovery, and making sure the the DEACT request is sent by the SGSN.
1388 */
1389
1390 /* Activate a pdp context against the GGSN, send incremented Recovery
1391 IE. This should trigger the recovery path, but still this specific
1392 CTX activation should work. */
1393 apars.exp_rej_cause := omit; /* default value for tests */
1394 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
1395 f_pdp_ctx_act(apars, true);
1396
1397 setverdict(pass);
1398}
1399/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1400testcase TC_attach_restart_ctr_create() runs on test_CT {
1401 var BSSGP_ConnHdlr vc_conn;
1402 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001403 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 +02001404 vc_conn.done;
1405}
1406
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001407/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
1408private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
1409 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1410 var integer seq_nr := 23;
1411 var GtpPeer peer;
1412 var integer i;
1413
1414 /* first perform regular attach */
1415 f_TC_attach(id);
1416 /* then activate PDP context */
1417 f_pdp_ctx_act(apars);
1418
Alexander Couzens0e510e62018-07-28 23:06:00 +02001419 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001420 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1421 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1422
1423 for (i := 0; i < 5; i := i+1) {
1424 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001425 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001426 [] as_xid(apars);
1427 }
1428 }
1429
1430 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
1431
Alexander Couzens0e510e62018-07-28 23:06:00 +02001432 BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001433 setverdict(pass);
1434}
1435testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
1436 var BSSGP_ConnHdlr vc_conn;
1437 f_init();
1438 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001439 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 +02001440 vc_conn.done;
1441}
1442
Alexander Couzens5e307b42018-05-22 18:12:20 +02001443private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
1444 /* MS: perform regular attach */
1445 f_TC_attach(id);
1446
1447 /* HLR: cancel the location request */
1448 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
1449 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02001450
1451 /* ensure no Detach Request got received */
1452 timer T := 5.0;
1453 T.start;
1454 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001455 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(*, *, *))) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001456 T.stop;
1457 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02001458 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001459 }
1460 [] T.timeout {
1461 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02001462 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001463 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001464 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001465 repeat;
1466 }
1467 }
1468}
1469
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001470/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
1471private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
1472 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1473
1474 /* first perform regular attach */
1475 f_TC_attach(id);
1476 /* then activate PDP context */
1477 f_pdp_ctx_act(apars);
1478 /* then transceive a downlink PDU */
1479 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1480
1481 /* Send Error indication as response from upload PDU and expect deact towards MS */
1482 f_pdp_ctx_deact_mt(apars, true);
1483}
1484testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
1485 var BSSGP_ConnHdlr vc_conn;
1486 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001487 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 +02001488 vc_conn.done;
1489}
1490
Alexander Couzens5e307b42018-05-22 18:12:20 +02001491testcase TC_hlr_location_cancel_request_update() runs on test_CT {
1492 /* MS <-> SGSN: GMM Attach
1493 * HLR -> SGSN: Cancel Location Request
1494 * HLR <- SGSN: Cancel Location Ack
1495 */
1496 var BSSGP_ConnHdlr vc_conn;
1497 f_init();
1498 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001499 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02001500 vc_conn.done;
1501}
1502
1503
Alexander Couzensc87967a2018-05-22 16:09:54 +02001504private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
1505 /* MS: perform regular attach */
1506 f_TC_attach(id);
1507
1508 /* HLR: cancel the location request */
1509 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
1510 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
1511 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
1512
1513 /* MS: receive a Detach Request */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001514 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?)));
1515 BSSGP[0].send(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001516
1517 setverdict(pass);
1518}
1519
1520testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
1521 /* MS <-> SGSN: GMM Attach
1522 * HLR -> SGSN: Cancel Location Request
1523 * HLR <- SGSN: Cancel Location Ack
1524 * MS <- SGSN: Detach Request
1525 * SGSN-> MS: Detach Complete
1526 */
1527 var BSSGP_ConnHdlr vc_conn;
1528 f_init();
1529 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001530 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001531 vc_conn.done;
1532}
1533
1534
Alexander Couzens6c47f292018-05-22 17:09:49 +02001535private function f_hlr_location_cancel_request_unknown_subscriber(
1536 charstring id,
1537 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
1538
1539 /* HLR: cancel the location request */
1540 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
1541
1542 /* cause 2 = IMSI_UNKNOWN */
1543 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
1544
1545 setverdict(pass);
1546}
1547
1548private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001549 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001550}
1551
1552testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
1553 /* HLR -> SGSN: Cancel Location Request
1554 * HLR <- SGSN: Cancel Location Error
1555 */
1556
1557 var BSSGP_ConnHdlr vc_conn;
1558 f_init();
1559 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001560 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 +02001561 vc_conn.done;
1562}
1563
1564private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001565 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001566}
1567
1568testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
1569 /* HLR -> SGSN: Cancel Location Request
1570 * HLR <- SGSN: Cancel Location Error
1571 */
1572
1573 var BSSGP_ConnHdlr vc_conn;
1574 f_init();
1575 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001576 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 +02001577 vc_conn.done;
1578}
1579
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001580private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
1581 f_TC_attach(id);
1582 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1583}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001584
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001585testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
1586 /* MS <-> SGSN: Attach
1587 * MS -> SGSN: Detach Req (Power off)
1588 * VTY -> SGSN: Check if MS is NOT in subscriber cache
1589 */
1590 var BSSGP_ConnHdlr vc_conn;
1591 var integer id := 33;
1592 var charstring imsi := hex2str(f_gen_imsi(id));
1593
1594 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001595 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001596 vc_conn.done;
1597
1598 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1599}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001600
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001601/* Attempt an attach, but loose the Identification Request (IMEI) */
1602private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
1603 var integer count_req := 0;
1604 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1605
Alexander Couzens0e510e62018-07-28 23:06:00 +02001606 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 +02001607
1608 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001609 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001610 /* break */
1611 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001612 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001613 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001614 BSSGP[0].send(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001615 repeat;
1616 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001617 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001618 /* ignore ID REQ IMEI */
1619 count_req := count_req + 1;
1620 repeat;
1621 }
1622 }
1623 if (count_req != 5) {
1624 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001625 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001626 }
1627 setverdict(pass);
1628}
1629
1630testcase TC_attach_no_imei_response() runs on test_CT {
1631 /* MS -> SGSN: Attach Request IMSI
1632 * MS <- SGSN: Identity Request IMSI (optional)
1633 * MS -> SGSN: Identity Response IMSI (optional)
1634 * MS <- SGSN: Identity Request IMEI
1635 * MS -x SGSN: no response
1636 * MS <- SGSN: re-send: Identity Request IMEI 4x
1637 * MS <- SGSN: Attach Reject
1638 */
1639 var BSSGP_ConnHdlr vc_conn;
1640 f_init();
1641 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001642 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 +02001643 vc_conn.done;
1644}
1645
Alexander Couzens53f20562018-06-12 16:24:12 +02001646/* Attempt an attach, but loose the Identification Request (IMSI) */
1647private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
1648 var integer count_req := 0;
1649 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1650
1651 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
1652 g_pars.p_tmsi := 'c0000035'O;
1653
Alexander Couzens0e510e62018-07-28 23:06:00 +02001654 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 +02001655
1656 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001657 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001658 /* break */
1659 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001660 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001661 /* ignore ID REQ IMSI */
1662 count_req := count_req + 1;
1663 repeat;
1664 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001665 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001666 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001667 BSSGP[0].send(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02001668 repeat;
1669 }
1670 }
1671 if (count_req != 5) {
1672 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001673 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02001674 }
1675 setverdict(pass);
1676}
1677
1678testcase TC_attach_no_imsi_response() runs on test_CT {
1679 /* MS -> SGSN: Attach Request TMSI (unknown)
1680 * MS <- SGSN: Identity Request IMEI (optional)
1681 * MS -> SGSN: Identity Response IMEI (optional)
1682 * MS <- SGSN: Identity Request IMSI
1683 * MS -x SGSN: no response
1684 * MS <- SGSN: re-send: Identity Request IMSI 4x
1685 * MS <- SGSN: Attach Reject
1686 */
1687 var BSSGP_ConnHdlr vc_conn;
1688 f_init();
1689 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001690 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 +02001691 vc_conn.done;
1692}
1693
Alexander Couzenscf818962018-06-05 18:00:00 +02001694private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
1695 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
1696}
1697
1698testcase TC_attach_check_subscriber_list() runs on test_CT {
1699 /* MS <-> SGSN: Attach
1700 * VTY -> SGSN: Check if MS is in subscriber cache
1701 */
1702 var BSSGP_ConnHdlr vc_conn;
1703 var integer id := 34;
1704 var charstring imsi := hex2str(f_gen_imsi(id));
1705
1706 f_init();
1707 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001708 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02001709 vc_conn.done;
1710
1711 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1712 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
1713}
1714
Alexander Couzensf9858652018-06-07 16:14:53 +02001715private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
1716 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1717 var BssgpDecoded bd;
1718
1719 /* unregister the old IMSI */
1720 f_bssgp_client_unregister(g_pars.imsi);
1721 /* Simulate a foreign IMSI */
1722 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +02001723 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Alexander Couzensf9858652018-06-07 16:14:53 +02001724
1725 /* there is no auth */
1726 g_pars.net.expect_auth := false;
1727
Alexander Couzens0e510e62018-07-28 23:06:00 +02001728 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02001729 f_gmm_auth();
1730 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001731 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzensf9858652018-06-07 16:14:53 +02001732 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001733 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02001734 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001735 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
Alexander Couzensf9858652018-06-07 16:14:53 +02001736 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001737 BSSGP[0].send(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02001738 setverdict(pass);
1739 }
1740 }
1741}
1742testcase TC_attach_closed_add_vty() runs on test_CT {
1743 /* VTY-> SGSN: policy close
1744 * MS -> SGSN: Attach Request
1745 * MS <- SGSN: Identity Request IMSI
1746 * MS -> SGSN: Identity Response IMSI
1747 * MS <- SGSN: Attach Reject
1748 * VTY-> SGSN: policy imsi-acl add IMSI
1749 * MS -> SGSN: Attach Request
1750 * MS <- SGSN: Identity Request IMSI
1751 * MS -> SGSN: Identity Response IMSI
1752 * MS <- SGSN: Identity Request IMEI
1753 * MS -> SGSN: Identity Response IMEI
1754 * MS <- SGSN: Attach Accept
1755 */
1756 var BSSGP_ConnHdlr vc_conn;
1757 f_init();
1758 f_sleep(1.0);
1759 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1760 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
1761 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001762 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02001763 vc_conn.done;
1764 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456789");
1765 /* test with same IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001766 vc_conn := f_start_handler(refers(f_TC_attach_closed_imsi_added), testcasename(), g_gb, 10);
Alexander Couzensf9858652018-06-07 16:14:53 +02001767 vc_conn.done;
1768}
1769
Alexander Couzens0085bd72018-06-12 19:08:44 +02001770/* Attempt an attach, but never answer a Attach Complete */
1771private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
1772 var integer count_req := 0;
1773
Alexander Couzens0e510e62018-07-28 23:06:00 +02001774 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 +02001775 f_gmm_auth();
1776
1777 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001778 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001779 /* break */
1780 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001781 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001782 /* ignore */
1783 count_req := count_req + 1;
1784 repeat;
1785 }
1786 }
1787 if (count_req != 5) {
1788 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02001789 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02001790 }
1791 setverdict(pass);
1792}
1793
1794testcase TC_attach_check_complete_resend() runs on test_CT {
1795 /* MS -> SGSN: Attach Request IMSI
1796 * MS <- SGSN: Identity Request *
1797 * MS -> SGSN: Identity Response *
1798 * MS <- SGSN: Attach Complete 5x
1799 */
1800 var BSSGP_ConnHdlr vc_conn;
1801 f_init();
1802 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001803 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 +02001804 vc_conn.done;
1805}
1806
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001807private function f_routing_area_update(RoutingAreaIdentificationV ra, integer bssgp := 0) runs on BSSGP_ConnHdlr {
1808 var BssgpDecoded bd;
1809
1810 /* then send RAU */
1811 BSSGP[bssgp].send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit));
1812 alt {
1813 [] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
1814 f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept);
1815 BSSGP[bssgp].send(ts_GMM_RAU_COMPL);
1816 setverdict(pass);
1817 }
1818 [] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
1819 setverdict(fail, "Unexpected RAU Reject");
1820 mtc.stop;
1821 }
1822 [] BSSGP[bssgp].receive { repeat; }
1823 }
1824}
1825
Harald Welte5ac31492018-02-15 20:39:13 +01001826control {
Harald Welte5b7c8122018-02-16 21:48:17 +01001827 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01001828 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001829 execute( TC_attach_umts_aka_umts_res() );
1830 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001831 execute( TC_attach_auth_id_timeout() );
1832 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01001833 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001834 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01001835 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01001836 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01001837 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01001838 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001839 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02001840 execute( TC_attach_no_imsi_response() );
Alexander Couzensf9858652018-06-07 16:14:53 +02001841 execute( TC_attach_closed_add_vty(), 10.0 );
Alexander Couzenscf818962018-06-05 18:00:00 +02001842 execute( TC_attach_check_subscriber_list(), 10.0 );
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001843 execute( TC_attach_detach_check_subscriber_list(), 10.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02001844 execute( TC_attach_check_complete_resend() );
Alexander Couzens5e307b42018-05-22 18:12:20 +02001845 execute( TC_hlr_location_cancel_request_update(), 10.0 );
Alexander Couzens234c5882018-05-29 15:48:44 +02001846 execute( TC_hlr_location_cancel_request_withdraw(), 10.0 );
1847 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 10.0 );
1848 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 10.0 );
Harald Welte04683d02018-02-16 22:43:45 +01001849 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01001850 execute( TC_attach_rau() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01001851 execute( TC_detach_unknown_nopoweroff() );
1852 execute( TC_detach_unknown_poweroff() );
1853 execute( TC_detach_nopoweroff() );
1854 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01001855 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01001856 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01001857 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001858 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01001859 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01001860 execute( TC_attach_pdp_act_user_deact_mt() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001861 execute( TC_attach_second_attempt() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001862 execute( TC_attach_restart_ctr_echo() );
1863 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001864 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001865 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Harald Welte5ac31492018-02-15 20:39:13 +01001866}
Harald Welte96a33b02018-02-04 10:36:22 +01001867
1868
1869
1870}