blob: edc19bcf96b9e08cb3c0de77477da7a4e49970fa [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
Alexander Couzensf3c1b412018-08-24 00:42:51 +020047 NSConfigurations mp_nsconfig := {
48 {
49 local_udp_port := 21010,
50 local_ip := "127.0.0.1",
51 remote_udp_port := 23000,
52 remote_ip := "127.0.0.1",
53 nsvci := 97,
54 nsei := 96
55 },
56 {
57 local_udp_port := 21011,
58 local_ip := "127.0.0.1",
59 remote_udp_port := 23000,
60 remote_ip := "127.0.0.1",
61 nsvci := 98,
62 nsei := 97
63 },
64 {
65 local_udp_port := 21012,
66 local_ip := "127.0.0.1",
67 remote_udp_port := 23000,
68 remote_ip := "127.0.0.1",
69 nsvci := 99,
70 nsei := 98
71 }
Alexander Couzens2c12b242018-07-31 00:30:11 +020072 };
Harald Welte5ac31492018-02-15 20:39:13 +010073};
74
75type record GbInstance {
76 NS_CT vc_NS,
77 BSSGP_CT vc_BSSGP,
78 BssgpConfig cfg
79};
Harald Welte96a33b02018-02-04 10:36:22 +010080
Alexander Couzens51114d12018-07-31 18:41:56 +020081type record length(3) of GbInstance GbInstances;
Alexander Couzensf3c1b412018-08-24 00:42:51 +020082type record length(3) of NSConfiguration NSConfigurations;
Alexander Couzens51114d12018-07-31 18:41:56 +020083type record length(3) of BssgpCellId BssgpCellIds;
84
Harald Welte96a33b02018-02-04 10:36:22 +010085type component test_CT {
Alexander Couzens51114d12018-07-31 18:41:56 +020086 var GbInstances g_gb;
Harald Welte96a33b02018-02-04 10:36:22 +010087
Harald Welte5ac31492018-02-15 20:39:13 +010088 var GSUP_Emulation_CT vc_GSUP;
89 var IPA_Emulation_CT vc_GSUP_IPA;
90 /* only to get events from IPA underneath GSUP */
91 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +010092
Harald Welteeded9ad2018-02-17 20:57:34 +010093 var GTP_Emulation_CT vc_GTP;
94
Harald Weltebd194722018-02-16 22:11:08 +010095 port TELNETasp_PT SGSNVTY;
96
Harald Welte96a33b02018-02-04 10:36:22 +010097 var boolean g_initialized := false;
Pau Espin Pedroldc27e482018-07-10 14:02:49 +020098 var boolean g_use_echo := false;
Harald Welte96a33b02018-02-04 10:36:22 +010099};
100
Harald Welteeded9ad2018-02-17 20:57:34 +0100101type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100102 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +0100103 timer g_Tguard;
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200104 var LLC_Entities llc;
Harald Welte5ac31492018-02-15 20:39:13 +0100105}
106
107type record SGSN_ConnHdlrNetworkPars {
108 boolean expect_ptmsi,
109 boolean expect_auth,
110 boolean expect_ciph
111};
112
113type record BSSGP_ConnHdlrPars {
114 /* IMEI of the simulated ME */
115 hexstring imei,
Alexander Couzens8f0fb002018-05-02 19:30:55 +0200116 /* IMSI of the simulated MS */
Harald Welte5ac31492018-02-15 20:39:13 +0100117 hexstring imsi,
118 /* MSISDN of the simulated MS (probably unused) */
119 hexstring msisdn,
120 /* P-TMSI allocated to the simulated MS */
121 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +0100122 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100123 /* TLLI of the simulated MS */
124 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +0100125 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100126 RoutingAreaIdentificationV ra optional,
Alexander Couzens51114d12018-07-31 18:41:56 +0200127 BssgpCellIds bssgp_cell_id,
Harald Welte5ac31492018-02-15 20:39:13 +0100128 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +0100129 SGSN_ConnHdlrNetworkPars net,
130 float t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100131};
132
Alexander Couzens89508702018-07-31 04:16:10 +0200133private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {
134 var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;
135
136 var RoutingAreaIdentificationV ret := {
137 mccDigit1 := mcc_mnc[0],
138 mccDigit2 := mcc_mnc[1],
139 mccDigit3 := mcc_mnc[2],
140 mncDigit3 := mcc_mnc[5],
141 mncDigit1 := mcc_mnc[3],
142 mncDigit2 := mcc_mnc[4],
143 lac := int2oct(cell_id.ra_id.lai.lac, 16),
144 rac := int2oct(cell_id.ra_id.rac, 8)
145 }
146 return ret;
147};
148
Alexander Couzens51114d12018-07-31 18:41:56 +0200149private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
150 gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset));
151 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset));
Harald Welte5ac31492018-02-15 20:39:13 +0100152 /* connect lower end of BSSGP emulation with NS upper port */
153 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
154 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
155 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
156
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200157 gb.vc_NS.start(NSStart(mp_nsconfig[offset]));
Harald Welte5ac31492018-02-15 20:39:13 +0100158 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
159}
160
161private function f_init_gsup(charstring id) runs on test_CT {
162 id := id & "-GSUP";
163 var GsupOps ops := {
164 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
165 };
166
167 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
168 vc_GSUP := GSUP_Emulation_CT.create(id);
169
170 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
171 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
172 /* we use this hack to get events like ASP_IPA_EVENT_UP */
173 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
174
175 vc_GSUP.start(GSUP_Emulation.main(ops, id));
176 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
177
178 /* wait for incoming connection to GSUP port before proceeding */
179 timer T := 10.0;
180 T.start;
181 alt {
182 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
183 [] T.timeout {
184 setverdict(fail, "No connection to GSUP Port");
Daniel Willmannafce8662018-07-06 23:11:32 +0200185 mtc.stop;
Harald Welte5ac31492018-02-15 20:39:13 +0100186 }
187 }
188}
189
Harald Welteeded9ad2018-02-17 20:57:34 +0100190private function f_init_gtp(charstring id) runs on test_CT {
191 id := id & "-GTP";
192
193 var GtpEmulationCfg gtp_cfg := {
194 gtpc_bind_ip := mp_ggsn_ip,
195 gtpc_bind_port := GTP1C_PORT,
196 gtpu_bind_ip := mp_ggsn_ip,
197 gtpu_bind_port := GTP1U_PORT,
198 sgsn_role := false
199 };
200
201 vc_GTP := GTP_Emulation_CT.create(id);
202 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
203}
204
Harald Weltebd194722018-02-16 22:11:08 +0100205private function f_init_vty() runs on test_CT {
206 map(self:SGSNVTY, system:SGSNVTY);
207 f_vty_set_prompts(SGSNVTY);
208 f_vty_transceive(SGSNVTY, "enable");
209 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
210}
211
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200212private function f_vty_enable_echo_interval(boolean enable) runs on test_CT {
213 if (enable) {
214 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 echo-interval 5");
215 } else {
216 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 no echo-interval");
217 }
218}
219
Harald Weltebd194722018-02-16 22:11:08 +0100220
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100221function f_init(BcdMccMnc mcc_mnc := '26242F'H) runs on test_CT {
Harald Welte96a33b02018-02-04 10:36:22 +0100222 if (g_initialized == true) {
223 return;
224 }
225 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100226 g_gb[0].cfg := {
227 nsei := 96,
228 bvci := 196,
229 cell_id := {
230 ra_id := {
231 lai := {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100232 mcc_mnc := mcc_mnc, lac := 13135},
Harald Welte5ac31492018-02-15 20:39:13 +0100233 rac := 0
234 },
235 cell_id := 20960
236 },
237 sgsn_role := false
238 };
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200239 g_gb[1].cfg := {
240 nsei := 97,
241 bvci := 210,
242 cell_id := {
243 ra_id := {
244 lai := {
245 mcc_mnc := mcc_mnc, lac := 13200},
246 rac := 0
247 },
248 cell_id := 20961
249 },
250 sgsn_role := false
251 };
252 g_gb[2].cfg := {
253 nsei := 98,
254 bvci := 220,
255 cell_id := {
256 ra_id := {
257 lai := {
258 mcc_mnc := mcc_mnc, lac := 13300},
259 rac := 0
260 },
261 cell_id := 20962
262 },
263 sgsn_role := false
264 };
Harald Welte96a33b02018-02-04 10:36:22 +0100265
Alexander Couzens51114d12018-07-31 18:41:56 +0200266 f_init_gb(g_gb[0], "SGSN_Test-Gb0", 0);
267 f_init_gb(g_gb[1], "SGSN_Test-Gb1", 1);
268 f_init_gb(g_gb[2], "SGSN_Test-Gb2", 2);
Harald Welte5ac31492018-02-15 20:39:13 +0100269 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100270 f_init_gtp("SGSN_Test");
Harald Weltebd194722018-02-16 22:11:08 +0100271 f_init_vty();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200272 f_vty_enable_echo_interval(g_use_echo);
Harald Welte5ac31492018-02-15 20:39:13 +0100273}
Harald Welte96a33b02018-02-04 10:36:22 +0100274
Harald Welte5ac31492018-02-15 20:39:13 +0100275type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
276
277/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Alexander Couzens51114d12018-07-31 18:41:56 +0200278function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix,
Harald Welte62e29582018-02-16 21:17:11 +0100279 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100280runs on test_CT return BSSGP_ConnHdlr {
281 var BSSGP_ConnHdlr vc_conn;
282 var SGSN_ConnHdlrNetworkPars net_pars := {
283 expect_ptmsi := true,
284 expect_auth := true,
285 expect_ciph := false
286 };
287 var BSSGP_ConnHdlrPars pars := {
288 imei := f_gen_imei(imsi_suffix),
289 imsi := f_gen_imsi(imsi_suffix),
290 msisdn := f_gen_msisdn(imsi_suffix),
291 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100292 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100293 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100294 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100295 ra := omit,
Alexander Couzens51114d12018-07-31 18:41:56 +0200296 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 +0100297 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100298 net := net_pars,
299 t_guard := t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100300 };
301
302 vc_conn := BSSGP_ConnHdlr.create(id);
Alexander Couzens51114d12018-07-31 18:41:56 +0200303 connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP:BSSGP_SP);
304 connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP:BSSGP_PROC);
305 connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP:BSSGP_SP);
306 connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP:BSSGP_PROC);
307 connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP:BSSGP_SP);
308 connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP:BSSGP_PROC);
Harald Welte5ac31492018-02-15 20:39:13 +0100309
310 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
311 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
312
Harald Welteeded9ad2018-02-17 20:57:34 +0100313 connect(vc_conn:GTP, vc_GTP:CLIENT);
314 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
315
Harald Welte5ac31492018-02-15 20:39:13 +0100316 vc_conn.start(f_handler_init(fn, id, pars));
317 return vc_conn;
318}
319
Harald Welte62e29582018-02-16 21:17:11 +0100320private altstep as_Tguard() runs on BSSGP_ConnHdlr {
321 [] g_Tguard.timeout {
322 setverdict(fail, "Tguard timeout");
Daniel Willmannafce8662018-07-06 23:11:32 +0200323 mtc.stop;
Harald Welte62e29582018-02-16 21:17:11 +0100324 }
325}
326
Harald Welte5ac31492018-02-15 20:39:13 +0100327/* first function called in every ConnHdlr */
328private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
329runs on BSSGP_ConnHdlr {
330 /* do some common stuff like setting up g_pars */
331 g_pars := pars;
332
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200333 llc := f_llc_create(false);
334
Harald Welte5ac31492018-02-15 20:39:13 +0100335 /* register with BSSGP core */
Alexander Couzens51114d12018-07-31 18:41:56 +0200336 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welte5ac31492018-02-15 20:39:13 +0100337 /* tell GSUP dispatcher to send this IMSI to us */
338 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100339 /* tell GTP dispatcher to send this IMSI to us */
340 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100341
Harald Welte62e29582018-02-16 21:17:11 +0100342 g_Tguard.start(pars.t_guard);
343 activate(as_Tguard());
344
Harald Welte5ac31492018-02-15 20:39:13 +0100345 /* call the user-supplied test case function */
346 fn.apply(id);
347 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100348}
349
350/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100351 * Detach without Attach
352 * SM procedures without attach / RAU
353 * ATTACH / RAU
354 ** with / without authentication
355 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100356 * re-transmissions of LLC frames
357 * PDP Context activation
358 ** with different GGSN config in SGSN VTY
359 ** with different PDP context type (v4/v6/v46)
360 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100361 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100362 */
363
364testcase TC_wait_ns_up() runs on test_CT {
365 f_init();
366 f_sleep(20.0);
367}
368
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200369function f_send_l3_gmm_llc(template PDU_L3_MS_SGSN l3_mo, integer gb_index := 0) runs on BSSGP_ConnHdlr {
370 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
371 var BIT4 sapi := f_llc_sapi_by_l3_mo(valueof(l3_mo));
372 var integer n_u := f_llc_get_n_u_tx(llc[bit2int(sapi)]);
373 var octetstring llc_enc := enc_PDU_LLC(valueof(ts_LLC_UI(l3_enc, sapi, '0'B, n_u)));
374 BSSGP[gb_index].send(ts_BSSGP_UL_UD(g_pars.tlli, g_pars.bssgp_cell_id[gb_index], llc_enc));
375}
376
Harald Welte5ac31492018-02-15 20:39:13 +0100377altstep as_mm_identity() runs on BSSGP_ConnHdlr {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100378 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200379 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Harald Welte5ac31492018-02-15 20:39:13 +0100380 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200381 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Harald Welte5ac31492018-02-15 20:39:13 +0100382 repeat;
383 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200384 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Harald Welte5ac31492018-02-15 20:39:13 +0100385 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200386 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Harald Welte5ac31492018-02-15 20:39:13 +0100387 repeat;
388 }
389}
Harald Welte96a33b02018-02-04 10:36:22 +0100390
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200391/* perform GMM authentication (if expected).
392 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
393 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
394function f_gmm_auth (boolean umts_aka_challenge := false, boolean force_gsm_sres := false) runs on BSSGP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100395 var BssgpDecoded bd;
396 var PDU_L3_MS_SGSN l3_mo;
397 var PDU_L3_SGSN_MS l3_mt;
398 var default di := activate(as_mm_identity());
399 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200400 var GSUP_IE auth_tuple;
401 var template AuthenticationParameterAUTNTLV autn;
402
403 if (umts_aka_challenge) {
404 g_pars.vec := f_gen_auth_vec_3g();
405 autn := {
406 elementIdentifier := '28'O,
407 lengthIndicator := lengthof(g_pars.vec.autn),
408 autnValue := g_pars.vec.autn
409 };
410
411 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
412 g_pars.vec.sres,
413 g_pars.vec.kc,
414 g_pars.vec.ik,
415 g_pars.vec.ck,
416 g_pars.vec.autn,
417 g_pars.vec.res));
418 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
419 } else {
420 g_pars.vec := f_gen_auth_vec_2g();
421 autn := omit;
422 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
423 g_pars.vec.sres,
424 g_pars.vec.kc));
425 log("GSUP sends only 2G auth tuple", auth_tuple);
426 }
Harald Welte5ac31492018-02-15 20:39:13 +0100427 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
428 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200429
430 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
431 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200432 BSSGP[0].receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
Harald Welte5ac31492018-02-15 20:39:13 +0100433 l3_mt := bd.l3_mt;
434 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200435 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
436
437 if (umts_aka_challenge and not force_gsm_sres) {
438 /* set UMTS response instead */
439 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
440 valueField := substr(g_pars.vec.res, 0, 4)
441 };
442 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
443 elementIdentifier := '21'O,
444 lengthIndicator := lengthof(g_pars.vec.res) - 4,
445 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
446 };
447 }
448
449 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100450 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
451 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
452 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
453 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
454 }
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200455 f_send_l3_gmm_llc(l3_mo);
Harald Welte76dee092018-02-16 22:12:59 +0100456 } else {
457 /* wait for identity procedure */
458 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100459 }
Harald Welte76dee092018-02-16 22:12:59 +0100460
Harald Welte5ac31492018-02-15 20:39:13 +0100461 deactivate(di);
462}
463
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200464function f_upd_ptmsi_and_tlli(OCT4 p_tmsi, integer bssgp_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltef70997d2018-02-17 10:11:19 +0100465 g_pars.p_tmsi := p_tmsi;
466 /* update TLLI */
467 g_pars.tlli_old := g_pars.tlli;
468 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200469 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli, BSSGP_PROC[bssgp_index]);
Harald Weltef70997d2018-02-17 10:11:19 +0100470}
471
Harald Welte04683d02018-02-16 22:43:45 +0100472function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
473 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100474 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Alexander Couzens51114d12018-07-31 18:41:56 +0200475 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100476 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Alexander Couzens51114d12018-07-31 18:41:56 +0200477 & "; expected " & hex2str(g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200478 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100479 }
Harald Welte04683d02018-02-16 22:43:45 +0100480 g_pars.ra := aa.routingAreaIdentification;
481 if (ispresent(aa.allocatedPTMSI)) {
482 if (not g_pars.net.expect_ptmsi) {
483 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200484 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100485 }
Harald Weltef70997d2018-02-17 10:11:19 +0100486 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100487 }
488 if (ispresent(aa.msIdentity)) {
489 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200490 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100491 }
492 /* P-TMSI.sig */
493 if (ispresent(aa.ptmsiSignature)) {
494 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
495 }
496 /* updateTimer */
497 // aa.readyTimer
498 /* T3302, T3319, T3323, T3312_ext, T3324 */
499}
500
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200501function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra, integer bssgp_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +0100502 /* mandatory IE */
503 g_pars.ra := ra.routingAreaId;
504 if (ispresent(ra.allocatedPTMSI)) {
505 if (not g_pars.net.expect_ptmsi) {
506 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200507 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100508 }
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200509 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets, bssgp_index);
Harald Welte91636de2018-02-17 10:16:14 +0100510 }
511 if (ispresent(ra.msIdentity)) {
512 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200513 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100514 }
515 /* P-TMSI.sig */
516 if (ispresent(ra.ptmsiSignature)) {
517 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
518 }
519 /* updateTimer */
520 // aa.readyTimer
521 /* T3302, T3319, T3323, T3312_ext, T3324 */
522}
523
524
Harald Welte5a4fa042018-02-16 20:59:21 +0100525function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
526 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
527}
528
Harald Welte23178c52018-02-17 09:36:33 +0100529/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100530private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileL3_CommonIE_Types.MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100531 if (ispresent(g_pars.p_tmsi)) {
532 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
533 } else {
534 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
535 }
536}
537
Harald Welte311ec272018-02-17 09:40:03 +0100538private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100539 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100540 /* Expect MSC to perform LU with HLR */
541 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100542 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
543 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
544 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100545 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
546 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
547}
548
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200549private function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100550 var BssgpDecoded bd;
Harald Welte5a4fa042018-02-16 20:59:21 +0100551 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200552 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 +0100553
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200554 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
555 * 3G auth vectors */
556 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
557 /* The thing is, if the solSACapability is 'omit', then the
558 * revisionLevelIndicatior is at the wrong place! */
559 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
560
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200561 f_send_l3_gmm_llc(attach_req);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200562 f_gmm_auth(umts_aka_challenge, force_gsm_sres);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200563 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100564 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100565
Alexander Couzens0e510e62018-07-28 23:06:00 +0200566 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100567 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
568 }
569 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200570 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200571}
572
573private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
574 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100575 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100576}
577
578testcase TC_attach() runs on test_CT {
579 var BSSGP_ConnHdlr vc_conn;
580 f_init();
581 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200582 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100583 vc_conn.done;
584}
585
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100586testcase TC_attach_mnc3() runs on test_CT {
587 var BSSGP_ConnHdlr vc_conn;
588 f_init('023042'H);
589 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200590 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100591 vc_conn.done;
592}
593
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200594private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
595 f_gmm_attach(true, false);
596 setverdict(pass);
597}
598testcase TC_attach_umts_aka_umts_res() runs on test_CT {
599 var BSSGP_ConnHdlr vc_conn;
600 f_init();
601 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200602 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200603 vc_conn.done;
604}
605
606private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
607 f_gmm_attach(true, true);
608 setverdict(pass);
609}
610testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
611 var BSSGP_ConnHdlr vc_conn;
612 f_init();
613 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200614 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200615 vc_conn.done;
616}
617
Harald Welte5b7c8122018-02-16 21:48:17 +0100618/* MS never responds to ID REQ, expect ATTACH REJECT */
619private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100620 var RoutingAreaIdentificationV old_ra := f_random_RAI();
621
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200622 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 +0100623 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200624 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100625 /* don't send ID Response */
626 repeat;
627 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200628 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100629 setverdict(pass);
630 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200631 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100632 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +0200633 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100634 }
635 }
636}
637testcase TC_attach_auth_id_timeout() runs on test_CT {
638 var BSSGP_ConnHdlr vc_conn;
639 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200640 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 +0100641 vc_conn.done;
642}
643
644/* HLR never responds to SAI REQ, expect ATTACH REJECT */
645private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100646 var RoutingAreaIdentificationV old_ra := f_random_RAI();
647
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200648 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 +0100649 alt {
650 [] as_mm_identity();
651 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
652 }
653 /* don't send SAI-response from HLR */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200654 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Welte5b7c8122018-02-16 21:48:17 +0100655 setverdict(pass);
656}
657testcase TC_attach_auth_sai_timeout() runs on test_CT {
658 var BSSGP_ConnHdlr vc_conn;
659 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200660 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +0100661 vc_conn.done;
662}
663
Harald Weltefe253882018-02-17 09:25:00 +0100664/* HLR rejects SAI, expect ATTACH REJECT */
665private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100666 var RoutingAreaIdentificationV old_ra := f_random_RAI();
667
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200668 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 +0100669 alt {
670 [] as_mm_identity();
671 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
672 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
673 }
674 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200675 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Weltefe253882018-02-17 09:25:00 +0100676 setverdict(pass);
677}
678testcase TC_attach_auth_sai_reject() runs on test_CT {
679 var BSSGP_ConnHdlr vc_conn;
680 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200681 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +0100682 vc_conn.done;
683}
684
Harald Welte5b7c8122018-02-16 21:48:17 +0100685/* HLR never responds to UL REQ, expect ATTACH REJECT */
686private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100687 var BssgpDecoded bd;
Harald Welte5b7c8122018-02-16 21:48:17 +0100688 var RoutingAreaIdentificationV old_ra := f_random_RAI();
689
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200690 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 +0100691 f_gmm_auth();
692 /* Expect MSC to perform LU with HLR */
693 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
694 /* Never follow-up with ISD_REQ or UL_RES */
695 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200696 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100697 setverdict(pass);
698 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200699 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100700 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100701 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200702 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100703 }
704 }
705}
706testcase TC_attach_gsup_lu_timeout() runs on test_CT {
707 var BSSGP_ConnHdlr vc_conn;
708 f_init();
709 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200710 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100711 vc_conn.done;
712}
713
Harald Welteb7c14e92018-02-17 09:29:16 +0100714/* HLR rejects UL REQ, expect ATTACH REJECT */
715private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
716 var BssgpDecoded bd;
Harald Welteb7c14e92018-02-17 09:29:16 +0100717 var RoutingAreaIdentificationV old_ra := f_random_RAI();
718
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200719 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 +0100720 f_gmm_auth();
721 /* Expect MSC to perform LU with HLR */
722 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
723 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
724 }
725 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200726 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welteb7c14e92018-02-17 09:29:16 +0100727 setverdict(pass);
728 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200729 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welteb7c14e92018-02-17 09:29:16 +0100730 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
731 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200732 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +0100733 }
734 }
735}
736testcase TC_attach_gsup_lu_reject() runs on test_CT {
737 var BSSGP_ConnHdlr vc_conn;
738 f_init();
739 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200740 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +0100741 vc_conn.done;
742}
743
744
Harald Welte3823e2e2018-02-16 21:53:48 +0100745/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
746private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100747 var BssgpDecoded bd;
Harald Welte3823e2e2018-02-16 21:53:48 +0100748 var RoutingAreaIdentificationV old_ra := f_random_RAI();
749
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200750 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 +0100751 f_gmm_auth();
752 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100753 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100754
Alexander Couzens0e510e62018-07-28 23:06:00 +0200755 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100756 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
757 }
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200758 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +0100759 setverdict(pass);
760}
Harald Welte3823e2e2018-02-16 21:53:48 +0100761testcase TC_attach_combined() runs on test_CT {
762 var BSSGP_ConnHdlr vc_conn;
763 f_init();
764 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200765 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100766 vc_conn.done;
767}
768
Harald Welte76dee092018-02-16 22:12:59 +0100769/* Attempt of GPRS ATTACH in 'accept all' mode */
770private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100771 var BssgpDecoded bd;
Harald Welte76dee092018-02-16 22:12:59 +0100772 var RoutingAreaIdentificationV old_ra := f_random_RAI();
773
774 g_pars.net.expect_auth := false;
775
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200776 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 +0100777 f_gmm_auth();
Alexander Couzens0e510e62018-07-28 23:06:00 +0200778 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100779 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
780 }
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200781 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +0100782 setverdict(pass);
783}
784testcase TC_attach_accept_all() runs on test_CT {
785 var BSSGP_ConnHdlr vc_conn;
786 f_init();
787 f_sleep(1.0);
788 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +0200789 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +0100790 vc_conn.done;
791}
Harald Welte5b7c8122018-02-16 21:48:17 +0100792
Harald Welteb2124b22018-02-16 22:26:56 +0100793/* Attempt of GPRS ATTACH in 'accept all' mode */
794private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +0100795 var RoutingAreaIdentificationV old_ra := f_random_RAI();
796
797 /* Simulate a foreign IMSI */
798 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +0200799 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welteb2124b22018-02-16 22:26:56 +0100800
801 g_pars.net.expect_auth := false;
802
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200803 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 +0100804 alt {
805 [] as_mm_identity();
Alexander Couzens0e510e62018-07-28 23:06:00 +0200806 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
Harald Welteb2124b22018-02-16 22:26:56 +0100807 setverdict(pass);
808 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200809 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welteb2124b22018-02-16 22:26:56 +0100810 setverdict(pass);
811 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200812 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200813 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200814 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200815 }
Harald Welteb2124b22018-02-16 22:26:56 +0100816 }
817}
818testcase TC_attach_closed() runs on test_CT {
819 var BSSGP_ConnHdlr vc_conn;
820 f_init();
821 f_sleep(1.0);
822 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
823 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +0200824 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +0100825 vc_conn.done;
826 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +0200827 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +0100828 vc_conn.done;
829}
830
Harald Welte04683d02018-02-16 22:43:45 +0100831/* Routing Area Update from Unknown TLLI -> REJECT */
832private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100833 var RoutingAreaIdentificationV old_ra := f_random_RAI();
834
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200835 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 +0100836 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200837 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
Harald Welte04683d02018-02-16 22:43:45 +0100838 setverdict(pass);
839 }
840 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200841 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +0100842 }
843}
844testcase TC_rau_unknown() runs on test_CT {
845 var BSSGP_ConnHdlr vc_conn;
846 f_init();
847 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200848 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +0100849 vc_conn.done;
850}
851
Harald Welte91636de2018-02-17 10:16:14 +0100852private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
853 var BssgpDecoded bd;
854
855 /* first perform regular attach */
856 f_TC_attach(id);
857
Alexander Couzens5dce90d2018-07-31 03:16:37 +0200858 f_routing_area_update(g_pars.ra);
859
Harald Welte91636de2018-02-17 10:16:14 +0100860}
861testcase TC_attach_rau() runs on test_CT {
862 var BSSGP_ConnHdlr vc_conn;
863 f_init();
864 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200865 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +0100866 vc_conn.done;
867}
Harald Welte04683d02018-02-16 22:43:45 +0100868
Harald Welte6abb9fe2018-02-17 15:24:48 +0100869/* general GPRS DETACH helper */
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200870function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge, integer bssgp_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100871 var BssgpDecoded bd;
872 timer T := 5.0;
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200873 f_send_l3_gmm_llc(ts_GMM_DET_REQ_MO(detach_type, power_off), bssgp_index);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100874 if (expect_purge) {
875 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
876 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
877 }
878 T.start;
879 alt {
880 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
881 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +0200882 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100883 }
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200884 [power_off] BSSGP[bssgp_index].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100885 g_pars.ra := omit;
886 setverdict(fail, "Unexpected ATTACH ACCEPT in no-power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +0200887 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100888 /* TODO: check if any PDP contexts are deactivated on network side? */
889 }
890 [power_off] T.timeout {
891 setverdict(pass);
892 }
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200893 [not power_off] BSSGP[bssgp_index].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100894 g_pars.ra := omit;
895 setverdict(pass);
896 /* TODO: check if any PDP contexts are deactivated on network side? */
897 }
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200898 [] BSSGP[bssgp_index].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +0100899 }
900}
901
902/* IMSI DETACH (non-power-off) for unknown TLLI */
903private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
904 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
905}
906testcase TC_detach_unknown_nopoweroff() runs on test_CT {
907 var BSSGP_ConnHdlr vc_conn;
908 f_init();
909 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200910 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100911 vc_conn.done;
912}
913
914/* IMSI DETACH (power-off) for unknown TLLI */
915private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
916 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
917}
918testcase TC_detach_unknown_poweroff() runs on test_CT {
919 var BSSGP_ConnHdlr vc_conn;
920 f_init();
921 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200922 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100923 vc_conn.done;
924}
925
926/* IMSI DETACH (non-power-off) for known TLLI */
927private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
928 /* first perform regular attach */
929 f_TC_attach(id);
930
931 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
932}
933testcase TC_detach_nopoweroff() runs on test_CT {
934 var BSSGP_ConnHdlr vc_conn;
935 f_init();
936 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200937 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100938 vc_conn.done;
939}
940
941/* IMSI DETACH (power-off) for known TLLI */
942private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
943 /* first perform regular attach */
944 f_TC_attach(id);
945
946 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
947}
948testcase TC_detach_poweroff() runs on test_CT {
949 var BSSGP_ConnHdlr vc_conn;
950 f_init();
951 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200952 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100953 vc_conn.done;
954}
955
Harald Welteeded9ad2018-02-17 20:57:34 +0100956type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +0100957 BIT3 tid, /* L3 Transaction ID */
958 BIT4 nsapi, /* SNDCP NSAPI */
959 BIT4 sapi, /* LLC SAPI */
960 QoSV qos, /* QoS parameters */
961 PDPAddressV addr, /* IP address */
962 octetstring apn optional, /* APN name */
963 ProtocolConfigOptionsV pco optional, /* protoco config opts */
964 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +0100965 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +0100966 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +0100967
Harald Welte822f9102018-02-18 20:39:06 +0100968 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
969 OCT4 ggsn_tei_u, /* GGSN TEI User */
970 octetstring ggsn_ip_c, /* GGSN IP Control */
971 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200972 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +0100973
Harald Welte822f9102018-02-18 20:39:06 +0100974 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
975 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
976 octetstring sgsn_ip_c optional, /* SGSN IP Control */
977 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +0100978};
979
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100980
981private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
982 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
983 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
984 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
985 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
986 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
987 f_gtp_register_teid(apars.ggsn_tei_c);
988 f_gtp_register_teid(apars.ggsn_tei_u);
989}
990
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200991function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false) runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100992 var boolean exp_rej := ispresent(apars.exp_rej_cause);
993 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200994 var template Recovery_gtpc recovery := omit;
995
996 if (send_recovery) {
997 recovery := ts_Recovery(apars.ggsn_restart_ctr);
998 }
Harald Welteeded9ad2018-02-17 20:57:34 +0100999
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001000 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 +01001001 apars.apn, apars.pco));
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001002 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
1003 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
1004 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1005 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
1006 apars.sgsn_tei_c, apars.gtp_resp_cause,
1007 apars.ggsn_tei_c, apars.ggsn_tei_u,
1008 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001009 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1010 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +01001011 }
1012 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001013 [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 +01001014 setverdict(pass);
1015 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001016 [exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001017 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +02001018 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001019 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001020 [not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001021 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +02001022 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001023 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001024 [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 +01001025 setverdict(pass);
1026 }
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001027 [] as_xid(apars);
Harald Welteeded9ad2018-02-17 20:57:34 +01001028 }
1029}
1030
Harald Welte6f203162018-02-18 22:04:55 +01001031function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause) runs on BSSGP_ConnHdlr {
1032 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1033 var Gtp1cUnitdata g_ud;
1034
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001035 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
Harald Welte6f203162018-02-18 22:04:55 +01001036 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1037 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001038 BSSGP[0].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001039 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1040 }
1041 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001042 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {
Harald Welte6f203162018-02-18 22:04:55 +01001043 setverdict(pass);
1044 }
1045 [] as_xid(apars);
1046 }
1047}
1048
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001049function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false) runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001050 var Gtp1cUnitdata g_ud;
1051 var integer seq_nr := 23;
1052 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1053
Alexander Couzens0e510e62018-07-28 23:06:00 +02001054 BSSGP[0].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001055 if (error_ind) {
1056 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1057 } else {
1058 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1059 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001060
1061 timer T := 5.0;
1062 T.start;
1063
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001064 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001065 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001066 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Harald Welte57b9b7f2018-02-18 22:28:13 +01001067 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001068 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1069 repeat;
1070 }
1071 [] T.timeout {
1072 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1073 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001074 }
1075}
1076
Harald Welte6f203162018-02-18 22:04:55 +01001077
Harald Welteeded9ad2018-02-17 20:57:34 +01001078/* Table 10.5.156/3GPP TS 24.008 */
1079template (value) QoSV t_QosDefault := {
1080 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1081 delayClass := '100'B, /* best effort */
1082 spare1 := '00'B,
1083 precedenceClass := '010'B, /* normal */
1084 spare2 := '0'B,
1085 peakThroughput := '0000'B, /* subscribed */
1086 meanThroughput := '00000'B, /* subscribed */
1087 spare3 := '000'B,
1088 deliverErroneusSDU := omit,
1089 deliveryOrder := omit,
1090 trafficClass := omit,
1091 maxSDUSize := omit,
1092 maxBitrateUplink := omit,
1093 maxBitrateDownlink := omit,
1094 sduErrorRatio := omit,
1095 residualBER := omit,
1096 trafficHandlingPriority := omit,
1097 transferDelay := omit,
1098 guaranteedBitRateUplink := omit,
1099 guaranteedBitRateDownlink := omit,
1100 sourceStatisticsDescriptor := omit,
1101 signallingIndication := omit,
1102 spare4 := omit,
1103 maxBitrateDownlinkExt := omit,
1104 guaranteedBitRateDownlinkExt := omit,
1105 maxBitrateUplinkExt := omit,
1106 guaranteedBitRateUplinkExt := omit,
1107 maxBitrateDownlinkExt2 := omit,
1108 guaranteedBitRateDownlinkExt2 := omit,
1109 maxBitrateUplinkExt2 := omit,
1110 guaranteedBitRateUplinkExt2 := omit
1111}
1112
1113/* 10.5.6.4 / 3GPP TS 24.008 */
1114template (value) PDPAddressV t_AddrIPv4dyn := {
1115 pdpTypeOrg := '0001'B, /* IETF */
1116 spare := '0000'B,
1117 pdpTypeNum := '21'O, /* IPv4 */
1118 addressInfo := omit
1119}
1120template (value) PDPAddressV t_AddrIPv6dyn := {
1121 pdpTypeOrg := '0001'B, /* IETF */
1122 spare := '0000'B,
1123 pdpTypeNum := '53'O, /* IPv6 */
1124 addressInfo := omit
1125}
1126
Harald Welte37692d82018-02-18 15:21:34 +01001127template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001128 tid := '000'B,
1129 nsapi := '0101'B, /* < 5 are reserved */
1130 sapi := '0011'B, /* 3/5/9/11 */
1131 qos := t_QosDefault,
1132 addr := t_AddrIPv4dyn,
1133 apn := omit,
1134 pco := omit,
1135 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001136 gtp_resp_cause := int2oct(128, 1),
1137 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001138
1139 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001140 ggsn_tei_c := f_rnd_octstring(4),
1141 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001142 ggsn_ip_c := f_inet_addr(ggsn_ip),
1143 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001144 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001145
Harald Welteeded9ad2018-02-17 20:57:34 +01001146 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001147 sgsn_tei_u := omit,
1148 sgsn_ip_c := omit,
1149 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001150}
1151
Harald Welte37692d82018-02-18 15:21:34 +01001152template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1153 connId := 1,
1154 remName := f_inet_ntoa(ip),
1155 remPort := GTP1U_PORT
1156}
1157
1158template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1159 connId := 1,
1160 remName := f_inet_ntoa(ip),
1161 remPort := GTP1C_PORT
1162}
1163
1164private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1165 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1166 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1167}
1168
1169private altstep as_xid(PdpActPars apars) runs on BSSGP_ConnHdlr {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001170 [] BSSGP[0].receive(tr_BD_LLC(tr_LLC_XID(?, apars.sapi))) {
Harald Welte37692d82018-02-18 15:21:34 +01001171 repeat;
1172 }
1173}
1174
1175template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1176 pDU_SN_UNITDATA := {
1177 nsapi := nsapi,
1178 moreBit := ?,
1179 snPduType := '1'B,
1180 firstSegmentIndicator := ?,
1181 spareBit := ?,
1182 pcomp := ?,
1183 dcomp := ?,
1184 npduNumber := ?,
1185 segmentNumber := ?,
1186 npduNumberContinued := ?,
1187 dataSegmentSnUnitdataPdu := payload
1188 }
1189}
1190
1191/* simple case: single segment, no compression */
1192template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1193 pDU_SN_UNITDATA := {
1194 nsapi := nsapi,
1195 moreBit := '0'B,
1196 snPduType := '1'B,
1197 firstSegmentIndicator := '1'B,
1198 spareBit := '0'B,
1199 pcomp := '0000'B,
1200 dcomp := '0000'B,
1201 npduNumber := '0000'B,
1202 segmentNumber := '0000'B,
1203 npduNumberContinued := '00'O,
1204 dataSegmentSnUnitdataPdu := payload
1205 }
1206}
1207
1208/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
1209private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1210 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1211 f_gtpu_send(apars, payload);
1212 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1213 alt {
1214 [] as_xid(apars);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001215 [] BSSGP[0].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
Harald Welte37692d82018-02-18 15:21:34 +01001216 }
1217}
1218
Pau Espin Pedrol8be4d192018-07-18 13:43:44 +02001219/* Transceive given 'payload' as MT message from Gb -> OsmoSGSN -> GTP */
Harald Welte37692d82018-02-18 15:21:34 +01001220private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1221 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1222 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1223 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001224 BSSGP[0].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
Harald Welte37692d82018-02-18 15:21:34 +01001225 /* Expect PDU via GTP from SGSN on simulated GGSN */
1226 alt {
1227 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1228 }
1229}
1230
Harald Welteeded9ad2018-02-17 20:57:34 +01001231private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001232 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001233
1234 /* first perform regular attach */
1235 f_TC_attach(id);
1236
1237 f_pdp_ctx_act(apars);
1238}
1239testcase TC_attach_pdp_act() runs on test_CT {
1240 var BSSGP_ConnHdlr vc_conn;
1241 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001242 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001243 vc_conn.done;
1244}
Harald Welteb2124b22018-02-16 22:26:56 +01001245
Harald Welte835b15f2018-02-18 14:39:11 +01001246/* PDP Context activation for not-attached subscriber; expect fail */
1247private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001248 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001249 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 +01001250 apars.apn, apars.pco));
1251 alt {
1252 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001253 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001254 setverdict(pass);
1255 }
1256 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1257 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001258 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001259 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001260 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001261 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001262 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001263 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001264 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001265 }
1266}
1267testcase TC_pdp_act_unattached() 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_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001271 vc_conn.done;
1272}
1273
Harald Welte37692d82018-02-18 15:21:34 +01001274/* ATTACH + PDP CTX ACT + user plane traffic */
1275private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1276 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1277
1278 /* first perform regular attach */
1279 f_TC_attach(id);
1280 /* then activate PDP context */
1281 f_pdp_ctx_act(apars);
1282 /* then transceive a downlink PDU */
1283 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1284 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1285}
1286testcase TC_attach_pdp_act_user() 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_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001290 vc_conn.done;
1291}
1292
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001293/* ATTACH + PDP CTX ACT; reject from GGSN */
1294private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1295 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1296
1297 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1298 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1299
1300 /* first perform regular attach */
1301 f_TC_attach(id);
1302 /* then activate PDP context */
1303 f_pdp_ctx_act(apars);
1304}
1305testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1306 var BSSGP_ConnHdlr vc_conn;
1307 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001308 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001309 vc_conn.done;
1310}
Harald Welte835b15f2018-02-18 14:39:11 +01001311
Harald Welte6f203162018-02-18 22:04:55 +01001312/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1313private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1314 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1315
1316 /* first perform regular attach */
1317 f_TC_attach(id);
1318 /* then activate PDP context */
1319 f_pdp_ctx_act(apars);
1320 /* then transceive a downlink PDU */
1321 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1322 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1323
1324 f_pdp_ctx_deact_mo(apars, '00'O);
1325}
1326testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1327 var BSSGP_ConnHdlr vc_conn;
1328 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001329 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 +01001330 vc_conn.done;
1331}
1332
Harald Welte57b9b7f2018-02-18 22:28:13 +01001333/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1334private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1335 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1336
1337 /* first perform regular attach */
1338 f_TC_attach(id);
1339 /* then activate PDP context */
1340 f_pdp_ctx_act(apars);
1341 /* then transceive a downlink PDU */
1342 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1343 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1344
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001345 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001346}
1347testcase TC_attach_pdp_act_user_deact_mt() 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_pdp_act_user_deact_mt), testcasename(), g_gb, 22);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001351 vc_conn.done;
1352}
1353
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001354/* ATTACH + ATTACH (2nd) */
1355private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1356 g_pars.t_guard := 5.0;
1357
1358 /* first perform regular attach */
1359 f_TC_attach(id);
1360
1361 /* second to perform regular attach */
1362 f_TC_attach(id);
1363}
1364
1365
1366testcase TC_attach_second_attempt() runs on test_CT {
1367 var BSSGP_ConnHdlr vc_conn;
1368 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001369 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001370 vc_conn.done;
1371}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001372
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001373private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001374 var Gtp1cUnitdata g_ud;
1375 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1376
1377 /* first perform regular attach */
1378 f_TC_attach(id);
1379 /* Activate a pdp context against the GGSN */
1380 f_pdp_ctx_act(apars);
1381 /* Wait to receive first echo request and send initial Restart counter */
1382 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1383 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1384 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1385 }
1386 /* Wait to receive second echo request and send incremented Restart
1387 counter. This will fake a restarted GGSN, and pdp ctx allocated
1388 should be released by SGSN */
1389 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1390 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1391 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1392 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1393 }
1394 var OCT1 cause_network_failure := int2oct(38, 1)
1395 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001396 [] 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 +02001397 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001398 setverdict(pass);
1399 }
1400 [] as_xid(apars);
1401 }
1402 setverdict(pass);
1403}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001404/* ATTACH + trigger Recovery procedure through EchoResp */
1405testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001406 var BSSGP_ConnHdlr vc_conn;
1407 g_use_echo := true
1408 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001409 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 +02001410 vc_conn.done;
1411 g_use_echo := false
1412}
1413
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001414private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1415 var Gtp1cUnitdata g_ud;
1416 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1417 var integer seq_nr := 23;
1418 var GtpPeer peer;
1419 /* first perform regular attach */
1420 f_TC_attach(id);
1421
1422 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1423 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1424 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1425 f_pdp_ctx_act(apars, true);
1426
1427 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1428/* received. */
1429 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1430
1431 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1432 would be great to have an active pdp context here before triggering
1433 Recovery, and making sure the the DEACT request is sent by the SGSN.
1434 */
1435
1436 /* Activate a pdp context against the GGSN, send incremented Recovery
1437 IE. This should trigger the recovery path, but still this specific
1438 CTX activation should work. */
1439 apars.exp_rej_cause := omit; /* default value for tests */
1440 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
1441 f_pdp_ctx_act(apars, true);
1442
1443 setverdict(pass);
1444}
1445/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1446testcase TC_attach_restart_ctr_create() runs on test_CT {
1447 var BSSGP_ConnHdlr vc_conn;
1448 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001449 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 +02001450 vc_conn.done;
1451}
1452
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001453/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
1454private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
1455 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1456 var integer seq_nr := 23;
1457 var GtpPeer peer;
1458 var integer i;
1459
1460 /* first perform regular attach */
1461 f_TC_attach(id);
1462 /* then activate PDP context */
1463 f_pdp_ctx_act(apars);
1464
Alexander Couzens0e510e62018-07-28 23:06:00 +02001465 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001466 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1467 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1468
1469 for (i := 0; i < 5; i := i+1) {
1470 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001471 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001472 [] as_xid(apars);
1473 }
1474 }
1475
1476 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
1477
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001478 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001479 setverdict(pass);
1480}
1481testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
1482 var BSSGP_ConnHdlr vc_conn;
1483 f_init();
1484 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001485 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 +02001486 vc_conn.done;
1487}
1488
Alexander Couzens5e307b42018-05-22 18:12:20 +02001489private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
1490 /* MS: perform regular attach */
1491 f_TC_attach(id);
1492
1493 /* HLR: cancel the location request */
1494 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
1495 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02001496
1497 /* ensure no Detach Request got received */
1498 timer T := 5.0;
1499 T.start;
1500 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001501 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(*, *, *))) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001502 T.stop;
1503 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02001504 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001505 }
1506 [] T.timeout {
1507 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02001508 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001509 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001510 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001511 repeat;
1512 }
1513 }
1514}
1515
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001516/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
1517private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
1518 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1519
1520 /* first perform regular attach */
1521 f_TC_attach(id);
1522 /* then activate PDP context */
1523 f_pdp_ctx_act(apars);
1524 /* then transceive a downlink PDU */
1525 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1526
1527 /* Send Error indication as response from upload PDU and expect deact towards MS */
1528 f_pdp_ctx_deact_mt(apars, true);
1529}
1530testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
1531 var BSSGP_ConnHdlr vc_conn;
1532 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001533 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 +02001534 vc_conn.done;
1535}
1536
Alexander Couzens5e307b42018-05-22 18:12:20 +02001537testcase TC_hlr_location_cancel_request_update() runs on test_CT {
1538 /* MS <-> SGSN: GMM Attach
1539 * HLR -> SGSN: Cancel Location Request
1540 * HLR <- SGSN: Cancel Location Ack
1541 */
1542 var BSSGP_ConnHdlr vc_conn;
1543 f_init();
1544 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001545 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02001546 vc_conn.done;
1547}
1548
1549
Alexander Couzensc87967a2018-05-22 16:09:54 +02001550private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
1551 /* MS: perform regular attach */
1552 f_TC_attach(id);
1553
1554 /* HLR: cancel the location request */
1555 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
1556 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
1557 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
1558
1559 /* MS: receive a Detach Request */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001560 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 +02001561 f_send_l3_gmm_llc(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001562
1563 setverdict(pass);
1564}
1565
1566testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
1567 /* MS <-> SGSN: GMM Attach
1568 * HLR -> SGSN: Cancel Location Request
1569 * HLR <- SGSN: Cancel Location Ack
1570 * MS <- SGSN: Detach Request
1571 * SGSN-> MS: Detach Complete
1572 */
1573 var BSSGP_ConnHdlr vc_conn;
1574 f_init();
1575 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001576 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001577 vc_conn.done;
1578}
1579
1580
Alexander Couzens6c47f292018-05-22 17:09:49 +02001581private function f_hlr_location_cancel_request_unknown_subscriber(
1582 charstring id,
1583 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
1584
1585 /* HLR: cancel the location request */
1586 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
1587
1588 /* cause 2 = IMSI_UNKNOWN */
1589 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
1590
1591 setverdict(pass);
1592}
1593
1594private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001595 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001596}
1597
1598testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
1599 /* HLR -> SGSN: Cancel Location Request
1600 * HLR <- SGSN: Cancel Location Error
1601 */
1602
1603 var BSSGP_ConnHdlr vc_conn;
1604 f_init();
1605 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001606 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 +02001607 vc_conn.done;
1608}
1609
1610private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001611 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001612}
1613
1614testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
1615 /* HLR -> SGSN: Cancel Location Request
1616 * HLR <- SGSN: Cancel Location Error
1617 */
1618
1619 var BSSGP_ConnHdlr vc_conn;
1620 f_init();
1621 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001622 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 +02001623 vc_conn.done;
1624}
1625
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001626private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
1627 f_TC_attach(id);
1628 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1629}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001630
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001631testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
1632 /* MS <-> SGSN: Attach
1633 * MS -> SGSN: Detach Req (Power off)
1634 * VTY -> SGSN: Check if MS is NOT in subscriber cache
1635 */
1636 var BSSGP_ConnHdlr vc_conn;
1637 var integer id := 33;
1638 var charstring imsi := hex2str(f_gen_imsi(id));
1639
1640 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001641 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001642 vc_conn.done;
1643
1644 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1645}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001646
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001647/* Attempt an attach, but loose the Identification Request (IMEI) */
1648private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
1649 var integer count_req := 0;
1650 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1651
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001652 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 +02001653
1654 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001655 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001656 /* break */
1657 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001658 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001659 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001660 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001661 repeat;
1662 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001663 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001664 /* ignore ID REQ IMEI */
1665 count_req := count_req + 1;
1666 repeat;
1667 }
1668 }
1669 if (count_req != 5) {
1670 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001671 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001672 }
1673 setverdict(pass);
1674}
1675
1676testcase TC_attach_no_imei_response() runs on test_CT {
1677 /* MS -> SGSN: Attach Request IMSI
1678 * MS <- SGSN: Identity Request IMSI (optional)
1679 * MS -> SGSN: Identity Response IMSI (optional)
1680 * MS <- SGSN: Identity Request IMEI
1681 * MS -x SGSN: no response
1682 * MS <- SGSN: re-send: Identity Request IMEI 4x
1683 * MS <- SGSN: Attach Reject
1684 */
1685 var BSSGP_ConnHdlr vc_conn;
1686 f_init();
1687 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001688 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 +02001689 vc_conn.done;
1690}
1691
Alexander Couzens53f20562018-06-12 16:24:12 +02001692/* Attempt an attach, but loose the Identification Request (IMSI) */
1693private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
1694 var integer count_req := 0;
1695 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1696
1697 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
1698 g_pars.p_tmsi := 'c0000035'O;
1699
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001700 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 +02001701
1702 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001703 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001704 /* break */
1705 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001706 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001707 /* ignore ID REQ IMSI */
1708 count_req := count_req + 1;
1709 repeat;
1710 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001711 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001712 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001713 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02001714 repeat;
1715 }
1716 }
1717 if (count_req != 5) {
1718 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001719 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02001720 }
1721 setverdict(pass);
1722}
1723
1724testcase TC_attach_no_imsi_response() runs on test_CT {
1725 /* MS -> SGSN: Attach Request TMSI (unknown)
1726 * MS <- SGSN: Identity Request IMEI (optional)
1727 * MS -> SGSN: Identity Response IMEI (optional)
1728 * MS <- SGSN: Identity Request IMSI
1729 * MS -x SGSN: no response
1730 * MS <- SGSN: re-send: Identity Request IMSI 4x
1731 * MS <- SGSN: Attach Reject
1732 */
1733 var BSSGP_ConnHdlr vc_conn;
1734 f_init();
1735 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001736 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 +02001737 vc_conn.done;
1738}
1739
Alexander Couzenscf818962018-06-05 18:00:00 +02001740private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
1741 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
1742}
1743
1744testcase TC_attach_check_subscriber_list() runs on test_CT {
1745 /* MS <-> SGSN: Attach
1746 * VTY -> SGSN: Check if MS is in subscriber cache
1747 */
1748 var BSSGP_ConnHdlr vc_conn;
1749 var integer id := 34;
1750 var charstring imsi := hex2str(f_gen_imsi(id));
1751
1752 f_init();
1753 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001754 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02001755 vc_conn.done;
1756
1757 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1758 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
1759}
1760
Alexander Couzensf9858652018-06-07 16:14:53 +02001761private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
1762 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1763 var BssgpDecoded bd;
1764
1765 /* unregister the old IMSI */
1766 f_bssgp_client_unregister(g_pars.imsi);
1767 /* Simulate a foreign IMSI */
1768 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +02001769 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Alexander Couzensf9858652018-06-07 16:14:53 +02001770
1771 /* there is no auth */
1772 g_pars.net.expect_auth := false;
1773
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001774 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 +02001775 f_gmm_auth();
1776 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001777 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzensf9858652018-06-07 16:14:53 +02001778 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001779 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02001780 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001781 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
Alexander Couzensf9858652018-06-07 16:14:53 +02001782 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001783 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02001784 setverdict(pass);
1785 }
1786 }
1787}
1788testcase TC_attach_closed_add_vty() runs on test_CT {
1789 /* VTY-> SGSN: policy close
1790 * MS -> SGSN: Attach Request
1791 * MS <- SGSN: Identity Request IMSI
1792 * MS -> SGSN: Identity Response IMSI
1793 * MS <- SGSN: Attach Reject
1794 * VTY-> SGSN: policy imsi-acl add IMSI
1795 * MS -> SGSN: Attach Request
1796 * MS <- SGSN: Identity Request IMSI
1797 * MS -> SGSN: Identity Response IMSI
1798 * MS <- SGSN: Identity Request IMEI
1799 * MS -> SGSN: Identity Response IMEI
1800 * MS <- SGSN: Attach Accept
1801 */
1802 var BSSGP_ConnHdlr vc_conn;
1803 f_init();
1804 f_sleep(1.0);
1805 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1806 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
1807 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001808 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02001809 vc_conn.done;
1810 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456789");
1811 /* test with same IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001812 vc_conn := f_start_handler(refers(f_TC_attach_closed_imsi_added), testcasename(), g_gb, 10);
Alexander Couzensf9858652018-06-07 16:14:53 +02001813 vc_conn.done;
1814}
1815
Alexander Couzens0085bd72018-06-12 19:08:44 +02001816/* Attempt an attach, but never answer a Attach Complete */
1817private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
1818 var integer count_req := 0;
1819
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001820 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 +02001821 f_gmm_auth();
1822
1823 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001824 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001825 /* break */
1826 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001827 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001828 /* ignore */
1829 count_req := count_req + 1;
1830 repeat;
1831 }
1832 }
1833 if (count_req != 5) {
1834 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02001835 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02001836 }
1837 setverdict(pass);
1838}
1839
1840testcase TC_attach_check_complete_resend() runs on test_CT {
1841 /* MS -> SGSN: Attach Request IMSI
1842 * MS <- SGSN: Identity Request *
1843 * MS -> SGSN: Identity Response *
1844 * MS <- SGSN: Attach Complete 5x
1845 */
1846 var BSSGP_ConnHdlr vc_conn;
1847 f_init();
1848 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001849 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 +02001850 vc_conn.done;
1851}
1852
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001853private function f_routing_area_update(RoutingAreaIdentificationV ra, integer bssgp := 0) runs on BSSGP_ConnHdlr {
1854 var BssgpDecoded bd;
1855
1856 /* then send RAU */
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001857 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 +02001858 alt {
1859 [] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
Alexander Couzens90fe6a22018-07-31 19:37:32 +02001860 f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept, bssgp);
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001861 f_send_l3_gmm_llc(ts_GMM_RAU_COMPL, bssgp);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001862 setverdict(pass);
1863 }
1864 [] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
1865 setverdict(fail, "Unexpected RAU Reject");
1866 mtc.stop;
1867 }
1868 [] BSSGP[bssgp].receive { repeat; }
1869 }
1870}
1871
Alexander Couzensbfda9212018-07-31 03:17:33 +02001872private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
1873 var BssgpDecoded bd;
1874
1875 /* first perform regular attach */
1876 f_TC_attach(id);
1877
1878 /* then send RAU */
1879 f_routing_area_update(g_pars.ra);
1880
1881 /* do another RAU */
1882 f_routing_area_update(g_pars.ra);
1883
1884 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1885}
1886
1887testcase TC_attach_rau_a_a() runs on test_CT {
1888 /* MS <-> SGSN: Successful Attach
1889 * MS -> SGSN: Routing Area Update Request
1890 * MS <- SGSN: Routing Area Update Accept
1891 * MS -> SGSN: Routing Area Update Request
1892 * MS <- SGSN: Routing Area Update Accept
1893 * MS -> SGSN: Detach (PowerOff)
1894 */
1895 var BSSGP_ConnHdlr vc_conn;
1896 f_init();
1897 f_sleep(1.0);
1898 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
1899 vc_conn.done;
1900}
1901
Alexander Couzensbe837bd2018-07-31 04:20:11 +02001902private function f_TC_attach_rau_a_b(charstring id) runs on BSSGP_ConnHdlr {
1903 var BssgpDecoded bd;
1904
1905 f_TC_attach(id);
1906
1907 log("attach complete sending rau");
1908 f_routing_area_update(g_pars.ra, 0);
1909
1910 log("rau complete unregistering");
1911 f_bssgp_client_unregister(g_pars.imsi);
1912 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[1], BSSGP_PROC[1]);
1913
1914 log("sending second RAU via different RA");
1915 f_routing_area_update(f_cellid_to_RAI(g_pars.bssgp_cell_id[1]), 1);
1916
1917 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true, 1);
1918}
1919
1920testcase TC_attach_rau_a_b() runs on test_CT {
1921 /* MS <-> SGSN: Successful Attach
1922 * MS -> SGSN: Routing Area _a_ Update Request
1923 * MS <- SGSN: Routing Area _a_ Update Accept
1924 * MS -> SGSN: Routing Area _b_ Update Request
1925 * MS <- SGSN: Routing Area _b_ Update Accept
1926 * MS -> SGSN: Detach (PowerOff)
1927 */
1928 var BSSGP_ConnHdlr vc_conn;
1929 f_init();
1930 f_sleep(1.0);
1931 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_b), testcasename(), g_gb, 38);
1932 vc_conn.done;
1933}
1934
Harald Welte5ac31492018-02-15 20:39:13 +01001935control {
Harald Welte5b7c8122018-02-16 21:48:17 +01001936 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01001937 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001938 execute( TC_attach_umts_aka_umts_res() );
1939 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001940 execute( TC_attach_auth_id_timeout() );
1941 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01001942 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001943 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01001944 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01001945 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01001946 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01001947 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001948 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02001949 execute( TC_attach_no_imsi_response() );
Alexander Couzensf9858652018-06-07 16:14:53 +02001950 execute( TC_attach_closed_add_vty(), 10.0 );
Alexander Couzenscf818962018-06-05 18:00:00 +02001951 execute( TC_attach_check_subscriber_list(), 10.0 );
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001952 execute( TC_attach_detach_check_subscriber_list(), 10.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02001953 execute( TC_attach_check_complete_resend() );
Alexander Couzens5e307b42018-05-22 18:12:20 +02001954 execute( TC_hlr_location_cancel_request_update(), 10.0 );
Alexander Couzens234c5882018-05-29 15:48:44 +02001955 execute( TC_hlr_location_cancel_request_withdraw(), 10.0 );
1956 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 10.0 );
1957 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 10.0 );
Harald Welte04683d02018-02-16 22:43:45 +01001958 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01001959 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02001960 execute( TC_attach_rau_a_a() );
Alexander Couzensbe837bd2018-07-31 04:20:11 +02001961 execute( TC_attach_rau_a_b() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01001962 execute( TC_detach_unknown_nopoweroff() );
1963 execute( TC_detach_unknown_poweroff() );
1964 execute( TC_detach_nopoweroff() );
1965 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01001966 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01001967 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01001968 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001969 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01001970 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01001971 execute( TC_attach_pdp_act_user_deact_mt() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001972 execute( TC_attach_second_attempt() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001973 execute( TC_attach_restart_ctr_echo() );
1974 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001975 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001976 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Harald Welte5ac31492018-02-15 20:39:13 +01001977}
Harald Welte96a33b02018-02-04 10:36:22 +01001978
1979
1980
1981}