blob: eb1fff2cce9ce89b075c0b4850797b7518c533d5 [file] [log] [blame]
Harald Welte96a33b02018-02-04 10:36:22 +01001module SGSN_Tests {
2
Harald Welte34b5a952019-05-27 11:54:11 +02003/* Osmocom SGSN test suite in TTCN-3
4 * (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
5 * (C) 2018-2019 sysmocom - s.f.m.c. GmbH
6 * All rights reserved.
7 *
8 * Released under the terms of GNU General Public License, Version 2 or
9 * (at your option) any later version.
10 *
11 * SPDX-License-Identifier: GPL-2.0-or-later
12 */
13
Harald Welte900d01a2019-08-13 13:27:51 +020014friend module SGSN_Tests_Iu;
15
Harald Welte96a33b02018-02-04 10:36:22 +010016import from General_Types all;
17import from Osmocom_Types all;
Harald Welte37692d82018-02-18 15:21:34 +010018import from Native_Functions all;
Harald Welte96a33b02018-02-04 10:36:22 +010019import from NS_Types all;
20import from NS_Emulation all;
21import from BSSGP_Types all;
22import from BSSGP_Emulation all;
Harald Welte5ac31492018-02-15 20:39:13 +010023import from Osmocom_Gb_Types all;
Harald Welte26fbb6e2019-04-14 17:32:46 +020024import from SCCPasp_Types all;
Harald Welte5ac31492018-02-15 20:39:13 +010025
26import from MobileL3_CommonIE_Types all;
27import from MobileL3_GMM_SM_Types all;
28import from MobileL3_Types all;
29import from L3_Templates all;
30import from L3_Common all;
31
32import from GSUP_Emulation all;
33import from GSUP_Types all;
34import from IPA_Emulation all;
35
Harald Welte26fbb6e2019-04-14 17:32:46 +020036import from RAN_Adapter all;
37import from RAN_Emulation all;
38import from RANAP_Templates all;
39import from RANAP_PDU_Descriptions all;
40import from RANAP_IEs all;
41
Harald Welteeded9ad2018-02-17 20:57:34 +010042import from GTP_Emulation all;
43import from GTP_Templates all;
44import from GTP_CodecPort all;
45import from GTPC_Types all;
46import from GTPU_Types all;
47
Harald Weltea2526a82018-02-18 19:03:36 +010048import from LLC_Types all;
49import from LLC_Templates all;
50
51import from SNDCP_Types all;
52
Harald Weltebd194722018-02-16 22:11:08 +010053import from TELNETasp_PortType all;
54import from Osmocom_VTY_Functions all;
55
Neels Hofmeyr8df7d152018-03-14 19:03:28 +010056import from GSM_RR_Types all;
57
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020058import from MobileL3_MM_Types all;
59
Harald Welteeded9ad2018-02-17 20:57:34 +010060
Harald Welte5ac31492018-02-15 20:39:13 +010061modulepar {
62 /* IP/port on which we run our internal GSUP/HLR emulation */
63 charstring mp_hlr_ip := "127.0.0.1";
64 integer mp_hlr_port := 4222;
Harald Welteeded9ad2018-02-17 20:57:34 +010065 charstring mp_ggsn_ip := "127.0.0.2";
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +020066 integer mp_echo_interval := 5; /* in seconds. Only used in test enabling g_use_echo */
Alexander Couzens2c12b242018-07-31 00:30:11 +020067
Alexander Couzensf3c1b412018-08-24 00:42:51 +020068 NSConfigurations mp_nsconfig := {
69 {
70 local_udp_port := 21010,
71 local_ip := "127.0.0.1",
72 remote_udp_port := 23000,
73 remote_ip := "127.0.0.1",
74 nsvci := 97,
Harald Welte5e514fa2018-07-05 00:01:45 +020075 nsei := 96,
76 role_sgsn := false,
77 handle_sns := false
Alexander Couzensf3c1b412018-08-24 00:42:51 +020078 },
79 {
80 local_udp_port := 21011,
81 local_ip := "127.0.0.1",
82 remote_udp_port := 23000,
83 remote_ip := "127.0.0.1",
84 nsvci := 98,
Harald Welte5e514fa2018-07-05 00:01:45 +020085 nsei := 97,
86 role_sgsn := false,
87 handle_sns := false
Alexander Couzensf3c1b412018-08-24 00:42:51 +020088 },
89 {
90 local_udp_port := 21012,
91 local_ip := "127.0.0.1",
92 remote_udp_port := 23000,
93 remote_ip := "127.0.0.1",
94 nsvci := 99,
Harald Welte5e514fa2018-07-05 00:01:45 +020095 nsei := 98,
96 role_sgsn := false,
97 handle_sns := false
Alexander Couzensf3c1b412018-08-24 00:42:51 +020098 }
Alexander Couzens2c12b242018-07-31 00:30:11 +020099 };
Harald Welte26fbb6e2019-04-14 17:32:46 +0200100
101 RAN_Configurations mp_ranap_cfg := {
102 {
103 transport := RANAP_TRANSPORT_IuCS,
104 sccp_service_type := "mtp3_itu",
105 sctp_addr := { 23908, "127.0.0.1", 2905, "127.0.0.1" },
106 own_pc := 195,
107 own_ssn := 142,
108 peer_pc := 188, /* 0.23.4 */
109 peer_ssn := 142,
110 sio := '83'O,
111 rctx := 2
112 }
113 }
Harald Welte5ac31492018-02-15 20:39:13 +0100114};
115
116type record GbInstance {
117 NS_CT vc_NS,
118 BSSGP_CT vc_BSSGP,
119 BssgpConfig cfg
120};
Harald Welte96a33b02018-02-04 10:36:22 +0100121
Harald Welte2fa771f2019-05-02 20:13:53 +0200122const integer NUM_GB := 3;
123type record length(NUM_GB) of GbInstance GbInstances;
124type record length(NUM_GB) of NSConfiguration NSConfigurations;
125type record length(NUM_GB) of BssgpCellId BssgpCellIds;
Alexander Couzens51114d12018-07-31 18:41:56 +0200126
Harald Welte26fbb6e2019-04-14 17:32:46 +0200127const integer NUM_RNC := 1;
128type record of RAN_Configuration RAN_Configurations;
129
Harald Welte96a33b02018-02-04 10:36:22 +0100130type component test_CT {
Alexander Couzens51114d12018-07-31 18:41:56 +0200131 var GbInstances g_gb;
Harald Welte26fbb6e2019-04-14 17:32:46 +0200132 var RAN_Adapter g_ranap[NUM_RNC];
Alexander Couzens1552e792019-07-23 20:38:39 +0200133 var boolean g_ranap_enable := false;
Harald Welte96a33b02018-02-04 10:36:22 +0100134
Harald Welte5ac31492018-02-15 20:39:13 +0100135 var GSUP_Emulation_CT vc_GSUP;
136 var IPA_Emulation_CT vc_GSUP_IPA;
137 /* only to get events from IPA underneath GSUP */
138 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +0100139
Harald Welteeded9ad2018-02-17 20:57:34 +0100140 var GTP_Emulation_CT vc_GTP;
141
Harald Weltebd194722018-02-16 22:11:08 +0100142 port TELNETasp_PT SGSNVTY;
143
Harald Welte96a33b02018-02-04 10:36:22 +0100144 var boolean g_initialized := false;
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200145 var boolean g_use_echo := false;
Harald Welte96a33b02018-02-04 10:36:22 +0100146};
147
Harald Welte26fbb6e2019-04-14 17:32:46 +0200148type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr, RAN_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100149 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +0100150 timer g_Tguard;
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200151 var LLC_Entities llc;
Harald Welte5ac31492018-02-15 20:39:13 +0100152}
153
154type record SGSN_ConnHdlrNetworkPars {
155 boolean expect_ptmsi,
156 boolean expect_auth,
157 boolean expect_ciph
158};
159
160type record BSSGP_ConnHdlrPars {
161 /* IMEI of the simulated ME */
162 hexstring imei,
Alexander Couzens8f0fb002018-05-02 19:30:55 +0200163 /* IMSI of the simulated MS */
Harald Welte5ac31492018-02-15 20:39:13 +0100164 hexstring imsi,
165 /* MSISDN of the simulated MS (probably unused) */
166 hexstring msisdn,
167 /* P-TMSI allocated to the simulated MS */
168 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +0100169 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100170 /* TLLI of the simulated MS */
171 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +0100172 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100173 RoutingAreaIdentificationV ra optional,
Alexander Couzens51114d12018-07-31 18:41:56 +0200174 BssgpCellIds bssgp_cell_id,
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200175 /* Tracks the RNC state. If true next L3 message will be sent with InitiualUe */
176 boolean rnc_send_initial_ue,
Harald Welte5ac31492018-02-15 20:39:13 +0100177 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +0100178 SGSN_ConnHdlrNetworkPars net,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200179 float t_guard,
180 /* only in IuPS / RANAP case */
Alexander Couzens1552e792019-07-23 20:38:39 +0200181 SCCP_PAR_Address sccp_addr_local optional,
182 SCCP_PAR_Address sccp_addr_peer optional
Harald Welte5ac31492018-02-15 20:39:13 +0100183};
184
Alexander Couzens89508702018-07-31 04:16:10 +0200185private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200186 /* mcc_mnc is encoded as of 24.008 10.5.5.15 */
Alexander Couzens89508702018-07-31 04:16:10 +0200187 var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;
188
189 var RoutingAreaIdentificationV ret := {
190 mccDigit1 := mcc_mnc[0],
191 mccDigit2 := mcc_mnc[1],
192 mccDigit3 := mcc_mnc[2],
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200193 mncDigit3 := mcc_mnc[3],
194 mncDigit1 := mcc_mnc[4],
195 mncDigit2 := mcc_mnc[5],
Alexander Couzens89508702018-07-31 04:16:10 +0200196 lac := int2oct(cell_id.ra_id.lai.lac, 16),
197 rac := int2oct(cell_id.ra_id.rac, 8)
198 }
199 return ret;
200};
201
Alexander Couzens51114d12018-07-31 18:41:56 +0200202private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
203 gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset));
204 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset));
Harald Welte5ac31492018-02-15 20:39:13 +0100205 /* connect lower end of BSSGP emulation with NS upper port */
206 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
207 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
208 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
209
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200210 gb.vc_NS.start(NSStart(mp_nsconfig[offset]));
Harald Welte5ac31492018-02-15 20:39:13 +0100211 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
212}
213
214private function f_init_gsup(charstring id) runs on test_CT {
215 id := id & "-GSUP";
216 var GsupOps ops := {
217 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
218 };
219
220 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
221 vc_GSUP := GSUP_Emulation_CT.create(id);
222
223 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
224 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
225 /* we use this hack to get events like ASP_IPA_EVENT_UP */
226 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
227
228 vc_GSUP.start(GSUP_Emulation.main(ops, id));
229 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
230
231 /* wait for incoming connection to GSUP port before proceeding */
232 timer T := 10.0;
233 T.start;
234 alt {
235 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
236 [] T.timeout {
237 setverdict(fail, "No connection to GSUP Port");
Daniel Willmannafce8662018-07-06 23:11:32 +0200238 mtc.stop;
Harald Welte5ac31492018-02-15 20:39:13 +0100239 }
240 }
241}
242
Harald Welteeded9ad2018-02-17 20:57:34 +0100243private function f_init_gtp(charstring id) runs on test_CT {
244 id := id & "-GTP";
245
246 var GtpEmulationCfg gtp_cfg := {
247 gtpc_bind_ip := mp_ggsn_ip,
248 gtpc_bind_port := GTP1C_PORT,
249 gtpu_bind_ip := mp_ggsn_ip,
250 gtpu_bind_port := GTP1U_PORT,
251 sgsn_role := false
252 };
253
254 vc_GTP := GTP_Emulation_CT.create(id);
255 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
256}
257
Harald Weltebd194722018-02-16 22:11:08 +0100258private function f_init_vty() runs on test_CT {
259 map(self:SGSNVTY, system:SGSNVTY);
260 f_vty_set_prompts(SGSNVTY);
261 f_vty_transceive(SGSNVTY, "enable");
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200262 f_vty_transceive(SGSNVTY, "reset sgsn state");
Harald Weltebd194722018-02-16 22:11:08 +0100263 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
264}
265
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200266private function f_vty_enable_echo_interval(boolean enable) runs on test_CT {
267 if (enable) {
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +0200268 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 echo-interval " & int2str(mp_echo_interval));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200269 } else {
270 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 no echo-interval");
271 }
272}
273
Harald Weltebd194722018-02-16 22:11:08 +0100274
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200275/* mcc_mnc is 24.008 10.5.5.15 encoded. 262 42 */
276function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
Harald Welte26fbb6e2019-04-14 17:32:46 +0200277 var integer i;
278
Harald Welte96a33b02018-02-04 10:36:22 +0100279 if (g_initialized == true) {
280 return;
281 }
282 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100283 g_gb[0].cfg := {
284 nsei := 96,
285 bvci := 196,
286 cell_id := {
287 ra_id := {
288 lai := {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100289 mcc_mnc := mcc_mnc, lac := 13135},
Harald Welte5ac31492018-02-15 20:39:13 +0100290 rac := 0
291 },
292 cell_id := 20960
293 },
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200294 sgsn_role := false,
295 depth := BSSGP_DECODE_DEPTH_L3
Harald Welte5ac31492018-02-15 20:39:13 +0100296 };
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200297 g_gb[1].cfg := {
298 nsei := 97,
299 bvci := 210,
300 cell_id := {
301 ra_id := {
302 lai := {
303 mcc_mnc := mcc_mnc, lac := 13200},
304 rac := 0
305 },
306 cell_id := 20961
307 },
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200308 sgsn_role := false,
309 depth := BSSGP_DECODE_DEPTH_L3
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200310 };
311 g_gb[2].cfg := {
312 nsei := 98,
313 bvci := 220,
314 cell_id := {
315 ra_id := {
316 lai := {
317 mcc_mnc := mcc_mnc, lac := 13300},
318 rac := 0
319 },
320 cell_id := 20962
321 },
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200322 sgsn_role := false,
323 depth := BSSGP_DECODE_DEPTH_L3
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200324 };
Harald Welte96a33b02018-02-04 10:36:22 +0100325
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200326 f_init_vty();
Alexander Couzens51114d12018-07-31 18:41:56 +0200327 f_init_gb(g_gb[0], "SGSN_Test-Gb0", 0);
328 f_init_gb(g_gb[1], "SGSN_Test-Gb1", 1);
329 f_init_gb(g_gb[2], "SGSN_Test-Gb2", 2);
Harald Welte26fbb6e2019-04-14 17:32:46 +0200330
Alexander Couzens1552e792019-07-23 20:38:39 +0200331 if (g_ranap_enable) {
332 for (i := 0; i < NUM_RNC; i := i+1) {
333 f_ran_adapter_init(g_ranap[i], mp_ranap_cfg[i], "SGSN_Test_" & int2str(i), RNC_RanOps);
334 f_ran_adapter_start(g_ranap[i]);
335 }
Harald Welte26fbb6e2019-04-14 17:32:46 +0200336 }
Harald Welte5ac31492018-02-15 20:39:13 +0100337 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100338 f_init_gtp("SGSN_Test");
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200339 f_vty_enable_echo_interval(g_use_echo);
Harald Welte5ac31492018-02-15 20:39:13 +0100340}
Harald Welte96a33b02018-02-04 10:36:22 +0100341
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200342function f_cleanup() runs on test_CT {
343 var integer i;
Alexander Couzens1552e792019-07-23 20:38:39 +0200344 if (g_ranap_enable) {
345 for (i := 0; i < NUM_RNC; i := i+1) {
346 f_ran_adapter_cleanup(g_ranap[i]);
347 }
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200348 }
349 self.stop;
350}
351
Harald Welte26fbb6e2019-04-14 17:32:46 +0200352private function RncUnitdataCallback(RANAP_PDU ranap)
353runs on RAN_Emulation_CT return template RANAP_PDU {
354 var template RANAP_PDU resp := omit;
355
356 log ("RANAP_RncUnitDataCallback");
357 /* answer all RESET with RESET ACK */
358 if (match(ranap, tr_RANAP_Reset)) {
359 log("RANAP_RncUnitdataCallback: Responding to RESET with RESET-ACK");
360 var CN_DomainIndicator dom;
361 dom := ranap.initiatingMessage.value_.Reset.protocolIEs[1].value_.cN_DomainIndicator;
362 resp := ts_RANAP_ResetAck(dom);
363 }
364 return resp;
365}
366
367const RanOps RNC_RanOps := {
368 ranap_create_cb := refers(RAN_Emulation.RanapExpectedCreateCallback),
369 ranap_unitdata_cb := refers(RncUnitdataCallback),
370 ps_domain := true,
371 decode_dtap := true,
372 role_ms := true,
373 protocol := RAN_PROTOCOL_RANAP,
374 transport := RANAP_TRANSPORT_IuCS,
375 use_osmux := false,
376 sccp_addr_local := omit,
377 sccp_addr_peer := omit
378};
379
Harald Welte5ac31492018-02-15 20:39:13 +0100380type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
381
382/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Alexander Couzens51114d12018-07-31 18:41:56 +0200383function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix,
Harald Welte62e29582018-02-16 21:17:11 +0100384 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100385runs on test_CT return BSSGP_ConnHdlr {
386 var BSSGP_ConnHdlr vc_conn;
387 var SGSN_ConnHdlrNetworkPars net_pars := {
388 expect_ptmsi := true,
389 expect_auth := true,
390 expect_ciph := false
391 };
392 var BSSGP_ConnHdlrPars pars := {
393 imei := f_gen_imei(imsi_suffix),
394 imsi := f_gen_imsi(imsi_suffix),
395 msisdn := f_gen_msisdn(imsi_suffix),
396 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100397 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100398 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100399 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100400 ra := omit,
Alexander Couzens51114d12018-07-31 18:41:56 +0200401 bssgp_cell_id := { gb[0].cfg.cell_id, gb[1].cfg.cell_id, gb[2].cfg.cell_id },
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200402 rnc_send_initial_ue := true,
Harald Welte5ac31492018-02-15 20:39:13 +0100403 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100404 net := net_pars,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200405 t_guard := t_guard,
Alexander Couzens1552e792019-07-23 20:38:39 +0200406 sccp_addr_local := omit,
407 sccp_addr_peer := omit
Harald Welte5ac31492018-02-15 20:39:13 +0100408 };
409
Alexander Couzens1552e792019-07-23 20:38:39 +0200410 if (g_ranap_enable) {
411 pars.sccp_addr_local := g_ranap[0].sccp_addr_own;
412 pars.sccp_addr_peer := g_ranap[0].sccp_addr_peer;
413 }
414
Harald Welte5ac31492018-02-15 20:39:13 +0100415 vc_conn := BSSGP_ConnHdlr.create(id);
Alexander Couzens51114d12018-07-31 18:41:56 +0200416 connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP:BSSGP_SP);
417 connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP:BSSGP_PROC);
418 connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP:BSSGP_SP);
419 connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP:BSSGP_PROC);
420 connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP:BSSGP_SP);
421 connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP:BSSGP_PROC);
Harald Welte5ac31492018-02-15 20:39:13 +0100422
Harald Welte26fbb6e2019-04-14 17:32:46 +0200423 /* FIXME: support multiple RNCs */
Alexander Couzens1552e792019-07-23 20:38:39 +0200424 if (g_ranap_enable) {
425 connect(vc_conn:BSSAP, g_ranap[0].vc_RAN:CLIENT);
426 connect(vc_conn:BSSAP_PROC, g_ranap[0].vc_RAN:PROC);
427 }
Harald Welte26fbb6e2019-04-14 17:32:46 +0200428
Harald Welte5ac31492018-02-15 20:39:13 +0100429 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
430 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
431
Harald Welteeded9ad2018-02-17 20:57:34 +0100432 connect(vc_conn:GTP, vc_GTP:CLIENT);
433 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
434
Harald Welte5ac31492018-02-15 20:39:13 +0100435 vc_conn.start(f_handler_init(fn, id, pars));
436 return vc_conn;
437}
438
Harald Welte62e29582018-02-16 21:17:11 +0100439private altstep as_Tguard() runs on BSSGP_ConnHdlr {
440 [] g_Tguard.timeout {
441 setverdict(fail, "Tguard timeout");
Daniel Willmannafce8662018-07-06 23:11:32 +0200442 mtc.stop;
Harald Welte62e29582018-02-16 21:17:11 +0100443 }
444}
445
Harald Welte5ac31492018-02-15 20:39:13 +0100446/* first function called in every ConnHdlr */
447private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
448runs on BSSGP_ConnHdlr {
449 /* do some common stuff like setting up g_pars */
450 g_pars := pars;
451
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200452 llc := f_llc_create(false);
453
Harald Welte5ac31492018-02-15 20:39:13 +0100454 /* register with BSSGP core */
Alexander Couzens51114d12018-07-31 18:41:56 +0200455 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welte5ac31492018-02-15 20:39:13 +0100456 /* tell GSUP dispatcher to send this IMSI to us */
457 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100458 /* tell GTP dispatcher to send this IMSI to us */
459 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100460
Harald Welte62e29582018-02-16 21:17:11 +0100461 g_Tguard.start(pars.t_guard);
462 activate(as_Tguard());
463
Harald Welte5ac31492018-02-15 20:39:13 +0100464 /* call the user-supplied test case function */
465 fn.apply(id);
466 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100467}
468
469/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100470 * Detach without Attach
471 * SM procedures without attach / RAU
472 * ATTACH / RAU
473 ** with / without authentication
474 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100475 * re-transmissions of LLC frames
476 * PDP Context activation
477 ** with different GGSN config in SGSN VTY
478 ** with different PDP context type (v4/v6/v46)
479 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100480 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100481 */
482
483testcase TC_wait_ns_up() runs on test_CT {
484 f_init();
485 f_sleep(20.0);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200486 f_cleanup();
Harald Welte96a33b02018-02-04 10:36:22 +0100487}
488
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200489friend function is_gb(integer ran_index) return boolean {
490 return ran_index < NUM_GB;
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200491}
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200492friend function is_iu(integer ran_index) return boolean {
493 return ran_index >= NUM_GB;
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200494}
495
Alexander Couzens0507ec32019-09-15 22:41:22 +0200496function f_send_llc(template (value) PDU_LLC llc_pdu, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltea05b8072019-04-23 22:35:05 +0200497 var octetstring llc_enc := enc_PDU_LLC(valueof(llc_pdu));
Alexander Couzens0507ec32019-09-15 22:41:22 +0200498 BSSGP[ran_index].send(ts_BSSGP_UL_UD(g_pars.tlli, g_pars.bssgp_cell_id[ran_index], llc_enc));
Harald Weltea05b8072019-04-23 22:35:05 +0200499}
500
Alexander Couzens0507ec32019-09-15 22:41:22 +0200501private function f_send_l3_gmm_llc(template (value) PDU_L3_MS_SGSN l3_mo, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200502 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
503 var BIT4 sapi := f_llc_sapi_by_l3_mo(valueof(l3_mo));
504 var integer n_u := f_llc_get_n_u_tx(llc[bit2int(sapi)]);
Alexander Couzens0507ec32019-09-15 22:41:22 +0200505 f_send_llc(ts_LLC_UI(l3_enc, sapi, '0'B, n_u), ran_index);
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200506}
507
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200508/* trigger sending of a RANAP InitialUE and wait for SCCP connection confirmation */
509function f_send_l3_initial_ue(template (value) PDU_L3_MS_SGSN l3_mo) runs on BSSGP_ConnHdlr {
510 log("Sending InitialUE: ", l3_mo);
511 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
512 var RANAP_PDU ranap;
513 var LAI lai := {
514 pLMNidentity := '62F224'O,
515 lAC := '1234'O,
516 iE_Extensions := omit
517 };
518 var SAI sai := {
519 pLMNidentity := lai.pLMNidentity,
520 lAC := lai.lAC,
521 sAC := '0000'O, /* FIXME */
522 iE_Extensions := omit
523 };
524 var IuSignallingConnectionIdentifier sigc_id := int2bit(23, 24); /* FIXME */
525 var GlobalRNC_ID grnc_id := {
526 pLMNidentity := lai.pLMNidentity,
527 rNC_ID := 2342 /* FIXME */
528 };
529
530 ranap := valueof(ts_RANAP_initialUE_CS(lai, sai, l3_enc, sigc_id, grnc_id));
531 BSSAP.send(ts_RANAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_local, ranap));
532 alt {
533 [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {}
534 [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
535 setverdict(fail, "DISC.ind from SCCP");
536 mtc.stop;
537 }
538 }
539}
540
541/* send a L3 (GMM/SM) message over whatever is the appropriate lower-layer bearer */
Alexander Couzens0507ec32019-09-15 22:41:22 +0200542function f_send_l3(template (value) PDU_L3_MS_SGSN l3_mo, integer ran_index := 0) runs on BSSGP_ConnHdlr {
543 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200544 if (g_pars.rnc_send_initial_ue) {
545 g_pars.rnc_send_initial_ue := false;
546 f_send_l3_initial_ue(l3_mo);
547 } else {
548 BSSAP.send(ts_PDU_DTAP_PS_MO(l3_mo));
549 }
550 } else {
Alexander Couzens0507ec32019-09-15 22:41:22 +0200551 f_send_l3_gmm_llc(l3_mo, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200552 }
553}
554
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200555altstep as_mm_identity(integer ran_index := 0) runs on BSSGP_ConnHdlr {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100556 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200557 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_ID_REQ('001'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100558 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200559 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100560 repeat;
561 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200562 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200563 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200564 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200565 repeat;
566 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200567 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_ID_REQ('010'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100568 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200569 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200570 repeat;
571 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200572 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200573 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200574 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100575 repeat;
576 }
577}
Harald Welte96a33b02018-02-04 10:36:22 +0100578
Harald Welteca362462019-05-02 20:11:21 +0200579/* receive a L3 (GMM/SM) message over whatever is the appropriate lower-layer bearer */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200580function f_receive_l3(template PDU_L3_SGSN_MS rx_tpl := ?, integer ran_index := 0)
Harald Welteca362462019-05-02 20:11:21 +0200581runs on BSSGP_ConnHdlr return PDU_L3_SGSN_MS {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200582 var PDU_DTAP_PS_MT mt;
Harald Welteca362462019-05-02 20:11:21 +0200583 var PDU_L3_SGSN_MS l3_mt;
584 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200585 [is_gb(ran_index)] BSSGP[ran_index].receive(rx_tpl) -> value l3_mt { }
586 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(rx_tpl)) -> value mt {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200587 l3_mt := mt.dtap;
588 }
Harald Welteca362462019-05-02 20:11:21 +0200589 }
590 return l3_mt;
591}
592
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200593/* perform GMM authentication (if expected).
594 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
595 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200596function f_gmm_auth (boolean umts_aka_challenge := false, boolean force_gsm_sres := false, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100597 var PDU_L3_MS_SGSN l3_mo;
598 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200599 var default di := activate(as_mm_identity(ran_index));
Harald Welte5ac31492018-02-15 20:39:13 +0100600 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200601 var GSUP_IE auth_tuple;
602 var template AuthenticationParameterAUTNTLV autn;
603
604 if (umts_aka_challenge) {
605 g_pars.vec := f_gen_auth_vec_3g();
606 autn := {
607 elementIdentifier := '28'O,
608 lengthIndicator := lengthof(g_pars.vec.autn),
609 autnValue := g_pars.vec.autn
610 };
611
612 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
613 g_pars.vec.sres,
614 g_pars.vec.kc,
615 g_pars.vec.ik,
616 g_pars.vec.ck,
617 g_pars.vec.autn,
618 g_pars.vec.res));
619 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
620 } else {
621 g_pars.vec := f_gen_auth_vec_2g();
622 autn := omit;
623 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
624 g_pars.vec.sres,
625 g_pars.vec.kc));
626 log("GSUP sends only 2G auth tuple", auth_tuple);
627 }
Harald Welteca362462019-05-02 20:11:21 +0200628
Harald Welte5ac31492018-02-15 20:39:13 +0100629 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
630 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200631
632 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
633 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200634 l3_mt := f_receive_l3(auth_ciph_req, ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100635 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200636 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
637
638 if (umts_aka_challenge and not force_gsm_sres) {
639 /* set UMTS response instead */
640 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
641 valueField := substr(g_pars.vec.res, 0, 4)
642 };
643 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
644 elementIdentifier := '21'O,
645 lengthIndicator := lengthof(g_pars.vec.res) - 4,
646 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
647 };
648 }
649
650 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100651 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
652 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
653 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
654 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
655 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200656 f_send_l3(l3_mo, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200657
658 /* Security Mode Command + Complete on Iu case */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200659 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200660 BSSAP.receive(tr_RANAP_SecurityModeCmd(uia_algs := ?, uia_key := oct2bit(g_pars.vec.ik),
661 key_sts := ?)) {
662 var IntegrityProtectionAlgorithm uia_chosen := 0; /* 0 = standard_UMTS_integrity_algorithm_UIA1 */
663 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
Alexander Couzensed61ae82019-09-15 23:18:08 +0200664 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)))
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200665 }
666 }
Harald Welte76dee092018-02-16 22:12:59 +0100667 } else {
668 /* wait for identity procedure */
669 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100670 }
Harald Welte76dee092018-02-16 22:12:59 +0100671
Harald Welte5ac31492018-02-15 20:39:13 +0100672 deactivate(di);
673}
674
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200675function f_upd_ptmsi_and_tlli(OCT4 p_tmsi, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltef70997d2018-02-17 10:11:19 +0100676 g_pars.p_tmsi := p_tmsi;
677 /* update TLLI */
678 g_pars.tlli_old := g_pars.tlli;
679 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
Daniel Willmann1c2ff0f2020-01-28 14:39:25 +0100680 if (is_gb(ran_index)) {
681 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli, BSSGP_PROC[ran_index]);
682 }
Harald Weltef70997d2018-02-17 10:11:19 +0100683}
684
Harald Welte04683d02018-02-16 22:43:45 +0100685function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
686 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100687 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Alexander Couzens51114d12018-07-31 18:41:56 +0200688 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100689 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Alexander Couzens51114d12018-07-31 18:41:56 +0200690 & "; expected " & hex2str(g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200691 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100692 }
Harald Welte04683d02018-02-16 22:43:45 +0100693 g_pars.ra := aa.routingAreaIdentification;
694 if (ispresent(aa.allocatedPTMSI)) {
695 if (not g_pars.net.expect_ptmsi) {
696 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200697 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100698 }
Harald Weltef70997d2018-02-17 10:11:19 +0100699 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100700 }
701 if (ispresent(aa.msIdentity)) {
702 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200703 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100704 }
705 /* P-TMSI.sig */
706 if (ispresent(aa.ptmsiSignature)) {
707 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
708 }
709 /* updateTimer */
710 // aa.readyTimer
711 /* T3302, T3319, T3323, T3312_ext, T3324 */
712}
713
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200714function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +0100715 /* mandatory IE */
716 g_pars.ra := ra.routingAreaId;
717 if (ispresent(ra.allocatedPTMSI)) {
718 if (not g_pars.net.expect_ptmsi) {
719 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200720 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100721 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200722 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets, ran_index);
Harald Welte91636de2018-02-17 10:16:14 +0100723 }
724 if (ispresent(ra.msIdentity)) {
725 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200726 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100727 }
728 /* P-TMSI.sig */
729 if (ispresent(ra.ptmsiSignature)) {
730 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
731 }
732 /* updateTimer */
733 // aa.readyTimer
734 /* T3302, T3319, T3323, T3312_ext, T3324 */
735}
736
737
Harald Welte5a4fa042018-02-16 20:59:21 +0100738function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
739 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
740}
741
Harald Welte23178c52018-02-17 09:36:33 +0100742/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100743private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileL3_CommonIE_Types.MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100744 if (ispresent(g_pars.p_tmsi)) {
745 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
746 } else {
747 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
748 }
749}
750
Harald Welte311ec272018-02-17 09:40:03 +0100751private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100752 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100753 /* Expect MSC to perform LU with HLR */
754 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100755 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
756 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
757 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100758 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
759 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
760}
761
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200762friend function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte5a4fa042018-02-16 20:59:21 +0100763 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200764 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
Harald Welteca362462019-05-02 20:11:21 +0200765 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5ac31492018-02-15 20:39:13 +0100766
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200767 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
768 * 3G auth vectors */
769 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
770 /* The thing is, if the solSACapability is 'omit', then the
771 * revisionLevelIndicatior is at the wrong place! */
772 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
773
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200774 f_send_l3(attach_req, ran_index);
775 f_gmm_auth(umts_aka_challenge, force_gsm_sres, ran_index);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200776 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100777 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100778
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200779 l3_mt := f_receive_l3(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?), ran_index);
Harald Welteca362462019-05-02 20:11:21 +0200780 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
781
Harald Welte04683d02018-02-16 22:43:45 +0100782 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200783 f_send_l3(ts_GMM_ATTACH_COMPL, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200784
785 /* IuPS case: Expect Iu Release */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200786 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200787 as_iu_release_compl_disc();
788 }
Alexander Couzens42d3cad2019-10-08 16:29:26 +0200789
790 /* Race condition
791 * It has shown, that GMM_ATTACH_COMPL might take some time to arrive at the SGSN through the layers.
792 * In TC hlr_location_cancel_request_update, the GMM_ATTACH_COMPL came 2ms too late, so that the Location Cancel Request
793 * arrived before it. This results in a test case failure.
794 * Delay execution by 50 ms
795 */
796 f_sleep(0.05);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200797}
798
799private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
800 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100801 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100802}
803
804testcase TC_attach() runs on test_CT {
805 var BSSGP_ConnHdlr vc_conn;
806 f_init();
807 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200808 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100809 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200810 f_cleanup();
Harald Welte5ac31492018-02-15 20:39:13 +0100811}
812
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100813testcase TC_attach_mnc3() runs on test_CT {
814 var BSSGP_ConnHdlr vc_conn;
815 f_init('023042'H);
816 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200817 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100818 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200819 f_cleanup();
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100820}
821
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200822private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
823 f_gmm_attach(true, false);
824 setverdict(pass);
825}
826testcase TC_attach_umts_aka_umts_res() runs on test_CT {
827 var BSSGP_ConnHdlr vc_conn;
828 f_init();
829 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200830 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200831 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200832 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200833}
834
835private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
836 f_gmm_attach(true, true);
837 setverdict(pass);
838}
839testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
840 var BSSGP_ConnHdlr vc_conn;
841 f_init();
842 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200843 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200844 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200845 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200846}
847
Harald Welte5b7c8122018-02-16 21:48:17 +0100848/* MS never responds to ID REQ, expect ATTACH REJECT */
849private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100850 var RoutingAreaIdentificationV old_ra := f_random_RAI();
851
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200852 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100853 alt {
Harald Welte955aa942019-05-03 01:29:29 +0200854 [] BSSGP[0].receive(tr_GMM_ID_REQ(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100855 /* don't send ID Response */
856 repeat;
857 }
Harald Welte955aa942019-05-03 01:29:29 +0200858 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('09'O)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100859 setverdict(pass);
860 }
Harald Welte955aa942019-05-03 01:29:29 +0200861 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100862 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +0200863 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100864 }
865 }
866}
867testcase TC_attach_auth_id_timeout() runs on test_CT {
868 var BSSGP_ConnHdlr vc_conn;
869 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200870 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 +0100871 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200872 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +0100873}
874
875/* HLR never responds to SAI REQ, expect ATTACH REJECT */
876private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100877 var RoutingAreaIdentificationV old_ra := f_random_RAI();
878
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200879 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100880 alt {
881 [] as_mm_identity();
882 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
883 }
884 /* don't send SAI-response from HLR */
Harald Welte955aa942019-05-03 01:29:29 +0200885 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Welte5b7c8122018-02-16 21:48:17 +0100886 setverdict(pass);
887}
888testcase TC_attach_auth_sai_timeout() runs on test_CT {
889 var BSSGP_ConnHdlr vc_conn;
890 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200891 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +0100892 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200893 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +0100894}
895
Harald Weltefe253882018-02-17 09:25:00 +0100896/* HLR rejects SAI, expect ATTACH REJECT */
897private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100898 var RoutingAreaIdentificationV old_ra := f_random_RAI();
899
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200900 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +0100901 alt {
902 [] as_mm_identity();
903 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
904 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
905 }
906 }
Harald Welte955aa942019-05-03 01:29:29 +0200907 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Weltefe253882018-02-17 09:25:00 +0100908 setverdict(pass);
909}
910testcase TC_attach_auth_sai_reject() runs on test_CT {
911 var BSSGP_ConnHdlr vc_conn;
912 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200913 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +0100914 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200915 f_cleanup();
Harald Weltefe253882018-02-17 09:25:00 +0100916}
917
Harald Welte5b7c8122018-02-16 21:48:17 +0100918/* HLR never responds to UL REQ, expect ATTACH REJECT */
919private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +0200920 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5b7c8122018-02-16 21:48:17 +0100921 var RoutingAreaIdentificationV old_ra := f_random_RAI();
922
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200923 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100924 f_gmm_auth();
925 /* Expect MSC to perform LU with HLR */
926 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
927 /* Never follow-up with ISD_REQ or UL_RES */
928 alt {
Harald Welte955aa942019-05-03 01:29:29 +0200929 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100930 setverdict(pass);
931 }
Harald Welte955aa942019-05-03 01:29:29 +0200932 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
933 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100934 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200935 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100936 }
937 }
938}
939testcase TC_attach_gsup_lu_timeout() runs on test_CT {
940 var BSSGP_ConnHdlr vc_conn;
941 f_init();
942 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200943 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100944 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200945 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +0100946}
947
Harald Welteb7c14e92018-02-17 09:29:16 +0100948/* HLR rejects UL REQ, expect ATTACH REJECT */
949private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +0200950 var PDU_L3_SGSN_MS l3_mt;
Harald Welteb7c14e92018-02-17 09:29:16 +0100951 var RoutingAreaIdentificationV old_ra := f_random_RAI();
952
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200953 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +0100954 f_gmm_auth();
955 /* Expect MSC to perform LU with HLR */
956 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
957 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
958 }
959 alt {
Harald Welte955aa942019-05-03 01:29:29 +0200960 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb7c14e92018-02-17 09:29:16 +0100961 setverdict(pass);
962 }
Harald Welte955aa942019-05-03 01:29:29 +0200963 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
964 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welteb7c14e92018-02-17 09:29:16 +0100965 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200966 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +0100967 }
968 }
969}
970testcase TC_attach_gsup_lu_reject() runs on test_CT {
971 var BSSGP_ConnHdlr vc_conn;
972 f_init();
973 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200974 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +0100975 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200976 f_cleanup();
Harald Welteb7c14e92018-02-17 09:29:16 +0100977}
978
979
Harald Welte3823e2e2018-02-16 21:53:48 +0100980/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
981private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +0200982 var PDU_L3_SGSN_MS l3_mt;
Harald Welte3823e2e2018-02-16 21:53:48 +0100983 var RoutingAreaIdentificationV old_ra := f_random_RAI();
984
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200985 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +0100986 f_gmm_auth();
987 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100988 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100989
Harald Welte955aa942019-05-03 01:29:29 +0200990 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
991 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +0100992 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200993 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +0100994 setverdict(pass);
995}
Harald Welte3823e2e2018-02-16 21:53:48 +0100996testcase TC_attach_combined() runs on test_CT {
997 var BSSGP_ConnHdlr vc_conn;
998 f_init();
999 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001000 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +01001001 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001002 f_cleanup();
Harald Welte3823e2e2018-02-16 21:53:48 +01001003}
1004
Harald Welte76dee092018-02-16 22:12:59 +01001005/* Attempt of GPRS ATTACH in 'accept all' mode */
1006private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001007 var PDU_L3_SGSN_MS l3_mt;
Harald Welte76dee092018-02-16 22:12:59 +01001008 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1009
1010 g_pars.net.expect_auth := false;
1011
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001012 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +01001013 f_gmm_auth();
Harald Welte955aa942019-05-03 01:29:29 +02001014 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1015 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001016 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001017 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +01001018 setverdict(pass);
1019}
1020testcase TC_attach_accept_all() runs on test_CT {
1021 var BSSGP_ConnHdlr vc_conn;
1022 f_init();
1023 f_sleep(1.0);
1024 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +02001025 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +01001026 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001027 f_cleanup();
Harald Welte76dee092018-02-16 22:12:59 +01001028}
Harald Welte5b7c8122018-02-16 21:48:17 +01001029
Harald Welteb2124b22018-02-16 22:26:56 +01001030/* Attempt of GPRS ATTACH in 'accept all' mode */
1031private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +01001032 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1033
1034 /* Simulate a foreign IMSI */
1035 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +02001036 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welteb2124b22018-02-16 22:26:56 +01001037
1038 g_pars.net.expect_auth := false;
1039
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001040 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +01001041 alt {
1042 [] as_mm_identity();
Harald Welte955aa942019-05-03 01:29:29 +02001043 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('07'O)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001044 setverdict(pass);
1045 }
Harald Welte955aa942019-05-03 01:29:29 +02001046 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001047 setverdict(pass);
1048 }
Harald Welte955aa942019-05-03 01:29:29 +02001049 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001050 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001051 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001052 }
Harald Welteb2124b22018-02-16 22:26:56 +01001053 }
1054}
1055testcase TC_attach_closed() runs on test_CT {
1056 var BSSGP_ConnHdlr vc_conn;
1057 f_init();
1058 f_sleep(1.0);
1059 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1060 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001061 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +01001062 vc_conn.done;
1063 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001064 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +01001065 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001066 f_cleanup();
Harald Welteb2124b22018-02-16 22:26:56 +01001067}
1068
Harald Welte04683d02018-02-16 22:43:45 +01001069/* Routing Area Update from Unknown TLLI -> REJECT */
1070private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +01001071 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1072
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001073 f_send_l3(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, old_ra, false, omit, omit));
Harald Welte04683d02018-02-16 22:43:45 +01001074 alt {
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01001075 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) { /* gmm cause: implicitly detached */
Harald Welte04683d02018-02-16 22:43:45 +01001076 setverdict(pass);
1077 }
1078 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001079 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +01001080 }
1081}
1082testcase TC_rau_unknown() runs on test_CT {
1083 var BSSGP_ConnHdlr vc_conn;
1084 f_init();
1085 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001086 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +01001087 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001088 f_cleanup();
Harald Welte04683d02018-02-16 22:43:45 +01001089}
1090
Harald Welte91636de2018-02-17 10:16:14 +01001091private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +01001092 /* first perform regular attach */
1093 f_TC_attach(id);
1094
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001095 f_routing_area_update(g_pars.ra);
1096
Harald Welte91636de2018-02-17 10:16:14 +01001097}
1098testcase TC_attach_rau() runs on test_CT {
1099 var BSSGP_ConnHdlr vc_conn;
1100 f_init();
1101 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001102 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +01001103 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001104 f_cleanup();
Harald Welte91636de2018-02-17 10:16:14 +01001105}
Harald Welte04683d02018-02-16 22:43:45 +01001106
Harald Welte6abb9fe2018-02-17 15:24:48 +01001107/* general GPRS DETACH helper */
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001108function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001109 var PDU_L3_SGSN_MS l3_mt;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001110 timer T := 5.0;
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001111 f_send_l3(ts_GMM_DET_REQ_MO(detach_type, power_off), ran_index);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001112 if (expect_purge) {
1113 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
1114 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
1115 }
1116 T.start;
1117 alt {
1118 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
1119 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +02001120 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001121 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001122 [power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001123 g_pars.ra := omit;
Alexander Couzens8e0fd462019-05-11 01:20:55 +02001124 setverdict(fail, "Unexpected DETACH ACCEPT in power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +02001125 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001126 /* TODO: check if any PDP contexts are deactivated on network side? */
1127 }
1128 [power_off] T.timeout {
1129 setverdict(pass);
1130 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001131 [not power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001132 g_pars.ra := omit;
1133 setverdict(pass);
1134 /* TODO: check if any PDP contexts are deactivated on network side? */
1135 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001136 [] BSSGP[ran_index].receive(PDU_L3_SGSN_MS:?) -> value l3_mt {
Alexander Couzens4630e742019-05-11 01:50:10 +02001137 if (power_off) {
1138 setverdict(fail, "Unexpected Layer 3 package received in power-off DETACH");
1139 } else {
1140 setverdict(fail, "Unexpected Layer 3 package received in normal DETACH");
1141 }
1142 mtc.stop;
1143 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001144 [] BSSGP[ran_index].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +01001145 }
1146}
1147
1148/* IMSI DETACH (non-power-off) for unknown TLLI */
1149private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1150 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
1151}
1152testcase TC_detach_unknown_nopoweroff() runs on test_CT {
1153 var BSSGP_ConnHdlr vc_conn;
1154 f_init();
1155 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001156 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001157 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001158 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001159}
1160
1161/* IMSI DETACH (power-off) for unknown TLLI */
1162private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1163 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
1164}
1165testcase TC_detach_unknown_poweroff() runs on test_CT {
1166 var BSSGP_ConnHdlr vc_conn;
1167 f_init();
1168 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001169 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001170 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001171 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001172}
1173
1174/* IMSI DETACH (non-power-off) for known TLLI */
1175private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1176 /* first perform regular attach */
1177 f_TC_attach(id);
1178
1179 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
1180}
1181testcase TC_detach_nopoweroff() runs on test_CT {
1182 var BSSGP_ConnHdlr vc_conn;
1183 f_init();
1184 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001185 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001186 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001187 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001188}
1189
1190/* IMSI DETACH (power-off) for known TLLI */
1191private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1192 /* first perform regular attach */
1193 f_TC_attach(id);
1194
1195 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1196}
1197testcase TC_detach_poweroff() runs on test_CT {
1198 var BSSGP_ConnHdlr vc_conn;
1199 f_init();
1200 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001201 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001202 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001203 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001204}
1205
Harald Welteeded9ad2018-02-17 20:57:34 +01001206type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +01001207 BIT3 tid, /* L3 Transaction ID */
1208 BIT4 nsapi, /* SNDCP NSAPI */
1209 BIT4 sapi, /* LLC SAPI */
1210 QoSV qos, /* QoS parameters */
1211 PDPAddressV addr, /* IP address */
1212 octetstring apn optional, /* APN name */
1213 ProtocolConfigOptionsV pco optional, /* protoco config opts */
1214 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +01001215 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +01001216 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +01001217
Harald Welte822f9102018-02-18 20:39:06 +01001218 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
1219 OCT4 ggsn_tei_u, /* GGSN TEI User */
1220 octetstring ggsn_ip_c, /* GGSN IP Control */
1221 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001222 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +01001223
Harald Welte822f9102018-02-18 20:39:06 +01001224 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
1225 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
1226 octetstring sgsn_ip_c optional, /* SGSN IP Control */
1227 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +01001228};
1229
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001230
1231private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
1232 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
1233 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
1234 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
1235 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
1236 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
1237 f_gtp_register_teid(apars.ggsn_tei_c);
1238 f_gtp_register_teid(apars.ggsn_tei_u);
1239}
1240
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001241function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001242runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +01001243 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1244 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001245 var template Recovery_gtpc recovery := omit;
1246
1247 if (send_recovery) {
1248 recovery := ts_Recovery(apars.ggsn_restart_ctr);
1249 }
Harald Welteeded9ad2018-02-17 20:57:34 +01001250
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001251 f_send_l3(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001252 apars.apn, apars.pco), ran_index);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001253 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
1254 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
1255 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1256 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
1257 apars.sgsn_tei_c, apars.gtp_resp_cause,
1258 apars.ggsn_tei_c, apars.ggsn_tei_u,
1259 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001260 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1261 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +01001262 }
1263 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001264 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001265 setverdict(pass);
1266 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001267 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001268 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +02001269 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001270 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001271 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001272 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +02001273 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001274 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001275 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Weltef7191672019-05-02 20:37:23 +02001276 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
1277 mtc.stop;
1278 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001279 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001280 setverdict(pass);
1281 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001282 [] as_xid(apars, ran_index);
Harald Welteeded9ad2018-02-17 20:57:34 +01001283 }
1284}
1285
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001286function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001287runs on BSSGP_ConnHdlr {
Harald Welte6f203162018-02-18 22:04:55 +01001288 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1289 var Gtp1cUnitdata g_ud;
1290
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001291 f_send_l3(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit), ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001292 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1293 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001294 BSSGP[ran_index].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001295 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1296 }
1297 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001298 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Harald Welte6f203162018-02-18 22:04:55 +01001299 setverdict(pass);
1300 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001301 [] as_xid(apars, ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001302 }
1303}
1304
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001305function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001306runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001307 var Gtp1cUnitdata g_ud;
1308 var integer seq_nr := 23;
1309 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1310
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001311 BSSGP[ran_index].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001312 if (error_ind) {
1313 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1314 } else {
1315 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1316 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001317
1318 timer T := 5.0;
1319 T.start;
1320
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001321 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001322 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1323 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), ran_index);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001324 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001325 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1326 repeat;
1327 }
1328 [] T.timeout {
1329 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1330 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001331 }
1332}
1333
Harald Welte6f203162018-02-18 22:04:55 +01001334
Harald Welteeded9ad2018-02-17 20:57:34 +01001335/* Table 10.5.156/3GPP TS 24.008 */
1336template (value) QoSV t_QosDefault := {
1337 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1338 delayClass := '100'B, /* best effort */
1339 spare1 := '00'B,
1340 precedenceClass := '010'B, /* normal */
1341 spare2 := '0'B,
1342 peakThroughput := '0000'B, /* subscribed */
1343 meanThroughput := '00000'B, /* subscribed */
1344 spare3 := '000'B,
1345 deliverErroneusSDU := omit,
1346 deliveryOrder := omit,
1347 trafficClass := omit,
1348 maxSDUSize := omit,
1349 maxBitrateUplink := omit,
1350 maxBitrateDownlink := omit,
1351 sduErrorRatio := omit,
1352 residualBER := omit,
1353 trafficHandlingPriority := omit,
1354 transferDelay := omit,
1355 guaranteedBitRateUplink := omit,
1356 guaranteedBitRateDownlink := omit,
1357 sourceStatisticsDescriptor := omit,
1358 signallingIndication := omit,
1359 spare4 := omit,
1360 maxBitrateDownlinkExt := omit,
1361 guaranteedBitRateDownlinkExt := omit,
1362 maxBitrateUplinkExt := omit,
1363 guaranteedBitRateUplinkExt := omit,
1364 maxBitrateDownlinkExt2 := omit,
1365 guaranteedBitRateDownlinkExt2 := omit,
1366 maxBitrateUplinkExt2 := omit,
1367 guaranteedBitRateUplinkExt2 := omit
1368}
1369
1370/* 10.5.6.4 / 3GPP TS 24.008 */
1371template (value) PDPAddressV t_AddrIPv4dyn := {
1372 pdpTypeOrg := '0001'B, /* IETF */
1373 spare := '0000'B,
1374 pdpTypeNum := '21'O, /* IPv4 */
1375 addressInfo := omit
1376}
1377template (value) PDPAddressV t_AddrIPv6dyn := {
1378 pdpTypeOrg := '0001'B, /* IETF */
1379 spare := '0000'B,
1380 pdpTypeNum := '53'O, /* IPv6 */
1381 addressInfo := omit
1382}
1383
Harald Welte37692d82018-02-18 15:21:34 +01001384template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001385 tid := '000'B,
1386 nsapi := '0101'B, /* < 5 are reserved */
1387 sapi := '0011'B, /* 3/5/9/11 */
1388 qos := t_QosDefault,
1389 addr := t_AddrIPv4dyn,
1390 apn := omit,
1391 pco := omit,
1392 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001393 gtp_resp_cause := int2oct(128, 1),
1394 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001395
1396 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001397 ggsn_tei_c := f_rnd_octstring(4),
1398 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001399 ggsn_ip_c := f_inet_addr(ggsn_ip),
1400 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001401 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001402
Harald Welteeded9ad2018-02-17 20:57:34 +01001403 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001404 sgsn_tei_u := omit,
1405 sgsn_ip_c := omit,
1406 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001407}
1408
Harald Welte37692d82018-02-18 15:21:34 +01001409template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1410 connId := 1,
1411 remName := f_inet_ntoa(ip),
1412 remPort := GTP1U_PORT
1413}
1414
1415template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1416 connId := 1,
1417 remName := f_inet_ntoa(ip),
1418 remPort := GTP1C_PORT
1419}
1420
1421private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1422 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1423 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1424}
1425
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001426private altstep as_xid(PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr {
1427 [] BSSGP[ran_index].receive(tr_LLC_XID_MT_CMD(?, apars.sapi)) {
Harald Welte37692d82018-02-18 15:21:34 +01001428 repeat;
1429 }
1430}
1431
1432template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1433 pDU_SN_UNITDATA := {
1434 nsapi := nsapi,
1435 moreBit := ?,
1436 snPduType := '1'B,
1437 firstSegmentIndicator := ?,
1438 spareBit := ?,
1439 pcomp := ?,
1440 dcomp := ?,
1441 npduNumber := ?,
1442 segmentNumber := ?,
1443 npduNumberContinued := ?,
1444 dataSegmentSnUnitdataPdu := payload
1445 }
1446}
1447
1448/* simple case: single segment, no compression */
1449template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1450 pDU_SN_UNITDATA := {
1451 nsapi := nsapi,
1452 moreBit := '0'B,
1453 snPduType := '1'B,
1454 firstSegmentIndicator := '1'B,
1455 spareBit := '0'B,
1456 pcomp := '0000'B,
1457 dcomp := '0000'B,
1458 npduNumber := '0000'B,
1459 segmentNumber := '0000'B,
1460 npduNumberContinued := '00'O,
1461 dataSegmentSnUnitdataPdu := payload
1462 }
1463}
1464
1465/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001466private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001467runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001468 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1469 f_gtpu_send(apars, payload);
1470 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1471 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001472 [] as_xid(apars, ran_index);
1473 //[] BSSGP[ran_index].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
1474 [] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload));
Harald Welte37692d82018-02-18 15:21:34 +01001475 }
1476}
1477
Pau Espin Pedrol8be4d192018-07-18 13:43:44 +02001478/* Transceive given 'payload' as MT message from Gb -> OsmoSGSN -> GTP */
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001479private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001480runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001481 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1482 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1483 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001484 BSSGP[ran_index].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
Harald Welte37692d82018-02-18 15:21:34 +01001485 /* Expect PDU via GTP from SGSN on simulated GGSN */
1486 alt {
1487 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1488 }
1489}
1490
Harald Welteeded9ad2018-02-17 20:57:34 +01001491private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001492 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001493
1494 /* first perform regular attach */
1495 f_TC_attach(id);
1496
1497 f_pdp_ctx_act(apars);
1498}
1499testcase TC_attach_pdp_act() runs on test_CT {
1500 var BSSGP_ConnHdlr vc_conn;
1501 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001502 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001503 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001504 f_cleanup();
Harald Welteeded9ad2018-02-17 20:57:34 +01001505}
Harald Welteb2124b22018-02-16 22:26:56 +01001506
Harald Welte835b15f2018-02-18 14:39:11 +01001507/* PDP Context activation for not-attached subscriber; expect fail */
1508private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001509 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001510 f_send_l3(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
Harald Welte835b15f2018-02-18 14:39:11 +01001511 apars.apn, apars.pco));
1512 alt {
1513 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Harald Welte955aa942019-05-03 01:29:29 +02001514 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001515 setverdict(pass);
1516 }
1517 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1518 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001519 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001520 }
Harald Welte955aa942019-05-03 01:29:29 +02001521 [] BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001522 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001523 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001524 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001525 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001526 }
1527}
1528testcase TC_pdp_act_unattached() runs on test_CT {
1529 var BSSGP_ConnHdlr vc_conn;
1530 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001531 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001532 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001533 f_cleanup();
Harald Welte835b15f2018-02-18 14:39:11 +01001534}
1535
Harald Welte37692d82018-02-18 15:21:34 +01001536/* ATTACH + PDP CTX ACT + user plane traffic */
1537private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1538 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1539
1540 /* first perform regular attach */
1541 f_TC_attach(id);
1542 /* then activate PDP context */
1543 f_pdp_ctx_act(apars);
1544 /* then transceive a downlink PDU */
1545 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1546 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1547}
1548testcase TC_attach_pdp_act_user() runs on test_CT {
1549 var BSSGP_ConnHdlr vc_conn;
1550 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001551 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001552 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001553 f_cleanup();
Harald Welte37692d82018-02-18 15:21:34 +01001554}
1555
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001556/* ATTACH + PDP CTX ACT; reject from GGSN */
1557private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1558 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1559
1560 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1561 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1562
1563 /* first perform regular attach */
1564 f_TC_attach(id);
1565 /* then activate PDP context */
1566 f_pdp_ctx_act(apars);
1567}
1568testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1569 var BSSGP_ConnHdlr vc_conn;
1570 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001571 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001572 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001573 f_cleanup();
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001574}
Harald Welte835b15f2018-02-18 14:39:11 +01001575
Harald Welte6f203162018-02-18 22:04:55 +01001576/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1577private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1578 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1579
1580 /* first perform regular attach */
1581 f_TC_attach(id);
1582 /* then activate PDP context */
1583 f_pdp_ctx_act(apars);
1584 /* then transceive a downlink PDU */
1585 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1586 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1587
1588 f_pdp_ctx_deact_mo(apars, '00'O);
1589}
1590testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1591 var BSSGP_ConnHdlr vc_conn;
1592 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001593 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 +01001594 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001595 f_cleanup();
Harald Welte6f203162018-02-18 22:04:55 +01001596}
1597
Harald Welte57b9b7f2018-02-18 22:28:13 +01001598/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1599private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1600 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1601
1602 /* first perform regular attach */
1603 f_TC_attach(id);
1604 /* then activate PDP context */
1605 f_pdp_ctx_act(apars);
1606 /* then transceive a downlink PDU */
1607 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1608 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1609
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001610 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001611}
1612testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1613 var BSSGP_ConnHdlr vc_conn;
1614 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001615 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 +01001616 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001617 f_cleanup();
Harald Welte57b9b7f2018-02-18 22:28:13 +01001618}
1619
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001620/* Test MS sending a duplicate Deact PDP Ctx (OS#3956). */
1621private function f_TC_attach_pdp_act_deact_dup(charstring id) runs on BSSGP_ConnHdlr {
1622 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1623 var Gtp1cUnitdata g_ud;
1624 var integer i;
1625 var OCT1 cause_regular_deact := '24'O;
1626
1627 /* first perform regular attach + PDP context act */
1628 f_TC_attach(id);
1629 f_pdp_ctx_act(apars);
1630
1631 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1632 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1633
1634 for (i := 0; i < 2; i := i+1) {
1635 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1636 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1637 log("Received deletePDPContextResponse " & int2str(i) & ", seq_nr=" & int2str(seq_nr));
1638 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1639 }
1640 }
1641
1642 alt {
1643 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1644 setverdict(pass);
1645 }
1646 [] as_xid(apars, 0);
1647 }
1648
1649 /* Make sure second DeactPdpAccept is sent: */
1650 timer T := 2.0;
1651 T.start;
1652 alt {
1653 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1654 setverdict(fail, "Second SM_DEACT_PDP_ACCEPT_MT received");
1655 }
1656 [] T.timeout {
1657 setverdict(pass);
1658 }
1659 }
1660
1661 setverdict(pass);
1662}
1663testcase TC_attach_pdp_act_deact_dup() runs on test_CT {
1664 var BSSGP_ConnHdlr vc_conn;
1665 f_init();
1666 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_dup), testcasename(), g_gb, 46);
1667 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001668 f_cleanup();
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001669}
1670
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001671/* ATTACH + ATTACH (2nd) */
1672private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1673 g_pars.t_guard := 5.0;
1674
1675 /* first perform regular attach */
1676 f_TC_attach(id);
1677
1678 /* second to perform regular attach */
1679 f_TC_attach(id);
1680}
1681
1682
1683testcase TC_attach_second_attempt() runs on test_CT {
1684 var BSSGP_ConnHdlr vc_conn;
1685 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001686 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001687 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001688 f_cleanup();
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001689}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001690
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001691private function f_TC_attach_echo_timeout(charstring id) runs on BSSGP_ConnHdlr {
1692 var Gtp1cUnitdata g_ud;
1693 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1694 var integer seq_nr;
1695
1696 /* first perform regular attach */
1697 f_TC_attach(id);
1698 /* then activate PDP context */
1699 f_pdp_ctx_act(apars);
1700
1701 /* Wait to receive first echo request and send initial Restart counter */
1702 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1703 BSSGP[0].clear;
1704 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1705 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1706 f_sleep(int2float(mp_echo_interval)); /* wait until around next echo is expected */
1707 }
1708
1709 /* At some point next echo request not answered will timeout and SGSN
1710 should drop the pdp ctx. Around T3 (3secs) * 6 (+ extra, a lot due to OS#4178): */
1711 timer T := 3.0 * 6.0 + 16.0;
1712 T.start;
1713 alt {
1714 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1715 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
1716 setverdict(pass);
1717 }
1718 [] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1719 /* SGSN currently doesn't send this message because it expects GGSN to be non-reachable anyway */
1720 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1721 log("Received deletePDPContextRequest seq_nr=" & int2str(seq_nr));
1722 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1723 repeat;
1724 }
1725 [] GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1726 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1727 log("Received EchoRequest seq_nr=" & int2str(seq_nr));
1728 repeat;
1729 }
1730 [] T.timeout {
1731 setverdict(fail, "BSSGP DeactPdpReq not received");
1732 mtc.stop;
1733 }
1734 [] as_xid(apars);
1735 }
1736 T.stop
1737
1738 setverdict(pass);
1739}
1740/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1741testcase TC_attach_echo_timeout() runs on test_CT {
1742 var BSSGP_ConnHdlr vc_conn;
1743 g_use_echo := true;
1744 f_init();
1745 vc_conn := f_start_handler(refers(f_TC_attach_echo_timeout), testcasename(), g_gb, 67, 50.0);
1746 vc_conn.done;
1747 g_use_echo := false;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001748 f_cleanup();
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001749}
1750
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001751private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001752 var Gtp1cUnitdata g_ud;
1753 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1754
1755 /* first perform regular attach */
1756 f_TC_attach(id);
1757 /* Activate a pdp context against the GGSN */
1758 f_pdp_ctx_act(apars);
1759 /* Wait to receive first echo request and send initial Restart counter */
1760 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1761 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1762 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1763 }
1764 /* Wait to receive second echo request and send incremented Restart
1765 counter. This will fake a restarted GGSN, and pdp ctx allocated
1766 should be released by SGSN */
1767 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1768 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1769 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1770 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1771 }
1772 var OCT1 cause_network_failure := int2oct(38, 1)
1773 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001774 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001775 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001776 setverdict(pass);
1777 }
1778 [] as_xid(apars);
1779 }
1780 setverdict(pass);
1781}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001782/* ATTACH + trigger Recovery procedure through EchoResp */
1783testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001784 var BSSGP_ConnHdlr vc_conn;
1785 g_use_echo := true
1786 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001787 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 +02001788 vc_conn.done;
1789 g_use_echo := false
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001790 f_cleanup();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001791}
1792
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001793private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1794 var Gtp1cUnitdata g_ud;
1795 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1796 var integer seq_nr := 23;
1797 var GtpPeer peer;
1798 /* first perform regular attach */
1799 f_TC_attach(id);
1800
1801 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1802 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1803 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1804 f_pdp_ctx_act(apars, true);
1805
1806 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1807/* received. */
1808 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1809
1810 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1811 would be great to have an active pdp context here before triggering
1812 Recovery, and making sure the the DEACT request is sent by the SGSN.
1813 */
1814
1815 /* Activate a pdp context against the GGSN, send incremented Recovery
1816 IE. This should trigger the recovery path, but still this specific
1817 CTX activation should work. */
1818 apars.exp_rej_cause := omit; /* default value for tests */
1819 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
1820 f_pdp_ctx_act(apars, true);
1821
1822 setverdict(pass);
1823}
1824/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1825testcase TC_attach_restart_ctr_create() runs on test_CT {
1826 var BSSGP_ConnHdlr vc_conn;
1827 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001828 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 +02001829 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001830 f_cleanup();
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001831}
1832
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001833/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
1834private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
1835 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1836 var integer seq_nr := 23;
1837 var GtpPeer peer;
1838 var integer i;
1839
1840 /* first perform regular attach */
1841 f_TC_attach(id);
1842 /* then activate PDP context */
1843 f_pdp_ctx_act(apars);
1844
Alexander Couzens0e510e62018-07-28 23:06:00 +02001845 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001846 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1847 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1848
1849 for (i := 0; i < 5; i := i+1) {
1850 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001851 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001852 [] as_xid(apars);
1853 }
1854 }
1855
1856 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
1857
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001858 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001859 setverdict(pass);
1860}
1861testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
1862 var BSSGP_ConnHdlr vc_conn;
1863 f_init();
1864 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001865 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 +02001866 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001867 f_cleanup();
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001868}
1869
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001870/* ATTACH + PDP CTX ACT dropped + retrans */
1871private function f_TC_attach_pdp_act_deact_gtp_retrans(charstring id) runs on BSSGP_ConnHdlr {
1872 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1873 var Gtp1cUnitdata g_ud_first, g_ud_second;
1874 /* first perform regular attach */
1875 f_TC_attach(id);
1876
1877 /* then activate PDP context on the Gb side */
1878 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
1879 apars.apn, apars.pco), 0);
1880
1881 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_first {}
1882 log("First createPDPContextRequest received, dropping & waiting for retransmission");
1883 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_second {
1884 if (g_ud_first != g_ud_second) {
1885 setverdict(fail, "Retransmitted GTP message createPDPContextRequest is different from original one!");
1886 mtc.stop;
1887 }
1888 f_process_gtp_ctx_act_req(apars, g_ud_second.gtpc);
1889 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
1890 GTP.send(ts_GTPC_CreatePdpResp(g_ud_second.peer, seq_nr,
1891 apars.sgsn_tei_c, apars.gtp_resp_cause,
1892 apars.ggsn_tei_c, apars.ggsn_tei_u,
1893 apars.nsapi,
1894 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1895 omit, omit));
1896 }
Harald Welte955aa942019-05-03 01:29:29 +02001897 BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT) {}
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001898
1899 /* Now the same with Deact */
1900 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, '00'O, false, omit), 0);
1901 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_first {}
1902 log("First deletePDPContextRequest received, dropping & waiting for retransmission");
1903 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_second {
1904 if (g_ud_first != g_ud_second) {
1905 setverdict(fail, "Retransmitted GTP message deletePDPContextRequest is different from original one!");
1906 mtc.stop;
1907 }
1908 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
1909 BSSGP[0].clear;
1910 GTP.send(ts_GTPC_DeletePdpResp(g_ud_second.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1911 }
1912 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001913 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001914 setverdict(pass);
1915 }
1916 [] as_xid(apars, 0);
1917 }
1918
1919 setverdict(pass);
1920}
1921testcase TC_attach_pdp_act_deact_gtp_retrans() runs on test_CT {
1922 var BSSGP_ConnHdlr vc_conn;
1923 f_init();
1924 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans), testcasename(), g_gb, 27);
1925 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001926 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001927}
1928
1929/* Test that SGSN GTP response retransmit queue works fine */
1930private function f_TC_attach_pdp_act_deact_gtp_retrans_resp(charstring id) runs on BSSGP_ConnHdlr {
1931 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1932 var integer seq_nr := 23;
1933 var Gtp1cUnitdata g_ud_first, g_ud_second;
1934 var template Gtp1cUnitdata g_delete_req;
1935 /* first perform regular attach + PDP context act */
1936 f_TC_attach(id);
1937 f_pdp_ctx_act(apars);
1938
1939 /* Now perform an MT DeleteCtxReq and emulate GGSN didn't receive response and sends a duplicated DeleteCtxReq */
1940 BSSGP[0].clear;
1941 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1942 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B);
1943 GTP.send(g_delete_req);
1944 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001945 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001946 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), 0);
1947 }
1948 [] as_xid(apars, 0);
1949 }
1950 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_first {
1951 if (g_ud_first.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != '80'O) {
1952 setverdict(fail, "Received deletePDPContextResponse cause is not 'Request accepted'");
1953 mtc.stop;
1954 }
1955 };
1956
1957 /* Send duplicate DeleteCtxReq */
1958 log("First deletePDPContextResponse received, dropping & retransmitting retransmission of deletePDPContextRequest");
1959 GTP.send(g_delete_req);
1960 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_second {
1961 if (g_ud_first != g_ud_second) {
1962 setverdict(fail, "Retransmitted GTP message deletePDPContextResponse is different from original one!");
1963 mtc.stop;
1964 }
1965 }
1966
1967 /* Let's send now a new DeleteCtxReq (increased seq_nr) to make sure it
1968 * is handled differently by SGSN (expect "non-existent" cause) */
1969 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr + 1, apars.sgsn_tei_c, apars.nsapi, '1'B);
1970 GTP.send(g_delete_req);
1971 /* Response with cause "non-existent" must be sent with TEID 0 according to specs */
1972 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, '00000000'O)) -> value g_ud_second {
1973 if (g_ud_second.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != 'C0'O) {
1974 setverdict(fail, "Received deletePDPContextResponse cause is not 'Non-existent'");
1975 mtc.stop;
1976 }
1977 }
1978
1979 setverdict(pass);
1980}
1981testcase TC_attach_pdp_act_deact_gtp_retrans_resp() runs on test_CT {
1982 var BSSGP_ConnHdlr vc_conn;
1983 f_init();
1984 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans_resp), testcasename(), g_gb, 28);
1985 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001986 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001987}
1988
Alexander Couzens5e307b42018-05-22 18:12:20 +02001989private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
1990 /* MS: perform regular attach */
1991 f_TC_attach(id);
1992
1993 /* HLR: cancel the location request */
1994 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
1995 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02001996
1997 /* ensure no Detach Request got received */
1998 timer T := 5.0;
1999 T.start;
2000 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002001 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(*, *, *)) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002002 T.stop;
2003 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02002004 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002005 }
2006 [] T.timeout {
2007 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02002008 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002009 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02002010 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002011 repeat;
2012 }
2013 }
2014}
2015
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002016/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
2017private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
2018 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2019
2020 /* first perform regular attach */
2021 f_TC_attach(id);
2022 /* then activate PDP context */
2023 f_pdp_ctx_act(apars);
2024 /* then transceive a downlink PDU */
2025 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
2026
2027 /* Send Error indication as response from upload PDU and expect deact towards MS */
2028 f_pdp_ctx_deact_mt(apars, true);
2029}
2030testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
2031 var BSSGP_ConnHdlr vc_conn;
2032 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002033 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 +02002034 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002035 f_cleanup();
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002036}
2037
Alexander Couzens5e307b42018-05-22 18:12:20 +02002038testcase TC_hlr_location_cancel_request_update() runs on test_CT {
2039 /* MS <-> SGSN: GMM Attach
2040 * HLR -> SGSN: Cancel Location Request
2041 * HLR <- SGSN: Cancel Location Ack
2042 */
2043 var BSSGP_ConnHdlr vc_conn;
2044 f_init();
2045 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002046 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02002047 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002048 f_cleanup();
Alexander Couzens5e307b42018-05-22 18:12:20 +02002049}
2050
2051
Alexander Couzensc87967a2018-05-22 16:09:54 +02002052private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
2053 /* MS: perform regular attach */
2054 f_TC_attach(id);
2055
2056 /* HLR: cancel the location request */
2057 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
2058 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
2059 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
2060
2061 /* MS: receive a Detach Request */
Harald Welte955aa942019-05-03 01:29:29 +02002062 BSSGP[0].receive(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002063 f_send_l3(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002064
2065 setverdict(pass);
2066}
2067
2068testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
2069 /* MS <-> SGSN: GMM Attach
2070 * HLR -> SGSN: Cancel Location Request
2071 * HLR <- SGSN: Cancel Location Ack
2072 * MS <- SGSN: Detach Request
2073 * SGSN-> MS: Detach Complete
2074 */
2075 var BSSGP_ConnHdlr vc_conn;
2076 f_init();
2077 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002078 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002079 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002080 f_cleanup();
Alexander Couzensc87967a2018-05-22 16:09:54 +02002081}
2082
2083
Alexander Couzens6c47f292018-05-22 17:09:49 +02002084private function f_hlr_location_cancel_request_unknown_subscriber(
2085 charstring id,
2086 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
2087
2088 /* HLR: cancel the location request */
2089 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
2090
2091 /* cause 2 = IMSI_UNKNOWN */
2092 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
2093
2094 setverdict(pass);
2095}
2096
2097private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002098 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002099}
2100
2101testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
2102 /* HLR -> SGSN: Cancel Location Request
2103 * HLR <- SGSN: Cancel Location Error
2104 */
2105
2106 var BSSGP_ConnHdlr vc_conn;
2107 f_init();
2108 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002109 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 +02002110 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002111 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002112}
2113
2114private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002115 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002116}
2117
2118testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
2119 /* HLR -> SGSN: Cancel Location Request
2120 * HLR <- SGSN: Cancel Location Error
2121 */
2122
2123 var BSSGP_ConnHdlr vc_conn;
2124 f_init();
2125 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002126 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 +02002127 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002128 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002129}
2130
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002131private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
2132 f_TC_attach(id);
2133 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2134}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002135
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002136testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
2137 /* MS <-> SGSN: Attach
2138 * MS -> SGSN: Detach Req (Power off)
2139 * VTY -> SGSN: Check if MS is NOT in subscriber cache
2140 */
2141 var BSSGP_ConnHdlr vc_conn;
2142 var integer id := 33;
2143 var charstring imsi := hex2str(f_gen_imsi(id));
2144
2145 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002146 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002147 vc_conn.done;
2148
2149 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002150 f_cleanup();
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002151}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002152
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002153/* Attempt an attach, but loose the Identification Request (IMEI) */
2154private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
2155 var integer count_req := 0;
2156 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
2157
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002158 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002159
2160 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002161 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002162 /* break */
2163 }
Harald Welte955aa942019-05-03 01:29:29 +02002164 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002165 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002166 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002167 repeat;
2168 }
Harald Welte955aa942019-05-03 01:29:29 +02002169 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002170 /* ignore ID REQ IMEI */
2171 count_req := count_req + 1;
2172 repeat;
2173 }
2174 }
2175 if (count_req != 5) {
2176 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002177 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002178 }
2179 setverdict(pass);
2180}
2181
2182testcase TC_attach_no_imei_response() runs on test_CT {
2183 /* MS -> SGSN: Attach Request IMSI
2184 * MS <- SGSN: Identity Request IMSI (optional)
2185 * MS -> SGSN: Identity Response IMSI (optional)
2186 * MS <- SGSN: Identity Request IMEI
2187 * MS -x SGSN: no response
2188 * MS <- SGSN: re-send: Identity Request IMEI 4x
2189 * MS <- SGSN: Attach Reject
2190 */
2191 var BSSGP_ConnHdlr vc_conn;
2192 f_init();
2193 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002194 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 +02002195 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002196 f_cleanup();
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002197}
2198
Alexander Couzens53f20562018-06-12 16:24:12 +02002199/* Attempt an attach, but loose the Identification Request (IMSI) */
2200private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
2201 var integer count_req := 0;
2202 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
2203
2204 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
2205 g_pars.p_tmsi := 'c0000035'O;
2206
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002207 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens53f20562018-06-12 16:24:12 +02002208
2209 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002210 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002211 /* break */
2212 }
Harald Welte955aa942019-05-03 01:29:29 +02002213 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002214 /* ignore ID REQ IMSI */
2215 count_req := count_req + 1;
2216 repeat;
2217 }
Harald Welte955aa942019-05-03 01:29:29 +02002218 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002219 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002220 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02002221 repeat;
2222 }
2223 }
2224 if (count_req != 5) {
2225 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002226 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02002227 }
2228 setverdict(pass);
2229}
2230
2231testcase TC_attach_no_imsi_response() runs on test_CT {
2232 /* MS -> SGSN: Attach Request TMSI (unknown)
2233 * MS <- SGSN: Identity Request IMEI (optional)
2234 * MS -> SGSN: Identity Response IMEI (optional)
2235 * MS <- SGSN: Identity Request IMSI
2236 * MS -x SGSN: no response
2237 * MS <- SGSN: re-send: Identity Request IMSI 4x
2238 * MS <- SGSN: Attach Reject
2239 */
2240 var BSSGP_ConnHdlr vc_conn;
2241 f_init();
2242 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002243 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 +02002244 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002245 f_cleanup();
Alexander Couzens53f20562018-06-12 16:24:12 +02002246}
2247
Alexander Couzenscf818962018-06-05 18:00:00 +02002248private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
2249 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
2250}
2251
2252testcase TC_attach_check_subscriber_list() runs on test_CT {
2253 /* MS <-> SGSN: Attach
2254 * VTY -> SGSN: Check if MS is in subscriber cache
2255 */
2256 var BSSGP_ConnHdlr vc_conn;
2257 var integer id := 34;
2258 var charstring imsi := hex2str(f_gen_imsi(id));
2259
2260 f_init();
2261 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002262 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02002263 vc_conn.done;
2264
2265 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
2266 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002267 f_cleanup();
Alexander Couzenscf818962018-06-05 18:00:00 +02002268}
2269
Alexander Couzensf9858652018-06-07 16:14:53 +02002270private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
2271 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002272 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensf9858652018-06-07 16:14:53 +02002273
2274 /* unregister the old IMSI */
2275 f_bssgp_client_unregister(g_pars.imsi);
2276 /* Simulate a foreign IMSI */
Alexander Couzens03d12242018-08-07 16:13:52 +02002277 g_pars.imsi := '001010123456700'H;
Alexander Couzens51114d12018-07-31 18:41:56 +02002278 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Alexander Couzensf9858652018-06-07 16:14:53 +02002279
2280 /* there is no auth */
2281 g_pars.net.expect_auth := false;
2282
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002283 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02002284 f_gmm_auth();
2285 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002286 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzensf9858652018-06-07 16:14:53 +02002287 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02002288 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02002289 }
Harald Welte955aa942019-05-03 01:29:29 +02002290 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) -> value l3_mt {
2291 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002292 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02002293 setverdict(pass);
2294 }
2295 }
2296}
Alexander Couzens03d12242018-08-07 16:13:52 +02002297
2298private function f_TC_attach_closed_add_vty(charstring id) runs on BSSGP_ConnHdlr {
2299
2300 f_TC_attach_closed_foreign(id);
2301 f_TC_attach_closed_imsi_added(id);
2302
2303}
2304
2305
Alexander Couzensf9858652018-06-07 16:14:53 +02002306testcase TC_attach_closed_add_vty() runs on test_CT {
2307 /* VTY-> SGSN: policy close
2308 * MS -> SGSN: Attach Request
2309 * MS <- SGSN: Identity Request IMSI
2310 * MS -> SGSN: Identity Response IMSI
2311 * MS <- SGSN: Attach Reject
2312 * VTY-> SGSN: policy imsi-acl add IMSI
2313 * MS -> SGSN: Attach Request
2314 * MS <- SGSN: Identity Request IMSI
2315 * MS -> SGSN: Identity Response IMSI
2316 * MS <- SGSN: Identity Request IMEI
2317 * MS -> SGSN: Identity Response IMEI
2318 * MS <- SGSN: Attach Accept
2319 */
2320 var BSSGP_ConnHdlr vc_conn;
2321 f_init();
2322 f_sleep(1.0);
2323 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
2324 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
Alexander Couzens03d12242018-08-07 16:13:52 +02002325 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456700");
2326 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456700");
Alexander Couzensf9858652018-06-07 16:14:53 +02002327 /* test with foreign IMSI: Must Reject */
Alexander Couzens03d12242018-08-07 16:13:52 +02002328 vc_conn := f_start_handler(refers(f_TC_attach_closed_add_vty), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02002329 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002330 f_cleanup();
Alexander Couzensf9858652018-06-07 16:14:53 +02002331}
2332
Alexander Couzens0085bd72018-06-12 19:08:44 +02002333/* Attempt an attach, but never answer a Attach Complete */
2334private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
2335 var integer count_req := 0;
2336
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002337 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens0085bd72018-06-12 19:08:44 +02002338 f_gmm_auth();
Pau Espin Pedrol4b290a22019-09-10 19:49:41 +02002339 /* Expect SGSN to perform LU with HLR */
2340 f_gmm_gsup_lu_isd();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002341
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002342 timer T := 10.0;
2343 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002344 alt {
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002345 [] T.timeout {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002346 /* break */
2347 }
Harald Welte955aa942019-05-03 01:29:29 +02002348 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002349 /* ignore */
2350 count_req := count_req + 1;
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002351 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002352 repeat;
2353 }
2354 }
2355 if (count_req != 5) {
2356 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02002357 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002358 }
2359 setverdict(pass);
2360}
2361
2362testcase TC_attach_check_complete_resend() runs on test_CT {
2363 /* MS -> SGSN: Attach Request IMSI
2364 * MS <- SGSN: Identity Request *
2365 * MS -> SGSN: Identity Response *
2366 * MS <- SGSN: Attach Complete 5x
2367 */
2368 var BSSGP_ConnHdlr vc_conn;
2369 f_init();
2370 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002371 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 +02002372 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002373 f_cleanup();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002374}
2375
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002376friend function f_routing_area_update(RoutingAreaIdentificationV ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02002377 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002378 var PDU_DTAP_PS_MT mt;
2379 var template OCT4 p_tmsi := omit;
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002380
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002381 if (is_iu(ran_index)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002382 p_tmsi := g_pars.p_tmsi;
2383 }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002384 /* then send RAU */
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002385 f_send_l3(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit, p_tmsi), ran_index);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002386 alt {
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002387 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_ACCEPT) -> value l3_mt {
2388 f_process_rau_accept(l3_mt.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2389 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002390 setverdict(pass);
2391 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002392 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_ACCEPT)) -> value mt {
2393 f_process_rau_accept(mt.dtap.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2394 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5d56f522019-09-03 12:36:18 +02002395 setverdict(pass);
2396 }
2397
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002398 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_REJECT) {
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002399 setverdict(fail, "Unexpected RAU Reject");
2400 mtc.stop;
2401 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002402 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_REJECT)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002403 setverdict(fail, "Unexpected RAU Reject");
2404 mtc.stop;
2405 }
2406
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002407 [is_iu(ran_index)] BSSAP.receive(tr_RANAP_SecurityModeCmd(uia_algs := ?, uia_key := oct2bit(g_pars.vec.ik),
Alexander Couzens5d56f522019-09-03 12:36:18 +02002408 key_sts := ?)) {
2409 var IntegrityProtectionAlgorithm uia_chosen := 0; /* 0 = standard_UMTS_integrity_algorithm_UIA1 */
2410 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
Alexander Couzensed61ae82019-09-15 23:18:08 +02002411 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)))
Daniel Willmann1c116112020-01-22 17:48:31 +01002412 repeat;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002413 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002414 [is_gb(ran_index)] BSSGP[ran_index].receive { repeat; }
2415 [is_iu(ran_index)] BSSAP.receive { repeat; }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002416 }
2417}
2418
Alexander Couzensbfda9212018-07-31 03:17:33 +02002419private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbfda9212018-07-31 03:17:33 +02002420 /* first perform regular attach */
2421 f_TC_attach(id);
2422
2423 /* then send RAU */
2424 f_routing_area_update(g_pars.ra);
2425
2426 /* do another RAU */
2427 f_routing_area_update(g_pars.ra);
2428
2429 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2430}
2431
2432testcase TC_attach_rau_a_a() runs on test_CT {
2433 /* MS <-> SGSN: Successful Attach
2434 * MS -> SGSN: Routing Area Update Request
2435 * MS <- SGSN: Routing Area Update Accept
2436 * MS -> SGSN: Routing Area Update Request
2437 * MS <- SGSN: Routing Area Update Accept
2438 * MS -> SGSN: Detach (PowerOff)
2439 */
2440 var BSSGP_ConnHdlr vc_conn;
2441 f_init();
2442 f_sleep(1.0);
2443 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
2444 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002445 f_cleanup();
Alexander Couzensbfda9212018-07-31 03:17:33 +02002446}
2447
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002448private function f_TC_attach_rau_a_b(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002449 f_TC_attach(id);
2450
2451 log("attach complete sending rau");
2452 f_routing_area_update(g_pars.ra, 0);
2453
2454 log("rau complete unregistering");
2455 f_bssgp_client_unregister(g_pars.imsi);
2456 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[1], BSSGP_PROC[1]);
2457
2458 log("sending second RAU via different RA");
2459 f_routing_area_update(f_cellid_to_RAI(g_pars.bssgp_cell_id[1]), 1);
2460
2461 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true, 1);
2462}
2463
2464testcase TC_attach_rau_a_b() runs on test_CT {
2465 /* MS <-> SGSN: Successful Attach
2466 * MS -> SGSN: Routing Area _a_ Update Request
2467 * MS <- SGSN: Routing Area _a_ Update Accept
2468 * MS -> SGSN: Routing Area _b_ Update Request
2469 * MS <- SGSN: Routing Area _b_ Update Accept
2470 * MS -> SGSN: Detach (PowerOff)
2471 */
2472 var BSSGP_ConnHdlr vc_conn;
2473 f_init();
2474 f_sleep(1.0);
2475 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_b), testcasename(), g_gb, 38);
2476 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002477 f_cleanup();
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002478}
2479
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002480private function f_TC_attach_gmm_attach_req_while_gmm_attach(charstring id) runs on BSSGP_ConnHdlr {
2481 var integer count_req := 0;
2482 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
2483 var RoutingAreaIdentificationV rand_rai := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002484 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002485
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002486 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002487
2488 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002489 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002490 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2491 mtc.stop;
2492 }
Harald Welte955aa942019-05-03 01:29:29 +02002493 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002494 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002495 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002496 repeat;
2497 }
Harald Welte955aa942019-05-03 01:29:29 +02002498 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002499 /* send out a second GMM_Attach Request.
2500 * If the SGSN follows the rules, this 2nd ATTACH REQ should be ignored, because
2501 * of the same content */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002502 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002503 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002504 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002505 }
2506 }
2507 f_sleep(1.0);
2508
2509 /* we've sent already a IMEI answer, we should NOT asked again for IMEI */
2510 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002511 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002512 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002513 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002514 repeat;
2515 }
Harald Welte955aa942019-05-03 01:29:29 +02002516 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002517 setverdict(fail, "Unexpected GMM ID REQ (IMEI).");
2518 mtc.stop;
2519 }
Harald Welte955aa942019-05-03 01:29:29 +02002520 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002521 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2522 mtc.stop;
2523 }
Harald Welte955aa942019-05-03 01:29:29 +02002524 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2525 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002526 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002527 setverdict(pass);
2528 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
2529 }
2530 }
2531}
2532
2533testcase TC_attach_gmm_attach_req_while_gmm_attach() runs on test_CT {
2534 /* Testing if the SGSN ignore Attach Request with the exact same content */
2535 /* MS -> SGSN: Attach Request IMSI
2536 * MS <- SGSN: Identity Request IMSI (optional)
2537 * MS -> SGSN: Identity Response IMSI (optional)
2538 * MS <- SGSN: Identity Request IMEI
2539 * MS -> SGSN: Attach Request (2nd)
2540 * MS <- SGSN: Identity Response IMEI
2541 * MS <- SGSN: Attach Accept
2542 * MS -> SGSN: Attach Complete
2543 */
2544 var BSSGP_ConnHdlr vc_conn;
2545 f_init();
2546 f_sleep(1.0);
2547 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
2548 vc_conn := f_start_handler(refers(f_TC_attach_gmm_attach_req_while_gmm_attach), testcasename(), g_gb, 39);
2549 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002550 f_cleanup();
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002551}
2552
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002553private function f_TC_attach_usim_resync(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002554 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2555
2556 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2557
2558 /* send Attach Request */
2559 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2560 * 3G auth vectors */
2561 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2562 /* The thing is, if the solSACapability is 'omit', then the
2563 * revisionLevelIndicatior is at the wrong place! */
2564 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002565 f_send_l3(attach_req);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002566
2567 /* do the auth */
2568 var PDU_L3_MS_SGSN l3_mo;
2569 var PDU_L3_SGSN_MS l3_mt;
2570 var default di := activate(as_mm_identity());
2571
2572 var GSUP_IE auth_tuple;
2573 var template AuthenticationParameterAUTNTLV autn;
2574
2575 g_pars.vec := f_gen_auth_vec_3g();
2576 autn := {
2577 elementIdentifier := '28'O,
2578 lengthIndicator := lengthof(g_pars.vec.autn),
2579 autnValue := g_pars.vec.autn
2580 };
2581 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2582 g_pars.vec.sres,
2583 g_pars.vec.kc,
2584 g_pars.vec.ik,
2585 g_pars.vec.ck,
2586 g_pars.vec.autn,
2587 g_pars.vec.res));
2588 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2589 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2590 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2591
2592 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2593 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002594 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002595
2596 /* send the gmm auth failure with resync IE */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002597 f_send_l3(ts_GMM_AUTH_FAIL_UMTS_AKA_RESYNC(g_pars.vec.auts));
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002598
2599 /* wait for the GSUP resync request */
2600 GSUP.receive(tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
2601 g_pars.imsi,
2602 g_pars.vec.auts,
2603 g_pars.vec.rand));
2604
2605 /* generate new key material */
2606 g_pars.vec := f_gen_auth_vec_3g();
2607 autn := {
2608 elementIdentifier := '28'O,
2609 lengthIndicator := lengthof(g_pars.vec.autn),
2610 autnValue := g_pars.vec.autn
2611 };
2612
2613 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2614 g_pars.vec.sres,
2615 g_pars.vec.kc,
2616 g_pars.vec.ik,
2617 g_pars.vec.ck,
2618 g_pars.vec.autn,
2619 g_pars.vec.res));
2620 /* send new key material */
2621 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2622
2623 /* wait for the new Auth Request */
2624 auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2625 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002626 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002627 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
2628 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2629 auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2630 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
2631 valueField := substr(g_pars.vec.res, 0, 4)
2632 };
2633 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
2634 elementIdentifier := '21'O,
2635 lengthIndicator := lengthof(g_pars.vec.res) - 4,
2636 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
2637 };
2638 l3_mo := valueof(auth_ciph_resp);
2639 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
2640 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
2641 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
2642 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
2643 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002644 f_send_l3(l3_mo);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002645 deactivate(di);
2646
2647 /* Expect SGSN to perform LU with HLR */
2648 f_gmm_gsup_lu_isd();
2649
Harald Welte955aa942019-05-03 01:29:29 +02002650 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2651 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002652 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002653 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002654 setverdict(pass);
2655}
2656
2657testcase TC_attach_usim_resync() runs on test_CT {
2658 /* MS -> SGSN: Attach Request
2659 * MS <- SGSN: Identity Request IMSI
2660 * MS -> SGSN: Identity Response IMSI
2661 * MS <- SGSN: Identity Request IMEI
2662 * MS -> SGSN: Identity Response IMEI
2663 * HLR<- SGSN: SAI Request
2664 * HLR-> SGSN: SAI Response
2665 * MS <- SGSN: Auth Request
2666 * MS -> SGSN: Auth Failure (with AUTS)
2667 * HLR<- SGSN: SAI Request (with AUTS & RAND)
2668 * HLR-> SGSN: SAI Response (new key material)
2669 * MS <- SGSN: Auth Request (new key material)
2670 * MS -> SGSN: Auth Response
2671 * MS <- SGSN: Attach Accept
2672 * MS -> SGSN: Attach Complete
2673 */
2674 var BSSGP_ConnHdlr vc_conn;
2675 f_init();
2676 f_sleep(1.0);
2677 vc_conn := f_start_handler(refers(f_TC_attach_usim_resync), testcasename(), g_gb, 40);
2678 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002679 f_cleanup();
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002680}
2681
Harald Weltea05b8072019-04-23 22:35:05 +02002682
2683/* Send LLC NULL to see if the SGSN survives it (OS#3952) */
2684private function f_TC_llc_null(charstring id) runs on BSSGP_ConnHdlr {
2685 f_gmm_attach(false, false);
2686 f_sleep(1.0);
2687 f_send_llc(ts_LLC_NULL('0'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
2688 /* try to detach to check if SGSN is still alive */
2689 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2690}
2691testcase TC_llc_null() runs on test_CT {
2692 var BSSGP_ConnHdlr vc_conn;
2693 f_init();
2694 f_sleep(1.0);
2695 vc_conn := f_start_handler(refers(f_TC_llc_null), testcasename(), g_gb, 41);
2696 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002697 f_cleanup();
Harald Weltea05b8072019-04-23 22:35:05 +02002698}
2699
Harald Welte645a1512019-04-23 23:18:23 +02002700/* Send LLC SABM to see if the SGSN rejects it properly with DM */
2701private function f_TC_llc_sabm_dm_llgmm(charstring id) runs on BSSGP_ConnHdlr {
2702 f_gmm_attach(false, false);
2703 f_sleep(1.0);
2704 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02002705 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LLGMM, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02002706 setverdict(pass);
2707}
2708testcase TC_llc_sabm_dm_llgmm() runs on test_CT {
2709 var BSSGP_ConnHdlr vc_conn;
2710 f_init();
2711 f_sleep(1.0);
2712 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_llgmm), testcasename(), g_gb, 42);
2713 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002714 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02002715}
2716
2717/* Send LLC SABM to see if the SGSN rejects it properly with DM */
2718private function f_TC_llc_sabm_dm_ll5(charstring id) runs on BSSGP_ConnHdlr {
2719 f_gmm_attach(false, false);
2720 f_sleep(1.0);
2721 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LL5, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02002722 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LL5, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02002723 setverdict(pass);
2724}
2725testcase TC_llc_sabm_dm_ll5() runs on test_CT {
2726 var BSSGP_ConnHdlr vc_conn;
2727 f_init();
2728 f_sleep(1.0);
2729 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_ll5), testcasename(), g_gb, 43);
2730 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002731 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02002732}
2733
Harald Welte2aaac1b2019-05-02 10:02:53 +02002734/* test XID handshake with empty L3 info: expect empty return (some phones require that, OS#3426 */
2735private function f_TC_xid_empty_l3(charstring id) runs on BSSGP_ConnHdlr {
2736 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2737 var template (value) XID_Information xid;
2738 var template XID_Information xid_rx;
2739
2740 /* first perform regular attach */
2741 f_TC_attach(id);
2742 /* then activate PDP context */
2743 f_pdp_ctx_act(apars);
2744
2745 /* start MO XID */
2746 xid := { ts_XID_L3(''O) };
2747 xid_rx := { tr_XID_L3(''O) };
2748 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
2749 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002750 [] BSSGP[0].receive(tr_LLC_XID(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02002751 [] as_xid(apars);
2752 }
2753 setverdict(pass);
2754}
2755testcase TC_xid_empty_l3() runs on test_CT {
2756 var BSSGP_ConnHdlr vc_conn;
2757 f_init();
2758 f_sleep(1.0);
2759 vc_conn := f_start_handler(refers(f_TC_xid_empty_l3), testcasename(), g_gb, 44);
2760 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002761 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02002762}
2763
2764private function f_TC_xid_n201u(charstring id) runs on BSSGP_ConnHdlr {
2765 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2766 var template (value) XID_Information xid;
2767 var template XID_Information xid_rx;
2768
2769 /* first perform regular attach */
2770 f_TC_attach(id);
2771 /* then activate PDP context */
2772 f_pdp_ctx_act(apars);
2773
2774 /* start MO XID */
2775 xid := { ts_XID_N201U(1234) };
2776 xid_rx := { tr_XID_N201U(1234) };
2777 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
2778 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002779 [] BSSGP[0].receive(tr_LLC_XID_MT_RSP(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02002780 [] as_xid(apars);
2781 }
2782 setverdict(pass);
2783}
2784testcase TC_xid_n201u() runs on test_CT {
2785 var BSSGP_ConnHdlr vc_conn;
2786 f_init();
2787 f_sleep(1.0);
2788 vc_conn := f_start_handler(refers(f_TC_xid_n201u), testcasename(), g_gb, 45);
2789 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002790 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02002791}
2792
Alexander Couzens6bee0872019-05-11 01:48:50 +02002793private function f_TC_attach_pdp_act_gmm_detach(charstring id) runs on BSSGP_ConnHdlr {
2794 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2795
2796 /* first perform regular attach */
2797 f_TC_attach(id);
2798 /* then activate PDP context */
2799 f_pdp_ctx_act(apars);
2800 /* do a normal detach */
2801 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
2802}
2803
2804testcase TC_attach_pdp_act_gmm_detach() runs on test_CT {
2805 /* MS -> SGSN: Attach Request
2806 * MS <-> SGSN: [..]
2807 * MS -> SGSN: Attach Complete
2808 * MS -> SGSN: PDP Activate Request
2809 * MS <- SGSN: PDP Activate Accept
2810 * MS -> SGSN: GMM Detach Request
2811 * MS <- SGSN: GMM Detach Accept
2812 */
2813 var BSSGP_ConnHdlr vc_conn;
2814 f_init();
2815 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_gmm_detach), testcasename(), g_gb, 26);
2816 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002817 f_cleanup();
Alexander Couzens6bee0872019-05-11 01:48:50 +02002818}
Harald Welte645a1512019-04-23 23:18:23 +02002819
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01002820private function f_TC_attach_req_id_req_ra_update(charstring id) runs on BSSGP_ConnHdlr {
2821 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2822 var RoutingAreaIdentificationV new_ra := f_random_RAI();
2823 while (old_ra == new_ra) { new_ra := f_random_RAI(); };
2824 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2825 var PDU_L3_SGSN_MS l3_mt;
2826
2827 f_send_l3(attach_req, 0);
2828
2829 BSSGP[0].receive(tr_GMM_ID_REQ(?));
2830
2831 f_send_l3(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, new_ra, false, omit, omit));
2832 alt {
2833 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) {
2834 setverdict(pass);
2835 }
2836 [] BSSGP[0].receive { repeat; }
2837 }
2838}
2839
2840/* This test triggers crash in osmo-sgsn before osmo-sgsn.git I64fa5cf1b427d3abb99e553e584897261a827ce6.
2841 * See OS#3957 and OS#4245 for more information.
2842 */
2843testcase TC_attach_req_id_req_ra_update() runs on test_CT {
2844 /*
2845 * MS --> SGSN: Attach Req (TMSI, RAI=901-70-356-101)
2846 * MS <-- SGSN: Identity Request (IMEI)
2847 * MS --> SGSN: RA Updating (RAI=901-70-2758-208)
2848 */
2849 var BSSGP_ConnHdlr vc_conn;
2850 f_init();
2851 vc_conn := f_start_handler(refers(f_TC_attach_req_id_req_ra_update), testcasename(), g_gb, 47);
2852 vc_conn.done;
2853 f_cleanup();
2854}
2855
Harald Welte5ac31492018-02-15 20:39:13 +01002856control {
Harald Welte5b7c8122018-02-16 21:48:17 +01002857 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01002858 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02002859 execute( TC_attach_umts_aka_umts_res() );
2860 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01002861 execute( TC_attach_auth_id_timeout() );
2862 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01002863 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01002864 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01002865 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01002866 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01002867 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01002868 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002869 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02002870 execute( TC_attach_no_imsi_response() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02002871 execute( TC_attach_closed_add_vty(), 20.0 );
2872 execute( TC_attach_check_subscriber_list(), 20.0 );
2873 execute( TC_attach_detach_check_subscriber_list(), 20.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02002874 execute( TC_attach_check_complete_resend() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02002875 execute( TC_hlr_location_cancel_request_update(), 20.0 );
2876 execute( TC_hlr_location_cancel_request_withdraw(), 20.0 );
2877 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 20.0 );
2878 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 20.0 );
Harald Welte04683d02018-02-16 22:43:45 +01002879 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01002880 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02002881 execute( TC_attach_rau_a_a() );
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002882 execute( TC_attach_rau_a_b() );
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002883 execute( TC_attach_usim_resync() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01002884 execute( TC_detach_unknown_nopoweroff() );
2885 execute( TC_detach_unknown_poweroff() );
2886 execute( TC_detach_nopoweroff() );
2887 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01002888 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01002889 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01002890 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01002891 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01002892 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01002893 execute( TC_attach_pdp_act_user_deact_mt() );
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02002894 execute( TC_attach_pdp_act_deact_dup() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02002895 execute( TC_attach_second_attempt() );
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02002896 execute( TC_attach_echo_timeout() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002897 execute( TC_attach_restart_ctr_echo() );
2898 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002899 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002900 execute( TC_attach_pdp_act_deact_gtp_retrans() );
2901 execute( TC_attach_pdp_act_deact_gtp_retrans_resp() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002902 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Alexander Couzens6bee0872019-05-11 01:48:50 +02002903 execute( TC_attach_pdp_act_gmm_detach() );
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002904 execute( TC_attach_gmm_attach_req_while_gmm_attach() );
Harald Weltea05b8072019-04-23 22:35:05 +02002905
Harald Welte2aaac1b2019-05-02 10:02:53 +02002906 execute( TC_xid_empty_l3() );
2907 execute( TC_xid_n201u() );
2908
Harald Weltea05b8072019-04-23 22:35:05 +02002909 execute( TC_llc_null() );
Harald Welte645a1512019-04-23 23:18:23 +02002910 execute( TC_llc_sabm_dm_llgmm() );
2911 execute( TC_llc_sabm_dm_ll5() );
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01002912
2913 /* At the end, may crash osmo-sgsn, see OS#3957, OS#4245 */
2914 execute( TC_attach_req_id_req_ra_update() );
Harald Welte5ac31492018-02-15 20:39:13 +01002915}
Harald Welte96a33b02018-02-04 10:36:22 +01002916
2917
2918
2919}