blob: 3386f7122130e125c3d74368131ec0088bc4e33a [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 {
260 gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset));
261 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset));
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,
460 sccp_addr_local := omit,
461 sccp_addr_peer := omit
462};
463
Harald Welte5ac31492018-02-15 20:39:13 +0100464type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
465
466/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Alexander Couzens51114d12018-07-31 18:41:56 +0200467function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix,
Harald Welte62e29582018-02-16 21:17:11 +0100468 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100469runs on test_CT return BSSGP_ConnHdlr {
470 var BSSGP_ConnHdlr vc_conn;
471 var SGSN_ConnHdlrNetworkPars net_pars := {
472 expect_ptmsi := true,
473 expect_auth := true,
474 expect_ciph := false
475 };
476 var BSSGP_ConnHdlrPars pars := {
477 imei := f_gen_imei(imsi_suffix),
478 imsi := f_gen_imsi(imsi_suffix),
479 msisdn := f_gen_msisdn(imsi_suffix),
480 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100481 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100482 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100483 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100484 ra := omit,
Harald Welte5339b2e2020-10-04 22:52:56 +0200485 bssgp_cell_id := {
486 gb[0].cfg.bvc[0].cell_id,
487 gb[1].cfg.bvc[0].cell_id,
488 gb[2].cfg.bvc[0].cell_id
489 },
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200490 rnc_send_initial_ue := true,
Harald Welte5ac31492018-02-15 20:39:13 +0100491 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100492 net := net_pars,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200493 t_guard := t_guard,
Alexander Couzens1552e792019-07-23 20:38:39 +0200494 sccp_addr_local := omit,
495 sccp_addr_peer := omit
Harald Welte5ac31492018-02-15 20:39:13 +0100496 };
497
Alexander Couzens1552e792019-07-23 20:38:39 +0200498 if (g_ranap_enable) {
499 pars.sccp_addr_local := g_ranap[0].sccp_addr_own;
500 pars.sccp_addr_peer := g_ranap[0].sccp_addr_peer;
501 }
502
Harald Welte5ac31492018-02-15 20:39:13 +0100503 vc_conn := BSSGP_ConnHdlr.create(id);
Harald Welte5339b2e2020-10-04 22:52:56 +0200504
505 connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_SP);
506 connect(vc_conn:BSSGP_SIG[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
507 connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100508 connect(vc_conn:BSSGP_GLOBAL[0], gb[0].vc_BSSGP:GLOBAL);
Harald Welte5339b2e2020-10-04 22:52:56 +0200509
510 connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_SP);
511 connect(vc_conn:BSSGP_SIG[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
512 connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100513 connect(vc_conn:BSSGP_GLOBAL[1], gb[1].vc_BSSGP:GLOBAL);
Harald Welte5339b2e2020-10-04 22:52:56 +0200514
515 connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_SP);
516 connect(vc_conn:BSSGP_SIG[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
517 connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100518 connect(vc_conn:BSSGP_GLOBAL[2], gb[2].vc_BSSGP:GLOBAL);
Harald Welte5ac31492018-02-15 20:39:13 +0100519
Harald Welte26fbb6e2019-04-14 17:32:46 +0200520 /* FIXME: support multiple RNCs */
Alexander Couzens1552e792019-07-23 20:38:39 +0200521 if (g_ranap_enable) {
522 connect(vc_conn:BSSAP, g_ranap[0].vc_RAN:CLIENT);
523 connect(vc_conn:BSSAP_PROC, g_ranap[0].vc_RAN:PROC);
524 }
Harald Welte26fbb6e2019-04-14 17:32:46 +0200525
Harald Welte5ac31492018-02-15 20:39:13 +0100526 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
527 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
528
Harald Welteeded9ad2018-02-17 20:57:34 +0100529 connect(vc_conn:GTP, vc_GTP:CLIENT);
530 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
531
Harald Welte5ac31492018-02-15 20:39:13 +0100532 vc_conn.start(f_handler_init(fn, id, pars));
533 return vc_conn;
534}
535
Harald Welte62e29582018-02-16 21:17:11 +0100536private altstep as_Tguard() runs on BSSGP_ConnHdlr {
537 [] g_Tguard.timeout {
538 setverdict(fail, "Tguard timeout");
Daniel Willmannafce8662018-07-06 23:11:32 +0200539 mtc.stop;
Harald Welte62e29582018-02-16 21:17:11 +0100540 }
541}
542
Harald Welte5ac31492018-02-15 20:39:13 +0100543/* first function called in every ConnHdlr */
544private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
545runs on BSSGP_ConnHdlr {
546 /* do some common stuff like setting up g_pars */
547 g_pars := pars;
548
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200549 llc := f_llc_create(false);
550
Harald Welte5ac31492018-02-15 20:39:13 +0100551 /* register with BSSGP core */
Harald Welte5339b2e2020-10-04 22:52:56 +0200552 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Harald Welte5ac31492018-02-15 20:39:13 +0100553 /* tell GSUP dispatcher to send this IMSI to us */
554 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100555 /* tell GTP dispatcher to send this IMSI to us */
556 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100557
Harald Welte62e29582018-02-16 21:17:11 +0100558 g_Tguard.start(pars.t_guard);
559 activate(as_Tguard());
560
Harald Welte5ac31492018-02-15 20:39:13 +0100561 /* call the user-supplied test case function */
562 fn.apply(id);
563 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100564}
565
566/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100567 * Detach without Attach
568 * SM procedures without attach / RAU
569 * ATTACH / RAU
570 ** with / without authentication
571 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100572 * re-transmissions of LLC frames
573 * PDP Context activation
574 ** with different GGSN config in SGSN VTY
575 ** with different PDP context type (v4/v6/v46)
576 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100577 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100578 */
579
580testcase TC_wait_ns_up() runs on test_CT {
581 f_init();
582 f_sleep(20.0);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200583 f_cleanup();
Harald Welte96a33b02018-02-04 10:36:22 +0100584}
585
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200586friend function is_gb(integer ran_index) return boolean {
587 return ran_index < NUM_GB;
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200588}
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200589friend function is_iu(integer ran_index) return boolean {
590 return ran_index >= NUM_GB;
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200591}
592
Alexander Couzens0507ec32019-09-15 22:41:22 +0200593function f_send_llc(template (value) PDU_LLC llc_pdu, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltea05b8072019-04-23 22:35:05 +0200594 var octetstring llc_enc := enc_PDU_LLC(valueof(llc_pdu));
Alexander Couzens0507ec32019-09-15 22:41:22 +0200595 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 +0200596}
597
Alexander Couzens0507ec32019-09-15 22:41:22 +0200598private 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 +0200599 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
600 var BIT4 sapi := f_llc_sapi_by_l3_mo(valueof(l3_mo));
601 var integer n_u := f_llc_get_n_u_tx(llc[bit2int(sapi)]);
Alexander Couzens0507ec32019-09-15 22:41:22 +0200602 f_send_llc(ts_LLC_UI(l3_enc, sapi, '0'B, n_u), ran_index);
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200603}
604
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200605/* trigger sending of a RANAP InitialUE and wait for SCCP connection confirmation */
606function f_send_l3_initial_ue(template (value) PDU_L3_MS_SGSN l3_mo) runs on BSSGP_ConnHdlr {
607 log("Sending InitialUE: ", l3_mo);
608 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
609 var RANAP_PDU ranap;
610 var LAI lai := {
611 pLMNidentity := '62F224'O,
612 lAC := '1234'O,
613 iE_Extensions := omit
614 };
615 var SAI sai := {
616 pLMNidentity := lai.pLMNidentity,
617 lAC := lai.lAC,
618 sAC := '0000'O, /* FIXME */
619 iE_Extensions := omit
620 };
621 var IuSignallingConnectionIdentifier sigc_id := int2bit(23, 24); /* FIXME */
622 var GlobalRNC_ID grnc_id := {
623 pLMNidentity := lai.pLMNidentity,
624 rNC_ID := 2342 /* FIXME */
625 };
626
627 ranap := valueof(ts_RANAP_initialUE_CS(lai, sai, l3_enc, sigc_id, grnc_id));
628 BSSAP.send(ts_RANAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_local, ranap));
629 alt {
630 [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {}
631 [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
632 setverdict(fail, "DISC.ind from SCCP");
633 mtc.stop;
634 }
635 }
636}
637
638/* send a L3 (GMM/SM) message over whatever is the appropriate lower-layer bearer */
Alexander Couzens0507ec32019-09-15 22:41:22 +0200639function f_send_l3(template (value) PDU_L3_MS_SGSN l3_mo, integer ran_index := 0) runs on BSSGP_ConnHdlr {
640 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200641 if (g_pars.rnc_send_initial_ue) {
642 g_pars.rnc_send_initial_ue := false;
643 f_send_l3_initial_ue(l3_mo);
644 } else {
645 BSSAP.send(ts_PDU_DTAP_PS_MO(l3_mo));
646 }
647 } else {
Alexander Couzens0507ec32019-09-15 22:41:22 +0200648 f_send_l3_gmm_llc(l3_mo, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200649 }
650}
651
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200652altstep as_mm_identity(integer ran_index := 0) runs on BSSGP_ConnHdlr {
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700653 var MobileIdentityLV mi;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200654 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_ID_REQ('001'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100655 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200656 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100657 repeat;
658 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200659 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200660 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200661 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200662 repeat;
663 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200664 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_ID_REQ('010'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100665 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200666 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200667 repeat;
668 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200669 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200670 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200671 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100672 repeat;
673 }
674}
Harald Welte96a33b02018-02-04 10:36:22 +0100675
Harald Welteca362462019-05-02 20:11:21 +0200676/* receive a L3 (GMM/SM) message over whatever is the appropriate lower-layer bearer */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200677function f_receive_l3(template PDU_L3_SGSN_MS rx_tpl := ?, integer ran_index := 0)
Harald Welteca362462019-05-02 20:11:21 +0200678runs on BSSGP_ConnHdlr return PDU_L3_SGSN_MS {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200679 var PDU_DTAP_PS_MT mt;
Harald Welteca362462019-05-02 20:11:21 +0200680 var PDU_L3_SGSN_MS l3_mt;
681 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200682 [is_gb(ran_index)] BSSGP[ran_index].receive(rx_tpl) -> value l3_mt { }
683 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(rx_tpl)) -> value mt {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200684 l3_mt := mt.dtap;
685 }
Harald Welteca362462019-05-02 20:11:21 +0200686 }
687 return l3_mt;
688}
689
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200690/* perform GMM authentication (if expected).
691 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
692 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200693function 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 +0100694 var PDU_L3_MS_SGSN l3_mo;
695 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200696 var default di := activate(as_mm_identity(ran_index));
Harald Welte5ac31492018-02-15 20:39:13 +0100697 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200698 var GSUP_IE auth_tuple;
699 var template AuthenticationParameterAUTNTLV autn;
700
701 if (umts_aka_challenge) {
702 g_pars.vec := f_gen_auth_vec_3g();
703 autn := {
704 elementIdentifier := '28'O,
705 lengthIndicator := lengthof(g_pars.vec.autn),
706 autnValue := g_pars.vec.autn
707 };
708
709 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
710 g_pars.vec.sres,
711 g_pars.vec.kc,
712 g_pars.vec.ik,
713 g_pars.vec.ck,
714 g_pars.vec.autn,
715 g_pars.vec.res));
716 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
717 } else {
718 g_pars.vec := f_gen_auth_vec_2g();
719 autn := omit;
720 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
721 g_pars.vec.sres,
722 g_pars.vec.kc));
723 log("GSUP sends only 2G auth tuple", auth_tuple);
724 }
Harald Welteca362462019-05-02 20:11:21 +0200725
Harald Welte5ac31492018-02-15 20:39:13 +0100726 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
727 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200728
729 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
730 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200731 l3_mt := f_receive_l3(auth_ciph_req, ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100732 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200733 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
734
735 if (umts_aka_challenge and not force_gsm_sres) {
736 /* set UMTS response instead */
737 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
738 valueField := substr(g_pars.vec.res, 0, 4)
739 };
740 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
741 elementIdentifier := '21'O,
742 lengthIndicator := lengthof(g_pars.vec.res) - 4,
743 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
744 };
745 }
746
747 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100748 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
749 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
750 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
751 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
752 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200753 f_send_l3(l3_mo, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200754
755 /* Security Mode Command + Complete on Iu case */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200756 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200757 BSSAP.receive(tr_RANAP_SecurityModeCmd(uia_algs := ?, uia_key := oct2bit(g_pars.vec.ik),
758 key_sts := ?)) {
759 var IntegrityProtectionAlgorithm uia_chosen := 0; /* 0 = standard_UMTS_integrity_algorithm_UIA1 */
760 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
Alexander Couzensed61ae82019-09-15 23:18:08 +0200761 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)))
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200762 }
763 }
Harald Welte76dee092018-02-16 22:12:59 +0100764 } else {
765 /* wait for identity procedure */
766 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100767 }
Harald Welte76dee092018-02-16 22:12:59 +0100768
Harald Welte5ac31492018-02-15 20:39:13 +0100769 deactivate(di);
770}
771
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200772function f_upd_ptmsi_and_tlli(OCT4 p_tmsi, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltef70997d2018-02-17 10:11:19 +0100773 g_pars.p_tmsi := p_tmsi;
774 /* update TLLI */
775 g_pars.tlli_old := g_pars.tlli;
776 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
Daniel Willmann1c2ff0f2020-01-28 14:39:25 +0100777 if (is_gb(ran_index)) {
778 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli, BSSGP_PROC[ran_index]);
779 }
Harald Weltef70997d2018-02-17 10:11:19 +0100780}
781
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100782function f_process_attach_accept(PDU_GMM_AttachAccept aa, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100783 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100784 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Harald Weltedd9fb842021-02-16 20:21:22 +0100785 /* we cannot use ran_index here, as it would overflow the cell_id object, since ran_idx > NUM_GB
786 * indicates an Iu RAN connection. All cells are expected to run the same MCC/MNC anyway... */
787 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100788 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100789 & "; expected " & hex2str(g_pars.bssgp_cell_id[ran_index].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200790 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100791 }
Harald Welte04683d02018-02-16 22:43:45 +0100792 g_pars.ra := aa.routingAreaIdentification;
793 if (ispresent(aa.allocatedPTMSI)) {
794 if (not g_pars.net.expect_ptmsi) {
795 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200796 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100797 }
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100798 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets,
799 ran_index);
Harald Welte04683d02018-02-16 22:43:45 +0100800 }
801 if (ispresent(aa.msIdentity)) {
802 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200803 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100804 }
805 /* P-TMSI.sig */
806 if (ispresent(aa.ptmsiSignature)) {
807 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
808 }
809 /* updateTimer */
810 // aa.readyTimer
811 /* T3302, T3319, T3323, T3312_ext, T3324 */
812}
813
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200814function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +0100815 /* mandatory IE */
816 g_pars.ra := ra.routingAreaId;
817 if (ispresent(ra.allocatedPTMSI)) {
818 if (not g_pars.net.expect_ptmsi) {
819 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200820 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100821 }
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100822 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets,
823 ran_index);
Harald Welte91636de2018-02-17 10:16:14 +0100824 }
825 if (ispresent(ra.msIdentity)) {
826 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200827 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100828 }
829 /* P-TMSI.sig */
830 if (ispresent(ra.ptmsiSignature)) {
831 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
832 }
833 /* updateTimer */
834 // aa.readyTimer
835 /* T3302, T3319, T3323, T3312_ext, T3324 */
836}
837
838
Harald Welte5a4fa042018-02-16 20:59:21 +0100839function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
840 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
841}
842
Harald Welte23178c52018-02-17 09:36:33 +0100843/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700844private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100845 if (ispresent(g_pars.p_tmsi)) {
846 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
847 } else {
848 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
849 }
850}
851
Harald Welte311ec272018-02-17 09:40:03 +0100852private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100853 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100854 /* Expect MSC to perform LU with HLR */
855 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100856 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
857 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
858 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100859 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
860 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
861}
862
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100863friend function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres, integer ran_index := 0,
864 template (omit) RoutingAreaIdentificationV old_ra := omit) runs on BSSGP_ConnHdlr {
865 var RoutingAreaIdentificationV old_ra_val;
866 var template PDU_L3_MS_SGSN attach_req;
Harald Welteca362462019-05-02 20:11:21 +0200867 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5ac31492018-02-15 20:39:13 +0100868
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100869 if (istemplatekind(old_ra, "omit")) {
870 old_ra_val := f_random_RAI();
871 } else {
872 old_ra_val := valueof(old_ra);
873 }
874
875 attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra_val, false, false, omit, omit);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200876 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
877 * 3G auth vectors */
878 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
879 /* The thing is, if the solSACapability is 'omit', then the
880 * revisionLevelIndicatior is at the wrong place! */
881 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
882
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200883 f_send_l3(attach_req, ran_index);
884 f_gmm_auth(umts_aka_challenge, force_gsm_sres, ran_index);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200885 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100886 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100887
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200888 l3_mt := f_receive_l3(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?), ran_index);
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100889 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept, ran_index);
Harald Welteca362462019-05-02 20:11:21 +0200890
Harald Welte04683d02018-02-16 22:43:45 +0100891 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200892 f_send_l3(ts_GMM_ATTACH_COMPL, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200893
894 /* IuPS case: Expect Iu Release */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200895 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200896 as_iu_release_compl_disc();
897 }
Alexander Couzens42d3cad2019-10-08 16:29:26 +0200898
899 /* Race condition
900 * It has shown, that GMM_ATTACH_COMPL might take some time to arrive at the SGSN through the layers.
901 * In TC hlr_location_cancel_request_update, the GMM_ATTACH_COMPL came 2ms too late, so that the Location Cancel Request
902 * arrived before it. This results in a test case failure.
903 * Delay execution by 50 ms
904 */
905 f_sleep(0.05);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200906}
907
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200908friend function f_bssgp_suspend(integer ran_idx := 0) runs on BSSGP_ConnHdlr return OCT1 {
909 timer T := 5.0;
910 var PDU_BSSGP rx_pdu;
Harald Welte9b461a92020-12-10 23:41:14 +0100911 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 +0200912 T.start;
913 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100914 [] 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 +0200915 return rx_pdu.pDU_BSSGP_SUSPEND_ACK.suspend_Reference_Number.suspend_Reference_Number_value;
916 }
Harald Welte9b461a92020-12-10 23:41:14 +0100917 [] 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 +0200918 setverdict(fail, "SUSPEND-NACK in response to SUSPEND for TLLI ", g_pars.tlli);
919 mtc.stop;
920 }
921 [] T.timeout {
922 setverdict(fail, "No SUSPEND-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
923 mtc.stop;
924 }
925 }
926 return '00'O;
927}
928
929friend function f_bssgp_resume(OCT1 susp_ref, integer ran_idx := 0) runs on BSSGP_ConnHdlr {
930 timer T := 5.0;
Harald Welte9b461a92020-12-10 23:41:14 +0100931 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 +0200932 T.start;
933 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100934 [] BSSGP_GLOBAL[ran_idx].receive(tr_BSSGP_RESUME_ACK(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id));
935 [] 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 +0200936?)) {
937 setverdict(fail, "RESUME-NACK in response to RESUME for TLLI ", g_pars.tlli);
938 mtc.stop;
939 }
940 [] T.timeout {
941 setverdict(fail, "No RESUME-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
942 mtc.stop;
943 }
944 }
945}
946
947
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200948private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
949 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100950 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100951}
952
953testcase TC_attach() runs on test_CT {
954 var BSSGP_ConnHdlr vc_conn;
955 f_init();
956 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200957 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100958 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200959 f_cleanup();
Harald Welte5ac31492018-02-15 20:39:13 +0100960}
961
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100962testcase TC_attach_mnc3() runs on test_CT {
963 var BSSGP_ConnHdlr vc_conn;
964 f_init('023042'H);
965 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200966 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100967 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200968 f_cleanup();
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100969}
970
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200971private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
972 f_gmm_attach(true, false);
973 setverdict(pass);
974}
975testcase TC_attach_umts_aka_umts_res() runs on test_CT {
976 var BSSGP_ConnHdlr vc_conn;
977 f_init();
978 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200979 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200980 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200981 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200982}
983
984private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
985 f_gmm_attach(true, true);
986 setverdict(pass);
987}
988testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
989 var BSSGP_ConnHdlr vc_conn;
990 f_init();
991 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200992 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200993 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200994 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200995}
996
Harald Welte5b7c8122018-02-16 21:48:17 +0100997/* MS never responds to ID REQ, expect ATTACH REJECT */
998private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100999 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1000
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001001 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001002 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001003 [] BSSGP[0].receive(tr_GMM_ID_REQ(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001004 /* don't send ID Response */
1005 repeat;
1006 }
Harald Welte955aa942019-05-03 01:29:29 +02001007 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('09'O)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001008 setverdict(pass);
1009 }
Harald Welte955aa942019-05-03 01:29:29 +02001010 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001011 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +02001012 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +01001013 }
1014 }
1015}
1016testcase TC_attach_auth_id_timeout() runs on test_CT {
1017 var BSSGP_ConnHdlr vc_conn;
1018 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001019 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 +01001020 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001021 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001022}
1023
1024/* HLR never responds to SAI REQ, expect ATTACH REJECT */
1025private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +01001026 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1027
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001028 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001029 alt {
1030 [] as_mm_identity();
1031 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
1032 }
1033 /* don't send SAI-response from HLR */
Harald Welte955aa942019-05-03 01:29:29 +02001034 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Welte5b7c8122018-02-16 21:48:17 +01001035 setverdict(pass);
1036}
1037testcase TC_attach_auth_sai_timeout() runs on test_CT {
1038 var BSSGP_ConnHdlr vc_conn;
1039 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001040 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +01001041 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001042 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001043}
1044
Harald Weltefe253882018-02-17 09:25:00 +01001045/* HLR rejects SAI, expect ATTACH REJECT */
1046private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +01001047 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1048
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001049 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +01001050 alt {
1051 [] as_mm_identity();
1052 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
1053 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
1054 }
1055 }
Harald Welte955aa942019-05-03 01:29:29 +02001056 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Weltefe253882018-02-17 09:25:00 +01001057 setverdict(pass);
1058}
1059testcase TC_attach_auth_sai_reject() runs on test_CT {
1060 var BSSGP_ConnHdlr vc_conn;
1061 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001062 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +01001063 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001064 f_cleanup();
Harald Weltefe253882018-02-17 09:25:00 +01001065}
1066
Harald Welte5b7c8122018-02-16 21:48:17 +01001067/* HLR never responds to UL REQ, expect ATTACH REJECT */
1068private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001069 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5b7c8122018-02-16 21:48:17 +01001070 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1071
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001072 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001073 f_gmm_auth();
1074 /* Expect MSC to perform LU with HLR */
1075 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
1076 /* Never follow-up with ISD_REQ or UL_RES */
1077 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001078 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001079 setverdict(pass);
1080 }
Harald Welte955aa942019-05-03 01:29:29 +02001081 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1082 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +01001083 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001084 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +01001085 }
1086 }
1087}
1088testcase TC_attach_gsup_lu_timeout() runs on test_CT {
1089 var BSSGP_ConnHdlr vc_conn;
1090 f_init();
1091 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001092 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +01001093 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001094 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001095}
1096
Harald Welteb7c14e92018-02-17 09:29:16 +01001097/* HLR rejects UL REQ, expect ATTACH REJECT */
1098private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001099 var PDU_L3_SGSN_MS l3_mt;
Harald Welteb7c14e92018-02-17 09:29:16 +01001100 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1101
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001102 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +01001103 f_gmm_auth();
1104 /* Expect MSC to perform LU with HLR */
1105 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
1106 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
1107 }
1108 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001109 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb7c14e92018-02-17 09:29:16 +01001110 setverdict(pass);
1111 }
Harald Welte955aa942019-05-03 01:29:29 +02001112 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1113 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welteb7c14e92018-02-17 09:29:16 +01001114 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001115 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +01001116 }
1117 }
1118}
1119testcase TC_attach_gsup_lu_reject() runs on test_CT {
1120 var BSSGP_ConnHdlr vc_conn;
1121 f_init();
1122 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001123 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +01001124 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001125 f_cleanup();
Harald Welteb7c14e92018-02-17 09:29:16 +01001126}
1127
1128
Harald Welte3823e2e2018-02-16 21:53:48 +01001129/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
1130private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001131 var PDU_L3_SGSN_MS l3_mt;
Harald Welte3823e2e2018-02-16 21:53:48 +01001132 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1133
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001134 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +01001135 f_gmm_auth();
1136 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +01001137 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +01001138
Harald Welte955aa942019-05-03 01:29:29 +02001139 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1140 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001141 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001142 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +01001143 setverdict(pass);
1144}
Harald Welte3823e2e2018-02-16 21:53:48 +01001145testcase TC_attach_combined() runs on test_CT {
1146 var BSSGP_ConnHdlr vc_conn;
1147 f_init();
1148 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001149 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +01001150 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001151 f_cleanup();
Harald Welte3823e2e2018-02-16 21:53:48 +01001152}
1153
Harald Welte76dee092018-02-16 22:12:59 +01001154/* Attempt of GPRS ATTACH in 'accept all' mode */
1155private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001156 var PDU_L3_SGSN_MS l3_mt;
Harald Welte76dee092018-02-16 22:12:59 +01001157 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1158
1159 g_pars.net.expect_auth := false;
1160
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001161 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +01001162 f_gmm_auth();
Harald Welte955aa942019-05-03 01:29:29 +02001163 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1164 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001165 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001166 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +01001167 setverdict(pass);
1168}
1169testcase TC_attach_accept_all() runs on test_CT {
1170 var BSSGP_ConnHdlr vc_conn;
1171 f_init();
1172 f_sleep(1.0);
1173 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +02001174 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +01001175 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001176 f_cleanup();
Harald Welte76dee092018-02-16 22:12:59 +01001177}
Harald Welte5b7c8122018-02-16 21:48:17 +01001178
Harald Welteb2124b22018-02-16 22:26:56 +01001179/* Attempt of GPRS ATTACH in 'accept all' mode */
1180private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +01001181 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1182
1183 /* Simulate a foreign IMSI */
1184 g_pars.imsi := '001010123456789'H;
Harald Welte5339b2e2020-10-04 22:52:56 +02001185 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Harald Welteb2124b22018-02-16 22:26:56 +01001186
1187 g_pars.net.expect_auth := false;
1188
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001189 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +01001190 alt {
1191 [] as_mm_identity();
Harald Welte955aa942019-05-03 01:29:29 +02001192 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('07'O)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001193 setverdict(pass);
1194 }
Harald Welte955aa942019-05-03 01:29:29 +02001195 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001196 setverdict(pass);
1197 }
Harald Welte955aa942019-05-03 01:29:29 +02001198 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001199 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001200 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001201 }
Harald Welteb2124b22018-02-16 22:26:56 +01001202 }
1203}
1204testcase TC_attach_closed() runs on test_CT {
1205 var BSSGP_ConnHdlr vc_conn;
1206 f_init();
1207 f_sleep(1.0);
1208 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1209 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001210 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +01001211 vc_conn.done;
1212 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001213 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +01001214 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001215 f_cleanup();
Harald Welteb2124b22018-02-16 22:26:56 +01001216}
1217
Harald Welte04683d02018-02-16 22:43:45 +01001218/* Routing Area Update from Unknown TLLI -> REJECT */
1219private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +01001220 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1221
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001222 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 +01001223 alt {
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01001224 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) { /* gmm cause: implicitly detached */
Harald Welte04683d02018-02-16 22:43:45 +01001225 setverdict(pass);
1226 }
1227 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001228 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +01001229 }
1230}
1231testcase TC_rau_unknown() runs on test_CT {
1232 var BSSGP_ConnHdlr vc_conn;
1233 f_init();
1234 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001235 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +01001236 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001237 f_cleanup();
Harald Welte04683d02018-02-16 22:43:45 +01001238}
1239
Harald Welte91636de2018-02-17 10:16:14 +01001240private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +01001241 /* first perform regular attach */
1242 f_TC_attach(id);
1243
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001244 f_routing_area_update(g_pars.ra);
1245
Harald Welte91636de2018-02-17 10:16:14 +01001246}
1247testcase TC_attach_rau() runs on test_CT {
1248 var BSSGP_ConnHdlr vc_conn;
1249 f_init();
1250 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001251 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +01001252 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001253 f_cleanup();
Harald Welte91636de2018-02-17 10:16:14 +01001254}
Harald Welte04683d02018-02-16 22:43:45 +01001255
Harald Welte6abb9fe2018-02-17 15:24:48 +01001256/* general GPRS DETACH helper */
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001257function 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 +02001258 var PDU_L3_SGSN_MS l3_mt;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001259 timer T := 5.0;
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001260 f_send_l3(ts_GMM_DET_REQ_MO(detach_type, power_off), ran_index);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001261 if (expect_purge) {
1262 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
1263 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
1264 }
1265 T.start;
1266 alt {
1267 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
1268 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +02001269 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001270 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001271 [power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001272 g_pars.ra := omit;
Alexander Couzens8e0fd462019-05-11 01:20:55 +02001273 setverdict(fail, "Unexpected DETACH ACCEPT in power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +02001274 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001275 /* TODO: check if any PDP contexts are deactivated on network side? */
1276 }
1277 [power_off] T.timeout {
1278 setverdict(pass);
1279 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001280 [not power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001281 g_pars.ra := omit;
1282 setverdict(pass);
1283 /* TODO: check if any PDP contexts are deactivated on network side? */
1284 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001285 [] BSSGP[ran_index].receive(PDU_L3_SGSN_MS:?) -> value l3_mt {
Alexander Couzens4630e742019-05-11 01:50:10 +02001286 if (power_off) {
1287 setverdict(fail, "Unexpected Layer 3 package received in power-off DETACH");
1288 } else {
1289 setverdict(fail, "Unexpected Layer 3 package received in normal DETACH");
1290 }
1291 mtc.stop;
1292 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001293 [] BSSGP[ran_index].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +01001294 }
1295}
1296
1297/* IMSI DETACH (non-power-off) for unknown TLLI */
1298private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1299 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
1300}
1301testcase TC_detach_unknown_nopoweroff() runs on test_CT {
1302 var BSSGP_ConnHdlr vc_conn;
1303 f_init();
1304 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001305 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001306 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001307 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001308}
1309
1310/* IMSI DETACH (power-off) for unknown TLLI */
1311private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1312 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
1313}
1314testcase TC_detach_unknown_poweroff() runs on test_CT {
1315 var BSSGP_ConnHdlr vc_conn;
1316 f_init();
1317 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001318 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001319 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001320 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001321}
1322
1323/* IMSI DETACH (non-power-off) for known TLLI */
1324private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1325 /* first perform regular attach */
1326 f_TC_attach(id);
1327
1328 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
1329}
1330testcase TC_detach_nopoweroff() runs on test_CT {
1331 var BSSGP_ConnHdlr vc_conn;
1332 f_init();
1333 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001334 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001335 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001336 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001337}
1338
1339/* IMSI DETACH (power-off) for known TLLI */
1340private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1341 /* first perform regular attach */
1342 f_TC_attach(id);
1343
1344 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1345}
1346testcase TC_detach_poweroff() runs on test_CT {
1347 var BSSGP_ConnHdlr vc_conn;
1348 f_init();
1349 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001350 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001351 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001352 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001353}
1354
Harald Welteeded9ad2018-02-17 20:57:34 +01001355type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +01001356 BIT3 tid, /* L3 Transaction ID */
1357 BIT4 nsapi, /* SNDCP NSAPI */
1358 BIT4 sapi, /* LLC SAPI */
1359 QoSV qos, /* QoS parameters */
1360 PDPAddressV addr, /* IP address */
1361 octetstring apn optional, /* APN name */
1362 ProtocolConfigOptionsV pco optional, /* protoco config opts */
1363 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +01001364 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +01001365 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +01001366
Harald Welte822f9102018-02-18 20:39:06 +01001367 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
1368 OCT4 ggsn_tei_u, /* GGSN TEI User */
1369 octetstring ggsn_ip_c, /* GGSN IP Control */
1370 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001371 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +01001372
Harald Welte822f9102018-02-18 20:39:06 +01001373 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
1374 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
1375 octetstring sgsn_ip_c optional, /* SGSN IP Control */
1376 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +01001377};
1378
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001379
1380private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
1381 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
1382 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
1383 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
1384 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
1385 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
1386 f_gtp_register_teid(apars.ggsn_tei_c);
1387 f_gtp_register_teid(apars.ggsn_tei_u);
1388}
1389
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001390function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001391runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +01001392 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1393 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001394 var template Recovery_gtpc recovery := omit;
1395
1396 if (send_recovery) {
1397 recovery := ts_Recovery(apars.ggsn_restart_ctr);
1398 }
Harald Welteeded9ad2018-02-17 20:57:34 +01001399
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001400 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 +02001401 apars.apn, apars.pco), ran_index);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001402 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
1403 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
1404 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1405 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
1406 apars.sgsn_tei_c, apars.gtp_resp_cause,
1407 apars.ggsn_tei_c, apars.ggsn_tei_u,
1408 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001409 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1410 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +01001411 }
1412 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001413 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001414 setverdict(pass);
1415 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001416 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001417 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +02001418 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001419 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001420 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001421 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +02001422 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001423 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001424 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Weltef7191672019-05-02 20:37:23 +02001425 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
1426 mtc.stop;
1427 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001428 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001429 setverdict(pass);
1430 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001431 [] as_xid(apars, ran_index);
Harald Welteeded9ad2018-02-17 20:57:34 +01001432 }
1433}
1434
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001435function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001436runs on BSSGP_ConnHdlr {
Harald Welte6f203162018-02-18 22:04:55 +01001437 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1438 var Gtp1cUnitdata g_ud;
1439
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001440 f_send_l3(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit), ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001441 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1442 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001443 BSSGP[ran_index].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001444 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1445 }
1446 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001447 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Harald Welte6f203162018-02-18 22:04:55 +01001448 setverdict(pass);
1449 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001450 [] as_xid(apars, ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001451 }
1452}
1453
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001454function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001455runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001456 var Gtp1cUnitdata g_ud;
1457 var integer seq_nr := 23;
1458 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1459
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001460 BSSGP[ran_index].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001461 if (error_ind) {
1462 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1463 } else {
1464 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1465 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001466
1467 timer T := 5.0;
1468 T.start;
1469
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001470 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001471 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1472 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), ran_index);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001473 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001474 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1475 repeat;
1476 }
1477 [] T.timeout {
1478 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1479 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001480 }
1481}
1482
Harald Welte6f203162018-02-18 22:04:55 +01001483
Harald Welteeded9ad2018-02-17 20:57:34 +01001484/* Table 10.5.156/3GPP TS 24.008 */
1485template (value) QoSV t_QosDefault := {
1486 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1487 delayClass := '100'B, /* best effort */
1488 spare1 := '00'B,
1489 precedenceClass := '010'B, /* normal */
1490 spare2 := '0'B,
1491 peakThroughput := '0000'B, /* subscribed */
1492 meanThroughput := '00000'B, /* subscribed */
1493 spare3 := '000'B,
1494 deliverErroneusSDU := omit,
1495 deliveryOrder := omit,
1496 trafficClass := omit,
1497 maxSDUSize := omit,
1498 maxBitrateUplink := omit,
1499 maxBitrateDownlink := omit,
1500 sduErrorRatio := omit,
1501 residualBER := omit,
1502 trafficHandlingPriority := omit,
1503 transferDelay := omit,
1504 guaranteedBitRateUplink := omit,
1505 guaranteedBitRateDownlink := omit,
1506 sourceStatisticsDescriptor := omit,
1507 signallingIndication := omit,
1508 spare4 := omit,
1509 maxBitrateDownlinkExt := omit,
1510 guaranteedBitRateDownlinkExt := omit,
1511 maxBitrateUplinkExt := omit,
1512 guaranteedBitRateUplinkExt := omit,
1513 maxBitrateDownlinkExt2 := omit,
1514 guaranteedBitRateDownlinkExt2 := omit,
1515 maxBitrateUplinkExt2 := omit,
1516 guaranteedBitRateUplinkExt2 := omit
1517}
1518
1519/* 10.5.6.4 / 3GPP TS 24.008 */
1520template (value) PDPAddressV t_AddrIPv4dyn := {
1521 pdpTypeOrg := '0001'B, /* IETF */
1522 spare := '0000'B,
1523 pdpTypeNum := '21'O, /* IPv4 */
1524 addressInfo := omit
1525}
1526template (value) PDPAddressV t_AddrIPv6dyn := {
1527 pdpTypeOrg := '0001'B, /* IETF */
1528 spare := '0000'B,
1529 pdpTypeNum := '53'O, /* IPv6 */
1530 addressInfo := omit
1531}
1532
Harald Welte37692d82018-02-18 15:21:34 +01001533template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001534 tid := '000'B,
1535 nsapi := '0101'B, /* < 5 are reserved */
1536 sapi := '0011'B, /* 3/5/9/11 */
1537 qos := t_QosDefault,
1538 addr := t_AddrIPv4dyn,
1539 apn := omit,
1540 pco := omit,
1541 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001542 gtp_resp_cause := int2oct(128, 1),
1543 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001544
1545 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001546 ggsn_tei_c := f_rnd_octstring(4),
1547 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001548 ggsn_ip_c := f_inet_addr(ggsn_ip),
1549 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001550 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001551
Harald Welteeded9ad2018-02-17 20:57:34 +01001552 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001553 sgsn_tei_u := omit,
1554 sgsn_ip_c := omit,
1555 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001556}
1557
Harald Welte37692d82018-02-18 15:21:34 +01001558template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1559 connId := 1,
1560 remName := f_inet_ntoa(ip),
1561 remPort := GTP1U_PORT
1562}
1563
1564template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1565 connId := 1,
1566 remName := f_inet_ntoa(ip),
1567 remPort := GTP1C_PORT
1568}
1569
1570private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1571 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1572 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1573}
1574
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001575private altstep as_xid(PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr {
1576 [] BSSGP[ran_index].receive(tr_LLC_XID_MT_CMD(?, apars.sapi)) {
Harald Welte37692d82018-02-18 15:21:34 +01001577 repeat;
1578 }
1579}
1580
1581template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1582 pDU_SN_UNITDATA := {
1583 nsapi := nsapi,
1584 moreBit := ?,
1585 snPduType := '1'B,
1586 firstSegmentIndicator := ?,
1587 spareBit := ?,
1588 pcomp := ?,
1589 dcomp := ?,
1590 npduNumber := ?,
1591 segmentNumber := ?,
1592 npduNumberContinued := ?,
1593 dataSegmentSnUnitdataPdu := payload
1594 }
1595}
1596
1597/* simple case: single segment, no compression */
1598template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1599 pDU_SN_UNITDATA := {
1600 nsapi := nsapi,
1601 moreBit := '0'B,
1602 snPduType := '1'B,
1603 firstSegmentIndicator := '1'B,
1604 spareBit := '0'B,
1605 pcomp := '0000'B,
1606 dcomp := '0000'B,
1607 npduNumber := '0000'B,
1608 segmentNumber := '0000'B,
1609 npduNumberContinued := '00'O,
1610 dataSegmentSnUnitdataPdu := payload
1611 }
1612}
1613
1614/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
Harald Weltea5c71cd2020-06-17 22:12:04 +02001615private 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 +02001616runs on BSSGP_ConnHdlr {
Harald Weltea5c71cd2020-06-17 22:12:04 +02001617 timer T := 5.0;
Harald Welte37692d82018-02-18 15:21:34 +01001618 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1619 f_gtpu_send(apars, payload);
Harald Weltea5c71cd2020-06-17 22:12:04 +02001620 T.start;
Harald Welte37692d82018-02-18 15:21:34 +01001621 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1622 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001623 [] as_xid(apars, ran_index);
1624 //[] BSSGP[ran_index].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
Harald Weltea5c71cd2020-06-17 22:12:04 +02001625 [expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload));
1626 [expect_fwd] T.timeout {
1627 setverdict(fail, "Timeout waiting for GTP-U to appear on BSSGP");
1628 mtc.stop;
1629 }
1630 [not expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload)) {
1631 setverdict(fail, "GTP-U forwarded to BSSGP but not expected")
1632 mtc.stop;
1633 }
1634 [not expect_fwd] T.timeout {}
Harald Welte37692d82018-02-18 15:21:34 +01001635 }
1636}
1637
Harald Welte64d6b512020-06-17 16:42:00 +02001638/* Transceive given 'payload' as MO message from Gb -> OsmoSGSN -> GTP */
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01001639private 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 +02001640runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001641 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1642 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1643 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01001644 BSSGP[ran_index].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, n_u));
Harald Welte37692d82018-02-18 15:21:34 +01001645 /* Expect PDU via GTP from SGSN on simulated GGSN */
1646 alt {
1647 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1648 }
1649}
1650
Harald Welteeded9ad2018-02-17 20:57:34 +01001651private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001652 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001653
1654 /* first perform regular attach */
1655 f_TC_attach(id);
1656
1657 f_pdp_ctx_act(apars);
1658}
1659testcase TC_attach_pdp_act() runs on test_CT {
1660 var BSSGP_ConnHdlr vc_conn;
1661 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001662 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001663 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001664 f_cleanup();
Harald Welteeded9ad2018-02-17 20:57:34 +01001665}
Harald Welteb2124b22018-02-16 22:26:56 +01001666
Harald Welte835b15f2018-02-18 14:39:11 +01001667/* PDP Context activation for not-attached subscriber; expect fail */
1668private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001669 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001670 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 +01001671 apars.apn, apars.pco));
1672 alt {
1673 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Harald Welte955aa942019-05-03 01:29:29 +02001674 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001675 setverdict(pass);
1676 }
1677 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1678 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001679 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001680 }
Harald Welte955aa942019-05-03 01:29:29 +02001681 [] BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001682 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001683 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001684 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001685 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001686 }
1687}
1688testcase TC_pdp_act_unattached() runs on test_CT {
1689 var BSSGP_ConnHdlr vc_conn;
1690 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001691 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001692 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001693 f_cleanup();
Harald Welte835b15f2018-02-18 14:39:11 +01001694}
1695
Harald Welte37692d82018-02-18 15:21:34 +01001696/* ATTACH + PDP CTX ACT + user plane traffic */
1697private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1698 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1699
1700 /* first perform regular attach */
1701 f_TC_attach(id);
1702 /* then activate PDP context */
1703 f_pdp_ctx_act(apars);
1704 /* then transceive a downlink PDU */
1705 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1706 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1707}
1708testcase TC_attach_pdp_act_user() runs on test_CT {
1709 var BSSGP_ConnHdlr vc_conn;
1710 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001711 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001712 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001713 f_cleanup();
Harald Welte37692d82018-02-18 15:21:34 +01001714}
1715
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001716/* ATTACH + PDP CTX ACT; reject from GGSN */
1717private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1718 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1719
1720 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1721 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1722
1723 /* first perform regular attach */
1724 f_TC_attach(id);
1725 /* then activate PDP context */
1726 f_pdp_ctx_act(apars);
1727}
1728testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1729 var BSSGP_ConnHdlr vc_conn;
1730 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001731 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001732 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001733 f_cleanup();
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001734}
Harald Welte835b15f2018-02-18 14:39:11 +01001735
Harald Welte6f203162018-02-18 22:04:55 +01001736/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1737private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1738 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1739
1740 /* first perform regular attach */
1741 f_TC_attach(id);
1742 /* then activate PDP context */
1743 f_pdp_ctx_act(apars);
1744 /* then transceive a downlink PDU */
1745 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1746 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1747
1748 f_pdp_ctx_deact_mo(apars, '00'O);
1749}
1750testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1751 var BSSGP_ConnHdlr vc_conn;
1752 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001753 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 +01001754 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001755 f_cleanup();
Harald Welte6f203162018-02-18 22:04:55 +01001756}
1757
Harald Welte57b9b7f2018-02-18 22:28:13 +01001758/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1759private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1760 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1761
1762 /* first perform regular attach */
1763 f_TC_attach(id);
1764 /* then activate PDP context */
1765 f_pdp_ctx_act(apars);
1766 /* then transceive a downlink PDU */
1767 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1768 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1769
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001770 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001771}
1772testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1773 var BSSGP_ConnHdlr vc_conn;
1774 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001775 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 +01001776 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001777 f_cleanup();
Harald Welte57b9b7f2018-02-18 22:28:13 +01001778}
1779
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001780/* Test MS sending a duplicate Deact PDP Ctx (OS#3956). */
1781private function f_TC_attach_pdp_act_deact_dup(charstring id) runs on BSSGP_ConnHdlr {
1782 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1783 var Gtp1cUnitdata g_ud;
1784 var integer i;
1785 var OCT1 cause_regular_deact := '24'O;
1786
1787 /* first perform regular attach + PDP context act */
1788 f_TC_attach(id);
1789 f_pdp_ctx_act(apars);
1790
1791 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1792 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1793
1794 for (i := 0; i < 2; i := i+1) {
1795 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1796 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1797 log("Received deletePDPContextResponse " & int2str(i) & ", seq_nr=" & int2str(seq_nr));
1798 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1799 }
1800 }
1801
1802 alt {
1803 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1804 setverdict(pass);
1805 }
1806 [] as_xid(apars, 0);
1807 }
1808
1809 /* Make sure second DeactPdpAccept is sent: */
1810 timer T := 2.0;
1811 T.start;
1812 alt {
1813 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1814 setverdict(fail, "Second SM_DEACT_PDP_ACCEPT_MT received");
1815 }
1816 [] T.timeout {
1817 setverdict(pass);
1818 }
1819 }
1820
1821 setverdict(pass);
1822}
1823testcase TC_attach_pdp_act_deact_dup() runs on test_CT {
1824 var BSSGP_ConnHdlr vc_conn;
1825 f_init();
1826 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_dup), testcasename(), g_gb, 46);
1827 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001828 f_cleanup();
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001829}
1830
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001831/* ATTACH + ATTACH (2nd) */
1832private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1833 g_pars.t_guard := 5.0;
1834
1835 /* first perform regular attach */
1836 f_TC_attach(id);
1837
1838 /* second to perform regular attach */
1839 f_TC_attach(id);
1840}
1841
1842
1843testcase TC_attach_second_attempt() runs on test_CT {
1844 var BSSGP_ConnHdlr vc_conn;
1845 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001846 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001847 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001848 f_cleanup();
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001849}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001850
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001851private function f_TC_attach_echo_timeout(charstring id) runs on BSSGP_ConnHdlr {
1852 var Gtp1cUnitdata g_ud;
1853 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1854 var integer seq_nr;
1855
1856 /* first perform regular attach */
1857 f_TC_attach(id);
1858 /* then activate PDP context */
1859 f_pdp_ctx_act(apars);
1860
1861 /* Wait to receive first echo request and send initial Restart counter */
1862 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1863 BSSGP[0].clear;
1864 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1865 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1866 f_sleep(int2float(mp_echo_interval)); /* wait until around next echo is expected */
1867 }
1868
1869 /* At some point next echo request not answered will timeout and SGSN
1870 should drop the pdp ctx. Around T3 (3secs) * 6 (+ extra, a lot due to OS#4178): */
1871 timer T := 3.0 * 6.0 + 16.0;
1872 T.start;
1873 alt {
1874 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1875 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
1876 setverdict(pass);
1877 }
1878 [] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1879 /* SGSN currently doesn't send this message because it expects GGSN to be non-reachable anyway */
1880 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1881 log("Received deletePDPContextRequest seq_nr=" & int2str(seq_nr));
1882 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1883 repeat;
1884 }
1885 [] GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1886 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1887 log("Received EchoRequest seq_nr=" & int2str(seq_nr));
1888 repeat;
1889 }
1890 [] T.timeout {
1891 setverdict(fail, "BSSGP DeactPdpReq not received");
1892 mtc.stop;
1893 }
1894 [] as_xid(apars);
1895 }
1896 T.stop
1897
1898 setverdict(pass);
1899}
1900/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1901testcase TC_attach_echo_timeout() runs on test_CT {
1902 var BSSGP_ConnHdlr vc_conn;
1903 g_use_echo := true;
1904 f_init();
1905 vc_conn := f_start_handler(refers(f_TC_attach_echo_timeout), testcasename(), g_gb, 67, 50.0);
1906 vc_conn.done;
1907 g_use_echo := false;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001908 f_cleanup();
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001909}
1910
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001911private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001912 var Gtp1cUnitdata g_ud;
1913 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1914
1915 /* first perform regular attach */
1916 f_TC_attach(id);
1917 /* Activate a pdp context against the GGSN */
1918 f_pdp_ctx_act(apars);
1919 /* Wait to receive first echo request and send initial Restart counter */
1920 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1921 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1922 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1923 }
1924 /* Wait to receive second echo request and send incremented Restart
1925 counter. This will fake a restarted GGSN, and pdp ctx allocated
1926 should be released by SGSN */
1927 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1928 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1929 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1930 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1931 }
1932 var OCT1 cause_network_failure := int2oct(38, 1)
1933 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001934 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001935 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001936 setverdict(pass);
1937 }
1938 [] as_xid(apars);
1939 }
1940 setverdict(pass);
1941}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001942/* ATTACH + trigger Recovery procedure through EchoResp */
1943testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001944 var BSSGP_ConnHdlr vc_conn;
1945 g_use_echo := true
1946 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001947 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 +02001948 vc_conn.done;
1949 g_use_echo := false
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001950 f_cleanup();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001951}
1952
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001953private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1954 var Gtp1cUnitdata g_ud;
1955 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1956 var integer seq_nr := 23;
1957 var GtpPeer peer;
1958 /* first perform regular attach */
1959 f_TC_attach(id);
1960
1961 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1962 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1963 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1964 f_pdp_ctx_act(apars, true);
1965
1966 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1967/* received. */
1968 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1969
1970 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1971 would be great to have an active pdp context here before triggering
1972 Recovery, and making sure the the DEACT request is sent by the SGSN.
1973 */
1974
1975 /* Activate a pdp context against the GGSN, send incremented Recovery
1976 IE. This should trigger the recovery path, but still this specific
1977 CTX activation should work. */
1978 apars.exp_rej_cause := omit; /* default value for tests */
1979 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
1980 f_pdp_ctx_act(apars, true);
1981
1982 setverdict(pass);
1983}
1984/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1985testcase TC_attach_restart_ctr_create() runs on test_CT {
1986 var BSSGP_ConnHdlr vc_conn;
1987 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001988 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 +02001989 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001990 f_cleanup();
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001991}
1992
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001993/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
1994private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
1995 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1996 var integer seq_nr := 23;
1997 var GtpPeer peer;
1998 var integer i;
1999
2000 /* first perform regular attach */
2001 f_TC_attach(id);
2002 /* then activate PDP context */
2003 f_pdp_ctx_act(apars);
2004
Alexander Couzens0e510e62018-07-28 23:06:00 +02002005 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002006 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
2007 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
2008
2009 for (i := 0; i < 5; i := i+1) {
2010 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002011 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002012 [] as_xid(apars);
2013 }
2014 }
2015
2016 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
2017
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002018 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002019 setverdict(pass);
2020}
2021testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
2022 var BSSGP_ConnHdlr vc_conn;
2023 f_init();
2024 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002025 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 +02002026 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002027 f_cleanup();
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002028}
2029
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002030/* ATTACH + PDP CTX ACT dropped + retrans */
2031private function f_TC_attach_pdp_act_deact_gtp_retrans(charstring id) runs on BSSGP_ConnHdlr {
2032 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2033 var Gtp1cUnitdata g_ud_first, g_ud_second;
2034 /* first perform regular attach */
2035 f_TC_attach(id);
2036
2037 /* then activate PDP context on the Gb side */
2038 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
2039 apars.apn, apars.pco), 0);
2040
2041 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_first {}
2042 log("First createPDPContextRequest received, dropping & waiting for retransmission");
2043 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_second {
2044 if (g_ud_first != g_ud_second) {
2045 setverdict(fail, "Retransmitted GTP message createPDPContextRequest is different from original one!");
2046 mtc.stop;
2047 }
2048 f_process_gtp_ctx_act_req(apars, g_ud_second.gtpc);
2049 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
2050 GTP.send(ts_GTPC_CreatePdpResp(g_ud_second.peer, seq_nr,
2051 apars.sgsn_tei_c, apars.gtp_resp_cause,
2052 apars.ggsn_tei_c, apars.ggsn_tei_u,
2053 apars.nsapi,
2054 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
2055 omit, omit));
2056 }
Harald Welte955aa942019-05-03 01:29:29 +02002057 BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT) {}
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002058
2059 /* Now the same with Deact */
2060 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, '00'O, false, omit), 0);
2061 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_first {}
2062 log("First deletePDPContextRequest received, dropping & waiting for retransmission");
2063 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_second {
2064 if (g_ud_first != g_ud_second) {
2065 setverdict(fail, "Retransmitted GTP message deletePDPContextRequest is different from original one!");
2066 mtc.stop;
2067 }
2068 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
2069 BSSGP[0].clear;
2070 GTP.send(ts_GTPC_DeletePdpResp(g_ud_second.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
2071 }
2072 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002073 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002074 setverdict(pass);
2075 }
2076 [] as_xid(apars, 0);
2077 }
2078
2079 setverdict(pass);
2080}
2081testcase TC_attach_pdp_act_deact_gtp_retrans() runs on test_CT {
2082 var BSSGP_ConnHdlr vc_conn;
2083 f_init();
2084 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans), testcasename(), g_gb, 27);
2085 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002086 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002087}
2088
2089/* Test that SGSN GTP response retransmit queue works fine */
2090private function f_TC_attach_pdp_act_deact_gtp_retrans_resp(charstring id) runs on BSSGP_ConnHdlr {
2091 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2092 var integer seq_nr := 23;
2093 var Gtp1cUnitdata g_ud_first, g_ud_second;
2094 var template Gtp1cUnitdata g_delete_req;
2095 /* first perform regular attach + PDP context act */
2096 f_TC_attach(id);
2097 f_pdp_ctx_act(apars);
2098
2099 /* Now perform an MT DeleteCtxReq and emulate GGSN didn't receive response and sends a duplicated DeleteCtxReq */
2100 BSSGP[0].clear;
2101 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
2102 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B);
2103 GTP.send(g_delete_req);
2104 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002105 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002106 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), 0);
2107 }
2108 [] as_xid(apars, 0);
2109 }
2110 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_first {
2111 if (g_ud_first.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != '80'O) {
2112 setverdict(fail, "Received deletePDPContextResponse cause is not 'Request accepted'");
2113 mtc.stop;
2114 }
2115 };
2116
2117 /* Send duplicate DeleteCtxReq */
2118 log("First deletePDPContextResponse received, dropping & retransmitting retransmission of deletePDPContextRequest");
2119 GTP.send(g_delete_req);
2120 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_second {
2121 if (g_ud_first != g_ud_second) {
2122 setverdict(fail, "Retransmitted GTP message deletePDPContextResponse is different from original one!");
2123 mtc.stop;
2124 }
2125 }
2126
2127 /* Let's send now a new DeleteCtxReq (increased seq_nr) to make sure it
2128 * is handled differently by SGSN (expect "non-existent" cause) */
2129 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr + 1, apars.sgsn_tei_c, apars.nsapi, '1'B);
2130 GTP.send(g_delete_req);
2131 /* Response with cause "non-existent" must be sent with TEID 0 according to specs */
2132 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, '00000000'O)) -> value g_ud_second {
2133 if (g_ud_second.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != 'C0'O) {
2134 setverdict(fail, "Received deletePDPContextResponse cause is not 'Non-existent'");
2135 mtc.stop;
2136 }
2137 }
2138
2139 setverdict(pass);
2140}
2141testcase TC_attach_pdp_act_deact_gtp_retrans_resp() runs on test_CT {
2142 var BSSGP_ConnHdlr vc_conn;
2143 f_init();
2144 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans_resp), testcasename(), g_gb, 28);
2145 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002146 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002147}
2148
Alexander Couzens5e307b42018-05-22 18:12:20 +02002149private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
2150 /* MS: perform regular attach */
2151 f_TC_attach(id);
2152
2153 /* HLR: cancel the location request */
2154 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
2155 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02002156
2157 /* ensure no Detach Request got received */
2158 timer T := 5.0;
2159 T.start;
2160 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002161 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(*, *, *)) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002162 T.stop;
2163 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02002164 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002165 }
2166 [] T.timeout {
2167 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02002168 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002169 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02002170 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002171 repeat;
2172 }
2173 }
2174}
2175
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002176/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
2177private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
2178 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2179
2180 /* first perform regular attach */
2181 f_TC_attach(id);
2182 /* then activate PDP context */
2183 f_pdp_ctx_act(apars);
2184 /* then transceive a downlink PDU */
2185 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
2186
2187 /* Send Error indication as response from upload PDU and expect deact towards MS */
2188 f_pdp_ctx_deact_mt(apars, true);
2189}
2190testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
2191 var BSSGP_ConnHdlr vc_conn;
2192 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002193 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 +02002194 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002195 f_cleanup();
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002196}
2197
Alexander Couzens5e307b42018-05-22 18:12:20 +02002198testcase TC_hlr_location_cancel_request_update() runs on test_CT {
2199 /* MS <-> SGSN: GMM Attach
2200 * HLR -> SGSN: Cancel Location Request
2201 * HLR <- SGSN: Cancel Location Ack
2202 */
2203 var BSSGP_ConnHdlr vc_conn;
2204 f_init();
2205 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002206 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02002207 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002208 f_cleanup();
Alexander Couzens5e307b42018-05-22 18:12:20 +02002209}
2210
2211
Alexander Couzensc87967a2018-05-22 16:09:54 +02002212private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
2213 /* MS: perform regular attach */
2214 f_TC_attach(id);
2215
2216 /* HLR: cancel the location request */
2217 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
2218 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
2219 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
2220
2221 /* MS: receive a Detach Request */
Harald Welte955aa942019-05-03 01:29:29 +02002222 BSSGP[0].receive(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002223 f_send_l3(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002224
2225 setverdict(pass);
2226}
2227
2228testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
2229 /* MS <-> SGSN: GMM Attach
2230 * HLR -> SGSN: Cancel Location Request
2231 * HLR <- SGSN: Cancel Location Ack
2232 * MS <- SGSN: Detach Request
2233 * SGSN-> MS: Detach Complete
2234 */
2235 var BSSGP_ConnHdlr vc_conn;
2236 f_init();
2237 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002238 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002239 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002240 f_cleanup();
Alexander Couzensc87967a2018-05-22 16:09:54 +02002241}
2242
2243
Alexander Couzens6c47f292018-05-22 17:09:49 +02002244private function f_hlr_location_cancel_request_unknown_subscriber(
2245 charstring id,
2246 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
2247
2248 /* HLR: cancel the location request */
2249 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
2250
2251 /* cause 2 = IMSI_UNKNOWN */
2252 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
2253
2254 setverdict(pass);
2255}
2256
2257private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002258 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002259}
2260
2261testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
2262 /* HLR -> SGSN: Cancel Location Request
2263 * HLR <- SGSN: Cancel Location Error
2264 */
2265
2266 var BSSGP_ConnHdlr vc_conn;
2267 f_init();
2268 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002269 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 +02002270 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002271 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002272}
2273
2274private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002275 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002276}
2277
2278testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
2279 /* HLR -> SGSN: Cancel Location Request
2280 * HLR <- SGSN: Cancel Location Error
2281 */
2282
2283 var BSSGP_ConnHdlr vc_conn;
2284 f_init();
2285 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002286 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 +02002287 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002288 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002289}
2290
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002291private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
2292 f_TC_attach(id);
2293 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2294}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002295
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002296testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
2297 /* MS <-> SGSN: Attach
2298 * MS -> SGSN: Detach Req (Power off)
2299 * VTY -> SGSN: Check if MS is NOT in subscriber cache
2300 */
2301 var BSSGP_ConnHdlr vc_conn;
2302 var integer id := 33;
2303 var charstring imsi := hex2str(f_gen_imsi(id));
2304
2305 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002306 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002307 vc_conn.done;
2308
2309 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002310 f_cleanup();
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002311}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002312
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002313/* Attempt an attach, but loose the Identification Request (IMEI) */
2314private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
2315 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002316 var MobileIdentityLV mi;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002317
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002318 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 +02002319
2320 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002321 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002322 /* break */
2323 }
Harald Welte955aa942019-05-03 01:29:29 +02002324 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002325 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002326 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002327 repeat;
2328 }
Harald Welte955aa942019-05-03 01:29:29 +02002329 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002330 /* ignore ID REQ IMEI */
2331 count_req := count_req + 1;
2332 repeat;
2333 }
2334 }
2335 if (count_req != 5) {
2336 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002337 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002338 }
2339 setverdict(pass);
2340}
2341
2342testcase TC_attach_no_imei_response() runs on test_CT {
2343 /* MS -> SGSN: Attach Request IMSI
2344 * MS <- SGSN: Identity Request IMSI (optional)
2345 * MS -> SGSN: Identity Response IMSI (optional)
2346 * MS <- SGSN: Identity Request IMEI
2347 * MS -x SGSN: no response
2348 * MS <- SGSN: re-send: Identity Request IMEI 4x
2349 * MS <- SGSN: Attach Reject
2350 */
2351 var BSSGP_ConnHdlr vc_conn;
2352 f_init();
2353 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002354 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 +02002355 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002356 f_cleanup();
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002357}
2358
Alexander Couzens53f20562018-06-12 16:24:12 +02002359/* Attempt an attach, but loose the Identification Request (IMSI) */
2360private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
2361 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002362 var MobileIdentityLV mi;
Alexander Couzens53f20562018-06-12 16:24:12 +02002363
2364 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
2365 g_pars.p_tmsi := 'c0000035'O;
2366
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002367 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 +02002368
2369 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002370 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002371 /* break */
2372 }
Harald Welte955aa942019-05-03 01:29:29 +02002373 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002374 /* ignore ID REQ IMSI */
2375 count_req := count_req + 1;
2376 repeat;
2377 }
Harald Welte955aa942019-05-03 01:29:29 +02002378 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002379 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002380 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02002381 repeat;
2382 }
2383 }
2384 if (count_req != 5) {
2385 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002386 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02002387 }
2388 setverdict(pass);
2389}
2390
2391testcase TC_attach_no_imsi_response() runs on test_CT {
2392 /* MS -> SGSN: Attach Request TMSI (unknown)
2393 * MS <- SGSN: Identity Request IMEI (optional)
2394 * MS -> SGSN: Identity Response IMEI (optional)
2395 * MS <- SGSN: Identity Request IMSI
2396 * MS -x SGSN: no response
2397 * MS <- SGSN: re-send: Identity Request IMSI 4x
2398 * MS <- SGSN: Attach Reject
2399 */
2400 var BSSGP_ConnHdlr vc_conn;
2401 f_init();
2402 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002403 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 +02002404 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002405 f_cleanup();
Alexander Couzens53f20562018-06-12 16:24:12 +02002406}
2407
Alexander Couzenscf818962018-06-05 18:00:00 +02002408private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
2409 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
2410}
2411
2412testcase TC_attach_check_subscriber_list() runs on test_CT {
2413 /* MS <-> SGSN: Attach
2414 * VTY -> SGSN: Check if MS is in subscriber cache
2415 */
2416 var BSSGP_ConnHdlr vc_conn;
2417 var integer id := 34;
2418 var charstring imsi := hex2str(f_gen_imsi(id));
2419
2420 f_init();
2421 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002422 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02002423 vc_conn.done;
2424
2425 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
2426 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002427 f_cleanup();
Alexander Couzenscf818962018-06-05 18:00:00 +02002428}
2429
Alexander Couzensf9858652018-06-07 16:14:53 +02002430private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
2431 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002432 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensf9858652018-06-07 16:14:53 +02002433
2434 /* unregister the old IMSI */
2435 f_bssgp_client_unregister(g_pars.imsi);
2436 /* Simulate a foreign IMSI */
Alexander Couzens03d12242018-08-07 16:13:52 +02002437 g_pars.imsi := '001010123456700'H;
Harald Welte5339b2e2020-10-04 22:52:56 +02002438 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Alexander Couzensf9858652018-06-07 16:14:53 +02002439
2440 /* there is no auth */
2441 g_pars.net.expect_auth := false;
2442
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002443 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02002444 f_gmm_auth();
2445 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002446 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzensf9858652018-06-07 16:14:53 +02002447 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02002448 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02002449 }
Harald Welte955aa942019-05-03 01:29:29 +02002450 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) -> value l3_mt {
2451 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002452 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02002453 setverdict(pass);
2454 }
2455 }
2456}
Alexander Couzens03d12242018-08-07 16:13:52 +02002457
2458private function f_TC_attach_closed_add_vty(charstring id) runs on BSSGP_ConnHdlr {
2459
2460 f_TC_attach_closed_foreign(id);
2461 f_TC_attach_closed_imsi_added(id);
2462
2463}
2464
2465
Alexander Couzensf9858652018-06-07 16:14:53 +02002466testcase TC_attach_closed_add_vty() runs on test_CT {
2467 /* VTY-> SGSN: policy close
2468 * MS -> SGSN: Attach Request
2469 * MS <- SGSN: Identity Request IMSI
2470 * MS -> SGSN: Identity Response IMSI
2471 * MS <- SGSN: Attach Reject
2472 * VTY-> SGSN: policy imsi-acl add IMSI
2473 * MS -> SGSN: Attach Request
2474 * MS <- SGSN: Identity Request IMSI
2475 * MS -> SGSN: Identity Response IMSI
2476 * MS <- SGSN: Identity Request IMEI
2477 * MS -> SGSN: Identity Response IMEI
2478 * MS <- SGSN: Attach Accept
2479 */
2480 var BSSGP_ConnHdlr vc_conn;
2481 f_init();
2482 f_sleep(1.0);
2483 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
2484 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
Alexander Couzens03d12242018-08-07 16:13:52 +02002485 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456700");
2486 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456700");
Alexander Couzensf9858652018-06-07 16:14:53 +02002487 /* test with foreign IMSI: Must Reject */
Alexander Couzens03d12242018-08-07 16:13:52 +02002488 vc_conn := f_start_handler(refers(f_TC_attach_closed_add_vty), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02002489 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002490 f_cleanup();
Alexander Couzensf9858652018-06-07 16:14:53 +02002491}
2492
Alexander Couzens0085bd72018-06-12 19:08:44 +02002493/* Attempt an attach, but never answer a Attach Complete */
2494private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
2495 var integer count_req := 0;
2496
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002497 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 +02002498 f_gmm_auth();
Pau Espin Pedrol4b290a22019-09-10 19:49:41 +02002499 /* Expect SGSN to perform LU with HLR */
2500 f_gmm_gsup_lu_isd();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002501
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002502 timer T := 10.0;
2503 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002504 alt {
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002505 [] T.timeout {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002506 /* break */
2507 }
Harald Welte955aa942019-05-03 01:29:29 +02002508 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002509 /* ignore */
2510 count_req := count_req + 1;
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002511 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002512 repeat;
2513 }
2514 }
2515 if (count_req != 5) {
2516 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02002517 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002518 }
2519 setverdict(pass);
2520}
2521
2522testcase TC_attach_check_complete_resend() runs on test_CT {
2523 /* MS -> SGSN: Attach Request IMSI
2524 * MS <- SGSN: Identity Request *
2525 * MS -> SGSN: Identity Response *
2526 * MS <- SGSN: Attach Complete 5x
2527 */
2528 var BSSGP_ConnHdlr vc_conn;
2529 f_init();
2530 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002531 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 +02002532 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002533 f_cleanup();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002534}
2535
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002536friend function f_routing_area_update(RoutingAreaIdentificationV ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02002537 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002538 var PDU_DTAP_PS_MT mt;
2539 var template OCT4 p_tmsi := omit;
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002540
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002541 if (is_iu(ran_index)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002542 p_tmsi := g_pars.p_tmsi;
2543 }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002544 /* then send RAU */
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002545 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 +02002546 alt {
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002547 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_ACCEPT) -> value l3_mt {
2548 f_process_rau_accept(l3_mt.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2549 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002550 setverdict(pass);
2551 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002552 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_ACCEPT)) -> value mt {
2553 f_process_rau_accept(mt.dtap.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2554 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5d56f522019-09-03 12:36:18 +02002555 setverdict(pass);
2556 }
2557
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002558 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_REJECT) {
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002559 setverdict(fail, "Unexpected RAU Reject");
2560 mtc.stop;
2561 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002562 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_REJECT)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002563 setverdict(fail, "Unexpected RAU Reject");
2564 mtc.stop;
2565 }
2566
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002567 [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 +02002568 key_sts := ?)) {
2569 var IntegrityProtectionAlgorithm uia_chosen := 0; /* 0 = standard_UMTS_integrity_algorithm_UIA1 */
2570 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
Alexander Couzensed61ae82019-09-15 23:18:08 +02002571 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)))
Daniel Willmann1c116112020-01-22 17:48:31 +01002572 repeat;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002573 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002574 [is_gb(ran_index)] BSSGP[ran_index].receive { repeat; }
2575 [is_iu(ran_index)] BSSAP.receive { repeat; }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002576 }
2577}
2578
Alexander Couzensbfda9212018-07-31 03:17:33 +02002579private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbfda9212018-07-31 03:17:33 +02002580 /* first perform regular attach */
2581 f_TC_attach(id);
2582
2583 /* then send RAU */
2584 f_routing_area_update(g_pars.ra);
2585
2586 /* do another RAU */
2587 f_routing_area_update(g_pars.ra);
2588
2589 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2590}
2591
2592testcase TC_attach_rau_a_a() runs on test_CT {
2593 /* MS <-> SGSN: Successful Attach
2594 * MS -> SGSN: Routing Area Update Request
2595 * MS <- SGSN: Routing Area Update Accept
2596 * MS -> SGSN: Routing Area Update Request
2597 * MS <- SGSN: Routing Area Update Accept
2598 * MS -> SGSN: Detach (PowerOff)
2599 */
2600 var BSSGP_ConnHdlr vc_conn;
2601 f_init();
2602 f_sleep(1.0);
2603 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
2604 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002605 f_cleanup();
Alexander Couzensbfda9212018-07-31 03:17:33 +02002606}
2607
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002608private function f_TC_attach_rau_a_b(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002609 f_TC_attach(id);
2610
2611 log("attach complete sending rau");
2612 f_routing_area_update(g_pars.ra, 0);
2613
2614 log("rau complete unregistering");
2615 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte5339b2e2020-10-04 22:52:56 +02002616 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002617
2618 log("sending second RAU via different RA");
2619 f_routing_area_update(f_cellid_to_RAI(g_pars.bssgp_cell_id[1]), 1);
2620
2621 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true, 1);
2622}
2623
2624testcase TC_attach_rau_a_b() runs on test_CT {
2625 /* MS <-> SGSN: Successful Attach
2626 * MS -> SGSN: Routing Area _a_ Update Request
2627 * MS <- SGSN: Routing Area _a_ Update Accept
2628 * MS -> SGSN: Routing Area _b_ Update Request
2629 * MS <- SGSN: Routing Area _b_ Update Accept
2630 * MS -> SGSN: Detach (PowerOff)
2631 */
2632 var BSSGP_ConnHdlr vc_conn;
2633 f_init();
2634 f_sleep(1.0);
2635 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_b), testcasename(), g_gb, 38);
2636 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002637 f_cleanup();
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002638}
2639
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002640private function f_TC_attach_gmm_attach_req_while_gmm_attach(charstring id) runs on BSSGP_ConnHdlr {
2641 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002642 var MobileIdentityLV mi;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002643 var RoutingAreaIdentificationV rand_rai := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002644 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002645
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002646 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002647
2648 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002649 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002650 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2651 mtc.stop;
2652 }
Harald Welte955aa942019-05-03 01:29:29 +02002653 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002654 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002655 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002656 repeat;
2657 }
Harald Welte955aa942019-05-03 01:29:29 +02002658 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002659 /* send out a second GMM_Attach Request.
2660 * If the SGSN follows the rules, this 2nd ATTACH REQ should be ignored, because
2661 * of the same content */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002662 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002663 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002664 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002665 }
2666 }
2667 f_sleep(1.0);
2668
2669 /* we've sent already a IMEI answer, we should NOT asked again for IMEI */
2670 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002671 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002672 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002673 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002674 repeat;
2675 }
Harald Welte955aa942019-05-03 01:29:29 +02002676 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002677 setverdict(fail, "Unexpected GMM ID REQ (IMEI).");
2678 mtc.stop;
2679 }
Harald Welte955aa942019-05-03 01:29:29 +02002680 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002681 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2682 mtc.stop;
2683 }
Harald Welte955aa942019-05-03 01:29:29 +02002684 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2685 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002686 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002687 setverdict(pass);
2688 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
2689 }
2690 }
2691}
2692
2693testcase TC_attach_gmm_attach_req_while_gmm_attach() runs on test_CT {
2694 /* Testing if the SGSN ignore Attach Request with the exact same content */
2695 /* MS -> SGSN: Attach Request IMSI
2696 * MS <- SGSN: Identity Request IMSI (optional)
2697 * MS -> SGSN: Identity Response IMSI (optional)
2698 * MS <- SGSN: Identity Request IMEI
2699 * MS -> SGSN: Attach Request (2nd)
2700 * MS <- SGSN: Identity Response IMEI
2701 * MS <- SGSN: Attach Accept
2702 * MS -> SGSN: Attach Complete
2703 */
2704 var BSSGP_ConnHdlr vc_conn;
2705 f_init();
2706 f_sleep(1.0);
2707 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
2708 vc_conn := f_start_handler(refers(f_TC_attach_gmm_attach_req_while_gmm_attach), testcasename(), g_gb, 39);
2709 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002710 f_cleanup();
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002711}
2712
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002713private function f_TC_attach_usim_resync(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002714 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2715
2716 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2717
2718 /* send Attach Request */
2719 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2720 * 3G auth vectors */
2721 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2722 /* The thing is, if the solSACapability is 'omit', then the
2723 * revisionLevelIndicatior is at the wrong place! */
2724 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002725 f_send_l3(attach_req);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002726
2727 /* do the auth */
2728 var PDU_L3_MS_SGSN l3_mo;
2729 var PDU_L3_SGSN_MS l3_mt;
2730 var default di := activate(as_mm_identity());
2731
2732 var GSUP_IE auth_tuple;
2733 var template AuthenticationParameterAUTNTLV autn;
2734
2735 g_pars.vec := f_gen_auth_vec_3g();
2736 autn := {
2737 elementIdentifier := '28'O,
2738 lengthIndicator := lengthof(g_pars.vec.autn),
2739 autnValue := g_pars.vec.autn
2740 };
2741 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2742 g_pars.vec.sres,
2743 g_pars.vec.kc,
2744 g_pars.vec.ik,
2745 g_pars.vec.ck,
2746 g_pars.vec.autn,
2747 g_pars.vec.res));
2748 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2749 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2750 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2751
2752 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2753 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002754 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002755
2756 /* send the gmm auth failure with resync IE */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002757 f_send_l3(ts_GMM_AUTH_FAIL_UMTS_AKA_RESYNC(g_pars.vec.auts));
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002758
2759 /* wait for the GSUP resync request */
2760 GSUP.receive(tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
2761 g_pars.imsi,
2762 g_pars.vec.auts,
2763 g_pars.vec.rand));
2764
2765 /* generate new key material */
2766 g_pars.vec := f_gen_auth_vec_3g();
2767 autn := {
2768 elementIdentifier := '28'O,
2769 lengthIndicator := lengthof(g_pars.vec.autn),
2770 autnValue := g_pars.vec.autn
2771 };
2772
2773 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2774 g_pars.vec.sres,
2775 g_pars.vec.kc,
2776 g_pars.vec.ik,
2777 g_pars.vec.ck,
2778 g_pars.vec.autn,
2779 g_pars.vec.res));
2780 /* send new key material */
2781 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2782
2783 /* wait for the new Auth Request */
2784 auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2785 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002786 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002787 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
2788 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2789 auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2790 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
2791 valueField := substr(g_pars.vec.res, 0, 4)
2792 };
2793 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
2794 elementIdentifier := '21'O,
2795 lengthIndicator := lengthof(g_pars.vec.res) - 4,
2796 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
2797 };
2798 l3_mo := valueof(auth_ciph_resp);
2799 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
2800 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
2801 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
2802 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
2803 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002804 f_send_l3(l3_mo);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002805 deactivate(di);
2806
2807 /* Expect SGSN to perform LU with HLR */
2808 f_gmm_gsup_lu_isd();
2809
Harald Welte955aa942019-05-03 01:29:29 +02002810 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2811 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002812 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002813 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002814 setverdict(pass);
2815}
2816
2817testcase TC_attach_usim_resync() runs on test_CT {
2818 /* MS -> SGSN: Attach Request
2819 * MS <- SGSN: Identity Request IMSI
2820 * MS -> SGSN: Identity Response IMSI
2821 * MS <- SGSN: Identity Request IMEI
2822 * MS -> SGSN: Identity Response IMEI
2823 * HLR<- SGSN: SAI Request
2824 * HLR-> SGSN: SAI Response
2825 * MS <- SGSN: Auth Request
2826 * MS -> SGSN: Auth Failure (with AUTS)
2827 * HLR<- SGSN: SAI Request (with AUTS & RAND)
2828 * HLR-> SGSN: SAI Response (new key material)
2829 * MS <- SGSN: Auth Request (new key material)
2830 * MS -> SGSN: Auth Response
2831 * MS <- SGSN: Attach Accept
2832 * MS -> SGSN: Attach Complete
2833 */
2834 var BSSGP_ConnHdlr vc_conn;
2835 f_init();
2836 f_sleep(1.0);
2837 vc_conn := f_start_handler(refers(f_TC_attach_usim_resync), testcasename(), g_gb, 40);
2838 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002839 f_cleanup();
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002840}
2841
Eric Wildc555be52021-05-15 19:48:22 +02002842private function f_TC_attach_usim_crypt(OCT1 netcap_a2345, BIT3 auth_req_ciph) runs on BSSGP_ConnHdlr {
2843 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2844
2845 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2846 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.spare_octets := netcap_a2345; /* GEA2345... */
2847
2848 /* send Attach Request */
2849 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2850 * 3G auth vectors */
2851 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2852 /* The thing is, if the solSACapability is 'omit', then the
2853 * revisionLevelIndicatior is at the wrong place! */
2854 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
2855 f_send_l3(attach_req);
2856
2857 /* do the auth */
2858 var PDU_L3_MS_SGSN l3_mo;
2859 var PDU_L3_SGSN_MS l3_mt;
2860 var default di := activate(as_mm_identity());
2861
2862 var GSUP_IE auth_tuple;
2863 var template AuthenticationParameterAUTNTLV autn;
2864
2865 g_pars.vec := f_gen_auth_vec_3g();
2866 autn := {
2867 elementIdentifier := '28'O,
2868 lengthIndicator := lengthof(g_pars.vec.autn),
2869 autnValue := g_pars.vec.autn
2870 };
2871 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2872 g_pars.vec.sres,
2873 g_pars.vec.kc,
2874 g_pars.vec.ik,
2875 g_pars.vec.ck,
2876 g_pars.vec.autn,
2877 g_pars.vec.res));
2878 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2879 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2880 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2881
2882 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand, auth_req_ciph);
2883 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
2884 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
2885
2886 setverdict(pass);
2887 deactivate(di);
2888}
2889
2890private function f_TC_attach_usim_a54_a54(charstring id) runs on BSSGP_ConnHdlr {
2891 f_TC_attach_usim_crypt('10'O, '100'B);
2892}
2893
2894private function f_TC_attach_usim_a54_a53(charstring id) runs on BSSGP_ConnHdlr {
2895 f_TC_attach_usim_crypt('20'O, '011'B);
2896}
2897
2898private function f_TC_attach_usim_a53_a54(charstring id) runs on BSSGP_ConnHdlr {
2899 f_TC_attach_usim_crypt('30'O, '011'B);
2900}
2901
2902private function f_TC_attach_usim_a50_a54(charstring id) runs on BSSGP_ConnHdlr {
2903 f_TC_attach_usim_crypt('30'O, '000'B);
2904}
2905
2906private function f_TC_attach_usim_a54_a50(charstring id) runs on BSSGP_ConnHdlr {
2907 f_TC_attach_usim_crypt('00'O, '000'B);
2908}
2909
2910testcase TC_attach_usim_a54_a54() runs on test_CT {
2911 var BSSGP_ConnHdlr vc_conn;
2912 f_init();
2913 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002914 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02002915 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a54), testcasename(), g_gb, 40);
2916 vc_conn.done;
2917 f_cleanup();
2918}
2919
2920testcase TC_attach_usim_a54_a53() runs on test_CT {
2921 var BSSGP_ConnHdlr vc_conn;
2922 f_init();
2923 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002924 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02002925 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a53), testcasename(), g_gb, 40);
2926 vc_conn.done;
2927 f_cleanup();
2928}
2929
2930testcase TC_attach_usim_a53_a54() runs on test_CT {
2931 var BSSGP_ConnHdlr vc_conn;
2932 f_init();
2933 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002934 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3");
Eric Wildc555be52021-05-15 19:48:22 +02002935 vc_conn := f_start_handler(refers(f_TC_attach_usim_a53_a54), testcasename(), g_gb, 40);
2936 vc_conn.done;
2937 f_cleanup();
2938}
2939
2940testcase TC_attach_usim_a50_a54() runs on test_CT {
2941 var BSSGP_ConnHdlr vc_conn;
2942 f_init();
2943 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002944 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0");
Eric Wildc555be52021-05-15 19:48:22 +02002945 vc_conn := f_start_handler(refers(f_TC_attach_usim_a50_a54), testcasename(), g_gb, 40);
2946 vc_conn.done;
2947 f_cleanup();
2948}
2949
2950testcase TC_attach_usim_a54_a50() runs on test_CT {
2951 var BSSGP_ConnHdlr vc_conn;
2952 f_init();
2953 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002954 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02002955 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a50), testcasename(), g_gb, 40);
2956 vc_conn.done;
2957 f_cleanup();
2958}
Harald Weltea05b8072019-04-23 22:35:05 +02002959
2960/* Send LLC NULL to see if the SGSN survives it (OS#3952) */
2961private function f_TC_llc_null(charstring id) runs on BSSGP_ConnHdlr {
2962 f_gmm_attach(false, false);
2963 f_sleep(1.0);
2964 f_send_llc(ts_LLC_NULL('0'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
2965 /* try to detach to check if SGSN is still alive */
2966 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2967}
2968testcase TC_llc_null() runs on test_CT {
2969 var BSSGP_ConnHdlr vc_conn;
2970 f_init();
2971 f_sleep(1.0);
2972 vc_conn := f_start_handler(refers(f_TC_llc_null), testcasename(), g_gb, 41);
2973 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002974 f_cleanup();
Harald Weltea05b8072019-04-23 22:35:05 +02002975}
2976
Harald Welte645a1512019-04-23 23:18:23 +02002977/* Send LLC SABM to see if the SGSN rejects it properly with DM */
2978private function f_TC_llc_sabm_dm_llgmm(charstring id) runs on BSSGP_ConnHdlr {
2979 f_gmm_attach(false, false);
2980 f_sleep(1.0);
2981 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02002982 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LLGMM, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02002983 setverdict(pass);
2984}
2985testcase TC_llc_sabm_dm_llgmm() runs on test_CT {
2986 var BSSGP_ConnHdlr vc_conn;
2987 f_init();
2988 f_sleep(1.0);
2989 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_llgmm), testcasename(), g_gb, 42);
2990 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002991 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02002992}
2993
2994/* Send LLC SABM to see if the SGSN rejects it properly with DM */
2995private function f_TC_llc_sabm_dm_ll5(charstring id) runs on BSSGP_ConnHdlr {
2996 f_gmm_attach(false, false);
2997 f_sleep(1.0);
2998 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LL5, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02002999 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LL5, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02003000 setverdict(pass);
3001}
3002testcase TC_llc_sabm_dm_ll5() runs on test_CT {
3003 var BSSGP_ConnHdlr vc_conn;
3004 f_init();
3005 f_sleep(1.0);
3006 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_ll5), testcasename(), g_gb, 43);
3007 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003008 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02003009}
3010
Harald Welte2aaac1b2019-05-02 10:02:53 +02003011/* test XID handshake with empty L3 info: expect empty return (some phones require that, OS#3426 */
3012private function f_TC_xid_empty_l3(charstring id) runs on BSSGP_ConnHdlr {
3013 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3014 var template (value) XID_Information xid;
3015 var template XID_Information xid_rx;
3016
3017 /* first perform regular attach */
3018 f_TC_attach(id);
3019 /* then activate PDP context */
3020 f_pdp_ctx_act(apars);
3021
3022 /* start MO XID */
3023 xid := { ts_XID_L3(''O) };
3024 xid_rx := { tr_XID_L3(''O) };
3025 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
3026 alt {
Harald Welte955aa942019-05-03 01:29:29 +02003027 [] BSSGP[0].receive(tr_LLC_XID(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02003028 [] as_xid(apars);
3029 }
3030 setverdict(pass);
3031}
3032testcase TC_xid_empty_l3() runs on test_CT {
3033 var BSSGP_ConnHdlr vc_conn;
3034 f_init();
3035 f_sleep(1.0);
3036 vc_conn := f_start_handler(refers(f_TC_xid_empty_l3), testcasename(), g_gb, 44);
3037 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003038 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02003039}
3040
3041private function f_TC_xid_n201u(charstring id) runs on BSSGP_ConnHdlr {
3042 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3043 var template (value) XID_Information xid;
3044 var template XID_Information xid_rx;
3045
3046 /* first perform regular attach */
3047 f_TC_attach(id);
3048 /* then activate PDP context */
3049 f_pdp_ctx_act(apars);
3050
3051 /* start MO XID */
3052 xid := { ts_XID_N201U(1234) };
3053 xid_rx := { tr_XID_N201U(1234) };
3054 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
3055 alt {
Harald Welte955aa942019-05-03 01:29:29 +02003056 [] BSSGP[0].receive(tr_LLC_XID_MT_RSP(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02003057 [] as_xid(apars);
3058 }
3059 setverdict(pass);
3060}
3061testcase TC_xid_n201u() runs on test_CT {
3062 var BSSGP_ConnHdlr vc_conn;
3063 f_init();
3064 f_sleep(1.0);
3065 vc_conn := f_start_handler(refers(f_TC_xid_n201u), testcasename(), g_gb, 45);
3066 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003067 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02003068}
3069
Alexander Couzens6bee0872019-05-11 01:48:50 +02003070private function f_TC_attach_pdp_act_gmm_detach(charstring id) runs on BSSGP_ConnHdlr {
3071 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3072
3073 /* first perform regular attach */
3074 f_TC_attach(id);
3075 /* then activate PDP context */
3076 f_pdp_ctx_act(apars);
3077 /* do a normal detach */
3078 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
3079}
3080
3081testcase TC_attach_pdp_act_gmm_detach() runs on test_CT {
3082 /* MS -> SGSN: Attach Request
3083 * MS <-> SGSN: [..]
3084 * MS -> SGSN: Attach Complete
3085 * MS -> SGSN: PDP Activate Request
3086 * MS <- SGSN: PDP Activate Accept
3087 * MS -> SGSN: GMM Detach Request
3088 * MS <- SGSN: GMM Detach Accept
3089 */
3090 var BSSGP_ConnHdlr vc_conn;
3091 f_init();
3092 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_gmm_detach), testcasename(), g_gb, 26);
3093 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003094 f_cleanup();
Alexander Couzens6bee0872019-05-11 01:48:50 +02003095}
Harald Welte645a1512019-04-23 23:18:23 +02003096
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003097private function f_TC_attach_req_id_req_ra_update(charstring id) runs on BSSGP_ConnHdlr {
3098 var RoutingAreaIdentificationV old_ra := f_random_RAI();
3099 var RoutingAreaIdentificationV new_ra := f_random_RAI();
3100 while (old_ra == new_ra) { new_ra := f_random_RAI(); };
3101 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
3102 var PDU_L3_SGSN_MS l3_mt;
3103
3104 f_send_l3(attach_req, 0);
3105
3106 BSSGP[0].receive(tr_GMM_ID_REQ(?));
3107
3108 f_send_l3(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, new_ra, false, omit, omit));
3109 alt {
3110 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) {
3111 setverdict(pass);
3112 }
3113 [] BSSGP[0].receive { repeat; }
3114 }
3115}
3116
3117/* This test triggers crash in osmo-sgsn before osmo-sgsn.git I64fa5cf1b427d3abb99e553e584897261a827ce6.
3118 * See OS#3957 and OS#4245 for more information.
3119 */
3120testcase TC_attach_req_id_req_ra_update() runs on test_CT {
3121 /*
3122 * MS --> SGSN: Attach Req (TMSI, RAI=901-70-356-101)
3123 * MS <-- SGSN: Identity Request (IMEI)
3124 * MS --> SGSN: RA Updating (RAI=901-70-2758-208)
3125 */
3126 var BSSGP_ConnHdlr vc_conn;
3127 f_init();
3128 vc_conn := f_start_handler(refers(f_TC_attach_req_id_req_ra_update), testcasename(), g_gb, 47);
3129 vc_conn.done;
3130 f_cleanup();
3131}
3132
Harald Welte8e5932e2020-06-17 22:12:54 +02003133private altstep as_nopaging_ps(integer ran_idx := 0) runs on BSSGP_ConnHdlr {
3134var PDU_BSSGP rx;
3135[] BSSGP_SIG[ran_idx].receive(tr_BSSGP_PS_PAGING(?)) -> value rx {
3136 setverdict(fail, "Received unexpected PS PAGING: ", rx);
3137 mtc.stop;
3138 }
3139}
3140
3141/* SUSPEND, then DL traffic: should not pass + no paging expected */
3142private function f_TC_suspend_nopaging(charstring id) runs on BSSGP_ConnHdlr {
3143 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3144 var default d;
3145
3146 /* first perform regular attach */
3147 f_TC_attach(id);
3148 /* then activate PDP context */
3149 f_pdp_ctx_act(apars);
3150 /* then transceive a downlink PDU */
3151 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3152
3153 /* now suspend GPRS */
3154 f_bssgp_suspend();
3155
3156 d := activate(as_nopaging_ps());
3157
3158 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3159 * nor any related paging requests */
3160 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3161
3162 deactivate(d);
3163}
3164testcase TC_suspend_nopaging() runs on test_CT {
3165 var BSSGP_ConnHdlr vc_conn;
3166 f_init();
3167 f_sleep(1.0);
3168 vc_conn := f_start_handler(refers(f_TC_suspend_nopaging), testcasename(), g_gb, 48);
3169 vc_conn.done;
3170 f_cleanup();
3171}
3172
3173
3174/* SUSPEND, then RESUME: data expected to flow after explicit resume */
3175private function f_TC_suspend_resume(charstring id) runs on BSSGP_ConnHdlr {
3176 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3177 var OCT1 susp_ref;
3178 var default d;
3179
3180 /* first perform regular attach */
3181 f_TC_attach(id);
3182 /* then activate PDP context */
3183 f_pdp_ctx_act(apars);
3184 /* then transceive a downlink PDU */
3185 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3186
3187 /* now suspend GPRS */
3188 susp_ref := f_bssgp_suspend();
3189
3190 d := activate(as_nopaging_ps());
3191
3192 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3193 * nor any related paging requests */
3194 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3195
3196 deactivate(d);
3197
3198 /* resume GPRS */
3199 f_bssgp_resume(susp_ref);
3200
3201 /* now data should be flowing again */
3202 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3203}
3204testcase TC_suspend_resume() runs on test_CT {
3205 var BSSGP_ConnHdlr vc_conn;
3206 f_init();
3207 f_sleep(1.0);
3208 vc_conn := f_start_handler(refers(f_TC_suspend_resume), testcasename(), g_gb, 49);
3209 vc_conn.done;
3210 f_cleanup();
3211}
3212
3213/* SUSPEND, then RAU: data expected to flow after implicit resume */
3214private function f_TC_suspend_rau(charstring id) runs on BSSGP_ConnHdlr {
3215 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3216 var default d;
3217
3218 /* first perform regular attach */
3219 f_TC_attach(id);
3220 /* then activate PDP context */
3221 f_pdp_ctx_act(apars);
3222 /* then transceive a downlink PDU */
3223 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3224
3225 /* now suspend GPRS */
3226 f_bssgp_suspend();
3227
3228 d := activate(as_nopaging_ps());
3229
3230 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3231 * nor any related paging requests */
3232 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3233
3234 deactivate(d);
3235
3236 /* perform RAU (implicit RESUME) */
3237 f_routing_area_update(g_pars.ra);
3238
Harald Welted5836dc2021-03-20 15:40:00 +01003239 /* give SGSN some time to actually receve + process the RAU Complete we sent */
3240 f_sleep(0.5);
3241
Harald Welte8e5932e2020-06-17 22:12:54 +02003242 /* now data should be flowing again */
3243 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3244
3245}
3246testcase TC_suspend_rau() runs on test_CT {
3247 var BSSGP_ConnHdlr vc_conn;
3248 f_init();
3249 f_sleep(1.0);
3250 vc_conn := f_start_handler(refers(f_TC_suspend_rau), testcasename(), g_gb, 50);
3251 vc_conn.done;
3252 f_cleanup();
3253}
3254
3255
3256/* wait for T3314 expiration and check that PS PAGING is created on DL PDU */
3257private function f_TC_paging_ps(charstring id) runs on BSSGP_ConnHdlr {
3258 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3259 var default d;
3260
3261 /* first perform regular attach */
3262 f_TC_attach(id);
3263 /* then activate PDP context */
3264 f_pdp_ctx_act(apars);
3265 /* then transceive a downlink PDU */
3266 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3267
3268 /* now wait for T3314 expiration (test_CT below has reduced it to 3s) */
3269 f_sleep(5.0);
3270
3271 /* now data should be flowing again, but with PS PAGING */
3272 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3273 BSSGP_SIG[0].receive(tr_BSSGP_PS_PAGING(?));
3274
3275 /* FIXME: simulate paging response */
3276 /* FIXME: verify PDU actually arrives only after paging response was successful */
3277
3278}
3279testcase TC_paging_ps() runs on test_CT {
3280 var BSSGP_ConnHdlr vc_conn;
3281 f_init();
3282 f_vty_config(SGSNVTY, "sgsn", "timer 3314 3");
3283 f_sleep(1.0);
3284 vc_conn := f_start_handler(refers(f_TC_paging_ps), testcasename(), g_gb, 51);
3285 vc_conn.done;
3286 f_vty_config(SGSNVTY, "sgsn", "timer 3314 default");
3287 f_cleanup();
3288}
3289
Philipp Maier7df55e02020-12-14 23:46:04 +01003290/* Run a RIM single report procedure over the sgsn. Since the SGSN will only do a transparent routing of the
3291 * RIM messages this basically tests if the message is correctly transfered from one GB interface to the
3292 * other and vice versa. */
3293testcase TC_bssgp_rim_single_report() runs on test_CT {
3294 var BSSGP_ConnHdlr vc_conn;
3295 f_init();
Philipp Maier7df55e02020-12-14 23:46:04 +01003296
3297 timer T := 2.0;
3298
3299 var template RIM_Routing_Address dst_addr;
3300 var template RIM_Routing_Address src_addr;
3301 var template RAN_Information_Request_RIM_Container req_cont;
3302 var template RAN_Information_RIM_Container res_cont;
3303 var template PDU_BSSGP bssgp_rim_pdu;
3304 var template PDU_BSSGP bssgp_rim_pdu_expect;
3305
3306 dst_addr := t_RIM_Routing_Address_cid(g_gb[1].cfg.bvc[0].cell_id);
3307 src_addr := t_RIM_Routing_Address_cid(g_gb[0].cfg.bvc[0].cell_id);
Harald Welte8e5932e2020-06-17 22:12:54 +02003308
3309
Philipp Maier7df55e02020-12-14 23:46:04 +01003310 /* Send NACC Ran information request to SGSN at GB interface #0. We epect the SGSN to forward this request
3311 * based on the cell id in dst_addr to GB interface #1. */
3312 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3313 ts_RIM_Sequence_Number(1),
3314 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3315 ts_RIM_Protocol_Version_Number(1),
3316 tsu_RAN_Information_Request_Application_Container_NACC(g_gb[1].cfg.bvc[0].cell_id),
3317 omit);
3318 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3319 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3320 req_cont);
3321 bssgp_rim_pdu_expect := tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3322 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3323 tr_RAN_Information_Request_RIM_Container);
3324 RIM[0].send(bssgp_rim_pdu);
3325 T.start;
3326 alt {
Vadim Yanitskiy418e8062021-02-28 16:27:12 +01003327 [] RIM[1].receive(bssgp_rim_pdu_expect) {
3328 setverdict(pass);
3329 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003330 [] RIM[1].receive {
3331 setverdict(fail, "Unexpected BSSGP RIM PDU received");
Philipp Maier7df55e02020-12-14 23:46:04 +01003332 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003333 [] T.timeout {
3334 setverdict(fail, "No BSSGP RIM PDU received");
3335 mtc.stop;
Philipp Maier7df55e02020-12-14 23:46:04 +01003336 }
3337 }
Harald Welte8e5932e2020-06-17 22:12:54 +02003338
Philipp Maier7df55e02020-12-14 23:46:04 +01003339 /* Now also emulate also the response as well and send it back on GB interface #1. Expect the result on
3340 * GB interface #0 */
Philipp Maier7df55e02020-12-14 23:46:04 +01003341 res_cont := ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3342 ts_RIM_Sequence_Number(2),
3343 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3344 ts_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003345 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 +01003346 omit);
3347 bssgp_rim_pdu := ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3348 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3349 res_cont);
3350 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3351 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3352 ?);
3353 RIM[1].send(bssgp_rim_pdu);
3354 T.start;
3355 alt {
Vadim Yanitskiy418e8062021-02-28 16:27:12 +01003356 [] RIM[0].receive(bssgp_rim_pdu_expect) {
3357 setverdict(pass);
3358 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003359 [] RIM[0].receive {
3360 setverdict(fail, "Unexpected BSSGP RIM PDU received");
Philipp Maier7df55e02020-12-14 23:46:04 +01003361 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003362 [] T.timeout {
3363 setverdict(fail, "No BSSGP RIM PDU received");
3364 mtc.stop;
Philipp Maier7df55e02020-12-14 23:46:04 +01003365 }
3366 }
3367
3368 f_cleanup();
3369}
Harald Welte8e5932e2020-06-17 22:12:54 +02003370
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003371testcase TC_rim_eutran_to_geran() runs on test_CT {
3372 var BSSGP_ConnHdlr vc_conn;
3373 f_init();
3374 /* connect RIM related port */
3375 connect(vc_GTP:CLIENT_DEFAULT, self:GTPC);
3376
3377 var GtpPeer peer := {
3378 connId := 1,
3379 remName := mp_sgsn_gtp_ip,
3380 remPort := GTP1C_PORT
3381 }
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003382 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 +02003383
3384 var template (value) RIM_Routing_Address_GTPC gtpc_dst_addr, gtpc_src_addr;
3385 var template (value) RAN_Information_Request_RIM_Container_GTPC gtpc_rim_req_cont;
3386 var template (value) PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC gtpc_bssgp_cont;
3387 var template (value) Gtp1cUnitdata gtpc_pdu;
3388
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003389 gtpc_dst_addr := t_GTPC_RIM_Routing_Address_cid(gtp_ci);
3390 gtpc_src_addr := t_GTPC_RIM_Routing_Address_enbid(gtp_ci, tac := 3, gnbid := '12345678123456'O);
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003391
3392 gtpc_rim_req_cont := ts_GTPC_RAN_Information_Request_RIM_Container(ts_GTPC_RIM_Application_Identity(RIM_APP_ID_NACC),
3393 ts_GTPC_RIM_Sequence_Number(1),
3394 ts_GTPC_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3395 ts_GTPC_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003396 tsu_GTPC_RAN_Information_Request_Application_Container_NACC(gtp_ci),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003397 omit);
3398 gtpc_bssgp_cont := ts_GTPC_RAN_Information_Request(ts_GTPC_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, gtpc_dst_addr),
3399 ts_GTPC_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, gtpc_src_addr),
3400 gtpc_rim_req_cont);
3401 gtpc_pdu := ts_GTPC_RANInfoRelay(peer, ts_RANTransparentContainer_RAN_INFO_REQ(gtpc_bssgp_cont));
3402 GTPC.send(gtpc_pdu);
3403
3404 var template RIM_Routing_Address bssgp_dst_addr, bssgp_src_addr;
3405 var template PDU_BSSGP bssgp_rim_pdu_expect;
3406 bssgp_dst_addr := t_RIM_Routing_Address_cid(g_gb[1].cfg.bvc[0].cell_id);
3407 bssgp_src_addr := t_RIM_Routing_Address_enbid(g_gb[1].cfg.bvc[0].cell_id, tac := 3, gnbid := '12345678123456'O);
3408 bssgp_rim_pdu_expect := tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bssgp_dst_addr),
3409 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, bssgp_src_addr),
3410 tr_RAN_Information_Request_RIM_Container);
3411 timer T := 2.0;
3412 T.start;
3413 alt {
3414 [] RIM[1].receive(bssgp_rim_pdu_expect) {
3415 setverdict(pass);
3416 T.stop;
3417 }
3418 [] RIM[1].receive {
3419 setverdict(fail, "Unexpected BSSGP RIM PDU received");
3420 }
3421 [] T.timeout {
3422 setverdict(fail, "No BSSGP RIM PDU received");
3423 mtc.stop;
3424 }
3425 }
3426
3427 /* Now also emulate also the response as well and send it back on GB
3428 interface #1. Expect the result on * GTPC */
3429 var template RAN_Information_RIM_Container res_cont;
3430 var template PDU_BSSGP bssgp_rim_pdu;
3431 res_cont := ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3432 ts_RIM_Sequence_Number(2),
3433 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3434 ts_RIM_Protocol_Version_Number(1),
3435 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(g_gb[1].cfg.bvc[0].cell_id, false, 3, si_default)),
3436 omit);
3437 bssgp_rim_pdu := ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, bssgp_src_addr),
3438 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bssgp_dst_addr),
3439 res_cont);
3440 RIM[1].send(bssgp_rim_pdu);
3441
3442 var template RAN_Information_RIM_Container_GTPC rim_cont;
3443 var template PDU_BSSGP_RAN_INFORMATION_GTPC gtpc_bssgp_cont_ack;
3444 var template Gtp1cUnitdata gtpc_pdu_exp;
3445 rim_cont := tr_GTPC_RAN_Information_RIM_Container(ts_GTPC_RIM_Application_Identity(RIM_APP_ID_NACC),
3446 ts_GTPC_RIM_Sequence_Number(2),
3447 ts_GTPC_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3448 ts_GTPC_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003449 tru_GTPC_ApplContainer_or_ApplErrContainer_NACC(tru_GTPC_ApplContainer_NACC(gtp_ci, false, 3, si_default)),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003450 omit);
3451 gtpc_bssgp_cont_ack := tr_GTPC_RAN_Information(tr_GTPC_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, gtpc_src_addr),
3452 tr_GTPC_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, gtpc_dst_addr),
3453 rim_cont);
3454 gtpc_pdu_exp := tr_GTPC_RANInfoRelay(peer, tr_RANTransparentContainer_RAN_INFO(gtpc_bssgp_cont_ack));
3455
3456 T.start;
3457 alt {
3458 [] GTPC.receive(gtpc_pdu_exp) {
3459 setverdict(pass);
3460 T.stop;
3461 }
3462 [] GTPC.receive {
3463 setverdict(fail, "Unexpected GTPC RIM PDU received");
3464 }
3465 [] T.timeout {
3466 setverdict(fail, "No GTPC RIM PDU received");
3467 mtc.stop;
3468 }
3469 }
3470
3471 f_cleanup();
3472}
3473
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01003474/* Test if the SGSN routes traffic to new cell after the MS attached to it */
3475private function f_TC_cell_change_different_rai_ci_attach(charstring id) runs on BSSGP_ConnHdlr {
3476 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3477
3478 /* first perform regular attach */
3479 f_gmm_attach(false, false, ran_index := 0);
3480 /* then activate PDP context */
3481 f_pdp_ctx_act(apars, ran_index := 0);
3482 /* then transceive a downlink PDU */
3483 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3484 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 0);
3485
3486 /* Now attach on different cell: */
3487 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3488 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3489 g_pars.net.expect_auth := false;
3490 f_gmm_attach(false, false, ran_index := 1, old_ra := f_cellid_to_RAI(g_pars.bssgp_cell_id[0]));
3491 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3492 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1, n_u := 1);
3493}
3494testcase TC_cell_change_different_rai_ci_attach() runs on test_CT {
3495 var BSSGP_ConnHdlr vc_conn;
3496 f_init();
3497 vc_conn := f_start_handler(refers(f_TC_cell_change_different_rai_ci_attach), testcasename(), g_gb, 68);
3498 vc_conn.done;
3499 f_cleanup();
3500}
3501
3502/* Test if the SGSN routes traffic to new cell after the MS attached to it */
3503/* Assumption: g_gb[1] and g_gb[2] configured with same RAC */
3504private function f_TC_cell_change_different_ci_attach(charstring id) runs on BSSGP_ConnHdlr {
3505 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3506
3507 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3508 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3509
3510 /* first perform regular attach */
3511 f_gmm_attach(false, false, ran_index := 1);
3512 /* then activate PDP context */
3513 f_pdp_ctx_act(apars, ran_index := 1);
3514 /* then transceive a downlink PDU */
3515 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3516 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1);
3517
3518 /* Now attach on different cell: */
3519 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3520 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[2]);
3521 g_pars.net.expect_auth := false;
3522 f_gmm_attach(false, false, ran_index := 2, old_ra := f_cellid_to_RAI(g_pars.bssgp_cell_id[1]));
3523 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 2);
3524 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 2, n_u := 1);
3525}
3526testcase TC_cell_change_different_ci_attach() runs on test_CT {
3527 var BSSGP_ConnHdlr vc_conn;
3528 f_init();
3529 vc_conn := f_start_handler(refers(f_TC_cell_change_different_ci_attach), testcasename(), g_gb, 69);
3530 vc_conn.done;
3531 f_cleanup();
3532}
3533
3534/* Test if the SGSN silently drops MO data message coming from new BVCI if RAC changed (eg. cell change) */
3535private function f_TC_cell_change_different_rai_ci_data(charstring id) runs on BSSGP_ConnHdlr {
3536 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3537
3538 /* first perform regular attach */
3539 f_gmm_attach(false, false, ran_index := 0);
3540 /* then activate PDP context */
3541 f_pdp_ctx_act(apars, ran_index := 0);
3542 /* then transceive a downlink PDU */
3543 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3544 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 0);
3545
3546 /* Send some data over new bvci, it should be silently discarded since
3547 * RAC changed and SGSN expects a RAU to occur in that case */
3548 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3549 var octetstring payload := f_rnd_octstring(200);
3550 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
3551 BSSGP[1].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 1));
3552 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
3553 timer T := 2.0;
3554 T.start;
3555 alt {
3556 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload)) {
3557 setverdict(fail, "Unexpected GTP message");
3558 }
3559 [] T.timeout { setverdict(pass); }
3560 }
3561
3562 /* Expect SGSN to continue routing DL data to last known NSEI+BVCI */
3563 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3564 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3565}
3566testcase TC_cell_change_different_rai_ci_data() runs on test_CT {
3567 var BSSGP_ConnHdlr vc_conn;
3568 f_init();
3569 vc_conn := f_start_handler(refers(f_TC_cell_change_different_rai_ci_data), testcasename(), g_gb, 70);
3570 vc_conn.done;
3571 f_cleanup();
3572}
3573
3574/* Test if the SGSN routes traffic to new cell after the MS switched cell without re-attaching */
3575/* Assumption: g_gb[1] and g_gb[2] configured with same RAC */
3576private function f_TC_cell_change_different_ci_data(charstring id) runs on BSSGP_ConnHdlr {
3577 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3578
3579 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3580 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3581
3582 /* first perform regular attach */
3583 f_gmm_attach(false, false, ran_index := 1);
3584 /* then activate PDP context */
3585 f_pdp_ctx_act(apars, ran_index := 1);
3586 /* then transceive a downlink PDU */
3587 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3588 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1);
3589
3590 /* Now attach on different cell: */
3591 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3592 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[2]);
3593
3594 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 2, n_u := 1);
3595 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 2);
3596}
3597testcase TC_cell_change_different_ci_data() runs on test_CT {
3598 var BSSGP_ConnHdlr vc_conn;
3599 f_init();
3600 vc_conn := f_start_handler(refers(f_TC_cell_change_different_ci_data), testcasename(), g_gb, 71);
3601 vc_conn.done;
3602 f_cleanup();
3603}
3604
Harald Welte5ac31492018-02-15 20:39:13 +01003605control {
Harald Welte5b7c8122018-02-16 21:48:17 +01003606 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01003607 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02003608 execute( TC_attach_umts_aka_umts_res() );
3609 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01003610 execute( TC_attach_auth_id_timeout() );
3611 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01003612 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01003613 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01003614 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01003615 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01003616 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01003617 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02003618 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02003619 execute( TC_attach_no_imsi_response() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02003620 execute( TC_attach_closed_add_vty(), 20.0 );
3621 execute( TC_attach_check_subscriber_list(), 20.0 );
3622 execute( TC_attach_detach_check_subscriber_list(), 20.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02003623 execute( TC_attach_check_complete_resend() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02003624 execute( TC_hlr_location_cancel_request_update(), 20.0 );
3625 execute( TC_hlr_location_cancel_request_withdraw(), 20.0 );
3626 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 20.0 );
3627 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 20.0 );
Harald Welte04683d02018-02-16 22:43:45 +01003628 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01003629 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02003630 execute( TC_attach_rau_a_a() );
Alexander Couzensbe837bd2018-07-31 04:20:11 +02003631 execute( TC_attach_rau_a_b() );
Alexander Couzens0c6324f2018-09-14 16:37:04 +02003632 execute( TC_attach_usim_resync() );
Eric Wildc555be52021-05-15 19:48:22 +02003633 execute( TC_attach_usim_a54_a54() );
3634 execute( TC_attach_usim_a54_a53() );
3635 execute( TC_attach_usim_a53_a54() );
3636 execute( TC_attach_usim_a50_a54() );
3637 execute( TC_attach_usim_a54_a50() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01003638 execute( TC_detach_unknown_nopoweroff() );
3639 execute( TC_detach_unknown_poweroff() );
3640 execute( TC_detach_nopoweroff() );
3641 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01003642 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01003643 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01003644 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01003645 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01003646 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01003647 execute( TC_attach_pdp_act_user_deact_mt() );
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02003648 execute( TC_attach_pdp_act_deact_dup() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02003649 execute( TC_attach_second_attempt() );
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02003650 execute( TC_attach_echo_timeout() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02003651 execute( TC_attach_restart_ctr_echo() );
3652 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02003653 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02003654 execute( TC_attach_pdp_act_deact_gtp_retrans() );
3655 execute( TC_attach_pdp_act_deact_gtp_retrans_resp() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02003656 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Alexander Couzens6bee0872019-05-11 01:48:50 +02003657 execute( TC_attach_pdp_act_gmm_detach() );
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02003658 execute( TC_attach_gmm_attach_req_while_gmm_attach() );
Harald Weltea05b8072019-04-23 22:35:05 +02003659
Harald Welte2aaac1b2019-05-02 10:02:53 +02003660 execute( TC_xid_empty_l3() );
3661 execute( TC_xid_n201u() );
3662
Harald Weltea05b8072019-04-23 22:35:05 +02003663 execute( TC_llc_null() );
Harald Welte645a1512019-04-23 23:18:23 +02003664 execute( TC_llc_sabm_dm_llgmm() );
3665 execute( TC_llc_sabm_dm_ll5() );
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003666
Harald Welte8e5932e2020-06-17 22:12:54 +02003667 execute( TC_suspend_nopaging() );
3668 execute( TC_suspend_resume() );
3669 execute( TC_suspend_rau() );
3670 execute( TC_paging_ps() );
3671
Philipp Maier7df55e02020-12-14 23:46:04 +01003672 execute( TC_bssgp_rim_single_report() );
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003673 execute( TC_rim_eutran_to_geran() );
Philipp Maier7df55e02020-12-14 23:46:04 +01003674
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01003675 execute( TC_cell_change_different_rai_ci_attach() );
3676 execute( TC_cell_change_different_rai_ci_data() );
3677 execute( TC_cell_change_different_ci_attach() );
3678 execute( TC_cell_change_different_ci_data() );
3679
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003680 /* At the end, may crash osmo-sgsn, see OS#3957, OS#4245 */
3681 execute( TC_attach_req_id_req_ra_update() );
Harald Welte5ac31492018-02-15 20:39:13 +01003682}
Harald Welte96a33b02018-02-04 10:36:22 +01003683
3684
3685
3686}