blob: 7cdf72c7224d5643df5d13bb0cc6d8f908e8d059 [file] [log] [blame]
Harald Welte96a33b02018-02-04 10:36:22 +01001module SGSN_Tests {
2
Harald Welte34b5a952019-05-27 11:54:11 +02003/* Osmocom SGSN test suite in TTCN-3
4 * (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
5 * (C) 2018-2019 sysmocom - s.f.m.c. GmbH
6 * All rights reserved.
7 *
8 * Released under the terms of GNU General Public License, Version 2 or
9 * (at your option) any later version.
10 *
11 * SPDX-License-Identifier: GPL-2.0-or-later
12 */
13
Harald Welte900d01a2019-08-13 13:27:51 +020014friend module SGSN_Tests_Iu;
Alexander Couzens8e1dfd02020-09-07 04:26:20 +020015friend module SGSN_Tests_NS;
Harald Welte900d01a2019-08-13 13:27:51 +020016
Harald Welte96a33b02018-02-04 10:36:22 +010017import from General_Types all;
18import from Osmocom_Types all;
Harald Welte557c9f82020-09-12 21:30:17 +020019import from GSM_Types all;
Harald Welte37692d82018-02-18 15:21:34 +010020import from Native_Functions all;
Harald Welte96a33b02018-02-04 10:36:22 +010021import from NS_Types all;
22import from NS_Emulation all;
23import from BSSGP_Types all;
24import from BSSGP_Emulation all;
Harald Welte5ac31492018-02-15 20:39:13 +010025import from Osmocom_Gb_Types all;
Harald Welte26fbb6e2019-04-14 17:32:46 +020026import from SCCPasp_Types all;
Harald Welte5ac31492018-02-15 20:39:13 +010027
28import from MobileL3_CommonIE_Types all;
29import from MobileL3_GMM_SM_Types all;
30import from MobileL3_Types all;
31import from L3_Templates all;
32import from L3_Common all;
33
34import from GSUP_Emulation all;
35import from GSUP_Types all;
36import from IPA_Emulation all;
37
Harald Welte26fbb6e2019-04-14 17:32:46 +020038import from RAN_Adapter all;
39import from RAN_Emulation all;
40import from RANAP_Templates all;
41import from RANAP_PDU_Descriptions all;
42import from RANAP_IEs all;
43
Harald Welteeded9ad2018-02-17 20:57:34 +010044import from GTP_Emulation all;
45import from GTP_Templates all;
46import from GTP_CodecPort all;
47import from GTPC_Types all;
48import from GTPU_Types all;
49
Harald Weltea2526a82018-02-18 19:03:36 +010050import from LLC_Types all;
51import from LLC_Templates all;
52
53import from SNDCP_Types all;
54
Harald Weltebd194722018-02-16 22:11:08 +010055import from TELNETasp_PortType all;
56import from Osmocom_VTY_Functions all;
57
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020058import from MobileL3_MM_Types all;
59
Harald Welteeded9ad2018-02-17 20:57:34 +010060
Harald Welte5ac31492018-02-15 20:39:13 +010061modulepar {
62 /* IP/port on which we run our internal GSUP/HLR emulation */
63 charstring mp_hlr_ip := "127.0.0.1";
64 integer mp_hlr_port := 4222;
Pau Espin Pedrol7bac69f2021-05-04 15:53:06 +020065 charstring mp_ggsn_ip := "127.0.0.103";
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +020066 integer mp_echo_interval := 5; /* in seconds. Only used in test enabling g_use_echo */
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +020067 charstring mp_sgsn_gtp_ip := "127.0.0.10";
Alexander Couzens2c12b242018-07-31 00:30:11 +020068
Alexander Couzensf3c1b412018-08-24 00:42:51 +020069 NSConfigurations mp_nsconfig := {
70 {
Harald Welte5e514fa2018-07-05 00:01:45 +020071 nsei := 96,
72 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +010073 handle_sns := false,
74 nsvc := {
75 {
76 provider := {
77 ip := {
78 address_family := AF_INET,
79 local_udp_port := 21010,
80 local_ip := "127.0.0.1",
81 remote_udp_port := 23000,
Harald Weltebe7afce2021-01-17 22:04:36 +010082 remote_ip := "127.0.0.1",
83 data_weight := 1,
84 signalling_weight := 1
Harald Welte90f19742020-11-06 19:34:40 +010085 }
86 },
87 nsvci := 97
88 }
89 }
Alexander Couzensf3c1b412018-08-24 00:42:51 +020090 },
91 {
Harald Welte5e514fa2018-07-05 00:01:45 +020092 nsei := 97,
93 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +010094 handle_sns := false,
95 nsvc := {
96 {
97 provider := {
98 ip := {
99 address_family := AF_INET,
100 local_udp_port := 21011,
101 local_ip := "127.0.0.1",
102 remote_udp_port := 23000,
Harald Weltebe7afce2021-01-17 22:04:36 +0100103 remote_ip := "127.0.0.1",
104 data_weight := 1,
105 signalling_weight := 1
Harald Welte90f19742020-11-06 19:34:40 +0100106 }
107 },
108 nsvci := 98
109 }
110 }
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200111 },
112 {
Harald Welte5e514fa2018-07-05 00:01:45 +0200113 nsei := 98,
114 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +0100115 handle_sns := false,
116 nsvc := {
117 {
118 provider := {
119 ip := {
120 address_family := AF_INET,
121 local_udp_port := 21012,
122 local_ip := "127.0.0.1",
123 remote_udp_port := 23000,
Harald Weltebe7afce2021-01-17 22:04:36 +0100124 remote_ip := "127.0.0.1",
125 data_weight := 1,
126 signalling_weight := 1
Harald Welte90f19742020-11-06 19:34:40 +0100127 }
128 },
129 nsvci := 99
130 }
131 }
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200132 }
Alexander Couzens2c12b242018-07-31 00:30:11 +0200133 };
Harald Welte26fbb6e2019-04-14 17:32:46 +0200134
135 RAN_Configurations mp_ranap_cfg := {
136 {
137 transport := RANAP_TRANSPORT_IuCS,
138 sccp_service_type := "mtp3_itu",
139 sctp_addr := { 23908, "127.0.0.1", 2905, "127.0.0.1" },
140 own_pc := 195,
141 own_ssn := 142,
142 peer_pc := 188, /* 0.23.4 */
143 peer_ssn := 142,
144 sio := '83'O,
145 rctx := 2
146 }
147 }
Harald Welte5ac31492018-02-15 20:39:13 +0100148};
149
Harald Welte5339b2e2020-10-04 22:52:56 +0200150const integer NUM_BVC_PER_NSE := 1;
Harald Welte5ac31492018-02-15 20:39:13 +0100151type record GbInstance {
152 NS_CT vc_NS,
153 BSSGP_CT vc_BSSGP,
Harald Welte5339b2e2020-10-04 22:52:56 +0200154 BSSGP_BVC_CT vc_BSSGP_BVC[NUM_BVC_PER_NSE],
Harald Welte5ac31492018-02-15 20:39:13 +0100155 BssgpConfig cfg
156};
Harald Welte96a33b02018-02-04 10:36:22 +0100157
Harald Welte2fa771f2019-05-02 20:13:53 +0200158const integer NUM_GB := 3;
159type record length(NUM_GB) of GbInstance GbInstances;
160type record length(NUM_GB) of NSConfiguration NSConfigurations;
161type record length(NUM_GB) of BssgpCellId BssgpCellIds;
Alexander Couzens51114d12018-07-31 18:41:56 +0200162
Harald Welte26fbb6e2019-04-14 17:32:46 +0200163const integer NUM_RNC := 1;
164type record of RAN_Configuration RAN_Configurations;
165
Harald Welte96a33b02018-02-04 10:36:22 +0100166type component test_CT {
Alexander Couzens51114d12018-07-31 18:41:56 +0200167 var GbInstances g_gb;
Harald Welte26fbb6e2019-04-14 17:32:46 +0200168 var RAN_Adapter g_ranap[NUM_RNC];
Alexander Couzens1552e792019-07-23 20:38:39 +0200169 var boolean g_ranap_enable := false;
Harald Welte96a33b02018-02-04 10:36:22 +0100170
Harald Welte5ac31492018-02-15 20:39:13 +0100171 var GSUP_Emulation_CT vc_GSUP;
172 var IPA_Emulation_CT vc_GSUP_IPA;
173 /* only to get events from IPA underneath GSUP */
174 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +0100175
Harald Welte5339b2e2020-10-04 22:52:56 +0200176 /* only needed at start to get the per-BVC references */
177 port BSSGP_CT_PROC_PT PROC;
178
Philipp Maier7df55e02020-12-14 23:46:04 +0100179 /* used by RIM related test */
180 port BSSGP_PT RIM[NUM_GB];
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +0200181 port GTPEM_PT GTPC;
Philipp Maier7df55e02020-12-14 23:46:04 +0100182
Harald Welteeded9ad2018-02-17 20:57:34 +0100183 var GTP_Emulation_CT vc_GTP;
184
Harald Weltebd194722018-02-16 22:11:08 +0100185 port TELNETasp_PT SGSNVTY;
186
Harald Welte96a33b02018-02-04 10:36:22 +0100187 var boolean g_initialized := false;
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200188 var boolean g_use_echo := false;
Harald Welte96a33b02018-02-04 10:36:22 +0100189};
190
Harald Welte26fbb6e2019-04-14 17:32:46 +0200191type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr, RAN_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100192 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +0100193 timer g_Tguard;
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200194 var LLC_Entities llc;
Harald Welte5ac31492018-02-15 20:39:13 +0100195}
196
197type record SGSN_ConnHdlrNetworkPars {
198 boolean expect_ptmsi,
199 boolean expect_auth,
200 boolean expect_ciph
201};
202
203type record BSSGP_ConnHdlrPars {
204 /* IMEI of the simulated ME */
205 hexstring imei,
Alexander Couzens8f0fb002018-05-02 19:30:55 +0200206 /* IMSI of the simulated MS */
Harald Welte5ac31492018-02-15 20:39:13 +0100207 hexstring imsi,
208 /* MSISDN of the simulated MS (probably unused) */
209 hexstring msisdn,
210 /* P-TMSI allocated to the simulated MS */
211 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +0100212 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100213 /* TLLI of the simulated MS */
214 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +0100215 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100216 RoutingAreaIdentificationV ra optional,
Alexander Couzens51114d12018-07-31 18:41:56 +0200217 BssgpCellIds bssgp_cell_id,
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200218 /* Tracks the RNC state. If true next L3 message will be sent with InitiualUe */
219 boolean rnc_send_initial_ue,
Harald Welte5ac31492018-02-15 20:39:13 +0100220 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +0100221 SGSN_ConnHdlrNetworkPars net,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200222 float t_guard,
223 /* only in IuPS / RANAP case */
Alexander Couzens1552e792019-07-23 20:38:39 +0200224 SCCP_PAR_Address sccp_addr_local optional,
225 SCCP_PAR_Address sccp_addr_peer optional
Harald Welte5ac31492018-02-15 20:39:13 +0100226};
227
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +0200228/* Passed in RAN-INFO message from emulated neighbor using RIM */
229const octetstring si1_default := '198fb100000000000000000000000000007900002b'O;
230const octetstring si3_default := '1b753000f110236ec9033c2747407900003c0b2b2b'O;
231const octetstring si13_default := '009000185a6fc9e08410ab2b2b2b2b2b2b2b2b2b2b'O;
232const octetstring si_default := si1_default & si3_default & si13_default;
233
Alexander Couzens89508702018-07-31 04:16:10 +0200234private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200235 /* mcc_mnc is encoded as of 24.008 10.5.5.15 */
Alexander Couzens89508702018-07-31 04:16:10 +0200236 var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;
237
238 var RoutingAreaIdentificationV ret := {
239 mccDigit1 := mcc_mnc[0],
240 mccDigit2 := mcc_mnc[1],
241 mccDigit3 := mcc_mnc[2],
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200242 mncDigit3 := mcc_mnc[3],
243 mncDigit1 := mcc_mnc[4],
244 mncDigit2 := mcc_mnc[5],
Pau Espin Pedroldeaaa902021-02-12 18:41:04 +0100245 lac := int2oct(cell_id.ra_id.lai.lac, 2),
246 rac := int2oct(cell_id.ra_id.rac, 1)
Alexander Couzens89508702018-07-31 04:16:10 +0200247 }
248 return ret;
249};
250
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +0100251private function f_BssgpCellId_to_GTP_CellId(in BssgpCellId cell_id) return GTP_CellId
252{
253 template (value) GTP_CellId ret := ts_GTP_CellId(cell_id.ra_id, cell_id.cell_id);
254 return valueof(ret);
255}
256
Alexander Couzens51114d12018-07-31 18:41:56 +0200257private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
Pau Espin Pedrol494e8b32022-02-22 16:46:23 +0100258 gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset)) alive;
259 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset)) alive;
Harald Welte5ac31492018-02-15 20:39:13 +0100260 /* connect lower end of BSSGP emulation with NS upper port */
261 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
Harald Welte5ac31492018-02-15 20:39:13 +0100262
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200263 gb.vc_NS.start(NSStart(mp_nsconfig[offset]));
Harald Welte5339b2e2020-10-04 22:52:56 +0200264 gb.vc_BSSGP.start(BssgpStart(gb.cfg, testcasename()));
265 /* resolve the per-BVC component references */
266 for (var integer i := 0; i < lengthof(gb.cfg.bvc); i := i+1) {
267 connect(self:PROC, gb.vc_BSSGP:PROC);
268 gb.vc_BSSGP_BVC[i] := f_bssgp_get_bvci_ct(gb.cfg.bvc[i].bvci, PROC);
269 disconnect(self:PROC, gb.vc_BSSGP:PROC);
270 }
Philipp Maier7df55e02020-12-14 23:46:04 +0100271 /* connect RIM related port */
272 connect(gb.vc_BSSGP:RIM, self:RIM[offset]);
Harald Welte5ac31492018-02-15 20:39:13 +0100273}
274
275private function f_init_gsup(charstring id) runs on test_CT {
276 id := id & "-GSUP";
277 var GsupOps ops := {
278 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
279 };
280
281 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
282 vc_GSUP := GSUP_Emulation_CT.create(id);
283
284 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
285 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
286 /* we use this hack to get events like ASP_IPA_EVENT_UP */
287 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
288
289 vc_GSUP.start(GSUP_Emulation.main(ops, id));
290 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
291
292 /* wait for incoming connection to GSUP port before proceeding */
293 timer T := 10.0;
294 T.start;
295 alt {
Vadim Yanitskiy61564be2020-05-18 20:44:14 +0700296 [] GSUP_IPA_EVENT.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP)) { }
Harald Welte5ac31492018-02-15 20:39:13 +0100297 [] T.timeout {
298 setverdict(fail, "No connection to GSUP Port");
Daniel Willmannafce8662018-07-06 23:11:32 +0200299 mtc.stop;
Harald Welte5ac31492018-02-15 20:39:13 +0100300 }
301 }
302}
303
Harald Welteeded9ad2018-02-17 20:57:34 +0100304private function f_init_gtp(charstring id) runs on test_CT {
305 id := id & "-GTP";
306
307 var GtpEmulationCfg gtp_cfg := {
308 gtpc_bind_ip := mp_ggsn_ip,
309 gtpc_bind_port := GTP1C_PORT,
310 gtpu_bind_ip := mp_ggsn_ip,
311 gtpu_bind_port := GTP1U_PORT,
312 sgsn_role := false
313 };
314
315 vc_GTP := GTP_Emulation_CT.create(id);
316 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
317}
318
Alexander Couzens8e1dfd02020-09-07 04:26:20 +0200319friend function f_init_vty() runs on test_CT {
Harald Weltebd194722018-02-16 22:11:08 +0100320 map(self:SGSNVTY, system:SGSNVTY);
321 f_vty_set_prompts(SGSNVTY);
322 f_vty_transceive(SGSNVTY, "enable");
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200323 f_vty_transceive(SGSNVTY, "reset sgsn state");
Harald Weltebd194722018-02-16 22:11:08 +0100324 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
325}
326
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200327private function f_vty_enable_echo_interval(boolean enable) runs on test_CT {
328 if (enable) {
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +0200329 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 echo-interval " & int2str(mp_echo_interval));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200330 } else {
331 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 no echo-interval");
332 }
333}
334
Harald Weltebd194722018-02-16 22:11:08 +0100335
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200336/* mcc_mnc is 24.008 10.5.5.15 encoded. 262 42 */
337function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
Harald Welte26fbb6e2019-04-14 17:32:46 +0200338 var integer i;
339
Harald Welte96a33b02018-02-04 10:36:22 +0100340 if (g_initialized == true) {
341 return;
342 }
343 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100344 g_gb[0].cfg := {
345 nsei := 96,
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200346 sgsn_role := false,
Harald Welte5339b2e2020-10-04 22:52:56 +0200347 bvc := {
348 {
349 bvci := 196,
350 cell_id := {
351 ra_id := {
352 lai := {
353 mcc_mnc := mcc_mnc,
354 lac := 13135
355 },
356 rac := 0
357 },
358 cell_id := 20960
359 },
Harald Welte4d112c92020-11-12 19:48:31 +0100360 depth := BSSGP_DECODE_DEPTH_L3,
361 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
Harald Welte5339b2e2020-10-04 22:52:56 +0200362 }
363 }
Harald Welte5ac31492018-02-15 20:39:13 +0100364 };
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200365 g_gb[1].cfg := {
366 nsei := 97,
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200367 sgsn_role := false,
Harald Welte5339b2e2020-10-04 22:52:56 +0200368 bvc := {
369 {
370 bvci := 210,
371 cell_id := {
372 ra_id := {
373 lai := {
374 mcc_mnc := mcc_mnc,
375 lac := 13200
376 },
377 rac := 0
378 },
379 cell_id := 20961
380 },
Harald Welte4d112c92020-11-12 19:48:31 +0100381 depth := BSSGP_DECODE_DEPTH_L3,
382 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
Harald Welte5339b2e2020-10-04 22:52:56 +0200383 }
384 }
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200385 };
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100386 g_gb[2].cfg := { /* [2] configured to have same RAC as [1] */
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200387 nsei := 98,
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200388 sgsn_role := false,
Harald Welte5339b2e2020-10-04 22:52:56 +0200389 bvc := {
390 {
391 bvci := 220,
392 cell_id := {
393 ra_id := {
394 lai := {
395 mcc_mnc := mcc_mnc,
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100396 lac := 13200
Harald Welte5339b2e2020-10-04 22:52:56 +0200397 },
398 rac := 0
399 },
400 cell_id := 20962
401 },
Harald Welte4d112c92020-11-12 19:48:31 +0100402 depth := BSSGP_DECODE_DEPTH_L3,
403 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
Harald Welte5339b2e2020-10-04 22:52:56 +0200404 }
405 }
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200406 };
Harald Welte96a33b02018-02-04 10:36:22 +0100407
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200408 f_init_vty();
Alexander Couzens51114d12018-07-31 18:41:56 +0200409 f_init_gb(g_gb[0], "SGSN_Test-Gb0", 0);
410 f_init_gb(g_gb[1], "SGSN_Test-Gb1", 1);
411 f_init_gb(g_gb[2], "SGSN_Test-Gb2", 2);
Harald Welte26fbb6e2019-04-14 17:32:46 +0200412
Alexander Couzens1552e792019-07-23 20:38:39 +0200413 if (g_ranap_enable) {
414 for (i := 0; i < NUM_RNC; i := i+1) {
415 f_ran_adapter_init(g_ranap[i], mp_ranap_cfg[i], "SGSN_Test_" & int2str(i), RNC_RanOps);
416 f_ran_adapter_start(g_ranap[i]);
417 }
Harald Welte26fbb6e2019-04-14 17:32:46 +0200418 }
Harald Welte5ac31492018-02-15 20:39:13 +0100419 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100420 f_init_gtp("SGSN_Test");
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200421 f_vty_enable_echo_interval(g_use_echo);
Harald Welte5ac31492018-02-15 20:39:13 +0100422}
Harald Welte96a33b02018-02-04 10:36:22 +0100423
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200424function f_cleanup() runs on test_CT {
425 var integer i;
Alexander Couzens1552e792019-07-23 20:38:39 +0200426 if (g_ranap_enable) {
427 for (i := 0; i < NUM_RNC; i := i+1) {
428 f_ran_adapter_cleanup(g_ranap[i]);
429 }
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200430 }
431 self.stop;
432}
433
Harald Welte26fbb6e2019-04-14 17:32:46 +0200434private function RncUnitdataCallback(RANAP_PDU ranap)
435runs on RAN_Emulation_CT return template RANAP_PDU {
436 var template RANAP_PDU resp := omit;
437
438 log ("RANAP_RncUnitDataCallback");
439 /* answer all RESET with RESET ACK */
440 if (match(ranap, tr_RANAP_Reset)) {
441 log("RANAP_RncUnitdataCallback: Responding to RESET with RESET-ACK");
442 var CN_DomainIndicator dom;
443 dom := ranap.initiatingMessage.value_.Reset.protocolIEs[1].value_.cN_DomainIndicator;
444 resp := ts_RANAP_ResetAck(dom);
445 }
446 return resp;
447}
448
449const RanOps RNC_RanOps := {
450 ranap_create_cb := refers(RAN_Emulation.RanapExpectedCreateCallback),
451 ranap_unitdata_cb := refers(RncUnitdataCallback),
452 ps_domain := true,
453 decode_dtap := true,
454 role_ms := true,
455 protocol := RAN_PROTOCOL_RANAP,
456 transport := RANAP_TRANSPORT_IuCS,
457 use_osmux := false,
Eric Wild6e511ce2022-04-02 21:35:56 +0200458 bssap_reset_retries := 1,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200459 sccp_addr_local := omit,
460 sccp_addr_peer := omit
461};
462
Harald Welte5ac31492018-02-15 20:39:13 +0100463type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
464
465/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Alexander Couzens51114d12018-07-31 18:41:56 +0200466function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix,
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100467 float t_guard := 30.0, boolean expect_ciph := false)
Harald Welte5ac31492018-02-15 20:39:13 +0100468runs on test_CT return BSSGP_ConnHdlr {
469 var BSSGP_ConnHdlr vc_conn;
470 var SGSN_ConnHdlrNetworkPars net_pars := {
471 expect_ptmsi := true,
472 expect_auth := true,
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100473 expect_ciph := expect_ciph
Harald Welte5ac31492018-02-15 20:39:13 +0100474 };
475 var BSSGP_ConnHdlrPars pars := {
476 imei := f_gen_imei(imsi_suffix),
477 imsi := f_gen_imsi(imsi_suffix),
478 msisdn := f_gen_msisdn(imsi_suffix),
479 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100480 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100481 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100482 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100483 ra := omit,
Harald Welte5339b2e2020-10-04 22:52:56 +0200484 bssgp_cell_id := {
485 gb[0].cfg.bvc[0].cell_id,
486 gb[1].cfg.bvc[0].cell_id,
487 gb[2].cfg.bvc[0].cell_id
488 },
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200489 rnc_send_initial_ue := true,
Harald Welte5ac31492018-02-15 20:39:13 +0100490 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100491 net := net_pars,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200492 t_guard := t_guard,
Alexander Couzens1552e792019-07-23 20:38:39 +0200493 sccp_addr_local := omit,
494 sccp_addr_peer := omit
Harald Welte5ac31492018-02-15 20:39:13 +0100495 };
496
Alexander Couzens1552e792019-07-23 20:38:39 +0200497 if (g_ranap_enable) {
498 pars.sccp_addr_local := g_ranap[0].sccp_addr_own;
499 pars.sccp_addr_peer := g_ranap[0].sccp_addr_peer;
500 }
501
Harald Welte5ac31492018-02-15 20:39:13 +0100502 vc_conn := BSSGP_ConnHdlr.create(id);
Harald Welte5339b2e2020-10-04 22:52:56 +0200503
504 connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_SP);
505 connect(vc_conn:BSSGP_SIG[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
506 connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100507 connect(vc_conn:BSSGP_GLOBAL[0], gb[0].vc_BSSGP:GLOBAL);
Harald Welte5339b2e2020-10-04 22:52:56 +0200508
509 connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_SP);
510 connect(vc_conn:BSSGP_SIG[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
511 connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100512 connect(vc_conn:BSSGP_GLOBAL[1], gb[1].vc_BSSGP:GLOBAL);
Harald Welte5339b2e2020-10-04 22:52:56 +0200513
514 connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_SP);
515 connect(vc_conn:BSSGP_SIG[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_SP_SIG);
516 connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP_BVC[0]:BSSGP_PROC);
Harald Welte9b461a92020-12-10 23:41:14 +0100517 connect(vc_conn:BSSGP_GLOBAL[2], gb[2].vc_BSSGP:GLOBAL);
Harald Welte5ac31492018-02-15 20:39:13 +0100518
Harald Welte26fbb6e2019-04-14 17:32:46 +0200519 /* FIXME: support multiple RNCs */
Alexander Couzens1552e792019-07-23 20:38:39 +0200520 if (g_ranap_enable) {
521 connect(vc_conn:BSSAP, g_ranap[0].vc_RAN:CLIENT);
522 connect(vc_conn:BSSAP_PROC, g_ranap[0].vc_RAN:PROC);
523 }
Harald Welte26fbb6e2019-04-14 17:32:46 +0200524
Harald Welte5ac31492018-02-15 20:39:13 +0100525 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
526 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
527
Harald Welteeded9ad2018-02-17 20:57:34 +0100528 connect(vc_conn:GTP, vc_GTP:CLIENT);
529 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
530
Harald Welte5ac31492018-02-15 20:39:13 +0100531 vc_conn.start(f_handler_init(fn, id, pars));
532 return vc_conn;
533}
534
Harald Welte62e29582018-02-16 21:17:11 +0100535private altstep as_Tguard() runs on BSSGP_ConnHdlr {
536 [] g_Tguard.timeout {
537 setverdict(fail, "Tguard timeout");
Daniel Willmannafce8662018-07-06 23:11:32 +0200538 mtc.stop;
Harald Welte62e29582018-02-16 21:17:11 +0100539 }
540}
541
Harald Welte5ac31492018-02-15 20:39:13 +0100542/* first function called in every ConnHdlr */
543private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
544runs on BSSGP_ConnHdlr {
545 /* do some common stuff like setting up g_pars */
546 g_pars := pars;
547
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200548 llc := f_llc_create(false);
549
Harald Welte5ac31492018-02-15 20:39:13 +0100550 /* register with BSSGP core */
Harald Welte5339b2e2020-10-04 22:52:56 +0200551 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Harald Welte5ac31492018-02-15 20:39:13 +0100552 /* tell GSUP dispatcher to send this IMSI to us */
553 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100554 /* tell GTP dispatcher to send this IMSI to us */
555 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100556
Harald Welte62e29582018-02-16 21:17:11 +0100557 g_Tguard.start(pars.t_guard);
558 activate(as_Tguard());
559
Harald Welte5ac31492018-02-15 20:39:13 +0100560 /* call the user-supplied test case function */
561 fn.apply(id);
562 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100563}
564
565/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100566 * Detach without Attach
567 * SM procedures without attach / RAU
568 * ATTACH / RAU
569 ** with / without authentication
570 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100571 * re-transmissions of LLC frames
572 * PDP Context activation
573 ** with different GGSN config in SGSN VTY
574 ** with different PDP context type (v4/v6/v46)
575 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100576 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100577 */
578
579testcase TC_wait_ns_up() runs on test_CT {
580 f_init();
581 f_sleep(20.0);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200582 f_cleanup();
Harald Welte96a33b02018-02-04 10:36:22 +0100583}
584
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200585friend function is_gb(integer ran_index) return boolean {
586 return ran_index < NUM_GB;
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200587}
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200588friend function is_iu(integer ran_index) return boolean {
589 return ran_index >= NUM_GB;
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200590}
591
Alexander Couzens0507ec32019-09-15 22:41:22 +0200592function f_send_llc(template (value) PDU_LLC llc_pdu, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltea05b8072019-04-23 22:35:05 +0200593 var octetstring llc_enc := enc_PDU_LLC(valueof(llc_pdu));
Alexander Couzens0507ec32019-09-15 22:41:22 +0200594 BSSGP[ran_index].send(ts_BSSGP_UL_UD(g_pars.tlli, g_pars.bssgp_cell_id[ran_index], llc_enc));
Harald Weltea05b8072019-04-23 22:35:05 +0200595}
596
Alexander Couzens0507ec32019-09-15 22:41:22 +0200597private function f_send_l3_gmm_llc(template (value) PDU_L3_MS_SGSN l3_mo, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200598 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
599 var BIT4 sapi := f_llc_sapi_by_l3_mo(valueof(l3_mo));
600 var integer n_u := f_llc_get_n_u_tx(llc[bit2int(sapi)]);
Alexander Couzens0507ec32019-09-15 22:41:22 +0200601 f_send_llc(ts_LLC_UI(l3_enc, sapi, '0'B, n_u), ran_index);
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200602}
603
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200604/* trigger sending of a RANAP InitialUE and wait for SCCP connection confirmation */
605function f_send_l3_initial_ue(template (value) PDU_L3_MS_SGSN l3_mo) runs on BSSGP_ConnHdlr {
606 log("Sending InitialUE: ", l3_mo);
607 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
608 var RANAP_PDU ranap;
609 var LAI lai := {
610 pLMNidentity := '62F224'O,
611 lAC := '1234'O,
612 iE_Extensions := omit
613 };
614 var SAI sai := {
615 pLMNidentity := lai.pLMNidentity,
616 lAC := lai.lAC,
617 sAC := '0000'O, /* FIXME */
618 iE_Extensions := omit
619 };
620 var IuSignallingConnectionIdentifier sigc_id := int2bit(23, 24); /* FIXME */
621 var GlobalRNC_ID grnc_id := {
622 pLMNidentity := lai.pLMNidentity,
623 rNC_ID := 2342 /* FIXME */
624 };
625
626 ranap := valueof(ts_RANAP_initialUE_CS(lai, sai, l3_enc, sigc_id, grnc_id));
627 BSSAP.send(ts_RANAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_local, ranap));
628 alt {
629 [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND) {}
630 [] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {
631 setverdict(fail, "DISC.ind from SCCP");
632 mtc.stop;
633 }
634 }
635}
636
637/* send a L3 (GMM/SM) message over whatever is the appropriate lower-layer bearer */
Alexander Couzens0507ec32019-09-15 22:41:22 +0200638function f_send_l3(template (value) PDU_L3_MS_SGSN l3_mo, integer ran_index := 0) runs on BSSGP_ConnHdlr {
639 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200640 if (g_pars.rnc_send_initial_ue) {
641 g_pars.rnc_send_initial_ue := false;
642 f_send_l3_initial_ue(l3_mo);
643 } else {
644 BSSAP.send(ts_PDU_DTAP_PS_MO(l3_mo));
645 }
646 } else {
Alexander Couzens0507ec32019-09-15 22:41:22 +0200647 f_send_l3_gmm_llc(l3_mo, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200648 }
649}
650
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200651altstep as_mm_identity(integer ran_index := 0) runs on BSSGP_ConnHdlr {
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700652 var MobileIdentityLV mi;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200653 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_ID_REQ('001'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100654 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200655 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100656 repeat;
657 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200658 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200659 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200660 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200661 repeat;
662 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200663 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_ID_REQ('010'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100664 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200665 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200666 repeat;
667 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200668 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200669 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200670 f_send_l3(ts_GMM_ID_RESP(mi), ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100671 repeat;
672 }
673}
Harald Welte96a33b02018-02-04 10:36:22 +0100674
Harald Welteca362462019-05-02 20:11:21 +0200675/* receive a L3 (GMM/SM) message over whatever is the appropriate lower-layer bearer */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200676function f_receive_l3(template PDU_L3_SGSN_MS rx_tpl := ?, integer ran_index := 0)
Harald Welteca362462019-05-02 20:11:21 +0200677runs on BSSGP_ConnHdlr return PDU_L3_SGSN_MS {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200678 var PDU_DTAP_PS_MT mt;
Harald Welteca362462019-05-02 20:11:21 +0200679 var PDU_L3_SGSN_MS l3_mt;
680 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200681 [is_gb(ran_index)] BSSGP[ran_index].receive(rx_tpl) -> value l3_mt { }
682 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(rx_tpl)) -> value mt {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200683 l3_mt := mt.dtap;
684 }
Harald Welteca362462019-05-02 20:11:21 +0200685 }
686 return l3_mt;
687}
688
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100689/* (copied from msc/BSC_ConnectionHandler.ttcn) */
690private altstep as_ciph_utran() runs on BSSGP_ConnHdlr
691{
692 [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(uia_algs := ?,
693 uia_key := oct2bit(g_pars.vec.ik),
694 key_sts := ?,
695 uea_algs := ?,
696 uea_key := oct2bit(g_pars.vec.ck))) {
697 var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1*/
698 var EncryptionAlgorithm uea_chosen := 1; /*standard_UMTS_encryption_algorith_UEA1*/
699 BSSAP.send(ts_RANAP_SecurityModeCompleteEnc(uia_chosen, uea_chosen));
700 }
701 [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(?,?,?,?,?)) {
702 setverdict(fail, "Invalid SecurityModeCommand (ciphering case)");
703 mtc.stop;
704 }
705 [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(uia_algs := ?,
706 uia_key := oct2bit(g_pars.vec.ik),
707 key_sts := ?)) {
708 var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1;*/
709 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
710 }
711 [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(?,?,?)) {
712 setverdict(fail, "Invalid SecurityModeCommand (non-ciphering case)");
713 mtc.stop;
714 }
715}
716
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200717/* perform GMM authentication (if expected).
718 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
719 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200720function f_gmm_auth (boolean umts_aka_challenge := false, boolean force_gsm_sres := false, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100721 var PDU_L3_MS_SGSN l3_mo;
722 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200723 var default di := activate(as_mm_identity(ran_index));
Harald Welte5ac31492018-02-15 20:39:13 +0100724 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200725 var GSUP_IE auth_tuple;
726 var template AuthenticationParameterAUTNTLV autn;
727
728 if (umts_aka_challenge) {
729 g_pars.vec := f_gen_auth_vec_3g();
730 autn := {
731 elementIdentifier := '28'O,
732 lengthIndicator := lengthof(g_pars.vec.autn),
733 autnValue := g_pars.vec.autn
734 };
735
736 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
737 g_pars.vec.sres,
738 g_pars.vec.kc,
739 g_pars.vec.ik,
740 g_pars.vec.ck,
741 g_pars.vec.autn,
742 g_pars.vec.res));
743 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
744 } else {
745 g_pars.vec := f_gen_auth_vec_2g();
746 autn := omit;
747 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
748 g_pars.vec.sres,
749 g_pars.vec.kc));
750 log("GSUP sends only 2G auth tuple", auth_tuple);
751 }
Harald Welteca362462019-05-02 20:11:21 +0200752
Harald Welte5ac31492018-02-15 20:39:13 +0100753 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
754 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200755
756 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
757 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200758 l3_mt := f_receive_l3(auth_ciph_req, ran_index);
Harald Welte5ac31492018-02-15 20:39:13 +0100759 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200760 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
761
762 if (umts_aka_challenge and not force_gsm_sres) {
763 /* set UMTS response instead */
764 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
765 valueField := substr(g_pars.vec.res, 0, 4)
766 };
767 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
768 elementIdentifier := '21'O,
769 lengthIndicator := lengthof(g_pars.vec.res) - 4,
770 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
771 };
772 }
773
774 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100775 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
776 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
777 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
778 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
779 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200780 f_send_l3(l3_mo, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200781
782 /* Security Mode Command + Complete on Iu case */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200783 if (is_iu(ran_index)) {
Neels Hofmeyr3ee71d82022-03-08 21:46:41 +0100784 as_ciph_utran();
785 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)));
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200786 }
Harald Welte76dee092018-02-16 22:12:59 +0100787 } else {
788 /* wait for identity procedure */
789 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100790 }
Harald Welte76dee092018-02-16 22:12:59 +0100791
Harald Welte5ac31492018-02-15 20:39:13 +0100792 deactivate(di);
793}
794
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200795function f_upd_ptmsi_and_tlli(OCT4 p_tmsi, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltef70997d2018-02-17 10:11:19 +0100796 g_pars.p_tmsi := p_tmsi;
797 /* update TLLI */
798 g_pars.tlli_old := g_pars.tlli;
799 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
Daniel Willmann1c2ff0f2020-01-28 14:39:25 +0100800 if (is_gb(ran_index)) {
801 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli, BSSGP_PROC[ran_index]);
802 }
Harald Weltef70997d2018-02-17 10:11:19 +0100803}
804
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100805function f_process_attach_accept(PDU_GMM_AttachAccept aa, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100806 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100807 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Harald Weltedd9fb842021-02-16 20:21:22 +0100808 /* we cannot use ran_index here, as it would overflow the cell_id object, since ran_idx > NUM_GB
809 * indicates an Iu RAN connection. All cells are expected to run the same MCC/MNC anyway... */
810 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100811 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100812 & "; expected " & hex2str(g_pars.bssgp_cell_id[ran_index].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200813 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100814 }
Harald Welte04683d02018-02-16 22:43:45 +0100815 g_pars.ra := aa.routingAreaIdentification;
816 if (ispresent(aa.allocatedPTMSI)) {
817 if (not g_pars.net.expect_ptmsi) {
818 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200819 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100820 }
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100821 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets,
822 ran_index);
Harald Welte04683d02018-02-16 22:43:45 +0100823 }
824 if (ispresent(aa.msIdentity)) {
825 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200826 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100827 }
828 /* P-TMSI.sig */
829 if (ispresent(aa.ptmsiSignature)) {
830 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
831 }
832 /* updateTimer */
833 // aa.readyTimer
834 /* T3302, T3319, T3323, T3312_ext, T3324 */
835}
836
Alexander Couzensb22e8ce2019-09-15 22:39:58 +0200837function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +0100838 /* mandatory IE */
839 g_pars.ra := ra.routingAreaId;
840 if (ispresent(ra.allocatedPTMSI)) {
841 if (not g_pars.net.expect_ptmsi) {
842 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200843 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100844 }
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100845 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets,
846 ran_index);
Harald Welte91636de2018-02-17 10:16:14 +0100847 }
848 if (ispresent(ra.msIdentity)) {
849 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200850 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100851 }
852 /* P-TMSI.sig */
853 if (ispresent(ra.ptmsiSignature)) {
854 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
855 }
856 /* updateTimer */
857 // aa.readyTimer
858 /* T3302, T3319, T3323, T3312_ext, T3324 */
859}
860
861
Harald Welte5a4fa042018-02-16 20:59:21 +0100862function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
863 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
864}
865
Harald Welte23178c52018-02-17 09:36:33 +0100866/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +0700867private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100868 if (ispresent(g_pars.p_tmsi)) {
869 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
870 } else {
871 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
872 }
873}
874
Harald Welte311ec272018-02-17 09:40:03 +0100875private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100876 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100877 /* Expect MSC to perform LU with HLR */
878 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100879 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
880 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
881 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100882 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
883 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
884}
885
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100886friend function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres, integer ran_index := 0,
887 template (omit) RoutingAreaIdentificationV old_ra := omit) runs on BSSGP_ConnHdlr {
888 var RoutingAreaIdentificationV old_ra_val;
889 var template PDU_L3_MS_SGSN attach_req;
Harald Welteca362462019-05-02 20:11:21 +0200890 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5ac31492018-02-15 20:39:13 +0100891
Pau Espin Pedrol7c052162021-02-12 17:43:35 +0100892 if (istemplatekind(old_ra, "omit")) {
893 old_ra_val := f_random_RAI();
894 } else {
895 old_ra_val := valueof(old_ra);
896 }
897
898 attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra_val, false, false, omit, omit);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200899 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
900 * 3G auth vectors */
901 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
902 /* The thing is, if the solSACapability is 'omit', then the
903 * revisionLevelIndicatior is at the wrong place! */
904 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
905
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200906 f_send_l3(attach_req, ran_index);
907 f_gmm_auth(umts_aka_challenge, force_gsm_sres, ran_index);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200908 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100909 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100910
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200911 l3_mt := f_receive_l3(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?), ran_index);
Pau Espin Pedrold792b9e2021-02-12 19:49:59 +0100912 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept, ran_index);
Harald Welteca362462019-05-02 20:11:21 +0200913
Harald Welte04683d02018-02-16 22:43:45 +0100914 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200915 f_send_l3(ts_GMM_ATTACH_COMPL, ran_index);
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200916
917 /* IuPS case: Expect Iu Release */
Alexander Couzensb1ce1182019-09-15 22:43:40 +0200918 if (is_iu(ran_index)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +0200919 as_iu_release_compl_disc();
920 }
Alexander Couzens42d3cad2019-10-08 16:29:26 +0200921
922 /* Race condition
923 * It has shown, that GMM_ATTACH_COMPL might take some time to arrive at the SGSN through the layers.
924 * In TC hlr_location_cancel_request_update, the GMM_ATTACH_COMPL came 2ms too late, so that the Location Cancel Request
925 * arrived before it. This results in a test case failure.
926 * Delay execution by 50 ms
927 */
928 f_sleep(0.05);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200929}
930
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200931friend function f_bssgp_suspend(integer ran_idx := 0) runs on BSSGP_ConnHdlr return OCT1 {
932 timer T := 5.0;
933 var PDU_BSSGP rx_pdu;
Harald Welte9b461a92020-12-10 23:41:14 +0100934 BSSGP_GLOBAL[ran_idx].send(ts_BSSGP_SUSPEND(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id));
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200935 T.start;
936 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100937 [] BSSGP_GLOBAL[ran_idx].receive(tr_BSSGP_SUSPEND_ACK(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id, ?)) -> value rx_pdu {
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200938 return rx_pdu.pDU_BSSGP_SUSPEND_ACK.suspend_Reference_Number.suspend_Reference_Number_value;
939 }
Harald Welte9b461a92020-12-10 23:41:14 +0100940 [] BSSGP_GLOBAL[ran_idx].receive(tr_BSSGP_SUSPEND_NACK(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id, ?)) -> value rx_pdu {
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200941 setverdict(fail, "SUSPEND-NACK in response to SUSPEND for TLLI ", g_pars.tlli);
942 mtc.stop;
943 }
944 [] T.timeout {
945 setverdict(fail, "No SUSPEND-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
946 mtc.stop;
947 }
948 }
949 return '00'O;
950}
951
952friend function f_bssgp_resume(OCT1 susp_ref, integer ran_idx := 0) runs on BSSGP_ConnHdlr {
953 timer T := 5.0;
Harald Welte9b461a92020-12-10 23:41:14 +0100954 BSSGP_GLOBAL[ran_idx].send(ts_BSSGP_RESUME(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id, susp_ref));
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200955 T.start;
956 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100957 [] BSSGP_GLOBAL[ran_idx].receive(tr_BSSGP_RESUME_ACK(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id));
958 [] BSSGP_GLOBAL[ran_idx].receive(tr_BSSGP_RESUME_NACK(g_pars.tlli, g_pars.bssgp_cell_id[ran_idx].ra_id,
Harald Weltef2f3c9b2020-06-17 22:11:43 +0200959?)) {
960 setverdict(fail, "RESUME-NACK in response to RESUME for TLLI ", g_pars.tlli);
961 mtc.stop;
962 }
963 [] T.timeout {
964 setverdict(fail, "No RESUME-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
965 mtc.stop;
966 }
967 }
968}
969
970
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200971private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
972 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100973 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100974}
975
976testcase TC_attach() runs on test_CT {
977 var BSSGP_ConnHdlr vc_conn;
978 f_init();
979 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200980 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100981 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200982 f_cleanup();
Harald Welte5ac31492018-02-15 20:39:13 +0100983}
984
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100985testcase TC_attach_mnc3() runs on test_CT {
986 var BSSGP_ConnHdlr vc_conn;
987 f_init('023042'H);
988 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200989 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100990 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +0200991 f_cleanup();
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100992}
993
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200994private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
995 f_gmm_attach(true, false);
996 setverdict(pass);
997}
998testcase TC_attach_umts_aka_umts_res() runs on test_CT {
999 var BSSGP_ConnHdlr vc_conn;
1000 f_init();
1001 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001002 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001003 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001004 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001005}
1006
1007private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
1008 f_gmm_attach(true, true);
1009 setverdict(pass);
1010}
1011testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
1012 var BSSGP_ConnHdlr vc_conn;
1013 f_init();
1014 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001015 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001016 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001017 f_cleanup();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001018}
1019
arehbein3ede9e32023-02-06 21:02:53 +01001020/* Let T3350 expire while the MS holds an active PDP context (OS#4221). Do this by
1021 * Establishing a PDP context and then resending an ATTACH REQUEST,
1022 * making sure that exactly five ATTACH ACCEPTS are sent */
1023private function f_TC_attach_timeout_after_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
1024 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1025 /* Vars needed for triggering T3350 timeouts */
1026 const integer ran_index := 0;
1027 /* See TS 24.008 Rel. 16 Sect. 4.7.3.1.6 c) */
1028 const integer gmm_attach_repeats := 5;
1029 /* See TS 24.008 Rel. 16 Table 11.4 */
1030 const float T3350 := 6.0;
1031 var template PDU_L3_MS_SGSN attach_req;
1032 timer t_receive_GMM_ATTACH_ACCEPT;
1033 var RoutingAreaIdentificationV rai := f_random_RAI();
1034
1035 /* First establish PDP context */
1036 f_TC_attach(id);
1037 f_pdp_ctx_act(apars);
1038
1039 /* Now, try another GPRS attach procedure. For further code comments up until receiving the attach
1040 * accept from the SGSN, see definition of f_gmm_attach() */
1041 attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), rai, false, false, omit, omit);
1042 f_send_l3(attach_req, ran_index);
1043 f_gmm_auth(false, false, ran_index);
1044 f_gmm_gsup_lu_isd();
1045
1046 BSSGP[ran_index].clear;
1047 log("Trying to receive ", gmm_attach_repeats, " ATTACH ACCEPTs");
1048 for (var integer i := 1; i <= gmm_attach_repeats; i := i+1) {
1049 t_receive_GMM_ATTACH_ACCEPT.start(T3350 + 0.5);
1050 alt {
1051 [] BSSGP[ran_index].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) {
1052 t_receive_GMM_ATTACH_ACCEPT.stop;
1053 }
1054 [] t_receive_GMM_ATTACH_ACCEPT.timeout {
1055 setverdict(fail, "Timeout on receiving ", i, "th ATTACH ACCEPT")
1056 }
1057 }
1058 }
1059 log("Have received ", gmm_attach_repeats, " ATTACH ACCEPT messages");
1060 log("Make sure not more than ", gmm_attach_repeats, " ATTACH ACCEPT messages are sent");
1061 t_receive_GMM_ATTACH_ACCEPT.start(T3350 + 0.5);
1062 alt {
1063 [] BSSGP[ran_index].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) {
1064 setverdict(fail, "Received ", gmm_attach_repeats + 1, "th ATTACH ACCEPT")
1065 }
1066 [] t_receive_GMM_ATTACH_ACCEPT.timeout { }
1067 }
1068
1069 setverdict(pass);
1070}
1071
1072testcase TC_attach_timeout_after_pdp_act() runs on test_CT {
1073 var BSSGP_ConnHdlr vc_conn;
1074 f_init();
1075 vc_conn := f_start_handler(refers(f_TC_attach_timeout_after_pdp_act), testcasename(), g_gb, 21);
1076 f_cleanup();
1077}
1078
Harald Welte5b7c8122018-02-16 21:48:17 +01001079/* MS never responds to ID REQ, expect ATTACH REJECT */
1080private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +01001081 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1082
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001083 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001084 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001085 [] BSSGP[0].receive(tr_GMM_ID_REQ(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001086 /* don't send ID Response */
1087 repeat;
1088 }
Harald Welte955aa942019-05-03 01:29:29 +02001089 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('09'O)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001090 setverdict(pass);
1091 }
Harald Welte955aa942019-05-03 01:29:29 +02001092 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001093 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +02001094 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +01001095 }
1096 }
1097}
1098testcase TC_attach_auth_id_timeout() runs on test_CT {
1099 var BSSGP_ConnHdlr vc_conn;
1100 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001101 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 +01001102 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001103 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001104}
1105
1106/* HLR never responds to SAI REQ, expect ATTACH REJECT */
1107private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +01001108 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1109
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001110 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001111 alt {
1112 [] as_mm_identity();
1113 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
1114 }
1115 /* don't send SAI-response from HLR */
Harald Welte955aa942019-05-03 01:29:29 +02001116 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Welte5b7c8122018-02-16 21:48:17 +01001117 setverdict(pass);
1118}
1119testcase TC_attach_auth_sai_timeout() runs on test_CT {
1120 var BSSGP_ConnHdlr vc_conn;
1121 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001122 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +01001123 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001124 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001125}
1126
Harald Weltefe253882018-02-17 09:25:00 +01001127/* HLR rejects SAI, expect ATTACH REJECT */
1128private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +01001129 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1130
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001131 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +01001132 alt {
1133 [] as_mm_identity();
1134 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
1135 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
1136 }
1137 }
Harald Welte955aa942019-05-03 01:29:29 +02001138 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Weltefe253882018-02-17 09:25:00 +01001139 setverdict(pass);
1140}
1141testcase TC_attach_auth_sai_reject() runs on test_CT {
1142 var BSSGP_ConnHdlr vc_conn;
1143 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001144 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +01001145 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001146 f_cleanup();
Harald Weltefe253882018-02-17 09:25:00 +01001147}
1148
Harald Welte5b7c8122018-02-16 21:48:17 +01001149/* HLR never responds to UL REQ, expect ATTACH REJECT */
1150private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001151 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5b7c8122018-02-16 21:48:17 +01001152 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1153
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001154 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +01001155 f_gmm_auth();
1156 /* Expect MSC to perform LU with HLR */
1157 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
1158 /* Never follow-up with ISD_REQ or UL_RES */
1159 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001160 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +01001161 setverdict(pass);
1162 }
Harald Welte955aa942019-05-03 01:29:29 +02001163 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1164 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +01001165 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001166 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +01001167 }
1168 }
1169}
1170testcase TC_attach_gsup_lu_timeout() runs on test_CT {
1171 var BSSGP_ConnHdlr vc_conn;
1172 f_init();
1173 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001174 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +01001175 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001176 f_cleanup();
Harald Welte5b7c8122018-02-16 21:48:17 +01001177}
1178
Harald Welteb7c14e92018-02-17 09:29:16 +01001179/* HLR rejects UL REQ, expect ATTACH REJECT */
1180private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001181 var PDU_L3_SGSN_MS l3_mt;
Harald Welteb7c14e92018-02-17 09:29:16 +01001182 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1183
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001184 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +01001185 f_gmm_auth();
1186 /* Expect MSC to perform LU with HLR */
1187 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
1188 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
1189 }
1190 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001191 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb7c14e92018-02-17 09:29:16 +01001192 setverdict(pass);
1193 }
Harald Welte955aa942019-05-03 01:29:29 +02001194 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1195 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welteb7c14e92018-02-17 09:29:16 +01001196 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001197 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +01001198 }
1199 }
1200}
1201testcase TC_attach_gsup_lu_reject() runs on test_CT {
1202 var BSSGP_ConnHdlr vc_conn;
1203 f_init();
1204 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001205 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +01001206 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001207 f_cleanup();
Harald Welteb7c14e92018-02-17 09:29:16 +01001208}
1209
1210
Harald Welte3823e2e2018-02-16 21:53:48 +01001211/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
1212private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001213 var PDU_L3_SGSN_MS l3_mt;
Harald Welte3823e2e2018-02-16 21:53:48 +01001214 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1215
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001216 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +01001217 f_gmm_auth();
1218 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +01001219 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +01001220
Harald Welte955aa942019-05-03 01:29:29 +02001221 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1222 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001223 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001224 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +01001225 setverdict(pass);
1226}
Harald Welte3823e2e2018-02-16 21:53:48 +01001227testcase TC_attach_combined() runs on test_CT {
1228 var BSSGP_ConnHdlr vc_conn;
1229 f_init();
1230 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001231 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +01001232 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001233 f_cleanup();
Harald Welte3823e2e2018-02-16 21:53:48 +01001234}
1235
Harald Welte76dee092018-02-16 22:12:59 +01001236/* Attempt of GPRS ATTACH in 'accept all' mode */
1237private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001238 var PDU_L3_SGSN_MS l3_mt;
Harald Welte76dee092018-02-16 22:12:59 +01001239 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1240
1241 g_pars.net.expect_auth := false;
1242
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001243 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +01001244 f_gmm_auth();
Harald Welte955aa942019-05-03 01:29:29 +02001245 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
1246 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +01001247 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001248 f_send_l3(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +01001249 setverdict(pass);
1250}
1251testcase TC_attach_accept_all() runs on test_CT {
1252 var BSSGP_ConnHdlr vc_conn;
1253 f_init();
1254 f_sleep(1.0);
1255 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +02001256 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +01001257 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001258 f_cleanup();
Harald Welte76dee092018-02-16 22:12:59 +01001259}
Harald Welte5b7c8122018-02-16 21:48:17 +01001260
Harald Welteb2124b22018-02-16 22:26:56 +01001261/* Attempt of GPRS ATTACH in 'accept all' mode */
1262private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +01001263 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1264
1265 /* Simulate a foreign IMSI */
1266 g_pars.imsi := '001010123456789'H;
Harald Welte5339b2e2020-10-04 22:52:56 +02001267 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Harald Welteb2124b22018-02-16 22:26:56 +01001268
1269 g_pars.net.expect_auth := false;
1270
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001271 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +01001272 alt {
1273 [] as_mm_identity();
Harald Welte955aa942019-05-03 01:29:29 +02001274 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('07'O)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001275 setverdict(pass);
1276 }
Harald Welte955aa942019-05-03 01:29:29 +02001277 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb2124b22018-02-16 22:26:56 +01001278 setverdict(pass);
1279 }
Harald Welte955aa942019-05-03 01:29:29 +02001280 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001281 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +02001282 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +02001283 }
Harald Welteb2124b22018-02-16 22:26:56 +01001284 }
1285}
1286testcase TC_attach_closed() runs on test_CT {
1287 var BSSGP_ConnHdlr vc_conn;
1288 f_init();
1289 f_sleep(1.0);
1290 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1291 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001292 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +01001293 vc_conn.done;
1294 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001295 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +01001296 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001297 f_cleanup();
Harald Welteb2124b22018-02-16 22:26:56 +01001298}
1299
Harald Welte04683d02018-02-16 22:43:45 +01001300/* Routing Area Update from Unknown TLLI -> REJECT */
1301private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +01001302 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1303
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001304 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 +01001305 alt {
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01001306 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) { /* gmm cause: implicitly detached */
Harald Welte04683d02018-02-16 22:43:45 +01001307 setverdict(pass);
1308 }
1309 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001310 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +01001311 }
1312}
1313testcase TC_rau_unknown() runs on test_CT {
1314 var BSSGP_ConnHdlr vc_conn;
1315 f_init();
1316 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001317 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +01001318 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001319 f_cleanup();
Harald Welte04683d02018-02-16 22:43:45 +01001320}
1321
Harald Welte91636de2018-02-17 10:16:14 +01001322private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +01001323 /* first perform regular attach */
1324 f_TC_attach(id);
1325
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001326 f_routing_area_update(g_pars.ra);
1327
Harald Welte91636de2018-02-17 10:16:14 +01001328}
1329testcase TC_attach_rau() runs on test_CT {
1330 var BSSGP_ConnHdlr vc_conn;
1331 f_init();
1332 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001333 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +01001334 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001335 f_cleanup();
Harald Welte91636de2018-02-17 10:16:14 +01001336}
Harald Welte04683d02018-02-16 22:43:45 +01001337
Harald Welte6abb9fe2018-02-17 15:24:48 +01001338/* general GPRS DETACH helper */
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001339function 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 +02001340 var PDU_L3_SGSN_MS l3_mt;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001341 timer T := 5.0;
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001342 f_send_l3(ts_GMM_DET_REQ_MO(detach_type, power_off), ran_index);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001343 if (expect_purge) {
1344 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
1345 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
1346 }
1347 T.start;
1348 alt {
1349 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
1350 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +02001351 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001352 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001353 [power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001354 g_pars.ra := omit;
Alexander Couzens8e0fd462019-05-11 01:20:55 +02001355 setverdict(fail, "Unexpected DETACH ACCEPT in power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +02001356 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +01001357 /* TODO: check if any PDP contexts are deactivated on network side? */
1358 }
1359 [power_off] T.timeout {
1360 setverdict(pass);
1361 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001362 [not power_off] BSSGP[ran_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +01001363 g_pars.ra := omit;
1364 setverdict(pass);
1365 /* TODO: check if any PDP contexts are deactivated on network side? */
1366 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001367 [] BSSGP[ran_index].receive(PDU_L3_SGSN_MS:?) -> value l3_mt {
Alexander Couzens4630e742019-05-11 01:50:10 +02001368 if (power_off) {
1369 setverdict(fail, "Unexpected Layer 3 package received in power-off DETACH");
1370 } else {
1371 setverdict(fail, "Unexpected Layer 3 package received in normal DETACH");
1372 }
1373 mtc.stop;
1374 }
Alexander Couzensb22e8ce2019-09-15 22:39:58 +02001375 [] BSSGP[ran_index].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +01001376 }
1377}
1378
1379/* IMSI DETACH (non-power-off) for unknown TLLI */
1380private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1381 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
1382}
1383testcase TC_detach_unknown_nopoweroff() runs on test_CT {
1384 var BSSGP_ConnHdlr vc_conn;
1385 f_init();
1386 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001387 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001388 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001389 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001390}
1391
1392/* IMSI DETACH (power-off) for unknown TLLI */
1393private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1394 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
1395}
1396testcase TC_detach_unknown_poweroff() runs on test_CT {
1397 var BSSGP_ConnHdlr vc_conn;
1398 f_init();
1399 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001400 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001401 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001402 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001403}
1404
1405/* IMSI DETACH (non-power-off) for known TLLI */
1406private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1407 /* first perform regular attach */
1408 f_TC_attach(id);
1409
1410 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
1411}
1412testcase TC_detach_nopoweroff() runs on test_CT {
1413 var BSSGP_ConnHdlr vc_conn;
1414 f_init();
1415 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001416 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001417 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001418 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001419}
1420
1421/* IMSI DETACH (power-off) for known TLLI */
1422private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1423 /* first perform regular attach */
1424 f_TC_attach(id);
1425
1426 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1427}
1428testcase TC_detach_poweroff() runs on test_CT {
1429 var BSSGP_ConnHdlr vc_conn;
1430 f_init();
1431 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001432 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001433 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001434 f_cleanup();
Harald Welte6abb9fe2018-02-17 15:24:48 +01001435}
1436
Harald Welteeded9ad2018-02-17 20:57:34 +01001437type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +01001438 BIT3 tid, /* L3 Transaction ID */
1439 BIT4 nsapi, /* SNDCP NSAPI */
1440 BIT4 sapi, /* LLC SAPI */
1441 QoSV qos, /* QoS parameters */
1442 PDPAddressV addr, /* IP address */
1443 octetstring apn optional, /* APN name */
1444 ProtocolConfigOptionsV pco optional, /* protoco config opts */
1445 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +01001446 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +01001447 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +01001448
Harald Welte822f9102018-02-18 20:39:06 +01001449 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
1450 OCT4 ggsn_tei_u, /* GGSN TEI User */
1451 octetstring ggsn_ip_c, /* GGSN IP Control */
1452 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001453 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +01001454
Harald Welte822f9102018-02-18 20:39:06 +01001455 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
1456 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
1457 octetstring sgsn_ip_c optional, /* SGSN IP Control */
1458 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +01001459};
1460
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001461
1462private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
1463 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
1464 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
1465 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
1466 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
1467 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
1468 f_gtp_register_teid(apars.ggsn_tei_c);
1469 f_gtp_register_teid(apars.ggsn_tei_u);
1470}
1471
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001472function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001473runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +01001474 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1475 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001476 var template Recovery_gtpc recovery := omit;
1477
1478 if (send_recovery) {
1479 recovery := ts_Recovery(apars.ggsn_restart_ctr);
1480 }
Harald Welteeded9ad2018-02-17 20:57:34 +01001481
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001482 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 +02001483 apars.apn, apars.pco), ran_index);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001484 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
1485 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
1486 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1487 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
1488 apars.sgsn_tei_c, apars.gtp_resp_cause,
1489 apars.ggsn_tei_c, apars.ggsn_tei_u,
1490 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001491 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1492 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +01001493 }
1494 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001495 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001496 setverdict(pass);
1497 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001498 [exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001499 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +02001500 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001501 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001502 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001503 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +02001504 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001505 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001506 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Weltef7191672019-05-02 20:37:23 +02001507 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
1508 mtc.stop;
1509 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001510 [not exp_rej] BSSGP[ran_index].receive(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001511 setverdict(pass);
1512 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001513 [] as_xid(apars, ran_index);
Harald Welteeded9ad2018-02-17 20:57:34 +01001514 }
1515}
1516
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001517function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001518runs on BSSGP_ConnHdlr {
Harald Welte6f203162018-02-18 22:04:55 +01001519 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1520 var Gtp1cUnitdata g_ud;
1521
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001522 f_send_l3(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit), ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001523 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1524 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001525 BSSGP[ran_index].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001526 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1527 }
1528 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001529 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Harald Welte6f203162018-02-18 22:04:55 +01001530 setverdict(pass);
1531 }
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001532 [] as_xid(apars, ran_index);
Harald Welte6f203162018-02-18 22:04:55 +01001533 }
1534}
1535
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001536function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false, integer ran_index := 0)
Harald Weltef7191672019-05-02 20:37:23 +02001537runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001538 var Gtp1cUnitdata g_ud;
1539 var integer seq_nr := 23;
1540 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1541
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001542 BSSGP[ran_index].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001543 if (error_ind) {
1544 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1545 } else {
1546 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1547 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001548
1549 timer T := 5.0;
1550 T.start;
1551
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001552 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001553 [] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1554 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), ran_index);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001555 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001556 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1557 repeat;
1558 }
1559 [] T.timeout {
1560 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1561 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001562 }
1563}
1564
Harald Welte6f203162018-02-18 22:04:55 +01001565
Harald Welteeded9ad2018-02-17 20:57:34 +01001566/* Table 10.5.156/3GPP TS 24.008 */
1567template (value) QoSV t_QosDefault := {
1568 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1569 delayClass := '100'B, /* best effort */
1570 spare1 := '00'B,
1571 precedenceClass := '010'B, /* normal */
1572 spare2 := '0'B,
1573 peakThroughput := '0000'B, /* subscribed */
1574 meanThroughput := '00000'B, /* subscribed */
1575 spare3 := '000'B,
1576 deliverErroneusSDU := omit,
1577 deliveryOrder := omit,
1578 trafficClass := omit,
1579 maxSDUSize := omit,
1580 maxBitrateUplink := omit,
1581 maxBitrateDownlink := omit,
1582 sduErrorRatio := omit,
1583 residualBER := omit,
1584 trafficHandlingPriority := omit,
1585 transferDelay := omit,
1586 guaranteedBitRateUplink := omit,
1587 guaranteedBitRateDownlink := omit,
1588 sourceStatisticsDescriptor := omit,
1589 signallingIndication := omit,
1590 spare4 := omit,
1591 maxBitrateDownlinkExt := omit,
1592 guaranteedBitRateDownlinkExt := omit,
1593 maxBitrateUplinkExt := omit,
1594 guaranteedBitRateUplinkExt := omit,
1595 maxBitrateDownlinkExt2 := omit,
1596 guaranteedBitRateDownlinkExt2 := omit,
1597 maxBitrateUplinkExt2 := omit,
1598 guaranteedBitRateUplinkExt2 := omit
1599}
1600
1601/* 10.5.6.4 / 3GPP TS 24.008 */
1602template (value) PDPAddressV t_AddrIPv4dyn := {
1603 pdpTypeOrg := '0001'B, /* IETF */
1604 spare := '0000'B,
1605 pdpTypeNum := '21'O, /* IPv4 */
1606 addressInfo := omit
1607}
1608template (value) PDPAddressV t_AddrIPv6dyn := {
1609 pdpTypeOrg := '0001'B, /* IETF */
1610 spare := '0000'B,
1611 pdpTypeNum := '53'O, /* IPv6 */
1612 addressInfo := omit
1613}
1614
Harald Welte37692d82018-02-18 15:21:34 +01001615template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001616 tid := '000'B,
1617 nsapi := '0101'B, /* < 5 are reserved */
1618 sapi := '0011'B, /* 3/5/9/11 */
1619 qos := t_QosDefault,
1620 addr := t_AddrIPv4dyn,
1621 apn := omit,
1622 pco := omit,
1623 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001624 gtp_resp_cause := int2oct(128, 1),
1625 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001626
1627 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001628 ggsn_tei_c := f_rnd_octstring(4),
1629 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001630 ggsn_ip_c := f_inet_addr(ggsn_ip),
1631 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001632 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001633
Harald Welteeded9ad2018-02-17 20:57:34 +01001634 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001635 sgsn_tei_u := omit,
1636 sgsn_ip_c := omit,
1637 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001638}
1639
Harald Welte37692d82018-02-18 15:21:34 +01001640template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1641 connId := 1,
1642 remName := f_inet_ntoa(ip),
1643 remPort := GTP1U_PORT
1644}
1645
1646template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1647 connId := 1,
1648 remName := f_inet_ntoa(ip),
1649 remPort := GTP1C_PORT
1650}
1651
1652private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1653 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1654 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1655}
1656
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001657private altstep as_xid(PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr {
1658 [] BSSGP[ran_index].receive(tr_LLC_XID_MT_CMD(?, apars.sapi)) {
Harald Welte37692d82018-02-18 15:21:34 +01001659 repeat;
1660 }
1661}
1662
1663template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1664 pDU_SN_UNITDATA := {
1665 nsapi := nsapi,
1666 moreBit := ?,
1667 snPduType := '1'B,
1668 firstSegmentIndicator := ?,
1669 spareBit := ?,
1670 pcomp := ?,
1671 dcomp := ?,
1672 npduNumber := ?,
1673 segmentNumber := ?,
1674 npduNumberContinued := ?,
1675 dataSegmentSnUnitdataPdu := payload
1676 }
1677}
1678
1679/* simple case: single segment, no compression */
1680template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1681 pDU_SN_UNITDATA := {
1682 nsapi := nsapi,
1683 moreBit := '0'B,
1684 snPduType := '1'B,
1685 firstSegmentIndicator := '1'B,
1686 spareBit := '0'B,
1687 pcomp := '0000'B,
1688 dcomp := '0000'B,
1689 npduNumber := '0000'B,
1690 segmentNumber := '0000'B,
1691 npduNumberContinued := '00'O,
1692 dataSegmentSnUnitdataPdu := payload
1693 }
1694}
1695
1696/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
Harald Weltea5c71cd2020-06-17 22:12:04 +02001697private 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 +02001698runs on BSSGP_ConnHdlr {
Harald Weltea5c71cd2020-06-17 22:12:04 +02001699 timer T := 5.0;
Harald Welte37692d82018-02-18 15:21:34 +01001700 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1701 f_gtpu_send(apars, payload);
Harald Weltea5c71cd2020-06-17 22:12:04 +02001702 T.start;
Harald Welte37692d82018-02-18 15:21:34 +01001703 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1704 alt {
Alexander Couzensb1ce1182019-09-15 22:43:40 +02001705 [] as_xid(apars, ran_index);
1706 //[] BSSGP[ran_index].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
Harald Weltea5c71cd2020-06-17 22:12:04 +02001707 [expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload));
1708 [expect_fwd] T.timeout {
1709 setverdict(fail, "Timeout waiting for GTP-U to appear on BSSGP");
1710 mtc.stop;
1711 }
1712 [not expect_fwd] BSSGP[ran_index].receive(tr_SN_UD(apars.nsapi, payload)) {
1713 setverdict(fail, "GTP-U forwarded to BSSGP but not expected")
1714 mtc.stop;
1715 }
1716 [not expect_fwd] T.timeout {}
Harald Welte37692d82018-02-18 15:21:34 +01001717 }
1718}
1719
Harald Welte64d6b512020-06-17 16:42:00 +02001720/* Transceive given 'payload' as MO message from Gb -> OsmoSGSN -> GTP */
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01001721private 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 +02001722runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001723 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1724 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1725 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01001726 BSSGP[ran_index].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, n_u));
Harald Welte37692d82018-02-18 15:21:34 +01001727 /* Expect PDU via GTP from SGSN on simulated GGSN */
1728 alt {
1729 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1730 }
1731}
1732
Harald Welteeded9ad2018-02-17 20:57:34 +01001733private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001734 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001735
1736 /* first perform regular attach */
1737 f_TC_attach(id);
1738
1739 f_pdp_ctx_act(apars);
1740}
1741testcase TC_attach_pdp_act() runs on test_CT {
1742 var BSSGP_ConnHdlr vc_conn;
1743 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001744 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001745 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001746 f_cleanup();
Harald Welteeded9ad2018-02-17 20:57:34 +01001747}
Harald Welteb2124b22018-02-16 22:26:56 +01001748
Harald Welte835b15f2018-02-18 14:39:11 +01001749/* PDP Context activation for not-attached subscriber; expect fail */
1750private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001751 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02001752 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 +01001753 apars.apn, apars.pco));
1754 alt {
1755 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Harald Welte955aa942019-05-03 01:29:29 +02001756 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001757 setverdict(pass);
1758 }
1759 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1760 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001761 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001762 }
Harald Welte955aa942019-05-03 01:29:29 +02001763 [] BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001764 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001765 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001766 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001767 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001768 }
1769}
1770testcase TC_pdp_act_unattached() runs on test_CT {
1771 var BSSGP_ConnHdlr vc_conn;
1772 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001773 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001774 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001775 f_cleanup();
Harald Welte835b15f2018-02-18 14:39:11 +01001776}
1777
Harald Welte37692d82018-02-18 15:21:34 +01001778/* ATTACH + PDP CTX ACT + user plane traffic */
1779private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1780 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1781
1782 /* first perform regular attach */
1783 f_TC_attach(id);
1784 /* then activate PDP context */
1785 f_pdp_ctx_act(apars);
1786 /* then transceive a downlink PDU */
1787 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1788 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1789}
1790testcase TC_attach_pdp_act_user() runs on test_CT {
1791 var BSSGP_ConnHdlr vc_conn;
1792 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001793 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001794 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001795 f_cleanup();
Harald Welte37692d82018-02-18 15:21:34 +01001796}
1797
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001798/* ATTACH + PDP CTX ACT; reject from GGSN */
1799private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1800 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1801
1802 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1803 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1804
1805 /* first perform regular attach */
1806 f_TC_attach(id);
1807 /* then activate PDP context */
1808 f_pdp_ctx_act(apars);
1809}
1810testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1811 var BSSGP_ConnHdlr vc_conn;
1812 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001813 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001814 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001815 f_cleanup();
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001816}
Harald Welte835b15f2018-02-18 14:39:11 +01001817
Harald Welte6f203162018-02-18 22:04:55 +01001818/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1819private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1820 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1821
1822 /* first perform regular attach */
1823 f_TC_attach(id);
1824 /* then activate PDP context */
1825 f_pdp_ctx_act(apars);
1826 /* then transceive a downlink PDU */
1827 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1828 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1829
1830 f_pdp_ctx_deact_mo(apars, '00'O);
1831}
1832testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1833 var BSSGP_ConnHdlr vc_conn;
1834 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001835 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 +01001836 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001837 f_cleanup();
Harald Welte6f203162018-02-18 22:04:55 +01001838}
1839
Harald Welte57b9b7f2018-02-18 22:28:13 +01001840/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1841private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1842 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1843
1844 /* first perform regular attach */
1845 f_TC_attach(id);
1846 /* then activate PDP context */
1847 f_pdp_ctx_act(apars);
1848 /* then transceive a downlink PDU */
1849 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1850 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1851
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001852 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001853}
1854testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1855 var BSSGP_ConnHdlr vc_conn;
1856 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001857 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 +01001858 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001859 f_cleanup();
Harald Welte57b9b7f2018-02-18 22:28:13 +01001860}
1861
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001862/* Test MS sending a duplicate Deact PDP Ctx (OS#3956). */
1863private function f_TC_attach_pdp_act_deact_dup(charstring id) runs on BSSGP_ConnHdlr {
1864 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1865 var Gtp1cUnitdata g_ud;
1866 var integer i;
1867 var OCT1 cause_regular_deact := '24'O;
1868
1869 /* first perform regular attach + PDP context act */
1870 f_TC_attach(id);
1871 f_pdp_ctx_act(apars);
1872
1873 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1874 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1875
1876 for (i := 0; i < 2; i := i+1) {
1877 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1878 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1879 log("Received deletePDPContextResponse " & int2str(i) & ", seq_nr=" & int2str(seq_nr));
1880 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1881 }
1882 }
1883
1884 alt {
1885 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1886 setverdict(pass);
1887 }
1888 [] as_xid(apars, 0);
1889 }
1890
1891 /* Make sure second DeactPdpAccept is sent: */
1892 timer T := 2.0;
1893 T.start;
1894 alt {
1895 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1896 setverdict(fail, "Second SM_DEACT_PDP_ACCEPT_MT received");
1897 }
1898 [] T.timeout {
1899 setverdict(pass);
1900 }
1901 }
1902
1903 setverdict(pass);
1904}
1905testcase TC_attach_pdp_act_deact_dup() runs on test_CT {
1906 var BSSGP_ConnHdlr vc_conn;
1907 f_init();
1908 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_dup), testcasename(), g_gb, 46);
1909 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001910 f_cleanup();
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001911}
1912
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001913/* ATTACH + ATTACH (2nd) */
1914private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1915 g_pars.t_guard := 5.0;
1916
1917 /* first perform regular attach */
1918 f_TC_attach(id);
1919
1920 /* second to perform regular attach */
1921 f_TC_attach(id);
1922}
1923
1924
1925testcase TC_attach_second_attempt() runs on test_CT {
1926 var BSSGP_ConnHdlr vc_conn;
1927 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001928 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001929 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001930 f_cleanup();
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001931}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001932
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001933private function f_TC_attach_echo_timeout(charstring id) runs on BSSGP_ConnHdlr {
1934 var Gtp1cUnitdata g_ud;
1935 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1936 var integer seq_nr;
1937
1938 /* first perform regular attach */
1939 f_TC_attach(id);
1940 /* then activate PDP context */
1941 f_pdp_ctx_act(apars);
1942
1943 /* Wait to receive first echo request and send initial Restart counter */
1944 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1945 BSSGP[0].clear;
1946 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1947 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1948 f_sleep(int2float(mp_echo_interval)); /* wait until around next echo is expected */
1949 }
1950
1951 /* At some point next echo request not answered will timeout and SGSN
1952 should drop the pdp ctx. Around T3 (3secs) * 6 (+ extra, a lot due to OS#4178): */
1953 timer T := 3.0 * 6.0 + 16.0;
1954 T.start;
1955 alt {
1956 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1957 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
1958 setverdict(pass);
1959 }
1960 [] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1961 /* SGSN currently doesn't send this message because it expects GGSN to be non-reachable anyway */
1962 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1963 log("Received deletePDPContextRequest seq_nr=" & int2str(seq_nr));
1964 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1965 repeat;
1966 }
1967 [] GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1968 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1969 log("Received EchoRequest seq_nr=" & int2str(seq_nr));
1970 repeat;
1971 }
1972 [] T.timeout {
1973 setverdict(fail, "BSSGP DeactPdpReq not received");
1974 mtc.stop;
1975 }
1976 [] as_xid(apars);
1977 }
1978 T.stop
1979
1980 setverdict(pass);
1981}
1982/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1983testcase TC_attach_echo_timeout() runs on test_CT {
1984 var BSSGP_ConnHdlr vc_conn;
1985 g_use_echo := true;
1986 f_init();
1987 vc_conn := f_start_handler(refers(f_TC_attach_echo_timeout), testcasename(), g_gb, 67, 50.0);
1988 vc_conn.done;
1989 g_use_echo := false;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02001990 f_cleanup();
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001991}
1992
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001993private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001994 var Gtp1cUnitdata g_ud;
1995 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1996
1997 /* first perform regular attach */
1998 f_TC_attach(id);
1999 /* Activate a pdp context against the GGSN */
2000 f_pdp_ctx_act(apars);
2001 /* Wait to receive first echo request and send initial Restart counter */
2002 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
2003 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
2004 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
2005 }
2006 /* Wait to receive second echo request and send incremented Restart
2007 counter. This will fake a restarted GGSN, and pdp ctx allocated
2008 should be released by SGSN */
2009 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
2010 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
2011 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
2012 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
2013 }
2014 var OCT1 cause_network_failure := int2oct(38, 1)
2015 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002016 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true)) {
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002017 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02002018 setverdict(pass);
2019 }
2020 [] as_xid(apars);
2021 }
2022 setverdict(pass);
2023}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002024/* ATTACH + trigger Recovery procedure through EchoResp */
2025testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02002026 var BSSGP_ConnHdlr vc_conn;
2027 g_use_echo := true
2028 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002029 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 +02002030 vc_conn.done;
2031 g_use_echo := false
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002032 f_cleanup();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02002033}
2034
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002035private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
2036 var Gtp1cUnitdata g_ud;
2037 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2038 var integer seq_nr := 23;
2039 var GtpPeer peer;
2040 /* first perform regular attach */
2041 f_TC_attach(id);
2042
2043 /* Use this CTX ACT to send initial Restart counter to SGSN. */
2044 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
2045 apars.exp_rej_cause := '1a'O; /* insufficient resources */
2046 f_pdp_ctx_act(apars, true);
2047
2048 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
2049/* received. */
2050 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
2051
2052 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
2053 would be great to have an active pdp context here before triggering
2054 Recovery, and making sure the the DEACT request is sent by the SGSN.
2055 */
2056
2057 /* Activate a pdp context against the GGSN, send incremented Recovery
2058 IE. This should trigger the recovery path, but still this specific
2059 CTX activation should work. */
2060 apars.exp_rej_cause := omit; /* default value for tests */
2061 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
2062 f_pdp_ctx_act(apars, true);
2063
2064 setverdict(pass);
2065}
2066/* ATTACH + trigger Recovery procedure through CreatePdpResp */
2067testcase TC_attach_restart_ctr_create() runs on test_CT {
2068 var BSSGP_ConnHdlr vc_conn;
2069 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002070 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 +02002071 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002072 f_cleanup();
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002073}
2074
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002075/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
2076private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
2077 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2078 var integer seq_nr := 23;
2079 var GtpPeer peer;
2080 var integer i;
2081
2082 /* first perform regular attach */
2083 f_TC_attach(id);
2084 /* then activate PDP context */
2085 f_pdp_ctx_act(apars);
2086
Alexander Couzens0e510e62018-07-28 23:06:00 +02002087 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002088 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
2089 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
2090
2091 for (i := 0; i < 5; i := i+1) {
2092 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002093 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002094 [] as_xid(apars);
2095 }
2096 }
2097
2098 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
2099
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002100 f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002101 setverdict(pass);
2102}
2103testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
2104 var BSSGP_ConnHdlr vc_conn;
2105 f_init();
2106 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002107 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_mt_t3395_expire), testcasename(), g_gb, 25, 60.0);
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002108 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002109 f_cleanup();
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002110}
2111
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002112/* ATTACH + PDP CTX ACT dropped + retrans */
2113private function f_TC_attach_pdp_act_deact_gtp_retrans(charstring id) runs on BSSGP_ConnHdlr {
2114 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2115 var Gtp1cUnitdata g_ud_first, g_ud_second;
2116 /* first perform regular attach */
2117 f_TC_attach(id);
2118
2119 /* then activate PDP context on the Gb side */
2120 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
2121 apars.apn, apars.pco), 0);
2122
2123 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_first {}
2124 log("First createPDPContextRequest received, dropping & waiting for retransmission");
2125 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_second {
2126 if (g_ud_first != g_ud_second) {
2127 setverdict(fail, "Retransmitted GTP message createPDPContextRequest is different from original one!");
2128 mtc.stop;
2129 }
2130 f_process_gtp_ctx_act_req(apars, g_ud_second.gtpc);
2131 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
2132 GTP.send(ts_GTPC_CreatePdpResp(g_ud_second.peer, seq_nr,
2133 apars.sgsn_tei_c, apars.gtp_resp_cause,
2134 apars.ggsn_tei_c, apars.ggsn_tei_u,
2135 apars.nsapi,
2136 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
2137 omit, omit));
2138 }
Harald Welte955aa942019-05-03 01:29:29 +02002139 BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT) {}
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002140
2141 /* Now the same with Deact */
2142 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, '00'O, false, omit), 0);
2143 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_first {}
2144 log("First deletePDPContextRequest received, dropping & waiting for retransmission");
2145 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_second {
2146 if (g_ud_first != g_ud_second) {
2147 setverdict(fail, "Retransmitted GTP message deletePDPContextRequest is different from original one!");
2148 mtc.stop;
2149 }
2150 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
2151 BSSGP[0].clear;
2152 GTP.send(ts_GTPC_DeletePdpResp(g_ud_second.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
2153 }
2154 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002155 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002156 setverdict(pass);
2157 }
2158 [] as_xid(apars, 0);
2159 }
2160
2161 setverdict(pass);
2162}
2163testcase TC_attach_pdp_act_deact_gtp_retrans() runs on test_CT {
2164 var BSSGP_ConnHdlr vc_conn;
2165 f_init();
2166 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans), testcasename(), g_gb, 27);
2167 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002168 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002169}
2170
2171/* Test that SGSN GTP response retransmit queue works fine */
2172private function f_TC_attach_pdp_act_deact_gtp_retrans_resp(charstring id) runs on BSSGP_ConnHdlr {
2173 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2174 var integer seq_nr := 23;
2175 var Gtp1cUnitdata g_ud_first, g_ud_second;
2176 var template Gtp1cUnitdata g_delete_req;
2177 /* first perform regular attach + PDP context act */
2178 f_TC_attach(id);
2179 f_pdp_ctx_act(apars);
2180
2181 /* Now perform an MT DeleteCtxReq and emulate GGSN didn't receive response and sends a duplicated DeleteCtxReq */
2182 BSSGP[0].clear;
2183 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
2184 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B);
2185 GTP.send(g_delete_req);
2186 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002187 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002188 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), 0);
2189 }
2190 [] as_xid(apars, 0);
2191 }
2192 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_first {
2193 if (g_ud_first.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != '80'O) {
2194 setverdict(fail, "Received deletePDPContextResponse cause is not 'Request accepted'");
2195 mtc.stop;
2196 }
2197 };
2198
2199 /* Send duplicate DeleteCtxReq */
2200 log("First deletePDPContextResponse received, dropping & retransmitting retransmission of deletePDPContextRequest");
2201 GTP.send(g_delete_req);
2202 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_second {
2203 if (g_ud_first != g_ud_second) {
2204 setverdict(fail, "Retransmitted GTP message deletePDPContextResponse is different from original one!");
2205 mtc.stop;
2206 }
2207 }
2208
2209 /* Let's send now a new DeleteCtxReq (increased seq_nr) to make sure it
2210 * is handled differently by SGSN (expect "non-existent" cause) */
2211 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr + 1, apars.sgsn_tei_c, apars.nsapi, '1'B);
2212 GTP.send(g_delete_req);
2213 /* Response with cause "non-existent" must be sent with TEID 0 according to specs */
2214 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, '00000000'O)) -> value g_ud_second {
2215 if (g_ud_second.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != 'C0'O) {
2216 setverdict(fail, "Received deletePDPContextResponse cause is not 'Non-existent'");
2217 mtc.stop;
2218 }
2219 }
2220
2221 setverdict(pass);
2222}
2223testcase TC_attach_pdp_act_deact_gtp_retrans_resp() runs on test_CT {
2224 var BSSGP_ConnHdlr vc_conn;
2225 f_init();
2226 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans_resp), testcasename(), g_gb, 28);
2227 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002228 f_cleanup();
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002229}
2230
Alexander Couzens5e307b42018-05-22 18:12:20 +02002231private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
2232 /* MS: perform regular attach */
2233 f_TC_attach(id);
2234
2235 /* HLR: cancel the location request */
2236 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
2237 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02002238
2239 /* ensure no Detach Request got received */
2240 timer T := 5.0;
2241 T.start;
2242 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002243 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(*, *, *)) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002244 T.stop;
2245 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02002246 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002247 }
2248 [] T.timeout {
2249 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02002250 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02002251 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02002252 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02002253 repeat;
2254 }
2255 }
2256}
2257
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002258/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
2259private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
2260 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2261
2262 /* first perform regular attach */
2263 f_TC_attach(id);
2264 /* then activate PDP context */
2265 f_pdp_ctx_act(apars);
2266 /* then transceive a downlink PDU */
2267 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
2268
2269 /* Send Error indication as response from upload PDU and expect deact towards MS */
2270 f_pdp_ctx_deact_mt(apars, true);
2271}
2272testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
2273 var BSSGP_ConnHdlr vc_conn;
2274 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002275 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 +02002276 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002277 f_cleanup();
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002278}
2279
Alexander Couzens5e307b42018-05-22 18:12:20 +02002280testcase TC_hlr_location_cancel_request_update() runs on test_CT {
2281 /* MS <-> SGSN: GMM Attach
2282 * HLR -> SGSN: Cancel Location Request
2283 * HLR <- SGSN: Cancel Location Ack
2284 */
2285 var BSSGP_ConnHdlr vc_conn;
2286 f_init();
2287 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002288 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02002289 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002290 f_cleanup();
Alexander Couzens5e307b42018-05-22 18:12:20 +02002291}
2292
2293
Alexander Couzensc87967a2018-05-22 16:09:54 +02002294private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
2295 /* MS: perform regular attach */
2296 f_TC_attach(id);
2297
2298 /* HLR: cancel the location request */
2299 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
2300 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
2301 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
2302
2303 /* MS: receive a Detach Request */
Harald Welte955aa942019-05-03 01:29:29 +02002304 BSSGP[0].receive(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002305 f_send_l3(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002306
2307 setverdict(pass);
2308}
2309
2310testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
2311 /* MS <-> SGSN: GMM Attach
2312 * HLR -> SGSN: Cancel Location Request
2313 * HLR <- SGSN: Cancel Location Ack
2314 * MS <- SGSN: Detach Request
2315 * SGSN-> MS: Detach Complete
2316 */
2317 var BSSGP_ConnHdlr vc_conn;
2318 f_init();
2319 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002320 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02002321 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002322 f_cleanup();
Alexander Couzensc87967a2018-05-22 16:09:54 +02002323}
2324
2325
Alexander Couzens6c47f292018-05-22 17:09:49 +02002326private function f_hlr_location_cancel_request_unknown_subscriber(
2327 charstring id,
2328 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
2329
2330 /* HLR: cancel the location request */
2331 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
2332
2333 /* cause 2 = IMSI_UNKNOWN */
2334 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
2335
2336 setverdict(pass);
2337}
2338
2339private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002340 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002341}
2342
2343testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
2344 /* HLR -> SGSN: Cancel Location Request
2345 * HLR <- SGSN: Cancel Location Error
2346 */
2347
2348 var BSSGP_ConnHdlr vc_conn;
2349 f_init();
2350 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002351 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 +02002352 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002353 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002354}
2355
2356private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02002357 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02002358}
2359
2360testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
2361 /* HLR -> SGSN: Cancel Location Request
2362 * HLR <- SGSN: Cancel Location Error
2363 */
2364
2365 var BSSGP_ConnHdlr vc_conn;
2366 f_init();
2367 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002368 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 +02002369 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002370 f_cleanup();
Alexander Couzens6c47f292018-05-22 17:09:49 +02002371}
2372
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002373private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
2374 f_TC_attach(id);
2375 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2376}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002377
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002378testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
2379 /* MS <-> SGSN: Attach
2380 * MS -> SGSN: Detach Req (Power off)
2381 * VTY -> SGSN: Check if MS is NOT in subscriber cache
2382 */
2383 var BSSGP_ConnHdlr vc_conn;
2384 var integer id := 33;
2385 var charstring imsi := hex2str(f_gen_imsi(id));
2386
2387 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02002388 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002389 vc_conn.done;
2390
2391 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002392 f_cleanup();
Alexander Couzens49bb4b42018-06-05 16:28:36 +02002393}
Alexander Couzens6c47f292018-05-22 17:09:49 +02002394
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002395/* Attempt an attach, but loose the Identification Request (IMEI) */
2396private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
2397 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002398 var MobileIdentityLV mi;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002399
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002400 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 +02002401
2402 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002403 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002404 /* break */
2405 }
Harald Welte955aa942019-05-03 01:29:29 +02002406 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002407 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002408 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002409 repeat;
2410 }
Harald Welte955aa942019-05-03 01:29:29 +02002411 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002412 /* ignore ID REQ IMEI */
2413 count_req := count_req + 1;
2414 repeat;
2415 }
2416 }
2417 if (count_req != 5) {
2418 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002419 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002420 }
2421 setverdict(pass);
2422}
2423
2424testcase TC_attach_no_imei_response() runs on test_CT {
2425 /* MS -> SGSN: Attach Request IMSI
2426 * MS <- SGSN: Identity Request IMSI (optional)
2427 * MS -> SGSN: Identity Response IMSI (optional)
2428 * MS <- SGSN: Identity Request IMEI
2429 * MS -x SGSN: no response
2430 * MS <- SGSN: re-send: Identity Request IMEI 4x
2431 * MS <- SGSN: Attach Reject
2432 */
2433 var BSSGP_ConnHdlr vc_conn;
2434 f_init();
2435 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002436 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 +02002437 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002438 f_cleanup();
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002439}
2440
Alexander Couzens53f20562018-06-12 16:24:12 +02002441/* Attempt an attach, but loose the Identification Request (IMSI) */
2442private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
2443 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002444 var MobileIdentityLV mi;
Alexander Couzens53f20562018-06-12 16:24:12 +02002445
2446 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
2447 g_pars.p_tmsi := 'c0000035'O;
2448
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002449 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 +02002450
2451 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002452 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002453 /* break */
2454 }
Harald Welte955aa942019-05-03 01:29:29 +02002455 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002456 /* ignore ID REQ IMSI */
2457 count_req := count_req + 1;
2458 repeat;
2459 }
Harald Welte955aa942019-05-03 01:29:29 +02002460 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002461 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002462 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02002463 repeat;
2464 }
2465 }
2466 if (count_req != 5) {
2467 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002468 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02002469 }
2470 setverdict(pass);
2471}
2472
2473testcase TC_attach_no_imsi_response() runs on test_CT {
2474 /* MS -> SGSN: Attach Request TMSI (unknown)
2475 * MS <- SGSN: Identity Request IMEI (optional)
2476 * MS -> SGSN: Identity Response IMEI (optional)
2477 * MS <- SGSN: Identity Request IMSI
2478 * MS -x SGSN: no response
2479 * MS <- SGSN: re-send: Identity Request IMSI 4x
2480 * MS <- SGSN: Attach Reject
2481 */
2482 var BSSGP_ConnHdlr vc_conn;
2483 f_init();
2484 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002485 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 +02002486 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002487 f_cleanup();
Alexander Couzens53f20562018-06-12 16:24:12 +02002488}
2489
Alexander Couzenscf818962018-06-05 18:00:00 +02002490private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
2491 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
2492}
2493
2494testcase TC_attach_check_subscriber_list() runs on test_CT {
2495 /* MS <-> SGSN: Attach
2496 * VTY -> SGSN: Check if MS is in subscriber cache
2497 */
2498 var BSSGP_ConnHdlr vc_conn;
2499 var integer id := 34;
2500 var charstring imsi := hex2str(f_gen_imsi(id));
2501
2502 f_init();
2503 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002504 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02002505 vc_conn.done;
2506
2507 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
2508 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002509 f_cleanup();
Alexander Couzenscf818962018-06-05 18:00:00 +02002510}
2511
Alexander Couzensf9858652018-06-07 16:14:53 +02002512private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
2513 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002514 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensf9858652018-06-07 16:14:53 +02002515
2516 /* unregister the old IMSI */
2517 f_bssgp_client_unregister(g_pars.imsi);
2518 /* Simulate a foreign IMSI */
Alexander Couzens03d12242018-08-07 16:13:52 +02002519 g_pars.imsi := '001010123456700'H;
Harald Welte5339b2e2020-10-04 22:52:56 +02002520 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Alexander Couzensf9858652018-06-07 16:14:53 +02002521
2522 /* there is no auth */
2523 g_pars.net.expect_auth := false;
2524
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002525 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02002526 f_gmm_auth();
2527 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002528 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzensf9858652018-06-07 16:14:53 +02002529 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02002530 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02002531 }
Harald Welte955aa942019-05-03 01:29:29 +02002532 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) -> value l3_mt {
2533 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002534 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02002535 setverdict(pass);
2536 }
2537 }
2538}
Alexander Couzens03d12242018-08-07 16:13:52 +02002539
2540private function f_TC_attach_closed_add_vty(charstring id) runs on BSSGP_ConnHdlr {
2541
2542 f_TC_attach_closed_foreign(id);
2543 f_TC_attach_closed_imsi_added(id);
2544
2545}
2546
2547
Alexander Couzensf9858652018-06-07 16:14:53 +02002548testcase TC_attach_closed_add_vty() runs on test_CT {
2549 /* VTY-> SGSN: policy close
2550 * MS -> SGSN: Attach Request
2551 * MS <- SGSN: Identity Request IMSI
2552 * MS -> SGSN: Identity Response IMSI
2553 * MS <- SGSN: Attach Reject
2554 * VTY-> SGSN: policy imsi-acl add IMSI
2555 * MS -> SGSN: Attach Request
2556 * MS <- SGSN: Identity Request IMSI
2557 * MS -> SGSN: Identity Response IMSI
2558 * MS <- SGSN: Identity Request IMEI
2559 * MS -> SGSN: Identity Response IMEI
2560 * MS <- SGSN: Attach Accept
2561 */
2562 var BSSGP_ConnHdlr vc_conn;
2563 f_init();
2564 f_sleep(1.0);
2565 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
2566 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
Alexander Couzens03d12242018-08-07 16:13:52 +02002567 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456700");
2568 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456700");
Alexander Couzensf9858652018-06-07 16:14:53 +02002569 /* test with foreign IMSI: Must Reject */
Alexander Couzens03d12242018-08-07 16:13:52 +02002570 vc_conn := f_start_handler(refers(f_TC_attach_closed_add_vty), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02002571 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002572 f_cleanup();
Alexander Couzensf9858652018-06-07 16:14:53 +02002573}
2574
Alexander Couzens0085bd72018-06-12 19:08:44 +02002575/* Attempt an attach, but never answer a Attach Complete */
2576private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
2577 var integer count_req := 0;
2578
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002579 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 +02002580 f_gmm_auth();
Pau Espin Pedrol4b290a22019-09-10 19:49:41 +02002581 /* Expect SGSN to perform LU with HLR */
2582 f_gmm_gsup_lu_isd();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002583
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002584 timer T := 10.0;
2585 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002586 alt {
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002587 [] T.timeout {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002588 /* break */
2589 }
Harald Welte955aa942019-05-03 01:29:29 +02002590 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002591 /* ignore */
2592 count_req := count_req + 1;
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002593 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002594 repeat;
2595 }
2596 }
2597 if (count_req != 5) {
2598 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02002599 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002600 }
2601 setverdict(pass);
2602}
2603
2604testcase TC_attach_check_complete_resend() runs on test_CT {
2605 /* MS -> SGSN: Attach Request IMSI
2606 * MS <- SGSN: Identity Request *
2607 * MS -> SGSN: Identity Response *
2608 * MS <- SGSN: Attach Complete 5x
2609 */
2610 var BSSGP_ConnHdlr vc_conn;
2611 f_init();
2612 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002613 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 +02002614 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002615 f_cleanup();
Alexander Couzens0085bd72018-06-12 19:08:44 +02002616}
2617
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002618friend function f_routing_area_update(RoutingAreaIdentificationV ra, integer ran_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02002619 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002620 var PDU_DTAP_PS_MT mt;
2621 var template OCT4 p_tmsi := omit;
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002622
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002623 if (is_iu(ran_index)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002624 p_tmsi := g_pars.p_tmsi;
2625 }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002626 /* then send RAU */
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002627 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 +02002628 alt {
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002629 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_ACCEPT) -> value l3_mt {
2630 f_process_rau_accept(l3_mt.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2631 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002632 setverdict(pass);
2633 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002634 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_ACCEPT)) -> value mt {
2635 f_process_rau_accept(mt.dtap.msgs.gprs_mm.routingAreaUpdateAccept, ran_index);
2636 f_send_l3(ts_GMM_RAU_COMPL, ran_index);
Alexander Couzens5d56f522019-09-03 12:36:18 +02002637 setverdict(pass);
2638 }
2639
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002640 [is_gb(ran_index)] BSSGP[ran_index].receive(tr_GMM_RAU_REJECT) {
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002641 setverdict(fail, "Unexpected RAU Reject");
2642 mtc.stop;
2643 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002644 [is_iu(ran_index)] BSSAP.receive(tr_PDU_DTAP_PS_MT(tr_GMM_RAU_REJECT)) {
Alexander Couzens5d56f522019-09-03 12:36:18 +02002645 setverdict(fail, "Unexpected RAU Reject");
2646 mtc.stop;
2647 }
2648
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002649 [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 +02002650 key_sts := ?)) {
2651 var IntegrityProtectionAlgorithm uia_chosen := 0; /* 0 = standard_UMTS_integrity_algorithm_UIA1 */
2652 BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
Alexander Couzensed61ae82019-09-15 23:18:08 +02002653 BSSAP.receive(tr_RANAP_CommonId(imsi_hex2oct(g_pars.imsi)))
Daniel Willmann1c116112020-01-22 17:48:31 +01002654 repeat;
Alexander Couzens5d56f522019-09-03 12:36:18 +02002655 }
Alexander Couzensbe76d9c2019-09-15 22:48:03 +02002656 [is_gb(ran_index)] BSSGP[ran_index].receive { repeat; }
2657 [is_iu(ran_index)] BSSAP.receive { repeat; }
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002658 }
2659}
2660
Alexander Couzensbfda9212018-07-31 03:17:33 +02002661private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbfda9212018-07-31 03:17:33 +02002662 /* first perform regular attach */
2663 f_TC_attach(id);
2664
2665 /* then send RAU */
2666 f_routing_area_update(g_pars.ra);
2667
2668 /* do another RAU */
2669 f_routing_area_update(g_pars.ra);
2670
2671 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2672}
2673
2674testcase TC_attach_rau_a_a() runs on test_CT {
2675 /* MS <-> SGSN: Successful Attach
2676 * MS -> SGSN: Routing Area Update Request
2677 * MS <- SGSN: Routing Area Update Accept
2678 * MS -> SGSN: Routing Area Update Request
2679 * MS <- SGSN: Routing Area Update Accept
2680 * MS -> SGSN: Detach (PowerOff)
2681 */
2682 var BSSGP_ConnHdlr vc_conn;
2683 f_init();
2684 f_sleep(1.0);
2685 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
2686 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002687 f_cleanup();
Alexander Couzensbfda9212018-07-31 03:17:33 +02002688}
2689
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002690private function f_TC_attach_rau_a_b(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002691 f_TC_attach(id);
2692
2693 log("attach complete sending rau");
2694 f_routing_area_update(g_pars.ra, 0);
2695
2696 log("rau complete unregistering");
2697 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte5339b2e2020-10-04 22:52:56 +02002698 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002699
2700 log("sending second RAU via different RA");
2701 f_routing_area_update(f_cellid_to_RAI(g_pars.bssgp_cell_id[1]), 1);
2702
2703 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true, 1);
2704}
2705
2706testcase TC_attach_rau_a_b() runs on test_CT {
2707 /* MS <-> SGSN: Successful Attach
2708 * MS -> SGSN: Routing Area _a_ Update Request
2709 * MS <- SGSN: Routing Area _a_ Update Accept
2710 * MS -> SGSN: Routing Area _b_ Update Request
2711 * MS <- SGSN: Routing Area _b_ Update Accept
2712 * MS -> SGSN: Detach (PowerOff)
2713 */
2714 var BSSGP_ConnHdlr vc_conn;
2715 f_init();
2716 f_sleep(1.0);
2717 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_b), testcasename(), g_gb, 38);
2718 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002719 f_cleanup();
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002720}
2721
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002722private function f_TC_attach_gmm_attach_req_while_gmm_attach(charstring id) runs on BSSGP_ConnHdlr {
2723 var integer count_req := 0;
Vadim Yanitskiy98bb2d52020-03-28 00:57:21 +07002724 var MobileIdentityLV mi;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002725 var RoutingAreaIdentificationV rand_rai := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002726 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002727
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002728 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002729
2730 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002731 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002732 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2733 mtc.stop;
2734 }
Harald Welte955aa942019-05-03 01:29:29 +02002735 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002736 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002737 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002738 repeat;
2739 }
Harald Welte955aa942019-05-03 01:29:29 +02002740 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002741 /* send out a second GMM_Attach Request.
2742 * If the SGSN follows the rules, this 2nd ATTACH REQ should be ignored, because
2743 * of the same content */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002744 f_send_l3(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002745 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002746 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002747 }
2748 }
2749 f_sleep(1.0);
2750
2751 /* we've sent already a IMEI answer, we should NOT asked again for IMEI */
2752 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002753 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002754 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002755 f_send_l3(ts_GMM_ID_RESP(mi));
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002756 repeat;
2757 }
Harald Welte955aa942019-05-03 01:29:29 +02002758 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002759 setverdict(fail, "Unexpected GMM ID REQ (IMEI).");
2760 mtc.stop;
2761 }
Harald Welte955aa942019-05-03 01:29:29 +02002762 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002763 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2764 mtc.stop;
2765 }
Harald Welte955aa942019-05-03 01:29:29 +02002766 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2767 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002768 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002769 setverdict(pass);
2770 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
2771 }
2772 }
2773}
2774
2775testcase TC_attach_gmm_attach_req_while_gmm_attach() runs on test_CT {
2776 /* Testing if the SGSN ignore Attach Request with the exact same content */
2777 /* MS -> SGSN: Attach Request IMSI
2778 * MS <- SGSN: Identity Request IMSI (optional)
2779 * MS -> SGSN: Identity Response IMSI (optional)
2780 * MS <- SGSN: Identity Request IMEI
2781 * MS -> SGSN: Attach Request (2nd)
2782 * MS <- SGSN: Identity Response IMEI
2783 * MS <- SGSN: Attach Accept
2784 * MS -> SGSN: Attach Complete
2785 */
2786 var BSSGP_ConnHdlr vc_conn;
2787 f_init();
2788 f_sleep(1.0);
2789 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
2790 vc_conn := f_start_handler(refers(f_TC_attach_gmm_attach_req_while_gmm_attach), testcasename(), g_gb, 39);
2791 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002792 f_cleanup();
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002793}
2794
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002795private function f_TC_attach_usim_resync(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002796 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2797
2798 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2799
2800 /* send Attach Request */
2801 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2802 * 3G auth vectors */
2803 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2804 /* The thing is, if the solSACapability is 'omit', then the
2805 * revisionLevelIndicatior is at the wrong place! */
2806 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002807 f_send_l3(attach_req);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002808
2809 /* do the auth */
2810 var PDU_L3_MS_SGSN l3_mo;
2811 var PDU_L3_SGSN_MS l3_mt;
2812 var default di := activate(as_mm_identity());
2813
2814 var GSUP_IE auth_tuple;
2815 var template AuthenticationParameterAUTNTLV autn;
2816
2817 g_pars.vec := f_gen_auth_vec_3g();
2818 autn := {
2819 elementIdentifier := '28'O,
2820 lengthIndicator := lengthof(g_pars.vec.autn),
2821 autnValue := g_pars.vec.autn
2822 };
2823 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2824 g_pars.vec.sres,
2825 g_pars.vec.kc,
2826 g_pars.vec.ik,
2827 g_pars.vec.ck,
2828 g_pars.vec.autn,
2829 g_pars.vec.res));
2830 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2831 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2832 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2833
2834 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2835 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002836 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002837
2838 /* send the gmm auth failure with resync IE */
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002839 f_send_l3(ts_GMM_AUTH_FAIL_UMTS_AKA_RESYNC(g_pars.vec.auts));
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002840
2841 /* wait for the GSUP resync request */
2842 GSUP.receive(tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
2843 g_pars.imsi,
2844 g_pars.vec.auts,
2845 g_pars.vec.rand));
2846
2847 /* generate new key material */
2848 g_pars.vec := f_gen_auth_vec_3g();
2849 autn := {
2850 elementIdentifier := '28'O,
2851 lengthIndicator := lengthof(g_pars.vec.autn),
2852 autnValue := g_pars.vec.autn
2853 };
2854
2855 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2856 g_pars.vec.sres,
2857 g_pars.vec.kc,
2858 g_pars.vec.ik,
2859 g_pars.vec.ck,
2860 g_pars.vec.autn,
2861 g_pars.vec.res));
2862 /* send new key material */
2863 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2864
2865 /* wait for the new Auth Request */
2866 auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2867 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002868 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002869 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
2870 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2871 auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2872 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
2873 valueField := substr(g_pars.vec.res, 0, 4)
2874 };
2875 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
2876 elementIdentifier := '21'O,
2877 lengthIndicator := lengthof(g_pars.vec.res) - 4,
2878 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
2879 };
2880 l3_mo := valueof(auth_ciph_resp);
2881 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
2882 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
2883 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
2884 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
2885 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002886 f_send_l3(l3_mo);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002887 deactivate(di);
2888
2889 /* Expect SGSN to perform LU with HLR */
2890 f_gmm_gsup_lu_isd();
2891
Harald Welte955aa942019-05-03 01:29:29 +02002892 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2893 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002894 }
Alexander Couzens4444b5a2019-08-13 13:25:32 +02002895 f_send_l3(ts_GMM_ATTACH_COMPL);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002896 setverdict(pass);
2897}
2898
2899testcase TC_attach_usim_resync() runs on test_CT {
2900 /* MS -> SGSN: Attach Request
2901 * MS <- SGSN: Identity Request IMSI
2902 * MS -> SGSN: Identity Response IMSI
2903 * MS <- SGSN: Identity Request IMEI
2904 * MS -> SGSN: Identity Response IMEI
2905 * HLR<- SGSN: SAI Request
2906 * HLR-> SGSN: SAI Response
2907 * MS <- SGSN: Auth Request
2908 * MS -> SGSN: Auth Failure (with AUTS)
2909 * HLR<- SGSN: SAI Request (with AUTS & RAND)
2910 * HLR-> SGSN: SAI Response (new key material)
2911 * MS <- SGSN: Auth Request (new key material)
2912 * MS -> SGSN: Auth Response
2913 * MS <- SGSN: Attach Accept
2914 * MS -> SGSN: Attach Complete
2915 */
2916 var BSSGP_ConnHdlr vc_conn;
2917 f_init();
2918 f_sleep(1.0);
2919 vc_conn := f_start_handler(refers(f_TC_attach_usim_resync), testcasename(), g_gb, 40);
2920 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02002921 f_cleanup();
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002922}
2923
Eric Wildc555be52021-05-15 19:48:22 +02002924private function f_TC_attach_usim_crypt(OCT1 netcap_a2345, BIT3 auth_req_ciph) runs on BSSGP_ConnHdlr {
2925 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2926
2927 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2928 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.spare_octets := netcap_a2345; /* GEA2345... */
2929
2930 /* send Attach Request */
2931 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2932 * 3G auth vectors */
2933 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2934 /* The thing is, if the solSACapability is 'omit', then the
2935 * revisionLevelIndicatior is at the wrong place! */
2936 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
2937 f_send_l3(attach_req);
2938
2939 /* do the auth */
2940 var PDU_L3_MS_SGSN l3_mo;
2941 var PDU_L3_SGSN_MS l3_mt;
2942 var default di := activate(as_mm_identity());
2943
2944 var GSUP_IE auth_tuple;
2945 var template AuthenticationParameterAUTNTLV autn;
2946
2947 g_pars.vec := f_gen_auth_vec_3g();
2948 autn := {
2949 elementIdentifier := '28'O,
2950 lengthIndicator := lengthof(g_pars.vec.autn),
2951 autnValue := g_pars.vec.autn
2952 };
2953 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2954 g_pars.vec.sres,
2955 g_pars.vec.kc,
2956 g_pars.vec.ik,
2957 g_pars.vec.ck,
2958 g_pars.vec.autn,
2959 g_pars.vec.res));
2960 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2961 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2962 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2963
2964 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand, auth_req_ciph);
2965 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
2966 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
2967
2968 setverdict(pass);
2969 deactivate(di);
2970}
2971
2972private function f_TC_attach_usim_a54_a54(charstring id) runs on BSSGP_ConnHdlr {
2973 f_TC_attach_usim_crypt('10'O, '100'B);
2974}
2975
2976private function f_TC_attach_usim_a54_a53(charstring id) runs on BSSGP_ConnHdlr {
2977 f_TC_attach_usim_crypt('20'O, '011'B);
2978}
2979
2980private function f_TC_attach_usim_a53_a54(charstring id) runs on BSSGP_ConnHdlr {
2981 f_TC_attach_usim_crypt('30'O, '011'B);
2982}
2983
2984private function f_TC_attach_usim_a50_a54(charstring id) runs on BSSGP_ConnHdlr {
2985 f_TC_attach_usim_crypt('30'O, '000'B);
2986}
2987
2988private function f_TC_attach_usim_a54_a50(charstring id) runs on BSSGP_ConnHdlr {
2989 f_TC_attach_usim_crypt('00'O, '000'B);
2990}
2991
2992testcase TC_attach_usim_a54_a54() runs on test_CT {
2993 var BSSGP_ConnHdlr vc_conn;
2994 f_init();
2995 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02002996 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02002997 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a54), testcasename(), g_gb, 40);
2998 vc_conn.done;
2999 f_cleanup();
3000}
3001
3002testcase TC_attach_usim_a54_a53() runs on test_CT {
3003 var BSSGP_ConnHdlr vc_conn;
3004 f_init();
3005 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02003006 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02003007 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a53), testcasename(), g_gb, 40);
3008 vc_conn.done;
3009 f_cleanup();
3010}
3011
3012testcase TC_attach_usim_a53_a54() runs on test_CT {
3013 var BSSGP_ConnHdlr vc_conn;
3014 f_init();
3015 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02003016 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3");
Eric Wildc555be52021-05-15 19:48:22 +02003017 vc_conn := f_start_handler(refers(f_TC_attach_usim_a53_a54), testcasename(), g_gb, 40);
3018 vc_conn.done;
3019 f_cleanup();
3020}
3021
3022testcase TC_attach_usim_a50_a54() runs on test_CT {
3023 var BSSGP_ConnHdlr vc_conn;
3024 f_init();
3025 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02003026 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0");
Eric Wildc555be52021-05-15 19:48:22 +02003027 vc_conn := f_start_handler(refers(f_TC_attach_usim_a50_a54), testcasename(), g_gb, 40);
3028 vc_conn.done;
3029 f_cleanup();
3030}
3031
3032testcase TC_attach_usim_a54_a50() runs on test_CT {
3033 var BSSGP_ConnHdlr vc_conn;
3034 f_init();
3035 f_sleep(1.0);
Vadim Yanitskiy60fcc632021-07-04 01:02:29 +02003036 f_vty_config(SGSNVTY, "sgsn", "encryption gea 0 3 4");
Eric Wildc555be52021-05-15 19:48:22 +02003037 vc_conn := f_start_handler(refers(f_TC_attach_usim_a54_a50), testcasename(), g_gb, 40);
3038 vc_conn.done;
3039 f_cleanup();
3040}
Harald Weltea05b8072019-04-23 22:35:05 +02003041
3042/* Send LLC NULL to see if the SGSN survives it (OS#3952) */
3043private function f_TC_llc_null(charstring id) runs on BSSGP_ConnHdlr {
3044 f_gmm_attach(false, false);
3045 f_sleep(1.0);
3046 f_send_llc(ts_LLC_NULL('0'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
3047 /* try to detach to check if SGSN is still alive */
3048 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
3049}
3050testcase TC_llc_null() runs on test_CT {
3051 var BSSGP_ConnHdlr vc_conn;
3052 f_init();
3053 f_sleep(1.0);
3054 vc_conn := f_start_handler(refers(f_TC_llc_null), testcasename(), g_gb, 41);
3055 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003056 f_cleanup();
Harald Weltea05b8072019-04-23 22:35:05 +02003057}
3058
Harald Welte645a1512019-04-23 23:18:23 +02003059/* Send LLC SABM to see if the SGSN rejects it properly with DM */
3060private function f_TC_llc_sabm_dm_llgmm(charstring id) runs on BSSGP_ConnHdlr {
3061 f_gmm_attach(false, false);
3062 f_sleep(1.0);
3063 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02003064 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LLGMM, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02003065 setverdict(pass);
3066}
3067testcase TC_llc_sabm_dm_llgmm() runs on test_CT {
3068 var BSSGP_ConnHdlr vc_conn;
3069 f_init();
3070 f_sleep(1.0);
3071 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_llgmm), testcasename(), g_gb, 42);
3072 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003073 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02003074}
3075
3076/* Send LLC SABM to see if the SGSN rejects it properly with DM */
3077private function f_TC_llc_sabm_dm_ll5(charstring id) runs on BSSGP_ConnHdlr {
3078 f_gmm_attach(false, false);
3079 f_sleep(1.0);
3080 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LL5, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02003081 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LL5, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02003082 setverdict(pass);
3083}
3084testcase TC_llc_sabm_dm_ll5() runs on test_CT {
3085 var BSSGP_ConnHdlr vc_conn;
3086 f_init();
3087 f_sleep(1.0);
3088 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_ll5), testcasename(), g_gb, 43);
3089 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003090 f_cleanup();
Harald Welte645a1512019-04-23 23:18:23 +02003091}
3092
Harald Welte2aaac1b2019-05-02 10:02:53 +02003093/* test XID handshake with empty L3 info: expect empty return (some phones require that, OS#3426 */
3094private function f_TC_xid_empty_l3(charstring id) runs on BSSGP_ConnHdlr {
3095 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3096 var template (value) XID_Information xid;
3097 var template XID_Information xid_rx;
3098
3099 /* first perform regular attach */
3100 f_TC_attach(id);
3101 /* then activate PDP context */
3102 f_pdp_ctx_act(apars);
3103
3104 /* start MO XID */
3105 xid := { ts_XID_L3(''O) };
3106 xid_rx := { tr_XID_L3(''O) };
3107 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
3108 alt {
Harald Welte955aa942019-05-03 01:29:29 +02003109 [] BSSGP[0].receive(tr_LLC_XID(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02003110 [] as_xid(apars);
3111 }
3112 setverdict(pass);
3113}
3114testcase TC_xid_empty_l3() runs on test_CT {
3115 var BSSGP_ConnHdlr vc_conn;
3116 f_init();
3117 f_sleep(1.0);
3118 vc_conn := f_start_handler(refers(f_TC_xid_empty_l3), testcasename(), g_gb, 44);
3119 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003120 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02003121}
3122
3123private function f_TC_xid_n201u(charstring id) runs on BSSGP_ConnHdlr {
3124 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3125 var template (value) XID_Information xid;
3126 var template XID_Information xid_rx;
3127
3128 /* first perform regular attach */
3129 f_TC_attach(id);
3130 /* then activate PDP context */
3131 f_pdp_ctx_act(apars);
3132
3133 /* start MO XID */
3134 xid := { ts_XID_N201U(1234) };
3135 xid_rx := { tr_XID_N201U(1234) };
3136 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
3137 alt {
Harald Welte955aa942019-05-03 01:29:29 +02003138 [] BSSGP[0].receive(tr_LLC_XID_MT_RSP(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02003139 [] as_xid(apars);
3140 }
3141 setverdict(pass);
3142}
3143testcase TC_xid_n201u() runs on test_CT {
3144 var BSSGP_ConnHdlr vc_conn;
3145 f_init();
3146 f_sleep(1.0);
3147 vc_conn := f_start_handler(refers(f_TC_xid_n201u), testcasename(), g_gb, 45);
3148 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003149 f_cleanup();
Harald Welte2aaac1b2019-05-02 10:02:53 +02003150}
3151
Alexander Couzens6bee0872019-05-11 01:48:50 +02003152private function f_TC_attach_pdp_act_gmm_detach(charstring id) runs on BSSGP_ConnHdlr {
3153 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3154
3155 /* first perform regular attach */
3156 f_TC_attach(id);
3157 /* then activate PDP context */
3158 f_pdp_ctx_act(apars);
3159 /* do a normal detach */
3160 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
3161}
3162
3163testcase TC_attach_pdp_act_gmm_detach() runs on test_CT {
3164 /* MS -> SGSN: Attach Request
3165 * MS <-> SGSN: [..]
3166 * MS -> SGSN: Attach Complete
3167 * MS -> SGSN: PDP Activate Request
3168 * MS <- SGSN: PDP Activate Accept
3169 * MS -> SGSN: GMM Detach Request
3170 * MS <- SGSN: GMM Detach Accept
3171 */
3172 var BSSGP_ConnHdlr vc_conn;
3173 f_init();
3174 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_gmm_detach), testcasename(), g_gb, 26);
3175 vc_conn.done;
Pau Espin Pedrolce0d6152019-08-27 19:07:27 +02003176 f_cleanup();
Alexander Couzens6bee0872019-05-11 01:48:50 +02003177}
Harald Welte645a1512019-04-23 23:18:23 +02003178
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003179private function f_TC_attach_req_id_req_ra_update(charstring id) runs on BSSGP_ConnHdlr {
3180 var RoutingAreaIdentificationV old_ra := f_random_RAI();
3181 var RoutingAreaIdentificationV new_ra := f_random_RAI();
3182 while (old_ra == new_ra) { new_ra := f_random_RAI(); };
3183 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
3184 var PDU_L3_SGSN_MS l3_mt;
3185
3186 f_send_l3(attach_req, 0);
3187
3188 BSSGP[0].receive(tr_GMM_ID_REQ(?));
3189
3190 f_send_l3(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, new_ra, false, omit, omit));
3191 alt {
3192 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) {
3193 setverdict(pass);
3194 }
3195 [] BSSGP[0].receive { repeat; }
3196 }
3197}
3198
3199/* This test triggers crash in osmo-sgsn before osmo-sgsn.git I64fa5cf1b427d3abb99e553e584897261a827ce6.
3200 * See OS#3957 and OS#4245 for more information.
3201 */
3202testcase TC_attach_req_id_req_ra_update() runs on test_CT {
3203 /*
3204 * MS --> SGSN: Attach Req (TMSI, RAI=901-70-356-101)
3205 * MS <-- SGSN: Identity Request (IMEI)
3206 * MS --> SGSN: RA Updating (RAI=901-70-2758-208)
3207 */
3208 var BSSGP_ConnHdlr vc_conn;
3209 f_init();
3210 vc_conn := f_start_handler(refers(f_TC_attach_req_id_req_ra_update), testcasename(), g_gb, 47);
3211 vc_conn.done;
3212 f_cleanup();
3213}
3214
Harald Welte8e5932e2020-06-17 22:12:54 +02003215private altstep as_nopaging_ps(integer ran_idx := 0) runs on BSSGP_ConnHdlr {
3216var PDU_BSSGP rx;
3217[] BSSGP_SIG[ran_idx].receive(tr_BSSGP_PS_PAGING(?)) -> value rx {
3218 setverdict(fail, "Received unexpected PS PAGING: ", rx);
3219 mtc.stop;
3220 }
3221}
3222
3223/* SUSPEND, then DL traffic: should not pass + no paging expected */
3224private function f_TC_suspend_nopaging(charstring id) runs on BSSGP_ConnHdlr {
3225 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3226 var default d;
3227
3228 /* first perform regular attach */
3229 f_TC_attach(id);
3230 /* then activate PDP context */
3231 f_pdp_ctx_act(apars);
3232 /* then transceive a downlink PDU */
3233 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3234
3235 /* now suspend GPRS */
3236 f_bssgp_suspend();
3237
3238 d := activate(as_nopaging_ps());
3239
3240 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3241 * nor any related paging requests */
3242 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3243
3244 deactivate(d);
3245}
3246testcase TC_suspend_nopaging() runs on test_CT {
3247 var BSSGP_ConnHdlr vc_conn;
3248 f_init();
3249 f_sleep(1.0);
3250 vc_conn := f_start_handler(refers(f_TC_suspend_nopaging), testcasename(), g_gb, 48);
3251 vc_conn.done;
3252 f_cleanup();
3253}
3254
3255
3256/* SUSPEND, then RESUME: data expected to flow after explicit resume */
3257private function f_TC_suspend_resume(charstring id) runs on BSSGP_ConnHdlr {
3258 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3259 var OCT1 susp_ref;
3260 var default d;
3261
3262 /* first perform regular attach */
3263 f_TC_attach(id);
3264 /* then activate PDP context */
3265 f_pdp_ctx_act(apars);
3266 /* then transceive a downlink PDU */
3267 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3268
3269 /* now suspend GPRS */
3270 susp_ref := f_bssgp_suspend();
3271
3272 d := activate(as_nopaging_ps());
3273
3274 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3275 * nor any related paging requests */
3276 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3277
3278 deactivate(d);
3279
3280 /* resume GPRS */
3281 f_bssgp_resume(susp_ref);
3282
3283 /* now data should be flowing again */
3284 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3285}
3286testcase TC_suspend_resume() runs on test_CT {
3287 var BSSGP_ConnHdlr vc_conn;
3288 f_init();
3289 f_sleep(1.0);
3290 vc_conn := f_start_handler(refers(f_TC_suspend_resume), testcasename(), g_gb, 49);
3291 vc_conn.done;
3292 f_cleanup();
3293}
3294
3295/* SUSPEND, then RAU: data expected to flow after implicit resume */
3296private function f_TC_suspend_rau(charstring id) runs on BSSGP_ConnHdlr {
3297 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3298 var default d;
3299
3300 /* first perform regular attach */
3301 f_TC_attach(id);
3302 /* then activate PDP context */
3303 f_pdp_ctx_act(apars);
3304 /* then transceive a downlink PDU */
3305 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3306
3307 /* now suspend GPRS */
3308 f_bssgp_suspend();
3309
3310 d := activate(as_nopaging_ps());
3311
3312 /* at this point we don't expect any downlink traffic at all, neither actual LLC/SNDCP data,
3313 * nor any related paging requests */
3314 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), expect_fwd := false);
3315
3316 deactivate(d);
3317
3318 /* perform RAU (implicit RESUME) */
3319 f_routing_area_update(g_pars.ra);
3320
Harald Welted5836dc2021-03-20 15:40:00 +01003321 /* give SGSN some time to actually receve + process the RAU Complete we sent */
3322 f_sleep(0.5);
3323
Harald Welte8e5932e2020-06-17 22:12:54 +02003324 /* now data should be flowing again */
3325 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3326
3327}
3328testcase TC_suspend_rau() runs on test_CT {
3329 var BSSGP_ConnHdlr vc_conn;
3330 f_init();
3331 f_sleep(1.0);
3332 vc_conn := f_start_handler(refers(f_TC_suspend_rau), testcasename(), g_gb, 50);
3333 vc_conn.done;
3334 f_cleanup();
3335}
3336
3337
3338/* wait for T3314 expiration and check that PS PAGING is created on DL PDU */
3339private function f_TC_paging_ps(charstring id) runs on BSSGP_ConnHdlr {
3340 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3341 var default d;
3342
3343 /* first perform regular attach */
3344 f_TC_attach(id);
3345 /* then activate PDP context */
3346 f_pdp_ctx_act(apars);
3347 /* then transceive a downlink PDU */
3348 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3349
3350 /* now wait for T3314 expiration (test_CT below has reduced it to 3s) */
3351 f_sleep(5.0);
3352
3353 /* now data should be flowing again, but with PS PAGING */
3354 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
3355 BSSGP_SIG[0].receive(tr_BSSGP_PS_PAGING(?));
3356
3357 /* FIXME: simulate paging response */
3358 /* FIXME: verify PDU actually arrives only after paging response was successful */
3359
3360}
3361testcase TC_paging_ps() runs on test_CT {
3362 var BSSGP_ConnHdlr vc_conn;
3363 f_init();
3364 f_vty_config(SGSNVTY, "sgsn", "timer 3314 3");
3365 f_sleep(1.0);
3366 vc_conn := f_start_handler(refers(f_TC_paging_ps), testcasename(), g_gb, 51);
3367 vc_conn.done;
3368 f_vty_config(SGSNVTY, "sgsn", "timer 3314 default");
3369 f_cleanup();
3370}
3371
Philipp Maier7df55e02020-12-14 23:46:04 +01003372/* Run a RIM single report procedure over the sgsn. Since the SGSN will only do a transparent routing of the
3373 * RIM messages this basically tests if the message is correctly transfered from one GB interface to the
3374 * other and vice versa. */
3375testcase TC_bssgp_rim_single_report() runs on test_CT {
3376 var BSSGP_ConnHdlr vc_conn;
3377 f_init();
Philipp Maier7df55e02020-12-14 23:46:04 +01003378
3379 timer T := 2.0;
3380
3381 var template RIM_Routing_Address dst_addr;
3382 var template RIM_Routing_Address src_addr;
3383 var template RAN_Information_Request_RIM_Container req_cont;
3384 var template RAN_Information_RIM_Container res_cont;
3385 var template PDU_BSSGP bssgp_rim_pdu;
3386 var template PDU_BSSGP bssgp_rim_pdu_expect;
3387
3388 dst_addr := t_RIM_Routing_Address_cid(g_gb[1].cfg.bvc[0].cell_id);
3389 src_addr := t_RIM_Routing_Address_cid(g_gb[0].cfg.bvc[0].cell_id);
Harald Welte8e5932e2020-06-17 22:12:54 +02003390
3391
Philipp Maier7df55e02020-12-14 23:46:04 +01003392 /* Send NACC Ran information request to SGSN at GB interface #0. We epect the SGSN to forward this request
3393 * based on the cell id in dst_addr to GB interface #1. */
3394 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3395 ts_RIM_Sequence_Number(1),
3396 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3397 ts_RIM_Protocol_Version_Number(1),
3398 tsu_RAN_Information_Request_Application_Container_NACC(g_gb[1].cfg.bvc[0].cell_id),
3399 omit);
3400 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3401 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3402 req_cont);
3403 bssgp_rim_pdu_expect := tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3404 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3405 tr_RAN_Information_Request_RIM_Container);
3406 RIM[0].send(bssgp_rim_pdu);
3407 T.start;
3408 alt {
Vadim Yanitskiy418e8062021-02-28 16:27:12 +01003409 [] RIM[1].receive(bssgp_rim_pdu_expect) {
3410 setverdict(pass);
3411 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003412 [] RIM[1].receive {
3413 setverdict(fail, "Unexpected BSSGP RIM PDU received");
Philipp Maier7df55e02020-12-14 23:46:04 +01003414 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003415 [] T.timeout {
3416 setverdict(fail, "No BSSGP RIM PDU received");
3417 mtc.stop;
Philipp Maier7df55e02020-12-14 23:46:04 +01003418 }
3419 }
Harald Welte8e5932e2020-06-17 22:12:54 +02003420
Philipp Maier7df55e02020-12-14 23:46:04 +01003421 /* Now also emulate also the response as well and send it back on GB interface #1. Expect the result on
3422 * GB interface #0 */
Philipp Maier7df55e02020-12-14 23:46:04 +01003423 res_cont := ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3424 ts_RIM_Sequence_Number(2),
3425 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3426 ts_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003427 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 +01003428 omit);
3429 bssgp_rim_pdu := ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3430 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3431 res_cont);
3432 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
3433 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
3434 ?);
3435 RIM[1].send(bssgp_rim_pdu);
3436 T.start;
3437 alt {
Vadim Yanitskiy418e8062021-02-28 16:27:12 +01003438 [] RIM[0].receive(bssgp_rim_pdu_expect) {
3439 setverdict(pass);
3440 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003441 [] RIM[0].receive {
3442 setverdict(fail, "Unexpected BSSGP RIM PDU received");
Philipp Maier7df55e02020-12-14 23:46:04 +01003443 }
Vadim Yanitskiy7bc13ea2021-02-28 16:26:03 +01003444 [] T.timeout {
3445 setverdict(fail, "No BSSGP RIM PDU received");
3446 mtc.stop;
Philipp Maier7df55e02020-12-14 23:46:04 +01003447 }
3448 }
3449
3450 f_cleanup();
3451}
Harald Welte8e5932e2020-06-17 22:12:54 +02003452
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003453testcase TC_rim_eutran_to_geran() runs on test_CT {
3454 var BSSGP_ConnHdlr vc_conn;
3455 f_init();
3456 /* connect RIM related port */
3457 connect(vc_GTP:CLIENT_DEFAULT, self:GTPC);
3458
3459 var GtpPeer peer := {
3460 connId := 1,
3461 remName := mp_sgsn_gtp_ip,
3462 remPort := GTP1C_PORT
3463 }
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003464 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 +02003465
3466 var template (value) RIM_Routing_Address_GTPC gtpc_dst_addr, gtpc_src_addr;
3467 var template (value) RAN_Information_Request_RIM_Container_GTPC gtpc_rim_req_cont;
3468 var template (value) PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC gtpc_bssgp_cont;
3469 var template (value) Gtp1cUnitdata gtpc_pdu;
3470
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003471 gtpc_dst_addr := t_GTPC_RIM_Routing_Address_cid(gtp_ci);
3472 gtpc_src_addr := t_GTPC_RIM_Routing_Address_enbid(gtp_ci, tac := 3, gnbid := '12345678123456'O);
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003473
3474 gtpc_rim_req_cont := ts_GTPC_RAN_Information_Request_RIM_Container(ts_GTPC_RIM_Application_Identity(RIM_APP_ID_NACC),
3475 ts_GTPC_RIM_Sequence_Number(1),
3476 ts_GTPC_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3477 ts_GTPC_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003478 tsu_GTPC_RAN_Information_Request_Application_Container_NACC(gtp_ci),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003479 omit);
3480 gtpc_bssgp_cont := ts_GTPC_RAN_Information_Request(ts_GTPC_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, gtpc_dst_addr),
3481 ts_GTPC_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, gtpc_src_addr),
3482 gtpc_rim_req_cont);
3483 gtpc_pdu := ts_GTPC_RANInfoRelay(peer, ts_RANTransparentContainer_RAN_INFO_REQ(gtpc_bssgp_cont));
3484 GTPC.send(gtpc_pdu);
3485
3486 var template RIM_Routing_Address bssgp_dst_addr, bssgp_src_addr;
3487 var template PDU_BSSGP bssgp_rim_pdu_expect;
3488 bssgp_dst_addr := t_RIM_Routing_Address_cid(g_gb[1].cfg.bvc[0].cell_id);
3489 bssgp_src_addr := t_RIM_Routing_Address_enbid(g_gb[1].cfg.bvc[0].cell_id, tac := 3, gnbid := '12345678123456'O);
3490 bssgp_rim_pdu_expect := tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bssgp_dst_addr),
3491 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, bssgp_src_addr),
3492 tr_RAN_Information_Request_RIM_Container);
3493 timer T := 2.0;
3494 T.start;
3495 alt {
3496 [] RIM[1].receive(bssgp_rim_pdu_expect) {
3497 setverdict(pass);
3498 T.stop;
3499 }
3500 [] RIM[1].receive {
3501 setverdict(fail, "Unexpected BSSGP RIM PDU received");
3502 }
3503 [] T.timeout {
3504 setverdict(fail, "No BSSGP RIM PDU received");
3505 mtc.stop;
3506 }
3507 }
3508
3509 /* Now also emulate also the response as well and send it back on GB
3510 interface #1. Expect the result on * GTPC */
3511 var template RAN_Information_RIM_Container res_cont;
3512 var template PDU_BSSGP bssgp_rim_pdu;
3513 res_cont := ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
3514 ts_RIM_Sequence_Number(2),
3515 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3516 ts_RIM_Protocol_Version_Number(1),
3517 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(g_gb[1].cfg.bvc[0].cell_id, false, 3, si_default)),
3518 omit);
3519 bssgp_rim_pdu := ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, bssgp_src_addr),
3520 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bssgp_dst_addr),
3521 res_cont);
3522 RIM[1].send(bssgp_rim_pdu);
3523
3524 var template RAN_Information_RIM_Container_GTPC rim_cont;
3525 var template PDU_BSSGP_RAN_INFORMATION_GTPC gtpc_bssgp_cont_ack;
3526 var template Gtp1cUnitdata gtpc_pdu_exp;
3527 rim_cont := tr_GTPC_RAN_Information_RIM_Container(ts_GTPC_RIM_Application_Identity(RIM_APP_ID_NACC),
3528 ts_GTPC_RIM_Sequence_Number(2),
3529 ts_GTPC_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
3530 ts_GTPC_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol17e0f8c2021-12-03 15:11:34 +01003531 tru_GTPC_ApplContainer_or_ApplErrContainer_NACC(tru_GTPC_ApplContainer_NACC(gtp_ci, false, 3, si_default)),
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003532 omit);
3533 gtpc_bssgp_cont_ack := tr_GTPC_RAN_Information(tr_GTPC_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, gtpc_src_addr),
3534 tr_GTPC_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, gtpc_dst_addr),
3535 rim_cont);
3536 gtpc_pdu_exp := tr_GTPC_RANInfoRelay(peer, tr_RANTransparentContainer_RAN_INFO(gtpc_bssgp_cont_ack));
3537
3538 T.start;
3539 alt {
3540 [] GTPC.receive(gtpc_pdu_exp) {
3541 setverdict(pass);
3542 T.stop;
3543 }
3544 [] GTPC.receive {
3545 setverdict(fail, "Unexpected GTPC RIM PDU received");
3546 }
3547 [] T.timeout {
3548 setverdict(fail, "No GTPC RIM PDU received");
3549 mtc.stop;
3550 }
3551 }
3552
3553 f_cleanup();
3554}
3555
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01003556/* Test if the SGSN routes traffic to new cell after the MS attached to it */
3557private function f_TC_cell_change_different_rai_ci_attach(charstring id) runs on BSSGP_ConnHdlr {
3558 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3559
3560 /* first perform regular attach */
3561 f_gmm_attach(false, false, ran_index := 0);
3562 /* then activate PDP context */
3563 f_pdp_ctx_act(apars, ran_index := 0);
3564 /* then transceive a downlink PDU */
3565 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3566 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 0);
3567
3568 /* Now attach on different cell: */
3569 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3570 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3571 g_pars.net.expect_auth := false;
3572 f_gmm_attach(false, false, ran_index := 1, old_ra := f_cellid_to_RAI(g_pars.bssgp_cell_id[0]));
3573 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3574 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1, n_u := 1);
3575}
3576testcase TC_cell_change_different_rai_ci_attach() runs on test_CT {
3577 var BSSGP_ConnHdlr vc_conn;
3578 f_init();
3579 vc_conn := f_start_handler(refers(f_TC_cell_change_different_rai_ci_attach), testcasename(), g_gb, 68);
3580 vc_conn.done;
3581 f_cleanup();
3582}
3583
3584/* Test if the SGSN routes traffic to new cell after the MS attached to it */
3585/* Assumption: g_gb[1] and g_gb[2] configured with same RAC */
3586private function f_TC_cell_change_different_ci_attach(charstring id) runs on BSSGP_ConnHdlr {
3587 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3588
3589 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3590 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3591
3592 /* first perform regular attach */
3593 f_gmm_attach(false, false, ran_index := 1);
3594 /* then activate PDP context */
3595 f_pdp_ctx_act(apars, ran_index := 1);
3596 /* then transceive a downlink PDU */
3597 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3598 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1);
3599
3600 /* Now attach on different cell: */
3601 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3602 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[2]);
3603 g_pars.net.expect_auth := false;
3604 f_gmm_attach(false, false, ran_index := 2, old_ra := f_cellid_to_RAI(g_pars.bssgp_cell_id[1]));
3605 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 2);
3606 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 2, n_u := 1);
3607}
3608testcase TC_cell_change_different_ci_attach() runs on test_CT {
3609 var BSSGP_ConnHdlr vc_conn;
3610 f_init();
3611 vc_conn := f_start_handler(refers(f_TC_cell_change_different_ci_attach), testcasename(), g_gb, 69);
3612 vc_conn.done;
3613 f_cleanup();
3614}
3615
3616/* Test if the SGSN silently drops MO data message coming from new BVCI if RAC changed (eg. cell change) */
3617private function f_TC_cell_change_different_rai_ci_data(charstring id) runs on BSSGP_ConnHdlr {
3618 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3619
3620 /* first perform regular attach */
3621 f_gmm_attach(false, false, ran_index := 0);
3622 /* then activate PDP context */
3623 f_pdp_ctx_act(apars, ran_index := 0);
3624 /* then transceive a downlink PDU */
3625 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3626 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 0);
3627
3628 /* Send some data over new bvci, it should be silently discarded since
3629 * RAC changed and SGSN expects a RAU to occur in that case */
3630 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3631 var octetstring payload := f_rnd_octstring(200);
3632 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
3633 BSSGP[1].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 1));
3634 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
3635 timer T := 2.0;
3636 T.start;
3637 alt {
3638 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload)) {
3639 setverdict(fail, "Unexpected GTP message");
3640 }
3641 [] T.timeout { setverdict(pass); }
3642 }
3643
3644 /* Expect SGSN to continue routing DL data to last known NSEI+BVCI */
3645 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3646 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 0);
3647}
3648testcase TC_cell_change_different_rai_ci_data() runs on test_CT {
3649 var BSSGP_ConnHdlr vc_conn;
3650 f_init();
3651 vc_conn := f_start_handler(refers(f_TC_cell_change_different_rai_ci_data), testcasename(), g_gb, 70);
3652 vc_conn.done;
3653 f_cleanup();
3654}
3655
3656/* Test if the SGSN routes traffic to new cell after the MS switched cell without re-attaching */
3657/* Assumption: g_gb[1] and g_gb[2] configured with same RAC */
3658private function f_TC_cell_change_different_ci_data(charstring id) runs on BSSGP_ConnHdlr {
3659 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
3660
3661 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[0]);
3662 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[1]);
3663
3664 /* first perform regular attach */
3665 f_gmm_attach(false, false, ran_index := 1);
3666 /* then activate PDP context */
3667 f_pdp_ctx_act(apars, ran_index := 1);
3668 /* then transceive a downlink PDU */
3669 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 1);
3670 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 1);
3671
3672 /* Now attach on different cell: */
3673 f_bssgp_client_unregister(g_pars.imsi, BSSGP_PROC[1]);
3674 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, BSSGP_PROC[2]);
3675
3676 f_gtpu_xceive_mo(apars, f_rnd_octstring(200), ran_index := 2, n_u := 1);
3677 f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := 2);
3678}
3679testcase TC_cell_change_different_ci_data() runs on test_CT {
3680 var BSSGP_ConnHdlr vc_conn;
3681 f_init();
3682 vc_conn := f_start_handler(refers(f_TC_cell_change_different_ci_data), testcasename(), g_gb, 71);
3683 vc_conn.done;
3684 f_cleanup();
3685}
3686
Harald Welte5ac31492018-02-15 20:39:13 +01003687control {
Harald Welte5b7c8122018-02-16 21:48:17 +01003688 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01003689 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02003690 execute( TC_attach_umts_aka_umts_res() );
3691 execute( TC_attach_umts_aka_gsm_sres() );
arehbein3ede9e32023-02-06 21:02:53 +01003692 execute( TC_attach_timeout_after_pdp_act() );
Harald Welte5b7c8122018-02-16 21:48:17 +01003693 execute( TC_attach_auth_id_timeout() );
3694 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01003695 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01003696 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01003697 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01003698 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01003699 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01003700 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02003701 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02003702 execute( TC_attach_no_imsi_response() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02003703 execute( TC_attach_closed_add_vty(), 20.0 );
3704 execute( TC_attach_check_subscriber_list(), 20.0 );
3705 execute( TC_attach_detach_check_subscriber_list(), 20.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02003706 execute( TC_attach_check_complete_resend() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02003707 execute( TC_hlr_location_cancel_request_update(), 20.0 );
3708 execute( TC_hlr_location_cancel_request_withdraw(), 20.0 );
3709 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 20.0 );
3710 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 20.0 );
Harald Welte04683d02018-02-16 22:43:45 +01003711 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01003712 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02003713 execute( TC_attach_rau_a_a() );
Alexander Couzensbe837bd2018-07-31 04:20:11 +02003714 execute( TC_attach_rau_a_b() );
Alexander Couzens0c6324f2018-09-14 16:37:04 +02003715 execute( TC_attach_usim_resync() );
Eric Wildc555be52021-05-15 19:48:22 +02003716 execute( TC_attach_usim_a54_a54() );
3717 execute( TC_attach_usim_a54_a53() );
3718 execute( TC_attach_usim_a53_a54() );
3719 execute( TC_attach_usim_a50_a54() );
3720 execute( TC_attach_usim_a54_a50() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01003721 execute( TC_detach_unknown_nopoweroff() );
3722 execute( TC_detach_unknown_poweroff() );
3723 execute( TC_detach_nopoweroff() );
3724 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01003725 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01003726 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01003727 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01003728 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01003729 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01003730 execute( TC_attach_pdp_act_user_deact_mt() );
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02003731 execute( TC_attach_pdp_act_deact_dup() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02003732 execute( TC_attach_second_attempt() );
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02003733 execute( TC_attach_echo_timeout() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02003734 execute( TC_attach_restart_ctr_echo() );
3735 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02003736 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02003737 execute( TC_attach_pdp_act_deact_gtp_retrans() );
3738 execute( TC_attach_pdp_act_deact_gtp_retrans_resp() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02003739 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Alexander Couzens6bee0872019-05-11 01:48:50 +02003740 execute( TC_attach_pdp_act_gmm_detach() );
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02003741 execute( TC_attach_gmm_attach_req_while_gmm_attach() );
Harald Weltea05b8072019-04-23 22:35:05 +02003742
Harald Welte2aaac1b2019-05-02 10:02:53 +02003743 execute( TC_xid_empty_l3() );
3744 execute( TC_xid_n201u() );
3745
Harald Weltea05b8072019-04-23 22:35:05 +02003746 execute( TC_llc_null() );
Harald Welte645a1512019-04-23 23:18:23 +02003747 execute( TC_llc_sabm_dm_llgmm() );
3748 execute( TC_llc_sabm_dm_ll5() );
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003749
Harald Welte8e5932e2020-06-17 22:12:54 +02003750 execute( TC_suspend_nopaging() );
3751 execute( TC_suspend_resume() );
3752 execute( TC_suspend_rau() );
3753 execute( TC_paging_ps() );
3754
Philipp Maier7df55e02020-12-14 23:46:04 +01003755 execute( TC_bssgp_rim_single_report() );
Pau Espin Pedrol8c74cbb2021-05-04 15:26:56 +02003756 execute( TC_rim_eutran_to_geran() );
Philipp Maier7df55e02020-12-14 23:46:04 +01003757
Pau Espin Pedrol7c052162021-02-12 17:43:35 +01003758 execute( TC_cell_change_different_rai_ci_attach() );
3759 execute( TC_cell_change_different_rai_ci_data() );
3760 execute( TC_cell_change_different_ci_attach() );
3761 execute( TC_cell_change_different_ci_data() );
3762
Pau Espin Pedrolce571b52019-11-08 18:32:28 +01003763 /* At the end, may crash osmo-sgsn, see OS#3957, OS#4245 */
3764 execute( TC_attach_req_id_req_ra_update() );
Harald Welte5ac31492018-02-15 20:39:13 +01003765}
Harald Welte96a33b02018-02-04 10:36:22 +01003766
3767
3768
3769}