blob: 39460580bed45358b25821e958580cd936d7ee09 [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
Vadim Yanitskiy24d22822023-06-27 19:01:26 +0700875private altstep as_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
876 [] GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
877 var GSUP_PDU gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
878 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
879 GSUP.send(gsup);
880 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
881 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
882 }
Harald Welte311ec272018-02-17 09:40:03 +0100883}
884
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100885friend function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres, integer ran_index := 0,
886 template (omit) RoutingAreaIdentificationV old_ra := omit) runs on BSSGP_ConnHdlr {
887 var RoutingAreaIdentificationV old_ra_val;
888 var template PDU_L3_MS_SGSN attach_req;
Harald Welteca362462019-05-02 20:11:21 +0200889 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5ac31492018-02-15 20:39:13 +0100890
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100891 if (istemplatekind(old_ra, "omit")) {
892 old_ra_val := f_random_RAI();
893 } else {
894 old_ra_val := valueof(old_ra);
895 }
896
897 attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra_val, false, false, omit, omit);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200898 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
899 * 3G auth vectors */
900 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
901 /* The thing is, if the solSACapability is 'omit', then the
902 * revisionLevelIndicatior is at the wrong place! */
903 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
904
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200905 f_send_l3(attach_req, ran_index);
906 f_gmm_auth(umts_aka_challenge, force_gsm_sres, ran_index);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200907 /* Expect SGSN to perform LU with HLR */
Vadim Yanitskiy24d22822023-06-27 19:01:26 +0700908 as_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100909
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200910 l3_mt := f_receive_l3(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?), ran_index);
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100911 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept, ran_index);
Harald Welteca362462019-05-02 20:11:21 +0200912
Harald Welte04683d02018-02-16 22:43:45 +0100913 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200914 f_send_l3(ts_GMM_ATTACH_COMPL, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200915
916 /* IuPS case: Expect Iu Release */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200917 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200918 as_iu_release_compl_disc();
919 }
Alexander Couzens42d3cad2019-10-08 16:29:26 +0200920
921 /* Race condition
922 * It has shown, that GMM_ATTACH_COMPL might take some time to arrive at the SGSN through the layers.
923 * In TC hlr_location_cancel_request_update, the GMM_ATTACH_COMPL came 2ms too late, so that the Location Cancel Request
924 * arrived before it. This results in a test case failure.
925 * Delay execution by 50 ms
926 */
927 f_sleep(0.05);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200928}
929
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200930friend function f_bssgp_suspend(integer ran_idx := 0) runs on BSSGP_ConnHdlr return OCT1 {
931 timer T := 5.0;
932 var PDU_BSSGP rx_pdu;
Harald Welte9b461a92020-12-10 23:41:14 +0100933 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 +0200934 T.start;
935 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100936 [] 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 +0200937 return rx_pdu.pDU_BSSGP_SUSPEND_ACK.suspend_Reference_Number.suspend_Reference_Number_value;
938 }
Harald Welte9b461a92020-12-10 23:41:14 +0100939 [] 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 +0200940 setverdict(fail, "SUSPEND-NACK in response to SUSPEND for TLLI ", g_pars.tlli);
941 mtc.stop;
942 }
943 [] T.timeout {
944 setverdict(fail, "No SUSPEND-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
945 mtc.stop;
946 }
947 }
948 return '00'O;
949}
950
951friend function f_bssgp_resume(OCT1 susp_ref, integer ran_idx := 0) runs on BSSGP_ConnHdlr {
952 timer T := 5.0;
Harald Welte9b461a92020-12-10 23:41:14 +0100953 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 +0200954 T.start;
955 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100956 [] BSSGP_GLOBAL[ran_idx].receive(tr_BSSGP_RESUME_ACK(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id));
957 [] 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 +0200958?)) {
959 setverdict(fail, "RESUME-NACK in response to RESUME for TLLI ", g_pars.tlli);
960 mtc.stop;
961 }
962 [] T.timeout {
963 setverdict(fail, "No RESUME-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
964 mtc.stop;
965 }
966 }
967}
968
969
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200970private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
971 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100972 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100973}
974
975testcase TC_attach() runs on test_CT {
976 var BSSGP_ConnHdlr vc_conn;
977 f_init();
978 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200979 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100980 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200981 f_cleanup();
Harald Welte5ac31492018-02-15 20:39:13 +0100982}
983
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100984testcase TC_attach_mnc3() runs on test_CT {
985 var BSSGP_ConnHdlr vc_conn;
986 f_init('023042'H);
987 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200988 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100989 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200990 f_cleanup();
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100991}
992
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200993private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
994 f_gmm_attach(true, false);
995 setverdict(pass);
996}
997testcase TC_attach_umts_aka_umts_res() runs on test_CT {
998 var BSSGP_ConnHdlr vc_conn;
999 f_init();
1000 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001001 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001002 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001003 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001004}
1005
1006private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
1007 f_gmm_attach(true, true);
1008 setverdict(pass);
1009}
1010testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
1011 var BSSGP_ConnHdlr vc_conn;
1012 f_init();
1013 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001014 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001015 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001016 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001017}
1018
arehbein3ede9e32023-02-06 21:02:53 +01001019/* Let T3350 expire while the MS holds an active PDP context (OS#4221). Do this by
1020 * Establishing a PDP context and then resending an ATTACH REQUEST,
1021 * making sure that exactly five ATTACH ACCEPTS are sent */
1022private function f_TC_attach_timeout_after_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
1023 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1024 /* Vars needed for triggering T3350 timeouts */
1025 const integer ran_index := 0;
1026 /* See TS 24.008 Rel. 16 Sect. 4.7.3.1.6 c) */
1027 const integer gmm_attach_repeats := 5;
1028 /* See TS 24.008 Rel. 16 Table 11.4 */
1029 const float T3350 := 6.0;
1030 var template PDU_L3_MS_SGSN attach_req;
1031 timer t_receive_GMM_ATTACH_ACCEPT;
1032 var RoutingAreaIdentificationV rai := f_random_RAI();
1033
1034 /* First establish PDP context */
1035 f_TC_attach(id);
1036 f_pdp_ctx_act(apars);
1037
1038 /* Now, try another GPRS attach procedure. For further code comments up until receiving the attach
1039 * accept from the SGSN, see definition of f_gmm_attach() */
1040 attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), rai, false, false, omit, omit);
1041 f_send_l3(attach_req, ran_index);
1042 f_gmm_auth(false, false, ran_index);
Vadim Yanitskiy24d22822023-06-27 19:01:26 +07001043 as_gmm_gsup_lu_isd();
arehbein3ede9e32023-02-06 21:02:53 +01001044
1045 BSSGP[ran_index].clear;
1046 log("Trying to receive ", gmm_attach_repeats, " ATTACH ACCEPTs");
1047 for (var integer i := 1; i <= gmm_attach_repeats; i := i+1) {
1048 t_receive_GMM_ATTACH_ACCEPT.start(T3350 + 0.5);
1049 alt {
1050 [] BSSGP[ran_index].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) {
1051 t_receive_GMM_ATTACH_ACCEPT.stop;
1052 }
1053 [] t_receive_GMM_ATTACH_ACCEPT.timeout {
1054 setverdict(fail, "Timeout on receiving ", i, "th ATTACH ACCEPT")
1055 }
1056 }
1057 }
1058 log("Have received ", gmm_attach_repeats, " ATTACH ACCEPT messages");
1059 log("Make sure not more than ", gmm_attach_repeats, " ATTACH ACCEPT messages are sent");
1060 t_receive_GMM_ATTACH_ACCEPT.start(T3350 + 0.5);
1061 alt {
1062 [] BSSGP[ran_index].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) {
1063 setverdict(fail, "Received ", gmm_attach_repeats + 1, "th ATTACH ACCEPT")
1064 }
1065 [] t_receive_GMM_ATTACH_ACCEPT.timeout { }
1066 }
1067
1068 setverdict(pass);
1069}
1070
1071testcase TC_attach_timeout_after_pdp_act() runs on test_CT {
1072 var BSSGP_ConnHdlr vc_conn;
1073 f_init();
1074 vc_conn := f_start_handler(refers(f_TC_attach_timeout_after_pdp_act), testcasename(), g_gb, 21);
1075 f_cleanup();
1076}
1077
Harald Welte5b7c8122018-02-16 21:48:17 +01001078/* MS never responds to ID REQ, expect ATTACH REJECT */
1079private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +01001080 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1081
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001082 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001083 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001084 [] BSSGP[0].receive(tr_GMM_ID_REQ(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001085 /* don't send ID Response */
1086 repeat;
1087 }
Harald Welte955aa942019-05-03 01:29:29 +02001088 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('09'O)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001089 setverdict(pass);
1090 }
Harald Welte955aa942019-05-03 01:29:29 +02001091 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001092 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +02001093 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +01001094 }
1095 }
1096}
1097testcase TC_attach_auth_id_timeout() runs on test_CT {
1098 var BSSGP_ConnHdlr vc_conn;
1099 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001100 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 +01001101 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001102 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001103}
1104
1105/* HLR never responds to SAI REQ, expect ATTACH REJECT */
1106private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +01001107 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1108
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001109 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001110 alt {
1111 [] as_mm_identity();
1112 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
1113 }
1114 /* don't send SAI-response from HLR */
Harald Welte955aa942019-05-03 01:29:29 +02001115 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Welte5b7c8122018-02-16 21:48:17 +01001116 setverdict(pass);
1117}
1118testcase TC_attach_auth_sai_timeout() runs on test_CT {
1119 var BSSGP_ConnHdlr vc_conn;
1120 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001121 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +01001122 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001123 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001124}
1125
Harald Weltefe253882018-02-17 09:25:00 +01001126/* HLR rejects SAI, expect ATTACH REJECT */
1127private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +01001128 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1129
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001130 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +01001131 alt {
1132 [] as_mm_identity();
1133 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
1134 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
1135 }
1136 }
Harald Welte955aa942019-05-03 01:29:29 +02001137 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Weltefe253882018-02-17 09:25:00 +01001138 setverdict(pass);
1139}
1140testcase TC_attach_auth_sai_reject() runs on test_CT {
1141 var BSSGP_ConnHdlr vc_conn;
1142 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001143 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +01001144 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001145 f_cleanup();
Harald Weltefe253882018-02-17 09:25:00 +01001146}
1147
Harald Welte5b7c8122018-02-16 21:48:17 +01001148/* HLR never responds to UL REQ, expect ATTACH REJECT */
1149private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001150 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5b7c8122018-02-16 21:48:17 +01001151 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1152
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001153 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001154 f_gmm_auth();
1155 /* Expect MSC to perform LU with HLR */
1156 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
1157 /* Never follow-up with ISD_REQ or UL_RES */
1158 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001159 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001160 setverdict(pass);
1161 }
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 Welte5b7c8122018-02-16 21:48:17 +01001164 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001165 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +01001166 }
1167 }
1168}
1169testcase TC_attach_gsup_lu_timeout() runs on test_CT {
1170 var BSSGP_ConnHdlr vc_conn;
1171 f_init();
1172 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001173 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +01001174 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001175 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001176}
1177
Harald Welteb7c14e92018-02-17 09:29:16 +01001178/* HLR rejects UL REQ, expect ATTACH REJECT */
1179private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001180 var PDU_L3_SGSN_MS l3_mt;
Harald Welteb7c14e92018-02-17 09:29:16 +01001181 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1182
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001183 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +01001184 f_gmm_auth();
1185 /* Expect MSC to perform LU with HLR */
1186 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
1187 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
1188 }
1189 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001190 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb7c14e92018-02-17 09:29:16 +01001191 setverdict(pass);
1192 }
Harald Welte955aa942019-05-03 01:29:29 +02001193 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1194 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welteb7c14e92018-02-17 09:29:16 +01001195 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001196 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +01001197 }
1198 }
1199}
1200testcase TC_attach_gsup_lu_reject() runs on test_CT {
1201 var BSSGP_ConnHdlr vc_conn;
1202 f_init();
1203 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001204 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +01001205 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001206 f_cleanup();
Harald Welteb7c14e92018-02-17 09:29:16 +01001207}
1208
1209
Harald Welte3823e2e2018-02-16 21:53:48 +01001210/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
1211private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001212 var PDU_L3_SGSN_MS l3_mt;
Harald Welte3823e2e2018-02-16 21:53:48 +01001213 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1214
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001215 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +01001216 f_gmm_auth();
1217 /* Expect MSC to perform LU with HLR */
Vadim Yanitskiy24d22822023-06-27 19:01:26 +07001218 as_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +01001219
Harald Welte955aa942019-05-03 01:29:29 +02001220 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1221 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001222 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001223 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +01001224 setverdict(pass);
1225}
Harald Welte3823e2e2018-02-16 21:53:48 +01001226testcase TC_attach_combined() runs on test_CT {
1227 var BSSGP_ConnHdlr vc_conn;
1228 f_init();
1229 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001230 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +01001231 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001232 f_cleanup();
Harald Welte3823e2e2018-02-16 21:53:48 +01001233}
1234
Harald Welte76dee092018-02-16 22:12:59 +01001235/* Attempt of GPRS ATTACH in 'accept all' mode */
1236private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001237 var PDU_L3_SGSN_MS l3_mt;
Harald Welte76dee092018-02-16 22:12:59 +01001238 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1239
1240 g_pars.net.expect_auth := false;
1241
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001242 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +01001243 f_gmm_auth();
Harald Welte955aa942019-05-03 01:29:29 +02001244 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1245 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001246 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001247 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +01001248 setverdict(pass);
1249}
1250testcase TC_attach_accept_all() runs on test_CT {
1251 var BSSGP_ConnHdlr vc_conn;
1252 f_init();
1253 f_sleep(1.0);
1254 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +02001255 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +01001256 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001257 f_cleanup();
Harald Welte76dee092018-02-16 22:12:59 +01001258}
Harald Welte5b7c8122018-02-16 21:48:17 +01001259
Harald Welteb2124b22018-02-16 22:26:56 +01001260/* Attempt of GPRS ATTACH in 'accept all' mode */
1261private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +01001262 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1263
1264 /* Simulate a foreign IMSI */
1265 g_pars.imsi := '001010123456789'H;
Harald Welte5339b2e2020-10-04 22:52:56 +02001266 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Harald Welteb2124b22018-02-16 22:26:56 +01001267
1268 g_pars.net.expect_auth := false;
1269
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001270 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +01001271 alt {
1272 [] as_mm_identity();
Harald Welte955aa942019-05-03 01:29:29 +02001273 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('07'O)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001274 setverdict(pass);
1275 }
Harald Welte955aa942019-05-03 01:29:29 +02001276 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001277 setverdict(pass);
1278 }
Harald Welte955aa942019-05-03 01:29:29 +02001279 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001280 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001281 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001282 }
Harald Welteb2124b22018-02-16 22:26:56 +01001283 }
1284}
1285testcase TC_attach_closed() runs on test_CT {
1286 var BSSGP_ConnHdlr vc_conn;
1287 f_init();
1288 f_sleep(1.0);
1289 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1290 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001291 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +01001292 vc_conn.done;
1293 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001294 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +01001295 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001296 f_cleanup();
Harald Welteb2124b22018-02-16 22:26:56 +01001297}
1298
Harald Welte04683d02018-02-16 22:43:45 +01001299/* Routing Area Update from Unknown TLLI -> REJECT */
1300private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +01001301 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1302
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001303 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 +01001304 alt {
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01001305 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) { /* gmm cause: implicitly detached */
Harald Welte04683d02018-02-16 22:43:45 +01001306 setverdict(pass);
1307 }
1308 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001309 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +01001310 }
1311}
1312testcase TC_rau_unknown() runs on test_CT {
1313 var BSSGP_ConnHdlr vc_conn;
1314 f_init();
1315 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001316 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +01001317 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001318 f_cleanup();
Harald Welte04683d02018-02-16 22:43:45 +01001319}
1320
Harald Welte91636de2018-02-17 10:16:14 +01001321private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +01001322 /* first perform regular attach */
1323 f_TC_attach(id);
1324
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001325 f_routing_area_update(g_pars.ra);
1326
Harald Welte91636de2018-02-17 10:16:14 +01001327}
1328testcase TC_attach_rau() runs on test_CT {
1329 var BSSGP_ConnHdlr vc_conn;
1330 f_init();
1331 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001332 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +01001333 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001334 f_cleanup();
Harald Welte91636de2018-02-17 10:16:14 +01001335}
Harald Welte04683d02018-02-16 22:43:45 +01001336
Harald Welte6abb9fe2018-02-17 15:24:48 +01001337/* general GPRS DETACH helper */
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001338function 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 +02001339 var PDU_L3_SGSN_MS l3_mt;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001340 timer T := 5.0;
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001341 f_send_l3(ts_GMM_DET_REQ_MO(detach_type, power_off), ran_index);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001342 if (expect_purge) {
1343 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
1344 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
1345 }
1346 T.start;
1347 alt {
1348 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
1349 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +02001350 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001351 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001352 [power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001353 g_pars.ra := omit;
Alexander Couzens8e0fd462019-05-11 01:20:55 +02001354 setverdict(fail, "Unexpected DETACH ACCEPT in power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +02001355 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001356 /* TODO: check if any PDP contexts are deactivated on network side? */
1357 }
1358 [power_off] T.timeout {
1359 setverdict(pass);
1360 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001361 [not power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001362 g_pars.ra := omit;
1363 setverdict(pass);
1364 /* TODO: check if any PDP contexts are deactivated on network side? */
1365 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001366 [] BSSGP[ran_index].receive(PDU_L3_SGSN_MS:?) -> value l3_mt {
Alexander Couzens4630e742019-05-11 01:50:10 +02001367 if (power_off) {
1368 setverdict(fail, "Unexpected Layer 3 package received in power-off DETACH");
1369 } else {
1370 setverdict(fail, "Unexpected Layer 3 package received in normal DETACH");
1371 }
1372 mtc.stop;
1373 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001374 [] BSSGP[ran_index].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +01001375 }
1376}
1377
1378/* IMSI DETACH (non-power-off) for unknown TLLI */
1379private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1380 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
1381}
1382testcase TC_detach_unknown_nopoweroff() runs on test_CT {
1383 var BSSGP_ConnHdlr vc_conn;
1384 f_init();
1385 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001386 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001387 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001388 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001389}
1390
1391/* IMSI DETACH (power-off) for unknown TLLI */
1392private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1393 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
1394}
1395testcase TC_detach_unknown_poweroff() runs on test_CT {
1396 var BSSGP_ConnHdlr vc_conn;
1397 f_init();
1398 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001399 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001400 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001401 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001402}
1403
1404/* IMSI DETACH (non-power-off) for known TLLI */
1405private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1406 /* first perform regular attach */
1407 f_TC_attach(id);
1408
1409 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
1410}
1411testcase TC_detach_nopoweroff() runs on test_CT {
1412 var BSSGP_ConnHdlr vc_conn;
1413 f_init();
1414 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001415 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001416 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001417 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001418}
1419
1420/* IMSI DETACH (power-off) for known TLLI */
1421private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1422 /* first perform regular attach */
1423 f_TC_attach(id);
1424
1425 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1426}
1427testcase TC_detach_poweroff() runs on test_CT {
1428 var BSSGP_ConnHdlr vc_conn;
1429 f_init();
1430 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001431 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001432 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001433 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001434}
1435
Harald Welteeded9ad2018-02-17 20:57:34 +01001436type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +01001437 BIT3 tid, /* L3 Transaction ID */
1438 BIT4 nsapi, /* SNDCP NSAPI */
1439 BIT4 sapi, /* LLC SAPI */
1440 QoSV qos, /* QoS parameters */
1441 PDPAddressV addr, /* IP address */
1442 octetstring apn optional, /* APN name */
1443 ProtocolConfigOptionsV pco optional, /* protoco config opts */
1444 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +01001445 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +01001446 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +01001447
Harald Welte822f9102018-02-18 20:39:06 +01001448 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
1449 OCT4 ggsn_tei_u, /* GGSN TEI User */
1450 octetstring ggsn_ip_c, /* GGSN IP Control */
1451 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001452 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +01001453
Harald Welte822f9102018-02-18 20:39:06 +01001454 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
1455 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
1456 octetstring sgsn_ip_c optional, /* SGSN IP Control */
1457 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +01001458};
1459
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001460
1461private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
1462 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
1463 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
1464 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
1465 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
1466 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
1467 f_gtp_register_teid(apars.ggsn_tei_c);
1468 f_gtp_register_teid(apars.ggsn_tei_u);
1469}
1470
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001471function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001472runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +01001473 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1474 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001475 var template Recovery_gtpc recovery := omit;
1476
1477 if (send_recovery) {
1478 recovery := ts_Recovery(apars.ggsn_restart_ctr);
1479 }
Harald Welteeded9ad2018-02-17 20:57:34 +01001480
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001481 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 +02001482 apars.apn, apars.pco), ran_index);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001483 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
1484 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
1485 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1486 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
1487 apars.sgsn_tei_c, apars.gtp_resp_cause,
1488 apars.ggsn_tei_c, apars.ggsn_tei_u,
1489 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001490 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1491 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +01001492 }
1493 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001494 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001495 setverdict(pass);
1496 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001497 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001498 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +02001499 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001500 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001501 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001502 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +02001503 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001504 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001505 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Weltef7191672019-05-02 20:37:23 +02001506 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
1507 mtc.stop;
1508 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001509 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001510 setverdict(pass);
1511 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001512 [] as_xid(apars, ran_index);
Harald Welteeded9ad2018-02-17 20:57:34 +01001513 }
1514}
1515
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001516function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001517runs on BSSGP_ConnHdlr {
Harald Welte6f203162018-02-18 22:04:55 +01001518 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1519 var Gtp1cUnitdata g_ud;
1520
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001521 f_send_l3(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit), ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001522 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1523 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001524 BSSGP[ran_index].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001525 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1526 }
1527 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001528 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Harald Welte6f203162018-02-18 22:04:55 +01001529 setverdict(pass);
1530 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001531 [] as_xid(apars, ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001532 }
1533}
1534
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001535function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001536runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001537 var Gtp1cUnitdata g_ud;
1538 var integer seq_nr := 23;
1539 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1540
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001541 BSSGP[ran_index].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001542 if (error_ind) {
1543 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1544 } else {
1545 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1546 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001547
1548 timer T := 5.0;
1549 T.start;
1550
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001551 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001552 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1553 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), ran_index);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001554 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001555 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1556 repeat;
1557 }
1558 [] T.timeout {
1559 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1560 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001561 }
1562}
1563
Harald Welte6f203162018-02-18 22:04:55 +01001564
Harald Welteeded9ad2018-02-17 20:57:34 +01001565/* Table 10.5.156/3GPP TS 24.008 */
1566template (value) QoSV t_QosDefault := {
1567 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1568 delayClass := '100'B, /* best effort */
1569 spare1 := '00'B,
1570 precedenceClass := '010'B, /* normal */
1571 spare2 := '0'B,
1572 peakThroughput := '0000'B, /* subscribed */
1573 meanThroughput := '00000'B, /* subscribed */
1574 spare3 := '000'B,
1575 deliverErroneusSDU := omit,
1576 deliveryOrder := omit,
1577 trafficClass := omit,
1578 maxSDUSize := omit,
1579 maxBitrateUplink := omit,
1580 maxBitrateDownlink := omit,
1581 sduErrorRatio := omit,
1582 residualBER := omit,
1583 trafficHandlingPriority := omit,
1584 transferDelay := omit,
1585 guaranteedBitRateUplink := omit,
1586 guaranteedBitRateDownlink := omit,
1587 sourceStatisticsDescriptor := omit,
1588 signallingIndication := omit,
1589 spare4 := omit,
1590 maxBitrateDownlinkExt := omit,
1591 guaranteedBitRateDownlinkExt := omit,
1592 maxBitrateUplinkExt := omit,
1593 guaranteedBitRateUplinkExt := omit,
1594 maxBitrateDownlinkExt2 := omit,
1595 guaranteedBitRateDownlinkExt2 := omit,
1596 maxBitrateUplinkExt2 := omit,
1597 guaranteedBitRateUplinkExt2 := omit
1598}
1599
1600/* 10.5.6.4 / 3GPP TS 24.008 */
1601template (value) PDPAddressV t_AddrIPv4dyn := {
1602 pdpTypeOrg := '0001'B, /* IETF */
1603 spare := '0000'B,
1604 pdpTypeNum := '21'O, /* IPv4 */
1605 addressInfo := omit
1606}
1607template (value) PDPAddressV t_AddrIPv6dyn := {
1608 pdpTypeOrg := '0001'B, /* IETF */
1609 spare := '0000'B,
1610 pdpTypeNum := '53'O, /* IPv6 */
1611 addressInfo := omit
1612}
1613
Harald Welte37692d82018-02-18 15:21:34 +01001614template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001615 tid := '000'B,
1616 nsapi := '0101'B, /* < 5 are reserved */
1617 sapi := '0011'B, /* 3/5/9/11 */
1618 qos := t_QosDefault,
1619 addr := t_AddrIPv4dyn,
1620 apn := omit,
1621 pco := omit,
1622 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001623 gtp_resp_cause := int2oct(128, 1),
1624 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001625
1626 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001627 ggsn_tei_c := f_rnd_octstring(4),
1628 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001629 ggsn_ip_c := f_inet_addr(ggsn_ip),
1630 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001631 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001632
Harald Welteeded9ad2018-02-17 20:57:34 +01001633 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001634 sgsn_tei_u := omit,
1635 sgsn_ip_c := omit,
1636 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001637}
1638
Harald Welte37692d82018-02-18 15:21:34 +01001639template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1640 connId := 1,
1641 remName := f_inet_ntoa(ip),
1642 remPort := GTP1U_PORT
1643}
1644
1645template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1646 connId := 1,
1647 remName := f_inet_ntoa(ip),
1648 remPort := GTP1C_PORT
1649}
1650
1651private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1652 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1653 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1654}
1655
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001656private altstep as_xid(PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr {
1657 [] BSSGP[ran_index].receive(tr_LLC_XID_MT_CMD(?, apars.sapi)) {
Harald Welte37692d82018-02-18 15:21:34 +01001658 repeat;
1659 }
1660}
1661
1662template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1663 pDU_SN_UNITDATA := {
1664 nsapi := nsapi,
1665 moreBit := ?,
1666 snPduType := '1'B,
1667 firstSegmentIndicator := ?,
1668 spareBit := ?,
1669 pcomp := ?,
1670 dcomp := ?,
1671 npduNumber := ?,
1672 segmentNumber := ?,
1673 npduNumberContinued := ?,
1674 dataSegmentSnUnitdataPdu := payload
1675 }
1676}
1677
1678/* simple case: single segment, no compression */
1679template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1680 pDU_SN_UNITDATA := {
1681 nsapi := nsapi,
1682 moreBit := '0'B,
1683 snPduType := '1'B,
1684 firstSegmentIndicator := '1'B,
1685 spareBit := '0'B,
1686 pcomp := '0000'B,
1687 dcomp := '0000'B,
1688 npduNumber := '0000'B,
1689 segmentNumber := '0000'B,
1690 npduNumberContinued := '00'O,
1691 dataSegmentSnUnitdataPdu := payload
1692 }
1693}
1694
1695/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
Harald Weltea5c71cd2020-06-17 22:12:04 +02001696private 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 +02001697runs on BSSGP_ConnHdlr {
Harald Weltea5c71cd2020-06-17 22:12:04 +02001698 timer T := 5.0;
Harald Welte37692d82018-02-18 15:21:34 +01001699 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1700 f_gtpu_send(apars, payload);
Harald Weltea5c71cd2020-06-17 22:12:04 +02001701 T.start;
Harald Welte37692d82018-02-18 15:21:34 +01001702 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1703 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001704 [] as_xid(apars, ran_index);
1705 //[] BSSGP[ran_index].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
Harald Weltea5c71cd2020-06-17 22:12:04 +02001706 [expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload));
1707 [expect_fwd] T.timeout {
1708 setverdict(fail, "Timeout waiting for GTP-U to appear on BSSGP");
1709 mtc.stop;
1710 }
1711 [not expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload)) {
1712 setverdict(fail, "GTP-U forwarded to BSSGP but not expected")
1713 mtc.stop;
1714 }
1715 [not expect_fwd] T.timeout {}
Harald Welte37692d82018-02-18 15:21:34 +01001716 }
1717}
1718
Harald Welte64d6b512020-06-17 16:42:00 +02001719/* Transceive given 'payload' as MO message from Gb -> OsmoSGSN -> GTP */
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01001720private 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 +02001721runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001722 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1723 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1724 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01001725 BSSGP[ran_index].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, n_u));
Harald Welte37692d82018-02-18 15:21:34 +01001726 /* Expect PDU via GTP from SGSN on simulated GGSN */
1727 alt {
1728 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1729 }
1730}
1731
Harald Welteeded9ad2018-02-17 20:57:34 +01001732private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001733 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001734
1735 /* first perform regular attach */
1736 f_TC_attach(id);
1737
1738 f_pdp_ctx_act(apars);
1739}
1740testcase TC_attach_pdp_act() runs on test_CT {
1741 var BSSGP_ConnHdlr vc_conn;
1742 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001743 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001744 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001745 f_cleanup();
Harald Welteeded9ad2018-02-17 20:57:34 +01001746}
Harald Welteb2124b22018-02-16 22:26:56 +01001747
Harald Welte835b15f2018-02-18 14:39:11 +01001748/* PDP Context activation for not-attached subscriber; expect fail */
1749private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001750 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001751 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 +01001752 apars.apn, apars.pco));
1753 alt {
1754 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Harald Welte955aa942019-05-03 01:29:29 +02001755 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001756 setverdict(pass);
1757 }
1758 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1759 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001760 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001761 }
Harald Welte955aa942019-05-03 01:29:29 +02001762 [] BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001763 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001764 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001765 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001766 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001767 }
1768}
1769testcase TC_pdp_act_unattached() runs on test_CT {
1770 var BSSGP_ConnHdlr vc_conn;
1771 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001772 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001773 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001774 f_cleanup();
Harald Welte835b15f2018-02-18 14:39:11 +01001775}
1776
Harald Welte37692d82018-02-18 15:21:34 +01001777/* ATTACH + PDP CTX ACT + user plane traffic */
1778private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1779 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1780
1781 /* first perform regular attach */
1782 f_TC_attach(id);
1783 /* then activate PDP context */
1784 f_pdp_ctx_act(apars);
1785 /* then transceive a downlink PDU */
1786 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1787 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1788}
1789testcase TC_attach_pdp_act_user() runs on test_CT {
1790 var BSSGP_ConnHdlr vc_conn;
1791 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001792 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001793 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001794 f_cleanup();
Harald Welte37692d82018-02-18 15:21:34 +01001795}
1796
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001797/* ATTACH + PDP CTX ACT; reject from GGSN */
1798private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1799 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1800
1801 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1802 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1803
1804 /* first perform regular attach */
1805 f_TC_attach(id);
1806 /* then activate PDP context */
1807 f_pdp_ctx_act(apars);
1808}
1809testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1810 var BSSGP_ConnHdlr vc_conn;
1811 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001812 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001813 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001814 f_cleanup();
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001815}
Harald Welte835b15f2018-02-18 14:39:11 +01001816
Harald Welte6f203162018-02-18 22:04:55 +01001817/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1818private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1819 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1820
1821 /* first perform regular attach */
1822 f_TC_attach(id);
1823 /* then activate PDP context */
1824 f_pdp_ctx_act(apars);
1825 /* then transceive a downlink PDU */
1826 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1827 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1828
1829 f_pdp_ctx_deact_mo(apars, '00'O);
1830}
1831testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1832 var BSSGP_ConnHdlr vc_conn;
1833 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001834 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 +01001835 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001836 f_cleanup();
Harald Welte6f203162018-02-18 22:04:55 +01001837}
1838
Harald Welte57b9b7f2018-02-18 22:28:13 +01001839/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1840private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1841 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1842
1843 /* first perform regular attach */
1844 f_TC_attach(id);
1845 /* then activate PDP context */
1846 f_pdp_ctx_act(apars);
1847 /* then transceive a downlink PDU */
1848 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1849 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1850
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001851 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001852}
1853testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1854 var BSSGP_ConnHdlr vc_conn;
1855 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001856 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 +01001857 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001858 f_cleanup();
Harald Welte57b9b7f2018-02-18 22:28:13 +01001859}
1860
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001861/* Test MS sending a duplicate Deact PDP Ctx (OS#3956). */
1862private function f_TC_attach_pdp_act_deact_dup(charstring id) runs on BSSGP_ConnHdlr {
1863 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1864 var Gtp1cUnitdata g_ud;
1865 var integer i;
1866 var OCT1 cause_regular_deact := '24'O;
1867
1868 /* first perform regular attach + PDP context act */
1869 f_TC_attach(id);
1870 f_pdp_ctx_act(apars);
1871
1872 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1873 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1874
1875 for (i := 0; i < 2; i := i+1) {
1876 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1877 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1878 log("Received deletePDPContextResponse " & int2str(i) & ", seq_nr=" & int2str(seq_nr));
1879 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1880 }
1881 }
1882
1883 alt {
1884 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1885 setverdict(pass);
1886 }
1887 [] as_xid(apars, 0);
1888 }
1889
1890 /* Make sure second DeactPdpAccept is sent: */
1891 timer T := 2.0;
1892 T.start;
1893 alt {
1894 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1895 setverdict(fail, "Second SM_DEACT_PDP_ACCEPT_MT received");
1896 }
1897 [] T.timeout {
1898 setverdict(pass);
1899 }
1900 }
1901
1902 setverdict(pass);
1903}
1904testcase TC_attach_pdp_act_deact_dup() runs on test_CT {
1905 var BSSGP_ConnHdlr vc_conn;
1906 f_init();
1907 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_dup), testcasename(), g_gb, 46);
1908 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001909 f_cleanup();
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001910}
1911
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001912/* ATTACH + ATTACH (2nd) */
1913private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1914 g_pars.t_guard := 5.0;
1915
1916 /* first perform regular attach */
1917 f_TC_attach(id);
1918
1919 /* second to perform regular attach */
1920 f_TC_attach(id);
1921}
1922
1923
1924testcase TC_attach_second_attempt() runs on test_CT {
1925 var BSSGP_ConnHdlr vc_conn;
1926 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001927 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001928 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001929 f_cleanup();
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001930}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001931
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001932private function f_TC_attach_echo_timeout(charstring id) runs on BSSGP_ConnHdlr {
1933 var Gtp1cUnitdata g_ud;
1934 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1935 var integer seq_nr;
1936
1937 /* first perform regular attach */
1938 f_TC_attach(id);
1939 /* then activate PDP context */
1940 f_pdp_ctx_act(apars);
1941
1942 /* Wait to receive first echo request and send initial Restart counter */
1943 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1944 BSSGP[0].clear;
1945 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1946 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1947 f_sleep(int2float(mp_echo_interval)); /* wait until around next echo is expected */
1948 }
1949
1950 /* At some point next echo request not answered will timeout and SGSN
1951 should drop the pdp ctx. Around T3 (3secs) * 6 (+ extra, a lot due to OS#4178): */
1952 timer T := 3.0 * 6.0 + 16.0;
1953 T.start;
1954 alt {
1955 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1956 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
1957 setverdict(pass);
1958 }
1959 [] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1960 /* SGSN currently doesn't send this message because it expects GGSN to be non-reachable anyway */
1961 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1962 log("Received deletePDPContextRequest seq_nr=" & int2str(seq_nr));
1963 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1964 repeat;
1965 }
1966 [] GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1967 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1968 log("Received EchoRequest seq_nr=" & int2str(seq_nr));
1969 repeat;
1970 }
1971 [] T.timeout {
1972 setverdict(fail, "BSSGP DeactPdpReq not received");
1973 mtc.stop;
1974 }
1975 [] as_xid(apars);
1976 }
1977 T.stop
1978
1979 setverdict(pass);
1980}
1981/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1982testcase TC_attach_echo_timeout() runs on test_CT {
1983 var BSSGP_ConnHdlr vc_conn;
1984 g_use_echo := true;
1985 f_init();
1986 vc_conn := f_start_handler(refers(f_TC_attach_echo_timeout), testcasename(), g_gb, 67, 50.0);
1987 vc_conn.done;
1988 g_use_echo := false;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001989 f_cleanup();
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001990}
1991
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001992private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001993 var Gtp1cUnitdata g_ud;
1994 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1995
1996 /* first perform regular attach */
1997 f_TC_attach(id);
1998 /* Activate a pdp context against the GGSN */
1999 f_pdp_ctx_act(apars);
2000 /* Wait to receive first echo request and send initial Restart counter */
2001 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
2002 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
2003 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
2004 }
2005 /* Wait to receive second echo request and send incremented Restart
2006 counter. This will fake a restarted GGSN, and pdp ctx allocated
2007 should be released by SGSN */
2008 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
2009 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
2010 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
2011 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
2012 }
2013 var OCT1 cause_network_failure := int2oct(38, 1)
2014 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002015 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002016 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02002017 setverdict(pass);
2018 }
2019 [] as_xid(apars);
2020 }
2021 setverdict(pass);
2022}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002023/* ATTACH + trigger Recovery procedure through EchoResp */
2024testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02002025 var BSSGP_ConnHdlr vc_conn;
2026 g_use_echo := true
2027 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002028 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 +02002029 vc_conn.done;
2030 g_use_echo := false
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002031 f_cleanup();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02002032}
2033
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002034private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
2035 var Gtp1cUnitdata g_ud;
2036 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2037 var integer seq_nr := 23;
2038 var GtpPeer peer;
2039 /* first perform regular attach */
2040 f_TC_attach(id);
2041
2042 /* Use this CTX ACT to send initial Restart counter to SGSN. */
2043 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
2044 apars.exp_rej_cause := '1a'O; /* insufficient resources */
2045 f_pdp_ctx_act(apars, true);
2046
2047 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
2048/* received. */
2049 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
2050
2051 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
2052 would be great to have an active pdp context here before triggering
2053 Recovery, and making sure the the DEACT request is sent by the SGSN.
2054 */
2055
2056 /* Activate a pdp context against the GGSN, send incremented Recovery
2057 IE. This should trigger the recovery path, but still this specific
2058 CTX activation should work. */
2059 apars.exp_rej_cause := omit; /* default value for tests */
2060 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
2061 f_pdp_ctx_act(apars, true);
2062
2063 setverdict(pass);
2064}
2065/* ATTACH + trigger Recovery procedure through CreatePdpResp */
2066testcase TC_attach_restart_ctr_create() runs on test_CT {
2067 var BSSGP_ConnHdlr vc_conn;
2068 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002069 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 +02002070 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002071 f_cleanup();
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002072}
2073
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002074/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
2075private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
2076 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2077 var integer seq_nr := 23;
2078 var GtpPeer peer;
2079 var integer i;
2080
2081 /* first perform regular attach */
2082 f_TC_attach(id);
2083 /* then activate PDP context */
2084 f_pdp_ctx_act(apars);
2085
Alexander Couzens0e510e62018-07-28 23:06:00 +02002086 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002087 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
2088 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
2089
2090 for (i := 0; i < 5; i := i+1) {
2091 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002092 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002093 [] as_xid(apars);
2094 }
2095 }
2096
2097 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
2098
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002099 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002100 setverdict(pass);
2101}
2102testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
2103 var BSSGP_ConnHdlr vc_conn;
2104 f_init();
2105 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002106 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 +02002107 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002108 f_cleanup();
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002109}
2110
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002111/* ATTACH + PDP CTX ACT dropped + retrans */
2112private function f_TC_attach_pdp_act_deact_gtp_retrans(charstring id) runs on BSSGP_ConnHdlr {
2113 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2114 var Gtp1cUnitdata g_ud_first, g_ud_second;
2115 /* first perform regular attach */
2116 f_TC_attach(id);
2117
2118 /* then activate PDP context on the Gb side */
2119 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
2120 apars.apn, apars.pco), 0);
2121
2122 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_first {}
2123 log("First createPDPContextRequest received, dropping & waiting for retransmission");
2124 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_second {
2125 if (g_ud_first != g_ud_second) {
2126 setverdict(fail, "Retransmitted GTP message createPDPContextRequest is different from original one!");
2127 mtc.stop;
2128 }
2129 f_process_gtp_ctx_act_req(apars, g_ud_second.gtpc);
2130 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
2131 GTP.send(ts_GTPC_CreatePdpResp(g_ud_second.peer, seq_nr,
2132 apars.sgsn_tei_c, apars.gtp_resp_cause,
2133 apars.ggsn_tei_c, apars.ggsn_tei_u,
2134 apars.nsapi,
2135 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
2136 omit, omit));
2137 }
Harald Welte955aa942019-05-03 01:29:29 +02002138 BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT) {}
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002139
2140 /* Now the same with Deact */
2141 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, '00'O, false, omit), 0);
2142 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_first {}
2143 log("First deletePDPContextRequest received, dropping & waiting for retransmission");
2144 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_second {
2145 if (g_ud_first != g_ud_second) {
2146 setverdict(fail, "Retransmitted GTP message deletePDPContextRequest is different from original one!");
2147 mtc.stop;
2148 }
2149 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
2150 BSSGP[0].clear;
2151 GTP.send(ts_GTPC_DeletePdpResp(g_ud_second.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
2152 }
2153 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002154 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002155 setverdict(pass);
2156 }
2157 [] as_xid(apars, 0);
2158 }
2159
2160 setverdict(pass);
2161}
2162testcase TC_attach_pdp_act_deact_gtp_retrans() runs on test_CT {
2163 var BSSGP_ConnHdlr vc_conn;
2164 f_init();
2165 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans), testcasename(), g_gb, 27);
2166 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002167 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002168}
2169
2170/* Test that SGSN GTP response retransmit queue works fine */
2171private function f_TC_attach_pdp_act_deact_gtp_retrans_resp(charstring id) runs on BSSGP_ConnHdlr {
2172 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2173 var integer seq_nr := 23;
2174 var Gtp1cUnitdata g_ud_first, g_ud_second;
2175 var template Gtp1cUnitdata g_delete_req;
2176 /* first perform regular attach + PDP context act */
2177 f_TC_attach(id);
2178 f_pdp_ctx_act(apars);
2179
2180 /* Now perform an MT DeleteCtxReq and emulate GGSN didn't receive response and sends a duplicated DeleteCtxReq */
2181 BSSGP[0].clear;
2182 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
2183 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B);
2184 GTP.send(g_delete_req);
2185 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002186 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002187 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), 0);
2188 }
2189 [] as_xid(apars, 0);
2190 }
2191 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_first {
2192 if (g_ud_first.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != '80'O) {
2193 setverdict(fail, "Received deletePDPContextResponse cause is not 'Request accepted'");
2194 mtc.stop;
2195 }
2196 };
2197
2198 /* Send duplicate DeleteCtxReq */
2199 log("First deletePDPContextResponse received, dropping & retransmitting retransmission of deletePDPContextRequest");
2200 GTP.send(g_delete_req);
2201 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_second {
2202 if (g_ud_first != g_ud_second) {
2203 setverdict(fail, "Retransmitted GTP message deletePDPContextResponse is different from original one!");
2204 mtc.stop;
2205 }
2206 }
2207
2208 /* Let's send now a new DeleteCtxReq (increased seq_nr) to make sure it
2209 * is handled differently by SGSN (expect "non-existent" cause) */
2210 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr + 1, apars.sgsn_tei_c, apars.nsapi, '1'B);
2211 GTP.send(g_delete_req);
2212 /* Response with cause "non-existent" must be sent with TEID 0 according to specs */
2213 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, '00000000'O)) -> value g_ud_second {
2214 if (g_ud_second.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != 'C0'O) {
2215 setverdict(fail, "Received deletePDPContextResponse cause is not 'Non-existent'");
2216 mtc.stop;
2217 }
2218 }
2219
2220 setverdict(pass);
2221}
2222testcase TC_attach_pdp_act_deact_gtp_retrans_resp() runs on test_CT {
2223 var BSSGP_ConnHdlr vc_conn;
2224 f_init();
2225 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans_resp), testcasename(), g_gb, 28);
2226 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002227 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002228}
2229
Alexander Couzens5e307b42018-05-22 18:12:20 +02002230private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
2231 /* MS: perform regular attach */
2232 f_TC_attach(id);
2233
2234 /* HLR: cancel the location request */
2235 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
2236 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02002237
2238 /* ensure no Detach Request got received */
2239 timer T := 5.0;
2240 T.start;
2241 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002242 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(*, *, *)) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002243 T.stop;
2244 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02002245 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002246 }
2247 [] T.timeout {
2248 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02002249 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002250 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02002251 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002252 repeat;
2253 }
2254 }
2255}
2256
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002257/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
2258private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
2259 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2260
2261 /* first perform regular attach */
2262 f_TC_attach(id);
2263 /* then activate PDP context */
2264 f_pdp_ctx_act(apars);
2265 /* then transceive a downlink PDU */
2266 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
2267
2268 /* Send Error indication as response from upload PDU and expect deact towards MS */
2269 f_pdp_ctx_deact_mt(apars, true);
2270}
2271testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
2272 var BSSGP_ConnHdlr vc_conn;
2273 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002274 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 +02002275 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002276 f_cleanup();
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002277}
2278
Alexander Couzens5e307b42018-05-22 18:12:20 +02002279testcase TC_hlr_location_cancel_request_update() runs on test_CT {
2280 /* MS <-> SGSN: GMM Attach
2281 * HLR -> SGSN: Cancel Location Request
2282 * HLR <- SGSN: Cancel Location Ack
2283 */
2284 var BSSGP_ConnHdlr vc_conn;
2285 f_init();
2286 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002287 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02002288 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002289 f_cleanup();
Alexander Couzens5e307b42018-05-22 18:12:20 +02002290}
2291
2292
Alexander Couzensc87967a2018-05-22 16:09:54 +02002293private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
2294 /* MS: perform regular attach */
2295 f_TC_attach(id);
2296
2297 /* HLR: cancel the location request */
2298 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
2299 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
2300 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
2301
2302 /* MS: receive a Detach Request */
Harald Welte955aa942019-05-03 01:29:29 +02002303 BSSGP[0].receive(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002304 f_send_l3(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002305
2306 setverdict(pass);
2307}
2308
2309testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
2310 /* MS <-> SGSN: GMM Attach
2311 * HLR -> SGSN: Cancel Location Request
2312 * HLR <- SGSN: Cancel Location Ack
2313 * MS <- SGSN: Detach Request
2314 * SGSN-> MS: Detach Complete
2315 */
2316 var BSSGP_ConnHdlr vc_conn;
2317 f_init();
2318 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002319 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002320 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002321 f_cleanup();
Alexander Couzensc87967a2018-05-22 16:09:54 +02002322}
2323
2324
Alexander Couzens6c47f292018-05-22 17:09:49 +02002325private function f_hlr_location_cancel_request_unknown_subscriber(
2326 charstring id,
2327 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
2328
2329 /* HLR: cancel the location request */
2330 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
2331
2332 /* cause 2 = IMSI_UNKNOWN */
2333 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
2334
2335 setverdict(pass);
2336}
2337
2338private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002339 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002340}
2341
2342testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
2343 /* HLR -> SGSN: Cancel Location Request
2344 * HLR <- SGSN: Cancel Location Error
2345 */
2346
2347 var BSSGP_ConnHdlr vc_conn;
2348 f_init();
2349 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002350 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 +02002351 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002352 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002353}
2354
2355private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002356 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002357}
2358
2359testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
2360 /* HLR -> SGSN: Cancel Location Request
2361 * HLR <- SGSN: Cancel Location Error
2362 */
2363
2364 var BSSGP_ConnHdlr vc_conn;
2365 f_init();
2366 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002367 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 +02002368 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002369 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002370}
2371
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002372private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
2373 f_TC_attach(id);
2374 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2375}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002376
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002377testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
2378 /* MS <-> SGSN: Attach
2379 * MS -> SGSN: Detach Req (Power off)
2380 * VTY -> SGSN: Check if MS is NOT in subscriber cache
2381 */
2382 var BSSGP_ConnHdlr vc_conn;
2383 var integer id := 33;
2384 var charstring imsi := hex2str(f_gen_imsi(id));
2385
2386 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002387 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002388 vc_conn.done;
2389
2390 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002391 f_cleanup();
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002392}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002393
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002394/* Attempt an attach, but loose the Identification Request (IMEI) */
2395private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
2396 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002397 var MobileIdentityLV mi;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002398
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002399 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 +02002400
2401 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002402 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002403 /* break */
2404 }
Harald Welte955aa942019-05-03 01:29:29 +02002405 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002406 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002407 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002408 repeat;
2409 }
Harald Welte955aa942019-05-03 01:29:29 +02002410 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002411 /* ignore ID REQ IMEI */
2412 count_req := count_req + 1;
2413 repeat;
2414 }
2415 }
2416 if (count_req != 5) {
2417 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002418 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002419 }
2420 setverdict(pass);
2421}
2422
2423testcase TC_attach_no_imei_response() runs on test_CT {
2424 /* MS -> SGSN: Attach Request IMSI
2425 * MS <- SGSN: Identity Request IMSI (optional)
2426 * MS -> SGSN: Identity Response IMSI (optional)
2427 * MS <- SGSN: Identity Request IMEI
2428 * MS -x SGSN: no response
2429 * MS <- SGSN: re-send: Identity Request IMEI 4x
2430 * MS <- SGSN: Attach Reject
2431 */
2432 var BSSGP_ConnHdlr vc_conn;
2433 f_init();
2434 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002435 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 +02002436 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002437 f_cleanup();
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002438}
2439
Alexander Couzens53f20562018-06-12 16:24:12 +02002440/* Attempt an attach, but loose the Identification Request (IMSI) */
2441private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
2442 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002443 var MobileIdentityLV mi;
Alexander Couzens53f20562018-06-12 16:24:12 +02002444
2445 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
2446 g_pars.p_tmsi := 'c0000035'O;
2447
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002448 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 +02002449
2450 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002451 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002452 /* break */
2453 }
Harald Welte955aa942019-05-03 01:29:29 +02002454 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002455 /* ignore ID REQ IMSI */
2456 count_req := count_req + 1;
2457 repeat;
2458 }
Harald Welte955aa942019-05-03 01:29:29 +02002459 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002460 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002461 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02002462 repeat;
2463 }
2464 }
2465 if (count_req != 5) {
2466 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002467 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02002468 }
2469 setverdict(pass);
2470}
2471
2472testcase TC_attach_no_imsi_response() runs on test_CT {
2473 /* MS -> SGSN: Attach Request TMSI (unknown)
2474 * MS <- SGSN: Identity Request IMEI (optional)
2475 * MS -> SGSN: Identity Response IMEI (optional)
2476 * MS <- SGSN: Identity Request IMSI
2477 * MS -x SGSN: no response
2478 * MS <- SGSN: re-send: Identity Request IMSI 4x
2479 * MS <- SGSN: Attach Reject
2480 */
2481 var BSSGP_ConnHdlr vc_conn;
2482 f_init();
2483 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002484 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 +02002485 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002486 f_cleanup();
Alexander Couzens53f20562018-06-12 16:24:12 +02002487}
2488
Alexander Couzenscf818962018-06-05 18:00:00 +02002489private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
2490 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
2491}
2492
2493testcase TC_attach_check_subscriber_list() runs on test_CT {
2494 /* MS <-> SGSN: Attach
2495 * VTY -> SGSN: Check if MS is in subscriber cache
2496 */
2497 var BSSGP_ConnHdlr vc_conn;
2498 var integer id := 34;
2499 var charstring imsi := hex2str(f_gen_imsi(id));
2500
2501 f_init();
2502 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002503 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02002504 vc_conn.done;
2505
2506 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
2507 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002508 f_cleanup();
Alexander Couzenscf818962018-06-05 18:00:00 +02002509}
2510
Alexander Couzensf9858652018-06-07 16:14:53 +02002511private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
2512 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002513 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensf9858652018-06-07 16:14:53 +02002514
2515 /* unregister the old IMSI */
2516 f_bssgp_client_unregister(g_pars.imsi);
2517 /* Simulate a foreign IMSI */
Alexander Couzens03d12242018-08-07 16:13:52 +02002518 g_pars.imsi := '001010123456700'H;
Harald Welte5339b2e2020-10-04 22:52:56 +02002519 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Alexander Couzensf9858652018-06-07 16:14:53 +02002520
2521 /* there is no auth */
2522 g_pars.net.expect_auth := false;
2523
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002524 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02002525 f_gmm_auth();
2526 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002527 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzensf9858652018-06-07 16:14:53 +02002528 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02002529 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02002530 }
Harald Welte955aa942019-05-03 01:29:29 +02002531 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) -> value l3_mt {
2532 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002533 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02002534 setverdict(pass);
2535 }
2536 }
2537}
Alexander Couzens03d12242018-08-07 16:13:52 +02002538
2539private function f_TC_attach_closed_add_vty(charstring id) runs on BSSGP_ConnHdlr {
2540
2541 f_TC_attach_closed_foreign(id);
2542 f_TC_attach_closed_imsi_added(id);
2543
2544}
2545
2546
Alexander Couzensf9858652018-06-07 16:14:53 +02002547testcase TC_attach_closed_add_vty() runs on test_CT {
2548 /* VTY-> SGSN: policy close
2549 * MS -> SGSN: Attach Request
2550 * MS <- SGSN: Identity Request IMSI
2551 * MS -> SGSN: Identity Response IMSI
2552 * MS <- SGSN: Attach Reject
2553 * VTY-> SGSN: policy imsi-acl add IMSI
2554 * MS -> SGSN: Attach Request
2555 * MS <- SGSN: Identity Request IMSI
2556 * MS -> SGSN: Identity Response IMSI
2557 * MS <- SGSN: Identity Request IMEI
2558 * MS -> SGSN: Identity Response IMEI
2559 * MS <- SGSN: Attach Accept
2560 */
2561 var BSSGP_ConnHdlr vc_conn;
2562 f_init();
2563 f_sleep(1.0);
2564 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
2565 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
Alexander Couzens03d12242018-08-07 16:13:52 +02002566 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456700");
2567 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456700");
Alexander Couzensf9858652018-06-07 16:14:53 +02002568 /* test with foreign IMSI: Must Reject */
Alexander Couzens03d12242018-08-07 16:13:52 +02002569 vc_conn := f_start_handler(refers(f_TC_attach_closed_add_vty), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02002570 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002571 f_cleanup();
Alexander Couzensf9858652018-06-07 16:14:53 +02002572}
2573
Alexander Couzens0085bd72018-06-12 19:08:44 +02002574/* Attempt an attach, but never answer a Attach Complete */
2575private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
2576 var integer count_req := 0;
2577
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002578 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 +02002579 f_gmm_auth();
Pau Espin Pedrol4b290a22019-09-10 19:49:41 +02002580 /* Expect SGSN to perform LU with HLR */
Vadim Yanitskiy24d22822023-06-27 19:01:26 +07002581 as_gmm_gsup_lu_isd();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002582
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002583 timer T := 10.0;
2584 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002585 alt {
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002586 [] T.timeout {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002587 /* break */
2588 }
Harald Welte955aa942019-05-03 01:29:29 +02002589 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002590 /* ignore */
2591 count_req := count_req + 1;
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002592 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002593 repeat;
2594 }
2595 }
2596 if (count_req != 5) {
2597 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02002598 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002599 }
2600 setverdict(pass);
2601}
2602
2603testcase TC_attach_check_complete_resend() runs on test_CT {
2604 /* MS -> SGSN: Attach Request IMSI
2605 * MS <- SGSN: Identity Request *
2606 * MS -> SGSN: Identity Response *
2607 * MS <- SGSN: Attach Complete 5x
2608 */
2609 var BSSGP_ConnHdlr vc_conn;
2610 f_init();
2611 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002612 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 +02002613 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002614 f_cleanup();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002615}
2616
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002617friend function f_routing_area_update(RoutingAreaIdentificationV ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02002618 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002619 var PDU_DTAP_PS_MT mt;
2620 var template OCT4 p_tmsi := omit;
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002621
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002622 if (is_iu(ran_index)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002623 p_tmsi := g_pars.p_tmsi;
2624 }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002625 /* then send RAU */
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002626 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 +02002627 alt {
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002628 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_ACCEPT) -> value l3_mt {
2629 f_process_rau_accept(l3_mt.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2630 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002631 setverdict(pass);
2632 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002633 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_ACCEPT)) -> value mt {
2634 f_process_rau_accept(mt.dtap.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2635 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5d56f522019-09-03 12:36:18 +02002636 setverdict(pass);
2637 }
2638
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002639 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_REJECT) {
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002640 setverdict(fail, "Unexpected RAU Reject");
2641 mtc.stop;
2642 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002643 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_REJECT)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002644 setverdict(fail, "Unexpected RAU Reject");
2645 mtc.stop;
2646 }
2647
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002648 [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 +02002649 key_sts := ?)) {
2650 var IntegrityProtectionAlgorithm uia_chosen := 0; /* 0 = standard_UMTS_integrity_algorithm_UIA1 */
2651 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
Alexander Couzensed61ae82019-09-15 23:18:08 +02002652 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)))
Daniel Willmann1c116112020-01-22 17:48:31 +01002653 repeat;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002654 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002655 [is_gb(ran_index)] BSSGP[ran_index].receive { repeat; }
2656 [is_iu(ran_index)] BSSAP.receive { repeat; }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002657 }
2658}
2659
Alexander Couzensbfda9212018-07-31 03:17:33 +02002660private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbfda9212018-07-31 03:17:33 +02002661 /* first perform regular attach */
2662 f_TC_attach(id);
2663
2664 /* then send RAU */
2665 f_routing_area_update(g_pars.ra);
2666
2667 /* do another RAU */
2668 f_routing_area_update(g_pars.ra);
2669
2670 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2671}
2672
2673testcase TC_attach_rau_a_a() runs on test_CT {
2674 /* MS <-> SGSN: Successful Attach
2675 * MS -> SGSN: Routing Area Update Request
2676 * MS <- SGSN: Routing Area Update Accept
2677 * MS -> SGSN: Routing Area Update Request
2678 * MS <- SGSN: Routing Area Update Accept
2679 * MS -> SGSN: Detach (PowerOff)
2680 */
2681 var BSSGP_ConnHdlr vc_conn;
2682 f_init();
2683 f_sleep(1.0);
2684 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
2685 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002686 f_cleanup();
Alexander Couzensbfda9212018-07-31 03:17:33 +02002687}
2688
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002689private function f_TC_attach_rau_a_b(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002690 f_TC_attach(id);
2691
2692 log("attach complete sending rau");
2693 f_routing_area_update(g_pars.ra, 0);
2694
2695 log("rau complete unregistering");
2696 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte5339b2e2020-10-04 22:52:56 +02002697 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002698
2699 log("sending second RAU via different RA");
2700 f_routing_area_update(f_cellid_to_RAI(g_pars.bssgp_cell_id[1]), 1);
2701
2702 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true, 1);
2703}
2704
2705testcase TC_attach_rau_a_b() runs on test_CT {
2706 /* MS <-> SGSN: Successful Attach
2707 * MS -> SGSN: Routing Area _a_ Update Request
2708 * MS <- SGSN: Routing Area _a_ Update Accept
2709 * MS -> SGSN: Routing Area _b_ Update Request
2710 * MS <- SGSN: Routing Area _b_ Update Accept
2711 * MS -> SGSN: Detach (PowerOff)
2712 */
2713 var BSSGP_ConnHdlr vc_conn;
2714 f_init();
2715 f_sleep(1.0);
2716 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_b), testcasename(), g_gb, 38);
2717 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002718 f_cleanup();
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002719}
2720
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002721private function f_TC_attach_gmm_attach_req_while_gmm_attach(charstring id) runs on BSSGP_ConnHdlr {
2722 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002723 var MobileIdentityLV mi;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002724 var RoutingAreaIdentificationV rand_rai := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002725 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002726
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002727 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002728
2729 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002730 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002731 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2732 mtc.stop;
2733 }
Harald Welte955aa942019-05-03 01:29:29 +02002734 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002735 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002736 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002737 repeat;
2738 }
Harald Welte955aa942019-05-03 01:29:29 +02002739 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002740 /* send out a second GMM_Attach Request.
2741 * If the SGSN follows the rules, this 2nd ATTACH REQ should be ignored, because
2742 * of the same content */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002743 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002744 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002745 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002746 }
2747 }
2748 f_sleep(1.0);
2749
2750 /* we've sent already a IMEI answer, we should NOT asked again for IMEI */
2751 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002752 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002753 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002754 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002755 repeat;
2756 }
Harald Welte955aa942019-05-03 01:29:29 +02002757 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002758 setverdict(fail, "Unexpected GMM ID REQ (IMEI).");
2759 mtc.stop;
2760 }
Harald Welte955aa942019-05-03 01:29:29 +02002761 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002762 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2763 mtc.stop;
2764 }
Harald Welte955aa942019-05-03 01:29:29 +02002765 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2766 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002767 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002768 setverdict(pass);
2769 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
2770 }
2771 }
2772}
2773
2774testcase TC_attach_gmm_attach_req_while_gmm_attach() runs on test_CT {
2775 /* Testing if the SGSN ignore Attach Request with the exact same content */
2776 /* MS -> SGSN: Attach Request IMSI
2777 * MS <- SGSN: Identity Request IMSI (optional)
2778 * MS -> SGSN: Identity Response IMSI (optional)
2779 * MS <- SGSN: Identity Request IMEI
2780 * MS -> SGSN: Attach Request (2nd)
2781 * MS <- SGSN: Identity Response IMEI
2782 * MS <- SGSN: Attach Accept
2783 * MS -> SGSN: Attach Complete
2784 */
2785 var BSSGP_ConnHdlr vc_conn;
2786 f_init();
2787 f_sleep(1.0);
2788 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
2789 vc_conn := f_start_handler(refers(f_TC_attach_gmm_attach_req_while_gmm_attach), testcasename(), g_gb, 39);
2790 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002791 f_cleanup();
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002792}
2793
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002794private function f_TC_attach_usim_resync(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002795 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2796
2797 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2798
2799 /* send Attach Request */
2800 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2801 * 3G auth vectors */
2802 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2803 /* The thing is, if the solSACapability is 'omit', then the
2804 * revisionLevelIndicatior is at the wrong place! */
2805 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002806 f_send_l3(attach_req);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002807
2808 /* do the auth */
2809 var PDU_L3_MS_SGSN l3_mo;
2810 var PDU_L3_SGSN_MS l3_mt;
2811 var default di := activate(as_mm_identity());
2812
2813 var GSUP_IE auth_tuple;
2814 var template AuthenticationParameterAUTNTLV autn;
2815
2816 g_pars.vec := f_gen_auth_vec_3g();
2817 autn := {
2818 elementIdentifier := '28'O,
2819 lengthIndicator := lengthof(g_pars.vec.autn),
2820 autnValue := g_pars.vec.autn
2821 };
2822 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2823 g_pars.vec.sres,
2824 g_pars.vec.kc,
2825 g_pars.vec.ik,
2826 g_pars.vec.ck,
2827 g_pars.vec.autn,
2828 g_pars.vec.res));
2829 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2830 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2831 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2832
2833 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2834 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002835 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002836
2837 /* send the gmm auth failure with resync IE */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002838 f_send_l3(ts_GMM_AUTH_FAIL_UMTS_AKA_RESYNC(g_pars.vec.auts));
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002839
2840 /* wait for the GSUP resync request */
2841 GSUP.receive(tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
2842 g_pars.imsi,
2843 g_pars.vec.auts,
2844 g_pars.vec.rand));
2845
2846 /* generate new key material */
2847 g_pars.vec := f_gen_auth_vec_3g();
2848 autn := {
2849 elementIdentifier := '28'O,
2850 lengthIndicator := lengthof(g_pars.vec.autn),
2851 autnValue := g_pars.vec.autn
2852 };
2853
2854 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2855 g_pars.vec.sres,
2856 g_pars.vec.kc,
2857 g_pars.vec.ik,
2858 g_pars.vec.ck,
2859 g_pars.vec.autn,
2860 g_pars.vec.res));
2861 /* send new key material */
2862 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2863
2864 /* wait for the new Auth Request */
2865 auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2866 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002867 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002868 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
2869 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2870 auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2871 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
2872 valueField := substr(g_pars.vec.res, 0, 4)
2873 };
2874 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
2875 elementIdentifier := '21'O,
2876 lengthIndicator := lengthof(g_pars.vec.res) - 4,
2877 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
2878 };
2879 l3_mo := valueof(auth_ciph_resp);
2880 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
2881 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
2882 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
2883 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
2884 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002885 f_send_l3(l3_mo);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002886 deactivate(di);
2887
2888 /* Expect SGSN to perform LU with HLR */
Vadim Yanitskiy24d22822023-06-27 19:01:26 +07002889 as_gmm_gsup_lu_isd();
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002890
Harald Welte955aa942019-05-03 01:29:29 +02002891 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2892 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002893 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002894 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002895 setverdict(pass);
2896}
2897
2898testcase TC_attach_usim_resync() runs on test_CT {
2899 /* MS -> SGSN: Attach Request
2900 * MS <- SGSN: Identity Request IMSI
2901 * MS -> SGSN: Identity Response IMSI
2902 * MS <- SGSN: Identity Request IMEI
2903 * MS -> SGSN: Identity Response IMEI
2904 * HLR<- SGSN: SAI Request
2905 * HLR-> SGSN: SAI Response
2906 * MS <- SGSN: Auth Request
2907 * MS -> SGSN: Auth Failure (with AUTS)
2908 * HLR<- SGSN: SAI Request (with AUTS & RAND)
2909 * HLR-> SGSN: SAI Response (new key material)
2910 * MS <- SGSN: Auth Request (new key material)
2911 * MS -> SGSN: Auth Response
2912 * MS <- SGSN: Attach Accept
2913 * MS -> SGSN: Attach Complete
2914 */
2915 var BSSGP_ConnHdlr vc_conn;
2916 f_init();
2917 f_sleep(1.0);
2918 vc_conn := f_start_handler(refers(f_TC_attach_usim_resync), testcasename(), g_gb, 40);
2919 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002920 f_cleanup();
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002921}
2922
Eric Wildc555be52021-05-15 19:48:22 +02002923private function f_TC_attach_usim_crypt(OCT1 netcap_a2345, BIT3 auth_req_ciph) runs on BSSGP_ConnHdlr {
2924 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2925
2926 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2927 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.spare_octets := netcap_a2345; /* GEA2345... */
2928
2929 /* send Attach Request */
2930 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2931 * 3G auth vectors */
2932 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2933 /* The thing is, if the solSACapability is 'omit', then the
2934 * revisionLevelIndicatior is at the wrong place! */
2935 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
2936 f_send_l3(attach_req);
2937
2938 /* do the auth */
2939 var PDU_L3_MS_SGSN l3_mo;
2940 var PDU_L3_SGSN_MS l3_mt;
2941 var default di := activate(as_mm_identity());
2942
2943 var GSUP_IE auth_tuple;
2944 var template AuthenticationParameterAUTNTLV autn;
2945
2946 g_pars.vec := f_gen_auth_vec_3g();
2947 autn := {
2948 elementIdentifier := '28'O,
2949 lengthIndicator := lengthof(g_pars.vec.autn),
2950 autnValue := g_pars.vec.autn
2951 };
2952 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2953 g_pars.vec.sres,
2954 g_pars.vec.kc,
2955 g_pars.vec.ik,
2956 g_pars.vec.ck,
2957 g_pars.vec.autn,
2958 g_pars.vec.res));
2959 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2960 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2961 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2962
2963 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand, auth_req_ciph);
2964 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
2965 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
2966
2967 setverdict(pass);
2968 deactivate(di);
2969}
2970
2971private function f_TC_attach_usim_a54_a54(charstring id) runs on BSSGP_ConnHdlr {
2972 f_TC_attach_usim_crypt('10'O, '100'B);
2973}
2974
2975private function f_TC_attach_usim_a54_a53(charstring id) runs on BSSGP_ConnHdlr {
2976 f_TC_attach_usim_crypt('20'O, '011'B);
2977}
2978
2979private function f_TC_attach_usim_a53_a54(charstring id) runs on BSSGP_ConnHdlr {
2980 f_TC_attach_usim_crypt('30'O, '011'B);
2981}
2982
2983private function f_TC_attach_usim_a50_a54(charstring id) runs on BSSGP_ConnHdlr {
2984 f_TC_attach_usim_crypt('30'O, '000'B);
2985}
2986
2987private function f_TC_attach_usim_a54_a50(charstring id) runs on BSSGP_ConnHdlr {
2988 f_TC_attach_usim_crypt('00'O, '000'B);
2989}
2990
2991testcase TC_attach_usim_a54_a54() runs on test_CT {
2992 var BSSGP_ConnHdlr vc_conn;
2993 f_init();
2994 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002995 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02002996 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a54), testcasename(), g_gb, 40);
2997 vc_conn.done;
2998 f_cleanup();
2999}
3000
3001testcase TC_attach_usim_a54_a53() runs on test_CT {
3002 var BSSGP_ConnHdlr vc_conn;
3003 f_init();
3004 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02003005 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02003006 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a53), testcasename(), g_gb, 40);
3007 vc_conn.done;
3008 f_cleanup();
3009}
3010
3011testcase TC_attach_usim_a53_a54() runs on test_CT {
3012 var BSSGP_ConnHdlr vc_conn;
3013 f_init();
3014 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02003015 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3");
Eric Wildc555be52021-05-15 19:48:22 +02003016 vc_conn := f_start_handler(refers(f_TC_attach_usim_a53_a54), testcasename(), g_gb, 40);
3017 vc_conn.done;
3018 f_cleanup();
3019}
3020
3021testcase TC_attach_usim_a50_a54() runs on test_CT {
3022 var BSSGP_ConnHdlr vc_conn;
3023 f_init();
3024 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02003025 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0");
Eric Wildc555be52021-05-15 19:48:22 +02003026 vc_conn := f_start_handler(refers(f_TC_attach_usim_a50_a54), testcasename(), g_gb, 40);
3027 vc_conn.done;
3028 f_cleanup();
3029}
3030
3031testcase TC_attach_usim_a54_a50() runs on test_CT {
3032 var BSSGP_ConnHdlr vc_conn;
3033 f_init();
3034 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02003035 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02003036 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a50), testcasename(), g_gb, 40);
3037 vc_conn.done;
3038 f_cleanup();
3039}
Harald Weltea05b8072019-04-23 22:35:05 +02003040
3041/* Send LLC NULL to see if the SGSN survives it (OS#3952) */
3042private function f_TC_llc_null(charstring id) runs on BSSGP_ConnHdlr {
3043 f_gmm_attach(false, false);
3044 f_sleep(1.0);
3045 f_send_llc(ts_LLC_NULL('0'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
3046 /* try to detach to check if SGSN is still alive */
3047 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
3048}
3049testcase TC_llc_null() runs on test_CT {
3050 var BSSGP_ConnHdlr vc_conn;
3051 f_init();
3052 f_sleep(1.0);
3053 vc_conn := f_start_handler(refers(f_TC_llc_null), testcasename(), g_gb, 41);
3054 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003055 f_cleanup();
Harald Weltea05b8072019-04-23 22:35:05 +02003056}
3057
Harald Welte645a1512019-04-23 23:18:23 +02003058/* Send LLC SABM to see if the SGSN rejects it properly with DM */
3059private function f_TC_llc_sabm_dm_llgmm(charstring id) runs on BSSGP_ConnHdlr {
3060 f_gmm_attach(false, false);
3061 f_sleep(1.0);
3062 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02003063 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LLGMM, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02003064 setverdict(pass);
3065}
3066testcase TC_llc_sabm_dm_llgmm() runs on test_CT {
3067 var BSSGP_ConnHdlr vc_conn;
3068 f_init();
3069 f_sleep(1.0);
3070 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_llgmm), testcasename(), g_gb, 42);
3071 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003072 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02003073}
3074
3075/* Send LLC SABM to see if the SGSN rejects it properly with DM */
3076private function f_TC_llc_sabm_dm_ll5(charstring id) runs on BSSGP_ConnHdlr {
3077 f_gmm_attach(false, false);
3078 f_sleep(1.0);
3079 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LL5, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02003080 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LL5, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02003081 setverdict(pass);
3082}
3083testcase TC_llc_sabm_dm_ll5() runs on test_CT {
3084 var BSSGP_ConnHdlr vc_conn;
3085 f_init();
3086 f_sleep(1.0);
3087 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_ll5), testcasename(), g_gb, 43);
3088 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003089 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02003090}
3091
Harald Welte2aaac1b2019-05-02 10:02:53 +02003092/* test XID handshake with empty L3 info: expect empty return (some phones require that, OS#3426 */
3093private function f_TC_xid_empty_l3(charstring id) runs on BSSGP_ConnHdlr {
3094 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3095 var template (value) XID_Information xid;
3096 var template XID_Information xid_rx;
3097
3098 /* first perform regular attach */
3099 f_TC_attach(id);
3100 /* then activate PDP context */
3101 f_pdp_ctx_act(apars);
3102
3103 /* start MO XID */
3104 xid := { ts_XID_L3(''O) };
3105 xid_rx := { tr_XID_L3(''O) };
3106 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
3107 alt {
Harald Welte955aa942019-05-03 01:29:29 +02003108 [] BSSGP[0].receive(tr_LLC_XID(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02003109 [] as_xid(apars);
3110 }
3111 setverdict(pass);
3112}
3113testcase TC_xid_empty_l3() runs on test_CT {
3114 var BSSGP_ConnHdlr vc_conn;
3115 f_init();
3116 f_sleep(1.0);
3117 vc_conn := f_start_handler(refers(f_TC_xid_empty_l3), testcasename(), g_gb, 44);
3118 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003119 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02003120}
3121
3122private function f_TC_xid_n201u(charstring id) runs on BSSGP_ConnHdlr {
3123 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3124 var template (value) XID_Information xid;
3125 var template XID_Information xid_rx;
3126
3127 /* first perform regular attach */
3128 f_TC_attach(id);
3129 /* then activate PDP context */
3130 f_pdp_ctx_act(apars);
3131
3132 /* start MO XID */
3133 xid := { ts_XID_N201U(1234) };
3134 xid_rx := { tr_XID_N201U(1234) };
3135 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
3136 alt {
Harald Welte955aa942019-05-03 01:29:29 +02003137 [] BSSGP[0].receive(tr_LLC_XID_MT_RSP(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02003138 [] as_xid(apars);
3139 }
3140 setverdict(pass);
3141}
3142testcase TC_xid_n201u() runs on test_CT {
3143 var BSSGP_ConnHdlr vc_conn;
3144 f_init();
3145 f_sleep(1.0);
3146 vc_conn := f_start_handler(refers(f_TC_xid_n201u), testcasename(), g_gb, 45);
3147 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003148 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02003149}
3150
Alexander Couzens6bee0872019-05-11 01:48:50 +02003151private function f_TC_attach_pdp_act_gmm_detach(charstring id) runs on BSSGP_ConnHdlr {
3152 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3153
3154 /* first perform regular attach */
3155 f_TC_attach(id);
3156 /* then activate PDP context */
3157 f_pdp_ctx_act(apars);
3158 /* do a normal detach */
3159 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
3160}
3161
3162testcase TC_attach_pdp_act_gmm_detach() runs on test_CT {
3163 /* MS -> SGSN: Attach Request
3164 * MS <-> SGSN: [..]
3165 * MS -> SGSN: Attach Complete
3166 * MS -> SGSN: PDP Activate Request
3167 * MS <- SGSN: PDP Activate Accept
3168 * MS -> SGSN: GMM Detach Request
3169 * MS <- SGSN: GMM Detach Accept
3170 */
3171 var BSSGP_ConnHdlr vc_conn;
3172 f_init();
3173 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_gmm_detach), testcasename(), g_gb, 26);
3174 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003175 f_cleanup();
Alexander Couzens6bee0872019-05-11 01:48:50 +02003176}
Harald Welte645a1512019-04-23 23:18:23 +02003177
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003178private function f_TC_attach_req_id_req_ra_update(charstring id) runs on BSSGP_ConnHdlr {
3179 var RoutingAreaIdentificationV old_ra := f_random_RAI();
3180 var RoutingAreaIdentificationV new_ra := f_random_RAI();
3181 while (old_ra == new_ra) { new_ra := f_random_RAI(); };
3182 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
3183 var PDU_L3_SGSN_MS l3_mt;
3184
3185 f_send_l3(attach_req, 0);
3186
3187 BSSGP[0].receive(tr_GMM_ID_REQ(?));
3188
3189 f_send_l3(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, new_ra, false, omit, omit));
3190 alt {
3191 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) {
3192 setverdict(pass);
3193 }
3194 [] BSSGP[0].receive { repeat; }
3195 }
3196}
3197
3198/* This test triggers crash in osmo-sgsn before osmo-sgsn.git I64fa5cf1b427d3abb99e553e584897261a827ce6.
3199 * See OS#3957 and OS#4245 for more information.
3200 */
3201testcase TC_attach_req_id_req_ra_update() runs on test_CT {
3202 /*
3203 * MS --> SGSN: Attach Req (TMSI, RAI=901-70-356-101)
3204 * MS <-- SGSN: Identity Request (IMEI)
3205 * MS --> SGSN: RA Updating (RAI=901-70-2758-208)
3206 */
3207 var BSSGP_ConnHdlr vc_conn;
3208 f_init();
3209 vc_conn := f_start_handler(refers(f_TC_attach_req_id_req_ra_update), testcasename(), g_gb, 47);
3210 vc_conn.done;
3211 f_cleanup();
3212}
3213
Harald Welte8e5932e2020-06-17 22:12:54 +02003214private altstep as_nopaging_ps(integer ran_idx := 0) runs on BSSGP_ConnHdlr {
3215var PDU_BSSGP rx;
3216[] BSSGP_SIG[ran_idx].receive(tr_BSSGP_PS_PAGING(?)) -> value rx {
3217 setverdict(fail, "Received unexpected PS PAGING: ", rx);
3218 mtc.stop;
3219 }
3220}
3221
3222/* SUSPEND, then DL traffic: should not pass + no paging expected */
3223private function f_TC_suspend_nopaging(charstring id) runs on BSSGP_ConnHdlr {
3224 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3225 var default d;
3226
3227 /* first perform regular attach */
3228 f_TC_attach(id);
3229 /* then activate PDP context */
3230 f_pdp_ctx_act(apars);
3231 /* then transceive a downlink PDU */
3232 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3233
3234 /* now suspend GPRS */
3235 f_bssgp_suspend();
3236
3237 d := activate(as_nopaging_ps());
3238
3239 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3240 * nor any related paging requests */
3241 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3242
3243 deactivate(d);
3244}
3245testcase TC_suspend_nopaging() runs on test_CT {
3246 var BSSGP_ConnHdlr vc_conn;
3247 f_init();
3248 f_sleep(1.0);
3249 vc_conn := f_start_handler(refers(f_TC_suspend_nopaging), testcasename(), g_gb, 48);
3250 vc_conn.done;
3251 f_cleanup();
3252}
3253
3254
3255/* SUSPEND, then RESUME: data expected to flow after explicit resume */
3256private function f_TC_suspend_resume(charstring id) runs on BSSGP_ConnHdlr {
3257 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3258 var OCT1 susp_ref;
3259 var default d;
3260
3261 /* first perform regular attach */
3262 f_TC_attach(id);
3263 /* then activate PDP context */
3264 f_pdp_ctx_act(apars);
3265 /* then transceive a downlink PDU */
3266 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3267
3268 /* now suspend GPRS */
3269 susp_ref := f_bssgp_suspend();
3270
3271 d := activate(as_nopaging_ps());
3272
3273 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3274 * nor any related paging requests */
3275 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3276
3277 deactivate(d);
3278
3279 /* resume GPRS */
3280 f_bssgp_resume(susp_ref);
3281
3282 /* now data should be flowing again */
3283 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3284}
3285testcase TC_suspend_resume() runs on test_CT {
3286 var BSSGP_ConnHdlr vc_conn;
3287 f_init();
3288 f_sleep(1.0);
3289 vc_conn := f_start_handler(refers(f_TC_suspend_resume), testcasename(), g_gb, 49);
3290 vc_conn.done;
3291 f_cleanup();
3292}
3293
3294/* SUSPEND, then RAU: data expected to flow after implicit resume */
3295private function f_TC_suspend_rau(charstring id) runs on BSSGP_ConnHdlr {
3296 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3297 var default d;
3298
3299 /* first perform regular attach */
3300 f_TC_attach(id);
3301 /* then activate PDP context */
3302 f_pdp_ctx_act(apars);
3303 /* then transceive a downlink PDU */
3304 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3305
3306 /* now suspend GPRS */
3307 f_bssgp_suspend();
3308
3309 d := activate(as_nopaging_ps());
3310
3311 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3312 * nor any related paging requests */
3313 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3314
3315 deactivate(d);
3316
3317 /* perform RAU (implicit RESUME) */
3318 f_routing_area_update(g_pars.ra);
3319
Harald Welted5836dc2021-03-20 15:40:00 +01003320 /* give SGSN some time to actually receve + process the RAU Complete we sent */
3321 f_sleep(0.5);
3322
Harald Welte8e5932e2020-06-17 22:12:54 +02003323 /* now data should be flowing again */
3324 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3325
3326}
3327testcase TC_suspend_rau() runs on test_CT {
3328 var BSSGP_ConnHdlr vc_conn;
3329 f_init();
3330 f_sleep(1.0);
3331 vc_conn := f_start_handler(refers(f_TC_suspend_rau), testcasename(), g_gb, 50);
3332 vc_conn.done;
3333 f_cleanup();
3334}
3335
3336
3337/* wait for T3314 expiration and check that PS PAGING is created on DL PDU */
3338private function f_TC_paging_ps(charstring id) runs on BSSGP_ConnHdlr {
3339 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3340 var default d;
3341
3342 /* first perform regular attach */
3343 f_TC_attach(id);
3344 /* then activate PDP context */
3345 f_pdp_ctx_act(apars);
3346 /* then transceive a downlink PDU */
3347 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3348
3349 /* now wait for T3314 expiration (test_CT below has reduced it to 3s) */
3350 f_sleep(5.0);
3351
3352 /* now data should be flowing again, but with PS PAGING */
3353 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3354 BSSGP_SIG[0].receive(tr_BSSGP_PS_PAGING(?));
3355
3356 /* FIXME: simulate paging response */
3357 /* FIXME: verify PDU actually arrives only after paging response was successful */
3358
3359}
3360testcase TC_paging_ps() runs on test_CT {
3361 var BSSGP_ConnHdlr vc_conn;
3362 f_init();
3363 f_vty_config(SGSNVTY, "sgsn", "timer 3314 3");
3364 f_sleep(1.0);
3365 vc_conn := f_start_handler(refers(f_TC_paging_ps), testcasename(), g_gb, 51);
3366 vc_conn.done;
3367 f_vty_config(SGSNVTY, "sgsn", "timer 3314 default");
3368 f_cleanup();
3369}
3370
Philipp Maier7df55e02020-12-14 23:46:04 +01003371/* Run a RIM single report procedure over the sgsn. Since the SGSN will only do a transparent routing of the
3372 * RIM messages this basically tests if the message is correctly transfered from one GB interface to the
3373 * other and vice versa. */
3374testcase TC_bssgp_rim_single_report() runs on test_CT {
3375 var BSSGP_ConnHdlr vc_conn;
3376 f_init();
Philipp Maier7df55e02020-12-14 23:46:04 +01003377
3378 timer T := 2.0;
3379
3380 var template RIM_Routing_Address dst_addr;
3381 var template RIM_Routing_Address src_addr;
3382 var template RAN_Information_Request_RIM_Container req_cont;
3383 var template RAN_Information_RIM_Container res_cont;
3384 var template PDU_BSSGP bssgp_rim_pdu;
3385 var template PDU_BSSGP bssgp_rim_pdu_expect;
3386
3387 dst_addr := t_RIM_Routing_Address_cid(g_gb[1].cfg.bvc[0].cell_id);
3388 src_addr := t_RIM_Routing_Address_cid(g_gb[0].cfg.bvc[0].cell_id);
Harald Welte8e5932e2020-06-17 22:12:54 +02003389
3390
Philipp Maier7df55e02020-12-14 23:46:04 +01003391 /* Send NACC Ran information request to SGSN at GB interface #0. We epect the SGSN to forward this request
3392 * based on the cell id in dst_addr to GB interface #1. */
3393 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3394 ts_RIM_Sequence_Number(1),
3395 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3396 ts_RIM_Protocol_Version_Number(1),
3397 tsu_RAN_Information_Request_Application_Container_NACC(g_gb[1].cfg.bvc[0].cell_id),
3398 omit);
3399 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3400 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3401 req_cont);
3402 bssgp_rim_pdu_expect := tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3403 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3404 tr_RAN_Information_Request_RIM_Container);
3405 RIM[0].send(bssgp_rim_pdu);
3406 T.start;
3407 alt {
Vadim Yanitskiy418e8062021-02-28 16:27:12 +01003408 [] RIM[1].receive(bssgp_rim_pdu_expect) {
3409 setverdict(pass);
3410 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003411 [] RIM[1].receive {
3412 setverdict(fail, "Unexpected BSSGP RIM PDU received");
Philipp Maier7df55e02020-12-14 23:46:04 +01003413 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003414 [] T.timeout {
3415 setverdict(fail, "No BSSGP RIM PDU received");
3416 mtc.stop;
Philipp Maier7df55e02020-12-14 23:46:04 +01003417 }
3418 }
Harald Welte8e5932e2020-06-17 22:12:54 +02003419
Philipp Maier7df55e02020-12-14 23:46:04 +01003420 /* Now also emulate also the response as well and send it back on GB interface #1. Expect the result on
3421 * GB interface #0 */
Philipp Maier7df55e02020-12-14 23:46:04 +01003422 res_cont := ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3423 ts_RIM_Sequence_Number(2),
3424 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3425 ts_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003426 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 +01003427 omit);
3428 bssgp_rim_pdu := ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3429 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3430 res_cont);
3431 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3432 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3433 ?);
3434 RIM[1].send(bssgp_rim_pdu);
3435 T.start;
3436 alt {
Vadim Yanitskiy418e8062021-02-28 16:27:12 +01003437 [] RIM[0].receive(bssgp_rim_pdu_expect) {
3438 setverdict(pass);
3439 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003440 [] RIM[0].receive {
3441 setverdict(fail, "Unexpected BSSGP RIM PDU received");
Philipp Maier7df55e02020-12-14 23:46:04 +01003442 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003443 [] T.timeout {
3444 setverdict(fail, "No BSSGP RIM PDU received");
3445 mtc.stop;
Philipp Maier7df55e02020-12-14 23:46:04 +01003446 }
3447 }
3448
3449 f_cleanup();
3450}
Harald Welte8e5932e2020-06-17 22:12:54 +02003451
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003452testcase TC_rim_eutran_to_geran() runs on test_CT {
3453 var BSSGP_ConnHdlr vc_conn;
3454 f_init();
3455 /* connect RIM related port */
3456 connect(vc_GTP:CLIENT_DEFAULT, self:GTPC);
3457
3458 var GtpPeer peer := {
3459 connId := 1,
3460 remName := mp_sgsn_gtp_ip,
3461 remPort := GTP1C_PORT
3462 }
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003463 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 +02003464
3465 var template (value) RIM_Routing_Address_GTPC gtpc_dst_addr, gtpc_src_addr;
3466 var template (value) RAN_Information_Request_RIM_Container_GTPC gtpc_rim_req_cont;
3467 var template (value) PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC gtpc_bssgp_cont;
3468 var template (value) Gtp1cUnitdata gtpc_pdu;
3469
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003470 gtpc_dst_addr := t_GTPC_RIM_Routing_Address_cid(gtp_ci);
3471 gtpc_src_addr := t_GTPC_RIM_Routing_Address_enbid(gtp_ci, tac := 3, gnbid := '12345678123456'O);
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003472
3473 gtpc_rim_req_cont := ts_GTPC_RAN_Information_Request_RIM_Container(ts_GTPC_RIM_Application_Identity(RIM_APP_ID_NACC),
3474 ts_GTPC_RIM_Sequence_Number(1),
3475 ts_GTPC_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3476 ts_GTPC_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003477 tsu_GTPC_RAN_Information_Request_Application_Container_NACC(gtp_ci),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003478 omit);
3479 gtpc_bssgp_cont := ts_GTPC_RAN_Information_Request(ts_GTPC_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, gtpc_dst_addr),
3480 ts_GTPC_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, gtpc_src_addr),
3481 gtpc_rim_req_cont);
3482 gtpc_pdu := ts_GTPC_RANInfoRelay(peer, ts_RANTransparentContainer_RAN_INFO_REQ(gtpc_bssgp_cont));
3483 GTPC.send(gtpc_pdu);
3484
3485 var template RIM_Routing_Address bssgp_dst_addr, bssgp_src_addr;
3486 var template PDU_BSSGP bssgp_rim_pdu_expect;
3487 bssgp_dst_addr := t_RIM_Routing_Address_cid(g_gb[1].cfg.bvc[0].cell_id);
3488 bssgp_src_addr := t_RIM_Routing_Address_enbid(g_gb[1].cfg.bvc[0].cell_id, tac := 3, gnbid := '12345678123456'O);
3489 bssgp_rim_pdu_expect := tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bssgp_dst_addr),
3490 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, bssgp_src_addr),
3491 tr_RAN_Information_Request_RIM_Container);
3492 timer T := 2.0;
3493 T.start;
3494 alt {
3495 [] RIM[1].receive(bssgp_rim_pdu_expect) {
3496 setverdict(pass);
3497 T.stop;
3498 }
3499 [] RIM[1].receive {
3500 setverdict(fail, "Unexpected BSSGP RIM PDU received");
3501 }
3502 [] T.timeout {
3503 setverdict(fail, "No BSSGP RIM PDU received");
3504 mtc.stop;
3505 }
3506 }
3507
3508 /* Now also emulate also the response as well and send it back on GB
3509 interface #1. Expect the result on * GTPC */
3510 var template RAN_Information_RIM_Container res_cont;
3511 var template PDU_BSSGP bssgp_rim_pdu;
3512 res_cont := ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3513 ts_RIM_Sequence_Number(2),
3514 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3515 ts_RIM_Protocol_Version_Number(1),
3516 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(g_gb[1].cfg.bvc[0].cell_id, false, 3, si_default)),
3517 omit);
3518 bssgp_rim_pdu := ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, bssgp_src_addr),
3519 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bssgp_dst_addr),
3520 res_cont);
3521 RIM[1].send(bssgp_rim_pdu);
3522
3523 var template RAN_Information_RIM_Container_GTPC rim_cont;
3524 var template PDU_BSSGP_RAN_INFORMATION_GTPC gtpc_bssgp_cont_ack;
3525 var template Gtp1cUnitdata gtpc_pdu_exp;
3526 rim_cont := tr_GTPC_RAN_Information_RIM_Container(ts_GTPC_RIM_Application_Identity(RIM_APP_ID_NACC),
3527 ts_GTPC_RIM_Sequence_Number(2),
3528 ts_GTPC_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3529 ts_GTPC_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003530 tru_GTPC_ApplContainer_or_ApplErrContainer_NACC(tru_GTPC_ApplContainer_NACC(gtp_ci, false, 3, si_default)),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003531 omit);
3532 gtpc_bssgp_cont_ack := tr_GTPC_RAN_Information(tr_GTPC_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, gtpc_src_addr),
3533 tr_GTPC_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, gtpc_dst_addr),
3534 rim_cont);
3535 gtpc_pdu_exp := tr_GTPC_RANInfoRelay(peer, tr_RANTransparentContainer_RAN_INFO(gtpc_bssgp_cont_ack));
3536
3537 T.start;
3538 alt {
3539 [] GTPC.receive(gtpc_pdu_exp) {
3540 setverdict(pass);
3541 T.stop;
3542 }
3543 [] GTPC.receive {
3544 setverdict(fail, "Unexpected GTPC RIM PDU received");
3545 }
3546 [] T.timeout {
3547 setverdict(fail, "No GTPC RIM PDU received");
3548 mtc.stop;
3549 }
3550 }
3551
3552 f_cleanup();
3553}
3554
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01003555/* Test if the SGSN routes traffic to new cell after the MS attached to it */
3556private function f_TC_cell_change_different_rai_ci_attach(charstring id) runs on BSSGP_ConnHdlr {
3557 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3558
3559 /* first perform regular attach */
3560 f_gmm_attach(false, false, ran_index := 0);
3561 /* then activate PDP context */
3562 f_pdp_ctx_act(apars, ran_index := 0);
3563 /* then transceive a downlink PDU */
3564 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3565 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 0);
3566
3567 /* Now attach on different cell: */
3568 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3569 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3570 g_pars.net.expect_auth := false;
3571 f_gmm_attach(false, false, ran_index := 1, old_ra := f_cellid_to_RAI(g_pars.bssgp_cell_id[0]));
3572 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3573 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1, n_u := 1);
3574}
3575testcase TC_cell_change_different_rai_ci_attach() runs on test_CT {
3576 var BSSGP_ConnHdlr vc_conn;
3577 f_init();
3578 vc_conn := f_start_handler(refers(f_TC_cell_change_different_rai_ci_attach), testcasename(), g_gb, 68);
3579 vc_conn.done;
3580 f_cleanup();
3581}
3582
3583/* Test if the SGSN routes traffic to new cell after the MS attached to it */
3584/* Assumption: g_gb[1] and g_gb[2] configured with same RAC */
3585private function f_TC_cell_change_different_ci_attach(charstring id) runs on BSSGP_ConnHdlr {
3586 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3587
3588 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3589 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3590
3591 /* first perform regular attach */
3592 f_gmm_attach(false, false, ran_index := 1);
3593 /* then activate PDP context */
3594 f_pdp_ctx_act(apars, ran_index := 1);
3595 /* then transceive a downlink PDU */
3596 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3597 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1);
3598
3599 /* Now attach on different cell: */
3600 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3601 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[2]);
3602 g_pars.net.expect_auth := false;
3603 f_gmm_attach(false, false, ran_index := 2, old_ra := f_cellid_to_RAI(g_pars.bssgp_cell_id[1]));
3604 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 2);
3605 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 2, n_u := 1);
3606}
3607testcase TC_cell_change_different_ci_attach() runs on test_CT {
3608 var BSSGP_ConnHdlr vc_conn;
3609 f_init();
3610 vc_conn := f_start_handler(refers(f_TC_cell_change_different_ci_attach), testcasename(), g_gb, 69);
3611 vc_conn.done;
3612 f_cleanup();
3613}
3614
3615/* Test if the SGSN silently drops MO data message coming from new BVCI if RAC changed (eg. cell change) */
3616private function f_TC_cell_change_different_rai_ci_data(charstring id) runs on BSSGP_ConnHdlr {
3617 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3618
3619 /* first perform regular attach */
3620 f_gmm_attach(false, false, ran_index := 0);
3621 /* then activate PDP context */
3622 f_pdp_ctx_act(apars, ran_index := 0);
3623 /* then transceive a downlink PDU */
3624 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3625 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 0);
3626
3627 /* Send some data over new bvci, it should be silently discarded since
3628 * RAC changed and SGSN expects a RAU to occur in that case */
3629 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3630 var octetstring payload := f_rnd_octstring(200);
3631 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
3632 BSSGP[1].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 1));
3633 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
3634 timer T := 2.0;
3635 T.start;
3636 alt {
3637 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload)) {
3638 setverdict(fail, "Unexpected GTP message");
3639 }
3640 [] T.timeout { setverdict(pass); }
3641 }
3642
3643 /* Expect SGSN to continue routing DL data to last known NSEI+BVCI */
3644 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3645 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3646}
3647testcase TC_cell_change_different_rai_ci_data() runs on test_CT {
3648 var BSSGP_ConnHdlr vc_conn;
3649 f_init();
3650 vc_conn := f_start_handler(refers(f_TC_cell_change_different_rai_ci_data), testcasename(), g_gb, 70);
3651 vc_conn.done;
3652 f_cleanup();
3653}
3654
3655/* Test if the SGSN routes traffic to new cell after the MS switched cell without re-attaching */
3656/* Assumption: g_gb[1] and g_gb[2] configured with same RAC */
3657private function f_TC_cell_change_different_ci_data(charstring id) runs on BSSGP_ConnHdlr {
3658 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3659
3660 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3661 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3662
3663 /* first perform regular attach */
3664 f_gmm_attach(false, false, ran_index := 1);
3665 /* then activate PDP context */
3666 f_pdp_ctx_act(apars, ran_index := 1);
3667 /* then transceive a downlink PDU */
3668 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3669 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1);
3670
3671 /* Now attach on different cell: */
3672 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3673 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[2]);
3674
3675 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 2, n_u := 1);
3676 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 2);
3677}
3678testcase TC_cell_change_different_ci_data() runs on test_CT {
3679 var BSSGP_ConnHdlr vc_conn;
3680 f_init();
3681 vc_conn := f_start_handler(refers(f_TC_cell_change_different_ci_data), testcasename(), g_gb, 71);
3682 vc_conn.done;
3683 f_cleanup();
3684}
3685
Harald Welte5ac31492018-02-15 20:39:13 +01003686control {
Harald Welte5b7c8122018-02-16 21:48:17 +01003687 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01003688 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02003689 execute( TC_attach_umts_aka_umts_res() );
3690 execute( TC_attach_umts_aka_gsm_sres() );
arehbein3ede9e32023-02-06 21:02:53 +01003691 execute( TC_attach_timeout_after_pdp_act() );
Harald Welte5b7c8122018-02-16 21:48:17 +01003692 execute( TC_attach_auth_id_timeout() );
3693 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01003694 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01003695 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01003696 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01003697 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01003698 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01003699 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02003700 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02003701 execute( TC_attach_no_imsi_response() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02003702 execute( TC_attach_closed_add_vty(), 20.0 );
3703 execute( TC_attach_check_subscriber_list(), 20.0 );
3704 execute( TC_attach_detach_check_subscriber_list(), 20.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02003705 execute( TC_attach_check_complete_resend() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02003706 execute( TC_hlr_location_cancel_request_update(), 20.0 );
3707 execute( TC_hlr_location_cancel_request_withdraw(), 20.0 );
3708 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 20.0 );
3709 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 20.0 );
Harald Welte04683d02018-02-16 22:43:45 +01003710 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01003711 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02003712 execute( TC_attach_rau_a_a() );
Alexander Couzensbe837bd2018-07-31 04:20:11 +02003713 execute( TC_attach_rau_a_b() );
Alexander Couzens0c6324f2018-09-14 16:37:04 +02003714 execute( TC_attach_usim_resync() );
Eric Wildc555be52021-05-15 19:48:22 +02003715 execute( TC_attach_usim_a54_a54() );
3716 execute( TC_attach_usim_a54_a53() );
3717 execute( TC_attach_usim_a53_a54() );
3718 execute( TC_attach_usim_a50_a54() );
3719 execute( TC_attach_usim_a54_a50() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01003720 execute( TC_detach_unknown_nopoweroff() );
3721 execute( TC_detach_unknown_poweroff() );
3722 execute( TC_detach_nopoweroff() );
3723 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01003724 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01003725 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01003726 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01003727 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01003728 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01003729 execute( TC_attach_pdp_act_user_deact_mt() );
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02003730 execute( TC_attach_pdp_act_deact_dup() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02003731 execute( TC_attach_second_attempt() );
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02003732 execute( TC_attach_echo_timeout() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02003733 execute( TC_attach_restart_ctr_echo() );
3734 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02003735 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02003736 execute( TC_attach_pdp_act_deact_gtp_retrans() );
3737 execute( TC_attach_pdp_act_deact_gtp_retrans_resp() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02003738 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Alexander Couzens6bee0872019-05-11 01:48:50 +02003739 execute( TC_attach_pdp_act_gmm_detach() );
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02003740 execute( TC_attach_gmm_attach_req_while_gmm_attach() );
Harald Weltea05b8072019-04-23 22:35:05 +02003741
Harald Welte2aaac1b2019-05-02 10:02:53 +02003742 execute( TC_xid_empty_l3() );
3743 execute( TC_xid_n201u() );
3744
Harald Weltea05b8072019-04-23 22:35:05 +02003745 execute( TC_llc_null() );
Harald Welte645a1512019-04-23 23:18:23 +02003746 execute( TC_llc_sabm_dm_llgmm() );
3747 execute( TC_llc_sabm_dm_ll5() );
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003748
Harald Welte8e5932e2020-06-17 22:12:54 +02003749 execute( TC_suspend_nopaging() );
3750 execute( TC_suspend_resume() );
3751 execute( TC_suspend_rau() );
3752 execute( TC_paging_ps() );
3753
Philipp Maier7df55e02020-12-14 23:46:04 +01003754 execute( TC_bssgp_rim_single_report() );
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003755 execute( TC_rim_eutran_to_geran() );
Philipp Maier7df55e02020-12-14 23:46:04 +01003756
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01003757 execute( TC_cell_change_different_rai_ci_attach() );
3758 execute( TC_cell_change_different_rai_ci_data() );
3759 execute( TC_cell_change_different_ci_attach() );
3760 execute( TC_cell_change_different_ci_data() );
3761
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003762 /* At the end, may crash osmo-sgsn, see OS#3957, OS#4245 */
3763 execute( TC_attach_req_id_req_ra_update() );
Harald Welte5ac31492018-02-15 20:39:13 +01003764}
Harald Welte96a33b02018-02-04 10:36:22 +01003765
3766
3767
3768}