blob: b68df853613ae33b0e703117b3cfe37b90398677 [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 Welte96a33b02018-02-04 10:36:22 +010014import from General_Types all;
15import from Osmocom_Types all;
Harald Welte37692d82018-02-18 15:21:34 +010016import from Native_Functions all;
Harald Welte96a33b02018-02-04 10:36:22 +010017import from NS_Types all;
18import from NS_Emulation all;
19import from BSSGP_Types all;
20import from BSSGP_Emulation all;
Harald Welte5ac31492018-02-15 20:39:13 +010021import from Osmocom_Gb_Types all;
Harald Welte26fbb6e2019-04-14 17:32:46 +020022import from SCCPasp_Types all;
Harald Welte5ac31492018-02-15 20:39:13 +010023
24import from MobileL3_CommonIE_Types all;
25import from MobileL3_GMM_SM_Types all;
26import from MobileL3_Types all;
27import from L3_Templates all;
28import from L3_Common all;
29
30import from GSUP_Emulation all;
31import from GSUP_Types all;
32import from IPA_Emulation all;
33
Harald Welte26fbb6e2019-04-14 17:32:46 +020034import from RAN_Adapter all;
35import from RAN_Emulation all;
36import from RANAP_Templates all;
37import from RANAP_PDU_Descriptions all;
38import from RANAP_IEs all;
39
Harald Welteeded9ad2018-02-17 20:57:34 +010040import from GTP_Emulation all;
41import from GTP_Templates all;
42import from GTP_CodecPort all;
43import from GTPC_Types all;
44import from GTPU_Types all;
45
Harald Weltea2526a82018-02-18 19:03:36 +010046import from LLC_Types all;
47import from LLC_Templates all;
48
49import from SNDCP_Types all;
50
Harald Weltebd194722018-02-16 22:11:08 +010051import from TELNETasp_PortType all;
52import from Osmocom_VTY_Functions all;
53
Neels Hofmeyr8df7d152018-03-14 19:03:28 +010054import from GSM_RR_Types all;
55
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020056import from MobileL3_MM_Types all;
57
Harald Welteeded9ad2018-02-17 20:57:34 +010058
Harald Welte5ac31492018-02-15 20:39:13 +010059modulepar {
60 /* IP/port on which we run our internal GSUP/HLR emulation */
61 charstring mp_hlr_ip := "127.0.0.1";
62 integer mp_hlr_port := 4222;
Harald Welteeded9ad2018-02-17 20:57:34 +010063 charstring mp_ggsn_ip := "127.0.0.2";
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +020064 integer mp_echo_interval := 5; /* in seconds. Only used in test enabling g_use_echo */
Alexander Couzens2c12b242018-07-31 00:30:11 +020065
Alexander Couzensf3c1b412018-08-24 00:42:51 +020066 NSConfigurations mp_nsconfig := {
67 {
68 local_udp_port := 21010,
69 local_ip := "127.0.0.1",
70 remote_udp_port := 23000,
71 remote_ip := "127.0.0.1",
72 nsvci := 97,
Harald Welte5e514fa2018-07-05 00:01:45 +020073 nsei := 96,
74 role_sgsn := false,
75 handle_sns := false
Alexander Couzensf3c1b412018-08-24 00:42:51 +020076 },
77 {
78 local_udp_port := 21011,
79 local_ip := "127.0.0.1",
80 remote_udp_port := 23000,
81 remote_ip := "127.0.0.1",
82 nsvci := 98,
Harald Welte5e514fa2018-07-05 00:01:45 +020083 nsei := 97,
84 role_sgsn := false,
85 handle_sns := false
Alexander Couzensf3c1b412018-08-24 00:42:51 +020086 },
87 {
88 local_udp_port := 21012,
89 local_ip := "127.0.0.1",
90 remote_udp_port := 23000,
91 remote_ip := "127.0.0.1",
92 nsvci := 99,
Harald Welte5e514fa2018-07-05 00:01:45 +020093 nsei := 98,
94 role_sgsn := false,
95 handle_sns := false
Alexander Couzensf3c1b412018-08-24 00:42:51 +020096 }
Alexander Couzens2c12b242018-07-31 00:30:11 +020097 };
Harald Welte26fbb6e2019-04-14 17:32:46 +020098
99 RAN_Configurations mp_ranap_cfg := {
100 {
101 transport := RANAP_TRANSPORT_IuCS,
102 sccp_service_type := "mtp3_itu",
103 sctp_addr := { 23908, "127.0.0.1", 2905, "127.0.0.1" },
104 own_pc := 195,
105 own_ssn := 142,
106 peer_pc := 188, /* 0.23.4 */
107 peer_ssn := 142,
108 sio := '83'O,
109 rctx := 2
110 }
111 }
Harald Welte5ac31492018-02-15 20:39:13 +0100112};
113
114type record GbInstance {
115 NS_CT vc_NS,
116 BSSGP_CT vc_BSSGP,
117 BssgpConfig cfg
118};
Harald Welte96a33b02018-02-04 10:36:22 +0100119
Harald Welte2fa771f2019-05-02 20:13:53 +0200120const integer NUM_GB := 3;
121type record length(NUM_GB) of GbInstance GbInstances;
122type record length(NUM_GB) of NSConfiguration NSConfigurations;
123type record length(NUM_GB) of BssgpCellId BssgpCellIds;
Alexander Couzens51114d12018-07-31 18:41:56 +0200124
Harald Welte26fbb6e2019-04-14 17:32:46 +0200125const integer NUM_RNC := 1;
126type record of RAN_Configuration RAN_Configurations;
127
Harald Welte96a33b02018-02-04 10:36:22 +0100128type component test_CT {
Alexander Couzens51114d12018-07-31 18:41:56 +0200129 var GbInstances g_gb;
Harald Welte26fbb6e2019-04-14 17:32:46 +0200130 var RAN_Adapter g_ranap[NUM_RNC];
Harald Welte96a33b02018-02-04 10:36:22 +0100131
Harald Welte5ac31492018-02-15 20:39:13 +0100132 var GSUP_Emulation_CT vc_GSUP;
133 var IPA_Emulation_CT vc_GSUP_IPA;
134 /* only to get events from IPA underneath GSUP */
135 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +0100136
Harald Welteeded9ad2018-02-17 20:57:34 +0100137 var GTP_Emulation_CT vc_GTP;
138
Harald Weltebd194722018-02-16 22:11:08 +0100139 port TELNETasp_PT SGSNVTY;
140
Harald Welte96a33b02018-02-04 10:36:22 +0100141 var boolean g_initialized := false;
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200142 var boolean g_use_echo := false;
Harald Welte96a33b02018-02-04 10:36:22 +0100143};
144
Harald Welte26fbb6e2019-04-14 17:32:46 +0200145type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr, RAN_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100146 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +0100147 timer g_Tguard;
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200148 var LLC_Entities llc;
Harald Welte5ac31492018-02-15 20:39:13 +0100149}
150
151type record SGSN_ConnHdlrNetworkPars {
152 boolean expect_ptmsi,
153 boolean expect_auth,
154 boolean expect_ciph
155};
156
157type record BSSGP_ConnHdlrPars {
158 /* IMEI of the simulated ME */
159 hexstring imei,
Alexander Couzens8f0fb002018-05-02 19:30:55 +0200160 /* IMSI of the simulated MS */
Harald Welte5ac31492018-02-15 20:39:13 +0100161 hexstring imsi,
162 /* MSISDN of the simulated MS (probably unused) */
163 hexstring msisdn,
164 /* P-TMSI allocated to the simulated MS */
165 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +0100166 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100167 /* TLLI of the simulated MS */
168 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +0100169 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100170 RoutingAreaIdentificationV ra optional,
Alexander Couzens51114d12018-07-31 18:41:56 +0200171 BssgpCellIds bssgp_cell_id,
Harald Welte5ac31492018-02-15 20:39:13 +0100172 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +0100173 SGSN_ConnHdlrNetworkPars net,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200174 float t_guard,
175 /* only in IuPS / RANAP case */
176 SCCP_PAR_Address sccp_addr_local,
177 SCCP_PAR_Address sccp_addr_peer
Harald Welte5ac31492018-02-15 20:39:13 +0100178};
179
Alexander Couzens89508702018-07-31 04:16:10 +0200180private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200181 /* mcc_mnc is encoded as of 24.008 10.5.5.15 */
Alexander Couzens89508702018-07-31 04:16:10 +0200182 var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;
183
184 var RoutingAreaIdentificationV ret := {
185 mccDigit1 := mcc_mnc[0],
186 mccDigit2 := mcc_mnc[1],
187 mccDigit3 := mcc_mnc[2],
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200188 mncDigit3 := mcc_mnc[3],
189 mncDigit1 := mcc_mnc[4],
190 mncDigit2 := mcc_mnc[5],
Alexander Couzens89508702018-07-31 04:16:10 +0200191 lac := int2oct(cell_id.ra_id.lai.lac, 16),
192 rac := int2oct(cell_id.ra_id.rac, 8)
193 }
194 return ret;
195};
196
Alexander Couzens51114d12018-07-31 18:41:56 +0200197private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
198 gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset));
199 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset));
Harald Welte5ac31492018-02-15 20:39:13 +0100200 /* connect lower end of BSSGP emulation with NS upper port */
201 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
202 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
203 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
204
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200205 gb.vc_NS.start(NSStart(mp_nsconfig[offset]));
Harald Welte5ac31492018-02-15 20:39:13 +0100206 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
207}
208
209private function f_init_gsup(charstring id) runs on test_CT {
210 id := id & "-GSUP";
211 var GsupOps ops := {
212 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
213 };
214
215 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
216 vc_GSUP := GSUP_Emulation_CT.create(id);
217
218 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
219 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
220 /* we use this hack to get events like ASP_IPA_EVENT_UP */
221 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
222
223 vc_GSUP.start(GSUP_Emulation.main(ops, id));
224 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
225
226 /* wait for incoming connection to GSUP port before proceeding */
227 timer T := 10.0;
228 T.start;
229 alt {
230 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
231 [] T.timeout {
232 setverdict(fail, "No connection to GSUP Port");
Daniel Willmannafce8662018-07-06 23:11:32 +0200233 mtc.stop;
Harald Welte5ac31492018-02-15 20:39:13 +0100234 }
235 }
236}
237
Harald Welteeded9ad2018-02-17 20:57:34 +0100238private function f_init_gtp(charstring id) runs on test_CT {
239 id := id & "-GTP";
240
241 var GtpEmulationCfg gtp_cfg := {
242 gtpc_bind_ip := mp_ggsn_ip,
243 gtpc_bind_port := GTP1C_PORT,
244 gtpu_bind_ip := mp_ggsn_ip,
245 gtpu_bind_port := GTP1U_PORT,
246 sgsn_role := false
247 };
248
249 vc_GTP := GTP_Emulation_CT.create(id);
250 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
251}
252
Harald Weltebd194722018-02-16 22:11:08 +0100253private function f_init_vty() runs on test_CT {
254 map(self:SGSNVTY, system:SGSNVTY);
255 f_vty_set_prompts(SGSNVTY);
256 f_vty_transceive(SGSNVTY, "enable");
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200257 f_vty_transceive(SGSNVTY, "reset sgsn state");
Harald Weltebd194722018-02-16 22:11:08 +0100258 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
259}
260
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200261private function f_vty_enable_echo_interval(boolean enable) runs on test_CT {
262 if (enable) {
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +0200263 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 echo-interval " & int2str(mp_echo_interval));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200264 } else {
265 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 no echo-interval");
266 }
267}
268
Harald Weltebd194722018-02-16 22:11:08 +0100269
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200270/* mcc_mnc is 24.008 10.5.5.15 encoded. 262 42 */
271function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
Harald Welte26fbb6e2019-04-14 17:32:46 +0200272 var integer i;
273
Harald Welte96a33b02018-02-04 10:36:22 +0100274 if (g_initialized == true) {
275 return;
276 }
277 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100278 g_gb[0].cfg := {
279 nsei := 96,
280 bvci := 196,
281 cell_id := {
282 ra_id := {
283 lai := {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100284 mcc_mnc := mcc_mnc, lac := 13135},
Harald Welte5ac31492018-02-15 20:39:13 +0100285 rac := 0
286 },
287 cell_id := 20960
288 },
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200289 sgsn_role := false,
290 depth := BSSGP_DECODE_DEPTH_L3
Harald Welte5ac31492018-02-15 20:39:13 +0100291 };
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200292 g_gb[1].cfg := {
293 nsei := 97,
294 bvci := 210,
295 cell_id := {
296 ra_id := {
297 lai := {
298 mcc_mnc := mcc_mnc, lac := 13200},
299 rac := 0
300 },
301 cell_id := 20961
302 },
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200303 sgsn_role := false,
304 depth := BSSGP_DECODE_DEPTH_L3
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200305 };
306 g_gb[2].cfg := {
307 nsei := 98,
308 bvci := 220,
309 cell_id := {
310 ra_id := {
311 lai := {
312 mcc_mnc := mcc_mnc, lac := 13300},
313 rac := 0
314 },
315 cell_id := 20962
316 },
Oliver Smithaac9b9c2019-09-02 08:36:36 +0200317 sgsn_role := false,
318 depth := BSSGP_DECODE_DEPTH_L3
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200319 };
Harald Welte96a33b02018-02-04 10:36:22 +0100320
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200321 f_init_vty();
Alexander Couzens51114d12018-07-31 18:41:56 +0200322 f_init_gb(g_gb[0], "SGSN_Test-Gb0", 0);
323 f_init_gb(g_gb[1], "SGSN_Test-Gb1", 1);
324 f_init_gb(g_gb[2], "SGSN_Test-Gb2", 2);
Harald Welte26fbb6e2019-04-14 17:32:46 +0200325
326 for (i := 0; i < NUM_RNC; i := i+1) {
327 f_ran_adapter_init(g_ranap[i], mp_ranap_cfg[i], "SGSN_Test_" & int2str(i), RNC_RanOps);
328 f_ran_adapter_start(g_ranap[i]);
329 }
Harald Welte5ac31492018-02-15 20:39:13 +0100330 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100331 f_init_gtp("SGSN_Test");
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200332 f_vty_enable_echo_interval(g_use_echo);
Harald Welte5ac31492018-02-15 20:39:13 +0100333}
Harald Welte96a33b02018-02-04 10:36:22 +0100334
Harald Welte26fbb6e2019-04-14 17:32:46 +0200335private function RncUnitdataCallback(RANAP_PDU ranap)
336runs on RAN_Emulation_CT return template RANAP_PDU {
337 var template RANAP_PDU resp := omit;
338
339 log ("RANAP_RncUnitDataCallback");
340 /* answer all RESET with RESET ACK */
341 if (match(ranap, tr_RANAP_Reset)) {
342 log("RANAP_RncUnitdataCallback: Responding to RESET with RESET-ACK");
343 var CN_DomainIndicator dom;
344 dom := ranap.initiatingMessage.value_.Reset.protocolIEs[1].value_.cN_DomainIndicator;
345 resp := ts_RANAP_ResetAck(dom);
346 }
347 return resp;
348}
349
350const RanOps RNC_RanOps := {
351 ranap_create_cb := refers(RAN_Emulation.RanapExpectedCreateCallback),
352 ranap_unitdata_cb := refers(RncUnitdataCallback),
353 ps_domain := true,
354 decode_dtap := true,
355 role_ms := true,
356 protocol := RAN_PROTOCOL_RANAP,
357 transport := RANAP_TRANSPORT_IuCS,
358 use_osmux := false,
359 sccp_addr_local := omit,
360 sccp_addr_peer := omit
361};
362
Harald Welte5ac31492018-02-15 20:39:13 +0100363type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
364
365/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Alexander Couzens51114d12018-07-31 18:41:56 +0200366function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix,
Harald Welte62e29582018-02-16 21:17:11 +0100367 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100368runs on test_CT return BSSGP_ConnHdlr {
369 var BSSGP_ConnHdlr vc_conn;
370 var SGSN_ConnHdlrNetworkPars net_pars := {
371 expect_ptmsi := true,
372 expect_auth := true,
373 expect_ciph := false
374 };
375 var BSSGP_ConnHdlrPars pars := {
376 imei := f_gen_imei(imsi_suffix),
377 imsi := f_gen_imsi(imsi_suffix),
378 msisdn := f_gen_msisdn(imsi_suffix),
379 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100380 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100381 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100382 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100383 ra := omit,
Alexander Couzens51114d12018-07-31 18:41:56 +0200384 bssgp_cell_id := { gb[0].cfg.cell_id, gb[1].cfg.cell_id, gb[2].cfg.cell_id },
Harald Welte5ac31492018-02-15 20:39:13 +0100385 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100386 net := net_pars,
Harald Welte26fbb6e2019-04-14 17:32:46 +0200387 t_guard := t_guard,
388 sccp_addr_local := g_ranap[0].sccp_addr_own,
389 sccp_addr_peer := g_ranap[0].sccp_addr_peer
Harald Welte5ac31492018-02-15 20:39:13 +0100390 };
391
392 vc_conn := BSSGP_ConnHdlr.create(id);
Alexander Couzens51114d12018-07-31 18:41:56 +0200393 connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP:BSSGP_SP);
394 connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP:BSSGP_PROC);
395 connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP:BSSGP_SP);
396 connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP:BSSGP_PROC);
397 connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP:BSSGP_SP);
398 connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP:BSSGP_PROC);
Harald Welte5ac31492018-02-15 20:39:13 +0100399
Harald Welte26fbb6e2019-04-14 17:32:46 +0200400 /* FIXME: support multiple RNCs */
401 connect(vc_conn:BSSAP, g_ranap[0].vc_RAN:CLIENT);
402 connect(vc_conn:BSSAP_PROC, g_ranap[0].vc_RAN:PROC);
403
Harald Welte5ac31492018-02-15 20:39:13 +0100404 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
405 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
406
Harald Welteeded9ad2018-02-17 20:57:34 +0100407 connect(vc_conn:GTP, vc_GTP:CLIENT);
408 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
409
Harald Welte5ac31492018-02-15 20:39:13 +0100410 vc_conn.start(f_handler_init(fn, id, pars));
411 return vc_conn;
412}
413
Harald Welte62e29582018-02-16 21:17:11 +0100414private altstep as_Tguard() runs on BSSGP_ConnHdlr {
415 [] g_Tguard.timeout {
416 setverdict(fail, "Tguard timeout");
Daniel Willmannafce8662018-07-06 23:11:32 +0200417 mtc.stop;
Harald Welte62e29582018-02-16 21:17:11 +0100418 }
419}
420
Harald Welte5ac31492018-02-15 20:39:13 +0100421/* first function called in every ConnHdlr */
422private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
423runs on BSSGP_ConnHdlr {
424 /* do some common stuff like setting up g_pars */
425 g_pars := pars;
426
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200427 llc := f_llc_create(false);
428
Harald Welte5ac31492018-02-15 20:39:13 +0100429 /* register with BSSGP core */
Alexander Couzens51114d12018-07-31 18:41:56 +0200430 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welte5ac31492018-02-15 20:39:13 +0100431 /* tell GSUP dispatcher to send this IMSI to us */
432 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100433 /* tell GTP dispatcher to send this IMSI to us */
434 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100435
Harald Welte62e29582018-02-16 21:17:11 +0100436 g_Tguard.start(pars.t_guard);
437 activate(as_Tguard());
438
Harald Welte5ac31492018-02-15 20:39:13 +0100439 /* call the user-supplied test case function */
440 fn.apply(id);
441 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100442}
443
444/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100445 * Detach without Attach
446 * SM procedures without attach / RAU
447 * ATTACH / RAU
448 ** with / without authentication
449 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100450 * re-transmissions of LLC frames
451 * PDP Context activation
452 ** with different GGSN config in SGSN VTY
453 ** with different PDP context type (v4/v6/v46)
454 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100455 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100456 */
457
458testcase TC_wait_ns_up() runs on test_CT {
459 f_init();
460 f_sleep(20.0);
461}
462
Harald Weltea05b8072019-04-23 22:35:05 +0200463function f_send_llc(template (value) PDU_LLC llc_pdu, integer gb_index := 0) runs on BSSGP_ConnHdlr {
464 var octetstring llc_enc := enc_PDU_LLC(valueof(llc_pdu));
465 BSSGP[gb_index].send(ts_BSSGP_UL_UD(g_pars.tlli, g_pars.bssgp_cell_id[gb_index], llc_enc));
466}
467
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200468function f_send_l3_gmm_llc(template PDU_L3_MS_SGSN l3_mo, integer gb_index := 0) runs on BSSGP_ConnHdlr {
469 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
470 var BIT4 sapi := f_llc_sapi_by_l3_mo(valueof(l3_mo));
471 var integer n_u := f_llc_get_n_u_tx(llc[bit2int(sapi)]);
Alexander Couzensad352222019-05-11 02:06:04 +0200472 f_send_llc(ts_LLC_UI(l3_enc, sapi, '0'B, n_u), gb_index);
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200473}
474
Harald Welteca362462019-05-02 20:11:21 +0200475altstep as_mm_identity(integer gb_idx := 0) runs on BSSGP_ConnHdlr {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100476 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
Harald Welte955aa942019-05-03 01:29:29 +0200477 [] BSSGP[gb_idx].receive(tr_GMM_ID_REQ('001'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100478 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Harald Welteca362462019-05-02 20:11:21 +0200479 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi), gb_idx);
Harald Welte5ac31492018-02-15 20:39:13 +0100480 repeat;
481 }
Harald Welte955aa942019-05-03 01:29:29 +0200482 [] BSSGP[gb_idx].receive(tr_GMM_ID_REQ('010'B)) {
Harald Welte5ac31492018-02-15 20:39:13 +0100483 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Harald Welteca362462019-05-02 20:11:21 +0200484 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi), gb_idx);
Harald Welte5ac31492018-02-15 20:39:13 +0100485 repeat;
486 }
487}
Harald Welte96a33b02018-02-04 10:36:22 +0100488
Harald Welteca362462019-05-02 20:11:21 +0200489/* receive a L3 (GMM/SM) message over whatever is the appropriate lower-layer bearer */
490function f_receive_l3(template PDU_L3_SGSN_MS rx_tpl := ?, integer gb_idx := 0)
491runs on BSSGP_ConnHdlr return PDU_L3_SGSN_MS {
Harald Welteca362462019-05-02 20:11:21 +0200492 var PDU_L3_SGSN_MS l3_mt;
493 alt {
Harald Welte955aa942019-05-03 01:29:29 +0200494 [] BSSGP[gb_idx].receive(rx_tpl) -> value l3_mt { }
Harald Welteca362462019-05-02 20:11:21 +0200495 }
496 return l3_mt;
497}
498
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200499/* perform GMM authentication (if expected).
500 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
501 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
Harald Welteca362462019-05-02 20:11:21 +0200502function f_gmm_auth (boolean umts_aka_challenge := false, boolean force_gsm_sres := false, integer gb_idx := 0) runs on BSSGP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100503 var PDU_L3_MS_SGSN l3_mo;
504 var PDU_L3_SGSN_MS l3_mt;
Harald Welteca362462019-05-02 20:11:21 +0200505 var default di := activate(as_mm_identity(gb_idx));
Harald Welte5ac31492018-02-15 20:39:13 +0100506 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200507 var GSUP_IE auth_tuple;
508 var template AuthenticationParameterAUTNTLV autn;
509
510 if (umts_aka_challenge) {
511 g_pars.vec := f_gen_auth_vec_3g();
512 autn := {
513 elementIdentifier := '28'O,
514 lengthIndicator := lengthof(g_pars.vec.autn),
515 autnValue := g_pars.vec.autn
516 };
517
518 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
519 g_pars.vec.sres,
520 g_pars.vec.kc,
521 g_pars.vec.ik,
522 g_pars.vec.ck,
523 g_pars.vec.autn,
524 g_pars.vec.res));
525 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
526 } else {
527 g_pars.vec := f_gen_auth_vec_2g();
528 autn := omit;
529 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
530 g_pars.vec.sres,
531 g_pars.vec.kc));
532 log("GSUP sends only 2G auth tuple", auth_tuple);
533 }
Harald Welteca362462019-05-02 20:11:21 +0200534
Harald Welte5ac31492018-02-15 20:39:13 +0100535 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
536 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200537
538 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
539 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welteca362462019-05-02 20:11:21 +0200540 l3_mt := f_receive_l3(auth_ciph_req, gb_idx);
Harald Welte5ac31492018-02-15 20:39:13 +0100541 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200542 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
543
544 if (umts_aka_challenge and not force_gsm_sres) {
545 /* set UMTS response instead */
546 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
547 valueField := substr(g_pars.vec.res, 0, 4)
548 };
549 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
550 elementIdentifier := '21'O,
551 lengthIndicator := lengthof(g_pars.vec.res) - 4,
552 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
553 };
554 }
555
556 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100557 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
558 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
559 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
560 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
561 }
Harald Welteca362462019-05-02 20:11:21 +0200562 f_send_l3_gmm_llc(l3_mo, gb_idx);
Harald Welte76dee092018-02-16 22:12:59 +0100563 } else {
564 /* wait for identity procedure */
565 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100566 }
Harald Welte76dee092018-02-16 22:12:59 +0100567
Harald Welte5ac31492018-02-15 20:39:13 +0100568 deactivate(di);
569}
570
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200571function f_upd_ptmsi_and_tlli(OCT4 p_tmsi, integer bssgp_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltef70997d2018-02-17 10:11:19 +0100572 g_pars.p_tmsi := p_tmsi;
573 /* update TLLI */
574 g_pars.tlli_old := g_pars.tlli;
575 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200576 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli, BSSGP_PROC[bssgp_index]);
Harald Weltef70997d2018-02-17 10:11:19 +0100577}
578
Harald Welte04683d02018-02-16 22:43:45 +0100579function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
580 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100581 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Alexander Couzens51114d12018-07-31 18:41:56 +0200582 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100583 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Alexander Couzens51114d12018-07-31 18:41:56 +0200584 & "; expected " & hex2str(g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200585 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100586 }
Harald Welte04683d02018-02-16 22:43:45 +0100587 g_pars.ra := aa.routingAreaIdentification;
588 if (ispresent(aa.allocatedPTMSI)) {
589 if (not g_pars.net.expect_ptmsi) {
590 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200591 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100592 }
Harald Weltef70997d2018-02-17 10:11:19 +0100593 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100594 }
595 if (ispresent(aa.msIdentity)) {
596 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200597 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100598 }
599 /* P-TMSI.sig */
600 if (ispresent(aa.ptmsiSignature)) {
601 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
602 }
603 /* updateTimer */
604 // aa.readyTimer
605 /* T3302, T3319, T3323, T3312_ext, T3324 */
606}
607
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200608function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra, integer bssgp_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +0100609 /* mandatory IE */
610 g_pars.ra := ra.routingAreaId;
611 if (ispresent(ra.allocatedPTMSI)) {
612 if (not g_pars.net.expect_ptmsi) {
613 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200614 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100615 }
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200616 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets, bssgp_index);
Harald Welte91636de2018-02-17 10:16:14 +0100617 }
618 if (ispresent(ra.msIdentity)) {
619 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200620 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100621 }
622 /* P-TMSI.sig */
623 if (ispresent(ra.ptmsiSignature)) {
624 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
625 }
626 /* updateTimer */
627 // aa.readyTimer
628 /* T3302, T3319, T3323, T3312_ext, T3324 */
629}
630
631
Harald Welte5a4fa042018-02-16 20:59:21 +0100632function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
633 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
634}
635
Harald Welte23178c52018-02-17 09:36:33 +0100636/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100637private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileL3_CommonIE_Types.MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100638 if (ispresent(g_pars.p_tmsi)) {
639 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
640 } else {
641 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
642 }
643}
644
Harald Welte311ec272018-02-17 09:40:03 +0100645private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100646 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100647 /* Expect MSC to perform LU with HLR */
648 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100649 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
650 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
651 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100652 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
653 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
654}
655
Harald Welteca362462019-05-02 20:11:21 +0200656friend function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres, integer gb_idx := 0) runs on BSSGP_ConnHdlr {
Harald Welte5a4fa042018-02-16 20:59:21 +0100657 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200658 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
Harald Welteca362462019-05-02 20:11:21 +0200659 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5ac31492018-02-15 20:39:13 +0100660
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200661 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
662 * 3G auth vectors */
663 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
664 /* The thing is, if the solSACapability is 'omit', then the
665 * revisionLevelIndicatior is at the wrong place! */
666 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
667
Harald Welteca362462019-05-02 20:11:21 +0200668 f_send_l3_gmm_llc(attach_req, gb_idx);
669 f_gmm_auth(umts_aka_challenge, force_gsm_sres, gb_idx);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200670 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100671 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100672
Harald Welteca362462019-05-02 20:11:21 +0200673 l3_mt := f_receive_l3(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?), gb_idx);
674 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
675
Harald Welte04683d02018-02-16 22:43:45 +0100676 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Harald Welteca362462019-05-02 20:11:21 +0200677 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL, gb_idx);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200678}
679
680private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
681 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100682 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100683}
684
685testcase TC_attach() runs on test_CT {
686 var BSSGP_ConnHdlr vc_conn;
687 f_init();
688 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200689 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100690 vc_conn.done;
691}
692
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100693testcase TC_attach_mnc3() runs on test_CT {
694 var BSSGP_ConnHdlr vc_conn;
695 f_init('023042'H);
696 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200697 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100698 vc_conn.done;
699}
700
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200701private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
702 f_gmm_attach(true, false);
703 setverdict(pass);
704}
705testcase TC_attach_umts_aka_umts_res() runs on test_CT {
706 var BSSGP_ConnHdlr vc_conn;
707 f_init();
708 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200709 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200710 vc_conn.done;
711}
712
713private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
714 f_gmm_attach(true, true);
715 setverdict(pass);
716}
717testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
718 var BSSGP_ConnHdlr vc_conn;
719 f_init();
720 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200721 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200722 vc_conn.done;
723}
724
Harald Welte5b7c8122018-02-16 21:48:17 +0100725/* MS never responds to ID REQ, expect ATTACH REJECT */
726private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100727 var RoutingAreaIdentificationV old_ra := f_random_RAI();
728
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200729 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100730 alt {
Harald Welte955aa942019-05-03 01:29:29 +0200731 [] BSSGP[0].receive(tr_GMM_ID_REQ(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100732 /* don't send ID Response */
733 repeat;
734 }
Harald Welte955aa942019-05-03 01:29:29 +0200735 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('09'O)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100736 setverdict(pass);
737 }
Harald Welte955aa942019-05-03 01:29:29 +0200738 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100739 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +0200740 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100741 }
742 }
743}
744testcase TC_attach_auth_id_timeout() runs on test_CT {
745 var BSSGP_ConnHdlr vc_conn;
746 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200747 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 +0100748 vc_conn.done;
749}
750
751/* HLR never responds to SAI REQ, expect ATTACH REJECT */
752private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100753 var RoutingAreaIdentificationV old_ra := f_random_RAI();
754
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200755 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100756 alt {
757 [] as_mm_identity();
758 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
759 }
760 /* don't send SAI-response from HLR */
Harald Welte955aa942019-05-03 01:29:29 +0200761 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Welte5b7c8122018-02-16 21:48:17 +0100762 setverdict(pass);
763}
764testcase TC_attach_auth_sai_timeout() runs on test_CT {
765 var BSSGP_ConnHdlr vc_conn;
766 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200767 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +0100768 vc_conn.done;
769}
770
Harald Weltefe253882018-02-17 09:25:00 +0100771/* HLR rejects SAI, expect ATTACH REJECT */
772private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100773 var RoutingAreaIdentificationV old_ra := f_random_RAI();
774
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200775 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +0100776 alt {
777 [] as_mm_identity();
778 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
779 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
780 }
781 }
Harald Welte955aa942019-05-03 01:29:29 +0200782 BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?));
Harald Weltefe253882018-02-17 09:25:00 +0100783 setverdict(pass);
784}
785testcase TC_attach_auth_sai_reject() runs on test_CT {
786 var BSSGP_ConnHdlr vc_conn;
787 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200788 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +0100789 vc_conn.done;
790}
791
Harald Welte5b7c8122018-02-16 21:48:17 +0100792/* HLR never responds to UL REQ, expect ATTACH REJECT */
793private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +0200794 var PDU_L3_SGSN_MS l3_mt;
Harald Welte5b7c8122018-02-16 21:48:17 +0100795 var RoutingAreaIdentificationV old_ra := f_random_RAI();
796
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200797 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100798 f_gmm_auth();
799 /* Expect MSC to perform LU with HLR */
800 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
801 /* Never follow-up with ISD_REQ or UL_RES */
802 alt {
Harald Welte955aa942019-05-03 01:29:29 +0200803 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100804 setverdict(pass);
805 }
Harald Welte955aa942019-05-03 01:29:29 +0200806 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
807 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100808 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200809 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100810 }
811 }
812}
813testcase TC_attach_gsup_lu_timeout() runs on test_CT {
814 var BSSGP_ConnHdlr vc_conn;
815 f_init();
816 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200817 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100818 vc_conn.done;
819}
820
Harald Welteb7c14e92018-02-17 09:29:16 +0100821/* HLR rejects UL REQ, expect ATTACH REJECT */
822private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +0200823 var PDU_L3_SGSN_MS l3_mt;
Harald Welteb7c14e92018-02-17 09:29:16 +0100824 var RoutingAreaIdentificationV old_ra := f_random_RAI();
825
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200826 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +0100827 f_gmm_auth();
828 /* Expect MSC to perform LU with HLR */
829 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
830 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
831 }
832 alt {
Harald Welte955aa942019-05-03 01:29:29 +0200833 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb7c14e92018-02-17 09:29:16 +0100834 setverdict(pass);
835 }
Harald Welte955aa942019-05-03 01:29:29 +0200836 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
837 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welteb7c14e92018-02-17 09:29:16 +0100838 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200839 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +0100840 }
841 }
842}
843testcase TC_attach_gsup_lu_reject() runs on test_CT {
844 var BSSGP_ConnHdlr vc_conn;
845 f_init();
846 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200847 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +0100848 vc_conn.done;
849}
850
851
Harald Welte3823e2e2018-02-16 21:53:48 +0100852/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
853private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +0200854 var PDU_L3_SGSN_MS l3_mt;
Harald Welte3823e2e2018-02-16 21:53:48 +0100855 var RoutingAreaIdentificationV old_ra := f_random_RAI();
856
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200857 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +0100858 f_gmm_auth();
859 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100860 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100861
Harald Welte955aa942019-05-03 01:29:29 +0200862 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
863 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +0100864 }
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200865 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +0100866 setverdict(pass);
867}
Harald Welte3823e2e2018-02-16 21:53:48 +0100868testcase TC_attach_combined() runs on test_CT {
869 var BSSGP_ConnHdlr vc_conn;
870 f_init();
871 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200872 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100873 vc_conn.done;
874}
875
Harald Welte76dee092018-02-16 22:12:59 +0100876/* Attempt of GPRS ATTACH in 'accept all' mode */
877private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +0200878 var PDU_L3_SGSN_MS l3_mt;
Harald Welte76dee092018-02-16 22:12:59 +0100879 var RoutingAreaIdentificationV old_ra := f_random_RAI();
880
881 g_pars.net.expect_auth := false;
882
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200883 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +0100884 f_gmm_auth();
Harald Welte955aa942019-05-03 01:29:29 +0200885 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
886 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte04683d02018-02-16 22:43:45 +0100887 }
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200888 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +0100889 setverdict(pass);
890}
891testcase TC_attach_accept_all() runs on test_CT {
892 var BSSGP_ConnHdlr vc_conn;
893 f_init();
894 f_sleep(1.0);
895 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +0200896 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +0100897 vc_conn.done;
898}
Harald Welte5b7c8122018-02-16 21:48:17 +0100899
Harald Welteb2124b22018-02-16 22:26:56 +0100900/* Attempt of GPRS ATTACH in 'accept all' mode */
901private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +0100902 var RoutingAreaIdentificationV old_ra := f_random_RAI();
903
904 /* Simulate a foreign IMSI */
905 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +0200906 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welteb2124b22018-02-16 22:26:56 +0100907
908 g_pars.net.expect_auth := false;
909
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200910 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +0100911 alt {
912 [] as_mm_identity();
Harald Welte955aa942019-05-03 01:29:29 +0200913 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT('07'O)) {
Harald Welteb2124b22018-02-16 22:26:56 +0100914 setverdict(pass);
915 }
Harald Welte955aa942019-05-03 01:29:29 +0200916 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Harald Welteb2124b22018-02-16 22:26:56 +0100917 setverdict(pass);
918 }
Harald Welte955aa942019-05-03 01:29:29 +0200919 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200920 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200921 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200922 }
Harald Welteb2124b22018-02-16 22:26:56 +0100923 }
924}
925testcase TC_attach_closed() runs on test_CT {
926 var BSSGP_ConnHdlr vc_conn;
927 f_init();
928 f_sleep(1.0);
929 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
930 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +0200931 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +0100932 vc_conn.done;
933 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +0200934 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +0100935 vc_conn.done;
936}
937
Harald Welte04683d02018-02-16 22:43:45 +0100938/* Routing Area Update from Unknown TLLI -> REJECT */
939private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100940 var RoutingAreaIdentificationV old_ra := f_random_RAI();
941
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200942 f_send_l3_gmm_llc(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, old_ra, false, omit, omit));
Harald Welte04683d02018-02-16 22:43:45 +0100943 alt {
Harald Welte955aa942019-05-03 01:29:29 +0200944 [] BSSGP[0].receive(tr_GMM_RAU_REJECT('0a'O)) {
Harald Welte04683d02018-02-16 22:43:45 +0100945 setverdict(pass);
946 }
947 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200948 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +0100949 }
950}
951testcase TC_rau_unknown() runs on test_CT {
952 var BSSGP_ConnHdlr vc_conn;
953 f_init();
954 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200955 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +0100956 vc_conn.done;
957}
958
Harald Welte91636de2018-02-17 10:16:14 +0100959private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +0100960 /* first perform regular attach */
961 f_TC_attach(id);
962
Alexander Couzens5dce90d2018-07-31 03:16:37 +0200963 f_routing_area_update(g_pars.ra);
964
Harald Welte91636de2018-02-17 10:16:14 +0100965}
966testcase TC_attach_rau() runs on test_CT {
967 var BSSGP_ConnHdlr vc_conn;
968 f_init();
969 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200970 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +0100971 vc_conn.done;
972}
Harald Welte04683d02018-02-16 22:43:45 +0100973
Harald Welte6abb9fe2018-02-17 15:24:48 +0100974/* general GPRS DETACH helper */
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200975function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge, integer bssgp_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +0200976 var PDU_L3_SGSN_MS l3_mt;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100977 timer T := 5.0;
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200978 f_send_l3_gmm_llc(ts_GMM_DET_REQ_MO(detach_type, power_off), bssgp_index);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100979 if (expect_purge) {
980 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
981 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
982 }
983 T.start;
984 alt {
985 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
986 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +0200987 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100988 }
Harald Welte955aa942019-05-03 01:29:29 +0200989 [power_off] BSSGP[bssgp_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100990 g_pars.ra := omit;
Alexander Couzens8e0fd462019-05-11 01:20:55 +0200991 setverdict(fail, "Unexpected DETACH ACCEPT in power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +0200992 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100993 /* TODO: check if any PDP contexts are deactivated on network side? */
994 }
995 [power_off] T.timeout {
996 setverdict(pass);
997 }
Harald Welte955aa942019-05-03 01:29:29 +0200998 [not power_off] BSSGP[bssgp_index].receive(tr_GMM_DET_ACCEPT_MT) -> value l3_mt {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100999 g_pars.ra := omit;
1000 setverdict(pass);
1001 /* TODO: check if any PDP contexts are deactivated on network side? */
1002 }
Harald Welte955aa942019-05-03 01:29:29 +02001003 [] BSSGP[bssgp_index].receive(PDU_L3_SGSN_MS:?) -> value l3_mt {
Alexander Couzens4630e742019-05-11 01:50:10 +02001004 if (power_off) {
1005 setverdict(fail, "Unexpected Layer 3 package received in power-off DETACH");
1006 } else {
1007 setverdict(fail, "Unexpected Layer 3 package received in normal DETACH");
1008 }
1009 mtc.stop;
1010 }
Alexander Couzens90fe6a22018-07-31 19:37:32 +02001011 [] BSSGP[bssgp_index].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +01001012 }
1013}
1014
1015/* IMSI DETACH (non-power-off) for unknown TLLI */
1016private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1017 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
1018}
1019testcase TC_detach_unknown_nopoweroff() runs on test_CT {
1020 var BSSGP_ConnHdlr vc_conn;
1021 f_init();
1022 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001023 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001024 vc_conn.done;
1025}
1026
1027/* IMSI DETACH (power-off) for unknown TLLI */
1028private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1029 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
1030}
1031testcase TC_detach_unknown_poweroff() runs on test_CT {
1032 var BSSGP_ConnHdlr vc_conn;
1033 f_init();
1034 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001035 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001036 vc_conn.done;
1037}
1038
1039/* IMSI DETACH (non-power-off) for known TLLI */
1040private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
1041 /* first perform regular attach */
1042 f_TC_attach(id);
1043
1044 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
1045}
1046testcase TC_detach_nopoweroff() runs on test_CT {
1047 var BSSGP_ConnHdlr vc_conn;
1048 f_init();
1049 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001050 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001051 vc_conn.done;
1052}
1053
1054/* IMSI DETACH (power-off) for known TLLI */
1055private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
1056 /* first perform regular attach */
1057 f_TC_attach(id);
1058
1059 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1060}
1061testcase TC_detach_poweroff() runs on test_CT {
1062 var BSSGP_ConnHdlr vc_conn;
1063 f_init();
1064 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001065 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +01001066 vc_conn.done;
1067}
1068
Harald Welteeded9ad2018-02-17 20:57:34 +01001069type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +01001070 BIT3 tid, /* L3 Transaction ID */
1071 BIT4 nsapi, /* SNDCP NSAPI */
1072 BIT4 sapi, /* LLC SAPI */
1073 QoSV qos, /* QoS parameters */
1074 PDPAddressV addr, /* IP address */
1075 octetstring apn optional, /* APN name */
1076 ProtocolConfigOptionsV pco optional, /* protoco config opts */
1077 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +01001078 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +01001079 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +01001080
Harald Welte822f9102018-02-18 20:39:06 +01001081 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
1082 OCT4 ggsn_tei_u, /* GGSN TEI User */
1083 octetstring ggsn_ip_c, /* GGSN IP Control */
1084 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001085 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +01001086
Harald Welte822f9102018-02-18 20:39:06 +01001087 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
1088 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
1089 octetstring sgsn_ip_c optional, /* SGSN IP Control */
1090 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +01001091};
1092
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001093
1094private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
1095 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
1096 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
1097 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
1098 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
1099 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
1100 f_gtp_register_teid(apars.ggsn_tei_c);
1101 f_gtp_register_teid(apars.ggsn_tei_u);
1102}
1103
Harald Weltef7191672019-05-02 20:37:23 +02001104function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false, integer gb_idx := 0)
1105runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +01001106 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1107 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001108 var template Recovery_gtpc recovery := omit;
1109
1110 if (send_recovery) {
1111 recovery := ts_Recovery(apars.ggsn_restart_ctr);
1112 }
Harald Welteeded9ad2018-02-17 20:57:34 +01001113
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001114 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
Harald Weltef7191672019-05-02 20:37:23 +02001115 apars.apn, apars.pco), gb_idx);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001116 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
1117 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
1118 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1119 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
1120 apars.sgsn_tei_c, apars.gtp_resp_cause,
1121 apars.ggsn_tei_c, apars.ggsn_tei_u,
1122 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001123 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1124 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +01001125 }
1126 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001127 [exp_rej] BSSGP[gb_idx].receive(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001128 setverdict(pass);
1129 }
Harald Welte955aa942019-05-03 01:29:29 +02001130 [exp_rej] BSSGP[gb_idx].receive(tr_SM_ACT_PDP_ACCEPT) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001131 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +02001132 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001133 }
Harald Welte955aa942019-05-03 01:29:29 +02001134 [not exp_rej] BSSGP[gb_idx].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001135 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +02001136 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001137 }
Harald Welte955aa942019-05-03 01:29:29 +02001138 [not exp_rej] BSSGP[gb_idx].receive(tr_SM_ACT_PDP_REJ(apars.tid, ?)) {
Harald Weltef7191672019-05-02 20:37:23 +02001139 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
1140 mtc.stop;
1141 }
Harald Welte955aa942019-05-03 01:29:29 +02001142 [not exp_rej] BSSGP[gb_idx].receive(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001143 setverdict(pass);
1144 }
Harald Weltef7191672019-05-02 20:37:23 +02001145 [] as_xid(apars, gb_idx);
Harald Welteeded9ad2018-02-17 20:57:34 +01001146 }
1147}
1148
Harald Weltef7191672019-05-02 20:37:23 +02001149function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause, integer gb_idx := 0)
1150runs on BSSGP_ConnHdlr {
Harald Welte6f203162018-02-18 22:04:55 +01001151 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1152 var Gtp1cUnitdata g_ud;
1153
Harald Weltef7191672019-05-02 20:37:23 +02001154 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit), gb_idx);
Harald Welte6f203162018-02-18 22:04:55 +01001155 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1156 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Harald Weltef7191672019-05-02 20:37:23 +02001157 BSSGP[gb_idx].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001158 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1159 }
1160 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001161 [] BSSGP[gb_idx].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Harald Welte6f203162018-02-18 22:04:55 +01001162 setverdict(pass);
1163 }
Harald Weltef7191672019-05-02 20:37:23 +02001164 [] as_xid(apars, gb_idx);
Harald Welte6f203162018-02-18 22:04:55 +01001165 }
1166}
1167
Harald Weltef7191672019-05-02 20:37:23 +02001168function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false, integer gb_idx := 0)
1169runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001170 var Gtp1cUnitdata g_ud;
1171 var integer seq_nr := 23;
1172 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1173
Harald Weltef7191672019-05-02 20:37:23 +02001174 BSSGP[gb_idx].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001175 if (error_ind) {
1176 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1177 } else {
1178 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1179 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001180
1181 timer T := 5.0;
1182 T.start;
1183
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001184 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001185 [] BSSGP[gb_idx].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
Harald Weltef7191672019-05-02 20:37:23 +02001186 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), gb_idx);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001187 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001188 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1189 repeat;
1190 }
1191 [] T.timeout {
1192 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1193 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001194 }
1195}
1196
Harald Welte6f203162018-02-18 22:04:55 +01001197
Harald Welteeded9ad2018-02-17 20:57:34 +01001198/* Table 10.5.156/3GPP TS 24.008 */
1199template (value) QoSV t_QosDefault := {
1200 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1201 delayClass := '100'B, /* best effort */
1202 spare1 := '00'B,
1203 precedenceClass := '010'B, /* normal */
1204 spare2 := '0'B,
1205 peakThroughput := '0000'B, /* subscribed */
1206 meanThroughput := '00000'B, /* subscribed */
1207 spare3 := '000'B,
1208 deliverErroneusSDU := omit,
1209 deliveryOrder := omit,
1210 trafficClass := omit,
1211 maxSDUSize := omit,
1212 maxBitrateUplink := omit,
1213 maxBitrateDownlink := omit,
1214 sduErrorRatio := omit,
1215 residualBER := omit,
1216 trafficHandlingPriority := omit,
1217 transferDelay := omit,
1218 guaranteedBitRateUplink := omit,
1219 guaranteedBitRateDownlink := omit,
1220 sourceStatisticsDescriptor := omit,
1221 signallingIndication := omit,
1222 spare4 := omit,
1223 maxBitrateDownlinkExt := omit,
1224 guaranteedBitRateDownlinkExt := omit,
1225 maxBitrateUplinkExt := omit,
1226 guaranteedBitRateUplinkExt := omit,
1227 maxBitrateDownlinkExt2 := omit,
1228 guaranteedBitRateDownlinkExt2 := omit,
1229 maxBitrateUplinkExt2 := omit,
1230 guaranteedBitRateUplinkExt2 := omit
1231}
1232
1233/* 10.5.6.4 / 3GPP TS 24.008 */
1234template (value) PDPAddressV t_AddrIPv4dyn := {
1235 pdpTypeOrg := '0001'B, /* IETF */
1236 spare := '0000'B,
1237 pdpTypeNum := '21'O, /* IPv4 */
1238 addressInfo := omit
1239}
1240template (value) PDPAddressV t_AddrIPv6dyn := {
1241 pdpTypeOrg := '0001'B, /* IETF */
1242 spare := '0000'B,
1243 pdpTypeNum := '53'O, /* IPv6 */
1244 addressInfo := omit
1245}
1246
Harald Welte37692d82018-02-18 15:21:34 +01001247template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001248 tid := '000'B,
1249 nsapi := '0101'B, /* < 5 are reserved */
1250 sapi := '0011'B, /* 3/5/9/11 */
1251 qos := t_QosDefault,
1252 addr := t_AddrIPv4dyn,
1253 apn := omit,
1254 pco := omit,
1255 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001256 gtp_resp_cause := int2oct(128, 1),
1257 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001258
1259 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001260 ggsn_tei_c := f_rnd_octstring(4),
1261 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001262 ggsn_ip_c := f_inet_addr(ggsn_ip),
1263 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001264 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001265
Harald Welteeded9ad2018-02-17 20:57:34 +01001266 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001267 sgsn_tei_u := omit,
1268 sgsn_ip_c := omit,
1269 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001270}
1271
Harald Welte37692d82018-02-18 15:21:34 +01001272template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1273 connId := 1,
1274 remName := f_inet_ntoa(ip),
1275 remPort := GTP1U_PORT
1276}
1277
1278template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1279 connId := 1,
1280 remName := f_inet_ntoa(ip),
1281 remPort := GTP1C_PORT
1282}
1283
1284private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1285 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1286 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1287}
1288
Harald Weltef7191672019-05-02 20:37:23 +02001289private altstep as_xid(PdpActPars apars, integer gb_idx := 0) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02001290 [] BSSGP[gb_idx].receive(tr_LLC_XID_MT_CMD(?, apars.sapi)) {
Harald Welte37692d82018-02-18 15:21:34 +01001291 repeat;
1292 }
1293}
1294
1295template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1296 pDU_SN_UNITDATA := {
1297 nsapi := nsapi,
1298 moreBit := ?,
1299 snPduType := '1'B,
1300 firstSegmentIndicator := ?,
1301 spareBit := ?,
1302 pcomp := ?,
1303 dcomp := ?,
1304 npduNumber := ?,
1305 segmentNumber := ?,
1306 npduNumberContinued := ?,
1307 dataSegmentSnUnitdataPdu := payload
1308 }
1309}
1310
1311/* simple case: single segment, no compression */
1312template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1313 pDU_SN_UNITDATA := {
1314 nsapi := nsapi,
1315 moreBit := '0'B,
1316 snPduType := '1'B,
1317 firstSegmentIndicator := '1'B,
1318 spareBit := '0'B,
1319 pcomp := '0000'B,
1320 dcomp := '0000'B,
1321 npduNumber := '0000'B,
1322 segmentNumber := '0000'B,
1323 npduNumberContinued := '00'O,
1324 dataSegmentSnUnitdataPdu := payload
1325 }
1326}
1327
1328/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
Harald Weltef7191672019-05-02 20:37:23 +02001329private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload, integer gb_idx := 0)
1330runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001331 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1332 f_gtpu_send(apars, payload);
1333 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1334 alt {
Harald Weltef7191672019-05-02 20:37:23 +02001335 [] as_xid(apars, gb_idx);
Harald Welte955aa942019-05-03 01:29:29 +02001336 //[] BSSGP[gb_idx].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
1337 [] BSSGP[gb_idx].receive(tr_SN_UD(apars.nsapi, payload));
Harald Welte37692d82018-02-18 15:21:34 +01001338 }
1339}
1340
Pau Espin Pedrol8be4d192018-07-18 13:43:44 +02001341/* Transceive given 'payload' as MT message from Gb -> OsmoSGSN -> GTP */
Harald Weltef7191672019-05-02 20:37:23 +02001342private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload, integer gb_idx := 0)
1343runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001344 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1345 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1346 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Harald Weltef7191672019-05-02 20:37:23 +02001347 BSSGP[gb_idx].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
Harald Welte37692d82018-02-18 15:21:34 +01001348 /* Expect PDU via GTP from SGSN on simulated GGSN */
1349 alt {
1350 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1351 }
1352}
1353
Harald Welteeded9ad2018-02-17 20:57:34 +01001354private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001355 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001356
1357 /* first perform regular attach */
1358 f_TC_attach(id);
1359
1360 f_pdp_ctx_act(apars);
1361}
1362testcase TC_attach_pdp_act() runs on test_CT {
1363 var BSSGP_ConnHdlr vc_conn;
1364 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001365 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001366 vc_conn.done;
1367}
Harald Welteb2124b22018-02-16 22:26:56 +01001368
Harald Welte835b15f2018-02-18 14:39:11 +01001369/* PDP Context activation for not-attached subscriber; expect fail */
1370private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001371 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001372 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
Harald Welte835b15f2018-02-18 14:39:11 +01001373 apars.apn, apars.pco));
1374 alt {
1375 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Harald Welte955aa942019-05-03 01:29:29 +02001376 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001377 setverdict(pass);
1378 }
1379 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1380 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001381 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001382 }
Harald Welte955aa942019-05-03 01:29:29 +02001383 [] BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT(?, ?)) {
Harald Welte835b15f2018-02-18 14:39:11 +01001384 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001385 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001386 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001387 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001388 }
1389}
1390testcase TC_pdp_act_unattached() runs on test_CT {
1391 var BSSGP_ConnHdlr vc_conn;
1392 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001393 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001394 vc_conn.done;
1395}
1396
Harald Welte37692d82018-02-18 15:21:34 +01001397/* ATTACH + PDP CTX ACT + user plane traffic */
1398private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1399 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1400
1401 /* first perform regular attach */
1402 f_TC_attach(id);
1403 /* then activate PDP context */
1404 f_pdp_ctx_act(apars);
1405 /* then transceive a downlink PDU */
1406 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1407 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1408}
1409testcase TC_attach_pdp_act_user() runs on test_CT {
1410 var BSSGP_ConnHdlr vc_conn;
1411 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001412 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001413 vc_conn.done;
1414}
1415
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001416/* ATTACH + PDP CTX ACT; reject from GGSN */
1417private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1418 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1419
1420 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1421 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1422
1423 /* first perform regular attach */
1424 f_TC_attach(id);
1425 /* then activate PDP context */
1426 f_pdp_ctx_act(apars);
1427}
1428testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1429 var BSSGP_ConnHdlr vc_conn;
1430 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001431 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001432 vc_conn.done;
1433}
Harald Welte835b15f2018-02-18 14:39:11 +01001434
Harald Welte6f203162018-02-18 22:04:55 +01001435/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1436private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1437 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1438
1439 /* first perform regular attach */
1440 f_TC_attach(id);
1441 /* then activate PDP context */
1442 f_pdp_ctx_act(apars);
1443 /* then transceive a downlink PDU */
1444 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1445 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1446
1447 f_pdp_ctx_deact_mo(apars, '00'O);
1448}
1449testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1450 var BSSGP_ConnHdlr vc_conn;
1451 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001452 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 +01001453 vc_conn.done;
1454}
1455
Harald Welte57b9b7f2018-02-18 22:28:13 +01001456/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1457private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1458 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1459
1460 /* first perform regular attach */
1461 f_TC_attach(id);
1462 /* then activate PDP context */
1463 f_pdp_ctx_act(apars);
1464 /* then transceive a downlink PDU */
1465 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1466 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1467
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001468 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001469}
1470testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1471 var BSSGP_ConnHdlr vc_conn;
1472 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001473 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 +01001474 vc_conn.done;
1475}
1476
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02001477/* Test MS sending a duplicate Deact PDP Ctx (OS#3956). */
1478private function f_TC_attach_pdp_act_deact_dup(charstring id) runs on BSSGP_ConnHdlr {
1479 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1480 var Gtp1cUnitdata g_ud;
1481 var integer i;
1482 var OCT1 cause_regular_deact := '24'O;
1483
1484 /* first perform regular attach + PDP context act */
1485 f_TC_attach(id);
1486 f_pdp_ctx_act(apars);
1487
1488 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1489 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
1490
1491 for (i := 0; i < 2; i := i+1) {
1492 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1493 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1494 log("Received deletePDPContextResponse " & int2str(i) & ", seq_nr=" & int2str(seq_nr));
1495 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1496 }
1497 }
1498
1499 alt {
1500 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1501 setverdict(pass);
1502 }
1503 [] as_xid(apars, 0);
1504 }
1505
1506 /* Make sure second DeactPdpAccept is sent: */
1507 timer T := 2.0;
1508 T.start;
1509 alt {
1510 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
1511 setverdict(fail, "Second SM_DEACT_PDP_ACCEPT_MT received");
1512 }
1513 [] T.timeout {
1514 setverdict(pass);
1515 }
1516 }
1517
1518 setverdict(pass);
1519}
1520testcase TC_attach_pdp_act_deact_dup() runs on test_CT {
1521 var BSSGP_ConnHdlr vc_conn;
1522 f_init();
1523 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_dup), testcasename(), g_gb, 46);
1524 vc_conn.done;
1525}
1526
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001527/* ATTACH + ATTACH (2nd) */
1528private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1529 g_pars.t_guard := 5.0;
1530
1531 /* first perform regular attach */
1532 f_TC_attach(id);
1533
1534 /* second to perform regular attach */
1535 f_TC_attach(id);
1536}
1537
1538
1539testcase TC_attach_second_attempt() runs on test_CT {
1540 var BSSGP_ConnHdlr vc_conn;
1541 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001542 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001543 vc_conn.done;
1544}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001545
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02001546private function f_TC_attach_echo_timeout(charstring id) runs on BSSGP_ConnHdlr {
1547 var Gtp1cUnitdata g_ud;
1548 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1549 var integer seq_nr;
1550
1551 /* first perform regular attach */
1552 f_TC_attach(id);
1553 /* then activate PDP context */
1554 f_pdp_ctx_act(apars);
1555
1556 /* Wait to receive first echo request and send initial Restart counter */
1557 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1558 BSSGP[0].clear;
1559 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1560 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1561 f_sleep(int2float(mp_echo_interval)); /* wait until around next echo is expected */
1562 }
1563
1564 /* At some point next echo request not answered will timeout and SGSN
1565 should drop the pdp ctx. Around T3 (3secs) * 6 (+ extra, a lot due to OS#4178): */
1566 timer T := 3.0 * 6.0 + 16.0;
1567 T.start;
1568 alt {
1569 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
1570 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
1571 setverdict(pass);
1572 }
1573 [] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1574 /* SGSN currently doesn't send this message because it expects GGSN to be non-reachable anyway */
1575 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1576 log("Received deletePDPContextRequest seq_nr=" & int2str(seq_nr));
1577 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1578 repeat;
1579 }
1580 [] GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1581 seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1582 log("Received EchoRequest seq_nr=" & int2str(seq_nr));
1583 repeat;
1584 }
1585 [] T.timeout {
1586 setverdict(fail, "BSSGP DeactPdpReq not received");
1587 mtc.stop;
1588 }
1589 [] as_xid(apars);
1590 }
1591 T.stop
1592
1593 setverdict(pass);
1594}
1595/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1596testcase TC_attach_echo_timeout() runs on test_CT {
1597 var BSSGP_ConnHdlr vc_conn;
1598 g_use_echo := true;
1599 f_init();
1600 vc_conn := f_start_handler(refers(f_TC_attach_echo_timeout), testcasename(), g_gb, 67, 50.0);
1601 vc_conn.done;
1602 g_use_echo := false;
1603}
1604
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001605private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001606 var Gtp1cUnitdata g_ud;
1607 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1608
1609 /* first perform regular attach */
1610 f_TC_attach(id);
1611 /* Activate a pdp context against the GGSN */
1612 f_pdp_ctx_act(apars);
1613 /* Wait to receive first echo request and send initial Restart counter */
1614 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1615 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1616 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1617 }
1618 /* Wait to receive second echo request and send incremented Restart
1619 counter. This will fake a restarted GGSN, and pdp ctx allocated
1620 should be released by SGSN */
1621 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1622 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1623 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1624 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1625 }
1626 var OCT1 cause_network_failure := int2oct(38, 1)
1627 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001628 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true)) {
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001629 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001630 setverdict(pass);
1631 }
1632 [] as_xid(apars);
1633 }
1634 setverdict(pass);
1635}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001636/* ATTACH + trigger Recovery procedure through EchoResp */
1637testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001638 var BSSGP_ConnHdlr vc_conn;
1639 g_use_echo := true
1640 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001641 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 +02001642 vc_conn.done;
1643 g_use_echo := false
1644}
1645
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001646private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1647 var Gtp1cUnitdata g_ud;
1648 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1649 var integer seq_nr := 23;
1650 var GtpPeer peer;
1651 /* first perform regular attach */
1652 f_TC_attach(id);
1653
1654 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1655 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1656 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1657 f_pdp_ctx_act(apars, true);
1658
1659 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1660/* received. */
1661 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1662
1663 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1664 would be great to have an active pdp context here before triggering
1665 Recovery, and making sure the the DEACT request is sent by the SGSN.
1666 */
1667
1668 /* Activate a pdp context against the GGSN, send incremented Recovery
1669 IE. This should trigger the recovery path, but still this specific
1670 CTX activation should work. */
1671 apars.exp_rej_cause := omit; /* default value for tests */
1672 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
1673 f_pdp_ctx_act(apars, true);
1674
1675 setverdict(pass);
1676}
1677/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1678testcase TC_attach_restart_ctr_create() runs on test_CT {
1679 var BSSGP_ConnHdlr vc_conn;
1680 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001681 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 +02001682 vc_conn.done;
1683}
1684
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001685/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
1686private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
1687 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1688 var integer seq_nr := 23;
1689 var GtpPeer peer;
1690 var integer i;
1691
1692 /* first perform regular attach */
1693 f_TC_attach(id);
1694 /* then activate PDP context */
1695 f_pdp_ctx_act(apars);
1696
Alexander Couzens0e510e62018-07-28 23:06:00 +02001697 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001698 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1699 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1700
1701 for (i := 0; i < 5; i := i+1) {
1702 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001703 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001704 [] as_xid(apars);
1705 }
1706 }
1707
1708 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
1709
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001710 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001711 setverdict(pass);
1712}
1713testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
1714 var BSSGP_ConnHdlr vc_conn;
1715 f_init();
1716 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001717 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 +02001718 vc_conn.done;
1719}
1720
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001721/* ATTACH + PDP CTX ACT dropped + retrans */
1722private function f_TC_attach_pdp_act_deact_gtp_retrans(charstring id) runs on BSSGP_ConnHdlr {
1723 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1724 var Gtp1cUnitdata g_ud_first, g_ud_second;
1725 /* first perform regular attach */
1726 f_TC_attach(id);
1727
1728 /* then activate PDP context on the Gb side */
1729 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
1730 apars.apn, apars.pco), 0);
1731
1732 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_first {}
1733 log("First createPDPContextRequest received, dropping & waiting for retransmission");
1734 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_second {
1735 if (g_ud_first != g_ud_second) {
1736 setverdict(fail, "Retransmitted GTP message createPDPContextRequest is different from original one!");
1737 mtc.stop;
1738 }
1739 f_process_gtp_ctx_act_req(apars, g_ud_second.gtpc);
1740 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
1741 GTP.send(ts_GTPC_CreatePdpResp(g_ud_second.peer, seq_nr,
1742 apars.sgsn_tei_c, apars.gtp_resp_cause,
1743 apars.ggsn_tei_c, apars.ggsn_tei_u,
1744 apars.nsapi,
1745 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1746 omit, omit));
1747 }
Harald Welte955aa942019-05-03 01:29:29 +02001748 BSSGP[0].receive(tr_SM_ACT_PDP_ACCEPT) {}
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001749
1750 /* Now the same with Deact */
1751 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, '00'O, false, omit), 0);
1752 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_first {}
1753 log("First deletePDPContextRequest received, dropping & waiting for retransmission");
1754 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_second {
1755 if (g_ud_first != g_ud_second) {
1756 setverdict(fail, "Retransmitted GTP message deletePDPContextRequest is different from original one!");
1757 mtc.stop;
1758 }
1759 var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
1760 BSSGP[0].clear;
1761 GTP.send(ts_GTPC_DeletePdpResp(g_ud_second.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1762 }
1763 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001764 [] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001765 setverdict(pass);
1766 }
1767 [] as_xid(apars, 0);
1768 }
1769
1770 setverdict(pass);
1771}
1772testcase TC_attach_pdp_act_deact_gtp_retrans() runs on test_CT {
1773 var BSSGP_ConnHdlr vc_conn;
1774 f_init();
1775 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans), testcasename(), g_gb, 27);
1776 vc_conn.done;
1777}
1778
1779/* Test that SGSN GTP response retransmit queue works fine */
1780private function f_TC_attach_pdp_act_deact_gtp_retrans_resp(charstring id) runs on BSSGP_ConnHdlr {
1781 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1782 var integer seq_nr := 23;
1783 var Gtp1cUnitdata g_ud_first, g_ud_second;
1784 var template Gtp1cUnitdata g_delete_req;
1785 /* first perform regular attach + PDP context act */
1786 f_TC_attach(id);
1787 f_pdp_ctx_act(apars);
1788
1789 /* Now perform an MT DeleteCtxReq and emulate GGSN didn't receive response and sends a duplicated DeleteCtxReq */
1790 BSSGP[0].clear;
1791 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1792 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B);
1793 GTP.send(g_delete_req);
1794 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001795 [] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02001796 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), 0);
1797 }
1798 [] as_xid(apars, 0);
1799 }
1800 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_first {
1801 if (g_ud_first.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != '80'O) {
1802 setverdict(fail, "Received deletePDPContextResponse cause is not 'Request accepted'");
1803 mtc.stop;
1804 }
1805 };
1806
1807 /* Send duplicate DeleteCtxReq */
1808 log("First deletePDPContextResponse received, dropping & retransmitting retransmission of deletePDPContextRequest");
1809 GTP.send(g_delete_req);
1810 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_second {
1811 if (g_ud_first != g_ud_second) {
1812 setverdict(fail, "Retransmitted GTP message deletePDPContextResponse is different from original one!");
1813 mtc.stop;
1814 }
1815 }
1816
1817 /* Let's send now a new DeleteCtxReq (increased seq_nr) to make sure it
1818 * is handled differently by SGSN (expect "non-existent" cause) */
1819 g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr + 1, apars.sgsn_tei_c, apars.nsapi, '1'B);
1820 GTP.send(g_delete_req);
1821 /* Response with cause "non-existent" must be sent with TEID 0 according to specs */
1822 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, '00000000'O)) -> value g_ud_second {
1823 if (g_ud_second.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != 'C0'O) {
1824 setverdict(fail, "Received deletePDPContextResponse cause is not 'Non-existent'");
1825 mtc.stop;
1826 }
1827 }
1828
1829 setverdict(pass);
1830}
1831testcase TC_attach_pdp_act_deact_gtp_retrans_resp() runs on test_CT {
1832 var BSSGP_ConnHdlr vc_conn;
1833 f_init();
1834 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_deact_gtp_retrans_resp), testcasename(), g_gb, 28);
1835 vc_conn.done;
1836}
1837
Alexander Couzens5e307b42018-05-22 18:12:20 +02001838private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
1839 /* MS: perform regular attach */
1840 f_TC_attach(id);
1841
1842 /* HLR: cancel the location request */
1843 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
1844 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02001845
1846 /* ensure no Detach Request got received */
1847 timer T := 5.0;
1848 T.start;
1849 alt {
Harald Welte955aa942019-05-03 01:29:29 +02001850 [] BSSGP[0].receive(tr_GMM_DET_REQ_MT(*, *, *)) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001851 T.stop;
1852 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02001853 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001854 }
1855 [] T.timeout {
1856 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02001857 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001858 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001859 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001860 repeat;
1861 }
1862 }
1863}
1864
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001865/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
1866private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
1867 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1868
1869 /* first perform regular attach */
1870 f_TC_attach(id);
1871 /* then activate PDP context */
1872 f_pdp_ctx_act(apars);
1873 /* then transceive a downlink PDU */
1874 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1875
1876 /* Send Error indication as response from upload PDU and expect deact towards MS */
1877 f_pdp_ctx_deact_mt(apars, true);
1878}
1879testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
1880 var BSSGP_ConnHdlr vc_conn;
1881 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001882 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 +02001883 vc_conn.done;
1884}
1885
Alexander Couzens5e307b42018-05-22 18:12:20 +02001886testcase TC_hlr_location_cancel_request_update() runs on test_CT {
1887 /* MS <-> SGSN: GMM Attach
1888 * HLR -> SGSN: Cancel Location Request
1889 * HLR <- SGSN: Cancel Location Ack
1890 */
1891 var BSSGP_ConnHdlr vc_conn;
1892 f_init();
1893 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001894 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02001895 vc_conn.done;
1896}
1897
1898
Alexander Couzensc87967a2018-05-22 16:09:54 +02001899private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
1900 /* MS: perform regular attach */
1901 f_TC_attach(id);
1902
1903 /* HLR: cancel the location request */
1904 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
1905 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
1906 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
1907
1908 /* MS: receive a Detach Request */
Harald Welte955aa942019-05-03 01:29:29 +02001909 BSSGP[0].receive(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001910 f_send_l3_gmm_llc(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001911
1912 setverdict(pass);
1913}
1914
1915testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
1916 /* MS <-> SGSN: GMM Attach
1917 * HLR -> SGSN: Cancel Location Request
1918 * HLR <- SGSN: Cancel Location Ack
1919 * MS <- SGSN: Detach Request
1920 * SGSN-> MS: Detach Complete
1921 */
1922 var BSSGP_ConnHdlr vc_conn;
1923 f_init();
1924 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001925 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001926 vc_conn.done;
1927}
1928
1929
Alexander Couzens6c47f292018-05-22 17:09:49 +02001930private function f_hlr_location_cancel_request_unknown_subscriber(
1931 charstring id,
1932 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
1933
1934 /* HLR: cancel the location request */
1935 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
1936
1937 /* cause 2 = IMSI_UNKNOWN */
1938 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
1939
1940 setverdict(pass);
1941}
1942
1943private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001944 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001945}
1946
1947testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
1948 /* HLR -> SGSN: Cancel Location Request
1949 * HLR <- SGSN: Cancel Location Error
1950 */
1951
1952 var BSSGP_ConnHdlr vc_conn;
1953 f_init();
1954 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001955 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 +02001956 vc_conn.done;
1957}
1958
1959private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001960 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001961}
1962
1963testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
1964 /* HLR -> SGSN: Cancel Location Request
1965 * HLR <- SGSN: Cancel Location Error
1966 */
1967
1968 var BSSGP_ConnHdlr vc_conn;
1969 f_init();
1970 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001971 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 +02001972 vc_conn.done;
1973}
1974
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001975private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
1976 f_TC_attach(id);
1977 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1978}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001979
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001980testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
1981 /* MS <-> SGSN: Attach
1982 * MS -> SGSN: Detach Req (Power off)
1983 * VTY -> SGSN: Check if MS is NOT in subscriber cache
1984 */
1985 var BSSGP_ConnHdlr vc_conn;
1986 var integer id := 33;
1987 var charstring imsi := hex2str(f_gen_imsi(id));
1988
1989 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001990 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001991 vc_conn.done;
1992
1993 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1994}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001995
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001996/* Attempt an attach, but loose the Identification Request (IMEI) */
1997private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
1998 var integer count_req := 0;
1999 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
2000
Alexander Couzenscdfb7512018-07-31 15:37:14 +02002001 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002002
2003 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002004 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002005 /* break */
2006 }
Harald Welte955aa942019-05-03 01:29:29 +02002007 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002008 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02002009 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002010 repeat;
2011 }
Harald Welte955aa942019-05-03 01:29:29 +02002012 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002013 /* ignore ID REQ IMEI */
2014 count_req := count_req + 1;
2015 repeat;
2016 }
2017 }
2018 if (count_req != 5) {
2019 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002020 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002021 }
2022 setverdict(pass);
2023}
2024
2025testcase TC_attach_no_imei_response() runs on test_CT {
2026 /* MS -> SGSN: Attach Request IMSI
2027 * MS <- SGSN: Identity Request IMSI (optional)
2028 * MS -> SGSN: Identity Response IMSI (optional)
2029 * MS <- SGSN: Identity Request IMEI
2030 * MS -x SGSN: no response
2031 * MS <- SGSN: re-send: Identity Request IMEI 4x
2032 * MS <- SGSN: Attach Reject
2033 */
2034 var BSSGP_ConnHdlr vc_conn;
2035 f_init();
2036 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002037 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 +02002038 vc_conn.done;
2039}
2040
Alexander Couzens53f20562018-06-12 16:24:12 +02002041/* Attempt an attach, but loose the Identification Request (IMSI) */
2042private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
2043 var integer count_req := 0;
2044 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
2045
2046 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
2047 g_pars.p_tmsi := 'c0000035'O;
2048
Alexander Couzenscdfb7512018-07-31 15:37:14 +02002049 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens53f20562018-06-12 16:24:12 +02002050
2051 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002052 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002053 /* break */
2054 }
Harald Welte955aa942019-05-03 01:29:29 +02002055 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002056 /* ignore ID REQ IMSI */
2057 count_req := count_req + 1;
2058 repeat;
2059 }
Harald Welte955aa942019-05-03 01:29:29 +02002060 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzens53f20562018-06-12 16:24:12 +02002061 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02002062 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02002063 repeat;
2064 }
2065 }
2066 if (count_req != 5) {
2067 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02002068 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02002069 }
2070 setverdict(pass);
2071}
2072
2073testcase TC_attach_no_imsi_response() runs on test_CT {
2074 /* MS -> SGSN: Attach Request TMSI (unknown)
2075 * MS <- SGSN: Identity Request IMEI (optional)
2076 * MS -> SGSN: Identity Response IMEI (optional)
2077 * MS <- SGSN: Identity Request IMSI
2078 * MS -x SGSN: no response
2079 * MS <- SGSN: re-send: Identity Request IMSI 4x
2080 * MS <- SGSN: Attach Reject
2081 */
2082 var BSSGP_ConnHdlr vc_conn;
2083 f_init();
2084 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002085 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 +02002086 vc_conn.done;
2087}
2088
Alexander Couzenscf818962018-06-05 18:00:00 +02002089private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
2090 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
2091}
2092
2093testcase TC_attach_check_subscriber_list() runs on test_CT {
2094 /* MS <-> SGSN: Attach
2095 * VTY -> SGSN: Check if MS is in subscriber cache
2096 */
2097 var BSSGP_ConnHdlr vc_conn;
2098 var integer id := 34;
2099 var charstring imsi := hex2str(f_gen_imsi(id));
2100
2101 f_init();
2102 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002103 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02002104 vc_conn.done;
2105
2106 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
2107 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
2108}
2109
Alexander Couzensf9858652018-06-07 16:14:53 +02002110private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
2111 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002112 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzensf9858652018-06-07 16:14:53 +02002113
2114 /* unregister the old IMSI */
2115 f_bssgp_client_unregister(g_pars.imsi);
2116 /* Simulate a foreign IMSI */
Alexander Couzens03d12242018-08-07 16:13:52 +02002117 g_pars.imsi := '001010123456700'H;
Alexander Couzens51114d12018-07-31 18:41:56 +02002118 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Alexander Couzensf9858652018-06-07 16:14:53 +02002119
2120 /* there is no auth */
2121 g_pars.net.expect_auth := false;
2122
Alexander Couzenscdfb7512018-07-31 15:37:14 +02002123 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02002124 f_gmm_auth();
2125 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002126 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzensf9858652018-06-07 16:14:53 +02002127 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02002128 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02002129 }
Harald Welte955aa942019-05-03 01:29:29 +02002130 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) -> value l3_mt {
2131 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzenscdfb7512018-07-31 15:37:14 +02002132 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02002133 setverdict(pass);
2134 }
2135 }
2136}
Alexander Couzens03d12242018-08-07 16:13:52 +02002137
2138private function f_TC_attach_closed_add_vty(charstring id) runs on BSSGP_ConnHdlr {
2139
2140 f_TC_attach_closed_foreign(id);
2141 f_TC_attach_closed_imsi_added(id);
2142
2143}
2144
2145
Alexander Couzensf9858652018-06-07 16:14:53 +02002146testcase TC_attach_closed_add_vty() runs on test_CT {
2147 /* VTY-> SGSN: policy close
2148 * MS -> SGSN: Attach Request
2149 * MS <- SGSN: Identity Request IMSI
2150 * MS -> SGSN: Identity Response IMSI
2151 * MS <- SGSN: Attach Reject
2152 * VTY-> SGSN: policy imsi-acl add IMSI
2153 * MS -> SGSN: Attach Request
2154 * MS <- SGSN: Identity Request IMSI
2155 * MS -> SGSN: Identity Response IMSI
2156 * MS <- SGSN: Identity Request IMEI
2157 * MS -> SGSN: Identity Response IMEI
2158 * MS <- SGSN: Attach Accept
2159 */
2160 var BSSGP_ConnHdlr vc_conn;
2161 f_init();
2162 f_sleep(1.0);
2163 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
2164 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
Alexander Couzens03d12242018-08-07 16:13:52 +02002165 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456700");
2166 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456700");
Alexander Couzensf9858652018-06-07 16:14:53 +02002167 /* test with foreign IMSI: Must Reject */
Alexander Couzens03d12242018-08-07 16:13:52 +02002168 vc_conn := f_start_handler(refers(f_TC_attach_closed_add_vty), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02002169 vc_conn.done;
2170}
2171
Alexander Couzens0085bd72018-06-12 19:08:44 +02002172/* Attempt an attach, but never answer a Attach Complete */
2173private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
2174 var integer count_req := 0;
2175
Alexander Couzenscdfb7512018-07-31 15:37:14 +02002176 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens0085bd72018-06-12 19:08:44 +02002177 f_gmm_auth();
2178
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002179 timer T := 10.0;
2180 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002181 alt {
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002182 [] T.timeout {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002183 /* break */
2184 }
Harald Welte955aa942019-05-03 01:29:29 +02002185 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT(*, *, *)) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02002186 /* ignore */
2187 count_req := count_req + 1;
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02002188 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002189 repeat;
2190 }
2191 }
2192 if (count_req != 5) {
2193 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02002194 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02002195 }
2196 setverdict(pass);
2197}
2198
2199testcase TC_attach_check_complete_resend() runs on test_CT {
2200 /* MS -> SGSN: Attach Request IMSI
2201 * MS <- SGSN: Identity Request *
2202 * MS -> SGSN: Identity Response *
2203 * MS <- SGSN: Attach Complete 5x
2204 */
2205 var BSSGP_ConnHdlr vc_conn;
2206 f_init();
2207 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02002208 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 +02002209 vc_conn.done;
2210}
2211
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002212private function f_routing_area_update(RoutingAreaIdentificationV ra, integer bssgp := 0) runs on BSSGP_ConnHdlr {
Harald Welte955aa942019-05-03 01:29:29 +02002213 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002214
2215 /* then send RAU */
Alexander Couzenscdfb7512018-07-31 15:37:14 +02002216 f_send_l3_gmm_llc(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit), bssgp);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002217 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002218 [] BSSGP[bssgp].receive(tr_GMM_RAU_ACCEPT) -> value l3_mt {
2219 f_process_rau_accept(l3_mt.msgs.gprs_mm.routingAreaUpdateAccept, bssgp);
Alexander Couzenscdfb7512018-07-31 15:37:14 +02002220 f_send_l3_gmm_llc(ts_GMM_RAU_COMPL, bssgp);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002221 setverdict(pass);
2222 }
Harald Welte955aa942019-05-03 01:29:29 +02002223 [] BSSGP[bssgp].receive(tr_GMM_RAU_REJECT) {
Alexander Couzens5dce90d2018-07-31 03:16:37 +02002224 setverdict(fail, "Unexpected RAU Reject");
2225 mtc.stop;
2226 }
2227 [] BSSGP[bssgp].receive { repeat; }
2228 }
2229}
2230
Alexander Couzensbfda9212018-07-31 03:17:33 +02002231private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbfda9212018-07-31 03:17:33 +02002232 /* first perform regular attach */
2233 f_TC_attach(id);
2234
2235 /* then send RAU */
2236 f_routing_area_update(g_pars.ra);
2237
2238 /* do another RAU */
2239 f_routing_area_update(g_pars.ra);
2240
2241 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2242}
2243
2244testcase TC_attach_rau_a_a() runs on test_CT {
2245 /* MS <-> SGSN: Successful Attach
2246 * MS -> SGSN: Routing Area Update Request
2247 * MS <- SGSN: Routing Area Update Accept
2248 * MS -> SGSN: Routing Area Update Request
2249 * MS <- SGSN: Routing Area Update Accept
2250 * MS -> SGSN: Detach (PowerOff)
2251 */
2252 var BSSGP_ConnHdlr vc_conn;
2253 f_init();
2254 f_sleep(1.0);
2255 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
2256 vc_conn.done;
2257}
2258
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002259private function f_TC_attach_rau_a_b(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002260 f_TC_attach(id);
2261
2262 log("attach complete sending rau");
2263 f_routing_area_update(g_pars.ra, 0);
2264
2265 log("rau complete unregistering");
2266 f_bssgp_client_unregister(g_pars.imsi);
2267 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[1], BSSGP_PROC[1]);
2268
2269 log("sending second RAU via different RA");
2270 f_routing_area_update(f_cellid_to_RAI(g_pars.bssgp_cell_id[1]), 1);
2271
2272 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true, 1);
2273}
2274
2275testcase TC_attach_rau_a_b() runs on test_CT {
2276 /* MS <-> SGSN: Successful Attach
2277 * MS -> SGSN: Routing Area _a_ Update Request
2278 * MS <- SGSN: Routing Area _a_ Update Accept
2279 * MS -> SGSN: Routing Area _b_ Update Request
2280 * MS <- SGSN: Routing Area _b_ Update Accept
2281 * MS -> SGSN: Detach (PowerOff)
2282 */
2283 var BSSGP_ConnHdlr vc_conn;
2284 f_init();
2285 f_sleep(1.0);
2286 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_b), testcasename(), g_gb, 38);
2287 vc_conn.done;
2288}
2289
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002290private function f_TC_attach_gmm_attach_req_while_gmm_attach(charstring id) runs on BSSGP_ConnHdlr {
2291 var integer count_req := 0;
2292 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
2293 var RoutingAreaIdentificationV rand_rai := f_random_RAI();
Harald Welte955aa942019-05-03 01:29:29 +02002294 var PDU_L3_SGSN_MS l3_mt;
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002295
2296 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
2297
2298 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002299 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002300 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2301 mtc.stop;
2302 }
Harald Welte955aa942019-05-03 01:29:29 +02002303 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002304 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
2305 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
2306 repeat;
2307 }
Harald Welte955aa942019-05-03 01:29:29 +02002308 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002309 /* send out a second GMM_Attach Request.
2310 * If the SGSN follows the rules, this 2nd ATTACH REQ should be ignored, because
2311 * of the same content */
2312 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
2313 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
2314 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
2315 }
2316 }
2317 f_sleep(1.0);
2318
2319 /* we've sent already a IMEI answer, we should NOT asked again for IMEI */
2320 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002321 [] BSSGP[0].receive(tr_GMM_ID_REQ('001'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002322 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
2323 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
2324 repeat;
2325 }
Harald Welte955aa942019-05-03 01:29:29 +02002326 [] BSSGP[0].receive(tr_GMM_ID_REQ('010'B)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002327 setverdict(fail, "Unexpected GMM ID REQ (IMEI).");
2328 mtc.stop;
2329 }
Harald Welte955aa942019-05-03 01:29:29 +02002330 [] BSSGP[0].receive(tr_GMM_ATTACH_REJECT(?)) {
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002331 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2332 mtc.stop;
2333 }
Harald Welte955aa942019-05-03 01:29:29 +02002334 [] BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2335 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002336 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
2337 setverdict(pass);
2338 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
2339 }
2340 }
2341}
2342
2343testcase TC_attach_gmm_attach_req_while_gmm_attach() runs on test_CT {
2344 /* Testing if the SGSN ignore Attach Request with the exact same content */
2345 /* MS -> SGSN: Attach Request IMSI
2346 * MS <- SGSN: Identity Request IMSI (optional)
2347 * MS -> SGSN: Identity Response IMSI (optional)
2348 * MS <- SGSN: Identity Request IMEI
2349 * MS -> SGSN: Attach Request (2nd)
2350 * MS <- SGSN: Identity Response IMEI
2351 * MS <- SGSN: Attach Accept
2352 * MS -> SGSN: Attach Complete
2353 */
2354 var BSSGP_ConnHdlr vc_conn;
2355 f_init();
2356 f_sleep(1.0);
2357 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
2358 vc_conn := f_start_handler(refers(f_TC_attach_gmm_attach_req_while_gmm_attach), testcasename(), g_gb, 39);
2359 vc_conn.done;
2360}
2361
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002362private function f_TC_attach_usim_resync(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002363 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2364
2365 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2366
2367 /* send Attach Request */
2368 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2369 * 3G auth vectors */
2370 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2371 /* The thing is, if the solSACapability is 'omit', then the
2372 * revisionLevelIndicatior is at the wrong place! */
2373 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
2374 f_send_l3_gmm_llc(attach_req);
2375
2376 /* do the auth */
2377 var PDU_L3_MS_SGSN l3_mo;
2378 var PDU_L3_SGSN_MS l3_mt;
2379 var default di := activate(as_mm_identity());
2380
2381 var GSUP_IE auth_tuple;
2382 var template AuthenticationParameterAUTNTLV autn;
2383
2384 g_pars.vec := f_gen_auth_vec_3g();
2385 autn := {
2386 elementIdentifier := '28'O,
2387 lengthIndicator := lengthof(g_pars.vec.autn),
2388 autnValue := g_pars.vec.autn
2389 };
2390 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2391 g_pars.vec.sres,
2392 g_pars.vec.kc,
2393 g_pars.vec.ik,
2394 g_pars.vec.ck,
2395 g_pars.vec.autn,
2396 g_pars.vec.res));
2397 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2398 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2399 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2400
2401 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2402 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002403 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002404
2405 /* send the gmm auth failure with resync IE */
2406 f_send_l3_gmm_llc(ts_GMM_AUTH_FAIL_UMTS_AKA_RESYNC(g_pars.vec.auts));
2407
2408 /* wait for the GSUP resync request */
2409 GSUP.receive(tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
2410 g_pars.imsi,
2411 g_pars.vec.auts,
2412 g_pars.vec.rand));
2413
2414 /* generate new key material */
2415 g_pars.vec := f_gen_auth_vec_3g();
2416 autn := {
2417 elementIdentifier := '28'O,
2418 lengthIndicator := lengthof(g_pars.vec.autn),
2419 autnValue := g_pars.vec.autn
2420 };
2421
2422 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2423 g_pars.vec.sres,
2424 g_pars.vec.kc,
2425 g_pars.vec.ik,
2426 g_pars.vec.ck,
2427 g_pars.vec.autn,
2428 g_pars.vec.res));
2429 /* send new key material */
2430 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2431
2432 /* wait for the new Auth Request */
2433 auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2434 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Harald Welte955aa942019-05-03 01:29:29 +02002435 BSSGP[0].receive(auth_ciph_req) -> value l3_mt;
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002436 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
2437 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2438 auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2439 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
2440 valueField := substr(g_pars.vec.res, 0, 4)
2441 };
2442 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
2443 elementIdentifier := '21'O,
2444 lengthIndicator := lengthof(g_pars.vec.res) - 4,
2445 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
2446 };
2447 l3_mo := valueof(auth_ciph_resp);
2448 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
2449 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
2450 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
2451 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
2452 }
2453 f_send_l3_gmm_llc(l3_mo);
2454 deactivate(di);
2455
2456 /* Expect SGSN to perform LU with HLR */
2457 f_gmm_gsup_lu_isd();
2458
Harald Welte955aa942019-05-03 01:29:29 +02002459 BSSGP[0].receive(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?)) -> value l3_mt {
2460 f_process_attach_accept(l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002461 }
2462 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
2463 setverdict(pass);
2464}
2465
2466testcase TC_attach_usim_resync() runs on test_CT {
2467 /* MS -> SGSN: Attach Request
2468 * MS <- SGSN: Identity Request IMSI
2469 * MS -> SGSN: Identity Response IMSI
2470 * MS <- SGSN: Identity Request IMEI
2471 * MS -> SGSN: Identity Response IMEI
2472 * HLR<- SGSN: SAI Request
2473 * HLR-> SGSN: SAI Response
2474 * MS <- SGSN: Auth Request
2475 * MS -> SGSN: Auth Failure (with AUTS)
2476 * HLR<- SGSN: SAI Request (with AUTS & RAND)
2477 * HLR-> SGSN: SAI Response (new key material)
2478 * MS <- SGSN: Auth Request (new key material)
2479 * MS -> SGSN: Auth Response
2480 * MS <- SGSN: Attach Accept
2481 * MS -> SGSN: Attach Complete
2482 */
2483 var BSSGP_ConnHdlr vc_conn;
2484 f_init();
2485 f_sleep(1.0);
2486 vc_conn := f_start_handler(refers(f_TC_attach_usim_resync), testcasename(), g_gb, 40);
2487 vc_conn.done;
2488}
2489
Harald Weltea05b8072019-04-23 22:35:05 +02002490
2491/* Send LLC NULL to see if the SGSN survives it (OS#3952) */
2492private function f_TC_llc_null(charstring id) runs on BSSGP_ConnHdlr {
2493 f_gmm_attach(false, false);
2494 f_sleep(1.0);
2495 f_send_llc(ts_LLC_NULL('0'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
2496 /* try to detach to check if SGSN is still alive */
2497 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2498}
2499testcase TC_llc_null() runs on test_CT {
2500 var BSSGP_ConnHdlr vc_conn;
2501 f_init();
2502 f_sleep(1.0);
2503 vc_conn := f_start_handler(refers(f_TC_llc_null), testcasename(), g_gb, 41);
2504 vc_conn.done;
2505}
2506
Harald Welte645a1512019-04-23 23:18:23 +02002507/* Send LLC SABM to see if the SGSN rejects it properly with DM */
2508private function f_TC_llc_sabm_dm_llgmm(charstring id) runs on BSSGP_ConnHdlr {
2509 f_gmm_attach(false, false);
2510 f_sleep(1.0);
2511 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02002512 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LLGMM, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02002513 setverdict(pass);
2514}
2515testcase TC_llc_sabm_dm_llgmm() runs on test_CT {
2516 var BSSGP_ConnHdlr vc_conn;
2517 f_init();
2518 f_sleep(1.0);
2519 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_llgmm), testcasename(), g_gb, 42);
2520 vc_conn.done;
2521}
2522
2523/* Send LLC SABM to see if the SGSN rejects it properly with DM */
2524private function f_TC_llc_sabm_dm_ll5(charstring id) runs on BSSGP_ConnHdlr {
2525 f_gmm_attach(false, false);
2526 f_sleep(1.0);
2527 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LL5, LLC_CR_UL_CMD));
Harald Welte955aa942019-05-03 01:29:29 +02002528 BSSGP[0].receive(tr_LLC_DM(?, c_LLC_SAPI_LL5, LLC_CR_DL_RSP));
Harald Welte645a1512019-04-23 23:18:23 +02002529 setverdict(pass);
2530}
2531testcase TC_llc_sabm_dm_ll5() runs on test_CT {
2532 var BSSGP_ConnHdlr vc_conn;
2533 f_init();
2534 f_sleep(1.0);
2535 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_ll5), testcasename(), g_gb, 43);
2536 vc_conn.done;
2537}
2538
Harald Welte2aaac1b2019-05-02 10:02:53 +02002539/* test XID handshake with empty L3 info: expect empty return (some phones require that, OS#3426 */
2540private function f_TC_xid_empty_l3(charstring id) runs on BSSGP_ConnHdlr {
2541 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2542 var template (value) XID_Information xid;
2543 var template XID_Information xid_rx;
2544
2545 /* first perform regular attach */
2546 f_TC_attach(id);
2547 /* then activate PDP context */
2548 f_pdp_ctx_act(apars);
2549
2550 /* start MO XID */
2551 xid := { ts_XID_L3(''O) };
2552 xid_rx := { tr_XID_L3(''O) };
2553 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
2554 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002555 [] BSSGP[0].receive(tr_LLC_XID(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02002556 [] as_xid(apars);
2557 }
2558 setverdict(pass);
2559}
2560testcase TC_xid_empty_l3() runs on test_CT {
2561 var BSSGP_ConnHdlr vc_conn;
2562 f_init();
2563 f_sleep(1.0);
2564 vc_conn := f_start_handler(refers(f_TC_xid_empty_l3), testcasename(), g_gb, 44);
2565 vc_conn.done;
2566}
2567
2568private function f_TC_xid_n201u(charstring id) runs on BSSGP_ConnHdlr {
2569 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2570 var template (value) XID_Information xid;
2571 var template XID_Information xid_rx;
2572
2573 /* first perform regular attach */
2574 f_TC_attach(id);
2575 /* then activate PDP context */
2576 f_pdp_ctx_act(apars);
2577
2578 /* start MO XID */
2579 xid := { ts_XID_N201U(1234) };
2580 xid_rx := { tr_XID_N201U(1234) };
2581 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
2582 alt {
Harald Welte955aa942019-05-03 01:29:29 +02002583 [] BSSGP[0].receive(tr_LLC_XID_MT_RSP(xid_rx, apars.sapi));
Harald Welte2aaac1b2019-05-02 10:02:53 +02002584 [] as_xid(apars);
2585 }
2586 setverdict(pass);
2587}
2588testcase TC_xid_n201u() runs on test_CT {
2589 var BSSGP_ConnHdlr vc_conn;
2590 f_init();
2591 f_sleep(1.0);
2592 vc_conn := f_start_handler(refers(f_TC_xid_n201u), testcasename(), g_gb, 45);
2593 vc_conn.done;
2594}
2595
Alexander Couzens6bee0872019-05-11 01:48:50 +02002596private function f_TC_attach_pdp_act_gmm_detach(charstring id) runs on BSSGP_ConnHdlr {
2597 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2598
2599 /* first perform regular attach */
2600 f_TC_attach(id);
2601 /* then activate PDP context */
2602 f_pdp_ctx_act(apars);
2603 /* do a normal detach */
2604 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
2605}
2606
2607testcase TC_attach_pdp_act_gmm_detach() runs on test_CT {
2608 /* MS -> SGSN: Attach Request
2609 * MS <-> SGSN: [..]
2610 * MS -> SGSN: Attach Complete
2611 * MS -> SGSN: PDP Activate Request
2612 * MS <- SGSN: PDP Activate Accept
2613 * MS -> SGSN: GMM Detach Request
2614 * MS <- SGSN: GMM Detach Accept
2615 */
2616 var BSSGP_ConnHdlr vc_conn;
2617 f_init();
2618 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_gmm_detach), testcasename(), g_gb, 26);
2619 vc_conn.done;
2620}
Harald Welte645a1512019-04-23 23:18:23 +02002621
2622
Harald Welte5ac31492018-02-15 20:39:13 +01002623control {
Harald Welte5b7c8122018-02-16 21:48:17 +01002624 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01002625 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02002626 execute( TC_attach_umts_aka_umts_res() );
2627 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01002628 execute( TC_attach_auth_id_timeout() );
2629 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01002630 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01002631 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01002632 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01002633 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01002634 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01002635 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002636 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02002637 execute( TC_attach_no_imsi_response() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02002638 execute( TC_attach_closed_add_vty(), 20.0 );
2639 execute( TC_attach_check_subscriber_list(), 20.0 );
2640 execute( TC_attach_detach_check_subscriber_list(), 20.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02002641 execute( TC_attach_check_complete_resend() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02002642 execute( TC_hlr_location_cancel_request_update(), 20.0 );
2643 execute( TC_hlr_location_cancel_request_withdraw(), 20.0 );
2644 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 20.0 );
2645 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 20.0 );
Harald Welte04683d02018-02-16 22:43:45 +01002646 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01002647 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02002648 execute( TC_attach_rau_a_a() );
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002649 execute( TC_attach_rau_a_b() );
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002650 execute( TC_attach_usim_resync() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01002651 execute( TC_detach_unknown_nopoweroff() );
2652 execute( TC_detach_unknown_poweroff() );
2653 execute( TC_detach_nopoweroff() );
2654 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01002655 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01002656 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01002657 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01002658 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01002659 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01002660 execute( TC_attach_pdp_act_user_deact_mt() );
Pau Espin Pedrol2a3302a2019-08-15 16:01:20 +02002661 execute( TC_attach_pdp_act_deact_dup() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02002662 execute( TC_attach_second_attempt() );
Pau Espin Pedrolfcec9142019-08-28 17:33:46 +02002663 execute( TC_attach_echo_timeout() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002664 execute( TC_attach_restart_ctr_echo() );
2665 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002666 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrole6f071f2019-05-29 13:02:42 +02002667 execute( TC_attach_pdp_act_deact_gtp_retrans() );
2668 execute( TC_attach_pdp_act_deact_gtp_retrans_resp() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002669 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Alexander Couzens6bee0872019-05-11 01:48:50 +02002670 execute( TC_attach_pdp_act_gmm_detach() );
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002671 execute( TC_attach_gmm_attach_req_while_gmm_attach() );
Harald Weltea05b8072019-04-23 22:35:05 +02002672
Harald Welte2aaac1b2019-05-02 10:02:53 +02002673 execute( TC_xid_empty_l3() );
2674 execute( TC_xid_n201u() );
2675
Harald Weltea05b8072019-04-23 22:35:05 +02002676 execute( TC_llc_null() );
Harald Welte645a1512019-04-23 23:18:23 +02002677 execute( TC_llc_sabm_dm_llgmm() );
2678 execute( TC_llc_sabm_dm_ll5() );
Harald Welte5ac31492018-02-15 20:39:13 +01002679}
Harald Welte96a33b02018-02-04 10:36:22 +01002680
2681
2682
2683}