blob: f633101365564a342e809c13dd355b6b55e934f5 [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 Hofmeyr0ecb2e32018-04-30 15:13:55 +020058import from MobileL3_MM_Types all;
59
Harald Welteeded9ad2018-02-17 20:57:34 +010060
Harald Welte5ac31492018-02-15 20:39:13 +010061modulepar {
62 /* IP/port on which we run our internal GSUP/HLR emulation */
63 charstring mp_hlr_ip := "127.0.0.1";
64 integer mp_hlr_port := 4222;
Pau Espin Pedrol7bac69f2021-05-04 15:53:06 +020065 charstring mp_ggsn_ip := "127.0.0.103";
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +020066 integer mp_echo_interval := 5; /* in seconds. Only used in test enabling g_use_echo */
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +020067 charstring mp_sgsn_gtp_ip := "127.0.0.10";
Alexander Couzens2c12b242018-07-31 00:30:11 +020068
Alexander Couzensf3c1b412018-08-24 00:42:51 +020069 NSConfigurations mp_nsconfig := {
70 {
Harald Welte5e514fa2018-07-05 00:01:45 +020071 nsei := 96,
72 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +010073 handle_sns := false,
74 nsvc := {
75 {
76 provider := {
77 ip := {
78 address_family := AF_INET,
79 local_udp_port := 21010,
80 local_ip := "127.0.0.1",
81 remote_udp_port := 23000,
Harald Weltebe7afce2021-01-17 22:04:36 +010082 remote_ip := "127.0.0.1",
83 data_weight := 1,
84 signalling_weight := 1
Harald Welte90f19742020-11-06 19:34:40 +010085 }
86 },
87 nsvci := 97
88 }
89 }
Alexander Couzensf3c1b412018-08-24 00:42:51 +020090 },
91 {
Harald Welte5e514fa2018-07-05 00:01:45 +020092 nsei := 97,
93 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +010094 handle_sns := false,
95 nsvc := {
96 {
97 provider := {
98 ip := {
99 address_family := AF_INET,
100 local_udp_port := 21011,
101 local_ip := "127.0.0.1",
102 remote_udp_port := 23000,
Harald Weltebe7afce2021-01-17 22:04:36 +0100103 remote_ip := "127.0.0.1",
104 data_weight := 1,
105 signalling_weight := 1
Harald Welte90f19742020-11-06 19:34:40 +0100106 }
107 },
108 nsvci := 98
109 }
110 }
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200111 },
112 {
Harald Welte5e514fa2018-07-05 00:01:45 +0200113 nsei := 98,
114 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +0100115 handle_sns := false,
116 nsvc := {
117 {
118 provider := {
119 ip := {
120 address_family := AF_INET,
121 local_udp_port := 21012,
122 local_ip := "127.0.0.1",
123 remote_udp_port := 23000,
Harald Weltebe7afce2021-01-17 22:04:36 +0100124 remote_ip := "127.0.0.1",
125 data_weight := 1,
126 signalling_weight := 1
Harald Welte90f19742020-11-06 19:34:40 +0100127 }
128 },
129 nsvci := 99
130 }
131 }
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200132 }
Alexander Couzens2c12b242018-07-31 00:30:11 +0200133 };
Harald Welte26fbb6e2019-04-14 17:32:46 +0200134
135 RAN_Configurations mp_ranap_cfg := {
136 {
137 transport := RANAP_TRANSPORT_IuCS,
138 sccp_service_type := "mtp3_itu",
139 sctp_addr := { 23908, "127.0.0.1", 2905, "127.0.0.1" },
140 own_pc := 195,
141 own_ssn := 142,
142 peer_pc := 188, /* 0.23.4 */
143 peer_ssn := 142,
144 sio := '83'O,
145 rctx := 2
146 }
147 }
Harald Welte5ac31492018-02-15 20:39:13 +0100148};
149
Harald Welte5339b2e2020-10-04 22:52:56 +0200150const integer NUM_BVC_PER_NSE := 1;
Harald Welte5ac31492018-02-15 20:39:13 +0100151type record GbInstance {
152 NS_CT vc_NS,
153 BSSGP_CT vc_BSSGP,
Harald Welte5339b2e2020-10-04 22:52:56 +0200154 BSSGP_BVC_CT vc_BSSGP_BVC[NUM_BVC_PER_NSE],
Harald Welte5ac31492018-02-15 20:39:13 +0100155 BssgpConfig cfg
156};
Harald Welte96a33b02018-02-04 10:36:22 +0100157
Harald Welte2fa771f2019-05-02 20:13:53 +0200158const integer NUM_GB := 3;
159type record length(NUM_GB) of GbInstance GbInstances;
160type record length(NUM_GB) of NSConfiguration NSConfigurations;
161type record length(NUM_GB) of BssgpCellId BssgpCellIds;
Alexander Couzens51114d12018-07-31 18:41:56 +0200162
Harald Welte26fbb6e2019-04-14 17:32:46 +0200163const integer NUM_RNC := 1;
164type record of RAN_Configuration RAN_Configurations;
165
Harald Welte96a33b02018-02-04 10:36:22 +0100166type component test_CT {
Alexander Couzens51114d12018-07-31 18:41:56 +0200167 var GbInstances g_gb;
Harald Welte26fbb6e2019-04-14 17:32:46 +0200168 var RAN_Adapter g_ranap[NUM_RNC];
Alexander Couzens1552e792019-07-23 20:38:39 +0200169 var boolean g_ranap_enable := false;
Harald Welte96a33b02018-02-04 10:36:22 +0100170
Harald Welte5ac31492018-02-15 20:39:13 +0100171 var GSUP_Emulation_CT vc_GSUP;
172 var IPA_Emulation_CT vc_GSUP_IPA;
173 /* only to get events from IPA underneath GSUP */
174 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +0100175
Harald Welte5339b2e2020-10-04 22:52:56 +0200176 /* only needed at start to get the per-BVC references */
177 port BSSGP_CT_PROC_PT PROC;
178
Philipp Maier7df55e02020-12-14 23:46:04 +0100179 /* used by RIM related test */
180 port BSSGP_PT RIM[NUM_GB];
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +0200181 port GTPEM_PT GTPC;
Philipp Maier7df55e02020-12-14 23:46:04 +0100182
Harald Welteeded9ad2018-02-17 20:57:34 +0100183 var GTP_Emulation_CT vc_GTP;
184
Harald Weltebd194722018-02-16 22:11:08 +0100185 port TELNETasp_PT SGSNVTY;
186
Harald Welte96a33b02018-02-04 10:36:22 +0100187 var boolean g_initialized := false;
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200188 var boolean g_use_echo := false;
Harald Welte96a33b02018-02-04 10:36:22 +0100189};
190
Harald Welte26fbb6e2019-04-14 17:32:46 +0200191type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr, RAN_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100192 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +0100193 timer g_Tguard;
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200194 var LLC_Entities llc;
Harald Welte5ac31492018-02-15 20:39:13 +0100195}
196
197type record SGSN_ConnHdlrNetworkPars {
198 boolean expect_ptmsi,
199 boolean expect_auth,
200 boolean expect_ciph
201};
202
203type record BSSGP_ConnHdlrPars {
204 /* IMEI of the simulated ME */
205 hexstring imei,
Alexander Couzens8f0fb002018-05-02 19:30:55 +0200206 /* IMSI of the simulated MS */
Harald Welte5ac31492018-02-15 20:39:13 +0100207 hexstring imsi,
208 /* MSISDN of the simulated MS (probably unused) */
209 hexstring msisdn,
210 /* P-TMSI allocated to the simulated MS */
211 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +0100212 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100213 /* TLLI of the simulated MS */
214 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +0100215 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100216 RoutingAreaIdentificationV ra optional,
Alexander Couzens51114d12018-07-31 18:41:56 +0200217 BssgpCellIds bssgp_cell_id,
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200218 /* Tracks the RNC state. If true next L3 message will be sent with InitiualUe */
219 boolean rnc_send_initial_ue,
Harald Welte5ac31492018-02-15 20:39:13 +0100220 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +0100221 SGSN_ConnHdlrNetworkPars net,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200222 float t_guard,
223 /* only in IuPS / RANAP case */
Alexander Couzens1552e792019-07-23 20:38:39 +0200224 SCCP_PAR_Address sccp_addr_local optional,
225 SCCP_PAR_Address sccp_addr_peer optional
Harald Welte5ac31492018-02-15 20:39:13 +0100226};
227
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +0200228/* Passed in RAN-INFO message from emulated neighbor using RIM */
229const octetstring si1_default := '198fb100000000000000000000000000007900002b'O;
230const octetstring si3_default := '1b753000f110236ec9033c2747407900003c0b2b2b'O;
231const octetstring si13_default := '009000185a6fc9e08410ab2b2b2b2b2b2b2b2b2b2b'O;
232const octetstring si_default := si1_default & si3_default & si13_default;
233
Alexander Couzens89508702018-07-31 04:16:10 +0200234private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200235 /* mcc_mnc is encoded as of 24.008 10.5.5.15 */
Alexander Couzens89508702018-07-31 04:16:10 +0200236 var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;
237
238 var RoutingAreaIdentificationV ret := {
239 mccDigit1 := mcc_mnc[0],
240 mccDigit2 := mcc_mnc[1],
241 mccDigit3 := mcc_mnc[2],
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200242 mncDigit3 := mcc_mnc[3],
243 mncDigit1 := mcc_mnc[4],
244 mncDigit2 := mcc_mnc[5],
Pau Espin Pedroldeaaa902021-02-12 18:41:04 +0100245 lac := int2oct(cell_id.ra_id.lai.lac, 2),
246 rac := int2oct(cell_id.ra_id.rac, 1)
Alexander Couzens89508702018-07-31 04:16:10 +0200247 }
248 return ret;
249};
250
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +0100251private function f_BssgpCellId_to_GTP_CellId(in BssgpCellId cell_id) return GTP_CellId
252{
253 template (value) GTP_CellId ret := ts_GTP_CellId(cell_id.ra_id, cell_id.cell_id);
254 return valueof(ret);
255}
256
Alexander Couzens51114d12018-07-31 18:41:56 +0200257private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
Pau Espin Pedrol494e8b32022-02-22 16:46:23 +0100258 gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset)) alive;
259 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset)) alive;
Harald Welte5ac31492018-02-15 20:39:13 +0100260 /* connect lower end of BSSGP emulation with NS upper port */
261 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
Harald Welte5ac31492018-02-15 20:39:13 +0100262
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200263 gb.vc_NS.start(NSStart(mp_nsconfig[offset]));
Harald Welte5339b2e2020-10-04 22:52:56 +0200264 gb.vc_BSSGP.start(BssgpStart(gb.cfg, testcasename()));
265 /* resolve the per-BVC component references */
266 for (var integer i := 0; i < lengthof(gb.cfg.bvc); i := i+1) {
267 connect(self:PROC, gb.vc_BSSGP:PROC);
268 gb.vc_BSSGP_BVC[i] := f_bssgp_get_bvci_ct(gb.cfg.bvc[i].bvci, PROC);
269 disconnect(self:PROC, gb.vc_BSSGP:PROC);
270 }
Philipp Maier7df55e02020-12-14 23:46:04 +0100271 /* connect RIM related port */
272 connect(gb.vc_BSSGP:RIM, self:RIM[offset]);
Harald Welte5ac31492018-02-15 20:39:13 +0100273}
274
275private function f_init_gsup(charstring id) runs on test_CT {
276 id := id & "-GSUP";
277 var GsupOps ops := {
278 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
279 };
280
281 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
282 vc_GSUP := GSUP_Emulation_CT.create(id);
283
284 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
285 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
286 /* we use this hack to get events like ASP_IPA_EVENT_UP */
287 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
288
289 vc_GSUP.start(GSUP_Emulation.main(ops, id));
290 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
291
292 /* wait for incoming connection to GSUP port before proceeding */
293 timer T := 10.0;
294 T.start;
295 alt {
Vadim Yanitskiy61564be2020-05-18 20:44:14 +0700296 [] GSUP_IPA_EVENT.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP)) { }
Harald Welte5ac31492018-02-15 20:39:13 +0100297 [] T.timeout {
298 setverdict(fail, "No connection to GSUP Port");
Daniel Willmannafce8662018-07-06 23:11:32 +0200299 mtc.stop;
Harald Welte5ac31492018-02-15 20:39:13 +0100300 }
301 }
302}
303
Harald Welteeded9ad2018-02-17 20:57:34 +0100304private function f_init_gtp(charstring id) runs on test_CT {
305 id := id & "-GTP";
306
307 var GtpEmulationCfg gtp_cfg := {
308 gtpc_bind_ip := mp_ggsn_ip,
309 gtpc_bind_port := GTP1C_PORT,
310 gtpu_bind_ip := mp_ggsn_ip,
311 gtpu_bind_port := GTP1U_PORT,
312 sgsn_role := false
313 };
314
315 vc_GTP := GTP_Emulation_CT.create(id);
316 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
317}
318
Alexander Couzens8e1dfd02020-09-07 04:26:20 +0200319friend function f_init_vty() runs on test_CT {
Harald Weltebd194722018-02-16 22:11:08 +0100320 map(self:SGSNVTY, system:SGSNVTY);
321 f_vty_set_prompts(SGSNVTY);
322 f_vty_transceive(SGSNVTY, "enable");
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200323 f_vty_transceive(SGSNVTY, "reset sgsn state");
Harald Weltebd194722018-02-16 22:11:08 +0100324 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
325}
326
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200327private function f_vty_enable_echo_interval(boolean enable) runs on test_CT {
328 if (enable) {
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +0200329 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 echo-interval " & int2str(mp_echo_interval));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200330 } else {
331 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 no echo-interval");
332 }
333}
334
Harald Weltebd194722018-02-16 22:11:08 +0100335
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200336/* mcc_mnc is 24.008 10.5.5.15 encoded. 262 42 */
337function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
Harald Welte26fbb6e2019-04-14 17:32:46 +0200338 var integer i;
339
Harald Welte96a33b02018-02-04 10:36:22 +0100340 if (g_initialized == true) {
341 return;
342 }
343 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100344 g_gb[0].cfg := {
345 nsei := 96,
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200346 sgsn_role := false,
Harald Welte5339b2e2020-10-04 22:52:56 +0200347 bvc := {
348 {
349 bvci := 196,
350 cell_id := {
351 ra_id := {
352 lai := {
353 mcc_mnc := mcc_mnc,
354 lac := 13135
355 },
356 rac := 0
357 },
358 cell_id := 20960
359 },
Harald Welte4d112c92020-11-12 19:48:31 +0100360 depth := BSSGP_DECODE_DEPTH_L3,
361 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
Harald Welte5339b2e2020-10-04 22:52:56 +0200362 }
363 }
Harald Welte5ac31492018-02-15 20:39:13 +0100364 };
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200365 g_gb[1].cfg := {
366 nsei := 97,
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200367 sgsn_role := false,
Harald Welte5339b2e2020-10-04 22:52:56 +0200368 bvc := {
369 {
370 bvci := 210,
371 cell_id := {
372 ra_id := {
373 lai := {
374 mcc_mnc := mcc_mnc,
375 lac := 13200
376 },
377 rac := 0
378 },
379 cell_id := 20961
380 },
Harald Welte4d112c92020-11-12 19:48:31 +0100381 depth := BSSGP_DECODE_DEPTH_L3,
382 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
Harald Welte5339b2e2020-10-04 22:52:56 +0200383 }
384 }
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200385 };
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100386 g_gb[2].cfg := { /* [2] configured to have same RAC as [1] */
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200387 nsei := 98,
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200388 sgsn_role := false,
Harald Welte5339b2e2020-10-04 22:52:56 +0200389 bvc := {
390 {
391 bvci := 220,
392 cell_id := {
393 ra_id := {
394 lai := {
395 mcc_mnc := mcc_mnc,
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100396 lac := 13200
Harald Welte5339b2e2020-10-04 22:52:56 +0200397 },
398 rac := 0
399 },
400 cell_id := 20962
401 },
Harald Welte4d112c92020-11-12 19:48:31 +0100402 depth := BSSGP_DECODE_DEPTH_L3,
403 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
Harald Welte5339b2e2020-10-04 22:52:56 +0200404 }
405 }
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200406 };
Harald Welte96a33b02018-02-04 10:36:22 +0100407
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200408 f_init_vty();
Alexander Couzens51114d12018-07-31 18:41:56 +0200409 f_init_gb(g_gb[0], "SGSN_Test-Gb0", 0);
410 f_init_gb(g_gb[1], "SGSN_Test-Gb1", 1);
411 f_init_gb(g_gb[2], "SGSN_Test-Gb2", 2);
Harald Welte26fbb6e2019-04-14 17:32:46 +0200412
Alexander Couzens1552e792019-07-23 20:38:39 +0200413 if (g_ranap_enable) {
414 for (i := 0; i < NUM_RNC; i := i+1) {
415 f_ran_adapter_init(g_ranap[i], mp_ranap_cfg[i], "SGSN_Test_" & int2str(i), RNC_RanOps);
416 f_ran_adapter_start(g_ranap[i]);
417 }
Harald Welte26fbb6e2019-04-14 17:32:46 +0200418 }
Harald Welte5ac31492018-02-15 20:39:13 +0100419 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100420 f_init_gtp("SGSN_Test");
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200421 f_vty_enable_echo_interval(g_use_echo);
Harald Welte5ac31492018-02-15 20:39:13 +0100422}
Harald Welte96a33b02018-02-04 10:36:22 +0100423
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200424function f_cleanup() runs on test_CT {
425 var integer i;
Alexander Couzens1552e792019-07-23 20:38:39 +0200426 if (g_ranap_enable) {
427 for (i := 0; i < NUM_RNC; i := i+1) {
428 f_ran_adapter_cleanup(g_ranap[i]);
429 }
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200430 }
431 self.stop;
432}
433
Harald Welte26fbb6e2019-04-14 17:32:46 +0200434private function RncUnitdataCallback(RANAP_PDU ranap)
435runs on RAN_Emulation_CT return template RANAP_PDU {
436 var template RANAP_PDU resp := omit;
437
438 log ("RANAP_RncUnitDataCallback");
439 /* answer all RESET with RESET ACK */
440 if (match(ranap, tr_RANAP_Reset)) {
441 log("RANAP_RncUnitdataCallback: Responding to RESET with RESET-ACK");
442 var CN_DomainIndicator dom;
443 dom := ranap.initiatingMessage.value_.Reset.protocolIEs[1].value_.cN_DomainIndicator;
444 resp := ts_RANAP_ResetAck(dom);
445 }
446 return resp;
447}
448
449const RanOps RNC_RanOps := {
450 ranap_create_cb := refers(RAN_Emulation.RanapExpectedCreateCallback),
451 ranap_unitdata_cb := refers(RncUnitdataCallback),
452 ps_domain := true,
453 decode_dtap := true,
454 role_ms := true,
455 protocol := RAN_PROTOCOL_RANAP,
456 transport := RANAP_TRANSPORT_IuCS,
457 use_osmux := false,
Eric Wild6e511ce2022-04-02 21:35:56 +0200458 bssap_reset_retries := 1,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200459 sccp_addr_local := omit,
460 sccp_addr_peer := omit
461};
462
Harald Welte5ac31492018-02-15 20:39:13 +0100463type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
464
465/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Alexander Couzens51114d12018-07-31 18:41:56 +0200466function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix,
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100467 float t_guard := 30.0, boolean expect_ciph := false)
Harald Welte5ac31492018-02-15 20:39:13 +0100468runs on test_CT return BSSGP_ConnHdlr {
469 var BSSGP_ConnHdlr vc_conn;
470 var SGSN_ConnHdlrNetworkPars net_pars := {
471 expect_ptmsi := true,
472 expect_auth := true,
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100473 expect_ciph := expect_ciph
Harald Welte5ac31492018-02-15 20:39:13 +0100474 };
475 var BSSGP_ConnHdlrPars pars := {
476 imei := f_gen_imei(imsi_suffix),
477 imsi := f_gen_imsi(imsi_suffix),
478 msisdn := f_gen_msisdn(imsi_suffix),
479 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100480 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100481 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100482 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100483 ra := omit,
Harald Welte5339b2e2020-10-04 22:52:56 +0200484 bssgp_cell_id := {
485 gb[0].cfg.bvc[0].cell_id,
486 gb[1].cfg.bvc[0].cell_id,
487 gb[2].cfg.bvc[0].cell_id
488 },
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200489 rnc_send_initial_ue := true,
Harald Welte5ac31492018-02-15 20:39:13 +0100490 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100491 net := net_pars,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200492 t_guard := t_guard,
Alexander Couzens1552e792019-07-23 20:38:39 +0200493 sccp_addr_local := omit,
494 sccp_addr_peer := omit
Harald Welte5ac31492018-02-15 20:39:13 +0100495 };
496
Alexander Couzens1552e792019-07-23 20:38:39 +0200497 if (g_ranap_enable) {
498 pars.sccp_addr_local := g_ranap[0].sccp_addr_own;
499 pars.sccp_addr_peer := g_ranap[0].sccp_addr_peer;
500 }
501
Harald Welte5ac31492018-02-15 20:39:13 +0100502 vc_conn := BSSGP_ConnHdlr.create(id);
Harald Welte5339b2e2020-10-04 22:52:56 +0200503
504 connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_SP);
505 connect(vc_conn:BSSGP_SIG[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
506 connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100507 connect(vc_conn:BSSGP_GLOBAL[0], gb[0].vc_BSSGP:GLOBAL);
Harald Welte5339b2e2020-10-04 22:52:56 +0200508
509 connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_SP);
510 connect(vc_conn:BSSGP_SIG[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
511 connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100512 connect(vc_conn:BSSGP_GLOBAL[1], gb[1].vc_BSSGP:GLOBAL);
Harald Welte5339b2e2020-10-04 22:52:56 +0200513
514 connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_SP);
515 connect(vc_conn:BSSGP_SIG[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
516 connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100517 connect(vc_conn:BSSGP_GLOBAL[2], gb[2].vc_BSSGP:GLOBAL);
Harald Welte5ac31492018-02-15 20:39:13 +0100518
Harald Welte26fbb6e2019-04-14 17:32:46 +0200519 /* FIXME: support multiple RNCs */
Alexander Couzens1552e792019-07-23 20:38:39 +0200520 if (g_ranap_enable) {
521 connect(vc_conn:BSSAP, g_ranap[0].vc_RAN:CLIENT);
522 connect(vc_conn:BSSAP_PROC, g_ranap[0].vc_RAN:PROC);
523 }
Harald Welte26fbb6e2019-04-14 17:32:46 +0200524
Harald Welte5ac31492018-02-15 20:39:13 +0100525 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
526 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
527
Harald Welteeded9ad2018-02-17 20:57:34 +0100528 connect(vc_conn:GTP, vc_GTP:CLIENT);
529 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
530
Harald Welte5ac31492018-02-15 20:39:13 +0100531 vc_conn.start(f_handler_init(fn, id, pars));
532 return vc_conn;
533}
534
Harald Welte62e29582018-02-16 21:17:11 +0100535private altstep as_Tguard() runs on BSSGP_ConnHdlr {
536 [] g_Tguard.timeout {
537 setverdict(fail, "Tguard timeout");
Daniel Willmannafce8662018-07-06 23:11:32 +0200538 mtc.stop;
Harald Welte62e29582018-02-16 21:17:11 +0100539 }
540}
541
Harald Welte5ac31492018-02-15 20:39:13 +0100542/* first function called in every ConnHdlr */
543private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
544runs on BSSGP_ConnHdlr {
545 /* do some common stuff like setting up g_pars */
546 g_pars := pars;
547
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200548 llc := f_llc_create(false);
549
Harald Welte5ac31492018-02-15 20:39:13 +0100550 /* register with BSSGP core */
Harald Welte5339b2e2020-10-04 22:52:56 +0200551 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Harald Welte5ac31492018-02-15 20:39:13 +0100552 /* tell GSUP dispatcher to send this IMSI to us */
553 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100554 /* tell GTP dispatcher to send this IMSI to us */
555 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100556
Harald Welte62e29582018-02-16 21:17:11 +0100557 g_Tguard.start(pars.t_guard);
558 activate(as_Tguard());
559
Harald Welte5ac31492018-02-15 20:39:13 +0100560 /* call the user-supplied test case function */
561 fn.apply(id);
562 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100563}
564
565/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100566 * Detach without Attach
567 * SM procedures without attach / RAU
568 * ATTACH / RAU
569 ** with / without authentication
570 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100571 * re-transmissions of LLC frames
572 * PDP Context activation
573 ** with different GGSN config in SGSN VTY
574 ** with different PDP context type (v4/v6/v46)
575 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100576 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100577 */
578
579testcase TC_wait_ns_up() runs on test_CT {
580 f_init();
581 f_sleep(20.0);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200582 f_cleanup();
Harald Welte96a33b02018-02-04 10:36:22 +0100583}
584
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200585friend function is_gb(integer ran_index) return boolean {
586 return ran_index < NUM_GB;
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200587}
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200588friend function is_iu(integer ran_index) return boolean {
589 return ran_index >= NUM_GB;
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200590}
591
Alexander Couzens0507ec32019-09-15 22:41:22 +0200592function f_send_llc(template (value) PDU_LLC llc_pdu, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltea05b8072019-04-23 22:35:05 +0200593 var octetstring llc_enc := enc_PDU_LLC(valueof(llc_pdu));
Alexander Couzens0507ec32019-09-15 22:41:22 +0200594 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 +0200595}
596
Alexander Couzens0507ec32019-09-15 22:41:22 +0200597private 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 +0200598 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
599 var BIT4 sapi := f_llc_sapi_by_l3_mo(valueof(l3_mo));
600 var integer n_u := f_llc_get_n_u_tx(llc[bit2int(sapi)]);
Alexander Couzens0507ec32019-09-15 22:41:22 +0200601 f_send_llc(ts_LLC_UI(l3_enc, sapi, '0'B, n_u), ran_index);
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200602}
603
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200604/* trigger sending of a RANAP InitialUE and wait for SCCP connection confirmation */
605function f_send_l3_initial_ue(template (value) PDU_L3_MS_SGSN l3_mo) runs on BSSGP_ConnHdlr {
606 log("Sending InitialUE: ", l3_mo);
607 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
608 var RANAP_PDU ranap;
609 var LAI lai := {
610 pLMNidentity := '62F224'O,
611 lAC := '1234'O,
612 iE_Extensions := omit
613 };
614 var SAI sai := {
615 pLMNidentity := lai.pLMNidentity,
616 lAC := lai.lAC,
617 sAC := '0000'O, /* FIXME */
618 iE_Extensions := omit
619 };
620 var IuSignallingConnectionIdentifier sigc_id := int2bit(23, 24); /* FIXME */
621 var GlobalRNC_ID grnc_id := {
622 pLMNidentity := lai.pLMNidentity,
623 rNC_ID := 2342 /* FIXME */
624 };
625
626 ranap := valueof(ts_RANAP_initialUE_CS(lai, sai, l3_enc, sigc_id, grnc_id));
627 BSSAP.send(ts_RANAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_local, ranap));
628 alt {
629 [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {}
630 [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
631 setverdict(fail, "DISC.ind from SCCP");
632 mtc.stop;
633 }
634 }
635}
636
637/* send a L3 (GMM/SM) message over whatever is the appropriate lower-layer bearer */
Alexander Couzens0507ec32019-09-15 22:41:22 +0200638function f_send_l3(template (value) PDU_L3_MS_SGSN l3_mo, integer ran_index := 0) runs on BSSGP_ConnHdlr {
639 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200640 if (g_pars.rnc_send_initial_ue) {
641 g_pars.rnc_send_initial_ue := false;
642 f_send_l3_initial_ue(l3_mo);
643 } else {
644 BSSAP.send(ts_PDU_DTAP_PS_MO(l3_mo));
645 }
646 } else {
Alexander Couzens0507ec32019-09-15 22:41:22 +0200647 f_send_l3_gmm_llc(l3_mo, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200648 }
649}
650
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200651altstep as_mm_identity(integer ran_index := 0) runs on BSSGP_ConnHdlr {
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700652 var MobileIdentityLV mi;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200653 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_ID_REQ('001'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100654 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200655 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100656 repeat;
657 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200658 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200659 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200660 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200661 repeat;
662 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200663 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_ID_REQ('010'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100664 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200665 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200666 repeat;
667 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200668 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200669 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200670 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100671 repeat;
672 }
673}
Harald Welte96a33b02018-02-04 10:36:22 +0100674
Harald Welteca362462019-05-02 20:11:21 +0200675/* receive a L3 (GMM/SM) message over whatever is the appropriate lower-layer bearer */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200676function f_receive_l3(template PDU_L3_SGSN_MS rx_tpl := ?, integer ran_index := 0)
Harald Welteca362462019-05-02 20:11:21 +0200677runs on BSSGP_ConnHdlr return PDU_L3_SGSN_MS {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200678 var PDU_DTAP_PS_MT mt;
Harald Welteca362462019-05-02 20:11:21 +0200679 var PDU_L3_SGSN_MS l3_mt;
680 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200681 [is_gb(ran_index)] BSSGP[ran_index].receive(rx_tpl) -> value l3_mt { }
682 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(rx_tpl)) -> value mt {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200683 l3_mt := mt.dtap;
684 }
Harald Welteca362462019-05-02 20:11:21 +0200685 }
686 return l3_mt;
687}
688
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100689/* (copied from msc/BSC_ConnectionHandler.ttcn) */
690private altstep as_ciph_utran() runs on BSSGP_ConnHdlr
691{
692 [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(uia_algs := ?,
693 uia_key := oct2bit(g_pars.vec.ik),
694 key_sts := ?,
695 uea_algs := ?,
696 uea_key := oct2bit(g_pars.vec.ck))) {
697 var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1*/
698 var EncryptionAlgorithm uea_chosen := 1; /*standard_UMTS_encryption_algorith_UEA1*/
699 BSSAP.send(ts_RANAP_SecurityModeCompleteEnc(uia_chosen, uea_chosen));
700 }
701 [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(?,?,?,?,?)) {
702 setverdict(fail, "Invalid SecurityModeCommand (ciphering case)");
703 mtc.stop;
704 }
705 [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(uia_algs := ?,
706 uia_key := oct2bit(g_pars.vec.ik),
707 key_sts := ?)) {
708 var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1;*/
709 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
710 }
711 [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(?,?,?)) {
712 setverdict(fail, "Invalid SecurityModeCommand (non-ciphering case)");
713 mtc.stop;
714 }
715}
716
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200717/* perform GMM authentication (if expected).
718 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
719 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200720function 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 +0100721 var PDU_L3_MS_SGSN l3_mo;
722 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200723 var default di := activate(as_mm_identity(ran_index));
Harald Welte5ac31492018-02-15 20:39:13 +0100724 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200725 var GSUP_IE auth_tuple;
726 var template AuthenticationParameterAUTNTLV autn;
727
728 if (umts_aka_challenge) {
729 g_pars.vec := f_gen_auth_vec_3g();
730 autn := {
731 elementIdentifier := '28'O,
732 lengthIndicator := lengthof(g_pars.vec.autn),
733 autnValue := g_pars.vec.autn
734 };
735
736 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
737 g_pars.vec.sres,
738 g_pars.vec.kc,
739 g_pars.vec.ik,
740 g_pars.vec.ck,
741 g_pars.vec.autn,
742 g_pars.vec.res));
743 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
744 } else {
745 g_pars.vec := f_gen_auth_vec_2g();
746 autn := omit;
747 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
748 g_pars.vec.sres,
749 g_pars.vec.kc));
750 log("GSUP sends only 2G auth tuple", auth_tuple);
751 }
Harald Welteca362462019-05-02 20:11:21 +0200752
Harald Welte5ac31492018-02-15 20:39:13 +0100753 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
754 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200755
756 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
757 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200758 l3_mt := f_receive_l3(auth_ciph_req, ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100759 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200760 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
761
762 if (umts_aka_challenge and not force_gsm_sres) {
763 /* set UMTS response instead */
764 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
765 valueField := substr(g_pars.vec.res, 0, 4)
766 };
767 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
768 elementIdentifier := '21'O,
769 lengthIndicator := lengthof(g_pars.vec.res) - 4,
770 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
771 };
772 }
773
774 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100775 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
776 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
777 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
778 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
779 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200780 f_send_l3(l3_mo, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200781
782 /* Security Mode Command + Complete on Iu case */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200783 if (is_iu(ran_index)) {
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100784 as_ciph_utran();
785 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)));
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200786 }
Harald Welte76dee092018-02-16 22:12:59 +0100787 } else {
788 /* wait for identity procedure */
789 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100790 }
Harald Welte76dee092018-02-16 22:12:59 +0100791
Harald Welte5ac31492018-02-15 20:39:13 +0100792 deactivate(di);
793}
794
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200795function f_upd_ptmsi_and_tlli(OCT4 p_tmsi, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltef70997d2018-02-17 10:11:19 +0100796 g_pars.p_tmsi := p_tmsi;
797 /* update TLLI */
798 g_pars.tlli_old := g_pars.tlli;
799 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
Daniel Willmann1c2ff0f2020-01-28 14:39:25 +0100800 if (is_gb(ran_index)) {
801 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli, BSSGP_PROC[ran_index]);
802 }
Harald Weltef70997d2018-02-17 10:11:19 +0100803}
804
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100805function f_process_attach_accept(PDU_GMM_AttachAccept aa, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100806 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100807 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Harald Weltedd9fb842021-02-16 20:21:22 +0100808 /* we cannot use ran_index here, as it would overflow the cell_id object, since ran_idx > NUM_GB
809 * indicates an Iu RAN connection. All cells are expected to run the same MCC/MNC anyway... */
810 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100811 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100812 & "; expected " & hex2str(g_pars.bssgp_cell_id[ran_index].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200813 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100814 }
Harald Welte04683d02018-02-16 22:43:45 +0100815 g_pars.ra := aa.routingAreaIdentification;
816 if (ispresent(aa.allocatedPTMSI)) {
817 if (not g_pars.net.expect_ptmsi) {
818 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200819 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100820 }
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100821 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets,
822 ran_index);
Harald Welte04683d02018-02-16 22:43:45 +0100823 }
824 if (ispresent(aa.msIdentity)) {
825 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200826 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100827 }
828 /* P-TMSI.sig */
829 if (ispresent(aa.ptmsiSignature)) {
830 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
831 }
832 /* updateTimer */
833 // aa.readyTimer
834 /* T3302, T3319, T3323, T3312_ext, T3324 */
835}
836
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200837function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +0100838 /* mandatory IE */
839 g_pars.ra := ra.routingAreaId;
840 if (ispresent(ra.allocatedPTMSI)) {
841 if (not g_pars.net.expect_ptmsi) {
842 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200843 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100844 }
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100845 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets,
846 ran_index);
Harald Welte91636de2018-02-17 10:16:14 +0100847 }
848 if (ispresent(ra.msIdentity)) {
849 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200850 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100851 }
852 /* P-TMSI.sig */
853 if (ispresent(ra.ptmsiSignature)) {
854 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
855 }
856 /* updateTimer */
857 // aa.readyTimer
858 /* T3302, T3319, T3323, T3312_ext, T3324 */
859}
860
861
Harald Welte5a4fa042018-02-16 20:59:21 +0100862function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
863 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
864}
865
Harald Welte23178c52018-02-17 09:36:33 +0100866/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700867private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100868 if (ispresent(g_pars.p_tmsi)) {
869 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
870 } else {
871 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
872 }
873}
874
Harald Welte311ec272018-02-17 09:40:03 +0100875private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100876 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100877 /* Expect MSC to perform LU with HLR */
878 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100879 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
880 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
881 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100882 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
883 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
884}
885
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100886friend function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres, integer ran_index := 0,
887 template (omit) RoutingAreaIdentificationV old_ra := omit) runs on BSSGP_ConnHdlr {
888 var RoutingAreaIdentificationV old_ra_val;
889 var template PDU_L3_MS_SGSN attach_req;
Harald Welteca362462019-05-02 20:11:21 +0200890 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5ac31492018-02-15 20:39:13 +0100891
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100892 if (istemplatekind(old_ra, "omit")) {
893 old_ra_val := f_random_RAI();
894 } else {
895 old_ra_val := valueof(old_ra);
896 }
897
898 attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra_val, false, false, omit, omit);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200899 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
900 * 3G auth vectors */
901 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
902 /* The thing is, if the solSACapability is 'omit', then the
903 * revisionLevelIndicatior is at the wrong place! */
904 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
905
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200906 f_send_l3(attach_req, ran_index);
907 f_gmm_auth(umts_aka_challenge, force_gsm_sres, ran_index);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200908 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100909 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100910
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200911 l3_mt := f_receive_l3(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?), ran_index);
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100912 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept, ran_index);
Harald Welteca362462019-05-02 20:11:21 +0200913
Harald Welte04683d02018-02-16 22:43:45 +0100914 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200915 f_send_l3(ts_GMM_ATTACH_COMPL, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200916
917 /* IuPS case: Expect Iu Release */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200918 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200919 as_iu_release_compl_disc();
920 }
Alexander Couzens42d3cad2019-10-08 16:29:26 +0200921
922 /* Race condition
923 * It has shown, that GMM_ATTACH_COMPL might take some time to arrive at the SGSN through the layers.
924 * In TC hlr_location_cancel_request_update, the GMM_ATTACH_COMPL came 2ms too late, so that the Location Cancel Request
925 * arrived before it. This results in a test case failure.
926 * Delay execution by 50 ms
927 */
928 f_sleep(0.05);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200929}
930
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200931friend function f_bssgp_suspend(integer ran_idx := 0) runs on BSSGP_ConnHdlr return OCT1 {
932 timer T := 5.0;
933 var PDU_BSSGP rx_pdu;
Harald Welte9b461a92020-12-10 23:41:14 +0100934 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 +0200935 T.start;
936 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100937 [] 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 +0200938 return rx_pdu.pDU_BSSGP_SUSPEND_ACK.suspend_Reference_Number.suspend_Reference_Number_value;
939 }
Harald Welte9b461a92020-12-10 23:41:14 +0100940 [] 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 +0200941 setverdict(fail, "SUSPEND-NACK in response to SUSPEND for TLLI ", g_pars.tlli);
942 mtc.stop;
943 }
944 [] T.timeout {
945 setverdict(fail, "No SUSPEND-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
946 mtc.stop;
947 }
948 }
949 return '00'O;
950}
951
952friend function f_bssgp_resume(OCT1 susp_ref, integer ran_idx := 0) runs on BSSGP_ConnHdlr {
953 timer T := 5.0;
Harald Welte9b461a92020-12-10 23:41:14 +0100954 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 +0200955 T.start;
956 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100957 [] BSSGP_GLOBAL[ran_idx].receive(tr_BSSGP_RESUME_ACK(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id));
958 [] 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 +0200959?)) {
960 setverdict(fail, "RESUME-NACK in response to RESUME for TLLI ", g_pars.tlli);
961 mtc.stop;
962 }
963 [] T.timeout {
964 setverdict(fail, "No RESUME-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
965 mtc.stop;
966 }
967 }
968}
969
970
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200971private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
972 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100973 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100974}
975
976testcase TC_attach() runs on test_CT {
977 var BSSGP_ConnHdlr vc_conn;
978 f_init();
979 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200980 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100981 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200982 f_cleanup();
Harald Welte5ac31492018-02-15 20:39:13 +0100983}
984
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100985testcase TC_attach_mnc3() runs on test_CT {
986 var BSSGP_ConnHdlr vc_conn;
987 f_init('023042'H);
988 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200989 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100990 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200991 f_cleanup();
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100992}
993
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200994private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
995 f_gmm_attach(true, false);
996 setverdict(pass);
997}
998testcase TC_attach_umts_aka_umts_res() runs on test_CT {
999 var BSSGP_ConnHdlr vc_conn;
1000 f_init();
1001 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001002 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001003 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001004 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001005}
1006
1007private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
1008 f_gmm_attach(true, true);
1009 setverdict(pass);
1010}
1011testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
1012 var BSSGP_ConnHdlr vc_conn;
1013 f_init();
1014 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001015 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001016 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001017 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001018}
1019
Harald Welte5b7c8122018-02-16 21:48:17 +01001020/* MS never responds to ID REQ, expect ATTACH REJECT */
1021private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +01001022 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1023
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001024 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001025 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001026 [] BSSGP[0].receive(tr_GMM_ID_REQ(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001027 /* don't send ID Response */
1028 repeat;
1029 }
Harald Welte955aa942019-05-03 01:29:29 +02001030 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('09'O)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001031 setverdict(pass);
1032 }
Harald Welte955aa942019-05-03 01:29:29 +02001033 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001034 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +02001035 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +01001036 }
1037 }
1038}
1039testcase TC_attach_auth_id_timeout() runs on test_CT {
1040 var BSSGP_ConnHdlr vc_conn;
1041 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001042 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 +01001043 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001044 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001045}
1046
1047/* HLR never responds to SAI REQ, expect ATTACH REJECT */
1048private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +01001049 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1050
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001051 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001052 alt {
1053 [] as_mm_identity();
1054 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
1055 }
1056 /* don't send SAI-response from HLR */
Harald Welte955aa942019-05-03 01:29:29 +02001057 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Welte5b7c8122018-02-16 21:48:17 +01001058 setverdict(pass);
1059}
1060testcase TC_attach_auth_sai_timeout() runs on test_CT {
1061 var BSSGP_ConnHdlr vc_conn;
1062 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001063 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +01001064 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001065 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001066}
1067
Harald Weltefe253882018-02-17 09:25:00 +01001068/* HLR rejects SAI, expect ATTACH REJECT */
1069private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +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 Weltefe253882018-02-17 09:25:00 +01001073 alt {
1074 [] as_mm_identity();
1075 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
1076 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
1077 }
1078 }
Harald Welte955aa942019-05-03 01:29:29 +02001079 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Weltefe253882018-02-17 09:25:00 +01001080 setverdict(pass);
1081}
1082testcase TC_attach_auth_sai_reject() runs on test_CT {
1083 var BSSGP_ConnHdlr vc_conn;
1084 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001085 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +01001086 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001087 f_cleanup();
Harald Weltefe253882018-02-17 09:25:00 +01001088}
1089
Harald Welte5b7c8122018-02-16 21:48:17 +01001090/* HLR never responds to UL REQ, expect ATTACH REJECT */
1091private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001092 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5b7c8122018-02-16 21:48:17 +01001093 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1094
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001095 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001096 f_gmm_auth();
1097 /* Expect MSC to perform LU with HLR */
1098 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
1099 /* Never follow-up with ISD_REQ or UL_RES */
1100 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001101 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001102 setverdict(pass);
1103 }
Harald Welte955aa942019-05-03 01:29:29 +02001104 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1105 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +01001106 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001107 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +01001108 }
1109 }
1110}
1111testcase TC_attach_gsup_lu_timeout() runs on test_CT {
1112 var BSSGP_ConnHdlr vc_conn;
1113 f_init();
1114 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001115 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +01001116 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001117 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001118}
1119
Harald Welteb7c14e92018-02-17 09:29:16 +01001120/* HLR rejects UL REQ, expect ATTACH REJECT */
1121private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001122 var PDU_L3_SGSN_MS l3_mt;
Harald Welteb7c14e92018-02-17 09:29:16 +01001123 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1124
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001125 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +01001126 f_gmm_auth();
1127 /* Expect MSC to perform LU with HLR */
1128 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
1129 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
1130 }
1131 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001132 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb7c14e92018-02-17 09:29:16 +01001133 setverdict(pass);
1134 }
Harald Welte955aa942019-05-03 01:29:29 +02001135 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1136 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welteb7c14e92018-02-17 09:29:16 +01001137 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001138 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +01001139 }
1140 }
1141}
1142testcase TC_attach_gsup_lu_reject() runs on test_CT {
1143 var BSSGP_ConnHdlr vc_conn;
1144 f_init();
1145 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001146 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +01001147 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001148 f_cleanup();
Harald Welteb7c14e92018-02-17 09:29:16 +01001149}
1150
1151
Harald Welte3823e2e2018-02-16 21:53:48 +01001152/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
1153private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001154 var PDU_L3_SGSN_MS l3_mt;
Harald Welte3823e2e2018-02-16 21:53:48 +01001155 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1156
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001157 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +01001158 f_gmm_auth();
1159 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +01001160 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +01001161
Harald Welte955aa942019-05-03 01:29:29 +02001162 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1163 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001164 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001165 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +01001166 setverdict(pass);
1167}
Harald Welte3823e2e2018-02-16 21:53:48 +01001168testcase TC_attach_combined() runs on test_CT {
1169 var BSSGP_ConnHdlr vc_conn;
1170 f_init();
1171 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001172 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +01001173 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001174 f_cleanup();
Harald Welte3823e2e2018-02-16 21:53:48 +01001175}
1176
Harald Welte76dee092018-02-16 22:12:59 +01001177/* Attempt of GPRS ATTACH in 'accept all' mode */
1178private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001179 var PDU_L3_SGSN_MS l3_mt;
Harald Welte76dee092018-02-16 22:12:59 +01001180 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1181
1182 g_pars.net.expect_auth := false;
1183
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001184 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +01001185 f_gmm_auth();
Harald Welte955aa942019-05-03 01:29:29 +02001186 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1187 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001188 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001189 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +01001190 setverdict(pass);
1191}
1192testcase TC_attach_accept_all() runs on test_CT {
1193 var BSSGP_ConnHdlr vc_conn;
1194 f_init();
1195 f_sleep(1.0);
1196 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +02001197 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +01001198 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001199 f_cleanup();
Harald Welte76dee092018-02-16 22:12:59 +01001200}
Harald Welte5b7c8122018-02-16 21:48:17 +01001201
Harald Welteb2124b22018-02-16 22:26:56 +01001202/* Attempt of GPRS ATTACH in 'accept all' mode */
1203private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +01001204 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1205
1206 /* Simulate a foreign IMSI */
1207 g_pars.imsi := '001010123456789'H;
Harald Welte5339b2e2020-10-04 22:52:56 +02001208 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Harald Welteb2124b22018-02-16 22:26:56 +01001209
1210 g_pars.net.expect_auth := false;
1211
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001212 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +01001213 alt {
1214 [] as_mm_identity();
Harald Welte955aa942019-05-03 01:29:29 +02001215 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('07'O)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001216 setverdict(pass);
1217 }
Harald Welte955aa942019-05-03 01:29:29 +02001218 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001219 setverdict(pass);
1220 }
Harald Welte955aa942019-05-03 01:29:29 +02001221 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001222 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001223 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001224 }
Harald Welteb2124b22018-02-16 22:26:56 +01001225 }
1226}
1227testcase TC_attach_closed() runs on test_CT {
1228 var BSSGP_ConnHdlr vc_conn;
1229 f_init();
1230 f_sleep(1.0);
1231 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1232 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001233 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +01001234 vc_conn.done;
1235 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001236 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +01001237 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001238 f_cleanup();
Harald Welteb2124b22018-02-16 22:26:56 +01001239}
1240
Harald Welte04683d02018-02-16 22:43:45 +01001241/* Routing Area Update from Unknown TLLI -> REJECT */
1242private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +01001243 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1244
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001245 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 +01001246 alt {
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01001247 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) { /* gmm cause: implicitly detached */
Harald Welte04683d02018-02-16 22:43:45 +01001248 setverdict(pass);
1249 }
1250 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001251 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +01001252 }
1253}
1254testcase TC_rau_unknown() runs on test_CT {
1255 var BSSGP_ConnHdlr vc_conn;
1256 f_init();
1257 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001258 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +01001259 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001260 f_cleanup();
Harald Welte04683d02018-02-16 22:43:45 +01001261}
1262
Harald Welte91636de2018-02-17 10:16:14 +01001263private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +01001264 /* first perform regular attach */
1265 f_TC_attach(id);
1266
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001267 f_routing_area_update(g_pars.ra);
1268
Harald Welte91636de2018-02-17 10:16:14 +01001269}
1270testcase TC_attach_rau() runs on test_CT {
1271 var BSSGP_ConnHdlr vc_conn;
1272 f_init();
1273 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001274 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +01001275 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001276 f_cleanup();
Harald Welte91636de2018-02-17 10:16:14 +01001277}
Harald Welte04683d02018-02-16 22:43:45 +01001278
Harald Welte6abb9fe2018-02-17 15:24:48 +01001279/* general GPRS DETACH helper */
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001280function 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 +02001281 var PDU_L3_SGSN_MS l3_mt;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001282 timer T := 5.0;
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001283 f_send_l3(ts_GMM_DET_REQ_MO(detach_type, power_off), ran_index);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001284 if (expect_purge) {
1285 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
1286 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
1287 }
1288 T.start;
1289 alt {
1290 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
1291 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +02001292 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001293 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001294 [power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001295 g_pars.ra := omit;
Alexander Couzens8e0fd462019-05-11 01:20:55 +02001296 setverdict(fail, "Unexpected DETACH ACCEPT in power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +02001297 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001298 /* TODO: check if any PDP contexts are deactivated on network side? */
1299 }
1300 [power_off] T.timeout {
1301 setverdict(pass);
1302 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001303 [not power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001304 g_pars.ra := omit;
1305 setverdict(pass);
1306 /* TODO: check if any PDP contexts are deactivated on network side? */
1307 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001308 [] BSSGP[ran_index].receive(PDU_L3_SGSN_MS:?) -> value l3_mt {
Alexander Couzens4630e742019-05-11 01:50:10 +02001309 if (power_off) {
1310 setverdict(fail, "Unexpected Layer 3 package received in power-off DETACH");
1311 } else {
1312 setverdict(fail, "Unexpected Layer 3 package received in normal DETACH");
1313 }
1314 mtc.stop;
1315 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001316 [] BSSGP[ran_index].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +01001317 }
1318}
1319
1320/* IMSI DETACH (non-power-off) for unknown TLLI */
1321private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1322 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
1323}
1324testcase TC_detach_unknown_nopoweroff() runs on test_CT {
1325 var BSSGP_ConnHdlr vc_conn;
1326 f_init();
1327 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001328 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001329 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001330 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001331}
1332
1333/* IMSI DETACH (power-off) for unknown TLLI */
1334private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1335 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
1336}
1337testcase TC_detach_unknown_poweroff() runs on test_CT {
1338 var BSSGP_ConnHdlr vc_conn;
1339 f_init();
1340 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001341 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001342 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001343 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001344}
1345
1346/* IMSI DETACH (non-power-off) for known TLLI */
1347private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1348 /* first perform regular attach */
1349 f_TC_attach(id);
1350
1351 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
1352}
1353testcase TC_detach_nopoweroff() runs on test_CT {
1354 var BSSGP_ConnHdlr vc_conn;
1355 f_init();
1356 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001357 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001358 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001359 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001360}
1361
1362/* IMSI DETACH (power-off) for known TLLI */
1363private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1364 /* first perform regular attach */
1365 f_TC_attach(id);
1366
1367 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1368}
1369testcase TC_detach_poweroff() runs on test_CT {
1370 var BSSGP_ConnHdlr vc_conn;
1371 f_init();
1372 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001373 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001374 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001375 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001376}
1377
Harald Welteeded9ad2018-02-17 20:57:34 +01001378type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +01001379 BIT3 tid, /* L3 Transaction ID */
1380 BIT4 nsapi, /* SNDCP NSAPI */
1381 BIT4 sapi, /* LLC SAPI */
1382 QoSV qos, /* QoS parameters */
1383 PDPAddressV addr, /* IP address */
1384 octetstring apn optional, /* APN name */
1385 ProtocolConfigOptionsV pco optional, /* protoco config opts */
1386 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +01001387 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +01001388 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +01001389
Harald Welte822f9102018-02-18 20:39:06 +01001390 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
1391 OCT4 ggsn_tei_u, /* GGSN TEI User */
1392 octetstring ggsn_ip_c, /* GGSN IP Control */
1393 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001394 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +01001395
Harald Welte822f9102018-02-18 20:39:06 +01001396 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
1397 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
1398 octetstring sgsn_ip_c optional, /* SGSN IP Control */
1399 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +01001400};
1401
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001402
1403private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
1404 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
1405 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
1406 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
1407 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
1408 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
1409 f_gtp_register_teid(apars.ggsn_tei_c);
1410 f_gtp_register_teid(apars.ggsn_tei_u);
1411}
1412
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001413function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001414runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +01001415 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1416 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001417 var template Recovery_gtpc recovery := omit;
1418
1419 if (send_recovery) {
1420 recovery := ts_Recovery(apars.ggsn_restart_ctr);
1421 }
Harald Welteeded9ad2018-02-17 20:57:34 +01001422
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001423 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 +02001424 apars.apn, apars.pco), ran_index);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001425 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
1426 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
1427 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1428 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
1429 apars.sgsn_tei_c, apars.gtp_resp_cause,
1430 apars.ggsn_tei_c, apars.ggsn_tei_u,
1431 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001432 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1433 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +01001434 }
1435 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001436 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001437 setverdict(pass);
1438 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001439 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001440 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +02001441 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001442 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001443 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001444 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +02001445 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001446 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001447 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Weltef7191672019-05-02 20:37:23 +02001448 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
1449 mtc.stop;
1450 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001451 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001452 setverdict(pass);
1453 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001454 [] as_xid(apars, ran_index);
Harald Welteeded9ad2018-02-17 20:57:34 +01001455 }
1456}
1457
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001458function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001459runs on BSSGP_ConnHdlr {
Harald Welte6f203162018-02-18 22:04:55 +01001460 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1461 var Gtp1cUnitdata g_ud;
1462
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001463 f_send_l3(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit), ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001464 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1465 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001466 BSSGP[ran_index].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001467 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1468 }
1469 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001470 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Harald Welte6f203162018-02-18 22:04:55 +01001471 setverdict(pass);
1472 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001473 [] as_xid(apars, ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001474 }
1475}
1476
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001477function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001478runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001479 var Gtp1cUnitdata g_ud;
1480 var integer seq_nr := 23;
1481 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1482
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001483 BSSGP[ran_index].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001484 if (error_ind) {
1485 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1486 } else {
1487 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1488 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001489
1490 timer T := 5.0;
1491 T.start;
1492
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001493 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001494 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1495 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), ran_index);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001496 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001497 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1498 repeat;
1499 }
1500 [] T.timeout {
1501 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1502 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001503 }
1504}
1505
Harald Welte6f203162018-02-18 22:04:55 +01001506
Harald Welteeded9ad2018-02-17 20:57:34 +01001507/* Table 10.5.156/3GPP TS 24.008 */
1508template (value) QoSV t_QosDefault := {
1509 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1510 delayClass := '100'B, /* best effort */
1511 spare1 := '00'B,
1512 precedenceClass := '010'B, /* normal */
1513 spare2 := '0'B,
1514 peakThroughput := '0000'B, /* subscribed */
1515 meanThroughput := '00000'B, /* subscribed */
1516 spare3 := '000'B,
1517 deliverErroneusSDU := omit,
1518 deliveryOrder := omit,
1519 trafficClass := omit,
1520 maxSDUSize := omit,
1521 maxBitrateUplink := omit,
1522 maxBitrateDownlink := omit,
1523 sduErrorRatio := omit,
1524 residualBER := omit,
1525 trafficHandlingPriority := omit,
1526 transferDelay := omit,
1527 guaranteedBitRateUplink := omit,
1528 guaranteedBitRateDownlink := omit,
1529 sourceStatisticsDescriptor := omit,
1530 signallingIndication := omit,
1531 spare4 := omit,
1532 maxBitrateDownlinkExt := omit,
1533 guaranteedBitRateDownlinkExt := omit,
1534 maxBitrateUplinkExt := omit,
1535 guaranteedBitRateUplinkExt := omit,
1536 maxBitrateDownlinkExt2 := omit,
1537 guaranteedBitRateDownlinkExt2 := omit,
1538 maxBitrateUplinkExt2 := omit,
1539 guaranteedBitRateUplinkExt2 := omit
1540}
1541
1542/* 10.5.6.4 / 3GPP TS 24.008 */
1543template (value) PDPAddressV t_AddrIPv4dyn := {
1544 pdpTypeOrg := '0001'B, /* IETF */
1545 spare := '0000'B,
1546 pdpTypeNum := '21'O, /* IPv4 */
1547 addressInfo := omit
1548}
1549template (value) PDPAddressV t_AddrIPv6dyn := {
1550 pdpTypeOrg := '0001'B, /* IETF */
1551 spare := '0000'B,
1552 pdpTypeNum := '53'O, /* IPv6 */
1553 addressInfo := omit
1554}
1555
Harald Welte37692d82018-02-18 15:21:34 +01001556template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001557 tid := '000'B,
1558 nsapi := '0101'B, /* < 5 are reserved */
1559 sapi := '0011'B, /* 3/5/9/11 */
1560 qos := t_QosDefault,
1561 addr := t_AddrIPv4dyn,
1562 apn := omit,
1563 pco := omit,
1564 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001565 gtp_resp_cause := int2oct(128, 1),
1566 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001567
1568 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001569 ggsn_tei_c := f_rnd_octstring(4),
1570 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001571 ggsn_ip_c := f_inet_addr(ggsn_ip),
1572 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001573 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001574
Harald Welteeded9ad2018-02-17 20:57:34 +01001575 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001576 sgsn_tei_u := omit,
1577 sgsn_ip_c := omit,
1578 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001579}
1580
Harald Welte37692d82018-02-18 15:21:34 +01001581template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1582 connId := 1,
1583 remName := f_inet_ntoa(ip),
1584 remPort := GTP1U_PORT
1585}
1586
1587template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1588 connId := 1,
1589 remName := f_inet_ntoa(ip),
1590 remPort := GTP1C_PORT
1591}
1592
1593private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1594 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1595 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1596}
1597
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001598private altstep as_xid(PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr {
1599 [] BSSGP[ran_index].receive(tr_LLC_XID_MT_CMD(?, apars.sapi)) {
Harald Welte37692d82018-02-18 15:21:34 +01001600 repeat;
1601 }
1602}
1603
1604template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1605 pDU_SN_UNITDATA := {
1606 nsapi := nsapi,
1607 moreBit := ?,
1608 snPduType := '1'B,
1609 firstSegmentIndicator := ?,
1610 spareBit := ?,
1611 pcomp := ?,
1612 dcomp := ?,
1613 npduNumber := ?,
1614 segmentNumber := ?,
1615 npduNumberContinued := ?,
1616 dataSegmentSnUnitdataPdu := payload
1617 }
1618}
1619
1620/* simple case: single segment, no compression */
1621template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1622 pDU_SN_UNITDATA := {
1623 nsapi := nsapi,
1624 moreBit := '0'B,
1625 snPduType := '1'B,
1626 firstSegmentIndicator := '1'B,
1627 spareBit := '0'B,
1628 pcomp := '0000'B,
1629 dcomp := '0000'B,
1630 npduNumber := '0000'B,
1631 segmentNumber := '0000'B,
1632 npduNumberContinued := '00'O,
1633 dataSegmentSnUnitdataPdu := payload
1634 }
1635}
1636
1637/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
Harald Weltea5c71cd2020-06-17 22:12:04 +02001638private 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 +02001639runs on BSSGP_ConnHdlr {
Harald Weltea5c71cd2020-06-17 22:12:04 +02001640 timer T := 5.0;
Harald Welte37692d82018-02-18 15:21:34 +01001641 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1642 f_gtpu_send(apars, payload);
Harald Weltea5c71cd2020-06-17 22:12:04 +02001643 T.start;
Harald Welte37692d82018-02-18 15:21:34 +01001644 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1645 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001646 [] as_xid(apars, ran_index);
1647 //[] BSSGP[ran_index].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
Harald Weltea5c71cd2020-06-17 22:12:04 +02001648 [expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload));
1649 [expect_fwd] T.timeout {
1650 setverdict(fail, "Timeout waiting for GTP-U to appear on BSSGP");
1651 mtc.stop;
1652 }
1653 [not expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload)) {
1654 setverdict(fail, "GTP-U forwarded to BSSGP but not expected")
1655 mtc.stop;
1656 }
1657 [not expect_fwd] T.timeout {}
Harald Welte37692d82018-02-18 15:21:34 +01001658 }
1659}
1660
Harald Welte64d6b512020-06-17 16:42:00 +02001661/* Transceive given 'payload' as MO message from Gb -> OsmoSGSN -> GTP */
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01001662private 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 +02001663runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001664 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1665 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1666 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01001667 BSSGP[ran_index].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, n_u));
Harald Welte37692d82018-02-18 15:21:34 +01001668 /* Expect PDU via GTP from SGSN on simulated GGSN */
1669 alt {
1670 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1671 }
1672}
1673
Harald Welteeded9ad2018-02-17 20:57:34 +01001674private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001675 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001676
1677 /* first perform regular attach */
1678 f_TC_attach(id);
1679
1680 f_pdp_ctx_act(apars);
1681}
1682testcase TC_attach_pdp_act() runs on test_CT {
1683 var BSSGP_ConnHdlr vc_conn;
1684 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001685 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001686 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001687 f_cleanup();
Harald Welteeded9ad2018-02-17 20:57:34 +01001688}
Harald Welteb2124b22018-02-16 22:26:56 +01001689
Harald Welte835b15f2018-02-18 14:39:11 +01001690/* PDP Context activation for not-attached subscriber; expect fail */
1691private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001692 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001693 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 +01001694 apars.apn, apars.pco));
1695 alt {
1696 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Harald Welte955aa942019-05-03 01:29:29 +02001697 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001698 setverdict(pass);
1699 }
1700 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1701 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001702 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001703 }
Harald Welte955aa942019-05-03 01:29:29 +02001704 [] BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001705 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001706 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001707 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001708 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001709 }
1710}
1711testcase TC_pdp_act_unattached() runs on test_CT {
1712 var BSSGP_ConnHdlr vc_conn;
1713 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001714 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001715 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001716 f_cleanup();
Harald Welte835b15f2018-02-18 14:39:11 +01001717}
1718
Harald Welte37692d82018-02-18 15:21:34 +01001719/* ATTACH + PDP CTX ACT + user plane traffic */
1720private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1721 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1722
1723 /* first perform regular attach */
1724 f_TC_attach(id);
1725 /* then activate PDP context */
1726 f_pdp_ctx_act(apars);
1727 /* then transceive a downlink PDU */
1728 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1729 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1730}
1731testcase TC_attach_pdp_act_user() runs on test_CT {
1732 var BSSGP_ConnHdlr vc_conn;
1733 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001734 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001735 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001736 f_cleanup();
Harald Welte37692d82018-02-18 15:21:34 +01001737}
1738
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001739/* ATTACH + PDP CTX ACT; reject from GGSN */
1740private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1741 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1742
1743 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1744 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1745
1746 /* first perform regular attach */
1747 f_TC_attach(id);
1748 /* then activate PDP context */
1749 f_pdp_ctx_act(apars);
1750}
1751testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1752 var BSSGP_ConnHdlr vc_conn;
1753 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001754 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001755 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001756 f_cleanup();
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001757}
Harald Welte835b15f2018-02-18 14:39:11 +01001758
Harald Welte6f203162018-02-18 22:04:55 +01001759/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1760private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1761 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1762
1763 /* first perform regular attach */
1764 f_TC_attach(id);
1765 /* then activate PDP context */
1766 f_pdp_ctx_act(apars);
1767 /* then transceive a downlink PDU */
1768 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1769 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1770
1771 f_pdp_ctx_deact_mo(apars, '00'O);
1772}
1773testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1774 var BSSGP_ConnHdlr vc_conn;
1775 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001776 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 +01001777 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001778 f_cleanup();
Harald Welte6f203162018-02-18 22:04:55 +01001779}
1780
Harald Welte57b9b7f2018-02-18 22:28:13 +01001781/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1782private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1783 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1784
1785 /* first perform regular attach */
1786 f_TC_attach(id);
1787 /* then activate PDP context */
1788 f_pdp_ctx_act(apars);
1789 /* then transceive a downlink PDU */
1790 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1791 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1792
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001793 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001794}
1795testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1796 var BSSGP_ConnHdlr vc_conn;
1797 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001798 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 +01001799 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001800 f_cleanup();
Harald Welte57b9b7f2018-02-18 22:28:13 +01001801}
1802
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001803/* Test MS sending a duplicate Deact PDP Ctx (OS#3956). */
1804private function f_TC_attach_pdp_act_deact_dup(charstring id) runs on BSSGP_ConnHdlr {
1805 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1806 var Gtp1cUnitdata g_ud;
1807 var integer i;
1808 var OCT1 cause_regular_deact := '24'O;
1809
1810 /* first perform regular attach + PDP context act */
1811 f_TC_attach(id);
1812 f_pdp_ctx_act(apars);
1813
1814 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1815 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1816
1817 for (i := 0; i < 2; i := i+1) {
1818 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1819 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1820 log("Received deletePDPContextResponse " & int2str(i) & ", seq_nr=" & int2str(seq_nr));
1821 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1822 }
1823 }
1824
1825 alt {
1826 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1827 setverdict(pass);
1828 }
1829 [] as_xid(apars, 0);
1830 }
1831
1832 /* Make sure second DeactPdpAccept is sent: */
1833 timer T := 2.0;
1834 T.start;
1835 alt {
1836 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1837 setverdict(fail, "Second SM_DEACT_PDP_ACCEPT_MT received");
1838 }
1839 [] T.timeout {
1840 setverdict(pass);
1841 }
1842 }
1843
1844 setverdict(pass);
1845}
1846testcase TC_attach_pdp_act_deact_dup() runs on test_CT {
1847 var BSSGP_ConnHdlr vc_conn;
1848 f_init();
1849 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_dup), testcasename(), g_gb, 46);
1850 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001851 f_cleanup();
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001852}
1853
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001854/* ATTACH + ATTACH (2nd) */
1855private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1856 g_pars.t_guard := 5.0;
1857
1858 /* first perform regular attach */
1859 f_TC_attach(id);
1860
1861 /* second to perform regular attach */
1862 f_TC_attach(id);
1863}
1864
1865
1866testcase TC_attach_second_attempt() runs on test_CT {
1867 var BSSGP_ConnHdlr vc_conn;
1868 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001869 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001870 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001871 f_cleanup();
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001872}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001873
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001874private function f_TC_attach_echo_timeout(charstring id) runs on BSSGP_ConnHdlr {
1875 var Gtp1cUnitdata g_ud;
1876 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1877 var integer seq_nr;
1878
1879 /* first perform regular attach */
1880 f_TC_attach(id);
1881 /* then activate PDP context */
1882 f_pdp_ctx_act(apars);
1883
1884 /* Wait to receive first echo request and send initial Restart counter */
1885 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1886 BSSGP[0].clear;
1887 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1888 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1889 f_sleep(int2float(mp_echo_interval)); /* wait until around next echo is expected */
1890 }
1891
1892 /* At some point next echo request not answered will timeout and SGSN
1893 should drop the pdp ctx. Around T3 (3secs) * 6 (+ extra, a lot due to OS#4178): */
1894 timer T := 3.0 * 6.0 + 16.0;
1895 T.start;
1896 alt {
1897 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1898 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
1899 setverdict(pass);
1900 }
1901 [] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1902 /* SGSN currently doesn't send this message because it expects GGSN to be non-reachable anyway */
1903 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1904 log("Received deletePDPContextRequest seq_nr=" & int2str(seq_nr));
1905 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1906 repeat;
1907 }
1908 [] GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1909 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1910 log("Received EchoRequest seq_nr=" & int2str(seq_nr));
1911 repeat;
1912 }
1913 [] T.timeout {
1914 setverdict(fail, "BSSGP DeactPdpReq not received");
1915 mtc.stop;
1916 }
1917 [] as_xid(apars);
1918 }
1919 T.stop
1920
1921 setverdict(pass);
1922}
1923/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1924testcase TC_attach_echo_timeout() runs on test_CT {
1925 var BSSGP_ConnHdlr vc_conn;
1926 g_use_echo := true;
1927 f_init();
1928 vc_conn := f_start_handler(refers(f_TC_attach_echo_timeout), testcasename(), g_gb, 67, 50.0);
1929 vc_conn.done;
1930 g_use_echo := false;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001931 f_cleanup();
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001932}
1933
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001934private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001935 var Gtp1cUnitdata g_ud;
1936 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1937
1938 /* first perform regular attach */
1939 f_TC_attach(id);
1940 /* Activate a pdp context against the GGSN */
1941 f_pdp_ctx_act(apars);
1942 /* Wait to receive first echo request and send initial Restart counter */
1943 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1944 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1945 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1946 }
1947 /* Wait to receive second echo request and send incremented Restart
1948 counter. This will fake a restarted GGSN, and pdp ctx allocated
1949 should be released by SGSN */
1950 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1951 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1952 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1953 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1954 }
1955 var OCT1 cause_network_failure := int2oct(38, 1)
1956 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001957 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001958 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001959 setverdict(pass);
1960 }
1961 [] as_xid(apars);
1962 }
1963 setverdict(pass);
1964}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001965/* ATTACH + trigger Recovery procedure through EchoResp */
1966testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001967 var BSSGP_ConnHdlr vc_conn;
1968 g_use_echo := true
1969 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001970 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 +02001971 vc_conn.done;
1972 g_use_echo := false
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001973 f_cleanup();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001974}
1975
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001976private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1977 var Gtp1cUnitdata g_ud;
1978 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1979 var integer seq_nr := 23;
1980 var GtpPeer peer;
1981 /* first perform regular attach */
1982 f_TC_attach(id);
1983
1984 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1985 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1986 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1987 f_pdp_ctx_act(apars, true);
1988
1989 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1990/* received. */
1991 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1992
1993 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1994 would be great to have an active pdp context here before triggering
1995 Recovery, and making sure the the DEACT request is sent by the SGSN.
1996 */
1997
1998 /* Activate a pdp context against the GGSN, send incremented Recovery
1999 IE. This should trigger the recovery path, but still this specific
2000 CTX activation should work. */
2001 apars.exp_rej_cause := omit; /* default value for tests */
2002 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
2003 f_pdp_ctx_act(apars, true);
2004
2005 setverdict(pass);
2006}
2007/* ATTACH + trigger Recovery procedure through CreatePdpResp */
2008testcase TC_attach_restart_ctr_create() runs on test_CT {
2009 var BSSGP_ConnHdlr vc_conn;
2010 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002011 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 +02002012 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002013 f_cleanup();
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002014}
2015
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002016/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
2017private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
2018 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2019 var integer seq_nr := 23;
2020 var GtpPeer peer;
2021 var integer i;
2022
2023 /* first perform regular attach */
2024 f_TC_attach(id);
2025 /* then activate PDP context */
2026 f_pdp_ctx_act(apars);
2027
Alexander Couzens0e510e62018-07-28 23:06:00 +02002028 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002029 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
2030 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
2031
2032 for (i := 0; i < 5; i := i+1) {
2033 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002034 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002035 [] as_xid(apars);
2036 }
2037 }
2038
2039 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
2040
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002041 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002042 setverdict(pass);
2043}
2044testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
2045 var BSSGP_ConnHdlr vc_conn;
2046 f_init();
2047 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002048 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 +02002049 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002050 f_cleanup();
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002051}
2052
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002053/* ATTACH + PDP CTX ACT dropped + retrans */
2054private function f_TC_attach_pdp_act_deact_gtp_retrans(charstring id) runs on BSSGP_ConnHdlr {
2055 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2056 var Gtp1cUnitdata g_ud_first, g_ud_second;
2057 /* first perform regular attach */
2058 f_TC_attach(id);
2059
2060 /* then activate PDP context on the Gb side */
2061 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
2062 apars.apn, apars.pco), 0);
2063
2064 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_first {}
2065 log("First createPDPContextRequest received, dropping & waiting for retransmission");
2066 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_second {
2067 if (g_ud_first != g_ud_second) {
2068 setverdict(fail, "Retransmitted GTP message createPDPContextRequest is different from original one!");
2069 mtc.stop;
2070 }
2071 f_process_gtp_ctx_act_req(apars, g_ud_second.gtpc);
2072 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
2073 GTP.send(ts_GTPC_CreatePdpResp(g_ud_second.peer, seq_nr,
2074 apars.sgsn_tei_c, apars.gtp_resp_cause,
2075 apars.ggsn_tei_c, apars.ggsn_tei_u,
2076 apars.nsapi,
2077 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
2078 omit, omit));
2079 }
Harald Welte955aa942019-05-03 01:29:29 +02002080 BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT) {}
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002081
2082 /* Now the same with Deact */
2083 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, '00'O, false, omit), 0);
2084 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_first {}
2085 log("First deletePDPContextRequest received, dropping & waiting for retransmission");
2086 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_second {
2087 if (g_ud_first != g_ud_second) {
2088 setverdict(fail, "Retransmitted GTP message deletePDPContextRequest is different from original one!");
2089 mtc.stop;
2090 }
2091 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
2092 BSSGP[0].clear;
2093 GTP.send(ts_GTPC_DeletePdpResp(g_ud_second.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
2094 }
2095 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002096 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002097 setverdict(pass);
2098 }
2099 [] as_xid(apars, 0);
2100 }
2101
2102 setverdict(pass);
2103}
2104testcase TC_attach_pdp_act_deact_gtp_retrans() runs on test_CT {
2105 var BSSGP_ConnHdlr vc_conn;
2106 f_init();
2107 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans), testcasename(), g_gb, 27);
2108 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002109 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002110}
2111
2112/* Test that SGSN GTP response retransmit queue works fine */
2113private function f_TC_attach_pdp_act_deact_gtp_retrans_resp(charstring id) runs on BSSGP_ConnHdlr {
2114 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2115 var integer seq_nr := 23;
2116 var Gtp1cUnitdata g_ud_first, g_ud_second;
2117 var template Gtp1cUnitdata g_delete_req;
2118 /* first perform regular attach + PDP context act */
2119 f_TC_attach(id);
2120 f_pdp_ctx_act(apars);
2121
2122 /* Now perform an MT DeleteCtxReq and emulate GGSN didn't receive response and sends a duplicated DeleteCtxReq */
2123 BSSGP[0].clear;
2124 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
2125 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B);
2126 GTP.send(g_delete_req);
2127 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002128 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002129 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), 0);
2130 }
2131 [] as_xid(apars, 0);
2132 }
2133 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_first {
2134 if (g_ud_first.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != '80'O) {
2135 setverdict(fail, "Received deletePDPContextResponse cause is not 'Request accepted'");
2136 mtc.stop;
2137 }
2138 };
2139
2140 /* Send duplicate DeleteCtxReq */
2141 log("First deletePDPContextResponse received, dropping & retransmitting retransmission of deletePDPContextRequest");
2142 GTP.send(g_delete_req);
2143 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_second {
2144 if (g_ud_first != g_ud_second) {
2145 setverdict(fail, "Retransmitted GTP message deletePDPContextResponse is different from original one!");
2146 mtc.stop;
2147 }
2148 }
2149
2150 /* Let's send now a new DeleteCtxReq (increased seq_nr) to make sure it
2151 * is handled differently by SGSN (expect "non-existent" cause) */
2152 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr + 1, apars.sgsn_tei_c, apars.nsapi, '1'B);
2153 GTP.send(g_delete_req);
2154 /* Response with cause "non-existent" must be sent with TEID 0 according to specs */
2155 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, '00000000'O)) -> value g_ud_second {
2156 if (g_ud_second.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != 'C0'O) {
2157 setverdict(fail, "Received deletePDPContextResponse cause is not 'Non-existent'");
2158 mtc.stop;
2159 }
2160 }
2161
2162 setverdict(pass);
2163}
2164testcase TC_attach_pdp_act_deact_gtp_retrans_resp() runs on test_CT {
2165 var BSSGP_ConnHdlr vc_conn;
2166 f_init();
2167 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans_resp), testcasename(), g_gb, 28);
2168 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002169 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002170}
2171
Alexander Couzens5e307b42018-05-22 18:12:20 +02002172private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
2173 /* MS: perform regular attach */
2174 f_TC_attach(id);
2175
2176 /* HLR: cancel the location request */
2177 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
2178 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02002179
2180 /* ensure no Detach Request got received */
2181 timer T := 5.0;
2182 T.start;
2183 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002184 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(*, *, *)) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002185 T.stop;
2186 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02002187 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002188 }
2189 [] T.timeout {
2190 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02002191 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002192 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02002193 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002194 repeat;
2195 }
2196 }
2197}
2198
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002199/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
2200private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
2201 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2202
2203 /* first perform regular attach */
2204 f_TC_attach(id);
2205 /* then activate PDP context */
2206 f_pdp_ctx_act(apars);
2207 /* then transceive a downlink PDU */
2208 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
2209
2210 /* Send Error indication as response from upload PDU and expect deact towards MS */
2211 f_pdp_ctx_deact_mt(apars, true);
2212}
2213testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
2214 var BSSGP_ConnHdlr vc_conn;
2215 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002216 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 +02002217 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002218 f_cleanup();
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002219}
2220
Alexander Couzens5e307b42018-05-22 18:12:20 +02002221testcase TC_hlr_location_cancel_request_update() runs on test_CT {
2222 /* MS <-> SGSN: GMM Attach
2223 * HLR -> SGSN: Cancel Location Request
2224 * HLR <- SGSN: Cancel Location Ack
2225 */
2226 var BSSGP_ConnHdlr vc_conn;
2227 f_init();
2228 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002229 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02002230 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002231 f_cleanup();
Alexander Couzens5e307b42018-05-22 18:12:20 +02002232}
2233
2234
Alexander Couzensc87967a2018-05-22 16:09:54 +02002235private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
2236 /* MS: perform regular attach */
2237 f_TC_attach(id);
2238
2239 /* HLR: cancel the location request */
2240 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
2241 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
2242 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
2243
2244 /* MS: receive a Detach Request */
Harald Welte955aa942019-05-03 01:29:29 +02002245 BSSGP[0].receive(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002246 f_send_l3(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002247
2248 setverdict(pass);
2249}
2250
2251testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
2252 /* MS <-> SGSN: GMM Attach
2253 * HLR -> SGSN: Cancel Location Request
2254 * HLR <- SGSN: Cancel Location Ack
2255 * MS <- SGSN: Detach Request
2256 * SGSN-> MS: Detach Complete
2257 */
2258 var BSSGP_ConnHdlr vc_conn;
2259 f_init();
2260 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002261 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002262 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002263 f_cleanup();
Alexander Couzensc87967a2018-05-22 16:09:54 +02002264}
2265
2266
Alexander Couzens6c47f292018-05-22 17:09:49 +02002267private function f_hlr_location_cancel_request_unknown_subscriber(
2268 charstring id,
2269 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
2270
2271 /* HLR: cancel the location request */
2272 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
2273
2274 /* cause 2 = IMSI_UNKNOWN */
2275 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
2276
2277 setverdict(pass);
2278}
2279
2280private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002281 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002282}
2283
2284testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
2285 /* HLR -> SGSN: Cancel Location Request
2286 * HLR <- SGSN: Cancel Location Error
2287 */
2288
2289 var BSSGP_ConnHdlr vc_conn;
2290 f_init();
2291 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002292 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 +02002293 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002294 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002295}
2296
2297private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002298 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002299}
2300
2301testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
2302 /* HLR -> SGSN: Cancel Location Request
2303 * HLR <- SGSN: Cancel Location Error
2304 */
2305
2306 var BSSGP_ConnHdlr vc_conn;
2307 f_init();
2308 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002309 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 +02002310 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002311 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002312}
2313
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002314private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
2315 f_TC_attach(id);
2316 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2317}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002318
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002319testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
2320 /* MS <-> SGSN: Attach
2321 * MS -> SGSN: Detach Req (Power off)
2322 * VTY -> SGSN: Check if MS is NOT in subscriber cache
2323 */
2324 var BSSGP_ConnHdlr vc_conn;
2325 var integer id := 33;
2326 var charstring imsi := hex2str(f_gen_imsi(id));
2327
2328 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002329 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002330 vc_conn.done;
2331
2332 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002333 f_cleanup();
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002334}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002335
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002336/* Attempt an attach, but loose the Identification Request (IMEI) */
2337private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
2338 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002339 var MobileIdentityLV mi;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002340
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002341 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 +02002342
2343 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002344 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002345 /* break */
2346 }
Harald Welte955aa942019-05-03 01:29:29 +02002347 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002348 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002349 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002350 repeat;
2351 }
Harald Welte955aa942019-05-03 01:29:29 +02002352 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002353 /* ignore ID REQ IMEI */
2354 count_req := count_req + 1;
2355 repeat;
2356 }
2357 }
2358 if (count_req != 5) {
2359 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002360 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002361 }
2362 setverdict(pass);
2363}
2364
2365testcase TC_attach_no_imei_response() runs on test_CT {
2366 /* MS -> SGSN: Attach Request IMSI
2367 * MS <- SGSN: Identity Request IMSI (optional)
2368 * MS -> SGSN: Identity Response IMSI (optional)
2369 * MS <- SGSN: Identity Request IMEI
2370 * MS -x SGSN: no response
2371 * MS <- SGSN: re-send: Identity Request IMEI 4x
2372 * MS <- SGSN: Attach Reject
2373 */
2374 var BSSGP_ConnHdlr vc_conn;
2375 f_init();
2376 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002377 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 +02002378 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002379 f_cleanup();
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002380}
2381
Alexander Couzens53f20562018-06-12 16:24:12 +02002382/* Attempt an attach, but loose the Identification Request (IMSI) */
2383private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
2384 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002385 var MobileIdentityLV mi;
Alexander Couzens53f20562018-06-12 16:24:12 +02002386
2387 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
2388 g_pars.p_tmsi := 'c0000035'O;
2389
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002390 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 +02002391
2392 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002393 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002394 /* break */
2395 }
Harald Welte955aa942019-05-03 01:29:29 +02002396 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002397 /* ignore ID REQ IMSI */
2398 count_req := count_req + 1;
2399 repeat;
2400 }
Harald Welte955aa942019-05-03 01:29:29 +02002401 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002402 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002403 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02002404 repeat;
2405 }
2406 }
2407 if (count_req != 5) {
2408 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002409 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02002410 }
2411 setverdict(pass);
2412}
2413
2414testcase TC_attach_no_imsi_response() runs on test_CT {
2415 /* MS -> SGSN: Attach Request TMSI (unknown)
2416 * MS <- SGSN: Identity Request IMEI (optional)
2417 * MS -> SGSN: Identity Response IMEI (optional)
2418 * MS <- SGSN: Identity Request IMSI
2419 * MS -x SGSN: no response
2420 * MS <- SGSN: re-send: Identity Request IMSI 4x
2421 * MS <- SGSN: Attach Reject
2422 */
2423 var BSSGP_ConnHdlr vc_conn;
2424 f_init();
2425 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002426 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 +02002427 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002428 f_cleanup();
Alexander Couzens53f20562018-06-12 16:24:12 +02002429}
2430
Alexander Couzenscf818962018-06-05 18:00:00 +02002431private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
2432 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
2433}
2434
2435testcase TC_attach_check_subscriber_list() runs on test_CT {
2436 /* MS <-> SGSN: Attach
2437 * VTY -> SGSN: Check if MS is in subscriber cache
2438 */
2439 var BSSGP_ConnHdlr vc_conn;
2440 var integer id := 34;
2441 var charstring imsi := hex2str(f_gen_imsi(id));
2442
2443 f_init();
2444 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002445 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02002446 vc_conn.done;
2447
2448 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
2449 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002450 f_cleanup();
Alexander Couzenscf818962018-06-05 18:00:00 +02002451}
2452
Alexander Couzensf9858652018-06-07 16:14:53 +02002453private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
2454 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002455 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensf9858652018-06-07 16:14:53 +02002456
2457 /* unregister the old IMSI */
2458 f_bssgp_client_unregister(g_pars.imsi);
2459 /* Simulate a foreign IMSI */
Alexander Couzens03d12242018-08-07 16:13:52 +02002460 g_pars.imsi := '001010123456700'H;
Harald Welte5339b2e2020-10-04 22:52:56 +02002461 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Alexander Couzensf9858652018-06-07 16:14:53 +02002462
2463 /* there is no auth */
2464 g_pars.net.expect_auth := false;
2465
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002466 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02002467 f_gmm_auth();
2468 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002469 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzensf9858652018-06-07 16:14:53 +02002470 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02002471 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02002472 }
Harald Welte955aa942019-05-03 01:29:29 +02002473 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) -> value l3_mt {
2474 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002475 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02002476 setverdict(pass);
2477 }
2478 }
2479}
Alexander Couzens03d12242018-08-07 16:13:52 +02002480
2481private function f_TC_attach_closed_add_vty(charstring id) runs on BSSGP_ConnHdlr {
2482
2483 f_TC_attach_closed_foreign(id);
2484 f_TC_attach_closed_imsi_added(id);
2485
2486}
2487
2488
Alexander Couzensf9858652018-06-07 16:14:53 +02002489testcase TC_attach_closed_add_vty() runs on test_CT {
2490 /* VTY-> SGSN: policy close
2491 * MS -> SGSN: Attach Request
2492 * MS <- SGSN: Identity Request IMSI
2493 * MS -> SGSN: Identity Response IMSI
2494 * MS <- SGSN: Attach Reject
2495 * VTY-> SGSN: policy imsi-acl add IMSI
2496 * MS -> SGSN: Attach Request
2497 * MS <- SGSN: Identity Request IMSI
2498 * MS -> SGSN: Identity Response IMSI
2499 * MS <- SGSN: Identity Request IMEI
2500 * MS -> SGSN: Identity Response IMEI
2501 * MS <- SGSN: Attach Accept
2502 */
2503 var BSSGP_ConnHdlr vc_conn;
2504 f_init();
2505 f_sleep(1.0);
2506 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
2507 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
Alexander Couzens03d12242018-08-07 16:13:52 +02002508 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456700");
2509 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456700");
Alexander Couzensf9858652018-06-07 16:14:53 +02002510 /* test with foreign IMSI: Must Reject */
Alexander Couzens03d12242018-08-07 16:13:52 +02002511 vc_conn := f_start_handler(refers(f_TC_attach_closed_add_vty), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02002512 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002513 f_cleanup();
Alexander Couzensf9858652018-06-07 16:14:53 +02002514}
2515
Alexander Couzens0085bd72018-06-12 19:08:44 +02002516/* Attempt an attach, but never answer a Attach Complete */
2517private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
2518 var integer count_req := 0;
2519
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002520 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 +02002521 f_gmm_auth();
Pau Espin Pedrol4b290a22019-09-10 19:49:41 +02002522 /* Expect SGSN to perform LU with HLR */
2523 f_gmm_gsup_lu_isd();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002524
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002525 timer T := 10.0;
2526 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002527 alt {
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002528 [] T.timeout {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002529 /* break */
2530 }
Harald Welte955aa942019-05-03 01:29:29 +02002531 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002532 /* ignore */
2533 count_req := count_req + 1;
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002534 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002535 repeat;
2536 }
2537 }
2538 if (count_req != 5) {
2539 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02002540 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002541 }
2542 setverdict(pass);
2543}
2544
2545testcase TC_attach_check_complete_resend() runs on test_CT {
2546 /* MS -> SGSN: Attach Request IMSI
2547 * MS <- SGSN: Identity Request *
2548 * MS -> SGSN: Identity Response *
2549 * MS <- SGSN: Attach Complete 5x
2550 */
2551 var BSSGP_ConnHdlr vc_conn;
2552 f_init();
2553 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002554 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 +02002555 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002556 f_cleanup();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002557}
2558
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002559friend function f_routing_area_update(RoutingAreaIdentificationV ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02002560 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002561 var PDU_DTAP_PS_MT mt;
2562 var template OCT4 p_tmsi := omit;
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002563
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002564 if (is_iu(ran_index)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002565 p_tmsi := g_pars.p_tmsi;
2566 }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002567 /* then send RAU */
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002568 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 +02002569 alt {
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002570 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_ACCEPT) -> value l3_mt {
2571 f_process_rau_accept(l3_mt.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2572 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002573 setverdict(pass);
2574 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002575 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_ACCEPT)) -> value mt {
2576 f_process_rau_accept(mt.dtap.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2577 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5d56f522019-09-03 12:36:18 +02002578 setverdict(pass);
2579 }
2580
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002581 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_REJECT) {
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002582 setverdict(fail, "Unexpected RAU Reject");
2583 mtc.stop;
2584 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002585 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_REJECT)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002586 setverdict(fail, "Unexpected RAU Reject");
2587 mtc.stop;
2588 }
2589
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002590 [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 +02002591 key_sts := ?)) {
2592 var IntegrityProtectionAlgorithm uia_chosen := 0; /* 0 = standard_UMTS_integrity_algorithm_UIA1 */
2593 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
Alexander Couzensed61ae82019-09-15 23:18:08 +02002594 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)))
Daniel Willmann1c116112020-01-22 17:48:31 +01002595 repeat;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002596 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002597 [is_gb(ran_index)] BSSGP[ran_index].receive { repeat; }
2598 [is_iu(ran_index)] BSSAP.receive { repeat; }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002599 }
2600}
2601
Alexander Couzensbfda9212018-07-31 03:17:33 +02002602private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbfda9212018-07-31 03:17:33 +02002603 /* first perform regular attach */
2604 f_TC_attach(id);
2605
2606 /* then send RAU */
2607 f_routing_area_update(g_pars.ra);
2608
2609 /* do another RAU */
2610 f_routing_area_update(g_pars.ra);
2611
2612 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2613}
2614
2615testcase TC_attach_rau_a_a() runs on test_CT {
2616 /* MS <-> SGSN: Successful Attach
2617 * MS -> SGSN: Routing Area Update Request
2618 * MS <- SGSN: Routing Area Update Accept
2619 * MS -> SGSN: Routing Area Update Request
2620 * MS <- SGSN: Routing Area Update Accept
2621 * MS -> SGSN: Detach (PowerOff)
2622 */
2623 var BSSGP_ConnHdlr vc_conn;
2624 f_init();
2625 f_sleep(1.0);
2626 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
2627 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002628 f_cleanup();
Alexander Couzensbfda9212018-07-31 03:17:33 +02002629}
2630
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002631private function f_TC_attach_rau_a_b(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002632 f_TC_attach(id);
2633
2634 log("attach complete sending rau");
2635 f_routing_area_update(g_pars.ra, 0);
2636
2637 log("rau complete unregistering");
2638 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte5339b2e2020-10-04 22:52:56 +02002639 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002640
2641 log("sending second RAU via different RA");
2642 f_routing_area_update(f_cellid_to_RAI(g_pars.bssgp_cell_id[1]), 1);
2643
2644 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true, 1);
2645}
2646
2647testcase TC_attach_rau_a_b() runs on test_CT {
2648 /* MS <-> SGSN: Successful Attach
2649 * MS -> SGSN: Routing Area _a_ Update Request
2650 * MS <- SGSN: Routing Area _a_ Update Accept
2651 * MS -> SGSN: Routing Area _b_ Update Request
2652 * MS <- SGSN: Routing Area _b_ Update Accept
2653 * MS -> SGSN: Detach (PowerOff)
2654 */
2655 var BSSGP_ConnHdlr vc_conn;
2656 f_init();
2657 f_sleep(1.0);
2658 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_b), testcasename(), g_gb, 38);
2659 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002660 f_cleanup();
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002661}
2662
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002663private function f_TC_attach_gmm_attach_req_while_gmm_attach(charstring id) runs on BSSGP_ConnHdlr {
2664 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002665 var MobileIdentityLV mi;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002666 var RoutingAreaIdentificationV rand_rai := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002667 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002668
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002669 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002670
2671 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002672 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002673 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2674 mtc.stop;
2675 }
Harald Welte955aa942019-05-03 01:29:29 +02002676 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002677 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002678 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002679 repeat;
2680 }
Harald Welte955aa942019-05-03 01:29:29 +02002681 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002682 /* send out a second GMM_Attach Request.
2683 * If the SGSN follows the rules, this 2nd ATTACH REQ should be ignored, because
2684 * of the same content */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002685 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002686 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002687 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002688 }
2689 }
2690 f_sleep(1.0);
2691
2692 /* we've sent already a IMEI answer, we should NOT asked again for IMEI */
2693 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002694 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002695 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002696 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002697 repeat;
2698 }
Harald Welte955aa942019-05-03 01:29:29 +02002699 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002700 setverdict(fail, "Unexpected GMM ID REQ (IMEI).");
2701 mtc.stop;
2702 }
Harald Welte955aa942019-05-03 01:29:29 +02002703 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002704 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2705 mtc.stop;
2706 }
Harald Welte955aa942019-05-03 01:29:29 +02002707 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2708 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002709 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002710 setverdict(pass);
2711 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
2712 }
2713 }
2714}
2715
2716testcase TC_attach_gmm_attach_req_while_gmm_attach() runs on test_CT {
2717 /* Testing if the SGSN ignore Attach Request with the exact same content */
2718 /* MS -> SGSN: Attach Request IMSI
2719 * MS <- SGSN: Identity Request IMSI (optional)
2720 * MS -> SGSN: Identity Response IMSI (optional)
2721 * MS <- SGSN: Identity Request IMEI
2722 * MS -> SGSN: Attach Request (2nd)
2723 * MS <- SGSN: Identity Response IMEI
2724 * MS <- SGSN: Attach Accept
2725 * MS -> SGSN: Attach Complete
2726 */
2727 var BSSGP_ConnHdlr vc_conn;
2728 f_init();
2729 f_sleep(1.0);
2730 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
2731 vc_conn := f_start_handler(refers(f_TC_attach_gmm_attach_req_while_gmm_attach), testcasename(), g_gb, 39);
2732 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002733 f_cleanup();
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002734}
2735
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002736private function f_TC_attach_usim_resync(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002737 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2738
2739 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2740
2741 /* send Attach Request */
2742 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2743 * 3G auth vectors */
2744 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2745 /* The thing is, if the solSACapability is 'omit', then the
2746 * revisionLevelIndicatior is at the wrong place! */
2747 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002748 f_send_l3(attach_req);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002749
2750 /* do the auth */
2751 var PDU_L3_MS_SGSN l3_mo;
2752 var PDU_L3_SGSN_MS l3_mt;
2753 var default di := activate(as_mm_identity());
2754
2755 var GSUP_IE auth_tuple;
2756 var template AuthenticationParameterAUTNTLV autn;
2757
2758 g_pars.vec := f_gen_auth_vec_3g();
2759 autn := {
2760 elementIdentifier := '28'O,
2761 lengthIndicator := lengthof(g_pars.vec.autn),
2762 autnValue := g_pars.vec.autn
2763 };
2764 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2765 g_pars.vec.sres,
2766 g_pars.vec.kc,
2767 g_pars.vec.ik,
2768 g_pars.vec.ck,
2769 g_pars.vec.autn,
2770 g_pars.vec.res));
2771 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2772 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2773 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2774
2775 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2776 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002777 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002778
2779 /* send the gmm auth failure with resync IE */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002780 f_send_l3(ts_GMM_AUTH_FAIL_UMTS_AKA_RESYNC(g_pars.vec.auts));
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002781
2782 /* wait for the GSUP resync request */
2783 GSUP.receive(tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
2784 g_pars.imsi,
2785 g_pars.vec.auts,
2786 g_pars.vec.rand));
2787
2788 /* generate new key material */
2789 g_pars.vec := f_gen_auth_vec_3g();
2790 autn := {
2791 elementIdentifier := '28'O,
2792 lengthIndicator := lengthof(g_pars.vec.autn),
2793 autnValue := g_pars.vec.autn
2794 };
2795
2796 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2797 g_pars.vec.sres,
2798 g_pars.vec.kc,
2799 g_pars.vec.ik,
2800 g_pars.vec.ck,
2801 g_pars.vec.autn,
2802 g_pars.vec.res));
2803 /* send new key material */
2804 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2805
2806 /* wait for the new Auth Request */
2807 auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2808 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002809 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002810 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
2811 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2812 auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2813 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
2814 valueField := substr(g_pars.vec.res, 0, 4)
2815 };
2816 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
2817 elementIdentifier := '21'O,
2818 lengthIndicator := lengthof(g_pars.vec.res) - 4,
2819 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
2820 };
2821 l3_mo := valueof(auth_ciph_resp);
2822 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
2823 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
2824 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
2825 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
2826 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002827 f_send_l3(l3_mo);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002828 deactivate(di);
2829
2830 /* Expect SGSN to perform LU with HLR */
2831 f_gmm_gsup_lu_isd();
2832
Harald Welte955aa942019-05-03 01:29:29 +02002833 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2834 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002835 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002836 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002837 setverdict(pass);
2838}
2839
2840testcase TC_attach_usim_resync() runs on test_CT {
2841 /* MS -> SGSN: Attach Request
2842 * MS <- SGSN: Identity Request IMSI
2843 * MS -> SGSN: Identity Response IMSI
2844 * MS <- SGSN: Identity Request IMEI
2845 * MS -> SGSN: Identity Response IMEI
2846 * HLR<- SGSN: SAI Request
2847 * HLR-> SGSN: SAI Response
2848 * MS <- SGSN: Auth Request
2849 * MS -> SGSN: Auth Failure (with AUTS)
2850 * HLR<- SGSN: SAI Request (with AUTS & RAND)
2851 * HLR-> SGSN: SAI Response (new key material)
2852 * MS <- SGSN: Auth Request (new key material)
2853 * MS -> SGSN: Auth Response
2854 * MS <- SGSN: Attach Accept
2855 * MS -> SGSN: Attach Complete
2856 */
2857 var BSSGP_ConnHdlr vc_conn;
2858 f_init();
2859 f_sleep(1.0);
2860 vc_conn := f_start_handler(refers(f_TC_attach_usim_resync), testcasename(), g_gb, 40);
2861 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002862 f_cleanup();
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002863}
2864
Eric Wildc555be52021-05-15 19:48:22 +02002865private function f_TC_attach_usim_crypt(OCT1 netcap_a2345, BIT3 auth_req_ciph) runs on BSSGP_ConnHdlr {
2866 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2867
2868 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2869 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.spare_octets := netcap_a2345; /* GEA2345... */
2870
2871 /* send Attach Request */
2872 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2873 * 3G auth vectors */
2874 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2875 /* The thing is, if the solSACapability is 'omit', then the
2876 * revisionLevelIndicatior is at the wrong place! */
2877 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
2878 f_send_l3(attach_req);
2879
2880 /* do the auth */
2881 var PDU_L3_MS_SGSN l3_mo;
2882 var PDU_L3_SGSN_MS l3_mt;
2883 var default di := activate(as_mm_identity());
2884
2885 var GSUP_IE auth_tuple;
2886 var template AuthenticationParameterAUTNTLV autn;
2887
2888 g_pars.vec := f_gen_auth_vec_3g();
2889 autn := {
2890 elementIdentifier := '28'O,
2891 lengthIndicator := lengthof(g_pars.vec.autn),
2892 autnValue := g_pars.vec.autn
2893 };
2894 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2895 g_pars.vec.sres,
2896 g_pars.vec.kc,
2897 g_pars.vec.ik,
2898 g_pars.vec.ck,
2899 g_pars.vec.autn,
2900 g_pars.vec.res));
2901 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2902 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2903 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2904
2905 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand, auth_req_ciph);
2906 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
2907 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
2908
2909 setverdict(pass);
2910 deactivate(di);
2911}
2912
2913private function f_TC_attach_usim_a54_a54(charstring id) runs on BSSGP_ConnHdlr {
2914 f_TC_attach_usim_crypt('10'O, '100'B);
2915}
2916
2917private function f_TC_attach_usim_a54_a53(charstring id) runs on BSSGP_ConnHdlr {
2918 f_TC_attach_usim_crypt('20'O, '011'B);
2919}
2920
2921private function f_TC_attach_usim_a53_a54(charstring id) runs on BSSGP_ConnHdlr {
2922 f_TC_attach_usim_crypt('30'O, '011'B);
2923}
2924
2925private function f_TC_attach_usim_a50_a54(charstring id) runs on BSSGP_ConnHdlr {
2926 f_TC_attach_usim_crypt('30'O, '000'B);
2927}
2928
2929private function f_TC_attach_usim_a54_a50(charstring id) runs on BSSGP_ConnHdlr {
2930 f_TC_attach_usim_crypt('00'O, '000'B);
2931}
2932
2933testcase TC_attach_usim_a54_a54() runs on test_CT {
2934 var BSSGP_ConnHdlr vc_conn;
2935 f_init();
2936 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002937 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02002938 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a54), testcasename(), g_gb, 40);
2939 vc_conn.done;
2940 f_cleanup();
2941}
2942
2943testcase TC_attach_usim_a54_a53() runs on test_CT {
2944 var BSSGP_ConnHdlr vc_conn;
2945 f_init();
2946 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002947 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02002948 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a53), testcasename(), g_gb, 40);
2949 vc_conn.done;
2950 f_cleanup();
2951}
2952
2953testcase TC_attach_usim_a53_a54() runs on test_CT {
2954 var BSSGP_ConnHdlr vc_conn;
2955 f_init();
2956 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002957 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3");
Eric Wildc555be52021-05-15 19:48:22 +02002958 vc_conn := f_start_handler(refers(f_TC_attach_usim_a53_a54), testcasename(), g_gb, 40);
2959 vc_conn.done;
2960 f_cleanup();
2961}
2962
2963testcase TC_attach_usim_a50_a54() runs on test_CT {
2964 var BSSGP_ConnHdlr vc_conn;
2965 f_init();
2966 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002967 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0");
Eric Wildc555be52021-05-15 19:48:22 +02002968 vc_conn := f_start_handler(refers(f_TC_attach_usim_a50_a54), testcasename(), g_gb, 40);
2969 vc_conn.done;
2970 f_cleanup();
2971}
2972
2973testcase TC_attach_usim_a54_a50() runs on test_CT {
2974 var BSSGP_ConnHdlr vc_conn;
2975 f_init();
2976 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002977 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02002978 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a50), testcasename(), g_gb, 40);
2979 vc_conn.done;
2980 f_cleanup();
2981}
Harald Weltea05b8072019-04-23 22:35:05 +02002982
2983/* Send LLC NULL to see if the SGSN survives it (OS#3952) */
2984private function f_TC_llc_null(charstring id) runs on BSSGP_ConnHdlr {
2985 f_gmm_attach(false, false);
2986 f_sleep(1.0);
2987 f_send_llc(ts_LLC_NULL('0'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
2988 /* try to detach to check if SGSN is still alive */
2989 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2990}
2991testcase TC_llc_null() runs on test_CT {
2992 var BSSGP_ConnHdlr vc_conn;
2993 f_init();
2994 f_sleep(1.0);
2995 vc_conn := f_start_handler(refers(f_TC_llc_null), testcasename(), g_gb, 41);
2996 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002997 f_cleanup();
Harald Weltea05b8072019-04-23 22:35:05 +02002998}
2999
Harald Welte645a1512019-04-23 23:18:23 +02003000/* Send LLC SABM to see if the SGSN rejects it properly with DM */
3001private function f_TC_llc_sabm_dm_llgmm(charstring id) runs on BSSGP_ConnHdlr {
3002 f_gmm_attach(false, false);
3003 f_sleep(1.0);
3004 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02003005 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LLGMM, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02003006 setverdict(pass);
3007}
3008testcase TC_llc_sabm_dm_llgmm() runs on test_CT {
3009 var BSSGP_ConnHdlr vc_conn;
3010 f_init();
3011 f_sleep(1.0);
3012 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_llgmm), testcasename(), g_gb, 42);
3013 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003014 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02003015}
3016
3017/* Send LLC SABM to see if the SGSN rejects it properly with DM */
3018private function f_TC_llc_sabm_dm_ll5(charstring id) runs on BSSGP_ConnHdlr {
3019 f_gmm_attach(false, false);
3020 f_sleep(1.0);
3021 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LL5, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02003022 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LL5, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02003023 setverdict(pass);
3024}
3025testcase TC_llc_sabm_dm_ll5() runs on test_CT {
3026 var BSSGP_ConnHdlr vc_conn;
3027 f_init();
3028 f_sleep(1.0);
3029 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_ll5), testcasename(), g_gb, 43);
3030 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003031 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02003032}
3033
Harald Welte2aaac1b2019-05-02 10:02:53 +02003034/* test XID handshake with empty L3 info: expect empty return (some phones require that, OS#3426 */
3035private function f_TC_xid_empty_l3(charstring id) runs on BSSGP_ConnHdlr {
3036 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3037 var template (value) XID_Information xid;
3038 var template XID_Information xid_rx;
3039
3040 /* first perform regular attach */
3041 f_TC_attach(id);
3042 /* then activate PDP context */
3043 f_pdp_ctx_act(apars);
3044
3045 /* start MO XID */
3046 xid := { ts_XID_L3(''O) };
3047 xid_rx := { tr_XID_L3(''O) };
3048 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
3049 alt {
Harald Welte955aa942019-05-03 01:29:29 +02003050 [] BSSGP[0].receive(tr_LLC_XID(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02003051 [] as_xid(apars);
3052 }
3053 setverdict(pass);
3054}
3055testcase TC_xid_empty_l3() runs on test_CT {
3056 var BSSGP_ConnHdlr vc_conn;
3057 f_init();
3058 f_sleep(1.0);
3059 vc_conn := f_start_handler(refers(f_TC_xid_empty_l3), testcasename(), g_gb, 44);
3060 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003061 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02003062}
3063
3064private function f_TC_xid_n201u(charstring id) runs on BSSGP_ConnHdlr {
3065 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3066 var template (value) XID_Information xid;
3067 var template XID_Information xid_rx;
3068
3069 /* first perform regular attach */
3070 f_TC_attach(id);
3071 /* then activate PDP context */
3072 f_pdp_ctx_act(apars);
3073
3074 /* start MO XID */
3075 xid := { ts_XID_N201U(1234) };
3076 xid_rx := { tr_XID_N201U(1234) };
3077 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
3078 alt {
Harald Welte955aa942019-05-03 01:29:29 +02003079 [] BSSGP[0].receive(tr_LLC_XID_MT_RSP(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02003080 [] as_xid(apars);
3081 }
3082 setverdict(pass);
3083}
3084testcase TC_xid_n201u() runs on test_CT {
3085 var BSSGP_ConnHdlr vc_conn;
3086 f_init();
3087 f_sleep(1.0);
3088 vc_conn := f_start_handler(refers(f_TC_xid_n201u), testcasename(), g_gb, 45);
3089 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003090 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02003091}
3092
Alexander Couzens6bee0872019-05-11 01:48:50 +02003093private function f_TC_attach_pdp_act_gmm_detach(charstring id) runs on BSSGP_ConnHdlr {
3094 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3095
3096 /* first perform regular attach */
3097 f_TC_attach(id);
3098 /* then activate PDP context */
3099 f_pdp_ctx_act(apars);
3100 /* do a normal detach */
3101 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
3102}
3103
3104testcase TC_attach_pdp_act_gmm_detach() runs on test_CT {
3105 /* MS -> SGSN: Attach Request
3106 * MS <-> SGSN: [..]
3107 * MS -> SGSN: Attach Complete
3108 * MS -> SGSN: PDP Activate Request
3109 * MS <- SGSN: PDP Activate Accept
3110 * MS -> SGSN: GMM Detach Request
3111 * MS <- SGSN: GMM Detach Accept
3112 */
3113 var BSSGP_ConnHdlr vc_conn;
3114 f_init();
3115 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_gmm_detach), testcasename(), g_gb, 26);
3116 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003117 f_cleanup();
Alexander Couzens6bee0872019-05-11 01:48:50 +02003118}
Harald Welte645a1512019-04-23 23:18:23 +02003119
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003120private function f_TC_attach_req_id_req_ra_update(charstring id) runs on BSSGP_ConnHdlr {
3121 var RoutingAreaIdentificationV old_ra := f_random_RAI();
3122 var RoutingAreaIdentificationV new_ra := f_random_RAI();
3123 while (old_ra == new_ra) { new_ra := f_random_RAI(); };
3124 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
3125 var PDU_L3_SGSN_MS l3_mt;
3126
3127 f_send_l3(attach_req, 0);
3128
3129 BSSGP[0].receive(tr_GMM_ID_REQ(?));
3130
3131 f_send_l3(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, new_ra, false, omit, omit));
3132 alt {
3133 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) {
3134 setverdict(pass);
3135 }
3136 [] BSSGP[0].receive { repeat; }
3137 }
3138}
3139
3140/* This test triggers crash in osmo-sgsn before osmo-sgsn.git I64fa5cf1b427d3abb99e553e584897261a827ce6.
3141 * See OS#3957 and OS#4245 for more information.
3142 */
3143testcase TC_attach_req_id_req_ra_update() runs on test_CT {
3144 /*
3145 * MS --> SGSN: Attach Req (TMSI, RAI=901-70-356-101)
3146 * MS <-- SGSN: Identity Request (IMEI)
3147 * MS --> SGSN: RA Updating (RAI=901-70-2758-208)
3148 */
3149 var BSSGP_ConnHdlr vc_conn;
3150 f_init();
3151 vc_conn := f_start_handler(refers(f_TC_attach_req_id_req_ra_update), testcasename(), g_gb, 47);
3152 vc_conn.done;
3153 f_cleanup();
3154}
3155
Harald Welte8e5932e2020-06-17 22:12:54 +02003156private altstep as_nopaging_ps(integer ran_idx := 0) runs on BSSGP_ConnHdlr {
3157var PDU_BSSGP rx;
3158[] BSSGP_SIG[ran_idx].receive(tr_BSSGP_PS_PAGING(?)) -> value rx {
3159 setverdict(fail, "Received unexpected PS PAGING: ", rx);
3160 mtc.stop;
3161 }
3162}
3163
3164/* SUSPEND, then DL traffic: should not pass + no paging expected */
3165private function f_TC_suspend_nopaging(charstring id) runs on BSSGP_ConnHdlr {
3166 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3167 var default d;
3168
3169 /* first perform regular attach */
3170 f_TC_attach(id);
3171 /* then activate PDP context */
3172 f_pdp_ctx_act(apars);
3173 /* then transceive a downlink PDU */
3174 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3175
3176 /* now suspend GPRS */
3177 f_bssgp_suspend();
3178
3179 d := activate(as_nopaging_ps());
3180
3181 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3182 * nor any related paging requests */
3183 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3184
3185 deactivate(d);
3186}
3187testcase TC_suspend_nopaging() runs on test_CT {
3188 var BSSGP_ConnHdlr vc_conn;
3189 f_init();
3190 f_sleep(1.0);
3191 vc_conn := f_start_handler(refers(f_TC_suspend_nopaging), testcasename(), g_gb, 48);
3192 vc_conn.done;
3193 f_cleanup();
3194}
3195
3196
3197/* SUSPEND, then RESUME: data expected to flow after explicit resume */
3198private function f_TC_suspend_resume(charstring id) runs on BSSGP_ConnHdlr {
3199 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3200 var OCT1 susp_ref;
3201 var default d;
3202
3203 /* first perform regular attach */
3204 f_TC_attach(id);
3205 /* then activate PDP context */
3206 f_pdp_ctx_act(apars);
3207 /* then transceive a downlink PDU */
3208 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3209
3210 /* now suspend GPRS */
3211 susp_ref := f_bssgp_suspend();
3212
3213 d := activate(as_nopaging_ps());
3214
3215 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3216 * nor any related paging requests */
3217 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3218
3219 deactivate(d);
3220
3221 /* resume GPRS */
3222 f_bssgp_resume(susp_ref);
3223
3224 /* now data should be flowing again */
3225 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3226}
3227testcase TC_suspend_resume() runs on test_CT {
3228 var BSSGP_ConnHdlr vc_conn;
3229 f_init();
3230 f_sleep(1.0);
3231 vc_conn := f_start_handler(refers(f_TC_suspend_resume), testcasename(), g_gb, 49);
3232 vc_conn.done;
3233 f_cleanup();
3234}
3235
3236/* SUSPEND, then RAU: data expected to flow after implicit resume */
3237private function f_TC_suspend_rau(charstring id) runs on BSSGP_ConnHdlr {
3238 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3239 var default d;
3240
3241 /* first perform regular attach */
3242 f_TC_attach(id);
3243 /* then activate PDP context */
3244 f_pdp_ctx_act(apars);
3245 /* then transceive a downlink PDU */
3246 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3247
3248 /* now suspend GPRS */
3249 f_bssgp_suspend();
3250
3251 d := activate(as_nopaging_ps());
3252
3253 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3254 * nor any related paging requests */
3255 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3256
3257 deactivate(d);
3258
3259 /* perform RAU (implicit RESUME) */
3260 f_routing_area_update(g_pars.ra);
3261
Harald Welted5836dc2021-03-20 15:40:00 +01003262 /* give SGSN some time to actually receve + process the RAU Complete we sent */
3263 f_sleep(0.5);
3264
Harald Welte8e5932e2020-06-17 22:12:54 +02003265 /* now data should be flowing again */
3266 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3267
3268}
3269testcase TC_suspend_rau() runs on test_CT {
3270 var BSSGP_ConnHdlr vc_conn;
3271 f_init();
3272 f_sleep(1.0);
3273 vc_conn := f_start_handler(refers(f_TC_suspend_rau), testcasename(), g_gb, 50);
3274 vc_conn.done;
3275 f_cleanup();
3276}
3277
3278
3279/* wait for T3314 expiration and check that PS PAGING is created on DL PDU */
3280private function f_TC_paging_ps(charstring id) runs on BSSGP_ConnHdlr {
3281 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3282 var default d;
3283
3284 /* first perform regular attach */
3285 f_TC_attach(id);
3286 /* then activate PDP context */
3287 f_pdp_ctx_act(apars);
3288 /* then transceive a downlink PDU */
3289 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3290
3291 /* now wait for T3314 expiration (test_CT below has reduced it to 3s) */
3292 f_sleep(5.0);
3293
3294 /* now data should be flowing again, but with PS PAGING */
3295 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3296 BSSGP_SIG[0].receive(tr_BSSGP_PS_PAGING(?));
3297
3298 /* FIXME: simulate paging response */
3299 /* FIXME: verify PDU actually arrives only after paging response was successful */
3300
3301}
3302testcase TC_paging_ps() runs on test_CT {
3303 var BSSGP_ConnHdlr vc_conn;
3304 f_init();
3305 f_vty_config(SGSNVTY, "sgsn", "timer 3314 3");
3306 f_sleep(1.0);
3307 vc_conn := f_start_handler(refers(f_TC_paging_ps), testcasename(), g_gb, 51);
3308 vc_conn.done;
3309 f_vty_config(SGSNVTY, "sgsn", "timer 3314 default");
3310 f_cleanup();
3311}
3312
Philipp Maier7df55e02020-12-14 23:46:04 +01003313/* Run a RIM single report procedure over the sgsn. Since the SGSN will only do a transparent routing of the
3314 * RIM messages this basically tests if the message is correctly transfered from one GB interface to the
3315 * other and vice versa. */
3316testcase TC_bssgp_rim_single_report() runs on test_CT {
3317 var BSSGP_ConnHdlr vc_conn;
3318 f_init();
Philipp Maier7df55e02020-12-14 23:46:04 +01003319
3320 timer T := 2.0;
3321
3322 var template RIM_Routing_Address dst_addr;
3323 var template RIM_Routing_Address src_addr;
3324 var template RAN_Information_Request_RIM_Container req_cont;
3325 var template RAN_Information_RIM_Container res_cont;
3326 var template PDU_BSSGP bssgp_rim_pdu;
3327 var template PDU_BSSGP bssgp_rim_pdu_expect;
3328
3329 dst_addr := t_RIM_Routing_Address_cid(g_gb[1].cfg.bvc[0].cell_id);
3330 src_addr := t_RIM_Routing_Address_cid(g_gb[0].cfg.bvc[0].cell_id);
Harald Welte8e5932e2020-06-17 22:12:54 +02003331
3332
Philipp Maier7df55e02020-12-14 23:46:04 +01003333 /* Send NACC Ran information request to SGSN at GB interface #0. We epect the SGSN to forward this request
3334 * based on the cell id in dst_addr to GB interface #1. */
3335 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3336 ts_RIM_Sequence_Number(1),
3337 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3338 ts_RIM_Protocol_Version_Number(1),
3339 tsu_RAN_Information_Request_Application_Container_NACC(g_gb[1].cfg.bvc[0].cell_id),
3340 omit);
3341 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3342 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3343 req_cont);
3344 bssgp_rim_pdu_expect := tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3345 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3346 tr_RAN_Information_Request_RIM_Container);
3347 RIM[0].send(bssgp_rim_pdu);
3348 T.start;
3349 alt {
Vadim Yanitskiy418e8062021-02-28 16:27:12 +01003350 [] RIM[1].receive(bssgp_rim_pdu_expect) {
3351 setverdict(pass);
3352 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003353 [] RIM[1].receive {
3354 setverdict(fail, "Unexpected BSSGP RIM PDU received");
Philipp Maier7df55e02020-12-14 23:46:04 +01003355 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003356 [] T.timeout {
3357 setverdict(fail, "No BSSGP RIM PDU received");
3358 mtc.stop;
Philipp Maier7df55e02020-12-14 23:46:04 +01003359 }
3360 }
Harald Welte8e5932e2020-06-17 22:12:54 +02003361
Philipp Maier7df55e02020-12-14 23:46:04 +01003362 /* Now also emulate also the response as well and send it back on GB interface #1. Expect the result on
3363 * GB interface #0 */
Philipp Maier7df55e02020-12-14 23:46:04 +01003364 res_cont := ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3365 ts_RIM_Sequence_Number(2),
3366 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3367 ts_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003368 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 +01003369 omit);
3370 bssgp_rim_pdu := ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3371 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3372 res_cont);
3373 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3374 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3375 ?);
3376 RIM[1].send(bssgp_rim_pdu);
3377 T.start;
3378 alt {
Vadim Yanitskiy418e8062021-02-28 16:27:12 +01003379 [] RIM[0].receive(bssgp_rim_pdu_expect) {
3380 setverdict(pass);
3381 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003382 [] RIM[0].receive {
3383 setverdict(fail, "Unexpected BSSGP RIM PDU received");
Philipp Maier7df55e02020-12-14 23:46:04 +01003384 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003385 [] T.timeout {
3386 setverdict(fail, "No BSSGP RIM PDU received");
3387 mtc.stop;
Philipp Maier7df55e02020-12-14 23:46:04 +01003388 }
3389 }
3390
3391 f_cleanup();
3392}
Harald Welte8e5932e2020-06-17 22:12:54 +02003393
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003394testcase TC_rim_eutran_to_geran() runs on test_CT {
3395 var BSSGP_ConnHdlr vc_conn;
3396 f_init();
3397 /* connect RIM related port */
3398 connect(vc_GTP:CLIENT_DEFAULT, self:GTPC);
3399
3400 var GtpPeer peer := {
3401 connId := 1,
3402 remName := mp_sgsn_gtp_ip,
3403 remPort := GTP1C_PORT
3404 }
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003405 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 +02003406
3407 var template (value) RIM_Routing_Address_GTPC gtpc_dst_addr, gtpc_src_addr;
3408 var template (value) RAN_Information_Request_RIM_Container_GTPC gtpc_rim_req_cont;
3409 var template (value) PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC gtpc_bssgp_cont;
3410 var template (value) Gtp1cUnitdata gtpc_pdu;
3411
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003412 gtpc_dst_addr := t_GTPC_RIM_Routing_Address_cid(gtp_ci);
3413 gtpc_src_addr := t_GTPC_RIM_Routing_Address_enbid(gtp_ci, tac := 3, gnbid := '12345678123456'O);
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003414
3415 gtpc_rim_req_cont := ts_GTPC_RAN_Information_Request_RIM_Container(ts_GTPC_RIM_Application_Identity(RIM_APP_ID_NACC),
3416 ts_GTPC_RIM_Sequence_Number(1),
3417 ts_GTPC_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3418 ts_GTPC_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003419 tsu_GTPC_RAN_Information_Request_Application_Container_NACC(gtp_ci),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003420 omit);
3421 gtpc_bssgp_cont := ts_GTPC_RAN_Information_Request(ts_GTPC_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, gtpc_dst_addr),
3422 ts_GTPC_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, gtpc_src_addr),
3423 gtpc_rim_req_cont);
3424 gtpc_pdu := ts_GTPC_RANInfoRelay(peer, ts_RANTransparentContainer_RAN_INFO_REQ(gtpc_bssgp_cont));
3425 GTPC.send(gtpc_pdu);
3426
3427 var template RIM_Routing_Address bssgp_dst_addr, bssgp_src_addr;
3428 var template PDU_BSSGP bssgp_rim_pdu_expect;
3429 bssgp_dst_addr := t_RIM_Routing_Address_cid(g_gb[1].cfg.bvc[0].cell_id);
3430 bssgp_src_addr := t_RIM_Routing_Address_enbid(g_gb[1].cfg.bvc[0].cell_id, tac := 3, gnbid := '12345678123456'O);
3431 bssgp_rim_pdu_expect := tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bssgp_dst_addr),
3432 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, bssgp_src_addr),
3433 tr_RAN_Information_Request_RIM_Container);
3434 timer T := 2.0;
3435 T.start;
3436 alt {
3437 [] RIM[1].receive(bssgp_rim_pdu_expect) {
3438 setverdict(pass);
3439 T.stop;
3440 }
3441 [] RIM[1].receive {
3442 setverdict(fail, "Unexpected BSSGP RIM PDU received");
3443 }
3444 [] T.timeout {
3445 setverdict(fail, "No BSSGP RIM PDU received");
3446 mtc.stop;
3447 }
3448 }
3449
3450 /* Now also emulate also the response as well and send it back on GB
3451 interface #1. Expect the result on * GTPC */
3452 var template RAN_Information_RIM_Container res_cont;
3453 var template PDU_BSSGP bssgp_rim_pdu;
3454 res_cont := ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3455 ts_RIM_Sequence_Number(2),
3456 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3457 ts_RIM_Protocol_Version_Number(1),
3458 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(g_gb[1].cfg.bvc[0].cell_id, false, 3, si_default)),
3459 omit);
3460 bssgp_rim_pdu := ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, bssgp_src_addr),
3461 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bssgp_dst_addr),
3462 res_cont);
3463 RIM[1].send(bssgp_rim_pdu);
3464
3465 var template RAN_Information_RIM_Container_GTPC rim_cont;
3466 var template PDU_BSSGP_RAN_INFORMATION_GTPC gtpc_bssgp_cont_ack;
3467 var template Gtp1cUnitdata gtpc_pdu_exp;
3468 rim_cont := tr_GTPC_RAN_Information_RIM_Container(ts_GTPC_RIM_Application_Identity(RIM_APP_ID_NACC),
3469 ts_GTPC_RIM_Sequence_Number(2),
3470 ts_GTPC_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3471 ts_GTPC_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003472 tru_GTPC_ApplContainer_or_ApplErrContainer_NACC(tru_GTPC_ApplContainer_NACC(gtp_ci, false, 3, si_default)),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003473 omit);
3474 gtpc_bssgp_cont_ack := tr_GTPC_RAN_Information(tr_GTPC_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, gtpc_src_addr),
3475 tr_GTPC_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, gtpc_dst_addr),
3476 rim_cont);
3477 gtpc_pdu_exp := tr_GTPC_RANInfoRelay(peer, tr_RANTransparentContainer_RAN_INFO(gtpc_bssgp_cont_ack));
3478
3479 T.start;
3480 alt {
3481 [] GTPC.receive(gtpc_pdu_exp) {
3482 setverdict(pass);
3483 T.stop;
3484 }
3485 [] GTPC.receive {
3486 setverdict(fail, "Unexpected GTPC RIM PDU received");
3487 }
3488 [] T.timeout {
3489 setverdict(fail, "No GTPC RIM PDU received");
3490 mtc.stop;
3491 }
3492 }
3493
3494 f_cleanup();
3495}
3496
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01003497/* Test if the SGSN routes traffic to new cell after the MS attached to it */
3498private function f_TC_cell_change_different_rai_ci_attach(charstring id) runs on BSSGP_ConnHdlr {
3499 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3500
3501 /* first perform regular attach */
3502 f_gmm_attach(false, false, ran_index := 0);
3503 /* then activate PDP context */
3504 f_pdp_ctx_act(apars, ran_index := 0);
3505 /* then transceive a downlink PDU */
3506 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3507 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 0);
3508
3509 /* Now attach on different cell: */
3510 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3511 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3512 g_pars.net.expect_auth := false;
3513 f_gmm_attach(false, false, ran_index := 1, old_ra := f_cellid_to_RAI(g_pars.bssgp_cell_id[0]));
3514 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3515 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1, n_u := 1);
3516}
3517testcase TC_cell_change_different_rai_ci_attach() runs on test_CT {
3518 var BSSGP_ConnHdlr vc_conn;
3519 f_init();
3520 vc_conn := f_start_handler(refers(f_TC_cell_change_different_rai_ci_attach), testcasename(), g_gb, 68);
3521 vc_conn.done;
3522 f_cleanup();
3523}
3524
3525/* Test if the SGSN routes traffic to new cell after the MS attached to it */
3526/* Assumption: g_gb[1] and g_gb[2] configured with same RAC */
3527private function f_TC_cell_change_different_ci_attach(charstring id) runs on BSSGP_ConnHdlr {
3528 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3529
3530 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3531 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3532
3533 /* first perform regular attach */
3534 f_gmm_attach(false, false, ran_index := 1);
3535 /* then activate PDP context */
3536 f_pdp_ctx_act(apars, ran_index := 1);
3537 /* then transceive a downlink PDU */
3538 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3539 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1);
3540
3541 /* Now attach on different cell: */
3542 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3543 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[2]);
3544 g_pars.net.expect_auth := false;
3545 f_gmm_attach(false, false, ran_index := 2, old_ra := f_cellid_to_RAI(g_pars.bssgp_cell_id[1]));
3546 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 2);
3547 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 2, n_u := 1);
3548}
3549testcase TC_cell_change_different_ci_attach() runs on test_CT {
3550 var BSSGP_ConnHdlr vc_conn;
3551 f_init();
3552 vc_conn := f_start_handler(refers(f_TC_cell_change_different_ci_attach), testcasename(), g_gb, 69);
3553 vc_conn.done;
3554 f_cleanup();
3555}
3556
3557/* Test if the SGSN silently drops MO data message coming from new BVCI if RAC changed (eg. cell change) */
3558private function f_TC_cell_change_different_rai_ci_data(charstring id) runs on BSSGP_ConnHdlr {
3559 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3560
3561 /* first perform regular attach */
3562 f_gmm_attach(false, false, ran_index := 0);
3563 /* then activate PDP context */
3564 f_pdp_ctx_act(apars, ran_index := 0);
3565 /* then transceive a downlink PDU */
3566 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3567 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 0);
3568
3569 /* Send some data over new bvci, it should be silently discarded since
3570 * RAC changed and SGSN expects a RAU to occur in that case */
3571 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3572 var octetstring payload := f_rnd_octstring(200);
3573 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
3574 BSSGP[1].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 1));
3575 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
3576 timer T := 2.0;
3577 T.start;
3578 alt {
3579 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload)) {
3580 setverdict(fail, "Unexpected GTP message");
3581 }
3582 [] T.timeout { setverdict(pass); }
3583 }
3584
3585 /* Expect SGSN to continue routing DL data to last known NSEI+BVCI */
3586 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3587 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3588}
3589testcase TC_cell_change_different_rai_ci_data() runs on test_CT {
3590 var BSSGP_ConnHdlr vc_conn;
3591 f_init();
3592 vc_conn := f_start_handler(refers(f_TC_cell_change_different_rai_ci_data), testcasename(), g_gb, 70);
3593 vc_conn.done;
3594 f_cleanup();
3595}
3596
3597/* Test if the SGSN routes traffic to new cell after the MS switched cell without re-attaching */
3598/* Assumption: g_gb[1] and g_gb[2] configured with same RAC */
3599private function f_TC_cell_change_different_ci_data(charstring id) runs on BSSGP_ConnHdlr {
3600 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3601
3602 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3603 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3604
3605 /* first perform regular attach */
3606 f_gmm_attach(false, false, ran_index := 1);
3607 /* then activate PDP context */
3608 f_pdp_ctx_act(apars, ran_index := 1);
3609 /* then transceive a downlink PDU */
3610 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3611 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1);
3612
3613 /* Now attach on different cell: */
3614 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3615 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[2]);
3616
3617 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 2, n_u := 1);
3618 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 2);
3619}
3620testcase TC_cell_change_different_ci_data() runs on test_CT {
3621 var BSSGP_ConnHdlr vc_conn;
3622 f_init();
3623 vc_conn := f_start_handler(refers(f_TC_cell_change_different_ci_data), testcasename(), g_gb, 71);
3624 vc_conn.done;
3625 f_cleanup();
3626}
3627
Harald Welte5ac31492018-02-15 20:39:13 +01003628control {
Harald Welte5b7c8122018-02-16 21:48:17 +01003629 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01003630 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02003631 execute( TC_attach_umts_aka_umts_res() );
3632 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01003633 execute( TC_attach_auth_id_timeout() );
3634 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01003635 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01003636 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01003637 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01003638 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01003639 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01003640 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02003641 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02003642 execute( TC_attach_no_imsi_response() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02003643 execute( TC_attach_closed_add_vty(), 20.0 );
3644 execute( TC_attach_check_subscriber_list(), 20.0 );
3645 execute( TC_attach_detach_check_subscriber_list(), 20.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02003646 execute( TC_attach_check_complete_resend() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02003647 execute( TC_hlr_location_cancel_request_update(), 20.0 );
3648 execute( TC_hlr_location_cancel_request_withdraw(), 20.0 );
3649 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 20.0 );
3650 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 20.0 );
Harald Welte04683d02018-02-16 22:43:45 +01003651 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01003652 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02003653 execute( TC_attach_rau_a_a() );
Alexander Couzensbe837bd2018-07-31 04:20:11 +02003654 execute( TC_attach_rau_a_b() );
Alexander Couzens0c6324f2018-09-14 16:37:04 +02003655 execute( TC_attach_usim_resync() );
Eric Wildc555be52021-05-15 19:48:22 +02003656 execute( TC_attach_usim_a54_a54() );
3657 execute( TC_attach_usim_a54_a53() );
3658 execute( TC_attach_usim_a53_a54() );
3659 execute( TC_attach_usim_a50_a54() );
3660 execute( TC_attach_usim_a54_a50() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01003661 execute( TC_detach_unknown_nopoweroff() );
3662 execute( TC_detach_unknown_poweroff() );
3663 execute( TC_detach_nopoweroff() );
3664 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01003665 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01003666 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01003667 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01003668 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01003669 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01003670 execute( TC_attach_pdp_act_user_deact_mt() );
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02003671 execute( TC_attach_pdp_act_deact_dup() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02003672 execute( TC_attach_second_attempt() );
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02003673 execute( TC_attach_echo_timeout() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02003674 execute( TC_attach_restart_ctr_echo() );
3675 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02003676 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02003677 execute( TC_attach_pdp_act_deact_gtp_retrans() );
3678 execute( TC_attach_pdp_act_deact_gtp_retrans_resp() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02003679 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Alexander Couzens6bee0872019-05-11 01:48:50 +02003680 execute( TC_attach_pdp_act_gmm_detach() );
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02003681 execute( TC_attach_gmm_attach_req_while_gmm_attach() );
Harald Weltea05b8072019-04-23 22:35:05 +02003682
Harald Welte2aaac1b2019-05-02 10:02:53 +02003683 execute( TC_xid_empty_l3() );
3684 execute( TC_xid_n201u() );
3685
Harald Weltea05b8072019-04-23 22:35:05 +02003686 execute( TC_llc_null() );
Harald Welte645a1512019-04-23 23:18:23 +02003687 execute( TC_llc_sabm_dm_llgmm() );
3688 execute( TC_llc_sabm_dm_ll5() );
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003689
Harald Welte8e5932e2020-06-17 22:12:54 +02003690 execute( TC_suspend_nopaging() );
3691 execute( TC_suspend_resume() );
3692 execute( TC_suspend_rau() );
3693 execute( TC_paging_ps() );
3694
Philipp Maier7df55e02020-12-14 23:46:04 +01003695 execute( TC_bssgp_rim_single_report() );
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003696 execute( TC_rim_eutran_to_geran() );
Philipp Maier7df55e02020-12-14 23:46:04 +01003697
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01003698 execute( TC_cell_change_different_rai_ci_attach() );
3699 execute( TC_cell_change_different_rai_ci_data() );
3700 execute( TC_cell_change_different_ci_attach() );
3701 execute( TC_cell_change_different_ci_data() );
3702
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003703 /* At the end, may crash osmo-sgsn, see OS#3957, OS#4245 */
3704 execute( TC_attach_req_id_req_ra_update() );
Harald Welte5ac31492018-02-15 20:39:13 +01003705}
Harald Welte96a33b02018-02-04 10:36:22 +01003706
3707
3708
3709}