blob: 715bdcc8ebd60d503a5f232db97dc6764677fc9f [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;
Alexander Couzenscdfb7512018-07-31 15:37:14 +020085 var LLC_Entities llc;
Harald Welte5ac31492018-02-15 20:39:13 +010086}
87
88type record SGSN_ConnHdlrNetworkPars {
89 boolean expect_ptmsi,
90 boolean expect_auth,
91 boolean expect_ciph
92};
93
94type record BSSGP_ConnHdlrPars {
95 /* IMEI of the simulated ME */
96 hexstring imei,
Alexander Couzens8f0fb002018-05-02 19:30:55 +020097 /* IMSI of the simulated MS */
Harald Welte5ac31492018-02-15 20:39:13 +010098 hexstring imsi,
99 /* MSISDN of the simulated MS (probably unused) */
100 hexstring msisdn,
101 /* P-TMSI allocated to the simulated MS */
102 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +0100103 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100104 /* TLLI of the simulated MS */
105 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +0100106 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100107 RoutingAreaIdentificationV ra optional,
Alexander Couzens51114d12018-07-31 18:41:56 +0200108 BssgpCellIds bssgp_cell_id,
Harald Welte5ac31492018-02-15 20:39:13 +0100109 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +0100110 SGSN_ConnHdlrNetworkPars net,
111 float t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100112};
113
Alexander Couzens89508702018-07-31 04:16:10 +0200114private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {
115 var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;
116
117 var RoutingAreaIdentificationV ret := {
118 mccDigit1 := mcc_mnc[0],
119 mccDigit2 := mcc_mnc[1],
120 mccDigit3 := mcc_mnc[2],
121 mncDigit3 := mcc_mnc[5],
122 mncDigit1 := mcc_mnc[3],
123 mncDigit2 := mcc_mnc[4],
124 lac := int2oct(cell_id.ra_id.lai.lac, 16),
125 rac := int2oct(cell_id.ra_id.rac, 8)
126 }
127 return ret;
128};
129
Alexander Couzens51114d12018-07-31 18:41:56 +0200130private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
131 gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset));
132 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset));
Harald Welte5ac31492018-02-15 20:39:13 +0100133 /* connect lower end of BSSGP emulation with NS upper port */
134 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
135 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
136 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
137
Alexander Couzens2c12b242018-07-31 00:30:11 +0200138 gb.vc_NS.start(NSStart(mp_nsconfig));
Harald Welte5ac31492018-02-15 20:39:13 +0100139 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
140}
141
142private function f_init_gsup(charstring id) runs on test_CT {
143 id := id & "-GSUP";
144 var GsupOps ops := {
145 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
146 };
147
148 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
149 vc_GSUP := GSUP_Emulation_CT.create(id);
150
151 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
152 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
153 /* we use this hack to get events like ASP_IPA_EVENT_UP */
154 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
155
156 vc_GSUP.start(GSUP_Emulation.main(ops, id));
157 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
158
159 /* wait for incoming connection to GSUP port before proceeding */
160 timer T := 10.0;
161 T.start;
162 alt {
163 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
164 [] T.timeout {
165 setverdict(fail, "No connection to GSUP Port");
Daniel Willmannafce8662018-07-06 23:11:32 +0200166 mtc.stop;
Harald Welte5ac31492018-02-15 20:39:13 +0100167 }
168 }
169}
170
Harald Welteeded9ad2018-02-17 20:57:34 +0100171private function f_init_gtp(charstring id) runs on test_CT {
172 id := id & "-GTP";
173
174 var GtpEmulationCfg gtp_cfg := {
175 gtpc_bind_ip := mp_ggsn_ip,
176 gtpc_bind_port := GTP1C_PORT,
177 gtpu_bind_ip := mp_ggsn_ip,
178 gtpu_bind_port := GTP1U_PORT,
179 sgsn_role := false
180 };
181
182 vc_GTP := GTP_Emulation_CT.create(id);
183 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
184}
185
Harald Weltebd194722018-02-16 22:11:08 +0100186private function f_init_vty() runs on test_CT {
187 map(self:SGSNVTY, system:SGSNVTY);
188 f_vty_set_prompts(SGSNVTY);
189 f_vty_transceive(SGSNVTY, "enable");
190 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
191}
192
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200193private function f_vty_enable_echo_interval(boolean enable) runs on test_CT {
194 if (enable) {
195 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 echo-interval 5");
196 } else {
197 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 no echo-interval");
198 }
199}
200
Harald Weltebd194722018-02-16 22:11:08 +0100201
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100202function f_init(BcdMccMnc mcc_mnc := '26242F'H) runs on test_CT {
Harald Welte96a33b02018-02-04 10:36:22 +0100203 if (g_initialized == true) {
204 return;
205 }
206 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100207 g_gb[0].cfg := {
208 nsei := 96,
209 bvci := 196,
210 cell_id := {
211 ra_id := {
212 lai := {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100213 mcc_mnc := mcc_mnc, lac := 13135},
Harald Welte5ac31492018-02-15 20:39:13 +0100214 rac := 0
215 },
216 cell_id := 20960
217 },
218 sgsn_role := false
219 };
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200220 g_gb[1].cfg := {
221 nsei := 97,
222 bvci := 210,
223 cell_id := {
224 ra_id := {
225 lai := {
226 mcc_mnc := mcc_mnc, lac := 13200},
227 rac := 0
228 },
229 cell_id := 20961
230 },
231 sgsn_role := false
232 };
233 g_gb[2].cfg := {
234 nsei := 98,
235 bvci := 220,
236 cell_id := {
237 ra_id := {
238 lai := {
239 mcc_mnc := mcc_mnc, lac := 13300},
240 rac := 0
241 },
242 cell_id := 20962
243 },
244 sgsn_role := false
245 };
Harald Welte96a33b02018-02-04 10:36:22 +0100246
Alexander Couzens51114d12018-07-31 18:41:56 +0200247 f_init_gb(g_gb[0], "SGSN_Test-Gb0", 0);
248 f_init_gb(g_gb[1], "SGSN_Test-Gb1", 1);
249 f_init_gb(g_gb[2], "SGSN_Test-Gb2", 2);
Harald Welte5ac31492018-02-15 20:39:13 +0100250 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100251 f_init_gtp("SGSN_Test");
Harald Weltebd194722018-02-16 22:11:08 +0100252 f_init_vty();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200253 f_vty_enable_echo_interval(g_use_echo);
Harald Welte5ac31492018-02-15 20:39:13 +0100254}
Harald Welte96a33b02018-02-04 10:36:22 +0100255
Harald Welte5ac31492018-02-15 20:39:13 +0100256type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
257
258/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Alexander Couzens51114d12018-07-31 18:41:56 +0200259function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix,
Harald Welte62e29582018-02-16 21:17:11 +0100260 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100261runs on test_CT return BSSGP_ConnHdlr {
262 var BSSGP_ConnHdlr vc_conn;
263 var SGSN_ConnHdlrNetworkPars net_pars := {
264 expect_ptmsi := true,
265 expect_auth := true,
266 expect_ciph := false
267 };
268 var BSSGP_ConnHdlrPars pars := {
269 imei := f_gen_imei(imsi_suffix),
270 imsi := f_gen_imsi(imsi_suffix),
271 msisdn := f_gen_msisdn(imsi_suffix),
272 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100273 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100274 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100275 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100276 ra := omit,
Alexander Couzens51114d12018-07-31 18:41:56 +0200277 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 +0100278 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100279 net := net_pars,
280 t_guard := t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100281 };
282
283 vc_conn := BSSGP_ConnHdlr.create(id);
Alexander Couzens51114d12018-07-31 18:41:56 +0200284 connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP:BSSGP_SP);
285 connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP:BSSGP_PROC);
286 connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP:BSSGP_SP);
287 connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP:BSSGP_PROC);
288 connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP:BSSGP_SP);
289 connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP:BSSGP_PROC);
Harald Welte5ac31492018-02-15 20:39:13 +0100290
291 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
292 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
293
Harald Welteeded9ad2018-02-17 20:57:34 +0100294 connect(vc_conn:GTP, vc_GTP:CLIENT);
295 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
296
Harald Welte5ac31492018-02-15 20:39:13 +0100297 vc_conn.start(f_handler_init(fn, id, pars));
298 return vc_conn;
299}
300
Harald Welte62e29582018-02-16 21:17:11 +0100301private altstep as_Tguard() runs on BSSGP_ConnHdlr {
302 [] g_Tguard.timeout {
303 setverdict(fail, "Tguard timeout");
Daniel Willmannafce8662018-07-06 23:11:32 +0200304 mtc.stop;
Harald Welte62e29582018-02-16 21:17:11 +0100305 }
306}
307
Harald Welte5ac31492018-02-15 20:39:13 +0100308/* first function called in every ConnHdlr */
309private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
310runs on BSSGP_ConnHdlr {
311 /* do some common stuff like setting up g_pars */
312 g_pars := pars;
313
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200314 llc := f_llc_create(false);
315
Harald Welte5ac31492018-02-15 20:39:13 +0100316 /* register with BSSGP core */
Alexander Couzens51114d12018-07-31 18:41:56 +0200317 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welte5ac31492018-02-15 20:39:13 +0100318 /* tell GSUP dispatcher to send this IMSI to us */
319 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100320 /* tell GTP dispatcher to send this IMSI to us */
321 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100322
Harald Welte62e29582018-02-16 21:17:11 +0100323 g_Tguard.start(pars.t_guard);
324 activate(as_Tguard());
325
Harald Welte5ac31492018-02-15 20:39:13 +0100326 /* call the user-supplied test case function */
327 fn.apply(id);
328 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100329}
330
331/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100332 * Detach without Attach
333 * SM procedures without attach / RAU
334 * ATTACH / RAU
335 ** with / without authentication
336 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100337 * re-transmissions of LLC frames
338 * PDP Context activation
339 ** with different GGSN config in SGSN VTY
340 ** with different PDP context type (v4/v6/v46)
341 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100342 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100343 */
344
345testcase TC_wait_ns_up() runs on test_CT {
346 f_init();
347 f_sleep(20.0);
348}
349
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200350function f_send_l3_gmm_llc(template PDU_L3_MS_SGSN l3_mo, integer gb_index := 0) runs on BSSGP_ConnHdlr {
351 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
352 var BIT4 sapi := f_llc_sapi_by_l3_mo(valueof(l3_mo));
353 var integer n_u := f_llc_get_n_u_tx(llc[bit2int(sapi)]);
354 var octetstring llc_enc := enc_PDU_LLC(valueof(ts_LLC_UI(l3_enc, sapi, '0'B, n_u)));
355 BSSGP[gb_index].send(ts_BSSGP_UL_UD(g_pars.tlli, g_pars.bssgp_cell_id[gb_index], llc_enc));
356}
357
Harald Welte5ac31492018-02-15 20:39:13 +0100358altstep as_mm_identity() runs on BSSGP_ConnHdlr {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100359 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200360 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Harald Welte5ac31492018-02-15 20:39:13 +0100361 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200362 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Harald Welte5ac31492018-02-15 20:39:13 +0100363 repeat;
364 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200365 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Harald Welte5ac31492018-02-15 20:39:13 +0100366 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200367 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Harald Welte5ac31492018-02-15 20:39:13 +0100368 repeat;
369 }
370}
Harald Welte96a33b02018-02-04 10:36:22 +0100371
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200372/* perform GMM authentication (if expected).
373 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
374 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
375function f_gmm_auth (boolean umts_aka_challenge := false, boolean force_gsm_sres := false) runs on BSSGP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100376 var BssgpDecoded bd;
377 var PDU_L3_MS_SGSN l3_mo;
378 var PDU_L3_SGSN_MS l3_mt;
379 var default di := activate(as_mm_identity());
380 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200381 var GSUP_IE auth_tuple;
382 var template AuthenticationParameterAUTNTLV autn;
383
384 if (umts_aka_challenge) {
385 g_pars.vec := f_gen_auth_vec_3g();
386 autn := {
387 elementIdentifier := '28'O,
388 lengthIndicator := lengthof(g_pars.vec.autn),
389 autnValue := g_pars.vec.autn
390 };
391
392 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
393 g_pars.vec.sres,
394 g_pars.vec.kc,
395 g_pars.vec.ik,
396 g_pars.vec.ck,
397 g_pars.vec.autn,
398 g_pars.vec.res));
399 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
400 } else {
401 g_pars.vec := f_gen_auth_vec_2g();
402 autn := omit;
403 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
404 g_pars.vec.sres,
405 g_pars.vec.kc));
406 log("GSUP sends only 2G auth tuple", auth_tuple);
407 }
Harald Welte5ac31492018-02-15 20:39:13 +0100408 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
409 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200410
411 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
412 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200413 BSSGP[0].receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
Harald Welte5ac31492018-02-15 20:39:13 +0100414 l3_mt := bd.l3_mt;
415 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200416 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
417
418 if (umts_aka_challenge and not force_gsm_sres) {
419 /* set UMTS response instead */
420 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
421 valueField := substr(g_pars.vec.res, 0, 4)
422 };
423 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
424 elementIdentifier := '21'O,
425 lengthIndicator := lengthof(g_pars.vec.res) - 4,
426 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
427 };
428 }
429
430 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100431 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
432 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
433 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
434 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
435 }
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200436 f_send_l3_gmm_llc(l3_mo);
Harald Welte76dee092018-02-16 22:12:59 +0100437 } else {
438 /* wait for identity procedure */
439 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100440 }
Harald Welte76dee092018-02-16 22:12:59 +0100441
Harald Welte5ac31492018-02-15 20:39:13 +0100442 deactivate(di);
443}
444
Harald Weltef70997d2018-02-17 10:11:19 +0100445function f_upd_ptmsi_and_tlli(OCT4 p_tmsi) runs on BSSGP_ConnHdlr {
446 g_pars.p_tmsi := p_tmsi;
447 /* update TLLI */
448 g_pars.tlli_old := g_pars.tlli;
449 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
450 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli);
451}
452
Harald Welte04683d02018-02-16 22:43:45 +0100453function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
454 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100455 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Alexander Couzens51114d12018-07-31 18:41:56 +0200456 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100457 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Alexander Couzens51114d12018-07-31 18:41:56 +0200458 & "; expected " & hex2str(g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200459 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100460 }
Harald Welte04683d02018-02-16 22:43:45 +0100461 g_pars.ra := aa.routingAreaIdentification;
462 if (ispresent(aa.allocatedPTMSI)) {
463 if (not g_pars.net.expect_ptmsi) {
464 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200465 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100466 }
Harald Weltef70997d2018-02-17 10:11:19 +0100467 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100468 }
469 if (ispresent(aa.msIdentity)) {
470 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200471 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100472 }
473 /* P-TMSI.sig */
474 if (ispresent(aa.ptmsiSignature)) {
475 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
476 }
477 /* updateTimer */
478 // aa.readyTimer
479 /* T3302, T3319, T3323, T3312_ext, T3324 */
480}
481
Harald Welte91636de2018-02-17 10:16:14 +0100482function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra) runs on BSSGP_ConnHdlr {
483 /* mandatory IE */
484 g_pars.ra := ra.routingAreaId;
485 if (ispresent(ra.allocatedPTMSI)) {
486 if (not g_pars.net.expect_ptmsi) {
487 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200488 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100489 }
490 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
491 }
492 if (ispresent(ra.msIdentity)) {
493 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200494 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100495 }
496 /* P-TMSI.sig */
497 if (ispresent(ra.ptmsiSignature)) {
498 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
499 }
500 /* updateTimer */
501 // aa.readyTimer
502 /* T3302, T3319, T3323, T3312_ext, T3324 */
503}
504
505
Harald Welte5a4fa042018-02-16 20:59:21 +0100506function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
507 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
508}
509
Harald Welte23178c52018-02-17 09:36:33 +0100510/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100511private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileL3_CommonIE_Types.MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100512 if (ispresent(g_pars.p_tmsi)) {
513 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
514 } else {
515 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
516 }
517}
518
Harald Welte311ec272018-02-17 09:40:03 +0100519private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100520 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100521 /* Expect MSC to perform LU with HLR */
522 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100523 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
524 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
525 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100526 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
527 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
528}
529
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200530private function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100531 var BssgpDecoded bd;
Harald Welte5a4fa042018-02-16 20:59:21 +0100532 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200533 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 +0100534
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200535 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
536 * 3G auth vectors */
537 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
538 /* The thing is, if the solSACapability is 'omit', then the
539 * revisionLevelIndicatior is at the wrong place! */
540 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
541
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200542 f_send_l3_gmm_llc(attach_req);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200543 f_gmm_auth(umts_aka_challenge, force_gsm_sres);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200544 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100545 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100546
Alexander Couzens0e510e62018-07-28 23:06:00 +0200547 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100548 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
549 }
550 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200551 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200552}
553
554private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
555 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100556 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100557}
558
559testcase TC_attach() runs on test_CT {
560 var BSSGP_ConnHdlr vc_conn;
561 f_init();
562 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200563 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100564 vc_conn.done;
565}
566
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100567testcase TC_attach_mnc3() runs on test_CT {
568 var BSSGP_ConnHdlr vc_conn;
569 f_init('023042'H);
570 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200571 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100572 vc_conn.done;
573}
574
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200575private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
576 f_gmm_attach(true, false);
577 setverdict(pass);
578}
579testcase TC_attach_umts_aka_umts_res() runs on test_CT {
580 var BSSGP_ConnHdlr vc_conn;
581 f_init();
582 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200583 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200584 vc_conn.done;
585}
586
587private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
588 f_gmm_attach(true, true);
589 setverdict(pass);
590}
591testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
592 var BSSGP_ConnHdlr vc_conn;
593 f_init();
594 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200595 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200596 vc_conn.done;
597}
598
Harald Welte5b7c8122018-02-16 21:48:17 +0100599/* MS never responds to ID REQ, expect ATTACH REJECT */
600private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100601 var RoutingAreaIdentificationV old_ra := f_random_RAI();
602
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200603 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100604 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200605 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100606 /* don't send ID Response */
607 repeat;
608 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200609 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100610 setverdict(pass);
611 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200612 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100613 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +0200614 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100615 }
616 }
617}
618testcase TC_attach_auth_id_timeout() runs on test_CT {
619 var BSSGP_ConnHdlr vc_conn;
620 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200621 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 +0100622 vc_conn.done;
623}
624
625/* HLR never responds to SAI REQ, expect ATTACH REJECT */
626private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100627 var RoutingAreaIdentificationV old_ra := f_random_RAI();
628
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200629 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100630 alt {
631 [] as_mm_identity();
632 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
633 }
634 /* don't send SAI-response from HLR */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200635 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Welte5b7c8122018-02-16 21:48:17 +0100636 setverdict(pass);
637}
638testcase TC_attach_auth_sai_timeout() runs on test_CT {
639 var BSSGP_ConnHdlr vc_conn;
640 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200641 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +0100642 vc_conn.done;
643}
644
Harald Weltefe253882018-02-17 09:25:00 +0100645/* HLR rejects SAI, expect ATTACH REJECT */
646private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100647 var RoutingAreaIdentificationV old_ra := f_random_RAI();
648
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200649 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +0100650 alt {
651 [] as_mm_identity();
652 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
653 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
654 }
655 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200656 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Weltefe253882018-02-17 09:25:00 +0100657 setverdict(pass);
658}
659testcase TC_attach_auth_sai_reject() runs on test_CT {
660 var BSSGP_ConnHdlr vc_conn;
661 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200662 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +0100663 vc_conn.done;
664}
665
Harald Welte5b7c8122018-02-16 21:48:17 +0100666/* HLR never responds to UL REQ, expect ATTACH REJECT */
667private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100668 var BssgpDecoded bd;
Harald Welte5b7c8122018-02-16 21:48:17 +0100669 var RoutingAreaIdentificationV old_ra := f_random_RAI();
670
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200671 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100672 f_gmm_auth();
673 /* Expect MSC to perform LU with HLR */
674 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
675 /* Never follow-up with ISD_REQ or UL_RES */
676 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200677 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100678 setverdict(pass);
679 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200680 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100681 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100682 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200683 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100684 }
685 }
686}
687testcase TC_attach_gsup_lu_timeout() runs on test_CT {
688 var BSSGP_ConnHdlr vc_conn;
689 f_init();
690 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200691 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100692 vc_conn.done;
693}
694
Harald Welteb7c14e92018-02-17 09:29:16 +0100695/* HLR rejects UL REQ, expect ATTACH REJECT */
696private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
697 var BssgpDecoded bd;
Harald Welteb7c14e92018-02-17 09:29:16 +0100698 var RoutingAreaIdentificationV old_ra := f_random_RAI();
699
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200700 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +0100701 f_gmm_auth();
702 /* Expect MSC to perform LU with HLR */
703 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
704 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
705 }
706 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200707 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welteb7c14e92018-02-17 09:29:16 +0100708 setverdict(pass);
709 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200710 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welteb7c14e92018-02-17 09:29:16 +0100711 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
712 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200713 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +0100714 }
715 }
716}
717testcase TC_attach_gsup_lu_reject() runs on test_CT {
718 var BSSGP_ConnHdlr vc_conn;
719 f_init();
720 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200721 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +0100722 vc_conn.done;
723}
724
725
Harald Welte3823e2e2018-02-16 21:53:48 +0100726/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
727private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100728 var BssgpDecoded bd;
Harald Welte3823e2e2018-02-16 21:53:48 +0100729 var RoutingAreaIdentificationV old_ra := f_random_RAI();
730
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200731 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +0100732 f_gmm_auth();
733 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100734 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100735
Alexander Couzens0e510e62018-07-28 23:06:00 +0200736 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100737 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
738 }
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200739 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +0100740 setverdict(pass);
741}
Harald Welte3823e2e2018-02-16 21:53:48 +0100742testcase TC_attach_combined() runs on test_CT {
743 var BSSGP_ConnHdlr vc_conn;
744 f_init();
745 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200746 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100747 vc_conn.done;
748}
749
Harald Welte76dee092018-02-16 22:12:59 +0100750/* Attempt of GPRS ATTACH in 'accept all' mode */
751private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100752 var BssgpDecoded bd;
Harald Welte76dee092018-02-16 22:12:59 +0100753 var RoutingAreaIdentificationV old_ra := f_random_RAI();
754
755 g_pars.net.expect_auth := false;
756
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200757 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +0100758 f_gmm_auth();
Alexander Couzens0e510e62018-07-28 23:06:00 +0200759 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100760 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
761 }
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200762 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +0100763 setverdict(pass);
764}
765testcase TC_attach_accept_all() runs on test_CT {
766 var BSSGP_ConnHdlr vc_conn;
767 f_init();
768 f_sleep(1.0);
769 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +0200770 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +0100771 vc_conn.done;
772}
Harald Welte5b7c8122018-02-16 21:48:17 +0100773
Harald Welteb2124b22018-02-16 22:26:56 +0100774/* Attempt of GPRS ATTACH in 'accept all' mode */
775private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +0100776 var RoutingAreaIdentificationV old_ra := f_random_RAI();
777
778 /* Simulate a foreign IMSI */
779 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +0200780 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welteb2124b22018-02-16 22:26:56 +0100781
782 g_pars.net.expect_auth := false;
783
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200784 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +0100785 alt {
786 [] as_mm_identity();
Alexander Couzens0e510e62018-07-28 23:06:00 +0200787 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
Harald Welteb2124b22018-02-16 22:26:56 +0100788 setverdict(pass);
789 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200790 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welteb2124b22018-02-16 22:26:56 +0100791 setverdict(pass);
792 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200793 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200794 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200795 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200796 }
Harald Welteb2124b22018-02-16 22:26:56 +0100797 }
798}
799testcase TC_attach_closed() runs on test_CT {
800 var BSSGP_ConnHdlr vc_conn;
801 f_init();
802 f_sleep(1.0);
803 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
804 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +0200805 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +0100806 vc_conn.done;
807 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +0200808 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +0100809 vc_conn.done;
810}
811
Harald Welte04683d02018-02-16 22:43:45 +0100812/* Routing Area Update from Unknown TLLI -> REJECT */
813private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100814 var RoutingAreaIdentificationV old_ra := f_random_RAI();
815
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200816 f_send_l3_gmm_llc(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, old_ra, false, omit, omit));
Harald Welte04683d02018-02-16 22:43:45 +0100817 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200818 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
Harald Welte04683d02018-02-16 22:43:45 +0100819 setverdict(pass);
820 }
821 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200822 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +0100823 }
824}
825testcase TC_rau_unknown() runs on test_CT {
826 var BSSGP_ConnHdlr vc_conn;
827 f_init();
828 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200829 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +0100830 vc_conn.done;
831}
832
Harald Welte91636de2018-02-17 10:16:14 +0100833private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
834 var BssgpDecoded bd;
835
836 /* first perform regular attach */
837 f_TC_attach(id);
838
Alexander Couzens5dce90d2018-07-31 03:16:37 +0200839 f_routing_area_update(g_pars.ra);
840
Harald Welte91636de2018-02-17 10:16:14 +0100841}
842testcase TC_attach_rau() runs on test_CT {
843 var BSSGP_ConnHdlr vc_conn;
844 f_init();
845 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200846 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +0100847 vc_conn.done;
848}
Harald Welte04683d02018-02-16 22:43:45 +0100849
Harald Welte6abb9fe2018-02-17 15:24:48 +0100850/* general GPRS DETACH helper */
851function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge) runs on BSSGP_ConnHdlr {
852 var BssgpDecoded bd;
853 timer T := 5.0;
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200854 f_send_l3_gmm_llc(ts_GMM_DET_REQ_MO(detach_type, power_off));
Harald Welte6abb9fe2018-02-17 15:24:48 +0100855 if (expect_purge) {
856 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
857 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
858 }
859 T.start;
860 alt {
861 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
862 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +0200863 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100864 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200865 [power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100866 g_pars.ra := omit;
867 setverdict(fail, "Unexpected ATTACH ACCEPT in no-power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +0200868 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100869 /* TODO: check if any PDP contexts are deactivated on network side? */
870 }
871 [power_off] T.timeout {
872 setverdict(pass);
873 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200874 [not power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100875 g_pars.ra := omit;
876 setverdict(pass);
877 /* TODO: check if any PDP contexts are deactivated on network side? */
878 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200879 [] BSSGP[0].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +0100880 }
881}
882
883/* IMSI DETACH (non-power-off) for unknown TLLI */
884private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
885 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
886}
887testcase TC_detach_unknown_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_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100892 vc_conn.done;
893}
894
895/* IMSI DETACH (power-off) for unknown TLLI */
896private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
897 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
898}
899testcase TC_detach_unknown_poweroff() 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_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100904 vc_conn.done;
905}
906
907/* IMSI DETACH (non-power-off) for known TLLI */
908private function f_TC_detach_nopoweroff(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, false, true);
913}
914testcase TC_detach_nopoweroff() 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_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100919 vc_conn.done;
920}
921
922/* IMSI DETACH (power-off) for known TLLI */
923private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
924 /* first perform regular attach */
925 f_TC_attach(id);
926
927 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
928}
929testcase TC_detach_poweroff() runs on test_CT {
930 var BSSGP_ConnHdlr vc_conn;
931 f_init();
932 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200933 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100934 vc_conn.done;
935}
936
Harald Welteeded9ad2018-02-17 20:57:34 +0100937type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +0100938 BIT3 tid, /* L3 Transaction ID */
939 BIT4 nsapi, /* SNDCP NSAPI */
940 BIT4 sapi, /* LLC SAPI */
941 QoSV qos, /* QoS parameters */
942 PDPAddressV addr, /* IP address */
943 octetstring apn optional, /* APN name */
944 ProtocolConfigOptionsV pco optional, /* protoco config opts */
945 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +0100946 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +0100947 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +0100948
Harald Welte822f9102018-02-18 20:39:06 +0100949 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
950 OCT4 ggsn_tei_u, /* GGSN TEI User */
951 octetstring ggsn_ip_c, /* GGSN IP Control */
952 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200953 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +0100954
Harald Welte822f9102018-02-18 20:39:06 +0100955 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
956 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
957 octetstring sgsn_ip_c optional, /* SGSN IP Control */
958 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +0100959};
960
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100961
962private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
963 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
964 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
965 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
966 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
967 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
968 f_gtp_register_teid(apars.ggsn_tei_c);
969 f_gtp_register_teid(apars.ggsn_tei_u);
970}
971
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200972function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false) runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100973 var boolean exp_rej := ispresent(apars.exp_rej_cause);
974 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200975 var template Recovery_gtpc recovery := omit;
976
977 if (send_recovery) {
978 recovery := ts_Recovery(apars.ggsn_restart_ctr);
979 }
Harald Welteeded9ad2018-02-17 20:57:34 +0100980
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200981 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
Harald Welteeded9ad2018-02-17 20:57:34 +0100982 apars.apn, apars.pco));
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100983 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
984 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
985 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
986 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
987 apars.sgsn_tei_c, apars.gtp_resp_cause,
988 apars.ggsn_tei_c, apars.ggsn_tei_u,
989 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200990 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
991 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +0100992 }
993 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200994 [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 +0100995 setverdict(pass);
996 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200997 [exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100998 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +0200999 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001000 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001001 [not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001002 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +02001003 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001004 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001005 [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 +01001006 setverdict(pass);
1007 }
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001008 [] as_xid(apars);
Harald Welteeded9ad2018-02-17 20:57:34 +01001009 }
1010}
1011
Harald Welte6f203162018-02-18 22:04:55 +01001012function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause) runs on BSSGP_ConnHdlr {
1013 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1014 var Gtp1cUnitdata g_ud;
1015
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001016 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
Harald Welte6f203162018-02-18 22:04:55 +01001017 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1018 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001019 BSSGP[0].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001020 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1021 }
1022 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001023 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {
Harald Welte6f203162018-02-18 22:04:55 +01001024 setverdict(pass);
1025 }
1026 [] as_xid(apars);
1027 }
1028}
1029
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001030function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false) runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001031 var Gtp1cUnitdata g_ud;
1032 var integer seq_nr := 23;
1033 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1034
Alexander Couzens0e510e62018-07-28 23:06:00 +02001035 BSSGP[0].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001036 if (error_ind) {
1037 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1038 } else {
1039 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1040 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001041
1042 timer T := 5.0;
1043 T.start;
1044
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001045 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001046 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001047 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Harald Welte57b9b7f2018-02-18 22:28:13 +01001048 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001049 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1050 repeat;
1051 }
1052 [] T.timeout {
1053 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1054 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001055 }
1056}
1057
Harald Welte6f203162018-02-18 22:04:55 +01001058
Harald Welteeded9ad2018-02-17 20:57:34 +01001059/* Table 10.5.156/3GPP TS 24.008 */
1060template (value) QoSV t_QosDefault := {
1061 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1062 delayClass := '100'B, /* best effort */
1063 spare1 := '00'B,
1064 precedenceClass := '010'B, /* normal */
1065 spare2 := '0'B,
1066 peakThroughput := '0000'B, /* subscribed */
1067 meanThroughput := '00000'B, /* subscribed */
1068 spare3 := '000'B,
1069 deliverErroneusSDU := omit,
1070 deliveryOrder := omit,
1071 trafficClass := omit,
1072 maxSDUSize := omit,
1073 maxBitrateUplink := omit,
1074 maxBitrateDownlink := omit,
1075 sduErrorRatio := omit,
1076 residualBER := omit,
1077 trafficHandlingPriority := omit,
1078 transferDelay := omit,
1079 guaranteedBitRateUplink := omit,
1080 guaranteedBitRateDownlink := omit,
1081 sourceStatisticsDescriptor := omit,
1082 signallingIndication := omit,
1083 spare4 := omit,
1084 maxBitrateDownlinkExt := omit,
1085 guaranteedBitRateDownlinkExt := omit,
1086 maxBitrateUplinkExt := omit,
1087 guaranteedBitRateUplinkExt := omit,
1088 maxBitrateDownlinkExt2 := omit,
1089 guaranteedBitRateDownlinkExt2 := omit,
1090 maxBitrateUplinkExt2 := omit,
1091 guaranteedBitRateUplinkExt2 := omit
1092}
1093
1094/* 10.5.6.4 / 3GPP TS 24.008 */
1095template (value) PDPAddressV t_AddrIPv4dyn := {
1096 pdpTypeOrg := '0001'B, /* IETF */
1097 spare := '0000'B,
1098 pdpTypeNum := '21'O, /* IPv4 */
1099 addressInfo := omit
1100}
1101template (value) PDPAddressV t_AddrIPv6dyn := {
1102 pdpTypeOrg := '0001'B, /* IETF */
1103 spare := '0000'B,
1104 pdpTypeNum := '53'O, /* IPv6 */
1105 addressInfo := omit
1106}
1107
Harald Welte37692d82018-02-18 15:21:34 +01001108template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001109 tid := '000'B,
1110 nsapi := '0101'B, /* < 5 are reserved */
1111 sapi := '0011'B, /* 3/5/9/11 */
1112 qos := t_QosDefault,
1113 addr := t_AddrIPv4dyn,
1114 apn := omit,
1115 pco := omit,
1116 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001117 gtp_resp_cause := int2oct(128, 1),
1118 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001119
1120 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001121 ggsn_tei_c := f_rnd_octstring(4),
1122 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001123 ggsn_ip_c := f_inet_addr(ggsn_ip),
1124 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001125 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001126
Harald Welteeded9ad2018-02-17 20:57:34 +01001127 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001128 sgsn_tei_u := omit,
1129 sgsn_ip_c := omit,
1130 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001131}
1132
Harald Welte37692d82018-02-18 15:21:34 +01001133template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1134 connId := 1,
1135 remName := f_inet_ntoa(ip),
1136 remPort := GTP1U_PORT
1137}
1138
1139template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1140 connId := 1,
1141 remName := f_inet_ntoa(ip),
1142 remPort := GTP1C_PORT
1143}
1144
1145private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1146 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1147 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1148}
1149
1150private altstep as_xid(PdpActPars apars) runs on BSSGP_ConnHdlr {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001151 [] BSSGP[0].receive(tr_BD_LLC(tr_LLC_XID(?, apars.sapi))) {
Harald Welte37692d82018-02-18 15:21:34 +01001152 repeat;
1153 }
1154}
1155
1156template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1157 pDU_SN_UNITDATA := {
1158 nsapi := nsapi,
1159 moreBit := ?,
1160 snPduType := '1'B,
1161 firstSegmentIndicator := ?,
1162 spareBit := ?,
1163 pcomp := ?,
1164 dcomp := ?,
1165 npduNumber := ?,
1166 segmentNumber := ?,
1167 npduNumberContinued := ?,
1168 dataSegmentSnUnitdataPdu := payload
1169 }
1170}
1171
1172/* simple case: single segment, no compression */
1173template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1174 pDU_SN_UNITDATA := {
1175 nsapi := nsapi,
1176 moreBit := '0'B,
1177 snPduType := '1'B,
1178 firstSegmentIndicator := '1'B,
1179 spareBit := '0'B,
1180 pcomp := '0000'B,
1181 dcomp := '0000'B,
1182 npduNumber := '0000'B,
1183 segmentNumber := '0000'B,
1184 npduNumberContinued := '00'O,
1185 dataSegmentSnUnitdataPdu := payload
1186 }
1187}
1188
1189/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
1190private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1191 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1192 f_gtpu_send(apars, payload);
1193 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1194 alt {
1195 [] as_xid(apars);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001196 [] BSSGP[0].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
Harald Welte37692d82018-02-18 15:21:34 +01001197 }
1198}
1199
Pau Espin Pedrol8be4d192018-07-18 13:43:44 +02001200/* Transceive given 'payload' as MT message from Gb -> OsmoSGSN -> GTP */
Harald Welte37692d82018-02-18 15:21:34 +01001201private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1202 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1203 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1204 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001205 BSSGP[0].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
Harald Welte37692d82018-02-18 15:21:34 +01001206 /* Expect PDU via GTP from SGSN on simulated GGSN */
1207 alt {
1208 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1209 }
1210}
1211
Harald Welteeded9ad2018-02-17 20:57:34 +01001212private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001213 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001214
1215 /* first perform regular attach */
1216 f_TC_attach(id);
1217
1218 f_pdp_ctx_act(apars);
1219}
1220testcase TC_attach_pdp_act() runs on test_CT {
1221 var BSSGP_ConnHdlr vc_conn;
1222 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001223 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001224 vc_conn.done;
1225}
Harald Welteb2124b22018-02-16 22:26:56 +01001226
Harald Welte835b15f2018-02-18 14:39:11 +01001227/* PDP Context activation for not-attached subscriber; expect fail */
1228private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001229 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001230 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
Harald Welte835b15f2018-02-18 14:39:11 +01001231 apars.apn, apars.pco));
1232 alt {
1233 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001234 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001235 setverdict(pass);
1236 }
1237 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1238 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001239 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001240 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001241 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001242 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001243 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001244 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001245 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001246 }
1247}
1248testcase TC_pdp_act_unattached() runs on test_CT {
1249 var BSSGP_ConnHdlr vc_conn;
1250 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001251 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001252 vc_conn.done;
1253}
1254
Harald Welte37692d82018-02-18 15:21:34 +01001255/* ATTACH + PDP CTX ACT + user plane traffic */
1256private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1257 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1258
1259 /* first perform regular attach */
1260 f_TC_attach(id);
1261 /* then activate PDP context */
1262 f_pdp_ctx_act(apars);
1263 /* then transceive a downlink PDU */
1264 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1265 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1266}
1267testcase TC_attach_pdp_act_user() runs on test_CT {
1268 var BSSGP_ConnHdlr vc_conn;
1269 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001270 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001271 vc_conn.done;
1272}
1273
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001274/* ATTACH + PDP CTX ACT; reject from GGSN */
1275private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1276 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1277
1278 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1279 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1280
1281 /* first perform regular attach */
1282 f_TC_attach(id);
1283 /* then activate PDP context */
1284 f_pdp_ctx_act(apars);
1285}
1286testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1287 var BSSGP_ConnHdlr vc_conn;
1288 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001289 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001290 vc_conn.done;
1291}
Harald Welte835b15f2018-02-18 14:39:11 +01001292
Harald Welte6f203162018-02-18 22:04:55 +01001293/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1294private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1295 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1296
1297 /* first perform regular attach */
1298 f_TC_attach(id);
1299 /* then activate PDP context */
1300 f_pdp_ctx_act(apars);
1301 /* then transceive a downlink PDU */
1302 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1303 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1304
1305 f_pdp_ctx_deact_mo(apars, '00'O);
1306}
1307testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1308 var BSSGP_ConnHdlr vc_conn;
1309 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001310 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 +01001311 vc_conn.done;
1312}
1313
Harald Welte57b9b7f2018-02-18 22:28:13 +01001314/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1315private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1316 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1317
1318 /* first perform regular attach */
1319 f_TC_attach(id);
1320 /* then activate PDP context */
1321 f_pdp_ctx_act(apars);
1322 /* then transceive a downlink PDU */
1323 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1324 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1325
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001326 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001327}
1328testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1329 var BSSGP_ConnHdlr vc_conn;
1330 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001331 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 +01001332 vc_conn.done;
1333}
1334
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001335/* ATTACH + ATTACH (2nd) */
1336private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1337 g_pars.t_guard := 5.0;
1338
1339 /* first perform regular attach */
1340 f_TC_attach(id);
1341
1342 /* second to perform regular attach */
1343 f_TC_attach(id);
1344}
1345
1346
1347testcase TC_attach_second_attempt() runs on test_CT {
1348 var BSSGP_ConnHdlr vc_conn;
1349 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001350 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001351 vc_conn.done;
1352}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001353
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001354private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001355 var Gtp1cUnitdata g_ud;
1356 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1357
1358 /* first perform regular attach */
1359 f_TC_attach(id);
1360 /* Activate a pdp context against the GGSN */
1361 f_pdp_ctx_act(apars);
1362 /* Wait to receive first echo request and send initial Restart counter */
1363 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1364 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1365 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1366 }
1367 /* Wait to receive second echo request and send incremented Restart
1368 counter. This will fake a restarted GGSN, and pdp ctx allocated
1369 should be released by SGSN */
1370 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1371 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1372 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1373 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1374 }
1375 var OCT1 cause_network_failure := int2oct(38, 1)
1376 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001377 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true))) {
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001378 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001379 setverdict(pass);
1380 }
1381 [] as_xid(apars);
1382 }
1383 setverdict(pass);
1384}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001385/* ATTACH + trigger Recovery procedure through EchoResp */
1386testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001387 var BSSGP_ConnHdlr vc_conn;
1388 g_use_echo := true
1389 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001390 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 +02001391 vc_conn.done;
1392 g_use_echo := false
1393}
1394
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001395private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1396 var Gtp1cUnitdata g_ud;
1397 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1398 var integer seq_nr := 23;
1399 var GtpPeer peer;
1400 /* first perform regular attach */
1401 f_TC_attach(id);
1402
1403 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1404 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1405 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1406 f_pdp_ctx_act(apars, true);
1407
1408 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1409/* received. */
1410 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1411
1412 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1413 would be great to have an active pdp context here before triggering
1414 Recovery, and making sure the the DEACT request is sent by the SGSN.
1415 */
1416
1417 /* Activate a pdp context against the GGSN, send incremented Recovery
1418 IE. This should trigger the recovery path, but still this specific
1419 CTX activation should work. */
1420 apars.exp_rej_cause := omit; /* default value for tests */
1421 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
1422 f_pdp_ctx_act(apars, true);
1423
1424 setverdict(pass);
1425}
1426/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1427testcase TC_attach_restart_ctr_create() runs on test_CT {
1428 var BSSGP_ConnHdlr vc_conn;
1429 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001430 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 +02001431 vc_conn.done;
1432}
1433
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001434/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
1435private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
1436 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1437 var integer seq_nr := 23;
1438 var GtpPeer peer;
1439 var integer i;
1440
1441 /* first perform regular attach */
1442 f_TC_attach(id);
1443 /* then activate PDP context */
1444 f_pdp_ctx_act(apars);
1445
Alexander Couzens0e510e62018-07-28 23:06:00 +02001446 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001447 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1448 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1449
1450 for (i := 0; i < 5; i := i+1) {
1451 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001452 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001453 [] as_xid(apars);
1454 }
1455 }
1456
1457 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
1458
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001459 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001460 setverdict(pass);
1461}
1462testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
1463 var BSSGP_ConnHdlr vc_conn;
1464 f_init();
1465 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001466 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 +02001467 vc_conn.done;
1468}
1469
Alexander Couzens5e307b42018-05-22 18:12:20 +02001470private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
1471 /* MS: perform regular attach */
1472 f_TC_attach(id);
1473
1474 /* HLR: cancel the location request */
1475 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
1476 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02001477
1478 /* ensure no Detach Request got received */
1479 timer T := 5.0;
1480 T.start;
1481 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001482 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(*, *, *))) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001483 T.stop;
1484 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02001485 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001486 }
1487 [] T.timeout {
1488 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02001489 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001490 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001491 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001492 repeat;
1493 }
1494 }
1495}
1496
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001497/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
1498private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
1499 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1500
1501 /* first perform regular attach */
1502 f_TC_attach(id);
1503 /* then activate PDP context */
1504 f_pdp_ctx_act(apars);
1505 /* then transceive a downlink PDU */
1506 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1507
1508 /* Send Error indication as response from upload PDU and expect deact towards MS */
1509 f_pdp_ctx_deact_mt(apars, true);
1510}
1511testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
1512 var BSSGP_ConnHdlr vc_conn;
1513 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001514 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 +02001515 vc_conn.done;
1516}
1517
Alexander Couzens5e307b42018-05-22 18:12:20 +02001518testcase TC_hlr_location_cancel_request_update() runs on test_CT {
1519 /* MS <-> SGSN: GMM Attach
1520 * HLR -> SGSN: Cancel Location Request
1521 * HLR <- SGSN: Cancel Location Ack
1522 */
1523 var BSSGP_ConnHdlr vc_conn;
1524 f_init();
1525 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001526 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02001527 vc_conn.done;
1528}
1529
1530
Alexander Couzensc87967a2018-05-22 16:09:54 +02001531private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
1532 /* MS: perform regular attach */
1533 f_TC_attach(id);
1534
1535 /* HLR: cancel the location request */
1536 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
1537 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
1538 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
1539
1540 /* MS: receive a Detach Request */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001541 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?)));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001542 f_send_l3_gmm_llc(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001543
1544 setverdict(pass);
1545}
1546
1547testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
1548 /* MS <-> SGSN: GMM Attach
1549 * HLR -> SGSN: Cancel Location Request
1550 * HLR <- SGSN: Cancel Location Ack
1551 * MS <- SGSN: Detach Request
1552 * SGSN-> MS: Detach Complete
1553 */
1554 var BSSGP_ConnHdlr vc_conn;
1555 f_init();
1556 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001557 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001558 vc_conn.done;
1559}
1560
1561
Alexander Couzens6c47f292018-05-22 17:09:49 +02001562private function f_hlr_location_cancel_request_unknown_subscriber(
1563 charstring id,
1564 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
1565
1566 /* HLR: cancel the location request */
1567 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
1568
1569 /* cause 2 = IMSI_UNKNOWN */
1570 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
1571
1572 setverdict(pass);
1573}
1574
1575private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001576 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001577}
1578
1579testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
1580 /* HLR -> SGSN: Cancel Location Request
1581 * HLR <- SGSN: Cancel Location Error
1582 */
1583
1584 var BSSGP_ConnHdlr vc_conn;
1585 f_init();
1586 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001587 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 +02001588 vc_conn.done;
1589}
1590
1591private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001592 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001593}
1594
1595testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
1596 /* HLR -> SGSN: Cancel Location Request
1597 * HLR <- SGSN: Cancel Location Error
1598 */
1599
1600 var BSSGP_ConnHdlr vc_conn;
1601 f_init();
1602 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001603 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 +02001604 vc_conn.done;
1605}
1606
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001607private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
1608 f_TC_attach(id);
1609 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1610}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001611
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001612testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
1613 /* MS <-> SGSN: Attach
1614 * MS -> SGSN: Detach Req (Power off)
1615 * VTY -> SGSN: Check if MS is NOT in subscriber cache
1616 */
1617 var BSSGP_ConnHdlr vc_conn;
1618 var integer id := 33;
1619 var charstring imsi := hex2str(f_gen_imsi(id));
1620
1621 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001622 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001623 vc_conn.done;
1624
1625 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1626}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001627
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001628/* Attempt an attach, but loose the Identification Request (IMEI) */
1629private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
1630 var integer count_req := 0;
1631 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1632
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001633 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001634
1635 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001636 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001637 /* break */
1638 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001639 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001640 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001641 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001642 repeat;
1643 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001644 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001645 /* ignore ID REQ IMEI */
1646 count_req := count_req + 1;
1647 repeat;
1648 }
1649 }
1650 if (count_req != 5) {
1651 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001652 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001653 }
1654 setverdict(pass);
1655}
1656
1657testcase TC_attach_no_imei_response() runs on test_CT {
1658 /* MS -> SGSN: Attach Request IMSI
1659 * MS <- SGSN: Identity Request IMSI (optional)
1660 * MS -> SGSN: Identity Response IMSI (optional)
1661 * MS <- SGSN: Identity Request IMEI
1662 * MS -x SGSN: no response
1663 * MS <- SGSN: re-send: Identity Request IMEI 4x
1664 * MS <- SGSN: Attach Reject
1665 */
1666 var BSSGP_ConnHdlr vc_conn;
1667 f_init();
1668 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001669 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 +02001670 vc_conn.done;
1671}
1672
Alexander Couzens53f20562018-06-12 16:24:12 +02001673/* Attempt an attach, but loose the Identification Request (IMSI) */
1674private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
1675 var integer count_req := 0;
1676 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1677
1678 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
1679 g_pars.p_tmsi := 'c0000035'O;
1680
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001681 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens53f20562018-06-12 16:24:12 +02001682
1683 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001684 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001685 /* break */
1686 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001687 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001688 /* ignore ID REQ IMSI */
1689 count_req := count_req + 1;
1690 repeat;
1691 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001692 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001693 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001694 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02001695 repeat;
1696 }
1697 }
1698 if (count_req != 5) {
1699 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001700 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02001701 }
1702 setverdict(pass);
1703}
1704
1705testcase TC_attach_no_imsi_response() runs on test_CT {
1706 /* MS -> SGSN: Attach Request TMSI (unknown)
1707 * MS <- SGSN: Identity Request IMEI (optional)
1708 * MS -> SGSN: Identity Response IMEI (optional)
1709 * MS <- SGSN: Identity Request IMSI
1710 * MS -x SGSN: no response
1711 * MS <- SGSN: re-send: Identity Request IMSI 4x
1712 * MS <- SGSN: Attach Reject
1713 */
1714 var BSSGP_ConnHdlr vc_conn;
1715 f_init();
1716 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001717 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 +02001718 vc_conn.done;
1719}
1720
Alexander Couzenscf818962018-06-05 18:00:00 +02001721private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
1722 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
1723}
1724
1725testcase TC_attach_check_subscriber_list() runs on test_CT {
1726 /* MS <-> SGSN: Attach
1727 * VTY -> SGSN: Check if MS is in subscriber cache
1728 */
1729 var BSSGP_ConnHdlr vc_conn;
1730 var integer id := 34;
1731 var charstring imsi := hex2str(f_gen_imsi(id));
1732
1733 f_init();
1734 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001735 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02001736 vc_conn.done;
1737
1738 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1739 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
1740}
1741
Alexander Couzensf9858652018-06-07 16:14:53 +02001742private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
1743 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1744 var BssgpDecoded bd;
1745
1746 /* unregister the old IMSI */
1747 f_bssgp_client_unregister(g_pars.imsi);
1748 /* Simulate a foreign IMSI */
1749 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +02001750 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Alexander Couzensf9858652018-06-07 16:14:53 +02001751
1752 /* there is no auth */
1753 g_pars.net.expect_auth := false;
1754
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001755 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02001756 f_gmm_auth();
1757 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001758 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzensf9858652018-06-07 16:14:53 +02001759 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001760 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02001761 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001762 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
Alexander Couzensf9858652018-06-07 16:14:53 +02001763 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001764 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02001765 setverdict(pass);
1766 }
1767 }
1768}
1769testcase TC_attach_closed_add_vty() runs on test_CT {
1770 /* VTY-> SGSN: policy close
1771 * MS -> SGSN: Attach Request
1772 * MS <- SGSN: Identity Request IMSI
1773 * MS -> SGSN: Identity Response IMSI
1774 * MS <- SGSN: Attach Reject
1775 * VTY-> SGSN: policy imsi-acl add IMSI
1776 * MS -> SGSN: Attach Request
1777 * MS <- SGSN: Identity Request IMSI
1778 * MS -> SGSN: Identity Response IMSI
1779 * MS <- SGSN: Identity Request IMEI
1780 * MS -> SGSN: Identity Response IMEI
1781 * MS <- SGSN: Attach Accept
1782 */
1783 var BSSGP_ConnHdlr vc_conn;
1784 f_init();
1785 f_sleep(1.0);
1786 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1787 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
1788 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001789 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02001790 vc_conn.done;
1791 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456789");
1792 /* test with same IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001793 vc_conn := f_start_handler(refers(f_TC_attach_closed_imsi_added), testcasename(), g_gb, 10);
Alexander Couzensf9858652018-06-07 16:14:53 +02001794 vc_conn.done;
1795}
1796
Alexander Couzens0085bd72018-06-12 19:08:44 +02001797/* Attempt an attach, but never answer a Attach Complete */
1798private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
1799 var integer count_req := 0;
1800
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001801 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens0085bd72018-06-12 19:08:44 +02001802 f_gmm_auth();
1803
1804 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001805 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001806 /* break */
1807 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001808 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001809 /* ignore */
1810 count_req := count_req + 1;
1811 repeat;
1812 }
1813 }
1814 if (count_req != 5) {
1815 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02001816 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02001817 }
1818 setverdict(pass);
1819}
1820
1821testcase TC_attach_check_complete_resend() runs on test_CT {
1822 /* MS -> SGSN: Attach Request IMSI
1823 * MS <- SGSN: Identity Request *
1824 * MS -> SGSN: Identity Response *
1825 * MS <- SGSN: Attach Complete 5x
1826 */
1827 var BSSGP_ConnHdlr vc_conn;
1828 f_init();
1829 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001830 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 +02001831 vc_conn.done;
1832}
1833
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001834private function f_routing_area_update(RoutingAreaIdentificationV ra, integer bssgp := 0) runs on BSSGP_ConnHdlr {
1835 var BssgpDecoded bd;
1836
1837 /* then send RAU */
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001838 f_send_l3_gmm_llc(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit), bssgp);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001839 alt {
1840 [] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
1841 f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept);
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001842 f_send_l3_gmm_llc(ts_GMM_RAU_COMPL, bssgp);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001843 setverdict(pass);
1844 }
1845 [] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
1846 setverdict(fail, "Unexpected RAU Reject");
1847 mtc.stop;
1848 }
1849 [] BSSGP[bssgp].receive { repeat; }
1850 }
1851}
1852
Alexander Couzensbfda9212018-07-31 03:17:33 +02001853private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
1854 var BssgpDecoded bd;
1855
1856 /* first perform regular attach */
1857 f_TC_attach(id);
1858
1859 /* then send RAU */
1860 f_routing_area_update(g_pars.ra);
1861
1862 /* do another RAU */
1863 f_routing_area_update(g_pars.ra);
1864
1865 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1866}
1867
1868testcase TC_attach_rau_a_a() runs on test_CT {
1869 /* MS <-> SGSN: Successful Attach
1870 * MS -> SGSN: Routing Area Update Request
1871 * MS <- SGSN: Routing Area Update Accept
1872 * MS -> SGSN: Routing Area Update Request
1873 * MS <- SGSN: Routing Area Update Accept
1874 * MS -> SGSN: Detach (PowerOff)
1875 */
1876 var BSSGP_ConnHdlr vc_conn;
1877 f_init();
1878 f_sleep(1.0);
1879 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
1880 vc_conn.done;
1881}
1882
Harald Welte5ac31492018-02-15 20:39:13 +01001883control {
Harald Welte5b7c8122018-02-16 21:48:17 +01001884 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01001885 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001886 execute( TC_attach_umts_aka_umts_res() );
1887 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001888 execute( TC_attach_auth_id_timeout() );
1889 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01001890 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001891 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01001892 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01001893 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01001894 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01001895 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001896 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02001897 execute( TC_attach_no_imsi_response() );
Alexander Couzensf9858652018-06-07 16:14:53 +02001898 execute( TC_attach_closed_add_vty(), 10.0 );
Alexander Couzenscf818962018-06-05 18:00:00 +02001899 execute( TC_attach_check_subscriber_list(), 10.0 );
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001900 execute( TC_attach_detach_check_subscriber_list(), 10.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02001901 execute( TC_attach_check_complete_resend() );
Alexander Couzens5e307b42018-05-22 18:12:20 +02001902 execute( TC_hlr_location_cancel_request_update(), 10.0 );
Alexander Couzens234c5882018-05-29 15:48:44 +02001903 execute( TC_hlr_location_cancel_request_withdraw(), 10.0 );
1904 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 10.0 );
1905 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 10.0 );
Harald Welte04683d02018-02-16 22:43:45 +01001906 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01001907 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02001908 execute( TC_attach_rau_a_a() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01001909 execute( TC_detach_unknown_nopoweroff() );
1910 execute( TC_detach_unknown_poweroff() );
1911 execute( TC_detach_nopoweroff() );
1912 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01001913 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01001914 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01001915 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001916 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01001917 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01001918 execute( TC_attach_pdp_act_user_deact_mt() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001919 execute( TC_attach_second_attempt() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001920 execute( TC_attach_restart_ctr_echo() );
1921 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001922 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001923 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Harald Welte5ac31492018-02-15 20:39:13 +01001924}
Harald Welte96a33b02018-02-04 10:36:22 +01001925
1926
1927
1928}