blob: f07042934274ebb50abe26a85bd755fd422a8899 [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;
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200680 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli, BSSGP_PROC[ran_index]);
Harald Weltef70997d2018-02-17 10:11:19 +0100681}
682
Harald Welte04683d02018-02-16 22:43:45 +0100683function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
684 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100685 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Alexander Couzens51114d12018-07-31 18:41:56 +0200686 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100687 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Alexander Couzens51114d12018-07-31 18:41:56 +0200688 & "; expected " & hex2str(g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200689 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100690 }
Harald Welte04683d02018-02-16 22:43:45 +0100691 g_pars.ra := aa.routingAreaIdentification;
692 if (ispresent(aa.allocatedPTMSI)) {
693 if (not g_pars.net.expect_ptmsi) {
694 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200695 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100696 }
Harald Weltef70997d2018-02-17 10:11:19 +0100697 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100698 }
699 if (ispresent(aa.msIdentity)) {
700 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200701 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100702 }
703 /* P-TMSI.sig */
704 if (ispresent(aa.ptmsiSignature)) {
705 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
706 }
707 /* updateTimer */
708 // aa.readyTimer
709 /* T3302, T3319, T3323, T3312_ext, T3324 */
710}
711
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200712function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +0100713 /* mandatory IE */
714 g_pars.ra := ra.routingAreaId;
715 if (ispresent(ra.allocatedPTMSI)) {
716 if (not g_pars.net.expect_ptmsi) {
717 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200718 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100719 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200720 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets, ran_index);
Harald Welte91636de2018-02-17 10:16:14 +0100721 }
722 if (ispresent(ra.msIdentity)) {
723 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200724 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100725 }
726 /* P-TMSI.sig */
727 if (ispresent(ra.ptmsiSignature)) {
728 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
729 }
730 /* updateTimer */
731 // aa.readyTimer
732 /* T3302, T3319, T3323, T3312_ext, T3324 */
733}
734
735
Harald Welte5a4fa042018-02-16 20:59:21 +0100736function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
737 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
738}
739
Harald Welte23178c52018-02-17 09:36:33 +0100740/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100741private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileL3_CommonIE_Types.MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100742 if (ispresent(g_pars.p_tmsi)) {
743 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
744 } else {
745 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
746 }
747}
748
Harald Welte311ec272018-02-17 09:40:03 +0100749private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100750 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100751 /* Expect MSC to perform LU with HLR */
752 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100753 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
754 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
755 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100756 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
757 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
758}
759
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200760friend 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 +0100761 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200762 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 +0200763 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5ac31492018-02-15 20:39:13 +0100764
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200765 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
766 * 3G auth vectors */
767 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
768 /* The thing is, if the solSACapability is 'omit', then the
769 * revisionLevelIndicatior is at the wrong place! */
770 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
771
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200772 f_send_l3(attach_req, ran_index);
773 f_gmm_auth(umts_aka_challenge, force_gsm_sres, ran_index);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200774 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100775 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100776
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200777 l3_mt := f_receive_l3(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?), ran_index);
Harald Welteca362462019-05-02 20:11:21 +0200778 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
779
Harald Welte04683d02018-02-16 22:43:45 +0100780 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200781 f_send_l3(ts_GMM_ATTACH_COMPL, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200782
783 /* IuPS case: Expect Iu Release */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200784 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200785 as_iu_release_compl_disc();
786 }
Alexander Couzens42d3cad2019-10-08 16:29:26 +0200787
788 /* Race condition
789 * It has shown, that GMM_ATTACH_COMPL might take some time to arrive at the SGSN through the layers.
790 * In TC hlr_location_cancel_request_update, the GMM_ATTACH_COMPL came 2ms too late, so that the Location Cancel Request
791 * arrived before it. This results in a test case failure.
792 * Delay execution by 50 ms
793 */
794 f_sleep(0.05);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200795}
796
797private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
798 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100799 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100800}
801
802testcase TC_attach() runs on test_CT {
803 var BSSGP_ConnHdlr vc_conn;
804 f_init();
805 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200806 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100807 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200808 f_cleanup();
Harald Welte5ac31492018-02-15 20:39:13 +0100809}
810
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100811testcase TC_attach_mnc3() runs on test_CT {
812 var BSSGP_ConnHdlr vc_conn;
813 f_init('023042'H);
814 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200815 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100816 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200817 f_cleanup();
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100818}
819
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200820private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
821 f_gmm_attach(true, false);
822 setverdict(pass);
823}
824testcase TC_attach_umts_aka_umts_res() runs on test_CT {
825 var BSSGP_ConnHdlr vc_conn;
826 f_init();
827 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200828 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200829 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200830 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200831}
832
833private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
834 f_gmm_attach(true, true);
835 setverdict(pass);
836}
837testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
838 var BSSGP_ConnHdlr vc_conn;
839 f_init();
840 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200841 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200842 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200843 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200844}
845
Harald Welte5b7c8122018-02-16 21:48:17 +0100846/* MS never responds to ID REQ, expect ATTACH REJECT */
847private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100848 var RoutingAreaIdentificationV old_ra := f_random_RAI();
849
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200850 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100851 alt {
Harald Welte955aa942019-05-03 01:29:29 +0200852 [] BSSGP[0].receive(tr_GMM_ID_REQ(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100853 /* don't send ID Response */
854 repeat;
855 }
Harald Welte955aa942019-05-03 01:29:29 +0200856 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('09'O)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100857 setverdict(pass);
858 }
Harald Welte955aa942019-05-03 01:29:29 +0200859 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100860 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +0200861 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100862 }
863 }
864}
865testcase TC_attach_auth_id_timeout() runs on test_CT {
866 var BSSGP_ConnHdlr vc_conn;
867 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200868 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 +0100869 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200870 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +0100871}
872
873/* HLR never responds to SAI REQ, expect ATTACH REJECT */
874private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100875 var RoutingAreaIdentificationV old_ra := f_random_RAI();
876
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200877 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100878 alt {
879 [] as_mm_identity();
880 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
881 }
882 /* don't send SAI-response from HLR */
Harald Welte955aa942019-05-03 01:29:29 +0200883 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Welte5b7c8122018-02-16 21:48:17 +0100884 setverdict(pass);
885}
886testcase TC_attach_auth_sai_timeout() runs on test_CT {
887 var BSSGP_ConnHdlr vc_conn;
888 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200889 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +0100890 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200891 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +0100892}
893
Harald Weltefe253882018-02-17 09:25:00 +0100894/* HLR rejects SAI, expect ATTACH REJECT */
895private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100896 var RoutingAreaIdentificationV old_ra := f_random_RAI();
897
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200898 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +0100899 alt {
900 [] as_mm_identity();
901 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
902 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
903 }
904 }
Harald Welte955aa942019-05-03 01:29:29 +0200905 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Weltefe253882018-02-17 09:25:00 +0100906 setverdict(pass);
907}
908testcase TC_attach_auth_sai_reject() runs on test_CT {
909 var BSSGP_ConnHdlr vc_conn;
910 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200911 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +0100912 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200913 f_cleanup();
Harald Weltefe253882018-02-17 09:25:00 +0100914}
915
Harald Welte5b7c8122018-02-16 21:48:17 +0100916/* HLR never responds to UL REQ, expect ATTACH REJECT */
917private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +0200918 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5b7c8122018-02-16 21:48:17 +0100919 var RoutingAreaIdentificationV old_ra := f_random_RAI();
920
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200921 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100922 f_gmm_auth();
923 /* Expect MSC to perform LU with HLR */
924 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
925 /* Never follow-up with ISD_REQ or UL_RES */
926 alt {
Harald Welte955aa942019-05-03 01:29:29 +0200927 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100928 setverdict(pass);
929 }
Harald Welte955aa942019-05-03 01:29:29 +0200930 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
931 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100932 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200933 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100934 }
935 }
936}
937testcase TC_attach_gsup_lu_timeout() runs on test_CT {
938 var BSSGP_ConnHdlr vc_conn;
939 f_init();
940 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200941 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100942 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200943 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +0100944}
945
Harald Welteb7c14e92018-02-17 09:29:16 +0100946/* HLR rejects UL REQ, expect ATTACH REJECT */
947private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +0200948 var PDU_L3_SGSN_MS l3_mt;
Harald Welteb7c14e92018-02-17 09:29:16 +0100949 var RoutingAreaIdentificationV old_ra := f_random_RAI();
950
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200951 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +0100952 f_gmm_auth();
953 /* Expect MSC to perform LU with HLR */
954 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
955 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
956 }
957 alt {
Harald Welte955aa942019-05-03 01:29:29 +0200958 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb7c14e92018-02-17 09:29:16 +0100959 setverdict(pass);
960 }
Harald Welte955aa942019-05-03 01:29:29 +0200961 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
962 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welteb7c14e92018-02-17 09:29:16 +0100963 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200964 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +0100965 }
966 }
967}
968testcase TC_attach_gsup_lu_reject() runs on test_CT {
969 var BSSGP_ConnHdlr vc_conn;
970 f_init();
971 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200972 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +0100973 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200974 f_cleanup();
Harald Welteb7c14e92018-02-17 09:29:16 +0100975}
976
977
Harald Welte3823e2e2018-02-16 21:53:48 +0100978/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
979private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +0200980 var PDU_L3_SGSN_MS l3_mt;
Harald Welte3823e2e2018-02-16 21:53:48 +0100981 var RoutingAreaIdentificationV old_ra := f_random_RAI();
982
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200983 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +0100984 f_gmm_auth();
985 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100986 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100987
Harald Welte955aa942019-05-03 01:29:29 +0200988 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
989 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +0100990 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200991 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +0100992 setverdict(pass);
993}
Harald Welte3823e2e2018-02-16 21:53:48 +0100994testcase TC_attach_combined() runs on test_CT {
995 var BSSGP_ConnHdlr vc_conn;
996 f_init();
997 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200998 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100999 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001000 f_cleanup();
Harald Welte3823e2e2018-02-16 21:53:48 +01001001}
1002
Harald Welte76dee092018-02-16 22:12:59 +01001003/* Attempt of GPRS ATTACH in 'accept all' mode */
1004private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001005 var PDU_L3_SGSN_MS l3_mt;
Harald Welte76dee092018-02-16 22:12:59 +01001006 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1007
1008 g_pars.net.expect_auth := false;
1009
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001010 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +01001011 f_gmm_auth();
Harald Welte955aa942019-05-03 01:29:29 +02001012 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1013 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001014 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001015 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +01001016 setverdict(pass);
1017}
1018testcase TC_attach_accept_all() runs on test_CT {
1019 var BSSGP_ConnHdlr vc_conn;
1020 f_init();
1021 f_sleep(1.0);
1022 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +02001023 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +01001024 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001025 f_cleanup();
Harald Welte76dee092018-02-16 22:12:59 +01001026}
Harald Welte5b7c8122018-02-16 21:48:17 +01001027
Harald Welteb2124b22018-02-16 22:26:56 +01001028/* Attempt of GPRS ATTACH in 'accept all' mode */
1029private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +01001030 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1031
1032 /* Simulate a foreign IMSI */
1033 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +02001034 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welteb2124b22018-02-16 22:26:56 +01001035
1036 g_pars.net.expect_auth := false;
1037
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001038 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +01001039 alt {
1040 [] as_mm_identity();
Harald Welte955aa942019-05-03 01:29:29 +02001041 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('07'O)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001042 setverdict(pass);
1043 }
Harald Welte955aa942019-05-03 01:29:29 +02001044 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001045 setverdict(pass);
1046 }
Harald Welte955aa942019-05-03 01:29:29 +02001047 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001048 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001049 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001050 }
Harald Welteb2124b22018-02-16 22:26:56 +01001051 }
1052}
1053testcase TC_attach_closed() runs on test_CT {
1054 var BSSGP_ConnHdlr vc_conn;
1055 f_init();
1056 f_sleep(1.0);
1057 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1058 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001059 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +01001060 vc_conn.done;
1061 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001062 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +01001063 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001064 f_cleanup();
Harald Welteb2124b22018-02-16 22:26:56 +01001065}
1066
Harald Welte04683d02018-02-16 22:43:45 +01001067/* Routing Area Update from Unknown TLLI -> REJECT */
1068private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +01001069 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1070
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001071 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 +01001072 alt {
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01001073 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) { /* gmm cause: implicitly detached */
Harald Welte04683d02018-02-16 22:43:45 +01001074 setverdict(pass);
1075 }
1076 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001077 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +01001078 }
1079}
1080testcase TC_rau_unknown() runs on test_CT {
1081 var BSSGP_ConnHdlr vc_conn;
1082 f_init();
1083 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001084 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +01001085 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001086 f_cleanup();
Harald Welte04683d02018-02-16 22:43:45 +01001087}
1088
Harald Welte91636de2018-02-17 10:16:14 +01001089private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +01001090 /* first perform regular attach */
1091 f_TC_attach(id);
1092
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001093 f_routing_area_update(g_pars.ra);
1094
Harald Welte91636de2018-02-17 10:16:14 +01001095}
1096testcase TC_attach_rau() runs on test_CT {
1097 var BSSGP_ConnHdlr vc_conn;
1098 f_init();
1099 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001100 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +01001101 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001102 f_cleanup();
Harald Welte91636de2018-02-17 10:16:14 +01001103}
Harald Welte04683d02018-02-16 22:43:45 +01001104
Harald Welte6abb9fe2018-02-17 15:24:48 +01001105/* general GPRS DETACH helper */
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001106function 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 +02001107 var PDU_L3_SGSN_MS l3_mt;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001108 timer T := 5.0;
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001109 f_send_l3(ts_GMM_DET_REQ_MO(detach_type, power_off), ran_index);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001110 if (expect_purge) {
1111 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
1112 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
1113 }
1114 T.start;
1115 alt {
1116 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
1117 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +02001118 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001119 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001120 [power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001121 g_pars.ra := omit;
Alexander Couzens8e0fd462019-05-11 01:20:55 +02001122 setverdict(fail, "Unexpected DETACH ACCEPT in power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +02001123 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001124 /* TODO: check if any PDP contexts are deactivated on network side? */
1125 }
1126 [power_off] T.timeout {
1127 setverdict(pass);
1128 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001129 [not power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001130 g_pars.ra := omit;
1131 setverdict(pass);
1132 /* TODO: check if any PDP contexts are deactivated on network side? */
1133 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001134 [] BSSGP[ran_index].receive(PDU_L3_SGSN_MS:?) -> value l3_mt {
Alexander Couzens4630e742019-05-11 01:50:10 +02001135 if (power_off) {
1136 setverdict(fail, "Unexpected Layer 3 package received in power-off DETACH");
1137 } else {
1138 setverdict(fail, "Unexpected Layer 3 package received in normal DETACH");
1139 }
1140 mtc.stop;
1141 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001142 [] BSSGP[ran_index].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +01001143 }
1144}
1145
1146/* IMSI DETACH (non-power-off) for unknown TLLI */
1147private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1148 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
1149}
1150testcase TC_detach_unknown_nopoweroff() runs on test_CT {
1151 var BSSGP_ConnHdlr vc_conn;
1152 f_init();
1153 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001154 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001155 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001156 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001157}
1158
1159/* IMSI DETACH (power-off) for unknown TLLI */
1160private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1161 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
1162}
1163testcase TC_detach_unknown_poweroff() runs on test_CT {
1164 var BSSGP_ConnHdlr vc_conn;
1165 f_init();
1166 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001167 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001168 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001169 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001170}
1171
1172/* IMSI DETACH (non-power-off) for known TLLI */
1173private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1174 /* first perform regular attach */
1175 f_TC_attach(id);
1176
1177 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
1178}
1179testcase TC_detach_nopoweroff() runs on test_CT {
1180 var BSSGP_ConnHdlr vc_conn;
1181 f_init();
1182 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001183 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001184 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001185 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001186}
1187
1188/* IMSI DETACH (power-off) for known TLLI */
1189private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1190 /* first perform regular attach */
1191 f_TC_attach(id);
1192
1193 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1194}
1195testcase TC_detach_poweroff() runs on test_CT {
1196 var BSSGP_ConnHdlr vc_conn;
1197 f_init();
1198 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001199 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001200 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001201 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001202}
1203
Harald Welteeded9ad2018-02-17 20:57:34 +01001204type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +01001205 BIT3 tid, /* L3 Transaction ID */
1206 BIT4 nsapi, /* SNDCP NSAPI */
1207 BIT4 sapi, /* LLC SAPI */
1208 QoSV qos, /* QoS parameters */
1209 PDPAddressV addr, /* IP address */
1210 octetstring apn optional, /* APN name */
1211 ProtocolConfigOptionsV pco optional, /* protoco config opts */
1212 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +01001213 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +01001214 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +01001215
Harald Welte822f9102018-02-18 20:39:06 +01001216 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
1217 OCT4 ggsn_tei_u, /* GGSN TEI User */
1218 octetstring ggsn_ip_c, /* GGSN IP Control */
1219 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001220 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +01001221
Harald Welte822f9102018-02-18 20:39:06 +01001222 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
1223 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
1224 octetstring sgsn_ip_c optional, /* SGSN IP Control */
1225 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +01001226};
1227
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001228
1229private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
1230 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
1231 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
1232 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
1233 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
1234 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
1235 f_gtp_register_teid(apars.ggsn_tei_c);
1236 f_gtp_register_teid(apars.ggsn_tei_u);
1237}
1238
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001239function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001240runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +01001241 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1242 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001243 var template Recovery_gtpc recovery := omit;
1244
1245 if (send_recovery) {
1246 recovery := ts_Recovery(apars.ggsn_restart_ctr);
1247 }
Harald Welteeded9ad2018-02-17 20:57:34 +01001248
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001249 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 +02001250 apars.apn, apars.pco), ran_index);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001251 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
1252 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
1253 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1254 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
1255 apars.sgsn_tei_c, apars.gtp_resp_cause,
1256 apars.ggsn_tei_c, apars.ggsn_tei_u,
1257 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001258 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1259 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +01001260 }
1261 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001262 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001263 setverdict(pass);
1264 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001265 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001266 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +02001267 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001268 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001269 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001270 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +02001271 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001272 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001273 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Weltef7191672019-05-02 20:37:23 +02001274 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
1275 mtc.stop;
1276 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001277 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001278 setverdict(pass);
1279 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001280 [] as_xid(apars, ran_index);
Harald Welteeded9ad2018-02-17 20:57:34 +01001281 }
1282}
1283
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001284function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001285runs on BSSGP_ConnHdlr {
Harald Welte6f203162018-02-18 22:04:55 +01001286 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1287 var Gtp1cUnitdata g_ud;
1288
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001289 f_send_l3(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit), ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001290 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1291 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001292 BSSGP[ran_index].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001293 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1294 }
1295 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001296 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Harald Welte6f203162018-02-18 22:04:55 +01001297 setverdict(pass);
1298 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001299 [] as_xid(apars, ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001300 }
1301}
1302
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001303function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001304runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001305 var Gtp1cUnitdata g_ud;
1306 var integer seq_nr := 23;
1307 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1308
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001309 BSSGP[ran_index].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001310 if (error_ind) {
1311 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1312 } else {
1313 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1314 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001315
1316 timer T := 5.0;
1317 T.start;
1318
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001319 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001320 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1321 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), ran_index);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001322 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001323 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1324 repeat;
1325 }
1326 [] T.timeout {
1327 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1328 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001329 }
1330}
1331
Harald Welte6f203162018-02-18 22:04:55 +01001332
Harald Welteeded9ad2018-02-17 20:57:34 +01001333/* Table 10.5.156/3GPP TS 24.008 */
1334template (value) QoSV t_QosDefault := {
1335 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1336 delayClass := '100'B, /* best effort */
1337 spare1 := '00'B,
1338 precedenceClass := '010'B, /* normal */
1339 spare2 := '0'B,
1340 peakThroughput := '0000'B, /* subscribed */
1341 meanThroughput := '00000'B, /* subscribed */
1342 spare3 := '000'B,
1343 deliverErroneusSDU := omit,
1344 deliveryOrder := omit,
1345 trafficClass := omit,
1346 maxSDUSize := omit,
1347 maxBitrateUplink := omit,
1348 maxBitrateDownlink := omit,
1349 sduErrorRatio := omit,
1350 residualBER := omit,
1351 trafficHandlingPriority := omit,
1352 transferDelay := omit,
1353 guaranteedBitRateUplink := omit,
1354 guaranteedBitRateDownlink := omit,
1355 sourceStatisticsDescriptor := omit,
1356 signallingIndication := omit,
1357 spare4 := omit,
1358 maxBitrateDownlinkExt := omit,
1359 guaranteedBitRateDownlinkExt := omit,
1360 maxBitrateUplinkExt := omit,
1361 guaranteedBitRateUplinkExt := omit,
1362 maxBitrateDownlinkExt2 := omit,
1363 guaranteedBitRateDownlinkExt2 := omit,
1364 maxBitrateUplinkExt2 := omit,
1365 guaranteedBitRateUplinkExt2 := omit
1366}
1367
1368/* 10.5.6.4 / 3GPP TS 24.008 */
1369template (value) PDPAddressV t_AddrIPv4dyn := {
1370 pdpTypeOrg := '0001'B, /* IETF */
1371 spare := '0000'B,
1372 pdpTypeNum := '21'O, /* IPv4 */
1373 addressInfo := omit
1374}
1375template (value) PDPAddressV t_AddrIPv6dyn := {
1376 pdpTypeOrg := '0001'B, /* IETF */
1377 spare := '0000'B,
1378 pdpTypeNum := '53'O, /* IPv6 */
1379 addressInfo := omit
1380}
1381
Harald Welte37692d82018-02-18 15:21:34 +01001382template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001383 tid := '000'B,
1384 nsapi := '0101'B, /* < 5 are reserved */
1385 sapi := '0011'B, /* 3/5/9/11 */
1386 qos := t_QosDefault,
1387 addr := t_AddrIPv4dyn,
1388 apn := omit,
1389 pco := omit,
1390 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001391 gtp_resp_cause := int2oct(128, 1),
1392 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001393
1394 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001395 ggsn_tei_c := f_rnd_octstring(4),
1396 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001397 ggsn_ip_c := f_inet_addr(ggsn_ip),
1398 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001399 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001400
Harald Welteeded9ad2018-02-17 20:57:34 +01001401 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001402 sgsn_tei_u := omit,
1403 sgsn_ip_c := omit,
1404 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001405}
1406
Harald Welte37692d82018-02-18 15:21:34 +01001407template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1408 connId := 1,
1409 remName := f_inet_ntoa(ip),
1410 remPort := GTP1U_PORT
1411}
1412
1413template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1414 connId := 1,
1415 remName := f_inet_ntoa(ip),
1416 remPort := GTP1C_PORT
1417}
1418
1419private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1420 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1421 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1422}
1423
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001424private altstep as_xid(PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr {
1425 [] BSSGP[ran_index].receive(tr_LLC_XID_MT_CMD(?, apars.sapi)) {
Harald Welte37692d82018-02-18 15:21:34 +01001426 repeat;
1427 }
1428}
1429
1430template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1431 pDU_SN_UNITDATA := {
1432 nsapi := nsapi,
1433 moreBit := ?,
1434 snPduType := '1'B,
1435 firstSegmentIndicator := ?,
1436 spareBit := ?,
1437 pcomp := ?,
1438 dcomp := ?,
1439 npduNumber := ?,
1440 segmentNumber := ?,
1441 npduNumberContinued := ?,
1442 dataSegmentSnUnitdataPdu := payload
1443 }
1444}
1445
1446/* simple case: single segment, no compression */
1447template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1448 pDU_SN_UNITDATA := {
1449 nsapi := nsapi,
1450 moreBit := '0'B,
1451 snPduType := '1'B,
1452 firstSegmentIndicator := '1'B,
1453 spareBit := '0'B,
1454 pcomp := '0000'B,
1455 dcomp := '0000'B,
1456 npduNumber := '0000'B,
1457 segmentNumber := '0000'B,
1458 npduNumberContinued := '00'O,
1459 dataSegmentSnUnitdataPdu := payload
1460 }
1461}
1462
1463/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001464private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001465runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001466 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1467 f_gtpu_send(apars, payload);
1468 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1469 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001470 [] as_xid(apars, ran_index);
1471 //[] BSSGP[ran_index].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
1472 [] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload));
Harald Welte37692d82018-02-18 15:21:34 +01001473 }
1474}
1475
Pau Espin Pedrol8be4d192018-07-18 13:43:44 +02001476/* Transceive given 'payload' as MT message from Gb -> OsmoSGSN -> GTP */
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001477private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001478runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001479 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1480 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1481 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001482 BSSGP[ran_index].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
Harald Welte37692d82018-02-18 15:21:34 +01001483 /* Expect PDU via GTP from SGSN on simulated GGSN */
1484 alt {
1485 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1486 }
1487}
1488
Harald Welteeded9ad2018-02-17 20:57:34 +01001489private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001490 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001491
1492 /* first perform regular attach */
1493 f_TC_attach(id);
1494
1495 f_pdp_ctx_act(apars);
1496}
1497testcase TC_attach_pdp_act() runs on test_CT {
1498 var BSSGP_ConnHdlr vc_conn;
1499 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001500 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001501 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001502 f_cleanup();
Harald Welteeded9ad2018-02-17 20:57:34 +01001503}
Harald Welteb2124b22018-02-16 22:26:56 +01001504
Harald Welte835b15f2018-02-18 14:39:11 +01001505/* PDP Context activation for not-attached subscriber; expect fail */
1506private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001507 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001508 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 +01001509 apars.apn, apars.pco));
1510 alt {
1511 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Harald Welte955aa942019-05-03 01:29:29 +02001512 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001513 setverdict(pass);
1514 }
1515 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1516 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001517 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001518 }
Harald Welte955aa942019-05-03 01:29:29 +02001519 [] BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001520 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001521 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001522 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001523 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001524 }
1525}
1526testcase TC_pdp_act_unattached() runs on test_CT {
1527 var BSSGP_ConnHdlr vc_conn;
1528 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001529 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001530 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001531 f_cleanup();
Harald Welte835b15f2018-02-18 14:39:11 +01001532}
1533
Harald Welte37692d82018-02-18 15:21:34 +01001534/* ATTACH + PDP CTX ACT + user plane traffic */
1535private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1536 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1537
1538 /* first perform regular attach */
1539 f_TC_attach(id);
1540 /* then activate PDP context */
1541 f_pdp_ctx_act(apars);
1542 /* then transceive a downlink PDU */
1543 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1544 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1545}
1546testcase TC_attach_pdp_act_user() runs on test_CT {
1547 var BSSGP_ConnHdlr vc_conn;
1548 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001549 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001550 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001551 f_cleanup();
Harald Welte37692d82018-02-18 15:21:34 +01001552}
1553
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001554/* ATTACH + PDP CTX ACT; reject from GGSN */
1555private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1556 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1557
1558 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1559 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1560
1561 /* first perform regular attach */
1562 f_TC_attach(id);
1563 /* then activate PDP context */
1564 f_pdp_ctx_act(apars);
1565}
1566testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1567 var BSSGP_ConnHdlr vc_conn;
1568 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001569 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001570 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001571 f_cleanup();
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001572}
Harald Welte835b15f2018-02-18 14:39:11 +01001573
Harald Welte6f203162018-02-18 22:04:55 +01001574/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1575private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1576 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1577
1578 /* first perform regular attach */
1579 f_TC_attach(id);
1580 /* then activate PDP context */
1581 f_pdp_ctx_act(apars);
1582 /* then transceive a downlink PDU */
1583 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1584 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1585
1586 f_pdp_ctx_deact_mo(apars, '00'O);
1587}
1588testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1589 var BSSGP_ConnHdlr vc_conn;
1590 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001591 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 +01001592 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001593 f_cleanup();
Harald Welte6f203162018-02-18 22:04:55 +01001594}
1595
Harald Welte57b9b7f2018-02-18 22:28:13 +01001596/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1597private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1598 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1599
1600 /* first perform regular attach */
1601 f_TC_attach(id);
1602 /* then activate PDP context */
1603 f_pdp_ctx_act(apars);
1604 /* then transceive a downlink PDU */
1605 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1606 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1607
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001608 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001609}
1610testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1611 var BSSGP_ConnHdlr vc_conn;
1612 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001613 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 +01001614 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001615 f_cleanup();
Harald Welte57b9b7f2018-02-18 22:28:13 +01001616}
1617
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001618/* Test MS sending a duplicate Deact PDP Ctx (OS#3956). */
1619private function f_TC_attach_pdp_act_deact_dup(charstring id) runs on BSSGP_ConnHdlr {
1620 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1621 var Gtp1cUnitdata g_ud;
1622 var integer i;
1623 var OCT1 cause_regular_deact := '24'O;
1624
1625 /* first perform regular attach + PDP context act */
1626 f_TC_attach(id);
1627 f_pdp_ctx_act(apars);
1628
1629 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1630 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1631
1632 for (i := 0; i < 2; i := i+1) {
1633 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1634 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1635 log("Received deletePDPContextResponse " & int2str(i) & ", seq_nr=" & int2str(seq_nr));
1636 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1637 }
1638 }
1639
1640 alt {
1641 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1642 setverdict(pass);
1643 }
1644 [] as_xid(apars, 0);
1645 }
1646
1647 /* Make sure second DeactPdpAccept is sent: */
1648 timer T := 2.0;
1649 T.start;
1650 alt {
1651 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1652 setverdict(fail, "Second SM_DEACT_PDP_ACCEPT_MT received");
1653 }
1654 [] T.timeout {
1655 setverdict(pass);
1656 }
1657 }
1658
1659 setverdict(pass);
1660}
1661testcase TC_attach_pdp_act_deact_dup() runs on test_CT {
1662 var BSSGP_ConnHdlr vc_conn;
1663 f_init();
1664 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_dup), testcasename(), g_gb, 46);
1665 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001666 f_cleanup();
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001667}
1668
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001669/* ATTACH + ATTACH (2nd) */
1670private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1671 g_pars.t_guard := 5.0;
1672
1673 /* first perform regular attach */
1674 f_TC_attach(id);
1675
1676 /* second to perform regular attach */
1677 f_TC_attach(id);
1678}
1679
1680
1681testcase TC_attach_second_attempt() runs on test_CT {
1682 var BSSGP_ConnHdlr vc_conn;
1683 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001684 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001685 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001686 f_cleanup();
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001687}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001688
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001689private function f_TC_attach_echo_timeout(charstring id) runs on BSSGP_ConnHdlr {
1690 var Gtp1cUnitdata g_ud;
1691 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1692 var integer seq_nr;
1693
1694 /* first perform regular attach */
1695 f_TC_attach(id);
1696 /* then activate PDP context */
1697 f_pdp_ctx_act(apars);
1698
1699 /* Wait to receive first echo request and send initial Restart counter */
1700 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1701 BSSGP[0].clear;
1702 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1703 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1704 f_sleep(int2float(mp_echo_interval)); /* wait until around next echo is expected */
1705 }
1706
1707 /* At some point next echo request not answered will timeout and SGSN
1708 should drop the pdp ctx. Around T3 (3secs) * 6 (+ extra, a lot due to OS#4178): */
1709 timer T := 3.0 * 6.0 + 16.0;
1710 T.start;
1711 alt {
1712 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1713 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
1714 setverdict(pass);
1715 }
1716 [] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1717 /* SGSN currently doesn't send this message because it expects GGSN to be non-reachable anyway */
1718 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1719 log("Received deletePDPContextRequest seq_nr=" & int2str(seq_nr));
1720 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1721 repeat;
1722 }
1723 [] GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1724 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1725 log("Received EchoRequest seq_nr=" & int2str(seq_nr));
1726 repeat;
1727 }
1728 [] T.timeout {
1729 setverdict(fail, "BSSGP DeactPdpReq not received");
1730 mtc.stop;
1731 }
1732 [] as_xid(apars);
1733 }
1734 T.stop
1735
1736 setverdict(pass);
1737}
1738/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1739testcase TC_attach_echo_timeout() runs on test_CT {
1740 var BSSGP_ConnHdlr vc_conn;
1741 g_use_echo := true;
1742 f_init();
1743 vc_conn := f_start_handler(refers(f_TC_attach_echo_timeout), testcasename(), g_gb, 67, 50.0);
1744 vc_conn.done;
1745 g_use_echo := false;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001746 f_cleanup();
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001747}
1748
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001749private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001750 var Gtp1cUnitdata g_ud;
1751 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1752
1753 /* first perform regular attach */
1754 f_TC_attach(id);
1755 /* Activate a pdp context against the GGSN */
1756 f_pdp_ctx_act(apars);
1757 /* Wait to receive first echo request and send initial Restart counter */
1758 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1759 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1760 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1761 }
1762 /* Wait to receive second echo request and send incremented Restart
1763 counter. This will fake a restarted GGSN, and pdp ctx allocated
1764 should be released by SGSN */
1765 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1766 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1767 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1768 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1769 }
1770 var OCT1 cause_network_failure := int2oct(38, 1)
1771 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001772 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001773 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001774 setverdict(pass);
1775 }
1776 [] as_xid(apars);
1777 }
1778 setverdict(pass);
1779}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001780/* ATTACH + trigger Recovery procedure through EchoResp */
1781testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001782 var BSSGP_ConnHdlr vc_conn;
1783 g_use_echo := true
1784 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001785 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 +02001786 vc_conn.done;
1787 g_use_echo := false
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001788 f_cleanup();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001789}
1790
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001791private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1792 var Gtp1cUnitdata g_ud;
1793 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1794 var integer seq_nr := 23;
1795 var GtpPeer peer;
1796 /* first perform regular attach */
1797 f_TC_attach(id);
1798
1799 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1800 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1801 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1802 f_pdp_ctx_act(apars, true);
1803
1804 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1805/* received. */
1806 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1807
1808 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1809 would be great to have an active pdp context here before triggering
1810 Recovery, and making sure the the DEACT request is sent by the SGSN.
1811 */
1812
1813 /* Activate a pdp context against the GGSN, send incremented Recovery
1814 IE. This should trigger the recovery path, but still this specific
1815 CTX activation should work. */
1816 apars.exp_rej_cause := omit; /* default value for tests */
1817 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
1818 f_pdp_ctx_act(apars, true);
1819
1820 setverdict(pass);
1821}
1822/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1823testcase TC_attach_restart_ctr_create() runs on test_CT {
1824 var BSSGP_ConnHdlr vc_conn;
1825 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001826 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 +02001827 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001828 f_cleanup();
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001829}
1830
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001831/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
1832private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
1833 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1834 var integer seq_nr := 23;
1835 var GtpPeer peer;
1836 var integer i;
1837
1838 /* first perform regular attach */
1839 f_TC_attach(id);
1840 /* then activate PDP context */
1841 f_pdp_ctx_act(apars);
1842
Alexander Couzens0e510e62018-07-28 23:06:00 +02001843 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001844 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1845 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1846
1847 for (i := 0; i < 5; i := i+1) {
1848 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001849 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001850 [] as_xid(apars);
1851 }
1852 }
1853
1854 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
1855
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001856 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001857 setverdict(pass);
1858}
1859testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
1860 var BSSGP_ConnHdlr vc_conn;
1861 f_init();
1862 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001863 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 +02001864 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001865 f_cleanup();
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001866}
1867
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001868/* ATTACH + PDP CTX ACT dropped + retrans */
1869private function f_TC_attach_pdp_act_deact_gtp_retrans(charstring id) runs on BSSGP_ConnHdlr {
1870 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1871 var Gtp1cUnitdata g_ud_first, g_ud_second;
1872 /* first perform regular attach */
1873 f_TC_attach(id);
1874
1875 /* then activate PDP context on the Gb side */
1876 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
1877 apars.apn, apars.pco), 0);
1878
1879 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_first {}
1880 log("First createPDPContextRequest received, dropping & waiting for retransmission");
1881 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_second {
1882 if (g_ud_first != g_ud_second) {
1883 setverdict(fail, "Retransmitted GTP message createPDPContextRequest is different from original one!");
1884 mtc.stop;
1885 }
1886 f_process_gtp_ctx_act_req(apars, g_ud_second.gtpc);
1887 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
1888 GTP.send(ts_GTPC_CreatePdpResp(g_ud_second.peer, seq_nr,
1889 apars.sgsn_tei_c, apars.gtp_resp_cause,
1890 apars.ggsn_tei_c, apars.ggsn_tei_u,
1891 apars.nsapi,
1892 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1893 omit, omit));
1894 }
Harald Welte955aa942019-05-03 01:29:29 +02001895 BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT) {}
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001896
1897 /* Now the same with Deact */
1898 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, '00'O, false, omit), 0);
1899 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_first {}
1900 log("First deletePDPContextRequest received, dropping & waiting for retransmission");
1901 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_second {
1902 if (g_ud_first != g_ud_second) {
1903 setverdict(fail, "Retransmitted GTP message deletePDPContextRequest is different from original one!");
1904 mtc.stop;
1905 }
1906 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
1907 BSSGP[0].clear;
1908 GTP.send(ts_GTPC_DeletePdpResp(g_ud_second.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1909 }
1910 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001911 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001912 setverdict(pass);
1913 }
1914 [] as_xid(apars, 0);
1915 }
1916
1917 setverdict(pass);
1918}
1919testcase TC_attach_pdp_act_deact_gtp_retrans() runs on test_CT {
1920 var BSSGP_ConnHdlr vc_conn;
1921 f_init();
1922 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans), testcasename(), g_gb, 27);
1923 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001924 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001925}
1926
1927/* Test that SGSN GTP response retransmit queue works fine */
1928private function f_TC_attach_pdp_act_deact_gtp_retrans_resp(charstring id) runs on BSSGP_ConnHdlr {
1929 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1930 var integer seq_nr := 23;
1931 var Gtp1cUnitdata g_ud_first, g_ud_second;
1932 var template Gtp1cUnitdata g_delete_req;
1933 /* first perform regular attach + PDP context act */
1934 f_TC_attach(id);
1935 f_pdp_ctx_act(apars);
1936
1937 /* Now perform an MT DeleteCtxReq and emulate GGSN didn't receive response and sends a duplicated DeleteCtxReq */
1938 BSSGP[0].clear;
1939 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1940 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B);
1941 GTP.send(g_delete_req);
1942 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001943 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001944 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), 0);
1945 }
1946 [] as_xid(apars, 0);
1947 }
1948 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_first {
1949 if (g_ud_first.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != '80'O) {
1950 setverdict(fail, "Received deletePDPContextResponse cause is not 'Request accepted'");
1951 mtc.stop;
1952 }
1953 };
1954
1955 /* Send duplicate DeleteCtxReq */
1956 log("First deletePDPContextResponse received, dropping & retransmitting retransmission of deletePDPContextRequest");
1957 GTP.send(g_delete_req);
1958 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_second {
1959 if (g_ud_first != g_ud_second) {
1960 setverdict(fail, "Retransmitted GTP message deletePDPContextResponse is different from original one!");
1961 mtc.stop;
1962 }
1963 }
1964
1965 /* Let's send now a new DeleteCtxReq (increased seq_nr) to make sure it
1966 * is handled differently by SGSN (expect "non-existent" cause) */
1967 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr + 1, apars.sgsn_tei_c, apars.nsapi, '1'B);
1968 GTP.send(g_delete_req);
1969 /* Response with cause "non-existent" must be sent with TEID 0 according to specs */
1970 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, '00000000'O)) -> value g_ud_second {
1971 if (g_ud_second.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != 'C0'O) {
1972 setverdict(fail, "Received deletePDPContextResponse cause is not 'Non-existent'");
1973 mtc.stop;
1974 }
1975 }
1976
1977 setverdict(pass);
1978}
1979testcase TC_attach_pdp_act_deact_gtp_retrans_resp() runs on test_CT {
1980 var BSSGP_ConnHdlr vc_conn;
1981 f_init();
1982 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans_resp), testcasename(), g_gb, 28);
1983 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001984 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001985}
1986
Alexander Couzens5e307b42018-05-22 18:12:20 +02001987private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
1988 /* MS: perform regular attach */
1989 f_TC_attach(id);
1990
1991 /* HLR: cancel the location request */
1992 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
1993 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02001994
1995 /* ensure no Detach Request got received */
1996 timer T := 5.0;
1997 T.start;
1998 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001999 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(*, *, *)) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002000 T.stop;
2001 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02002002 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002003 }
2004 [] T.timeout {
2005 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02002006 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002007 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02002008 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002009 repeat;
2010 }
2011 }
2012}
2013
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002014/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
2015private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
2016 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2017
2018 /* first perform regular attach */
2019 f_TC_attach(id);
2020 /* then activate PDP context */
2021 f_pdp_ctx_act(apars);
2022 /* then transceive a downlink PDU */
2023 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
2024
2025 /* Send Error indication as response from upload PDU and expect deact towards MS */
2026 f_pdp_ctx_deact_mt(apars, true);
2027}
2028testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
2029 var BSSGP_ConnHdlr vc_conn;
2030 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002031 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 +02002032 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002033 f_cleanup();
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002034}
2035
Alexander Couzens5e307b42018-05-22 18:12:20 +02002036testcase TC_hlr_location_cancel_request_update() runs on test_CT {
2037 /* MS <-> SGSN: GMM Attach
2038 * HLR -> SGSN: Cancel Location Request
2039 * HLR <- SGSN: Cancel Location Ack
2040 */
2041 var BSSGP_ConnHdlr vc_conn;
2042 f_init();
2043 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002044 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02002045 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002046 f_cleanup();
Alexander Couzens5e307b42018-05-22 18:12:20 +02002047}
2048
2049
Alexander Couzensc87967a2018-05-22 16:09:54 +02002050private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
2051 /* MS: perform regular attach */
2052 f_TC_attach(id);
2053
2054 /* HLR: cancel the location request */
2055 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
2056 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
2057 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
2058
2059 /* MS: receive a Detach Request */
Harald Welte955aa942019-05-03 01:29:29 +02002060 BSSGP[0].receive(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002061 f_send_l3(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002062
2063 setverdict(pass);
2064}
2065
2066testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
2067 /* MS <-> SGSN: GMM Attach
2068 * HLR -> SGSN: Cancel Location Request
2069 * HLR <- SGSN: Cancel Location Ack
2070 * MS <- SGSN: Detach Request
2071 * SGSN-> MS: Detach Complete
2072 */
2073 var BSSGP_ConnHdlr vc_conn;
2074 f_init();
2075 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002076 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002077 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002078 f_cleanup();
Alexander Couzensc87967a2018-05-22 16:09:54 +02002079}
2080
2081
Alexander Couzens6c47f292018-05-22 17:09:49 +02002082private function f_hlr_location_cancel_request_unknown_subscriber(
2083 charstring id,
2084 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
2085
2086 /* HLR: cancel the location request */
2087 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
2088
2089 /* cause 2 = IMSI_UNKNOWN */
2090 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
2091
2092 setverdict(pass);
2093}
2094
2095private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002096 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002097}
2098
2099testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
2100 /* HLR -> SGSN: Cancel Location Request
2101 * HLR <- SGSN: Cancel Location Error
2102 */
2103
2104 var BSSGP_ConnHdlr vc_conn;
2105 f_init();
2106 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002107 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 +02002108 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002109 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002110}
2111
2112private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002113 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002114}
2115
2116testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
2117 /* HLR -> SGSN: Cancel Location Request
2118 * HLR <- SGSN: Cancel Location Error
2119 */
2120
2121 var BSSGP_ConnHdlr vc_conn;
2122 f_init();
2123 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002124 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 +02002125 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002126 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002127}
2128
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002129private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
2130 f_TC_attach(id);
2131 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2132}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002133
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002134testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
2135 /* MS <-> SGSN: Attach
2136 * MS -> SGSN: Detach Req (Power off)
2137 * VTY -> SGSN: Check if MS is NOT in subscriber cache
2138 */
2139 var BSSGP_ConnHdlr vc_conn;
2140 var integer id := 33;
2141 var charstring imsi := hex2str(f_gen_imsi(id));
2142
2143 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002144 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002145 vc_conn.done;
2146
2147 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002148 f_cleanup();
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002149}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002150
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002151/* Attempt an attach, but loose the Identification Request (IMEI) */
2152private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
2153 var integer count_req := 0;
2154 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
2155
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002156 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 +02002157
2158 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002159 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002160 /* break */
2161 }
Harald Welte955aa942019-05-03 01:29:29 +02002162 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002163 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002164 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002165 repeat;
2166 }
Harald Welte955aa942019-05-03 01:29:29 +02002167 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002168 /* ignore ID REQ IMEI */
2169 count_req := count_req + 1;
2170 repeat;
2171 }
2172 }
2173 if (count_req != 5) {
2174 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002175 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002176 }
2177 setverdict(pass);
2178}
2179
2180testcase TC_attach_no_imei_response() runs on test_CT {
2181 /* MS -> SGSN: Attach Request IMSI
2182 * MS <- SGSN: Identity Request IMSI (optional)
2183 * MS -> SGSN: Identity Response IMSI (optional)
2184 * MS <- SGSN: Identity Request IMEI
2185 * MS -x SGSN: no response
2186 * MS <- SGSN: re-send: Identity Request IMEI 4x
2187 * MS <- SGSN: Attach Reject
2188 */
2189 var BSSGP_ConnHdlr vc_conn;
2190 f_init();
2191 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002192 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 +02002193 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002194 f_cleanup();
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002195}
2196
Alexander Couzens53f20562018-06-12 16:24:12 +02002197/* Attempt an attach, but loose the Identification Request (IMSI) */
2198private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
2199 var integer count_req := 0;
2200 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
2201
2202 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
2203 g_pars.p_tmsi := 'c0000035'O;
2204
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002205 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 +02002206
2207 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002208 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002209 /* break */
2210 }
Harald Welte955aa942019-05-03 01:29:29 +02002211 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002212 /* ignore ID REQ IMSI */
2213 count_req := count_req + 1;
2214 repeat;
2215 }
Harald Welte955aa942019-05-03 01:29:29 +02002216 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002217 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002218 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02002219 repeat;
2220 }
2221 }
2222 if (count_req != 5) {
2223 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002224 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02002225 }
2226 setverdict(pass);
2227}
2228
2229testcase TC_attach_no_imsi_response() runs on test_CT {
2230 /* MS -> SGSN: Attach Request TMSI (unknown)
2231 * MS <- SGSN: Identity Request IMEI (optional)
2232 * MS -> SGSN: Identity Response IMEI (optional)
2233 * MS <- SGSN: Identity Request IMSI
2234 * MS -x SGSN: no response
2235 * MS <- SGSN: re-send: Identity Request IMSI 4x
2236 * MS <- SGSN: Attach Reject
2237 */
2238 var BSSGP_ConnHdlr vc_conn;
2239 f_init();
2240 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002241 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 +02002242 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002243 f_cleanup();
Alexander Couzens53f20562018-06-12 16:24:12 +02002244}
2245
Alexander Couzenscf818962018-06-05 18:00:00 +02002246private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
2247 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
2248}
2249
2250testcase TC_attach_check_subscriber_list() runs on test_CT {
2251 /* MS <-> SGSN: Attach
2252 * VTY -> SGSN: Check if MS is in subscriber cache
2253 */
2254 var BSSGP_ConnHdlr vc_conn;
2255 var integer id := 34;
2256 var charstring imsi := hex2str(f_gen_imsi(id));
2257
2258 f_init();
2259 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002260 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02002261 vc_conn.done;
2262
2263 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
2264 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002265 f_cleanup();
Alexander Couzenscf818962018-06-05 18:00:00 +02002266}
2267
Alexander Couzensf9858652018-06-07 16:14:53 +02002268private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
2269 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002270 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensf9858652018-06-07 16:14:53 +02002271
2272 /* unregister the old IMSI */
2273 f_bssgp_client_unregister(g_pars.imsi);
2274 /* Simulate a foreign IMSI */
Alexander Couzens03d12242018-08-07 16:13:52 +02002275 g_pars.imsi := '001010123456700'H;
Alexander Couzens51114d12018-07-31 18:41:56 +02002276 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Alexander Couzensf9858652018-06-07 16:14:53 +02002277
2278 /* there is no auth */
2279 g_pars.net.expect_auth := false;
2280
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002281 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02002282 f_gmm_auth();
2283 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002284 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzensf9858652018-06-07 16:14:53 +02002285 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02002286 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02002287 }
Harald Welte955aa942019-05-03 01:29:29 +02002288 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) -> value l3_mt {
2289 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002290 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02002291 setverdict(pass);
2292 }
2293 }
2294}
Alexander Couzens03d12242018-08-07 16:13:52 +02002295
2296private function f_TC_attach_closed_add_vty(charstring id) runs on BSSGP_ConnHdlr {
2297
2298 f_TC_attach_closed_foreign(id);
2299 f_TC_attach_closed_imsi_added(id);
2300
2301}
2302
2303
Alexander Couzensf9858652018-06-07 16:14:53 +02002304testcase TC_attach_closed_add_vty() runs on test_CT {
2305 /* VTY-> SGSN: policy close
2306 * MS -> SGSN: Attach Request
2307 * MS <- SGSN: Identity Request IMSI
2308 * MS -> SGSN: Identity Response IMSI
2309 * MS <- SGSN: Attach Reject
2310 * VTY-> SGSN: policy imsi-acl add IMSI
2311 * MS -> SGSN: Attach Request
2312 * MS <- SGSN: Identity Request IMSI
2313 * MS -> SGSN: Identity Response IMSI
2314 * MS <- SGSN: Identity Request IMEI
2315 * MS -> SGSN: Identity Response IMEI
2316 * MS <- SGSN: Attach Accept
2317 */
2318 var BSSGP_ConnHdlr vc_conn;
2319 f_init();
2320 f_sleep(1.0);
2321 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
2322 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
Alexander Couzens03d12242018-08-07 16:13:52 +02002323 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456700");
2324 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456700");
Alexander Couzensf9858652018-06-07 16:14:53 +02002325 /* test with foreign IMSI: Must Reject */
Alexander Couzens03d12242018-08-07 16:13:52 +02002326 vc_conn := f_start_handler(refers(f_TC_attach_closed_add_vty), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02002327 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002328 f_cleanup();
Alexander Couzensf9858652018-06-07 16:14:53 +02002329}
2330
Alexander Couzens0085bd72018-06-12 19:08:44 +02002331/* Attempt an attach, but never answer a Attach Complete */
2332private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
2333 var integer count_req := 0;
2334
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002335 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 +02002336 f_gmm_auth();
Pau Espin Pedrol4b290a22019-09-10 19:49:41 +02002337 /* Expect SGSN to perform LU with HLR */
2338 f_gmm_gsup_lu_isd();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002339
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002340 timer T := 10.0;
2341 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002342 alt {
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002343 [] T.timeout {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002344 /* break */
2345 }
Harald Welte955aa942019-05-03 01:29:29 +02002346 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002347 /* ignore */
2348 count_req := count_req + 1;
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002349 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002350 repeat;
2351 }
2352 }
2353 if (count_req != 5) {
2354 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02002355 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002356 }
2357 setverdict(pass);
2358}
2359
2360testcase TC_attach_check_complete_resend() runs on test_CT {
2361 /* MS -> SGSN: Attach Request IMSI
2362 * MS <- SGSN: Identity Request *
2363 * MS -> SGSN: Identity Response *
2364 * MS <- SGSN: Attach Complete 5x
2365 */
2366 var BSSGP_ConnHdlr vc_conn;
2367 f_init();
2368 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002369 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 +02002370 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002371 f_cleanup();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002372}
2373
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002374friend function f_routing_area_update(RoutingAreaIdentificationV ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02002375 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002376 var PDU_DTAP_PS_MT mt;
2377 var template OCT4 p_tmsi := omit;
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002378
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002379 if (is_iu(ran_index)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002380 p_tmsi := g_pars.p_tmsi;
2381 }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002382 /* then send RAU */
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002383 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 +02002384 alt {
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002385 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_ACCEPT) -> value l3_mt {
2386 f_process_rau_accept(l3_mt.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2387 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002388 setverdict(pass);
2389 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002390 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_ACCEPT)) -> value mt {
2391 f_process_rau_accept(mt.dtap.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2392 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5d56f522019-09-03 12:36:18 +02002393 setverdict(pass);
2394 }
2395
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002396 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_REJECT) {
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002397 setverdict(fail, "Unexpected RAU Reject");
2398 mtc.stop;
2399 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002400 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_REJECT)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002401 setverdict(fail, "Unexpected RAU Reject");
2402 mtc.stop;
2403 }
2404
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002405 [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 +02002406 key_sts := ?)) {
2407 var IntegrityProtectionAlgorithm uia_chosen := 0; /* 0 = standard_UMTS_integrity_algorithm_UIA1 */
2408 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
Alexander Couzensed61ae82019-09-15 23:18:08 +02002409 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)))
Alexander Couzens5d56f522019-09-03 12:36:18 +02002410 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002411 [is_gb(ran_index)] BSSGP[ran_index].receive { repeat; }
2412 [is_iu(ran_index)] BSSAP.receive { repeat; }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002413 }
2414}
2415
Alexander Couzensbfda9212018-07-31 03:17:33 +02002416private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbfda9212018-07-31 03:17:33 +02002417 /* first perform regular attach */
2418 f_TC_attach(id);
2419
2420 /* then send RAU */
2421 f_routing_area_update(g_pars.ra);
2422
2423 /* do another RAU */
2424 f_routing_area_update(g_pars.ra);
2425
2426 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2427}
2428
2429testcase TC_attach_rau_a_a() runs on test_CT {
2430 /* MS <-> SGSN: Successful Attach
2431 * MS -> SGSN: Routing Area Update Request
2432 * MS <- SGSN: Routing Area Update Accept
2433 * MS -> SGSN: Routing Area Update Request
2434 * MS <- SGSN: Routing Area Update Accept
2435 * MS -> SGSN: Detach (PowerOff)
2436 */
2437 var BSSGP_ConnHdlr vc_conn;
2438 f_init();
2439 f_sleep(1.0);
2440 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
2441 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002442 f_cleanup();
Alexander Couzensbfda9212018-07-31 03:17:33 +02002443}
2444
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002445private function f_TC_attach_rau_a_b(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002446 f_TC_attach(id);
2447
2448 log("attach complete sending rau");
2449 f_routing_area_update(g_pars.ra, 0);
2450
2451 log("rau complete unregistering");
2452 f_bssgp_client_unregister(g_pars.imsi);
2453 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[1], BSSGP_PROC[1]);
2454
2455 log("sending second RAU via different RA");
2456 f_routing_area_update(f_cellid_to_RAI(g_pars.bssgp_cell_id[1]), 1);
2457
2458 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true, 1);
2459}
2460
2461testcase TC_attach_rau_a_b() runs on test_CT {
2462 /* MS <-> SGSN: Successful Attach
2463 * MS -> SGSN: Routing Area _a_ Update Request
2464 * MS <- SGSN: Routing Area _a_ Update Accept
2465 * MS -> SGSN: Routing Area _b_ Update Request
2466 * MS <- SGSN: Routing Area _b_ Update Accept
2467 * MS -> SGSN: Detach (PowerOff)
2468 */
2469 var BSSGP_ConnHdlr vc_conn;
2470 f_init();
2471 f_sleep(1.0);
2472 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_b), testcasename(), g_gb, 38);
2473 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002474 f_cleanup();
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002475}
2476
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002477private function f_TC_attach_gmm_attach_req_while_gmm_attach(charstring id) runs on BSSGP_ConnHdlr {
2478 var integer count_req := 0;
2479 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
2480 var RoutingAreaIdentificationV rand_rai := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002481 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002482
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002483 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002484
2485 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002486 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002487 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2488 mtc.stop;
2489 }
Harald Welte955aa942019-05-03 01:29:29 +02002490 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002491 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002492 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002493 repeat;
2494 }
Harald Welte955aa942019-05-03 01:29:29 +02002495 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002496 /* send out a second GMM_Attach Request.
2497 * If the SGSN follows the rules, this 2nd ATTACH REQ should be ignored, because
2498 * of the same content */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002499 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002500 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002501 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002502 }
2503 }
2504 f_sleep(1.0);
2505
2506 /* we've sent already a IMEI answer, we should NOT asked again for IMEI */
2507 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002508 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002509 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002510 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002511 repeat;
2512 }
Harald Welte955aa942019-05-03 01:29:29 +02002513 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002514 setverdict(fail, "Unexpected GMM ID REQ (IMEI).");
2515 mtc.stop;
2516 }
Harald Welte955aa942019-05-03 01:29:29 +02002517 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002518 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2519 mtc.stop;
2520 }
Harald Welte955aa942019-05-03 01:29:29 +02002521 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2522 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002523 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002524 setverdict(pass);
2525 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
2526 }
2527 }
2528}
2529
2530testcase TC_attach_gmm_attach_req_while_gmm_attach() runs on test_CT {
2531 /* Testing if the SGSN ignore Attach Request with the exact same content */
2532 /* MS -> SGSN: Attach Request IMSI
2533 * MS <- SGSN: Identity Request IMSI (optional)
2534 * MS -> SGSN: Identity Response IMSI (optional)
2535 * MS <- SGSN: Identity Request IMEI
2536 * MS -> SGSN: Attach Request (2nd)
2537 * MS <- SGSN: Identity Response IMEI
2538 * MS <- SGSN: Attach Accept
2539 * MS -> SGSN: Attach Complete
2540 */
2541 var BSSGP_ConnHdlr vc_conn;
2542 f_init();
2543 f_sleep(1.0);
2544 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
2545 vc_conn := f_start_handler(refers(f_TC_attach_gmm_attach_req_while_gmm_attach), testcasename(), g_gb, 39);
2546 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002547 f_cleanup();
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002548}
2549
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002550private function f_TC_attach_usim_resync(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002551 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2552
2553 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2554
2555 /* send Attach Request */
2556 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2557 * 3G auth vectors */
2558 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2559 /* The thing is, if the solSACapability is 'omit', then the
2560 * revisionLevelIndicatior is at the wrong place! */
2561 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002562 f_send_l3(attach_req);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002563
2564 /* do the auth */
2565 var PDU_L3_MS_SGSN l3_mo;
2566 var PDU_L3_SGSN_MS l3_mt;
2567 var default di := activate(as_mm_identity());
2568
2569 var GSUP_IE auth_tuple;
2570 var template AuthenticationParameterAUTNTLV autn;
2571
2572 g_pars.vec := f_gen_auth_vec_3g();
2573 autn := {
2574 elementIdentifier := '28'O,
2575 lengthIndicator := lengthof(g_pars.vec.autn),
2576 autnValue := g_pars.vec.autn
2577 };
2578 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2579 g_pars.vec.sres,
2580 g_pars.vec.kc,
2581 g_pars.vec.ik,
2582 g_pars.vec.ck,
2583 g_pars.vec.autn,
2584 g_pars.vec.res));
2585 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2586 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2587 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2588
2589 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2590 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002591 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002592
2593 /* send the gmm auth failure with resync IE */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002594 f_send_l3(ts_GMM_AUTH_FAIL_UMTS_AKA_RESYNC(g_pars.vec.auts));
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002595
2596 /* wait for the GSUP resync request */
2597 GSUP.receive(tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
2598 g_pars.imsi,
2599 g_pars.vec.auts,
2600 g_pars.vec.rand));
2601
2602 /* generate new key material */
2603 g_pars.vec := f_gen_auth_vec_3g();
2604 autn := {
2605 elementIdentifier := '28'O,
2606 lengthIndicator := lengthof(g_pars.vec.autn),
2607 autnValue := g_pars.vec.autn
2608 };
2609
2610 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2611 g_pars.vec.sres,
2612 g_pars.vec.kc,
2613 g_pars.vec.ik,
2614 g_pars.vec.ck,
2615 g_pars.vec.autn,
2616 g_pars.vec.res));
2617 /* send new key material */
2618 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2619
2620 /* wait for the new Auth Request */
2621 auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2622 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002623 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002624 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
2625 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2626 auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2627 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
2628 valueField := substr(g_pars.vec.res, 0, 4)
2629 };
2630 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
2631 elementIdentifier := '21'O,
2632 lengthIndicator := lengthof(g_pars.vec.res) - 4,
2633 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
2634 };
2635 l3_mo := valueof(auth_ciph_resp);
2636 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
2637 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
2638 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
2639 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
2640 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002641 f_send_l3(l3_mo);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002642 deactivate(di);
2643
2644 /* Expect SGSN to perform LU with HLR */
2645 f_gmm_gsup_lu_isd();
2646
Harald Welte955aa942019-05-03 01:29:29 +02002647 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2648 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002649 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002650 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002651 setverdict(pass);
2652}
2653
2654testcase TC_attach_usim_resync() runs on test_CT {
2655 /* MS -> SGSN: Attach Request
2656 * MS <- SGSN: Identity Request IMSI
2657 * MS -> SGSN: Identity Response IMSI
2658 * MS <- SGSN: Identity Request IMEI
2659 * MS -> SGSN: Identity Response IMEI
2660 * HLR<- SGSN: SAI Request
2661 * HLR-> SGSN: SAI Response
2662 * MS <- SGSN: Auth Request
2663 * MS -> SGSN: Auth Failure (with AUTS)
2664 * HLR<- SGSN: SAI Request (with AUTS & RAND)
2665 * HLR-> SGSN: SAI Response (new key material)
2666 * MS <- SGSN: Auth Request (new key material)
2667 * MS -> SGSN: Auth Response
2668 * MS <- SGSN: Attach Accept
2669 * MS -> SGSN: Attach Complete
2670 */
2671 var BSSGP_ConnHdlr vc_conn;
2672 f_init();
2673 f_sleep(1.0);
2674 vc_conn := f_start_handler(refers(f_TC_attach_usim_resync), testcasename(), g_gb, 40);
2675 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002676 f_cleanup();
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002677}
2678
Harald Weltea05b8072019-04-23 22:35:05 +02002679
2680/* Send LLC NULL to see if the SGSN survives it (OS#3952) */
2681private function f_TC_llc_null(charstring id) runs on BSSGP_ConnHdlr {
2682 f_gmm_attach(false, false);
2683 f_sleep(1.0);
2684 f_send_llc(ts_LLC_NULL('0'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
2685 /* try to detach to check if SGSN is still alive */
2686 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2687}
2688testcase TC_llc_null() runs on test_CT {
2689 var BSSGP_ConnHdlr vc_conn;
2690 f_init();
2691 f_sleep(1.0);
2692 vc_conn := f_start_handler(refers(f_TC_llc_null), testcasename(), g_gb, 41);
2693 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002694 f_cleanup();
Harald Weltea05b8072019-04-23 22:35:05 +02002695}
2696
Harald Welte645a1512019-04-23 23:18:23 +02002697/* Send LLC SABM to see if the SGSN rejects it properly with DM */
2698private function f_TC_llc_sabm_dm_llgmm(charstring id) runs on BSSGP_ConnHdlr {
2699 f_gmm_attach(false, false);
2700 f_sleep(1.0);
2701 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02002702 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LLGMM, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02002703 setverdict(pass);
2704}
2705testcase TC_llc_sabm_dm_llgmm() runs on test_CT {
2706 var BSSGP_ConnHdlr vc_conn;
2707 f_init();
2708 f_sleep(1.0);
2709 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_llgmm), testcasename(), g_gb, 42);
2710 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002711 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02002712}
2713
2714/* Send LLC SABM to see if the SGSN rejects it properly with DM */
2715private function f_TC_llc_sabm_dm_ll5(charstring id) runs on BSSGP_ConnHdlr {
2716 f_gmm_attach(false, false);
2717 f_sleep(1.0);
2718 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LL5, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02002719 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LL5, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02002720 setverdict(pass);
2721}
2722testcase TC_llc_sabm_dm_ll5() runs on test_CT {
2723 var BSSGP_ConnHdlr vc_conn;
2724 f_init();
2725 f_sleep(1.0);
2726 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_ll5), testcasename(), g_gb, 43);
2727 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002728 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02002729}
2730
Harald Welte2aaac1b2019-05-02 10:02:53 +02002731/* test XID handshake with empty L3 info: expect empty return (some phones require that, OS#3426 */
2732private function f_TC_xid_empty_l3(charstring id) runs on BSSGP_ConnHdlr {
2733 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2734 var template (value) XID_Information xid;
2735 var template XID_Information xid_rx;
2736
2737 /* first perform regular attach */
2738 f_TC_attach(id);
2739 /* then activate PDP context */
2740 f_pdp_ctx_act(apars);
2741
2742 /* start MO XID */
2743 xid := { ts_XID_L3(''O) };
2744 xid_rx := { tr_XID_L3(''O) };
2745 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
2746 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002747 [] BSSGP[0].receive(tr_LLC_XID(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02002748 [] as_xid(apars);
2749 }
2750 setverdict(pass);
2751}
2752testcase TC_xid_empty_l3() runs on test_CT {
2753 var BSSGP_ConnHdlr vc_conn;
2754 f_init();
2755 f_sleep(1.0);
2756 vc_conn := f_start_handler(refers(f_TC_xid_empty_l3), testcasename(), g_gb, 44);
2757 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002758 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02002759}
2760
2761private function f_TC_xid_n201u(charstring id) runs on BSSGP_ConnHdlr {
2762 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2763 var template (value) XID_Information xid;
2764 var template XID_Information xid_rx;
2765
2766 /* first perform regular attach */
2767 f_TC_attach(id);
2768 /* then activate PDP context */
2769 f_pdp_ctx_act(apars);
2770
2771 /* start MO XID */
2772 xid := { ts_XID_N201U(1234) };
2773 xid_rx := { tr_XID_N201U(1234) };
2774 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
2775 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002776 [] BSSGP[0].receive(tr_LLC_XID_MT_RSP(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02002777 [] as_xid(apars);
2778 }
2779 setverdict(pass);
2780}
2781testcase TC_xid_n201u() runs on test_CT {
2782 var BSSGP_ConnHdlr vc_conn;
2783 f_init();
2784 f_sleep(1.0);
2785 vc_conn := f_start_handler(refers(f_TC_xid_n201u), testcasename(), g_gb, 45);
2786 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002787 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02002788}
2789
Alexander Couzens6bee0872019-05-11 01:48:50 +02002790private function f_TC_attach_pdp_act_gmm_detach(charstring id) runs on BSSGP_ConnHdlr {
2791 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2792
2793 /* first perform regular attach */
2794 f_TC_attach(id);
2795 /* then activate PDP context */
2796 f_pdp_ctx_act(apars);
2797 /* do a normal detach */
2798 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
2799}
2800
2801testcase TC_attach_pdp_act_gmm_detach() runs on test_CT {
2802 /* MS -> SGSN: Attach Request
2803 * MS <-> SGSN: [..]
2804 * MS -> SGSN: Attach Complete
2805 * MS -> SGSN: PDP Activate Request
2806 * MS <- SGSN: PDP Activate Accept
2807 * MS -> SGSN: GMM Detach Request
2808 * MS <- SGSN: GMM Detach Accept
2809 */
2810 var BSSGP_ConnHdlr vc_conn;
2811 f_init();
2812 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_gmm_detach), testcasename(), g_gb, 26);
2813 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002814 f_cleanup();
Alexander Couzens6bee0872019-05-11 01:48:50 +02002815}
Harald Welte645a1512019-04-23 23:18:23 +02002816
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01002817private function f_TC_attach_req_id_req_ra_update(charstring id) runs on BSSGP_ConnHdlr {
2818 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2819 var RoutingAreaIdentificationV new_ra := f_random_RAI();
2820 while (old_ra == new_ra) { new_ra := f_random_RAI(); };
2821 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2822 var PDU_L3_SGSN_MS l3_mt;
2823
2824 f_send_l3(attach_req, 0);
2825
2826 BSSGP[0].receive(tr_GMM_ID_REQ(?));
2827
2828 f_send_l3(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, new_ra, false, omit, omit));
2829 alt {
2830 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) {
2831 setverdict(pass);
2832 }
2833 [] BSSGP[0].receive { repeat; }
2834 }
2835}
2836
2837/* This test triggers crash in osmo-sgsn before osmo-sgsn.git I64fa5cf1b427d3abb99e553e584897261a827ce6.
2838 * See OS#3957 and OS#4245 for more information.
2839 */
2840testcase TC_attach_req_id_req_ra_update() runs on test_CT {
2841 /*
2842 * MS --> SGSN: Attach Req (TMSI, RAI=901-70-356-101)
2843 * MS <-- SGSN: Identity Request (IMEI)
2844 * MS --> SGSN: RA Updating (RAI=901-70-2758-208)
2845 */
2846 var BSSGP_ConnHdlr vc_conn;
2847 f_init();
2848 vc_conn := f_start_handler(refers(f_TC_attach_req_id_req_ra_update), testcasename(), g_gb, 47);
2849 vc_conn.done;
2850 f_cleanup();
2851}
2852
Harald Welte5ac31492018-02-15 20:39:13 +01002853control {
Harald Welte5b7c8122018-02-16 21:48:17 +01002854 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01002855 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02002856 execute( TC_attach_umts_aka_umts_res() );
2857 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01002858 execute( TC_attach_auth_id_timeout() );
2859 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01002860 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01002861 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01002862 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01002863 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01002864 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01002865 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002866 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02002867 execute( TC_attach_no_imsi_response() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02002868 execute( TC_attach_closed_add_vty(), 20.0 );
2869 execute( TC_attach_check_subscriber_list(), 20.0 );
2870 execute( TC_attach_detach_check_subscriber_list(), 20.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02002871 execute( TC_attach_check_complete_resend() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02002872 execute( TC_hlr_location_cancel_request_update(), 20.0 );
2873 execute( TC_hlr_location_cancel_request_withdraw(), 20.0 );
2874 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 20.0 );
2875 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 20.0 );
Harald Welte04683d02018-02-16 22:43:45 +01002876 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01002877 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02002878 execute( TC_attach_rau_a_a() );
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002879 execute( TC_attach_rau_a_b() );
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002880 execute( TC_attach_usim_resync() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01002881 execute( TC_detach_unknown_nopoweroff() );
2882 execute( TC_detach_unknown_poweroff() );
2883 execute( TC_detach_nopoweroff() );
2884 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01002885 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01002886 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01002887 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01002888 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01002889 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01002890 execute( TC_attach_pdp_act_user_deact_mt() );
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02002891 execute( TC_attach_pdp_act_deact_dup() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02002892 execute( TC_attach_second_attempt() );
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02002893 execute( TC_attach_echo_timeout() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002894 execute( TC_attach_restart_ctr_echo() );
2895 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002896 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002897 execute( TC_attach_pdp_act_deact_gtp_retrans() );
2898 execute( TC_attach_pdp_act_deact_gtp_retrans_resp() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002899 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Alexander Couzens6bee0872019-05-11 01:48:50 +02002900 execute( TC_attach_pdp_act_gmm_detach() );
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002901 execute( TC_attach_gmm_attach_req_while_gmm_attach() );
Harald Weltea05b8072019-04-23 22:35:05 +02002902
Harald Welte2aaac1b2019-05-02 10:02:53 +02002903 execute( TC_xid_empty_l3() );
2904 execute( TC_xid_n201u() );
2905
Harald Weltea05b8072019-04-23 22:35:05 +02002906 execute( TC_llc_null() );
Harald Welte645a1512019-04-23 23:18:23 +02002907 execute( TC_llc_sabm_dm_llgmm() );
2908 execute( TC_llc_sabm_dm_ll5() );
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01002909
2910 /* At the end, may crash osmo-sgsn, see OS#3957, OS#4245 */
2911 execute( TC_attach_req_id_req_ra_update() );
Harald Welte5ac31492018-02-15 20:39:13 +01002912}
Harald Welte96a33b02018-02-04 10:36:22 +01002913
2914
2915
2916}