blob: 52380688517b1b970fec1dfe4b57731754a18219 [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;
Alexander Couzens8e1dfd02020-09-07 04:26:20 +020015friend module SGSN_Tests_NS;
Harald Welte900d01a2019-08-13 13:27:51 +020016
Harald Welte96a33b02018-02-04 10:36:22 +010017import from General_Types all;
18import from Osmocom_Types all;
Harald Welte557c9f82020-09-12 21:30:17 +020019import from GSM_Types all;
Harald Welte37692d82018-02-18 15:21:34 +010020import from Native_Functions all;
Harald Welte96a33b02018-02-04 10:36:22 +010021import from NS_Types all;
22import from NS_Emulation all;
23import from BSSGP_Types all;
24import from BSSGP_Emulation all;
Harald Welte5ac31492018-02-15 20:39:13 +010025import from Osmocom_Gb_Types all;
Harald Welte26fbb6e2019-04-14 17:32:46 +020026import from SCCPasp_Types all;
Harald Welte5ac31492018-02-15 20:39:13 +010027
28import from MobileL3_CommonIE_Types all;
29import from MobileL3_GMM_SM_Types all;
30import from MobileL3_Types all;
31import from L3_Templates all;
32import from L3_Common all;
33
34import from GSUP_Emulation all;
35import from GSUP_Types all;
36import from IPA_Emulation all;
37
Harald Welte26fbb6e2019-04-14 17:32:46 +020038import from RAN_Adapter all;
39import from RAN_Emulation all;
40import from RANAP_Templates all;
41import from RANAP_PDU_Descriptions all;
42import from RANAP_IEs all;
43
Harald Welteeded9ad2018-02-17 20:57:34 +010044import from GTP_Emulation all;
45import from GTP_Templates all;
46import from GTP_CodecPort all;
47import from GTPC_Types all;
48import from GTPU_Types all;
49
Harald Weltea2526a82018-02-18 19:03:36 +010050import from LLC_Types all;
51import from LLC_Templates all;
52
53import from SNDCP_Types all;
54
Harald Weltebd194722018-02-16 22:11:08 +010055import from TELNETasp_PortType all;
56import from Osmocom_VTY_Functions all;
57
Neels Hofmeyr8df7d152018-03-14 19:03:28 +010058import from GSM_RR_Types all;
59
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020060import from MobileL3_MM_Types all;
61
Harald Welteeded9ad2018-02-17 20:57:34 +010062
Harald Welte5ac31492018-02-15 20:39:13 +010063modulepar {
64 /* IP/port on which we run our internal GSUP/HLR emulation */
65 charstring mp_hlr_ip := "127.0.0.1";
66 integer mp_hlr_port := 4222;
Pau Espin Pedrol7bac69f2021-05-04 15:53:06 +020067 charstring mp_ggsn_ip := "127.0.0.103";
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +020068 integer mp_echo_interval := 5; /* in seconds. Only used in test enabling g_use_echo */
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +020069 charstring mp_sgsn_gtp_ip := "127.0.0.10";
Alexander Couzens2c12b242018-07-31 00:30:11 +020070
Alexander Couzensf3c1b412018-08-24 00:42:51 +020071 NSConfigurations mp_nsconfig := {
72 {
Harald Welte5e514fa2018-07-05 00:01:45 +020073 nsei := 96,
74 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +010075 handle_sns := false,
76 nsvc := {
77 {
78 provider := {
79 ip := {
80 address_family := AF_INET,
81 local_udp_port := 21010,
82 local_ip := "127.0.0.1",
83 remote_udp_port := 23000,
Harald Weltebe7afce2021-01-17 22:04:36 +010084 remote_ip := "127.0.0.1",
85 data_weight := 1,
86 signalling_weight := 1
Harald Welte90f19742020-11-06 19:34:40 +010087 }
88 },
89 nsvci := 97
90 }
91 }
Alexander Couzensf3c1b412018-08-24 00:42:51 +020092 },
93 {
Harald Welte5e514fa2018-07-05 00:01:45 +020094 nsei := 97,
95 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +010096 handle_sns := false,
97 nsvc := {
98 {
99 provider := {
100 ip := {
101 address_family := AF_INET,
102 local_udp_port := 21011,
103 local_ip := "127.0.0.1",
104 remote_udp_port := 23000,
Harald Weltebe7afce2021-01-17 22:04:36 +0100105 remote_ip := "127.0.0.1",
106 data_weight := 1,
107 signalling_weight := 1
Harald Welte90f19742020-11-06 19:34:40 +0100108 }
109 },
110 nsvci := 98
111 }
112 }
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200113 },
114 {
Harald Welte5e514fa2018-07-05 00:01:45 +0200115 nsei := 98,
116 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +0100117 handle_sns := false,
118 nsvc := {
119 {
120 provider := {
121 ip := {
122 address_family := AF_INET,
123 local_udp_port := 21012,
124 local_ip := "127.0.0.1",
125 remote_udp_port := 23000,
Harald Weltebe7afce2021-01-17 22:04:36 +0100126 remote_ip := "127.0.0.1",
127 data_weight := 1,
128 signalling_weight := 1
Harald Welte90f19742020-11-06 19:34:40 +0100129 }
130 },
131 nsvci := 99
132 }
133 }
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200134 }
Alexander Couzens2c12b242018-07-31 00:30:11 +0200135 };
Harald Welte26fbb6e2019-04-14 17:32:46 +0200136
137 RAN_Configurations mp_ranap_cfg := {
138 {
139 transport := RANAP_TRANSPORT_IuCS,
140 sccp_service_type := "mtp3_itu",
141 sctp_addr := { 23908, "127.0.0.1", 2905, "127.0.0.1" },
142 own_pc := 195,
143 own_ssn := 142,
144 peer_pc := 188, /* 0.23.4 */
145 peer_ssn := 142,
146 sio := '83'O,
147 rctx := 2
148 }
149 }
Harald Welte5ac31492018-02-15 20:39:13 +0100150};
151
Harald Welte5339b2e2020-10-04 22:52:56 +0200152const integer NUM_BVC_PER_NSE := 1;
Harald Welte5ac31492018-02-15 20:39:13 +0100153type record GbInstance {
154 NS_CT vc_NS,
155 BSSGP_CT vc_BSSGP,
Harald Welte5339b2e2020-10-04 22:52:56 +0200156 BSSGP_BVC_CT vc_BSSGP_BVC[NUM_BVC_PER_NSE],
Harald Welte5ac31492018-02-15 20:39:13 +0100157 BssgpConfig cfg
158};
Harald Welte96a33b02018-02-04 10:36:22 +0100159
Harald Welte2fa771f2019-05-02 20:13:53 +0200160const integer NUM_GB := 3;
161type record length(NUM_GB) of GbInstance GbInstances;
162type record length(NUM_GB) of NSConfiguration NSConfigurations;
163type record length(NUM_GB) of BssgpCellId BssgpCellIds;
Alexander Couzens51114d12018-07-31 18:41:56 +0200164
Harald Welte26fbb6e2019-04-14 17:32:46 +0200165const integer NUM_RNC := 1;
166type record of RAN_Configuration RAN_Configurations;
167
Harald Welte96a33b02018-02-04 10:36:22 +0100168type component test_CT {
Alexander Couzens51114d12018-07-31 18:41:56 +0200169 var GbInstances g_gb;
Harald Welte26fbb6e2019-04-14 17:32:46 +0200170 var RAN_Adapter g_ranap[NUM_RNC];
Alexander Couzens1552e792019-07-23 20:38:39 +0200171 var boolean g_ranap_enable := false;
Harald Welte96a33b02018-02-04 10:36:22 +0100172
Harald Welte5ac31492018-02-15 20:39:13 +0100173 var GSUP_Emulation_CT vc_GSUP;
174 var IPA_Emulation_CT vc_GSUP_IPA;
175 /* only to get events from IPA underneath GSUP */
176 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +0100177
Harald Welte5339b2e2020-10-04 22:52:56 +0200178 /* only needed at start to get the per-BVC references */
179 port BSSGP_CT_PROC_PT PROC;
180
Philipp Maier7df55e02020-12-14 23:46:04 +0100181 /* used by RIM related test */
182 port BSSGP_PT RIM[NUM_GB];
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +0200183 port GTPEM_PT GTPC;
Philipp Maier7df55e02020-12-14 23:46:04 +0100184
Harald Welteeded9ad2018-02-17 20:57:34 +0100185 var GTP_Emulation_CT vc_GTP;
186
Harald Weltebd194722018-02-16 22:11:08 +0100187 port TELNETasp_PT SGSNVTY;
188
Harald Welte96a33b02018-02-04 10:36:22 +0100189 var boolean g_initialized := false;
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200190 var boolean g_use_echo := false;
Harald Welte96a33b02018-02-04 10:36:22 +0100191};
192
Harald Welte26fbb6e2019-04-14 17:32:46 +0200193type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr, RAN_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100194 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +0100195 timer g_Tguard;
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200196 var LLC_Entities llc;
Harald Welte5ac31492018-02-15 20:39:13 +0100197}
198
199type record SGSN_ConnHdlrNetworkPars {
200 boolean expect_ptmsi,
201 boolean expect_auth,
202 boolean expect_ciph
203};
204
205type record BSSGP_ConnHdlrPars {
206 /* IMEI of the simulated ME */
207 hexstring imei,
Alexander Couzens8f0fb002018-05-02 19:30:55 +0200208 /* IMSI of the simulated MS */
Harald Welte5ac31492018-02-15 20:39:13 +0100209 hexstring imsi,
210 /* MSISDN of the simulated MS (probably unused) */
211 hexstring msisdn,
212 /* P-TMSI allocated to the simulated MS */
213 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +0100214 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100215 /* TLLI of the simulated MS */
216 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +0100217 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100218 RoutingAreaIdentificationV ra optional,
Alexander Couzens51114d12018-07-31 18:41:56 +0200219 BssgpCellIds bssgp_cell_id,
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200220 /* Tracks the RNC state. If true next L3 message will be sent with InitiualUe */
221 boolean rnc_send_initial_ue,
Harald Welte5ac31492018-02-15 20:39:13 +0100222 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +0100223 SGSN_ConnHdlrNetworkPars net,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200224 float t_guard,
225 /* only in IuPS / RANAP case */
Alexander Couzens1552e792019-07-23 20:38:39 +0200226 SCCP_PAR_Address sccp_addr_local optional,
227 SCCP_PAR_Address sccp_addr_peer optional
Harald Welte5ac31492018-02-15 20:39:13 +0100228};
229
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +0200230/* Passed in RAN-INFO message from emulated neighbor using RIM */
231const octetstring si1_default := '198fb100000000000000000000000000007900002b'O;
232const octetstring si3_default := '1b753000f110236ec9033c2747407900003c0b2b2b'O;
233const octetstring si13_default := '009000185a6fc9e08410ab2b2b2b2b2b2b2b2b2b2b'O;
234const octetstring si_default := si1_default & si3_default & si13_default;
235
Alexander Couzens89508702018-07-31 04:16:10 +0200236private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200237 /* mcc_mnc is encoded as of 24.008 10.5.5.15 */
Alexander Couzens89508702018-07-31 04:16:10 +0200238 var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;
239
240 var RoutingAreaIdentificationV ret := {
241 mccDigit1 := mcc_mnc[0],
242 mccDigit2 := mcc_mnc[1],
243 mccDigit3 := mcc_mnc[2],
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200244 mncDigit3 := mcc_mnc[3],
245 mncDigit1 := mcc_mnc[4],
246 mncDigit2 := mcc_mnc[5],
Pau Espin Pedroldeaaa902021-02-12 18:41:04 +0100247 lac := int2oct(cell_id.ra_id.lai.lac, 2),
248 rac := int2oct(cell_id.ra_id.rac, 1)
Alexander Couzens89508702018-07-31 04:16:10 +0200249 }
250 return ret;
251};
252
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +0100253private function f_BssgpCellId_to_GTP_CellId(in BssgpCellId cell_id) return GTP_CellId
254{
255 template (value) GTP_CellId ret := ts_GTP_CellId(cell_id.ra_id, cell_id.cell_id);
256 return valueof(ret);
257}
258
Alexander Couzens51114d12018-07-31 18:41:56 +0200259private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
Pau Espin Pedrol494e8b32022-02-22 16:46:23 +0100260 gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset)) alive;
261 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset)) alive;
Harald Welte5ac31492018-02-15 20:39:13 +0100262 /* connect lower end of BSSGP emulation with NS upper port */
263 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
Harald Welte5ac31492018-02-15 20:39:13 +0100264
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200265 gb.vc_NS.start(NSStart(mp_nsconfig[offset]));
Harald Welte5339b2e2020-10-04 22:52:56 +0200266 gb.vc_BSSGP.start(BssgpStart(gb.cfg, testcasename()));
267 /* resolve the per-BVC component references */
268 for (var integer i := 0; i < lengthof(gb.cfg.bvc); i := i+1) {
269 connect(self:PROC, gb.vc_BSSGP:PROC);
270 gb.vc_BSSGP_BVC[i] := f_bssgp_get_bvci_ct(gb.cfg.bvc[i].bvci, PROC);
271 disconnect(self:PROC, gb.vc_BSSGP:PROC);
272 }
Philipp Maier7df55e02020-12-14 23:46:04 +0100273 /* connect RIM related port */
274 connect(gb.vc_BSSGP:RIM, self:RIM[offset]);
Harald Welte5ac31492018-02-15 20:39:13 +0100275}
276
277private function f_init_gsup(charstring id) runs on test_CT {
278 id := id & "-GSUP";
279 var GsupOps ops := {
280 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
281 };
282
283 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
284 vc_GSUP := GSUP_Emulation_CT.create(id);
285
286 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
287 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
288 /* we use this hack to get events like ASP_IPA_EVENT_UP */
289 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
290
291 vc_GSUP.start(GSUP_Emulation.main(ops, id));
292 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
293
294 /* wait for incoming connection to GSUP port before proceeding */
295 timer T := 10.0;
296 T.start;
297 alt {
Vadim Yanitskiy61564be2020-05-18 20:44:14 +0700298 [] GSUP_IPA_EVENT.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP)) { }
Harald Welte5ac31492018-02-15 20:39:13 +0100299 [] T.timeout {
300 setverdict(fail, "No connection to GSUP Port");
Daniel Willmannafce8662018-07-06 23:11:32 +0200301 mtc.stop;
Harald Welte5ac31492018-02-15 20:39:13 +0100302 }
303 }
304}
305
Harald Welteeded9ad2018-02-17 20:57:34 +0100306private function f_init_gtp(charstring id) runs on test_CT {
307 id := id & "-GTP";
308
309 var GtpEmulationCfg gtp_cfg := {
310 gtpc_bind_ip := mp_ggsn_ip,
311 gtpc_bind_port := GTP1C_PORT,
312 gtpu_bind_ip := mp_ggsn_ip,
313 gtpu_bind_port := GTP1U_PORT,
314 sgsn_role := false
315 };
316
317 vc_GTP := GTP_Emulation_CT.create(id);
318 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
319}
320
Alexander Couzens8e1dfd02020-09-07 04:26:20 +0200321friend function f_init_vty() runs on test_CT {
Harald Weltebd194722018-02-16 22:11:08 +0100322 map(self:SGSNVTY, system:SGSNVTY);
323 f_vty_set_prompts(SGSNVTY);
324 f_vty_transceive(SGSNVTY, "enable");
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200325 f_vty_transceive(SGSNVTY, "reset sgsn state");
Harald Weltebd194722018-02-16 22:11:08 +0100326 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
327}
328
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200329private function f_vty_enable_echo_interval(boolean enable) runs on test_CT {
330 if (enable) {
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +0200331 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 echo-interval " & int2str(mp_echo_interval));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200332 } else {
333 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 no echo-interval");
334 }
335}
336
Harald Weltebd194722018-02-16 22:11:08 +0100337
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200338/* mcc_mnc is 24.008 10.5.5.15 encoded. 262 42 */
339function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
Harald Welte26fbb6e2019-04-14 17:32:46 +0200340 var integer i;
341
Harald Welte96a33b02018-02-04 10:36:22 +0100342 if (g_initialized == true) {
343 return;
344 }
345 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100346 g_gb[0].cfg := {
347 nsei := 96,
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200348 sgsn_role := false,
Harald Welte5339b2e2020-10-04 22:52:56 +0200349 bvc := {
350 {
351 bvci := 196,
352 cell_id := {
353 ra_id := {
354 lai := {
355 mcc_mnc := mcc_mnc,
356 lac := 13135
357 },
358 rac := 0
359 },
360 cell_id := 20960
361 },
Harald Welte4d112c92020-11-12 19:48:31 +0100362 depth := BSSGP_DECODE_DEPTH_L3,
363 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
Harald Welte5339b2e2020-10-04 22:52:56 +0200364 }
365 }
Harald Welte5ac31492018-02-15 20:39:13 +0100366 };
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200367 g_gb[1].cfg := {
368 nsei := 97,
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200369 sgsn_role := false,
Harald Welte5339b2e2020-10-04 22:52:56 +0200370 bvc := {
371 {
372 bvci := 210,
373 cell_id := {
374 ra_id := {
375 lai := {
376 mcc_mnc := mcc_mnc,
377 lac := 13200
378 },
379 rac := 0
380 },
381 cell_id := 20961
382 },
Harald Welte4d112c92020-11-12 19:48:31 +0100383 depth := BSSGP_DECODE_DEPTH_L3,
384 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
Harald Welte5339b2e2020-10-04 22:52:56 +0200385 }
386 }
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200387 };
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100388 g_gb[2].cfg := { /* [2] configured to have same RAC as [1] */
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200389 nsei := 98,
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200390 sgsn_role := false,
Harald Welte5339b2e2020-10-04 22:52:56 +0200391 bvc := {
392 {
393 bvci := 220,
394 cell_id := {
395 ra_id := {
396 lai := {
397 mcc_mnc := mcc_mnc,
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100398 lac := 13200
Harald Welte5339b2e2020-10-04 22:52:56 +0200399 },
400 rac := 0
401 },
402 cell_id := 20962
403 },
Harald Welte4d112c92020-11-12 19:48:31 +0100404 depth := BSSGP_DECODE_DEPTH_L3,
405 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
Harald Welte5339b2e2020-10-04 22:52:56 +0200406 }
407 }
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200408 };
Harald Welte96a33b02018-02-04 10:36:22 +0100409
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200410 f_init_vty();
Alexander Couzens51114d12018-07-31 18:41:56 +0200411 f_init_gb(g_gb[0], "SGSN_Test-Gb0", 0);
412 f_init_gb(g_gb[1], "SGSN_Test-Gb1", 1);
413 f_init_gb(g_gb[2], "SGSN_Test-Gb2", 2);
Harald Welte26fbb6e2019-04-14 17:32:46 +0200414
Alexander Couzens1552e792019-07-23 20:38:39 +0200415 if (g_ranap_enable) {
416 for (i := 0; i < NUM_RNC; i := i+1) {
417 f_ran_adapter_init(g_ranap[i], mp_ranap_cfg[i], "SGSN_Test_" & int2str(i), RNC_RanOps);
418 f_ran_adapter_start(g_ranap[i]);
419 }
Harald Welte26fbb6e2019-04-14 17:32:46 +0200420 }
Harald Welte5ac31492018-02-15 20:39:13 +0100421 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100422 f_init_gtp("SGSN_Test");
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200423 f_vty_enable_echo_interval(g_use_echo);
Harald Welte5ac31492018-02-15 20:39:13 +0100424}
Harald Welte96a33b02018-02-04 10:36:22 +0100425
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200426function f_cleanup() runs on test_CT {
427 var integer i;
Alexander Couzens1552e792019-07-23 20:38:39 +0200428 if (g_ranap_enable) {
429 for (i := 0; i < NUM_RNC; i := i+1) {
430 f_ran_adapter_cleanup(g_ranap[i]);
431 }
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200432 }
433 self.stop;
434}
435
Harald Welte26fbb6e2019-04-14 17:32:46 +0200436private function RncUnitdataCallback(RANAP_PDU ranap)
437runs on RAN_Emulation_CT return template RANAP_PDU {
438 var template RANAP_PDU resp := omit;
439
440 log ("RANAP_RncUnitDataCallback");
441 /* answer all RESET with RESET ACK */
442 if (match(ranap, tr_RANAP_Reset)) {
443 log("RANAP_RncUnitdataCallback: Responding to RESET with RESET-ACK");
444 var CN_DomainIndicator dom;
445 dom := ranap.initiatingMessage.value_.Reset.protocolIEs[1].value_.cN_DomainIndicator;
446 resp := ts_RANAP_ResetAck(dom);
447 }
448 return resp;
449}
450
451const RanOps RNC_RanOps := {
452 ranap_create_cb := refers(RAN_Emulation.RanapExpectedCreateCallback),
453 ranap_unitdata_cb := refers(RncUnitdataCallback),
454 ps_domain := true,
455 decode_dtap := true,
456 role_ms := true,
457 protocol := RAN_PROTOCOL_RANAP,
458 transport := RANAP_TRANSPORT_IuCS,
459 use_osmux := false,
Eric Wild6e511ce2022-04-02 21:35:56 +0200460 bssap_reset_retries := 1,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200461 sccp_addr_local := omit,
462 sccp_addr_peer := omit
463};
464
Harald Welte5ac31492018-02-15 20:39:13 +0100465type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
466
467/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Alexander Couzens51114d12018-07-31 18:41:56 +0200468function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix,
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100469 float t_guard := 30.0, boolean expect_ciph := false)
Harald Welte5ac31492018-02-15 20:39:13 +0100470runs on test_CT return BSSGP_ConnHdlr {
471 var BSSGP_ConnHdlr vc_conn;
472 var SGSN_ConnHdlrNetworkPars net_pars := {
473 expect_ptmsi := true,
474 expect_auth := true,
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100475 expect_ciph := expect_ciph
Harald Welte5ac31492018-02-15 20:39:13 +0100476 };
477 var BSSGP_ConnHdlrPars pars := {
478 imei := f_gen_imei(imsi_suffix),
479 imsi := f_gen_imsi(imsi_suffix),
480 msisdn := f_gen_msisdn(imsi_suffix),
481 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100482 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100483 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100484 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100485 ra := omit,
Harald Welte5339b2e2020-10-04 22:52:56 +0200486 bssgp_cell_id := {
487 gb[0].cfg.bvc[0].cell_id,
488 gb[1].cfg.bvc[0].cell_id,
489 gb[2].cfg.bvc[0].cell_id
490 },
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200491 rnc_send_initial_ue := true,
Harald Welte5ac31492018-02-15 20:39:13 +0100492 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100493 net := net_pars,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200494 t_guard := t_guard,
Alexander Couzens1552e792019-07-23 20:38:39 +0200495 sccp_addr_local := omit,
496 sccp_addr_peer := omit
Harald Welte5ac31492018-02-15 20:39:13 +0100497 };
498
Alexander Couzens1552e792019-07-23 20:38:39 +0200499 if (g_ranap_enable) {
500 pars.sccp_addr_local := g_ranap[0].sccp_addr_own;
501 pars.sccp_addr_peer := g_ranap[0].sccp_addr_peer;
502 }
503
Harald Welte5ac31492018-02-15 20:39:13 +0100504 vc_conn := BSSGP_ConnHdlr.create(id);
Harald Welte5339b2e2020-10-04 22:52:56 +0200505
506 connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_SP);
507 connect(vc_conn:BSSGP_SIG[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
508 connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100509 connect(vc_conn:BSSGP_GLOBAL[0], gb[0].vc_BSSGP:GLOBAL);
Harald Welte5339b2e2020-10-04 22:52:56 +0200510
511 connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_SP);
512 connect(vc_conn:BSSGP_SIG[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
513 connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100514 connect(vc_conn:BSSGP_GLOBAL[1], gb[1].vc_BSSGP:GLOBAL);
Harald Welte5339b2e2020-10-04 22:52:56 +0200515
516 connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_SP);
517 connect(vc_conn:BSSGP_SIG[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
518 connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100519 connect(vc_conn:BSSGP_GLOBAL[2], gb[2].vc_BSSGP:GLOBAL);
Harald Welte5ac31492018-02-15 20:39:13 +0100520
Harald Welte26fbb6e2019-04-14 17:32:46 +0200521 /* FIXME: support multiple RNCs */
Alexander Couzens1552e792019-07-23 20:38:39 +0200522 if (g_ranap_enable) {
523 connect(vc_conn:BSSAP, g_ranap[0].vc_RAN:CLIENT);
524 connect(vc_conn:BSSAP_PROC, g_ranap[0].vc_RAN:PROC);
525 }
Harald Welte26fbb6e2019-04-14 17:32:46 +0200526
Harald Welte5ac31492018-02-15 20:39:13 +0100527 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
528 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
529
Harald Welteeded9ad2018-02-17 20:57:34 +0100530 connect(vc_conn:GTP, vc_GTP:CLIENT);
531 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
532
Harald Welte5ac31492018-02-15 20:39:13 +0100533 vc_conn.start(f_handler_init(fn, id, pars));
534 return vc_conn;
535}
536
Harald Welte62e29582018-02-16 21:17:11 +0100537private altstep as_Tguard() runs on BSSGP_ConnHdlr {
538 [] g_Tguard.timeout {
539 setverdict(fail, "Tguard timeout");
Daniel Willmannafce8662018-07-06 23:11:32 +0200540 mtc.stop;
Harald Welte62e29582018-02-16 21:17:11 +0100541 }
542}
543
Harald Welte5ac31492018-02-15 20:39:13 +0100544/* first function called in every ConnHdlr */
545private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
546runs on BSSGP_ConnHdlr {
547 /* do some common stuff like setting up g_pars */
548 g_pars := pars;
549
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200550 llc := f_llc_create(false);
551
Harald Welte5ac31492018-02-15 20:39:13 +0100552 /* register with BSSGP core */
Harald Welte5339b2e2020-10-04 22:52:56 +0200553 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Harald Welte5ac31492018-02-15 20:39:13 +0100554 /* tell GSUP dispatcher to send this IMSI to us */
555 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100556 /* tell GTP dispatcher to send this IMSI to us */
557 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100558
Harald Welte62e29582018-02-16 21:17:11 +0100559 g_Tguard.start(pars.t_guard);
560 activate(as_Tguard());
561
Harald Welte5ac31492018-02-15 20:39:13 +0100562 /* call the user-supplied test case function */
563 fn.apply(id);
564 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100565}
566
567/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100568 * Detach without Attach
569 * SM procedures without attach / RAU
570 * ATTACH / RAU
571 ** with / without authentication
572 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100573 * re-transmissions of LLC frames
574 * PDP Context activation
575 ** with different GGSN config in SGSN VTY
576 ** with different PDP context type (v4/v6/v46)
577 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100578 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100579 */
580
581testcase TC_wait_ns_up() runs on test_CT {
582 f_init();
583 f_sleep(20.0);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200584 f_cleanup();
Harald Welte96a33b02018-02-04 10:36:22 +0100585}
586
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200587friend function is_gb(integer ran_index) return boolean {
588 return ran_index < NUM_GB;
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200589}
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200590friend function is_iu(integer ran_index) return boolean {
591 return ran_index >= NUM_GB;
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200592}
593
Alexander Couzens0507ec32019-09-15 22:41:22 +0200594function f_send_llc(template (value) PDU_LLC llc_pdu, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltea05b8072019-04-23 22:35:05 +0200595 var octetstring llc_enc := enc_PDU_LLC(valueof(llc_pdu));
Alexander Couzens0507ec32019-09-15 22:41:22 +0200596 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 +0200597}
598
Alexander Couzens0507ec32019-09-15 22:41:22 +0200599private 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 +0200600 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
601 var BIT4 sapi := f_llc_sapi_by_l3_mo(valueof(l3_mo));
602 var integer n_u := f_llc_get_n_u_tx(llc[bit2int(sapi)]);
Alexander Couzens0507ec32019-09-15 22:41:22 +0200603 f_send_llc(ts_LLC_UI(l3_enc, sapi, '0'B, n_u), ran_index);
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200604}
605
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200606/* trigger sending of a RANAP InitialUE and wait for SCCP connection confirmation */
607function f_send_l3_initial_ue(template (value) PDU_L3_MS_SGSN l3_mo) runs on BSSGP_ConnHdlr {
608 log("Sending InitialUE: ", l3_mo);
609 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
610 var RANAP_PDU ranap;
611 var LAI lai := {
612 pLMNidentity := '62F224'O,
613 lAC := '1234'O,
614 iE_Extensions := omit
615 };
616 var SAI sai := {
617 pLMNidentity := lai.pLMNidentity,
618 lAC := lai.lAC,
619 sAC := '0000'O, /* FIXME */
620 iE_Extensions := omit
621 };
622 var IuSignallingConnectionIdentifier sigc_id := int2bit(23, 24); /* FIXME */
623 var GlobalRNC_ID grnc_id := {
624 pLMNidentity := lai.pLMNidentity,
625 rNC_ID := 2342 /* FIXME */
626 };
627
628 ranap := valueof(ts_RANAP_initialUE_CS(lai, sai, l3_enc, sigc_id, grnc_id));
629 BSSAP.send(ts_RANAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_local, ranap));
630 alt {
631 [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {}
632 [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
633 setverdict(fail, "DISC.ind from SCCP");
634 mtc.stop;
635 }
636 }
637}
638
639/* send a L3 (GMM/SM) message over whatever is the appropriate lower-layer bearer */
Alexander Couzens0507ec32019-09-15 22:41:22 +0200640function f_send_l3(template (value) PDU_L3_MS_SGSN l3_mo, integer ran_index := 0) runs on BSSGP_ConnHdlr {
641 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200642 if (g_pars.rnc_send_initial_ue) {
643 g_pars.rnc_send_initial_ue := false;
644 f_send_l3_initial_ue(l3_mo);
645 } else {
646 BSSAP.send(ts_PDU_DTAP_PS_MO(l3_mo));
647 }
648 } else {
Alexander Couzens0507ec32019-09-15 22:41:22 +0200649 f_send_l3_gmm_llc(l3_mo, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200650 }
651}
652
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200653altstep as_mm_identity(integer ran_index := 0) runs on BSSGP_ConnHdlr {
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700654 var MobileIdentityLV mi;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200655 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_ID_REQ('001'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100656 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200657 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100658 repeat;
659 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200660 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200661 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200662 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200663 repeat;
664 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200665 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_ID_REQ('010'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100666 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200667 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200668 repeat;
669 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200670 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200671 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200672 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100673 repeat;
674 }
675}
Harald Welte96a33b02018-02-04 10:36:22 +0100676
Harald Welteca362462019-05-02 20:11:21 +0200677/* receive a L3 (GMM/SM) message over whatever is the appropriate lower-layer bearer */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200678function f_receive_l3(template PDU_L3_SGSN_MS rx_tpl := ?, integer ran_index := 0)
Harald Welteca362462019-05-02 20:11:21 +0200679runs on BSSGP_ConnHdlr return PDU_L3_SGSN_MS {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200680 var PDU_DTAP_PS_MT mt;
Harald Welteca362462019-05-02 20:11:21 +0200681 var PDU_L3_SGSN_MS l3_mt;
682 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200683 [is_gb(ran_index)] BSSGP[ran_index].receive(rx_tpl) -> value l3_mt { }
684 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(rx_tpl)) -> value mt {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200685 l3_mt := mt.dtap;
686 }
Harald Welteca362462019-05-02 20:11:21 +0200687 }
688 return l3_mt;
689}
690
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100691/* (copied from msc/BSC_ConnectionHandler.ttcn) */
692private altstep as_ciph_utran() runs on BSSGP_ConnHdlr
693{
694 [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(uia_algs := ?,
695 uia_key := oct2bit(g_pars.vec.ik),
696 key_sts := ?,
697 uea_algs := ?,
698 uea_key := oct2bit(g_pars.vec.ck))) {
699 var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1*/
700 var EncryptionAlgorithm uea_chosen := 1; /*standard_UMTS_encryption_algorith_UEA1*/
701 BSSAP.send(ts_RANAP_SecurityModeCompleteEnc(uia_chosen, uea_chosen));
702 }
703 [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(?,?,?,?,?)) {
704 setverdict(fail, "Invalid SecurityModeCommand (ciphering case)");
705 mtc.stop;
706 }
707 [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(uia_algs := ?,
708 uia_key := oct2bit(g_pars.vec.ik),
709 key_sts := ?)) {
710 var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1;*/
711 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
712 }
713 [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(?,?,?)) {
714 setverdict(fail, "Invalid SecurityModeCommand (non-ciphering case)");
715 mtc.stop;
716 }
717}
718
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200719/* perform GMM authentication (if expected).
720 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
721 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200722function 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 +0100723 var PDU_L3_MS_SGSN l3_mo;
724 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200725 var default di := activate(as_mm_identity(ran_index));
Harald Welte5ac31492018-02-15 20:39:13 +0100726 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200727 var GSUP_IE auth_tuple;
728 var template AuthenticationParameterAUTNTLV autn;
729
730 if (umts_aka_challenge) {
731 g_pars.vec := f_gen_auth_vec_3g();
732 autn := {
733 elementIdentifier := '28'O,
734 lengthIndicator := lengthof(g_pars.vec.autn),
735 autnValue := g_pars.vec.autn
736 };
737
738 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
739 g_pars.vec.sres,
740 g_pars.vec.kc,
741 g_pars.vec.ik,
742 g_pars.vec.ck,
743 g_pars.vec.autn,
744 g_pars.vec.res));
745 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
746 } else {
747 g_pars.vec := f_gen_auth_vec_2g();
748 autn := omit;
749 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
750 g_pars.vec.sres,
751 g_pars.vec.kc));
752 log("GSUP sends only 2G auth tuple", auth_tuple);
753 }
Harald Welteca362462019-05-02 20:11:21 +0200754
Harald Welte5ac31492018-02-15 20:39:13 +0100755 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
756 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200757
758 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
759 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200760 l3_mt := f_receive_l3(auth_ciph_req, ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100761 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200762 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
763
764 if (umts_aka_challenge and not force_gsm_sres) {
765 /* set UMTS response instead */
766 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
767 valueField := substr(g_pars.vec.res, 0, 4)
768 };
769 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
770 elementIdentifier := '21'O,
771 lengthIndicator := lengthof(g_pars.vec.res) - 4,
772 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
773 };
774 }
775
776 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100777 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
778 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
779 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
780 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
781 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200782 f_send_l3(l3_mo, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200783
784 /* Security Mode Command + Complete on Iu case */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200785 if (is_iu(ran_index)) {
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100786 as_ciph_utran();
787 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)));
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200788 }
Harald Welte76dee092018-02-16 22:12:59 +0100789 } else {
790 /* wait for identity procedure */
791 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100792 }
Harald Welte76dee092018-02-16 22:12:59 +0100793
Harald Welte5ac31492018-02-15 20:39:13 +0100794 deactivate(di);
795}
796
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200797function f_upd_ptmsi_and_tlli(OCT4 p_tmsi, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltef70997d2018-02-17 10:11:19 +0100798 g_pars.p_tmsi := p_tmsi;
799 /* update TLLI */
800 g_pars.tlli_old := g_pars.tlli;
801 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
Daniel Willmann1c2ff0f2020-01-28 14:39:25 +0100802 if (is_gb(ran_index)) {
803 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli, BSSGP_PROC[ran_index]);
804 }
Harald Weltef70997d2018-02-17 10:11:19 +0100805}
806
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100807function f_process_attach_accept(PDU_GMM_AttachAccept aa, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100808 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100809 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Harald Weltedd9fb842021-02-16 20:21:22 +0100810 /* we cannot use ran_index here, as it would overflow the cell_id object, since ran_idx > NUM_GB
811 * indicates an Iu RAN connection. All cells are expected to run the same MCC/MNC anyway... */
812 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100813 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100814 & "; expected " & hex2str(g_pars.bssgp_cell_id[ran_index].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200815 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100816 }
Harald Welte04683d02018-02-16 22:43:45 +0100817 g_pars.ra := aa.routingAreaIdentification;
818 if (ispresent(aa.allocatedPTMSI)) {
819 if (not g_pars.net.expect_ptmsi) {
820 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200821 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100822 }
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100823 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets,
824 ran_index);
Harald Welte04683d02018-02-16 22:43:45 +0100825 }
826 if (ispresent(aa.msIdentity)) {
827 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200828 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100829 }
830 /* P-TMSI.sig */
831 if (ispresent(aa.ptmsiSignature)) {
832 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
833 }
834 /* updateTimer */
835 // aa.readyTimer
836 /* T3302, T3319, T3323, T3312_ext, T3324 */
837}
838
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200839function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +0100840 /* mandatory IE */
841 g_pars.ra := ra.routingAreaId;
842 if (ispresent(ra.allocatedPTMSI)) {
843 if (not g_pars.net.expect_ptmsi) {
844 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200845 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100846 }
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100847 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets,
848 ran_index);
Harald Welte91636de2018-02-17 10:16:14 +0100849 }
850 if (ispresent(ra.msIdentity)) {
851 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200852 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100853 }
854 /* P-TMSI.sig */
855 if (ispresent(ra.ptmsiSignature)) {
856 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
857 }
858 /* updateTimer */
859 // aa.readyTimer
860 /* T3302, T3319, T3323, T3312_ext, T3324 */
861}
862
863
Harald Welte5a4fa042018-02-16 20:59:21 +0100864function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
865 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
866}
867
Harald Welte23178c52018-02-17 09:36:33 +0100868/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700869private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100870 if (ispresent(g_pars.p_tmsi)) {
871 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
872 } else {
873 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
874 }
875}
876
Harald Welte311ec272018-02-17 09:40:03 +0100877private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100878 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100879 /* Expect MSC to perform LU with HLR */
880 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100881 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
882 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
883 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100884 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
885 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
886}
887
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100888friend function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres, integer ran_index := 0,
889 template (omit) RoutingAreaIdentificationV old_ra := omit) runs on BSSGP_ConnHdlr {
890 var RoutingAreaIdentificationV old_ra_val;
891 var template PDU_L3_MS_SGSN attach_req;
Harald Welteca362462019-05-02 20:11:21 +0200892 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5ac31492018-02-15 20:39:13 +0100893
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100894 if (istemplatekind(old_ra, "omit")) {
895 old_ra_val := f_random_RAI();
896 } else {
897 old_ra_val := valueof(old_ra);
898 }
899
900 attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra_val, false, false, omit, omit);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200901 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
902 * 3G auth vectors */
903 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
904 /* The thing is, if the solSACapability is 'omit', then the
905 * revisionLevelIndicatior is at the wrong place! */
906 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
907
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200908 f_send_l3(attach_req, ran_index);
909 f_gmm_auth(umts_aka_challenge, force_gsm_sres, ran_index);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200910 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100911 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100912
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200913 l3_mt := f_receive_l3(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?), ran_index);
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100914 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept, ran_index);
Harald Welteca362462019-05-02 20:11:21 +0200915
Harald Welte04683d02018-02-16 22:43:45 +0100916 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200917 f_send_l3(ts_GMM_ATTACH_COMPL, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200918
919 /* IuPS case: Expect Iu Release */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200920 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200921 as_iu_release_compl_disc();
922 }
Alexander Couzens42d3cad2019-10-08 16:29:26 +0200923
924 /* Race condition
925 * It has shown, that GMM_ATTACH_COMPL might take some time to arrive at the SGSN through the layers.
926 * In TC hlr_location_cancel_request_update, the GMM_ATTACH_COMPL came 2ms too late, so that the Location Cancel Request
927 * arrived before it. This results in a test case failure.
928 * Delay execution by 50 ms
929 */
930 f_sleep(0.05);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200931}
932
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200933friend function f_bssgp_suspend(integer ran_idx := 0) runs on BSSGP_ConnHdlr return OCT1 {
934 timer T := 5.0;
935 var PDU_BSSGP rx_pdu;
Harald Welte9b461a92020-12-10 23:41:14 +0100936 BSSGP_GLOBAL[ran_idx].send(ts_BSSGP_SUSPEND(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id));
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200937 T.start;
938 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100939 [] BSSGP_GLOBAL[ran_idx].receive(tr_BSSGP_SUSPEND_ACK(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id, ?)) -> value rx_pdu {
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200940 return rx_pdu.pDU_BSSGP_SUSPEND_ACK.suspend_Reference_Number.suspend_Reference_Number_value;
941 }
Harald Welte9b461a92020-12-10 23:41:14 +0100942 [] BSSGP_GLOBAL[ran_idx].receive(tr_BSSGP_SUSPEND_NACK(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id, ?)) -> value rx_pdu {
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200943 setverdict(fail, "SUSPEND-NACK in response to SUSPEND for TLLI ", g_pars.tlli);
944 mtc.stop;
945 }
946 [] T.timeout {
947 setverdict(fail, "No SUSPEND-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
948 mtc.stop;
949 }
950 }
951 return '00'O;
952}
953
954friend function f_bssgp_resume(OCT1 susp_ref, integer ran_idx := 0) runs on BSSGP_ConnHdlr {
955 timer T := 5.0;
Harald Welte9b461a92020-12-10 23:41:14 +0100956 BSSGP_GLOBAL[ran_idx].send(ts_BSSGP_RESUME(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id, susp_ref));
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200957 T.start;
958 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100959 [] BSSGP_GLOBAL[ran_idx].receive(tr_BSSGP_RESUME_ACK(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id));
960 [] BSSGP_GLOBAL[ran_idx].receive(tr_BSSGP_RESUME_NACK(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id,
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200961?)) {
962 setverdict(fail, "RESUME-NACK in response to RESUME for TLLI ", g_pars.tlli);
963 mtc.stop;
964 }
965 [] T.timeout {
966 setverdict(fail, "No RESUME-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
967 mtc.stop;
968 }
969 }
970}
971
972
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200973private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
974 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100975 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100976}
977
978testcase TC_attach() runs on test_CT {
979 var BSSGP_ConnHdlr vc_conn;
980 f_init();
981 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200982 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100983 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200984 f_cleanup();
Harald Welte5ac31492018-02-15 20:39:13 +0100985}
986
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100987testcase TC_attach_mnc3() runs on test_CT {
988 var BSSGP_ConnHdlr vc_conn;
989 f_init('023042'H);
990 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200991 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100992 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200993 f_cleanup();
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100994}
995
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200996private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
997 f_gmm_attach(true, false);
998 setverdict(pass);
999}
1000testcase TC_attach_umts_aka_umts_res() runs on test_CT {
1001 var BSSGP_ConnHdlr vc_conn;
1002 f_init();
1003 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001004 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001005 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001006 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001007}
1008
1009private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
1010 f_gmm_attach(true, true);
1011 setverdict(pass);
1012}
1013testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
1014 var BSSGP_ConnHdlr vc_conn;
1015 f_init();
1016 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001017 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001018 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001019 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001020}
1021
Harald Welte5b7c8122018-02-16 21:48:17 +01001022/* MS never responds to ID REQ, expect ATTACH REJECT */
1023private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +01001024 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1025
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001026 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001027 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001028 [] BSSGP[0].receive(tr_GMM_ID_REQ(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001029 /* don't send ID Response */
1030 repeat;
1031 }
Harald Welte955aa942019-05-03 01:29:29 +02001032 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('09'O)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001033 setverdict(pass);
1034 }
Harald Welte955aa942019-05-03 01:29:29 +02001035 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001036 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +02001037 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +01001038 }
1039 }
1040}
1041testcase TC_attach_auth_id_timeout() runs on test_CT {
1042 var BSSGP_ConnHdlr vc_conn;
1043 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001044 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 +01001045 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001046 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001047}
1048
1049/* HLR never responds to SAI REQ, expect ATTACH REJECT */
1050private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +01001051 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1052
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001053 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001054 alt {
1055 [] as_mm_identity();
1056 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
1057 }
1058 /* don't send SAI-response from HLR */
Harald Welte955aa942019-05-03 01:29:29 +02001059 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Welte5b7c8122018-02-16 21:48:17 +01001060 setverdict(pass);
1061}
1062testcase TC_attach_auth_sai_timeout() runs on test_CT {
1063 var BSSGP_ConnHdlr vc_conn;
1064 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001065 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +01001066 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001067 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001068}
1069
Harald Weltefe253882018-02-17 09:25:00 +01001070/* HLR rejects SAI, expect ATTACH REJECT */
1071private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +01001072 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1073
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001074 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +01001075 alt {
1076 [] as_mm_identity();
1077 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
1078 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
1079 }
1080 }
Harald Welte955aa942019-05-03 01:29:29 +02001081 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Weltefe253882018-02-17 09:25:00 +01001082 setverdict(pass);
1083}
1084testcase TC_attach_auth_sai_reject() runs on test_CT {
1085 var BSSGP_ConnHdlr vc_conn;
1086 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001087 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +01001088 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001089 f_cleanup();
Harald Weltefe253882018-02-17 09:25:00 +01001090}
1091
Harald Welte5b7c8122018-02-16 21:48:17 +01001092/* HLR never responds to UL REQ, expect ATTACH REJECT */
1093private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001094 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5b7c8122018-02-16 21:48:17 +01001095 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1096
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001097 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001098 f_gmm_auth();
1099 /* Expect MSC to perform LU with HLR */
1100 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
1101 /* Never follow-up with ISD_REQ or UL_RES */
1102 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001103 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001104 setverdict(pass);
1105 }
Harald Welte955aa942019-05-03 01:29:29 +02001106 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1107 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +01001108 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001109 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +01001110 }
1111 }
1112}
1113testcase TC_attach_gsup_lu_timeout() runs on test_CT {
1114 var BSSGP_ConnHdlr vc_conn;
1115 f_init();
1116 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001117 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +01001118 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001119 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001120}
1121
Harald Welteb7c14e92018-02-17 09:29:16 +01001122/* HLR rejects UL REQ, expect ATTACH REJECT */
1123private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001124 var PDU_L3_SGSN_MS l3_mt;
Harald Welteb7c14e92018-02-17 09:29:16 +01001125 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1126
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001127 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +01001128 f_gmm_auth();
1129 /* Expect MSC to perform LU with HLR */
1130 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
1131 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
1132 }
1133 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001134 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb7c14e92018-02-17 09:29:16 +01001135 setverdict(pass);
1136 }
Harald Welte955aa942019-05-03 01:29:29 +02001137 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1138 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welteb7c14e92018-02-17 09:29:16 +01001139 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001140 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +01001141 }
1142 }
1143}
1144testcase TC_attach_gsup_lu_reject() runs on test_CT {
1145 var BSSGP_ConnHdlr vc_conn;
1146 f_init();
1147 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001148 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +01001149 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001150 f_cleanup();
Harald Welteb7c14e92018-02-17 09:29:16 +01001151}
1152
1153
Harald Welte3823e2e2018-02-16 21:53:48 +01001154/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
1155private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001156 var PDU_L3_SGSN_MS l3_mt;
Harald Welte3823e2e2018-02-16 21:53:48 +01001157 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1158
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001159 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +01001160 f_gmm_auth();
1161 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +01001162 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +01001163
Harald Welte955aa942019-05-03 01:29:29 +02001164 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1165 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001166 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001167 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +01001168 setverdict(pass);
1169}
Harald Welte3823e2e2018-02-16 21:53:48 +01001170testcase TC_attach_combined() runs on test_CT {
1171 var BSSGP_ConnHdlr vc_conn;
1172 f_init();
1173 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001174 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +01001175 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001176 f_cleanup();
Harald Welte3823e2e2018-02-16 21:53:48 +01001177}
1178
Harald Welte76dee092018-02-16 22:12:59 +01001179/* Attempt of GPRS ATTACH in 'accept all' mode */
1180private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001181 var PDU_L3_SGSN_MS l3_mt;
Harald Welte76dee092018-02-16 22:12:59 +01001182 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1183
1184 g_pars.net.expect_auth := false;
1185
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001186 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +01001187 f_gmm_auth();
Harald Welte955aa942019-05-03 01:29:29 +02001188 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1189 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001190 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001191 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +01001192 setverdict(pass);
1193}
1194testcase TC_attach_accept_all() runs on test_CT {
1195 var BSSGP_ConnHdlr vc_conn;
1196 f_init();
1197 f_sleep(1.0);
1198 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +02001199 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +01001200 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001201 f_cleanup();
Harald Welte76dee092018-02-16 22:12:59 +01001202}
Harald Welte5b7c8122018-02-16 21:48:17 +01001203
Harald Welteb2124b22018-02-16 22:26:56 +01001204/* Attempt of GPRS ATTACH in 'accept all' mode */
1205private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +01001206 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1207
1208 /* Simulate a foreign IMSI */
1209 g_pars.imsi := '001010123456789'H;
Harald Welte5339b2e2020-10-04 22:52:56 +02001210 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Harald Welteb2124b22018-02-16 22:26:56 +01001211
1212 g_pars.net.expect_auth := false;
1213
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001214 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +01001215 alt {
1216 [] as_mm_identity();
Harald Welte955aa942019-05-03 01:29:29 +02001217 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('07'O)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001218 setverdict(pass);
1219 }
Harald Welte955aa942019-05-03 01:29:29 +02001220 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001221 setverdict(pass);
1222 }
Harald Welte955aa942019-05-03 01:29:29 +02001223 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001224 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001225 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001226 }
Harald Welteb2124b22018-02-16 22:26:56 +01001227 }
1228}
1229testcase TC_attach_closed() runs on test_CT {
1230 var BSSGP_ConnHdlr vc_conn;
1231 f_init();
1232 f_sleep(1.0);
1233 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1234 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001235 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +01001236 vc_conn.done;
1237 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001238 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +01001239 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001240 f_cleanup();
Harald Welteb2124b22018-02-16 22:26:56 +01001241}
1242
Harald Welte04683d02018-02-16 22:43:45 +01001243/* Routing Area Update from Unknown TLLI -> REJECT */
1244private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +01001245 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1246
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001247 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 +01001248 alt {
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01001249 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) { /* gmm cause: implicitly detached */
Harald Welte04683d02018-02-16 22:43:45 +01001250 setverdict(pass);
1251 }
1252 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001253 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +01001254 }
1255}
1256testcase TC_rau_unknown() runs on test_CT {
1257 var BSSGP_ConnHdlr vc_conn;
1258 f_init();
1259 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001260 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +01001261 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001262 f_cleanup();
Harald Welte04683d02018-02-16 22:43:45 +01001263}
1264
Harald Welte91636de2018-02-17 10:16:14 +01001265private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +01001266 /* first perform regular attach */
1267 f_TC_attach(id);
1268
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001269 f_routing_area_update(g_pars.ra);
1270
Harald Welte91636de2018-02-17 10:16:14 +01001271}
1272testcase TC_attach_rau() runs on test_CT {
1273 var BSSGP_ConnHdlr vc_conn;
1274 f_init();
1275 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001276 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +01001277 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001278 f_cleanup();
Harald Welte91636de2018-02-17 10:16:14 +01001279}
Harald Welte04683d02018-02-16 22:43:45 +01001280
Harald Welte6abb9fe2018-02-17 15:24:48 +01001281/* general GPRS DETACH helper */
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001282function 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 +02001283 var PDU_L3_SGSN_MS l3_mt;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001284 timer T := 5.0;
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001285 f_send_l3(ts_GMM_DET_REQ_MO(detach_type, power_off), ran_index);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001286 if (expect_purge) {
1287 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
1288 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
1289 }
1290 T.start;
1291 alt {
1292 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
1293 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +02001294 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001295 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001296 [power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001297 g_pars.ra := omit;
Alexander Couzens8e0fd462019-05-11 01:20:55 +02001298 setverdict(fail, "Unexpected DETACH ACCEPT in power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +02001299 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001300 /* TODO: check if any PDP contexts are deactivated on network side? */
1301 }
1302 [power_off] T.timeout {
1303 setverdict(pass);
1304 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001305 [not power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001306 g_pars.ra := omit;
1307 setverdict(pass);
1308 /* TODO: check if any PDP contexts are deactivated on network side? */
1309 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001310 [] BSSGP[ran_index].receive(PDU_L3_SGSN_MS:?) -> value l3_mt {
Alexander Couzens4630e742019-05-11 01:50:10 +02001311 if (power_off) {
1312 setverdict(fail, "Unexpected Layer 3 package received in power-off DETACH");
1313 } else {
1314 setverdict(fail, "Unexpected Layer 3 package received in normal DETACH");
1315 }
1316 mtc.stop;
1317 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001318 [] BSSGP[ran_index].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +01001319 }
1320}
1321
1322/* IMSI DETACH (non-power-off) for unknown TLLI */
1323private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1324 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
1325}
1326testcase TC_detach_unknown_nopoweroff() runs on test_CT {
1327 var BSSGP_ConnHdlr vc_conn;
1328 f_init();
1329 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001330 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001331 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001332 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001333}
1334
1335/* IMSI DETACH (power-off) for unknown TLLI */
1336private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1337 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
1338}
1339testcase TC_detach_unknown_poweroff() runs on test_CT {
1340 var BSSGP_ConnHdlr vc_conn;
1341 f_init();
1342 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001343 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001344 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001345 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001346}
1347
1348/* IMSI DETACH (non-power-off) for known TLLI */
1349private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1350 /* first perform regular attach */
1351 f_TC_attach(id);
1352
1353 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
1354}
1355testcase TC_detach_nopoweroff() runs on test_CT {
1356 var BSSGP_ConnHdlr vc_conn;
1357 f_init();
1358 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001359 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001360 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001361 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001362}
1363
1364/* IMSI DETACH (power-off) for known TLLI */
1365private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1366 /* first perform regular attach */
1367 f_TC_attach(id);
1368
1369 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1370}
1371testcase TC_detach_poweroff() runs on test_CT {
1372 var BSSGP_ConnHdlr vc_conn;
1373 f_init();
1374 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001375 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001376 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001377 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001378}
1379
Harald Welteeded9ad2018-02-17 20:57:34 +01001380type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +01001381 BIT3 tid, /* L3 Transaction ID */
1382 BIT4 nsapi, /* SNDCP NSAPI */
1383 BIT4 sapi, /* LLC SAPI */
1384 QoSV qos, /* QoS parameters */
1385 PDPAddressV addr, /* IP address */
1386 octetstring apn optional, /* APN name */
1387 ProtocolConfigOptionsV pco optional, /* protoco config opts */
1388 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +01001389 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +01001390 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +01001391
Harald Welte822f9102018-02-18 20:39:06 +01001392 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
1393 OCT4 ggsn_tei_u, /* GGSN TEI User */
1394 octetstring ggsn_ip_c, /* GGSN IP Control */
1395 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001396 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +01001397
Harald Welte822f9102018-02-18 20:39:06 +01001398 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
1399 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
1400 octetstring sgsn_ip_c optional, /* SGSN IP Control */
1401 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +01001402};
1403
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001404
1405private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
1406 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
1407 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
1408 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
1409 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
1410 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
1411 f_gtp_register_teid(apars.ggsn_tei_c);
1412 f_gtp_register_teid(apars.ggsn_tei_u);
1413}
1414
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001415function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001416runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +01001417 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1418 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001419 var template Recovery_gtpc recovery := omit;
1420
1421 if (send_recovery) {
1422 recovery := ts_Recovery(apars.ggsn_restart_ctr);
1423 }
Harald Welteeded9ad2018-02-17 20:57:34 +01001424
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001425 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 +02001426 apars.apn, apars.pco), ran_index);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001427 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
1428 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
1429 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1430 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
1431 apars.sgsn_tei_c, apars.gtp_resp_cause,
1432 apars.ggsn_tei_c, apars.ggsn_tei_u,
1433 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001434 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1435 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +01001436 }
1437 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001438 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001439 setverdict(pass);
1440 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001441 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001442 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +02001443 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001444 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001445 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001446 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +02001447 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001448 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001449 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Weltef7191672019-05-02 20:37:23 +02001450 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
1451 mtc.stop;
1452 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001453 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001454 setverdict(pass);
1455 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001456 [] as_xid(apars, ran_index);
Harald Welteeded9ad2018-02-17 20:57:34 +01001457 }
1458}
1459
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001460function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001461runs on BSSGP_ConnHdlr {
Harald Welte6f203162018-02-18 22:04:55 +01001462 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1463 var Gtp1cUnitdata g_ud;
1464
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001465 f_send_l3(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit), ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001466 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1467 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001468 BSSGP[ran_index].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001469 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1470 }
1471 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001472 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Harald Welte6f203162018-02-18 22:04:55 +01001473 setverdict(pass);
1474 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001475 [] as_xid(apars, ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001476 }
1477}
1478
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001479function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001480runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001481 var Gtp1cUnitdata g_ud;
1482 var integer seq_nr := 23;
1483 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1484
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001485 BSSGP[ran_index].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001486 if (error_ind) {
1487 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1488 } else {
1489 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1490 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001491
1492 timer T := 5.0;
1493 T.start;
1494
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001495 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001496 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1497 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), ran_index);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001498 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001499 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1500 repeat;
1501 }
1502 [] T.timeout {
1503 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1504 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001505 }
1506}
1507
Harald Welte6f203162018-02-18 22:04:55 +01001508
Harald Welteeded9ad2018-02-17 20:57:34 +01001509/* Table 10.5.156/3GPP TS 24.008 */
1510template (value) QoSV t_QosDefault := {
1511 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1512 delayClass := '100'B, /* best effort */
1513 spare1 := '00'B,
1514 precedenceClass := '010'B, /* normal */
1515 spare2 := '0'B,
1516 peakThroughput := '0000'B, /* subscribed */
1517 meanThroughput := '00000'B, /* subscribed */
1518 spare3 := '000'B,
1519 deliverErroneusSDU := omit,
1520 deliveryOrder := omit,
1521 trafficClass := omit,
1522 maxSDUSize := omit,
1523 maxBitrateUplink := omit,
1524 maxBitrateDownlink := omit,
1525 sduErrorRatio := omit,
1526 residualBER := omit,
1527 trafficHandlingPriority := omit,
1528 transferDelay := omit,
1529 guaranteedBitRateUplink := omit,
1530 guaranteedBitRateDownlink := omit,
1531 sourceStatisticsDescriptor := omit,
1532 signallingIndication := omit,
1533 spare4 := omit,
1534 maxBitrateDownlinkExt := omit,
1535 guaranteedBitRateDownlinkExt := omit,
1536 maxBitrateUplinkExt := omit,
1537 guaranteedBitRateUplinkExt := omit,
1538 maxBitrateDownlinkExt2 := omit,
1539 guaranteedBitRateDownlinkExt2 := omit,
1540 maxBitrateUplinkExt2 := omit,
1541 guaranteedBitRateUplinkExt2 := omit
1542}
1543
1544/* 10.5.6.4 / 3GPP TS 24.008 */
1545template (value) PDPAddressV t_AddrIPv4dyn := {
1546 pdpTypeOrg := '0001'B, /* IETF */
1547 spare := '0000'B,
1548 pdpTypeNum := '21'O, /* IPv4 */
1549 addressInfo := omit
1550}
1551template (value) PDPAddressV t_AddrIPv6dyn := {
1552 pdpTypeOrg := '0001'B, /* IETF */
1553 spare := '0000'B,
1554 pdpTypeNum := '53'O, /* IPv6 */
1555 addressInfo := omit
1556}
1557
Harald Welte37692d82018-02-18 15:21:34 +01001558template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001559 tid := '000'B,
1560 nsapi := '0101'B, /* < 5 are reserved */
1561 sapi := '0011'B, /* 3/5/9/11 */
1562 qos := t_QosDefault,
1563 addr := t_AddrIPv4dyn,
1564 apn := omit,
1565 pco := omit,
1566 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001567 gtp_resp_cause := int2oct(128, 1),
1568 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001569
1570 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001571 ggsn_tei_c := f_rnd_octstring(4),
1572 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001573 ggsn_ip_c := f_inet_addr(ggsn_ip),
1574 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001575 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001576
Harald Welteeded9ad2018-02-17 20:57:34 +01001577 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001578 sgsn_tei_u := omit,
1579 sgsn_ip_c := omit,
1580 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001581}
1582
Harald Welte37692d82018-02-18 15:21:34 +01001583template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1584 connId := 1,
1585 remName := f_inet_ntoa(ip),
1586 remPort := GTP1U_PORT
1587}
1588
1589template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1590 connId := 1,
1591 remName := f_inet_ntoa(ip),
1592 remPort := GTP1C_PORT
1593}
1594
1595private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1596 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1597 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1598}
1599
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001600private altstep as_xid(PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr {
1601 [] BSSGP[ran_index].receive(tr_LLC_XID_MT_CMD(?, apars.sapi)) {
Harald Welte37692d82018-02-18 15:21:34 +01001602 repeat;
1603 }
1604}
1605
1606template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1607 pDU_SN_UNITDATA := {
1608 nsapi := nsapi,
1609 moreBit := ?,
1610 snPduType := '1'B,
1611 firstSegmentIndicator := ?,
1612 spareBit := ?,
1613 pcomp := ?,
1614 dcomp := ?,
1615 npduNumber := ?,
1616 segmentNumber := ?,
1617 npduNumberContinued := ?,
1618 dataSegmentSnUnitdataPdu := payload
1619 }
1620}
1621
1622/* simple case: single segment, no compression */
1623template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1624 pDU_SN_UNITDATA := {
1625 nsapi := nsapi,
1626 moreBit := '0'B,
1627 snPduType := '1'B,
1628 firstSegmentIndicator := '1'B,
1629 spareBit := '0'B,
1630 pcomp := '0000'B,
1631 dcomp := '0000'B,
1632 npduNumber := '0000'B,
1633 segmentNumber := '0000'B,
1634 npduNumberContinued := '00'O,
1635 dataSegmentSnUnitdataPdu := payload
1636 }
1637}
1638
1639/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
Harald Weltea5c71cd2020-06-17 22:12:04 +02001640private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload, integer ran_index := 0, boolean expect_fwd := true)
Harald Weltef7191672019-05-02 20:37:23 +02001641runs on BSSGP_ConnHdlr {
Harald Weltea5c71cd2020-06-17 22:12:04 +02001642 timer T := 5.0;
Harald Welte37692d82018-02-18 15:21:34 +01001643 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1644 f_gtpu_send(apars, payload);
Harald Weltea5c71cd2020-06-17 22:12:04 +02001645 T.start;
Harald Welte37692d82018-02-18 15:21:34 +01001646 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1647 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001648 [] as_xid(apars, ran_index);
1649 //[] BSSGP[ran_index].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
Harald Weltea5c71cd2020-06-17 22:12:04 +02001650 [expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload));
1651 [expect_fwd] T.timeout {
1652 setverdict(fail, "Timeout waiting for GTP-U to appear on BSSGP");
1653 mtc.stop;
1654 }
1655 [not expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload)) {
1656 setverdict(fail, "GTP-U forwarded to BSSGP but not expected")
1657 mtc.stop;
1658 }
1659 [not expect_fwd] T.timeout {}
Harald Welte37692d82018-02-18 15:21:34 +01001660 }
1661}
1662
Harald Welte64d6b512020-06-17 16:42:00 +02001663/* Transceive given 'payload' as MO message from Gb -> OsmoSGSN -> GTP */
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01001664private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload, integer ran_index := 0, uint9_t n_u := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001665runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001666 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1667 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1668 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01001669 BSSGP[ran_index].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, n_u));
Harald Welte37692d82018-02-18 15:21:34 +01001670 /* Expect PDU via GTP from SGSN on simulated GGSN */
1671 alt {
1672 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1673 }
1674}
1675
Harald Welteeded9ad2018-02-17 20:57:34 +01001676private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001677 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001678
1679 /* first perform regular attach */
1680 f_TC_attach(id);
1681
1682 f_pdp_ctx_act(apars);
1683}
1684testcase TC_attach_pdp_act() runs on test_CT {
1685 var BSSGP_ConnHdlr vc_conn;
1686 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001687 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001688 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001689 f_cleanup();
Harald Welteeded9ad2018-02-17 20:57:34 +01001690}
Harald Welteb2124b22018-02-16 22:26:56 +01001691
Harald Welte835b15f2018-02-18 14:39:11 +01001692/* PDP Context activation for not-attached subscriber; expect fail */
1693private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001694 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001695 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 +01001696 apars.apn, apars.pco));
1697 alt {
1698 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Harald Welte955aa942019-05-03 01:29:29 +02001699 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001700 setverdict(pass);
1701 }
1702 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1703 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001704 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001705 }
Harald Welte955aa942019-05-03 01:29:29 +02001706 [] BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001707 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001708 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001709 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001710 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001711 }
1712}
1713testcase TC_pdp_act_unattached() runs on test_CT {
1714 var BSSGP_ConnHdlr vc_conn;
1715 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001716 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001717 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001718 f_cleanup();
Harald Welte835b15f2018-02-18 14:39:11 +01001719}
1720
Harald Welte37692d82018-02-18 15:21:34 +01001721/* ATTACH + PDP CTX ACT + user plane traffic */
1722private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1723 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1724
1725 /* first perform regular attach */
1726 f_TC_attach(id);
1727 /* then activate PDP context */
1728 f_pdp_ctx_act(apars);
1729 /* then transceive a downlink PDU */
1730 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1731 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1732}
1733testcase TC_attach_pdp_act_user() runs on test_CT {
1734 var BSSGP_ConnHdlr vc_conn;
1735 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001736 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001737 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001738 f_cleanup();
Harald Welte37692d82018-02-18 15:21:34 +01001739}
1740
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001741/* ATTACH + PDP CTX ACT; reject from GGSN */
1742private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1743 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1744
1745 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1746 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1747
1748 /* first perform regular attach */
1749 f_TC_attach(id);
1750 /* then activate PDP context */
1751 f_pdp_ctx_act(apars);
1752}
1753testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1754 var BSSGP_ConnHdlr vc_conn;
1755 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001756 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001757 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001758 f_cleanup();
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001759}
Harald Welte835b15f2018-02-18 14:39:11 +01001760
Harald Welte6f203162018-02-18 22:04:55 +01001761/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1762private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1763 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1764
1765 /* first perform regular attach */
1766 f_TC_attach(id);
1767 /* then activate PDP context */
1768 f_pdp_ctx_act(apars);
1769 /* then transceive a downlink PDU */
1770 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1771 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1772
1773 f_pdp_ctx_deact_mo(apars, '00'O);
1774}
1775testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1776 var BSSGP_ConnHdlr vc_conn;
1777 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001778 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 +01001779 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001780 f_cleanup();
Harald Welte6f203162018-02-18 22:04:55 +01001781}
1782
Harald Welte57b9b7f2018-02-18 22:28:13 +01001783/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1784private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1785 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1786
1787 /* first perform regular attach */
1788 f_TC_attach(id);
1789 /* then activate PDP context */
1790 f_pdp_ctx_act(apars);
1791 /* then transceive a downlink PDU */
1792 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1793 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1794
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001795 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001796}
1797testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1798 var BSSGP_ConnHdlr vc_conn;
1799 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001800 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 +01001801 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001802 f_cleanup();
Harald Welte57b9b7f2018-02-18 22:28:13 +01001803}
1804
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001805/* Test MS sending a duplicate Deact PDP Ctx (OS#3956). */
1806private function f_TC_attach_pdp_act_deact_dup(charstring id) runs on BSSGP_ConnHdlr {
1807 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1808 var Gtp1cUnitdata g_ud;
1809 var integer i;
1810 var OCT1 cause_regular_deact := '24'O;
1811
1812 /* first perform regular attach + PDP context act */
1813 f_TC_attach(id);
1814 f_pdp_ctx_act(apars);
1815
1816 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1817 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1818
1819 for (i := 0; i < 2; i := i+1) {
1820 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1821 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1822 log("Received deletePDPContextResponse " & int2str(i) & ", seq_nr=" & int2str(seq_nr));
1823 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1824 }
1825 }
1826
1827 alt {
1828 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1829 setverdict(pass);
1830 }
1831 [] as_xid(apars, 0);
1832 }
1833
1834 /* Make sure second DeactPdpAccept is sent: */
1835 timer T := 2.0;
1836 T.start;
1837 alt {
1838 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1839 setverdict(fail, "Second SM_DEACT_PDP_ACCEPT_MT received");
1840 }
1841 [] T.timeout {
1842 setverdict(pass);
1843 }
1844 }
1845
1846 setverdict(pass);
1847}
1848testcase TC_attach_pdp_act_deact_dup() runs on test_CT {
1849 var BSSGP_ConnHdlr vc_conn;
1850 f_init();
1851 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_dup), testcasename(), g_gb, 46);
1852 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001853 f_cleanup();
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001854}
1855
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001856/* ATTACH + ATTACH (2nd) */
1857private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1858 g_pars.t_guard := 5.0;
1859
1860 /* first perform regular attach */
1861 f_TC_attach(id);
1862
1863 /* second to perform regular attach */
1864 f_TC_attach(id);
1865}
1866
1867
1868testcase TC_attach_second_attempt() runs on test_CT {
1869 var BSSGP_ConnHdlr vc_conn;
1870 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001871 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001872 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001873 f_cleanup();
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001874}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001875
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001876private function f_TC_attach_echo_timeout(charstring id) runs on BSSGP_ConnHdlr {
1877 var Gtp1cUnitdata g_ud;
1878 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1879 var integer seq_nr;
1880
1881 /* first perform regular attach */
1882 f_TC_attach(id);
1883 /* then activate PDP context */
1884 f_pdp_ctx_act(apars);
1885
1886 /* Wait to receive first echo request and send initial Restart counter */
1887 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1888 BSSGP[0].clear;
1889 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1890 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1891 f_sleep(int2float(mp_echo_interval)); /* wait until around next echo is expected */
1892 }
1893
1894 /* At some point next echo request not answered will timeout and SGSN
1895 should drop the pdp ctx. Around T3 (3secs) * 6 (+ extra, a lot due to OS#4178): */
1896 timer T := 3.0 * 6.0 + 16.0;
1897 T.start;
1898 alt {
1899 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1900 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
1901 setverdict(pass);
1902 }
1903 [] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1904 /* SGSN currently doesn't send this message because it expects GGSN to be non-reachable anyway */
1905 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1906 log("Received deletePDPContextRequest seq_nr=" & int2str(seq_nr));
1907 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1908 repeat;
1909 }
1910 [] GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1911 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1912 log("Received EchoRequest seq_nr=" & int2str(seq_nr));
1913 repeat;
1914 }
1915 [] T.timeout {
1916 setverdict(fail, "BSSGP DeactPdpReq not received");
1917 mtc.stop;
1918 }
1919 [] as_xid(apars);
1920 }
1921 T.stop
1922
1923 setverdict(pass);
1924}
1925/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1926testcase TC_attach_echo_timeout() runs on test_CT {
1927 var BSSGP_ConnHdlr vc_conn;
1928 g_use_echo := true;
1929 f_init();
1930 vc_conn := f_start_handler(refers(f_TC_attach_echo_timeout), testcasename(), g_gb, 67, 50.0);
1931 vc_conn.done;
1932 g_use_echo := false;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001933 f_cleanup();
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001934}
1935
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001936private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001937 var Gtp1cUnitdata g_ud;
1938 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1939
1940 /* first perform regular attach */
1941 f_TC_attach(id);
1942 /* Activate a pdp context against the GGSN */
1943 f_pdp_ctx_act(apars);
1944 /* Wait to receive first echo request and send initial Restart counter */
1945 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1946 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1947 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1948 }
1949 /* Wait to receive second echo request and send incremented Restart
1950 counter. This will fake a restarted GGSN, and pdp ctx allocated
1951 should be released by SGSN */
1952 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1953 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1954 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1955 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1956 }
1957 var OCT1 cause_network_failure := int2oct(38, 1)
1958 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001959 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001960 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001961 setverdict(pass);
1962 }
1963 [] as_xid(apars);
1964 }
1965 setverdict(pass);
1966}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001967/* ATTACH + trigger Recovery procedure through EchoResp */
1968testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001969 var BSSGP_ConnHdlr vc_conn;
1970 g_use_echo := true
1971 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001972 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 +02001973 vc_conn.done;
1974 g_use_echo := false
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001975 f_cleanup();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001976}
1977
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001978private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1979 var Gtp1cUnitdata g_ud;
1980 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1981 var integer seq_nr := 23;
1982 var GtpPeer peer;
1983 /* first perform regular attach */
1984 f_TC_attach(id);
1985
1986 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1987 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1988 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1989 f_pdp_ctx_act(apars, true);
1990
1991 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1992/* received. */
1993 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1994
1995 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1996 would be great to have an active pdp context here before triggering
1997 Recovery, and making sure the the DEACT request is sent by the SGSN.
1998 */
1999
2000 /* Activate a pdp context against the GGSN, send incremented Recovery
2001 IE. This should trigger the recovery path, but still this specific
2002 CTX activation should work. */
2003 apars.exp_rej_cause := omit; /* default value for tests */
2004 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
2005 f_pdp_ctx_act(apars, true);
2006
2007 setverdict(pass);
2008}
2009/* ATTACH + trigger Recovery procedure through CreatePdpResp */
2010testcase TC_attach_restart_ctr_create() runs on test_CT {
2011 var BSSGP_ConnHdlr vc_conn;
2012 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002013 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 +02002014 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002015 f_cleanup();
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002016}
2017
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002018/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
2019private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
2020 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2021 var integer seq_nr := 23;
2022 var GtpPeer peer;
2023 var integer i;
2024
2025 /* first perform regular attach */
2026 f_TC_attach(id);
2027 /* then activate PDP context */
2028 f_pdp_ctx_act(apars);
2029
Alexander Couzens0e510e62018-07-28 23:06:00 +02002030 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002031 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
2032 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
2033
2034 for (i := 0; i < 5; i := i+1) {
2035 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002036 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002037 [] as_xid(apars);
2038 }
2039 }
2040
2041 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
2042
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002043 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002044 setverdict(pass);
2045}
2046testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
2047 var BSSGP_ConnHdlr vc_conn;
2048 f_init();
2049 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002050 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 +02002051 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002052 f_cleanup();
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002053}
2054
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002055/* ATTACH + PDP CTX ACT dropped + retrans */
2056private function f_TC_attach_pdp_act_deact_gtp_retrans(charstring id) runs on BSSGP_ConnHdlr {
2057 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2058 var Gtp1cUnitdata g_ud_first, g_ud_second;
2059 /* first perform regular attach */
2060 f_TC_attach(id);
2061
2062 /* then activate PDP context on the Gb side */
2063 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
2064 apars.apn, apars.pco), 0);
2065
2066 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_first {}
2067 log("First createPDPContextRequest received, dropping & waiting for retransmission");
2068 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_second {
2069 if (g_ud_first != g_ud_second) {
2070 setverdict(fail, "Retransmitted GTP message createPDPContextRequest is different from original one!");
2071 mtc.stop;
2072 }
2073 f_process_gtp_ctx_act_req(apars, g_ud_second.gtpc);
2074 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
2075 GTP.send(ts_GTPC_CreatePdpResp(g_ud_second.peer, seq_nr,
2076 apars.sgsn_tei_c, apars.gtp_resp_cause,
2077 apars.ggsn_tei_c, apars.ggsn_tei_u,
2078 apars.nsapi,
2079 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
2080 omit, omit));
2081 }
Harald Welte955aa942019-05-03 01:29:29 +02002082 BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT) {}
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002083
2084 /* Now the same with Deact */
2085 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, '00'O, false, omit), 0);
2086 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_first {}
2087 log("First deletePDPContextRequest received, dropping & waiting for retransmission");
2088 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_second {
2089 if (g_ud_first != g_ud_second) {
2090 setverdict(fail, "Retransmitted GTP message deletePDPContextRequest is different from original one!");
2091 mtc.stop;
2092 }
2093 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
2094 BSSGP[0].clear;
2095 GTP.send(ts_GTPC_DeletePdpResp(g_ud_second.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
2096 }
2097 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002098 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002099 setverdict(pass);
2100 }
2101 [] as_xid(apars, 0);
2102 }
2103
2104 setverdict(pass);
2105}
2106testcase TC_attach_pdp_act_deact_gtp_retrans() runs on test_CT {
2107 var BSSGP_ConnHdlr vc_conn;
2108 f_init();
2109 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans), testcasename(), g_gb, 27);
2110 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002111 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002112}
2113
2114/* Test that SGSN GTP response retransmit queue works fine */
2115private function f_TC_attach_pdp_act_deact_gtp_retrans_resp(charstring id) runs on BSSGP_ConnHdlr {
2116 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2117 var integer seq_nr := 23;
2118 var Gtp1cUnitdata g_ud_first, g_ud_second;
2119 var template Gtp1cUnitdata g_delete_req;
2120 /* first perform regular attach + PDP context act */
2121 f_TC_attach(id);
2122 f_pdp_ctx_act(apars);
2123
2124 /* Now perform an MT DeleteCtxReq and emulate GGSN didn't receive response and sends a duplicated DeleteCtxReq */
2125 BSSGP[0].clear;
2126 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
2127 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B);
2128 GTP.send(g_delete_req);
2129 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002130 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002131 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), 0);
2132 }
2133 [] as_xid(apars, 0);
2134 }
2135 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_first {
2136 if (g_ud_first.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != '80'O) {
2137 setverdict(fail, "Received deletePDPContextResponse cause is not 'Request accepted'");
2138 mtc.stop;
2139 }
2140 };
2141
2142 /* Send duplicate DeleteCtxReq */
2143 log("First deletePDPContextResponse received, dropping & retransmitting retransmission of deletePDPContextRequest");
2144 GTP.send(g_delete_req);
2145 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_second {
2146 if (g_ud_first != g_ud_second) {
2147 setverdict(fail, "Retransmitted GTP message deletePDPContextResponse is different from original one!");
2148 mtc.stop;
2149 }
2150 }
2151
2152 /* Let's send now a new DeleteCtxReq (increased seq_nr) to make sure it
2153 * is handled differently by SGSN (expect "non-existent" cause) */
2154 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr + 1, apars.sgsn_tei_c, apars.nsapi, '1'B);
2155 GTP.send(g_delete_req);
2156 /* Response with cause "non-existent" must be sent with TEID 0 according to specs */
2157 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, '00000000'O)) -> value g_ud_second {
2158 if (g_ud_second.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != 'C0'O) {
2159 setverdict(fail, "Received deletePDPContextResponse cause is not 'Non-existent'");
2160 mtc.stop;
2161 }
2162 }
2163
2164 setverdict(pass);
2165}
2166testcase TC_attach_pdp_act_deact_gtp_retrans_resp() runs on test_CT {
2167 var BSSGP_ConnHdlr vc_conn;
2168 f_init();
2169 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans_resp), testcasename(), g_gb, 28);
2170 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002171 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002172}
2173
Alexander Couzens5e307b42018-05-22 18:12:20 +02002174private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
2175 /* MS: perform regular attach */
2176 f_TC_attach(id);
2177
2178 /* HLR: cancel the location request */
2179 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
2180 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02002181
2182 /* ensure no Detach Request got received */
2183 timer T := 5.0;
2184 T.start;
2185 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002186 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(*, *, *)) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002187 T.stop;
2188 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02002189 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002190 }
2191 [] T.timeout {
2192 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02002193 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002194 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02002195 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002196 repeat;
2197 }
2198 }
2199}
2200
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002201/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
2202private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
2203 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2204
2205 /* first perform regular attach */
2206 f_TC_attach(id);
2207 /* then activate PDP context */
2208 f_pdp_ctx_act(apars);
2209 /* then transceive a downlink PDU */
2210 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
2211
2212 /* Send Error indication as response from upload PDU and expect deact towards MS */
2213 f_pdp_ctx_deact_mt(apars, true);
2214}
2215testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
2216 var BSSGP_ConnHdlr vc_conn;
2217 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002218 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 +02002219 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002220 f_cleanup();
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002221}
2222
Alexander Couzens5e307b42018-05-22 18:12:20 +02002223testcase TC_hlr_location_cancel_request_update() runs on test_CT {
2224 /* MS <-> SGSN: GMM Attach
2225 * HLR -> SGSN: Cancel Location Request
2226 * HLR <- SGSN: Cancel Location Ack
2227 */
2228 var BSSGP_ConnHdlr vc_conn;
2229 f_init();
2230 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002231 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02002232 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002233 f_cleanup();
Alexander Couzens5e307b42018-05-22 18:12:20 +02002234}
2235
2236
Alexander Couzensc87967a2018-05-22 16:09:54 +02002237private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
2238 /* MS: perform regular attach */
2239 f_TC_attach(id);
2240
2241 /* HLR: cancel the location request */
2242 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
2243 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
2244 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
2245
2246 /* MS: receive a Detach Request */
Harald Welte955aa942019-05-03 01:29:29 +02002247 BSSGP[0].receive(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002248 f_send_l3(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002249
2250 setverdict(pass);
2251}
2252
2253testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
2254 /* MS <-> SGSN: GMM Attach
2255 * HLR -> SGSN: Cancel Location Request
2256 * HLR <- SGSN: Cancel Location Ack
2257 * MS <- SGSN: Detach Request
2258 * SGSN-> MS: Detach Complete
2259 */
2260 var BSSGP_ConnHdlr vc_conn;
2261 f_init();
2262 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002263 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002264 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002265 f_cleanup();
Alexander Couzensc87967a2018-05-22 16:09:54 +02002266}
2267
2268
Alexander Couzens6c47f292018-05-22 17:09:49 +02002269private function f_hlr_location_cancel_request_unknown_subscriber(
2270 charstring id,
2271 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
2272
2273 /* HLR: cancel the location request */
2274 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
2275
2276 /* cause 2 = IMSI_UNKNOWN */
2277 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
2278
2279 setverdict(pass);
2280}
2281
2282private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002283 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002284}
2285
2286testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
2287 /* HLR -> SGSN: Cancel Location Request
2288 * HLR <- SGSN: Cancel Location Error
2289 */
2290
2291 var BSSGP_ConnHdlr vc_conn;
2292 f_init();
2293 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002294 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 +02002295 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002296 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002297}
2298
2299private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002300 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002301}
2302
2303testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
2304 /* HLR -> SGSN: Cancel Location Request
2305 * HLR <- SGSN: Cancel Location Error
2306 */
2307
2308 var BSSGP_ConnHdlr vc_conn;
2309 f_init();
2310 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002311 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 +02002312 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002313 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002314}
2315
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002316private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
2317 f_TC_attach(id);
2318 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2319}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002320
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002321testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
2322 /* MS <-> SGSN: Attach
2323 * MS -> SGSN: Detach Req (Power off)
2324 * VTY -> SGSN: Check if MS is NOT in subscriber cache
2325 */
2326 var BSSGP_ConnHdlr vc_conn;
2327 var integer id := 33;
2328 var charstring imsi := hex2str(f_gen_imsi(id));
2329
2330 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002331 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002332 vc_conn.done;
2333
2334 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002335 f_cleanup();
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002336}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002337
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002338/* Attempt an attach, but loose the Identification Request (IMEI) */
2339private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
2340 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002341 var MobileIdentityLV mi;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002342
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002343 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 +02002344
2345 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002346 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002347 /* break */
2348 }
Harald Welte955aa942019-05-03 01:29:29 +02002349 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002350 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002351 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002352 repeat;
2353 }
Harald Welte955aa942019-05-03 01:29:29 +02002354 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002355 /* ignore ID REQ IMEI */
2356 count_req := count_req + 1;
2357 repeat;
2358 }
2359 }
2360 if (count_req != 5) {
2361 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002362 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002363 }
2364 setverdict(pass);
2365}
2366
2367testcase TC_attach_no_imei_response() runs on test_CT {
2368 /* MS -> SGSN: Attach Request IMSI
2369 * MS <- SGSN: Identity Request IMSI (optional)
2370 * MS -> SGSN: Identity Response IMSI (optional)
2371 * MS <- SGSN: Identity Request IMEI
2372 * MS -x SGSN: no response
2373 * MS <- SGSN: re-send: Identity Request IMEI 4x
2374 * MS <- SGSN: Attach Reject
2375 */
2376 var BSSGP_ConnHdlr vc_conn;
2377 f_init();
2378 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002379 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 +02002380 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002381 f_cleanup();
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002382}
2383
Alexander Couzens53f20562018-06-12 16:24:12 +02002384/* Attempt an attach, but loose the Identification Request (IMSI) */
2385private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
2386 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002387 var MobileIdentityLV mi;
Alexander Couzens53f20562018-06-12 16:24:12 +02002388
2389 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
2390 g_pars.p_tmsi := 'c0000035'O;
2391
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002392 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 +02002393
2394 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002395 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002396 /* break */
2397 }
Harald Welte955aa942019-05-03 01:29:29 +02002398 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002399 /* ignore ID REQ IMSI */
2400 count_req := count_req + 1;
2401 repeat;
2402 }
Harald Welte955aa942019-05-03 01:29:29 +02002403 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002404 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002405 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02002406 repeat;
2407 }
2408 }
2409 if (count_req != 5) {
2410 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002411 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02002412 }
2413 setverdict(pass);
2414}
2415
2416testcase TC_attach_no_imsi_response() runs on test_CT {
2417 /* MS -> SGSN: Attach Request TMSI (unknown)
2418 * MS <- SGSN: Identity Request IMEI (optional)
2419 * MS -> SGSN: Identity Response IMEI (optional)
2420 * MS <- SGSN: Identity Request IMSI
2421 * MS -x SGSN: no response
2422 * MS <- SGSN: re-send: Identity Request IMSI 4x
2423 * MS <- SGSN: Attach Reject
2424 */
2425 var BSSGP_ConnHdlr vc_conn;
2426 f_init();
2427 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002428 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 +02002429 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002430 f_cleanup();
Alexander Couzens53f20562018-06-12 16:24:12 +02002431}
2432
Alexander Couzenscf818962018-06-05 18:00:00 +02002433private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
2434 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
2435}
2436
2437testcase TC_attach_check_subscriber_list() runs on test_CT {
2438 /* MS <-> SGSN: Attach
2439 * VTY -> SGSN: Check if MS is in subscriber cache
2440 */
2441 var BSSGP_ConnHdlr vc_conn;
2442 var integer id := 34;
2443 var charstring imsi := hex2str(f_gen_imsi(id));
2444
2445 f_init();
2446 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002447 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02002448 vc_conn.done;
2449
2450 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
2451 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002452 f_cleanup();
Alexander Couzenscf818962018-06-05 18:00:00 +02002453}
2454
Alexander Couzensf9858652018-06-07 16:14:53 +02002455private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
2456 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002457 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensf9858652018-06-07 16:14:53 +02002458
2459 /* unregister the old IMSI */
2460 f_bssgp_client_unregister(g_pars.imsi);
2461 /* Simulate a foreign IMSI */
Alexander Couzens03d12242018-08-07 16:13:52 +02002462 g_pars.imsi := '001010123456700'H;
Harald Welte5339b2e2020-10-04 22:52:56 +02002463 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Alexander Couzensf9858652018-06-07 16:14:53 +02002464
2465 /* there is no auth */
2466 g_pars.net.expect_auth := false;
2467
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002468 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02002469 f_gmm_auth();
2470 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002471 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzensf9858652018-06-07 16:14:53 +02002472 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02002473 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02002474 }
Harald Welte955aa942019-05-03 01:29:29 +02002475 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) -> value l3_mt {
2476 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002477 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02002478 setverdict(pass);
2479 }
2480 }
2481}
Alexander Couzens03d12242018-08-07 16:13:52 +02002482
2483private function f_TC_attach_closed_add_vty(charstring id) runs on BSSGP_ConnHdlr {
2484
2485 f_TC_attach_closed_foreign(id);
2486 f_TC_attach_closed_imsi_added(id);
2487
2488}
2489
2490
Alexander Couzensf9858652018-06-07 16:14:53 +02002491testcase TC_attach_closed_add_vty() runs on test_CT {
2492 /* VTY-> SGSN: policy close
2493 * MS -> SGSN: Attach Request
2494 * MS <- SGSN: Identity Request IMSI
2495 * MS -> SGSN: Identity Response IMSI
2496 * MS <- SGSN: Attach Reject
2497 * VTY-> SGSN: policy imsi-acl add IMSI
2498 * MS -> SGSN: Attach Request
2499 * MS <- SGSN: Identity Request IMSI
2500 * MS -> SGSN: Identity Response IMSI
2501 * MS <- SGSN: Identity Request IMEI
2502 * MS -> SGSN: Identity Response IMEI
2503 * MS <- SGSN: Attach Accept
2504 */
2505 var BSSGP_ConnHdlr vc_conn;
2506 f_init();
2507 f_sleep(1.0);
2508 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
2509 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
Alexander Couzens03d12242018-08-07 16:13:52 +02002510 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456700");
2511 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456700");
Alexander Couzensf9858652018-06-07 16:14:53 +02002512 /* test with foreign IMSI: Must Reject */
Alexander Couzens03d12242018-08-07 16:13:52 +02002513 vc_conn := f_start_handler(refers(f_TC_attach_closed_add_vty), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02002514 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002515 f_cleanup();
Alexander Couzensf9858652018-06-07 16:14:53 +02002516}
2517
Alexander Couzens0085bd72018-06-12 19:08:44 +02002518/* Attempt an attach, but never answer a Attach Complete */
2519private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
2520 var integer count_req := 0;
2521
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002522 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 +02002523 f_gmm_auth();
Pau Espin Pedrol4b290a22019-09-10 19:49:41 +02002524 /* Expect SGSN to perform LU with HLR */
2525 f_gmm_gsup_lu_isd();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002526
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002527 timer T := 10.0;
2528 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002529 alt {
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002530 [] T.timeout {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002531 /* break */
2532 }
Harald Welte955aa942019-05-03 01:29:29 +02002533 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002534 /* ignore */
2535 count_req := count_req + 1;
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002536 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002537 repeat;
2538 }
2539 }
2540 if (count_req != 5) {
2541 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02002542 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002543 }
2544 setverdict(pass);
2545}
2546
2547testcase TC_attach_check_complete_resend() runs on test_CT {
2548 /* MS -> SGSN: Attach Request IMSI
2549 * MS <- SGSN: Identity Request *
2550 * MS -> SGSN: Identity Response *
2551 * MS <- SGSN: Attach Complete 5x
2552 */
2553 var BSSGP_ConnHdlr vc_conn;
2554 f_init();
2555 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002556 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 +02002557 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002558 f_cleanup();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002559}
2560
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002561friend function f_routing_area_update(RoutingAreaIdentificationV ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02002562 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002563 var PDU_DTAP_PS_MT mt;
2564 var template OCT4 p_tmsi := omit;
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002565
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002566 if (is_iu(ran_index)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002567 p_tmsi := g_pars.p_tmsi;
2568 }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002569 /* then send RAU */
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002570 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 +02002571 alt {
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002572 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_ACCEPT) -> value l3_mt {
2573 f_process_rau_accept(l3_mt.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2574 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002575 setverdict(pass);
2576 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002577 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_ACCEPT)) -> value mt {
2578 f_process_rau_accept(mt.dtap.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2579 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5d56f522019-09-03 12:36:18 +02002580 setverdict(pass);
2581 }
2582
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002583 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_REJECT) {
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002584 setverdict(fail, "Unexpected RAU Reject");
2585 mtc.stop;
2586 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002587 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_REJECT)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002588 setverdict(fail, "Unexpected RAU Reject");
2589 mtc.stop;
2590 }
2591
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002592 [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 +02002593 key_sts := ?)) {
2594 var IntegrityProtectionAlgorithm uia_chosen := 0; /* 0 = standard_UMTS_integrity_algorithm_UIA1 */
2595 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
Alexander Couzensed61ae82019-09-15 23:18:08 +02002596 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)))
Daniel Willmann1c116112020-01-22 17:48:31 +01002597 repeat;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002598 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002599 [is_gb(ran_index)] BSSGP[ran_index].receive { repeat; }
2600 [is_iu(ran_index)] BSSAP.receive { repeat; }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002601 }
2602}
2603
Alexander Couzensbfda9212018-07-31 03:17:33 +02002604private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbfda9212018-07-31 03:17:33 +02002605 /* first perform regular attach */
2606 f_TC_attach(id);
2607
2608 /* then send RAU */
2609 f_routing_area_update(g_pars.ra);
2610
2611 /* do another RAU */
2612 f_routing_area_update(g_pars.ra);
2613
2614 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2615}
2616
2617testcase TC_attach_rau_a_a() runs on test_CT {
2618 /* MS <-> SGSN: Successful Attach
2619 * MS -> SGSN: Routing Area Update Request
2620 * MS <- SGSN: Routing Area Update Accept
2621 * MS -> SGSN: Routing Area Update Request
2622 * MS <- SGSN: Routing Area Update Accept
2623 * MS -> SGSN: Detach (PowerOff)
2624 */
2625 var BSSGP_ConnHdlr vc_conn;
2626 f_init();
2627 f_sleep(1.0);
2628 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
2629 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002630 f_cleanup();
Alexander Couzensbfda9212018-07-31 03:17:33 +02002631}
2632
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002633private function f_TC_attach_rau_a_b(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002634 f_TC_attach(id);
2635
2636 log("attach complete sending rau");
2637 f_routing_area_update(g_pars.ra, 0);
2638
2639 log("rau complete unregistering");
2640 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte5339b2e2020-10-04 22:52:56 +02002641 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002642
2643 log("sending second RAU via different RA");
2644 f_routing_area_update(f_cellid_to_RAI(g_pars.bssgp_cell_id[1]), 1);
2645
2646 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true, 1);
2647}
2648
2649testcase TC_attach_rau_a_b() runs on test_CT {
2650 /* MS <-> SGSN: Successful Attach
2651 * MS -> SGSN: Routing Area _a_ Update Request
2652 * MS <- SGSN: Routing Area _a_ Update Accept
2653 * MS -> SGSN: Routing Area _b_ Update Request
2654 * MS <- SGSN: Routing Area _b_ Update Accept
2655 * MS -> SGSN: Detach (PowerOff)
2656 */
2657 var BSSGP_ConnHdlr vc_conn;
2658 f_init();
2659 f_sleep(1.0);
2660 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_b), testcasename(), g_gb, 38);
2661 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002662 f_cleanup();
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002663}
2664
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002665private function f_TC_attach_gmm_attach_req_while_gmm_attach(charstring id) runs on BSSGP_ConnHdlr {
2666 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002667 var MobileIdentityLV mi;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002668 var RoutingAreaIdentificationV rand_rai := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002669 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002670
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002671 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002672
2673 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002674 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002675 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2676 mtc.stop;
2677 }
Harald Welte955aa942019-05-03 01:29:29 +02002678 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002679 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002680 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002681 repeat;
2682 }
Harald Welte955aa942019-05-03 01:29:29 +02002683 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002684 /* send out a second GMM_Attach Request.
2685 * If the SGSN follows the rules, this 2nd ATTACH REQ should be ignored, because
2686 * of the same content */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002687 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002688 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002689 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002690 }
2691 }
2692 f_sleep(1.0);
2693
2694 /* we've sent already a IMEI answer, we should NOT asked again for IMEI */
2695 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002696 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002697 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002698 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002699 repeat;
2700 }
Harald Welte955aa942019-05-03 01:29:29 +02002701 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002702 setverdict(fail, "Unexpected GMM ID REQ (IMEI).");
2703 mtc.stop;
2704 }
Harald Welte955aa942019-05-03 01:29:29 +02002705 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002706 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2707 mtc.stop;
2708 }
Harald Welte955aa942019-05-03 01:29:29 +02002709 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2710 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002711 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002712 setverdict(pass);
2713 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
2714 }
2715 }
2716}
2717
2718testcase TC_attach_gmm_attach_req_while_gmm_attach() runs on test_CT {
2719 /* Testing if the SGSN ignore Attach Request with the exact same content */
2720 /* MS -> SGSN: Attach Request IMSI
2721 * MS <- SGSN: Identity Request IMSI (optional)
2722 * MS -> SGSN: Identity Response IMSI (optional)
2723 * MS <- SGSN: Identity Request IMEI
2724 * MS -> SGSN: Attach Request (2nd)
2725 * MS <- SGSN: Identity Response IMEI
2726 * MS <- SGSN: Attach Accept
2727 * MS -> SGSN: Attach Complete
2728 */
2729 var BSSGP_ConnHdlr vc_conn;
2730 f_init();
2731 f_sleep(1.0);
2732 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
2733 vc_conn := f_start_handler(refers(f_TC_attach_gmm_attach_req_while_gmm_attach), testcasename(), g_gb, 39);
2734 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002735 f_cleanup();
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002736}
2737
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002738private function f_TC_attach_usim_resync(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002739 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2740
2741 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2742
2743 /* send Attach Request */
2744 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2745 * 3G auth vectors */
2746 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2747 /* The thing is, if the solSACapability is 'omit', then the
2748 * revisionLevelIndicatior is at the wrong place! */
2749 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002750 f_send_l3(attach_req);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002751
2752 /* do the auth */
2753 var PDU_L3_MS_SGSN l3_mo;
2754 var PDU_L3_SGSN_MS l3_mt;
2755 var default di := activate(as_mm_identity());
2756
2757 var GSUP_IE auth_tuple;
2758 var template AuthenticationParameterAUTNTLV autn;
2759
2760 g_pars.vec := f_gen_auth_vec_3g();
2761 autn := {
2762 elementIdentifier := '28'O,
2763 lengthIndicator := lengthof(g_pars.vec.autn),
2764 autnValue := g_pars.vec.autn
2765 };
2766 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2767 g_pars.vec.sres,
2768 g_pars.vec.kc,
2769 g_pars.vec.ik,
2770 g_pars.vec.ck,
2771 g_pars.vec.autn,
2772 g_pars.vec.res));
2773 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2774 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2775 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2776
2777 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2778 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002779 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002780
2781 /* send the gmm auth failure with resync IE */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002782 f_send_l3(ts_GMM_AUTH_FAIL_UMTS_AKA_RESYNC(g_pars.vec.auts));
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002783
2784 /* wait for the GSUP resync request */
2785 GSUP.receive(tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
2786 g_pars.imsi,
2787 g_pars.vec.auts,
2788 g_pars.vec.rand));
2789
2790 /* generate new key material */
2791 g_pars.vec := f_gen_auth_vec_3g();
2792 autn := {
2793 elementIdentifier := '28'O,
2794 lengthIndicator := lengthof(g_pars.vec.autn),
2795 autnValue := g_pars.vec.autn
2796 };
2797
2798 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2799 g_pars.vec.sres,
2800 g_pars.vec.kc,
2801 g_pars.vec.ik,
2802 g_pars.vec.ck,
2803 g_pars.vec.autn,
2804 g_pars.vec.res));
2805 /* send new key material */
2806 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2807
2808 /* wait for the new Auth Request */
2809 auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2810 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002811 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002812 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
2813 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2814 auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2815 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
2816 valueField := substr(g_pars.vec.res, 0, 4)
2817 };
2818 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
2819 elementIdentifier := '21'O,
2820 lengthIndicator := lengthof(g_pars.vec.res) - 4,
2821 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
2822 };
2823 l3_mo := valueof(auth_ciph_resp);
2824 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
2825 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
2826 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
2827 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
2828 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002829 f_send_l3(l3_mo);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002830 deactivate(di);
2831
2832 /* Expect SGSN to perform LU with HLR */
2833 f_gmm_gsup_lu_isd();
2834
Harald Welte955aa942019-05-03 01:29:29 +02002835 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2836 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002837 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002838 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002839 setverdict(pass);
2840}
2841
2842testcase TC_attach_usim_resync() runs on test_CT {
2843 /* MS -> SGSN: Attach Request
2844 * MS <- SGSN: Identity Request IMSI
2845 * MS -> SGSN: Identity Response IMSI
2846 * MS <- SGSN: Identity Request IMEI
2847 * MS -> SGSN: Identity Response IMEI
2848 * HLR<- SGSN: SAI Request
2849 * HLR-> SGSN: SAI Response
2850 * MS <- SGSN: Auth Request
2851 * MS -> SGSN: Auth Failure (with AUTS)
2852 * HLR<- SGSN: SAI Request (with AUTS & RAND)
2853 * HLR-> SGSN: SAI Response (new key material)
2854 * MS <- SGSN: Auth Request (new key material)
2855 * MS -> SGSN: Auth Response
2856 * MS <- SGSN: Attach Accept
2857 * MS -> SGSN: Attach Complete
2858 */
2859 var BSSGP_ConnHdlr vc_conn;
2860 f_init();
2861 f_sleep(1.0);
2862 vc_conn := f_start_handler(refers(f_TC_attach_usim_resync), testcasename(), g_gb, 40);
2863 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002864 f_cleanup();
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002865}
2866
Eric Wildc555be52021-05-15 19:48:22 +02002867private function f_TC_attach_usim_crypt(OCT1 netcap_a2345, BIT3 auth_req_ciph) runs on BSSGP_ConnHdlr {
2868 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2869
2870 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2871 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.spare_octets := netcap_a2345; /* GEA2345... */
2872
2873 /* send Attach Request */
2874 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2875 * 3G auth vectors */
2876 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2877 /* The thing is, if the solSACapability is 'omit', then the
2878 * revisionLevelIndicatior is at the wrong place! */
2879 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
2880 f_send_l3(attach_req);
2881
2882 /* do the auth */
2883 var PDU_L3_MS_SGSN l3_mo;
2884 var PDU_L3_SGSN_MS l3_mt;
2885 var default di := activate(as_mm_identity());
2886
2887 var GSUP_IE auth_tuple;
2888 var template AuthenticationParameterAUTNTLV autn;
2889
2890 g_pars.vec := f_gen_auth_vec_3g();
2891 autn := {
2892 elementIdentifier := '28'O,
2893 lengthIndicator := lengthof(g_pars.vec.autn),
2894 autnValue := g_pars.vec.autn
2895 };
2896 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2897 g_pars.vec.sres,
2898 g_pars.vec.kc,
2899 g_pars.vec.ik,
2900 g_pars.vec.ck,
2901 g_pars.vec.autn,
2902 g_pars.vec.res));
2903 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2904 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2905 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2906
2907 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand, auth_req_ciph);
2908 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
2909 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
2910
2911 setverdict(pass);
2912 deactivate(di);
2913}
2914
2915private function f_TC_attach_usim_a54_a54(charstring id) runs on BSSGP_ConnHdlr {
2916 f_TC_attach_usim_crypt('10'O, '100'B);
2917}
2918
2919private function f_TC_attach_usim_a54_a53(charstring id) runs on BSSGP_ConnHdlr {
2920 f_TC_attach_usim_crypt('20'O, '011'B);
2921}
2922
2923private function f_TC_attach_usim_a53_a54(charstring id) runs on BSSGP_ConnHdlr {
2924 f_TC_attach_usim_crypt('30'O, '011'B);
2925}
2926
2927private function f_TC_attach_usim_a50_a54(charstring id) runs on BSSGP_ConnHdlr {
2928 f_TC_attach_usim_crypt('30'O, '000'B);
2929}
2930
2931private function f_TC_attach_usim_a54_a50(charstring id) runs on BSSGP_ConnHdlr {
2932 f_TC_attach_usim_crypt('00'O, '000'B);
2933}
2934
2935testcase TC_attach_usim_a54_a54() runs on test_CT {
2936 var BSSGP_ConnHdlr vc_conn;
2937 f_init();
2938 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002939 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02002940 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a54), testcasename(), g_gb, 40);
2941 vc_conn.done;
2942 f_cleanup();
2943}
2944
2945testcase TC_attach_usim_a54_a53() runs on test_CT {
2946 var BSSGP_ConnHdlr vc_conn;
2947 f_init();
2948 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002949 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02002950 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a53), testcasename(), g_gb, 40);
2951 vc_conn.done;
2952 f_cleanup();
2953}
2954
2955testcase TC_attach_usim_a53_a54() runs on test_CT {
2956 var BSSGP_ConnHdlr vc_conn;
2957 f_init();
2958 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002959 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3");
Eric Wildc555be52021-05-15 19:48:22 +02002960 vc_conn := f_start_handler(refers(f_TC_attach_usim_a53_a54), testcasename(), g_gb, 40);
2961 vc_conn.done;
2962 f_cleanup();
2963}
2964
2965testcase TC_attach_usim_a50_a54() runs on test_CT {
2966 var BSSGP_ConnHdlr vc_conn;
2967 f_init();
2968 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002969 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0");
Eric Wildc555be52021-05-15 19:48:22 +02002970 vc_conn := f_start_handler(refers(f_TC_attach_usim_a50_a54), testcasename(), g_gb, 40);
2971 vc_conn.done;
2972 f_cleanup();
2973}
2974
2975testcase TC_attach_usim_a54_a50() runs on test_CT {
2976 var BSSGP_ConnHdlr vc_conn;
2977 f_init();
2978 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002979 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02002980 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a50), testcasename(), g_gb, 40);
2981 vc_conn.done;
2982 f_cleanup();
2983}
Harald Weltea05b8072019-04-23 22:35:05 +02002984
2985/* Send LLC NULL to see if the SGSN survives it (OS#3952) */
2986private function f_TC_llc_null(charstring id) runs on BSSGP_ConnHdlr {
2987 f_gmm_attach(false, false);
2988 f_sleep(1.0);
2989 f_send_llc(ts_LLC_NULL('0'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
2990 /* try to detach to check if SGSN is still alive */
2991 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2992}
2993testcase TC_llc_null() runs on test_CT {
2994 var BSSGP_ConnHdlr vc_conn;
2995 f_init();
2996 f_sleep(1.0);
2997 vc_conn := f_start_handler(refers(f_TC_llc_null), testcasename(), g_gb, 41);
2998 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002999 f_cleanup();
Harald Weltea05b8072019-04-23 22:35:05 +02003000}
3001
Harald Welte645a1512019-04-23 23:18:23 +02003002/* Send LLC SABM to see if the SGSN rejects it properly with DM */
3003private function f_TC_llc_sabm_dm_llgmm(charstring id) runs on BSSGP_ConnHdlr {
3004 f_gmm_attach(false, false);
3005 f_sleep(1.0);
3006 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02003007 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LLGMM, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02003008 setverdict(pass);
3009}
3010testcase TC_llc_sabm_dm_llgmm() runs on test_CT {
3011 var BSSGP_ConnHdlr vc_conn;
3012 f_init();
3013 f_sleep(1.0);
3014 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_llgmm), testcasename(), g_gb, 42);
3015 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003016 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02003017}
3018
3019/* Send LLC SABM to see if the SGSN rejects it properly with DM */
3020private function f_TC_llc_sabm_dm_ll5(charstring id) runs on BSSGP_ConnHdlr {
3021 f_gmm_attach(false, false);
3022 f_sleep(1.0);
3023 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LL5, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02003024 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LL5, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02003025 setverdict(pass);
3026}
3027testcase TC_llc_sabm_dm_ll5() runs on test_CT {
3028 var BSSGP_ConnHdlr vc_conn;
3029 f_init();
3030 f_sleep(1.0);
3031 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_ll5), testcasename(), g_gb, 43);
3032 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003033 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02003034}
3035
Harald Welte2aaac1b2019-05-02 10:02:53 +02003036/* test XID handshake with empty L3 info: expect empty return (some phones require that, OS#3426 */
3037private function f_TC_xid_empty_l3(charstring id) runs on BSSGP_ConnHdlr {
3038 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3039 var template (value) XID_Information xid;
3040 var template XID_Information xid_rx;
3041
3042 /* first perform regular attach */
3043 f_TC_attach(id);
3044 /* then activate PDP context */
3045 f_pdp_ctx_act(apars);
3046
3047 /* start MO XID */
3048 xid := { ts_XID_L3(''O) };
3049 xid_rx := { tr_XID_L3(''O) };
3050 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
3051 alt {
Harald Welte955aa942019-05-03 01:29:29 +02003052 [] BSSGP[0].receive(tr_LLC_XID(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02003053 [] as_xid(apars);
3054 }
3055 setverdict(pass);
3056}
3057testcase TC_xid_empty_l3() runs on test_CT {
3058 var BSSGP_ConnHdlr vc_conn;
3059 f_init();
3060 f_sleep(1.0);
3061 vc_conn := f_start_handler(refers(f_TC_xid_empty_l3), testcasename(), g_gb, 44);
3062 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003063 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02003064}
3065
3066private function f_TC_xid_n201u(charstring id) runs on BSSGP_ConnHdlr {
3067 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3068 var template (value) XID_Information xid;
3069 var template XID_Information xid_rx;
3070
3071 /* first perform regular attach */
3072 f_TC_attach(id);
3073 /* then activate PDP context */
3074 f_pdp_ctx_act(apars);
3075
3076 /* start MO XID */
3077 xid := { ts_XID_N201U(1234) };
3078 xid_rx := { tr_XID_N201U(1234) };
3079 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
3080 alt {
Harald Welte955aa942019-05-03 01:29:29 +02003081 [] BSSGP[0].receive(tr_LLC_XID_MT_RSP(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02003082 [] as_xid(apars);
3083 }
3084 setverdict(pass);
3085}
3086testcase TC_xid_n201u() runs on test_CT {
3087 var BSSGP_ConnHdlr vc_conn;
3088 f_init();
3089 f_sleep(1.0);
3090 vc_conn := f_start_handler(refers(f_TC_xid_n201u), testcasename(), g_gb, 45);
3091 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003092 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02003093}
3094
Alexander Couzens6bee0872019-05-11 01:48:50 +02003095private function f_TC_attach_pdp_act_gmm_detach(charstring id) runs on BSSGP_ConnHdlr {
3096 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3097
3098 /* first perform regular attach */
3099 f_TC_attach(id);
3100 /* then activate PDP context */
3101 f_pdp_ctx_act(apars);
3102 /* do a normal detach */
3103 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
3104}
3105
3106testcase TC_attach_pdp_act_gmm_detach() runs on test_CT {
3107 /* MS -> SGSN: Attach Request
3108 * MS <-> SGSN: [..]
3109 * MS -> SGSN: Attach Complete
3110 * MS -> SGSN: PDP Activate Request
3111 * MS <- SGSN: PDP Activate Accept
3112 * MS -> SGSN: GMM Detach Request
3113 * MS <- SGSN: GMM Detach Accept
3114 */
3115 var BSSGP_ConnHdlr vc_conn;
3116 f_init();
3117 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_gmm_detach), testcasename(), g_gb, 26);
3118 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003119 f_cleanup();
Alexander Couzens6bee0872019-05-11 01:48:50 +02003120}
Harald Welte645a1512019-04-23 23:18:23 +02003121
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003122private function f_TC_attach_req_id_req_ra_update(charstring id) runs on BSSGP_ConnHdlr {
3123 var RoutingAreaIdentificationV old_ra := f_random_RAI();
3124 var RoutingAreaIdentificationV new_ra := f_random_RAI();
3125 while (old_ra == new_ra) { new_ra := f_random_RAI(); };
3126 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
3127 var PDU_L3_SGSN_MS l3_mt;
3128
3129 f_send_l3(attach_req, 0);
3130
3131 BSSGP[0].receive(tr_GMM_ID_REQ(?));
3132
3133 f_send_l3(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, new_ra, false, omit, omit));
3134 alt {
3135 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) {
3136 setverdict(pass);
3137 }
3138 [] BSSGP[0].receive { repeat; }
3139 }
3140}
3141
3142/* This test triggers crash in osmo-sgsn before osmo-sgsn.git I64fa5cf1b427d3abb99e553e584897261a827ce6.
3143 * See OS#3957 and OS#4245 for more information.
3144 */
3145testcase TC_attach_req_id_req_ra_update() runs on test_CT {
3146 /*
3147 * MS --> SGSN: Attach Req (TMSI, RAI=901-70-356-101)
3148 * MS <-- SGSN: Identity Request (IMEI)
3149 * MS --> SGSN: RA Updating (RAI=901-70-2758-208)
3150 */
3151 var BSSGP_ConnHdlr vc_conn;
3152 f_init();
3153 vc_conn := f_start_handler(refers(f_TC_attach_req_id_req_ra_update), testcasename(), g_gb, 47);
3154 vc_conn.done;
3155 f_cleanup();
3156}
3157
Harald Welte8e5932e2020-06-17 22:12:54 +02003158private altstep as_nopaging_ps(integer ran_idx := 0) runs on BSSGP_ConnHdlr {
3159var PDU_BSSGP rx;
3160[] BSSGP_SIG[ran_idx].receive(tr_BSSGP_PS_PAGING(?)) -> value rx {
3161 setverdict(fail, "Received unexpected PS PAGING: ", rx);
3162 mtc.stop;
3163 }
3164}
3165
3166/* SUSPEND, then DL traffic: should not pass + no paging expected */
3167private function f_TC_suspend_nopaging(charstring id) runs on BSSGP_ConnHdlr {
3168 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3169 var default d;
3170
3171 /* first perform regular attach */
3172 f_TC_attach(id);
3173 /* then activate PDP context */
3174 f_pdp_ctx_act(apars);
3175 /* then transceive a downlink PDU */
3176 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3177
3178 /* now suspend GPRS */
3179 f_bssgp_suspend();
3180
3181 d := activate(as_nopaging_ps());
3182
3183 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3184 * nor any related paging requests */
3185 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3186
3187 deactivate(d);
3188}
3189testcase TC_suspend_nopaging() runs on test_CT {
3190 var BSSGP_ConnHdlr vc_conn;
3191 f_init();
3192 f_sleep(1.0);
3193 vc_conn := f_start_handler(refers(f_TC_suspend_nopaging), testcasename(), g_gb, 48);
3194 vc_conn.done;
3195 f_cleanup();
3196}
3197
3198
3199/* SUSPEND, then RESUME: data expected to flow after explicit resume */
3200private function f_TC_suspend_resume(charstring id) runs on BSSGP_ConnHdlr {
3201 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3202 var OCT1 susp_ref;
3203 var default d;
3204
3205 /* first perform regular attach */
3206 f_TC_attach(id);
3207 /* then activate PDP context */
3208 f_pdp_ctx_act(apars);
3209 /* then transceive a downlink PDU */
3210 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3211
3212 /* now suspend GPRS */
3213 susp_ref := f_bssgp_suspend();
3214
3215 d := activate(as_nopaging_ps());
3216
3217 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3218 * nor any related paging requests */
3219 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3220
3221 deactivate(d);
3222
3223 /* resume GPRS */
3224 f_bssgp_resume(susp_ref);
3225
3226 /* now data should be flowing again */
3227 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3228}
3229testcase TC_suspend_resume() runs on test_CT {
3230 var BSSGP_ConnHdlr vc_conn;
3231 f_init();
3232 f_sleep(1.0);
3233 vc_conn := f_start_handler(refers(f_TC_suspend_resume), testcasename(), g_gb, 49);
3234 vc_conn.done;
3235 f_cleanup();
3236}
3237
3238/* SUSPEND, then RAU: data expected to flow after implicit resume */
3239private function f_TC_suspend_rau(charstring id) runs on BSSGP_ConnHdlr {
3240 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3241 var default d;
3242
3243 /* first perform regular attach */
3244 f_TC_attach(id);
3245 /* then activate PDP context */
3246 f_pdp_ctx_act(apars);
3247 /* then transceive a downlink PDU */
3248 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3249
3250 /* now suspend GPRS */
3251 f_bssgp_suspend();
3252
3253 d := activate(as_nopaging_ps());
3254
3255 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3256 * nor any related paging requests */
3257 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3258
3259 deactivate(d);
3260
3261 /* perform RAU (implicit RESUME) */
3262 f_routing_area_update(g_pars.ra);
3263
Harald Welted5836dc2021-03-20 15:40:00 +01003264 /* give SGSN some time to actually receve + process the RAU Complete we sent */
3265 f_sleep(0.5);
3266
Harald Welte8e5932e2020-06-17 22:12:54 +02003267 /* now data should be flowing again */
3268 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3269
3270}
3271testcase TC_suspend_rau() runs on test_CT {
3272 var BSSGP_ConnHdlr vc_conn;
3273 f_init();
3274 f_sleep(1.0);
3275 vc_conn := f_start_handler(refers(f_TC_suspend_rau), testcasename(), g_gb, 50);
3276 vc_conn.done;
3277 f_cleanup();
3278}
3279
3280
3281/* wait for T3314 expiration and check that PS PAGING is created on DL PDU */
3282private function f_TC_paging_ps(charstring id) runs on BSSGP_ConnHdlr {
3283 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3284 var default d;
3285
3286 /* first perform regular attach */
3287 f_TC_attach(id);
3288 /* then activate PDP context */
3289 f_pdp_ctx_act(apars);
3290 /* then transceive a downlink PDU */
3291 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3292
3293 /* now wait for T3314 expiration (test_CT below has reduced it to 3s) */
3294 f_sleep(5.0);
3295
3296 /* now data should be flowing again, but with PS PAGING */
3297 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3298 BSSGP_SIG[0].receive(tr_BSSGP_PS_PAGING(?));
3299
3300 /* FIXME: simulate paging response */
3301 /* FIXME: verify PDU actually arrives only after paging response was successful */
3302
3303}
3304testcase TC_paging_ps() runs on test_CT {
3305 var BSSGP_ConnHdlr vc_conn;
3306 f_init();
3307 f_vty_config(SGSNVTY, "sgsn", "timer 3314 3");
3308 f_sleep(1.0);
3309 vc_conn := f_start_handler(refers(f_TC_paging_ps), testcasename(), g_gb, 51);
3310 vc_conn.done;
3311 f_vty_config(SGSNVTY, "sgsn", "timer 3314 default");
3312 f_cleanup();
3313}
3314
Philipp Maier7df55e02020-12-14 23:46:04 +01003315/* Run a RIM single report procedure over the sgsn. Since the SGSN will only do a transparent routing of the
3316 * RIM messages this basically tests if the message is correctly transfered from one GB interface to the
3317 * other and vice versa. */
3318testcase TC_bssgp_rim_single_report() runs on test_CT {
3319 var BSSGP_ConnHdlr vc_conn;
3320 f_init();
Philipp Maier7df55e02020-12-14 23:46:04 +01003321
3322 timer T := 2.0;
3323
3324 var template RIM_Routing_Address dst_addr;
3325 var template RIM_Routing_Address src_addr;
3326 var template RAN_Information_Request_RIM_Container req_cont;
3327 var template RAN_Information_RIM_Container res_cont;
3328 var template PDU_BSSGP bssgp_rim_pdu;
3329 var template PDU_BSSGP bssgp_rim_pdu_expect;
3330
3331 dst_addr := t_RIM_Routing_Address_cid(g_gb[1].cfg.bvc[0].cell_id);
3332 src_addr := t_RIM_Routing_Address_cid(g_gb[0].cfg.bvc[0].cell_id);
Harald Welte8e5932e2020-06-17 22:12:54 +02003333
3334
Philipp Maier7df55e02020-12-14 23:46:04 +01003335 /* Send NACC Ran information request to SGSN at GB interface #0. We epect the SGSN to forward this request
3336 * based on the cell id in dst_addr to GB interface #1. */
3337 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3338 ts_RIM_Sequence_Number(1),
3339 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3340 ts_RIM_Protocol_Version_Number(1),
3341 tsu_RAN_Information_Request_Application_Container_NACC(g_gb[1].cfg.bvc[0].cell_id),
3342 omit);
3343 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3344 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3345 req_cont);
3346 bssgp_rim_pdu_expect := tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3347 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3348 tr_RAN_Information_Request_RIM_Container);
3349 RIM[0].send(bssgp_rim_pdu);
3350 T.start;
3351 alt {
Vadim Yanitskiy418e8062021-02-28 16:27:12 +01003352 [] RIM[1].receive(bssgp_rim_pdu_expect) {
3353 setverdict(pass);
3354 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003355 [] RIM[1].receive {
3356 setverdict(fail, "Unexpected BSSGP RIM PDU received");
Philipp Maier7df55e02020-12-14 23:46:04 +01003357 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003358 [] T.timeout {
3359 setverdict(fail, "No BSSGP RIM PDU received");
3360 mtc.stop;
Philipp Maier7df55e02020-12-14 23:46:04 +01003361 }
3362 }
Harald Welte8e5932e2020-06-17 22:12:54 +02003363
Philipp Maier7df55e02020-12-14 23:46:04 +01003364 /* Now also emulate also the response as well and send it back on GB interface #1. Expect the result on
3365 * GB interface #0 */
Philipp Maier7df55e02020-12-14 23:46:04 +01003366 res_cont := ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3367 ts_RIM_Sequence_Number(2),
3368 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3369 ts_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003370 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(g_gb[0].cfg.bvc[0].cell_id, false, 3, si_default)),
Philipp Maier7df55e02020-12-14 23:46:04 +01003371 omit);
3372 bssgp_rim_pdu := ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3373 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3374 res_cont);
3375 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3376 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3377 ?);
3378 RIM[1].send(bssgp_rim_pdu);
3379 T.start;
3380 alt {
Vadim Yanitskiy418e8062021-02-28 16:27:12 +01003381 [] RIM[0].receive(bssgp_rim_pdu_expect) {
3382 setverdict(pass);
3383 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003384 [] RIM[0].receive {
3385 setverdict(fail, "Unexpected BSSGP RIM PDU received");
Philipp Maier7df55e02020-12-14 23:46:04 +01003386 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003387 [] T.timeout {
3388 setverdict(fail, "No BSSGP RIM PDU received");
3389 mtc.stop;
Philipp Maier7df55e02020-12-14 23:46:04 +01003390 }
3391 }
3392
3393 f_cleanup();
3394}
Harald Welte8e5932e2020-06-17 22:12:54 +02003395
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003396testcase TC_rim_eutran_to_geran() runs on test_CT {
3397 var BSSGP_ConnHdlr vc_conn;
3398 f_init();
3399 /* connect RIM related port */
3400 connect(vc_GTP:CLIENT_DEFAULT, self:GTPC);
3401
3402 var GtpPeer peer := {
3403 connId := 1,
3404 remName := mp_sgsn_gtp_ip,
3405 remPort := GTP1C_PORT
3406 }
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003407 var GTP_CellId gtp_ci := f_BssgpCellId_to_GTP_CellId(g_gb[1].cfg.bvc[0].cell_id);
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003408
3409 var template (value) RIM_Routing_Address_GTPC gtpc_dst_addr, gtpc_src_addr;
3410 var template (value) RAN_Information_Request_RIM_Container_GTPC gtpc_rim_req_cont;
3411 var template (value) PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC gtpc_bssgp_cont;
3412 var template (value) Gtp1cUnitdata gtpc_pdu;
3413
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003414 gtpc_dst_addr := t_GTPC_RIM_Routing_Address_cid(gtp_ci);
3415 gtpc_src_addr := t_GTPC_RIM_Routing_Address_enbid(gtp_ci, tac := 3, gnbid := '12345678123456'O);
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003416
3417 gtpc_rim_req_cont := ts_GTPC_RAN_Information_Request_RIM_Container(ts_GTPC_RIM_Application_Identity(RIM_APP_ID_NACC),
3418 ts_GTPC_RIM_Sequence_Number(1),
3419 ts_GTPC_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3420 ts_GTPC_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003421 tsu_GTPC_RAN_Information_Request_Application_Container_NACC(gtp_ci),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003422 omit);
3423 gtpc_bssgp_cont := ts_GTPC_RAN_Information_Request(ts_GTPC_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, gtpc_dst_addr),
3424 ts_GTPC_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, gtpc_src_addr),
3425 gtpc_rim_req_cont);
3426 gtpc_pdu := ts_GTPC_RANInfoRelay(peer, ts_RANTransparentContainer_RAN_INFO_REQ(gtpc_bssgp_cont));
3427 GTPC.send(gtpc_pdu);
3428
3429 var template RIM_Routing_Address bssgp_dst_addr, bssgp_src_addr;
3430 var template PDU_BSSGP bssgp_rim_pdu_expect;
3431 bssgp_dst_addr := t_RIM_Routing_Address_cid(g_gb[1].cfg.bvc[0].cell_id);
3432 bssgp_src_addr := t_RIM_Routing_Address_enbid(g_gb[1].cfg.bvc[0].cell_id, tac := 3, gnbid := '12345678123456'O);
3433 bssgp_rim_pdu_expect := tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bssgp_dst_addr),
3434 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, bssgp_src_addr),
3435 tr_RAN_Information_Request_RIM_Container);
3436 timer T := 2.0;
3437 T.start;
3438 alt {
3439 [] RIM[1].receive(bssgp_rim_pdu_expect) {
3440 setverdict(pass);
3441 T.stop;
3442 }
3443 [] RIM[1].receive {
3444 setverdict(fail, "Unexpected BSSGP RIM PDU received");
3445 }
3446 [] T.timeout {
3447 setverdict(fail, "No BSSGP RIM PDU received");
3448 mtc.stop;
3449 }
3450 }
3451
3452 /* Now also emulate also the response as well and send it back on GB
3453 interface #1. Expect the result on * GTPC */
3454 var template RAN_Information_RIM_Container res_cont;
3455 var template PDU_BSSGP bssgp_rim_pdu;
3456 res_cont := ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3457 ts_RIM_Sequence_Number(2),
3458 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3459 ts_RIM_Protocol_Version_Number(1),
3460 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(g_gb[1].cfg.bvc[0].cell_id, false, 3, si_default)),
3461 omit);
3462 bssgp_rim_pdu := ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, bssgp_src_addr),
3463 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bssgp_dst_addr),
3464 res_cont);
3465 RIM[1].send(bssgp_rim_pdu);
3466
3467 var template RAN_Information_RIM_Container_GTPC rim_cont;
3468 var template PDU_BSSGP_RAN_INFORMATION_GTPC gtpc_bssgp_cont_ack;
3469 var template Gtp1cUnitdata gtpc_pdu_exp;
3470 rim_cont := tr_GTPC_RAN_Information_RIM_Container(ts_GTPC_RIM_Application_Identity(RIM_APP_ID_NACC),
3471 ts_GTPC_RIM_Sequence_Number(2),
3472 ts_GTPC_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3473 ts_GTPC_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003474 tru_GTPC_ApplContainer_or_ApplErrContainer_NACC(tru_GTPC_ApplContainer_NACC(gtp_ci, false, 3, si_default)),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003475 omit);
3476 gtpc_bssgp_cont_ack := tr_GTPC_RAN_Information(tr_GTPC_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, gtpc_src_addr),
3477 tr_GTPC_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, gtpc_dst_addr),
3478 rim_cont);
3479 gtpc_pdu_exp := tr_GTPC_RANInfoRelay(peer, tr_RANTransparentContainer_RAN_INFO(gtpc_bssgp_cont_ack));
3480
3481 T.start;
3482 alt {
3483 [] GTPC.receive(gtpc_pdu_exp) {
3484 setverdict(pass);
3485 T.stop;
3486 }
3487 [] GTPC.receive {
3488 setverdict(fail, "Unexpected GTPC RIM PDU received");
3489 }
3490 [] T.timeout {
3491 setverdict(fail, "No GTPC RIM PDU received");
3492 mtc.stop;
3493 }
3494 }
3495
3496 f_cleanup();
3497}
3498
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01003499/* Test if the SGSN routes traffic to new cell after the MS attached to it */
3500private function f_TC_cell_change_different_rai_ci_attach(charstring id) runs on BSSGP_ConnHdlr {
3501 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3502
3503 /* first perform regular attach */
3504 f_gmm_attach(false, false, ran_index := 0);
3505 /* then activate PDP context */
3506 f_pdp_ctx_act(apars, ran_index := 0);
3507 /* then transceive a downlink PDU */
3508 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3509 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 0);
3510
3511 /* Now attach on different cell: */
3512 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3513 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3514 g_pars.net.expect_auth := false;
3515 f_gmm_attach(false, false, ran_index := 1, old_ra := f_cellid_to_RAI(g_pars.bssgp_cell_id[0]));
3516 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3517 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1, n_u := 1);
3518}
3519testcase TC_cell_change_different_rai_ci_attach() runs on test_CT {
3520 var BSSGP_ConnHdlr vc_conn;
3521 f_init();
3522 vc_conn := f_start_handler(refers(f_TC_cell_change_different_rai_ci_attach), testcasename(), g_gb, 68);
3523 vc_conn.done;
3524 f_cleanup();
3525}
3526
3527/* Test if the SGSN routes traffic to new cell after the MS attached to it */
3528/* Assumption: g_gb[1] and g_gb[2] configured with same RAC */
3529private function f_TC_cell_change_different_ci_attach(charstring id) runs on BSSGP_ConnHdlr {
3530 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3531
3532 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3533 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3534
3535 /* first perform regular attach */
3536 f_gmm_attach(false, false, ran_index := 1);
3537 /* then activate PDP context */
3538 f_pdp_ctx_act(apars, ran_index := 1);
3539 /* then transceive a downlink PDU */
3540 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3541 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1);
3542
3543 /* Now attach on different cell: */
3544 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3545 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[2]);
3546 g_pars.net.expect_auth := false;
3547 f_gmm_attach(false, false, ran_index := 2, old_ra := f_cellid_to_RAI(g_pars.bssgp_cell_id[1]));
3548 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 2);
3549 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 2, n_u := 1);
3550}
3551testcase TC_cell_change_different_ci_attach() runs on test_CT {
3552 var BSSGP_ConnHdlr vc_conn;
3553 f_init();
3554 vc_conn := f_start_handler(refers(f_TC_cell_change_different_ci_attach), testcasename(), g_gb, 69);
3555 vc_conn.done;
3556 f_cleanup();
3557}
3558
3559/* Test if the SGSN silently drops MO data message coming from new BVCI if RAC changed (eg. cell change) */
3560private function f_TC_cell_change_different_rai_ci_data(charstring id) runs on BSSGP_ConnHdlr {
3561 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3562
3563 /* first perform regular attach */
3564 f_gmm_attach(false, false, ran_index := 0);
3565 /* then activate PDP context */
3566 f_pdp_ctx_act(apars, ran_index := 0);
3567 /* then transceive a downlink PDU */
3568 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3569 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 0);
3570
3571 /* Send some data over new bvci, it should be silently discarded since
3572 * RAC changed and SGSN expects a RAU to occur in that case */
3573 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3574 var octetstring payload := f_rnd_octstring(200);
3575 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
3576 BSSGP[1].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 1));
3577 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
3578 timer T := 2.0;
3579 T.start;
3580 alt {
3581 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload)) {
3582 setverdict(fail, "Unexpected GTP message");
3583 }
3584 [] T.timeout { setverdict(pass); }
3585 }
3586
3587 /* Expect SGSN to continue routing DL data to last known NSEI+BVCI */
3588 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3589 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3590}
3591testcase TC_cell_change_different_rai_ci_data() runs on test_CT {
3592 var BSSGP_ConnHdlr vc_conn;
3593 f_init();
3594 vc_conn := f_start_handler(refers(f_TC_cell_change_different_rai_ci_data), testcasename(), g_gb, 70);
3595 vc_conn.done;
3596 f_cleanup();
3597}
3598
3599/* Test if the SGSN routes traffic to new cell after the MS switched cell without re-attaching */
3600/* Assumption: g_gb[1] and g_gb[2] configured with same RAC */
3601private function f_TC_cell_change_different_ci_data(charstring id) runs on BSSGP_ConnHdlr {
3602 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3603
3604 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3605 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3606
3607 /* first perform regular attach */
3608 f_gmm_attach(false, false, ran_index := 1);
3609 /* then activate PDP context */
3610 f_pdp_ctx_act(apars, ran_index := 1);
3611 /* then transceive a downlink PDU */
3612 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3613 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1);
3614
3615 /* Now attach on different cell: */
3616 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3617 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[2]);
3618
3619 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 2, n_u := 1);
3620 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 2);
3621}
3622testcase TC_cell_change_different_ci_data() runs on test_CT {
3623 var BSSGP_ConnHdlr vc_conn;
3624 f_init();
3625 vc_conn := f_start_handler(refers(f_TC_cell_change_different_ci_data), testcasename(), g_gb, 71);
3626 vc_conn.done;
3627 f_cleanup();
3628}
3629
Harald Welte5ac31492018-02-15 20:39:13 +01003630control {
Harald Welte5b7c8122018-02-16 21:48:17 +01003631 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01003632 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02003633 execute( TC_attach_umts_aka_umts_res() );
3634 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01003635 execute( TC_attach_auth_id_timeout() );
3636 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01003637 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01003638 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01003639 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01003640 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01003641 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01003642 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02003643 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02003644 execute( TC_attach_no_imsi_response() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02003645 execute( TC_attach_closed_add_vty(), 20.0 );
3646 execute( TC_attach_check_subscriber_list(), 20.0 );
3647 execute( TC_attach_detach_check_subscriber_list(), 20.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02003648 execute( TC_attach_check_complete_resend() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02003649 execute( TC_hlr_location_cancel_request_update(), 20.0 );
3650 execute( TC_hlr_location_cancel_request_withdraw(), 20.0 );
3651 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 20.0 );
3652 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 20.0 );
Harald Welte04683d02018-02-16 22:43:45 +01003653 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01003654 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02003655 execute( TC_attach_rau_a_a() );
Alexander Couzensbe837bd2018-07-31 04:20:11 +02003656 execute( TC_attach_rau_a_b() );
Alexander Couzens0c6324f2018-09-14 16:37:04 +02003657 execute( TC_attach_usim_resync() );
Eric Wildc555be52021-05-15 19:48:22 +02003658 execute( TC_attach_usim_a54_a54() );
3659 execute( TC_attach_usim_a54_a53() );
3660 execute( TC_attach_usim_a53_a54() );
3661 execute( TC_attach_usim_a50_a54() );
3662 execute( TC_attach_usim_a54_a50() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01003663 execute( TC_detach_unknown_nopoweroff() );
3664 execute( TC_detach_unknown_poweroff() );
3665 execute( TC_detach_nopoweroff() );
3666 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01003667 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01003668 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01003669 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01003670 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01003671 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01003672 execute( TC_attach_pdp_act_user_deact_mt() );
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02003673 execute( TC_attach_pdp_act_deact_dup() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02003674 execute( TC_attach_second_attempt() );
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02003675 execute( TC_attach_echo_timeout() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02003676 execute( TC_attach_restart_ctr_echo() );
3677 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02003678 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02003679 execute( TC_attach_pdp_act_deact_gtp_retrans() );
3680 execute( TC_attach_pdp_act_deact_gtp_retrans_resp() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02003681 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Alexander Couzens6bee0872019-05-11 01:48:50 +02003682 execute( TC_attach_pdp_act_gmm_detach() );
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02003683 execute( TC_attach_gmm_attach_req_while_gmm_attach() );
Harald Weltea05b8072019-04-23 22:35:05 +02003684
Harald Welte2aaac1b2019-05-02 10:02:53 +02003685 execute( TC_xid_empty_l3() );
3686 execute( TC_xid_n201u() );
3687
Harald Weltea05b8072019-04-23 22:35:05 +02003688 execute( TC_llc_null() );
Harald Welte645a1512019-04-23 23:18:23 +02003689 execute( TC_llc_sabm_dm_llgmm() );
3690 execute( TC_llc_sabm_dm_ll5() );
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003691
Harald Welte8e5932e2020-06-17 22:12:54 +02003692 execute( TC_suspend_nopaging() );
3693 execute( TC_suspend_resume() );
3694 execute( TC_suspend_rau() );
3695 execute( TC_paging_ps() );
3696
Philipp Maier7df55e02020-12-14 23:46:04 +01003697 execute( TC_bssgp_rim_single_report() );
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003698 execute( TC_rim_eutran_to_geran() );
Philipp Maier7df55e02020-12-14 23:46:04 +01003699
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01003700 execute( TC_cell_change_different_rai_ci_attach() );
3701 execute( TC_cell_change_different_rai_ci_data() );
3702 execute( TC_cell_change_different_ci_attach() );
3703 execute( TC_cell_change_different_ci_data() );
3704
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003705 /* At the end, may crash osmo-sgsn, see OS#3957, OS#4245 */
3706 execute( TC_attach_req_id_req_ra_update() );
Harald Welte5ac31492018-02-15 20:39:13 +01003707}
Harald Welte96a33b02018-02-04 10:36:22 +01003708
3709
3710
3711}