blob: 9399e662984db7fe5d79682bc561f450401b5188 [file] [log] [blame]
Harald Welte96a33b02018-02-04 10:36:22 +01001module SGSN_Tests {
2
3import from General_Types all;
4import from Osmocom_Types all;
Harald Welte37692d82018-02-18 15:21:34 +01005import from Native_Functions all;
Harald Welte96a33b02018-02-04 10:36:22 +01006import from NS_Types all;
7import from NS_Emulation all;
8import from BSSGP_Types all;
9import from BSSGP_Emulation all;
Harald Welte5ac31492018-02-15 20:39:13 +010010import from Osmocom_Gb_Types all;
11
12import from MobileL3_CommonIE_Types all;
13import from MobileL3_GMM_SM_Types all;
14import from MobileL3_Types all;
15import from L3_Templates all;
16import from L3_Common all;
17
18import from GSUP_Emulation all;
19import from GSUP_Types all;
20import from IPA_Emulation all;
21
Harald Welteeded9ad2018-02-17 20:57:34 +010022import from GTP_Emulation all;
23import from GTP_Templates all;
24import from GTP_CodecPort all;
25import from GTPC_Types all;
26import from GTPU_Types all;
27
Harald Weltea2526a82018-02-18 19:03:36 +010028import from LLC_Types all;
29import from LLC_Templates all;
30
31import from SNDCP_Types all;
32
Harald Weltebd194722018-02-16 22:11:08 +010033import from TELNETasp_PortType all;
34import from Osmocom_VTY_Functions all;
35
Neels Hofmeyr8df7d152018-03-14 19:03:28 +010036import from GSM_RR_Types all;
37
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020038import from MobileL3_MM_Types all;
39
Harald Welteeded9ad2018-02-17 20:57:34 +010040
Harald Welte5ac31492018-02-15 20:39:13 +010041modulepar {
42 /* IP/port on which we run our internal GSUP/HLR emulation */
43 charstring mp_hlr_ip := "127.0.0.1";
44 integer mp_hlr_port := 4222;
Harald Welteeded9ad2018-02-17 20:57:34 +010045 charstring mp_ggsn_ip := "127.0.0.2";
Alexander Couzens2c12b242018-07-31 00:30:11 +020046
Alexander Couzensf3c1b412018-08-24 00:42:51 +020047 NSConfigurations mp_nsconfig := {
48 {
49 local_udp_port := 21010,
50 local_ip := "127.0.0.1",
51 remote_udp_port := 23000,
52 remote_ip := "127.0.0.1",
53 nsvci := 97,
Harald Welte5e514fa2018-07-05 00:01:45 +020054 nsei := 96,
55 role_sgsn := false,
56 handle_sns := false
Alexander Couzensf3c1b412018-08-24 00:42:51 +020057 },
58 {
59 local_udp_port := 21011,
60 local_ip := "127.0.0.1",
61 remote_udp_port := 23000,
62 remote_ip := "127.0.0.1",
63 nsvci := 98,
Harald Welte5e514fa2018-07-05 00:01:45 +020064 nsei := 97,
65 role_sgsn := false,
66 handle_sns := false
Alexander Couzensf3c1b412018-08-24 00:42:51 +020067 },
68 {
69 local_udp_port := 21012,
70 local_ip := "127.0.0.1",
71 remote_udp_port := 23000,
72 remote_ip := "127.0.0.1",
73 nsvci := 99,
Harald Welte5e514fa2018-07-05 00:01:45 +020074 nsei := 98,
75 role_sgsn := false,
76 handle_sns := false
Alexander Couzensf3c1b412018-08-24 00:42:51 +020077 }
Alexander Couzens2c12b242018-07-31 00:30:11 +020078 };
Harald Welte5ac31492018-02-15 20:39:13 +010079};
80
81type record GbInstance {
82 NS_CT vc_NS,
83 BSSGP_CT vc_BSSGP,
84 BssgpConfig cfg
85};
Harald Welte96a33b02018-02-04 10:36:22 +010086
Alexander Couzens51114d12018-07-31 18:41:56 +020087type record length(3) of GbInstance GbInstances;
Alexander Couzensf3c1b412018-08-24 00:42:51 +020088type record length(3) of NSConfiguration NSConfigurations;
Alexander Couzens51114d12018-07-31 18:41:56 +020089type record length(3) of BssgpCellId BssgpCellIds;
90
Harald Welte96a33b02018-02-04 10:36:22 +010091type component test_CT {
Alexander Couzens51114d12018-07-31 18:41:56 +020092 var GbInstances g_gb;
Harald Welte96a33b02018-02-04 10:36:22 +010093
Harald Welte5ac31492018-02-15 20:39:13 +010094 var GSUP_Emulation_CT vc_GSUP;
95 var IPA_Emulation_CT vc_GSUP_IPA;
96 /* only to get events from IPA underneath GSUP */
97 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +010098
Harald Welteeded9ad2018-02-17 20:57:34 +010099 var GTP_Emulation_CT vc_GTP;
100
Harald Weltebd194722018-02-16 22:11:08 +0100101 port TELNETasp_PT SGSNVTY;
102
Harald Welte96a33b02018-02-04 10:36:22 +0100103 var boolean g_initialized := false;
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200104 var boolean g_use_echo := false;
Harald Welte96a33b02018-02-04 10:36:22 +0100105};
106
Harald Welteeded9ad2018-02-17 20:57:34 +0100107type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100108 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +0100109 timer g_Tguard;
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200110 var LLC_Entities llc;
Harald Welte5ac31492018-02-15 20:39:13 +0100111}
112
113type record SGSN_ConnHdlrNetworkPars {
114 boolean expect_ptmsi,
115 boolean expect_auth,
116 boolean expect_ciph
117};
118
119type record BSSGP_ConnHdlrPars {
120 /* IMEI of the simulated ME */
121 hexstring imei,
Alexander Couzens8f0fb002018-05-02 19:30:55 +0200122 /* IMSI of the simulated MS */
Harald Welte5ac31492018-02-15 20:39:13 +0100123 hexstring imsi,
124 /* MSISDN of the simulated MS (probably unused) */
125 hexstring msisdn,
126 /* P-TMSI allocated to the simulated MS */
127 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +0100128 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100129 /* TLLI of the simulated MS */
130 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +0100131 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100132 RoutingAreaIdentificationV ra optional,
Alexander Couzens51114d12018-07-31 18:41:56 +0200133 BssgpCellIds bssgp_cell_id,
Harald Welte5ac31492018-02-15 20:39:13 +0100134 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +0100135 SGSN_ConnHdlrNetworkPars net,
136 float t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100137};
138
Alexander Couzens89508702018-07-31 04:16:10 +0200139private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200140 /* mcc_mnc is encoded as of 24.008 10.5.5.15 */
Alexander Couzens89508702018-07-31 04:16:10 +0200141 var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;
142
143 var RoutingAreaIdentificationV ret := {
144 mccDigit1 := mcc_mnc[0],
145 mccDigit2 := mcc_mnc[1],
146 mccDigit3 := mcc_mnc[2],
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200147 mncDigit3 := mcc_mnc[3],
148 mncDigit1 := mcc_mnc[4],
149 mncDigit2 := mcc_mnc[5],
Alexander Couzens89508702018-07-31 04:16:10 +0200150 lac := int2oct(cell_id.ra_id.lai.lac, 16),
151 rac := int2oct(cell_id.ra_id.rac, 8)
152 }
153 return ret;
154};
155
Alexander Couzens51114d12018-07-31 18:41:56 +0200156private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
157 gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset));
158 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset));
Harald Welte5ac31492018-02-15 20:39:13 +0100159 /* connect lower end of BSSGP emulation with NS upper port */
160 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
161 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
162 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
163
Alexander Couzensf3c1b412018-08-24 00:42:51 +0200164 gb.vc_NS.start(NSStart(mp_nsconfig[offset]));
Harald Welte5ac31492018-02-15 20:39:13 +0100165 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
166}
167
168private function f_init_gsup(charstring id) runs on test_CT {
169 id := id & "-GSUP";
170 var GsupOps ops := {
171 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
172 };
173
174 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
175 vc_GSUP := GSUP_Emulation_CT.create(id);
176
177 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
178 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
179 /* we use this hack to get events like ASP_IPA_EVENT_UP */
180 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
181
182 vc_GSUP.start(GSUP_Emulation.main(ops, id));
183 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
184
185 /* wait for incoming connection to GSUP port before proceeding */
186 timer T := 10.0;
187 T.start;
188 alt {
189 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
190 [] T.timeout {
191 setverdict(fail, "No connection to GSUP Port");
Daniel Willmannafce8662018-07-06 23:11:32 +0200192 mtc.stop;
Harald Welte5ac31492018-02-15 20:39:13 +0100193 }
194 }
195}
196
Harald Welteeded9ad2018-02-17 20:57:34 +0100197private function f_init_gtp(charstring id) runs on test_CT {
198 id := id & "-GTP";
199
200 var GtpEmulationCfg gtp_cfg := {
201 gtpc_bind_ip := mp_ggsn_ip,
202 gtpc_bind_port := GTP1C_PORT,
203 gtpu_bind_ip := mp_ggsn_ip,
204 gtpu_bind_port := GTP1U_PORT,
205 sgsn_role := false
206 };
207
208 vc_GTP := GTP_Emulation_CT.create(id);
209 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
210}
211
Harald Weltebd194722018-02-16 22:11:08 +0100212private function f_init_vty() runs on test_CT {
213 map(self:SGSNVTY, system:SGSNVTY);
214 f_vty_set_prompts(SGSNVTY);
215 f_vty_transceive(SGSNVTY, "enable");
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200216 f_vty_transceive(SGSNVTY, "reset sgsn state");
Harald Weltebd194722018-02-16 22:11:08 +0100217 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
218}
219
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200220private function f_vty_enable_echo_interval(boolean enable) runs on test_CT {
221 if (enable) {
222 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 echo-interval 5");
223 } else {
224 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 no echo-interval");
225 }
226}
227
Harald Weltebd194722018-02-16 22:11:08 +0100228
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200229/* mcc_mnc is 24.008 10.5.5.15 encoded. 262 42 */
230function f_init(BcdMccMnc mcc_mnc := '262F42'H) runs on test_CT {
Harald Welte96a33b02018-02-04 10:36:22 +0100231 if (g_initialized == true) {
232 return;
233 }
234 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100235 g_gb[0].cfg := {
236 nsei := 96,
237 bvci := 196,
238 cell_id := {
239 ra_id := {
240 lai := {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100241 mcc_mnc := mcc_mnc, lac := 13135},
Harald Welte5ac31492018-02-15 20:39:13 +0100242 rac := 0
243 },
244 cell_id := 20960
245 },
246 sgsn_role := false
247 };
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200248 g_gb[1].cfg := {
249 nsei := 97,
250 bvci := 210,
251 cell_id := {
252 ra_id := {
253 lai := {
254 mcc_mnc := mcc_mnc, lac := 13200},
255 rac := 0
256 },
257 cell_id := 20961
258 },
259 sgsn_role := false
260 };
261 g_gb[2].cfg := {
262 nsei := 98,
263 bvci := 220,
264 cell_id := {
265 ra_id := {
266 lai := {
267 mcc_mnc := mcc_mnc, lac := 13300},
268 rac := 0
269 },
270 cell_id := 20962
271 },
272 sgsn_role := false
273 };
Harald Welte96a33b02018-02-04 10:36:22 +0100274
Alexander Couzens1d1744f2018-08-07 11:56:14 +0200275 f_init_vty();
Alexander Couzens51114d12018-07-31 18:41:56 +0200276 f_init_gb(g_gb[0], "SGSN_Test-Gb0", 0);
277 f_init_gb(g_gb[1], "SGSN_Test-Gb1", 1);
278 f_init_gb(g_gb[2], "SGSN_Test-Gb2", 2);
Harald Welte5ac31492018-02-15 20:39:13 +0100279 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100280 f_init_gtp("SGSN_Test");
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200281 f_vty_enable_echo_interval(g_use_echo);
Harald Welte5ac31492018-02-15 20:39:13 +0100282}
Harald Welte96a33b02018-02-04 10:36:22 +0100283
Harald Welte5ac31492018-02-15 20:39:13 +0100284type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
285
286/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Alexander Couzens51114d12018-07-31 18:41:56 +0200287function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix,
Harald Welte62e29582018-02-16 21:17:11 +0100288 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100289runs on test_CT return BSSGP_ConnHdlr {
290 var BSSGP_ConnHdlr vc_conn;
291 var SGSN_ConnHdlrNetworkPars net_pars := {
292 expect_ptmsi := true,
293 expect_auth := true,
294 expect_ciph := false
295 };
296 var BSSGP_ConnHdlrPars pars := {
297 imei := f_gen_imei(imsi_suffix),
298 imsi := f_gen_imsi(imsi_suffix),
299 msisdn := f_gen_msisdn(imsi_suffix),
300 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100301 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100302 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100303 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100304 ra := omit,
Alexander Couzens51114d12018-07-31 18:41:56 +0200305 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 +0100306 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100307 net := net_pars,
308 t_guard := t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100309 };
310
311 vc_conn := BSSGP_ConnHdlr.create(id);
Alexander Couzens51114d12018-07-31 18:41:56 +0200312 connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP:BSSGP_SP);
313 connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP:BSSGP_PROC);
314 connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP:BSSGP_SP);
315 connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP:BSSGP_PROC);
316 connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP:BSSGP_SP);
317 connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP:BSSGP_PROC);
Harald Welte5ac31492018-02-15 20:39:13 +0100318
319 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
320 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
321
Harald Welteeded9ad2018-02-17 20:57:34 +0100322 connect(vc_conn:GTP, vc_GTP:CLIENT);
323 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
324
Harald Welte5ac31492018-02-15 20:39:13 +0100325 vc_conn.start(f_handler_init(fn, id, pars));
326 return vc_conn;
327}
328
Harald Welte62e29582018-02-16 21:17:11 +0100329private altstep as_Tguard() runs on BSSGP_ConnHdlr {
330 [] g_Tguard.timeout {
331 setverdict(fail, "Tguard timeout");
Daniel Willmannafce8662018-07-06 23:11:32 +0200332 mtc.stop;
Harald Welte62e29582018-02-16 21:17:11 +0100333 }
334}
335
Harald Welte5ac31492018-02-15 20:39:13 +0100336/* first function called in every ConnHdlr */
337private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
338runs on BSSGP_ConnHdlr {
339 /* do some common stuff like setting up g_pars */
340 g_pars := pars;
341
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200342 llc := f_llc_create(false);
343
Harald Welte5ac31492018-02-15 20:39:13 +0100344 /* register with BSSGP core */
Alexander Couzens51114d12018-07-31 18:41:56 +0200345 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welte5ac31492018-02-15 20:39:13 +0100346 /* tell GSUP dispatcher to send this IMSI to us */
347 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100348 /* tell GTP dispatcher to send this IMSI to us */
349 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100350
Harald Welte62e29582018-02-16 21:17:11 +0100351 g_Tguard.start(pars.t_guard);
352 activate(as_Tguard());
353
Harald Welte5ac31492018-02-15 20:39:13 +0100354 /* call the user-supplied test case function */
355 fn.apply(id);
356 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100357}
358
359/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100360 * Detach without Attach
361 * SM procedures without attach / RAU
362 * ATTACH / RAU
363 ** with / without authentication
364 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100365 * re-transmissions of LLC frames
366 * PDP Context activation
367 ** with different GGSN config in SGSN VTY
368 ** with different PDP context type (v4/v6/v46)
369 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100370 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100371 */
372
373testcase TC_wait_ns_up() runs on test_CT {
374 f_init();
375 f_sleep(20.0);
376}
377
Harald Weltea05b8072019-04-23 22:35:05 +0200378function f_send_llc(template (value) PDU_LLC llc_pdu, integer gb_index := 0) runs on BSSGP_ConnHdlr {
379 var octetstring llc_enc := enc_PDU_LLC(valueof(llc_pdu));
380 BSSGP[gb_index].send(ts_BSSGP_UL_UD(g_pars.tlli, g_pars.bssgp_cell_id[gb_index], llc_enc));
381}
382
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200383function f_send_l3_gmm_llc(template PDU_L3_MS_SGSN l3_mo, integer gb_index := 0) runs on BSSGP_ConnHdlr {
384 var octetstring l3_enc := enc_PDU_L3_MS_SGSN(valueof(l3_mo));
385 var BIT4 sapi := f_llc_sapi_by_l3_mo(valueof(l3_mo));
386 var integer n_u := f_llc_get_n_u_tx(llc[bit2int(sapi)]);
Harald Weltea05b8072019-04-23 22:35:05 +0200387 f_send_llc(ts_LLC_UI(l3_enc, sapi, '0'B, n_u));
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200388}
389
Harald Welte5ac31492018-02-15 20:39:13 +0100390altstep as_mm_identity() runs on BSSGP_ConnHdlr {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100391 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200392 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Harald Welte5ac31492018-02-15 20:39:13 +0100393 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200394 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Harald Welte5ac31492018-02-15 20:39:13 +0100395 repeat;
396 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200397 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Harald Welte5ac31492018-02-15 20:39:13 +0100398 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200399 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Harald Welte5ac31492018-02-15 20:39:13 +0100400 repeat;
401 }
402}
Harald Welte96a33b02018-02-04 10:36:22 +0100403
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200404/* perform GMM authentication (if expected).
405 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
406 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
407function f_gmm_auth (boolean umts_aka_challenge := false, boolean force_gsm_sres := false) runs on BSSGP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100408 var BssgpDecoded bd;
409 var PDU_L3_MS_SGSN l3_mo;
410 var PDU_L3_SGSN_MS l3_mt;
411 var default di := activate(as_mm_identity());
412 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200413 var GSUP_IE auth_tuple;
414 var template AuthenticationParameterAUTNTLV autn;
415
416 if (umts_aka_challenge) {
417 g_pars.vec := f_gen_auth_vec_3g();
418 autn := {
419 elementIdentifier := '28'O,
420 lengthIndicator := lengthof(g_pars.vec.autn),
421 autnValue := g_pars.vec.autn
422 };
423
424 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
425 g_pars.vec.sres,
426 g_pars.vec.kc,
427 g_pars.vec.ik,
428 g_pars.vec.ck,
429 g_pars.vec.autn,
430 g_pars.vec.res));
431 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
432 } else {
433 g_pars.vec := f_gen_auth_vec_2g();
434 autn := omit;
435 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
436 g_pars.vec.sres,
437 g_pars.vec.kc));
438 log("GSUP sends only 2G auth tuple", auth_tuple);
439 }
Harald Welte5ac31492018-02-15 20:39:13 +0100440 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
441 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200442
443 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
444 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200445 BSSGP[0].receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
Harald Welte5ac31492018-02-15 20:39:13 +0100446 l3_mt := bd.l3_mt;
447 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200448 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
449
450 if (umts_aka_challenge and not force_gsm_sres) {
451 /* set UMTS response instead */
452 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
453 valueField := substr(g_pars.vec.res, 0, 4)
454 };
455 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
456 elementIdentifier := '21'O,
457 lengthIndicator := lengthof(g_pars.vec.res) - 4,
458 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
459 };
460 }
461
462 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100463 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
464 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
465 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
466 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
467 }
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200468 f_send_l3_gmm_llc(l3_mo);
Harald Welte76dee092018-02-16 22:12:59 +0100469 } else {
470 /* wait for identity procedure */
471 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100472 }
Harald Welte76dee092018-02-16 22:12:59 +0100473
Harald Welte5ac31492018-02-15 20:39:13 +0100474 deactivate(di);
475}
476
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200477function f_upd_ptmsi_and_tlli(OCT4 p_tmsi, integer bssgp_index := 0) runs on BSSGP_ConnHdlr {
Harald Weltef70997d2018-02-17 10:11:19 +0100478 g_pars.p_tmsi := p_tmsi;
479 /* update TLLI */
480 g_pars.tlli_old := g_pars.tlli;
481 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200482 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli, BSSGP_PROC[bssgp_index]);
Harald Weltef70997d2018-02-17 10:11:19 +0100483}
484
Harald Welte04683d02018-02-16 22:43:45 +0100485function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
486 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100487 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Alexander Couzens51114d12018-07-31 18:41:56 +0200488 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100489 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Alexander Couzens51114d12018-07-31 18:41:56 +0200490 & "; expected " & hex2str(g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200491 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100492 }
Harald Welte04683d02018-02-16 22:43:45 +0100493 g_pars.ra := aa.routingAreaIdentification;
494 if (ispresent(aa.allocatedPTMSI)) {
495 if (not g_pars.net.expect_ptmsi) {
496 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200497 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100498 }
Harald Weltef70997d2018-02-17 10:11:19 +0100499 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100500 }
501 if (ispresent(aa.msIdentity)) {
502 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200503 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100504 }
505 /* P-TMSI.sig */
506 if (ispresent(aa.ptmsiSignature)) {
507 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
508 }
509 /* updateTimer */
510 // aa.readyTimer
511 /* T3302, T3319, T3323, T3312_ext, T3324 */
512}
513
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200514function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra, integer bssgp_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte91636de2018-02-17 10:16:14 +0100515 /* mandatory IE */
516 g_pars.ra := ra.routingAreaId;
517 if (ispresent(ra.allocatedPTMSI)) {
518 if (not g_pars.net.expect_ptmsi) {
519 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200520 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100521 }
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200522 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets, bssgp_index);
Harald Welte91636de2018-02-17 10:16:14 +0100523 }
524 if (ispresent(ra.msIdentity)) {
525 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200526 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100527 }
528 /* P-TMSI.sig */
529 if (ispresent(ra.ptmsiSignature)) {
530 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
531 }
532 /* updateTimer */
533 // aa.readyTimer
534 /* T3302, T3319, T3323, T3312_ext, T3324 */
535}
536
537
Harald Welte5a4fa042018-02-16 20:59:21 +0100538function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
539 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
540}
541
Harald Welte23178c52018-02-17 09:36:33 +0100542/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100543private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileL3_CommonIE_Types.MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100544 if (ispresent(g_pars.p_tmsi)) {
545 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
546 } else {
547 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
548 }
549}
550
Harald Welte311ec272018-02-17 09:40:03 +0100551private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100552 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100553 /* Expect MSC to perform LU with HLR */
554 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100555 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
556 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
557 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100558 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
559 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
560}
561
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200562private function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100563 var BssgpDecoded bd;
Harald Welte5a4fa042018-02-16 20:59:21 +0100564 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200565 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
Harald Welte5ac31492018-02-15 20:39:13 +0100566
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200567 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
568 * 3G auth vectors */
569 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
570 /* The thing is, if the solSACapability is 'omit', then the
571 * revisionLevelIndicatior is at the wrong place! */
572 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
573
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200574 f_send_l3_gmm_llc(attach_req);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200575 f_gmm_auth(umts_aka_challenge, force_gsm_sres);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200576 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100577 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100578
Alexander Couzens0e510e62018-07-28 23:06:00 +0200579 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100580 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
581 }
582 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200583 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200584}
585
586private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
587 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100588 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100589}
590
591testcase TC_attach() runs on test_CT {
592 var BSSGP_ConnHdlr vc_conn;
593 f_init();
594 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200595 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100596 vc_conn.done;
597}
598
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100599testcase TC_attach_mnc3() runs on test_CT {
600 var BSSGP_ConnHdlr vc_conn;
601 f_init('023042'H);
602 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200603 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100604 vc_conn.done;
605}
606
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200607private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
608 f_gmm_attach(true, false);
609 setverdict(pass);
610}
611testcase TC_attach_umts_aka_umts_res() runs on test_CT {
612 var BSSGP_ConnHdlr vc_conn;
613 f_init();
614 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200615 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200616 vc_conn.done;
617}
618
619private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
620 f_gmm_attach(true, true);
621 setverdict(pass);
622}
623testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
624 var BSSGP_ConnHdlr vc_conn;
625 f_init();
626 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200627 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200628 vc_conn.done;
629}
630
Harald Welte5b7c8122018-02-16 21:48:17 +0100631/* MS never responds to ID REQ, expect ATTACH REJECT */
632private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100633 var RoutingAreaIdentificationV old_ra := f_random_RAI();
634
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200635 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 +0100636 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200637 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100638 /* don't send ID Response */
639 repeat;
640 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200641 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100642 setverdict(pass);
643 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200644 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100645 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +0200646 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100647 }
648 }
649}
650testcase TC_attach_auth_id_timeout() runs on test_CT {
651 var BSSGP_ConnHdlr vc_conn;
652 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200653 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 +0100654 vc_conn.done;
655}
656
657/* HLR never responds to SAI REQ, expect ATTACH REJECT */
658private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100659 var RoutingAreaIdentificationV old_ra := f_random_RAI();
660
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200661 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 +0100662 alt {
663 [] as_mm_identity();
664 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
665 }
666 /* don't send SAI-response from HLR */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200667 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Welte5b7c8122018-02-16 21:48:17 +0100668 setverdict(pass);
669}
670testcase TC_attach_auth_sai_timeout() runs on test_CT {
671 var BSSGP_ConnHdlr vc_conn;
672 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200673 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +0100674 vc_conn.done;
675}
676
Harald Weltefe253882018-02-17 09:25:00 +0100677/* HLR rejects SAI, expect ATTACH REJECT */
678private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100679 var RoutingAreaIdentificationV old_ra := f_random_RAI();
680
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200681 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 +0100682 alt {
683 [] as_mm_identity();
684 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
685 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
686 }
687 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200688 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Weltefe253882018-02-17 09:25:00 +0100689 setverdict(pass);
690}
691testcase TC_attach_auth_sai_reject() runs on test_CT {
692 var BSSGP_ConnHdlr vc_conn;
693 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200694 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +0100695 vc_conn.done;
696}
697
Harald Welte5b7c8122018-02-16 21:48:17 +0100698/* HLR never responds to UL REQ, expect ATTACH REJECT */
699private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100700 var BssgpDecoded bd;
Harald Welte5b7c8122018-02-16 21:48:17 +0100701 var RoutingAreaIdentificationV old_ra := f_random_RAI();
702
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200703 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 +0100704 f_gmm_auth();
705 /* Expect MSC to perform LU with HLR */
706 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
707 /* Never follow-up with ISD_REQ or UL_RES */
708 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200709 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100710 setverdict(pass);
711 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200712 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100713 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100714 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200715 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100716 }
717 }
718}
719testcase TC_attach_gsup_lu_timeout() runs on test_CT {
720 var BSSGP_ConnHdlr vc_conn;
721 f_init();
722 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200723 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100724 vc_conn.done;
725}
726
Harald Welteb7c14e92018-02-17 09:29:16 +0100727/* HLR rejects UL REQ, expect ATTACH REJECT */
728private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
729 var BssgpDecoded bd;
Harald Welteb7c14e92018-02-17 09:29:16 +0100730 var RoutingAreaIdentificationV old_ra := f_random_RAI();
731
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200732 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 +0100733 f_gmm_auth();
734 /* Expect MSC to perform LU with HLR */
735 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
736 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
737 }
738 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200739 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welteb7c14e92018-02-17 09:29:16 +0100740 setverdict(pass);
741 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200742 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welteb7c14e92018-02-17 09:29:16 +0100743 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
744 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200745 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +0100746 }
747 }
748}
749testcase TC_attach_gsup_lu_reject() runs on test_CT {
750 var BSSGP_ConnHdlr vc_conn;
751 f_init();
752 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200753 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +0100754 vc_conn.done;
755}
756
757
Harald Welte3823e2e2018-02-16 21:53:48 +0100758/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
759private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100760 var BssgpDecoded bd;
Harald Welte3823e2e2018-02-16 21:53:48 +0100761 var RoutingAreaIdentificationV old_ra := f_random_RAI();
762
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200763 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 +0100764 f_gmm_auth();
765 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100766 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100767
Alexander Couzens0e510e62018-07-28 23:06:00 +0200768 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100769 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
770 }
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200771 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +0100772 setverdict(pass);
773}
Harald Welte3823e2e2018-02-16 21:53:48 +0100774testcase TC_attach_combined() runs on test_CT {
775 var BSSGP_ConnHdlr vc_conn;
776 f_init();
777 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200778 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100779 vc_conn.done;
780}
781
Harald Welte76dee092018-02-16 22:12:59 +0100782/* Attempt of GPRS ATTACH in 'accept all' mode */
783private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100784 var BssgpDecoded bd;
Harald Welte76dee092018-02-16 22:12:59 +0100785 var RoutingAreaIdentificationV old_ra := f_random_RAI();
786
787 g_pars.net.expect_auth := false;
788
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200789 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 +0100790 f_gmm_auth();
Alexander Couzens0e510e62018-07-28 23:06:00 +0200791 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100792 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
793 }
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200794 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +0100795 setverdict(pass);
796}
797testcase TC_attach_accept_all() runs on test_CT {
798 var BSSGP_ConnHdlr vc_conn;
799 f_init();
800 f_sleep(1.0);
801 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +0200802 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +0100803 vc_conn.done;
804}
Harald Welte5b7c8122018-02-16 21:48:17 +0100805
Harald Welteb2124b22018-02-16 22:26:56 +0100806/* Attempt of GPRS ATTACH in 'accept all' mode */
807private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +0100808 var RoutingAreaIdentificationV old_ra := f_random_RAI();
809
810 /* Simulate a foreign IMSI */
811 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +0200812 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welteb2124b22018-02-16 22:26:56 +0100813
814 g_pars.net.expect_auth := false;
815
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200816 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 +0100817 alt {
818 [] as_mm_identity();
Alexander Couzens0e510e62018-07-28 23:06:00 +0200819 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
Harald Welteb2124b22018-02-16 22:26:56 +0100820 setverdict(pass);
821 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200822 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welteb2124b22018-02-16 22:26:56 +0100823 setverdict(pass);
824 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200825 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200826 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200827 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200828 }
Harald Welteb2124b22018-02-16 22:26:56 +0100829 }
830}
831testcase TC_attach_closed() runs on test_CT {
832 var BSSGP_ConnHdlr vc_conn;
833 f_init();
834 f_sleep(1.0);
835 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
836 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +0200837 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +0100838 vc_conn.done;
839 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +0200840 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +0100841 vc_conn.done;
842}
843
Harald Welte04683d02018-02-16 22:43:45 +0100844/* Routing Area Update from Unknown TLLI -> REJECT */
845private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100846 var RoutingAreaIdentificationV old_ra := f_random_RAI();
847
Alexander Couzenscdfb7512018-07-31 15:37:14 +0200848 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 +0100849 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200850 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
Harald Welte04683d02018-02-16 22:43:45 +0100851 setverdict(pass);
852 }
853 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200854 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +0100855 }
856}
857testcase TC_rau_unknown() runs on test_CT {
858 var BSSGP_ConnHdlr vc_conn;
859 f_init();
860 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200861 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +0100862 vc_conn.done;
863}
864
Harald Welte91636de2018-02-17 10:16:14 +0100865private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
866 var BssgpDecoded bd;
867
868 /* first perform regular attach */
869 f_TC_attach(id);
870
Alexander Couzens5dce90d2018-07-31 03:16:37 +0200871 f_routing_area_update(g_pars.ra);
872
Harald Welte91636de2018-02-17 10:16:14 +0100873}
874testcase TC_attach_rau() runs on test_CT {
875 var BSSGP_ConnHdlr vc_conn;
876 f_init();
877 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200878 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +0100879 vc_conn.done;
880}
Harald Welte04683d02018-02-16 22:43:45 +0100881
Harald Welte6abb9fe2018-02-17 15:24:48 +0100882/* general GPRS DETACH helper */
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200883function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge, integer bssgp_index := 0) runs on BSSGP_ConnHdlr {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100884 var BssgpDecoded bd;
885 timer T := 5.0;
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200886 f_send_l3_gmm_llc(ts_GMM_DET_REQ_MO(detach_type, power_off), bssgp_index);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100887 if (expect_purge) {
888 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
889 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
890 }
891 T.start;
892 alt {
893 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
894 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +0200895 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100896 }
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200897 [power_off] BSSGP[bssgp_index].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100898 g_pars.ra := omit;
899 setverdict(fail, "Unexpected ATTACH ACCEPT in no-power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +0200900 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100901 /* TODO: check if any PDP contexts are deactivated on network side? */
902 }
903 [power_off] T.timeout {
904 setverdict(pass);
905 }
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200906 [not power_off] BSSGP[bssgp_index].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100907 g_pars.ra := omit;
908 setverdict(pass);
909 /* TODO: check if any PDP contexts are deactivated on network side? */
910 }
Alexander Couzens90fe6a22018-07-31 19:37:32 +0200911 [] BSSGP[bssgp_index].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +0100912 }
913}
914
915/* IMSI DETACH (non-power-off) for unknown TLLI */
916private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
917 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
918}
919testcase TC_detach_unknown_nopoweroff() runs on test_CT {
920 var BSSGP_ConnHdlr vc_conn;
921 f_init();
922 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200923 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100924 vc_conn.done;
925}
926
927/* IMSI DETACH (power-off) for unknown TLLI */
928private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
929 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
930}
931testcase TC_detach_unknown_poweroff() runs on test_CT {
932 var BSSGP_ConnHdlr vc_conn;
933 f_init();
934 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200935 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100936 vc_conn.done;
937}
938
939/* IMSI DETACH (non-power-off) for known TLLI */
940private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
941 /* first perform regular attach */
942 f_TC_attach(id);
943
944 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
945}
946testcase TC_detach_nopoweroff() runs on test_CT {
947 var BSSGP_ConnHdlr vc_conn;
948 f_init();
949 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200950 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100951 vc_conn.done;
952}
953
954/* IMSI DETACH (power-off) for known TLLI */
955private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
956 /* first perform regular attach */
957 f_TC_attach(id);
958
959 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
960}
961testcase TC_detach_poweroff() runs on test_CT {
962 var BSSGP_ConnHdlr vc_conn;
963 f_init();
964 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200965 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100966 vc_conn.done;
967}
968
Harald Welteeded9ad2018-02-17 20:57:34 +0100969type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +0100970 BIT3 tid, /* L3 Transaction ID */
971 BIT4 nsapi, /* SNDCP NSAPI */
972 BIT4 sapi, /* LLC SAPI */
973 QoSV qos, /* QoS parameters */
974 PDPAddressV addr, /* IP address */
975 octetstring apn optional, /* APN name */
976 ProtocolConfigOptionsV pco optional, /* protoco config opts */
977 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +0100978 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +0100979 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +0100980
Harald Welte822f9102018-02-18 20:39:06 +0100981 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
982 OCT4 ggsn_tei_u, /* GGSN TEI User */
983 octetstring ggsn_ip_c, /* GGSN IP Control */
984 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200985 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +0100986
Harald Welte822f9102018-02-18 20:39:06 +0100987 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
988 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
989 octetstring sgsn_ip_c optional, /* SGSN IP Control */
990 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +0100991};
992
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100993
994private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
995 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
996 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
997 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
998 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
999 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
1000 f_gtp_register_teid(apars.ggsn_tei_c);
1001 f_gtp_register_teid(apars.ggsn_tei_u);
1002}
1003
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001004function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false) runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +01001005 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1006 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001007 var template Recovery_gtpc recovery := omit;
1008
1009 if (send_recovery) {
1010 recovery := ts_Recovery(apars.ggsn_restart_ctr);
1011 }
Harald Welteeded9ad2018-02-17 20:57:34 +01001012
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001013 f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
Harald Welteeded9ad2018-02-17 20:57:34 +01001014 apars.apn, apars.pco));
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001015 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
1016 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
1017 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1018 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
1019 apars.sgsn_tei_c, apars.gtp_resp_cause,
1020 apars.ggsn_tei_c, apars.ggsn_tei_u,
1021 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001022 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
1023 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +01001024 }
1025 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001026 [exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause))) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001027 setverdict(pass);
1028 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001029 [exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001030 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +02001031 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001032 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001033 [not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001034 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +02001035 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +01001036 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001037 [not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi))) {
Harald Welteeded9ad2018-02-17 20:57:34 +01001038 setverdict(pass);
1039 }
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001040 [] as_xid(apars);
Harald Welteeded9ad2018-02-17 20:57:34 +01001041 }
1042}
1043
Harald Welte6f203162018-02-18 22:04:55 +01001044function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause) runs on BSSGP_ConnHdlr {
1045 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1046 var Gtp1cUnitdata g_ud;
1047
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001048 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
Harald Welte6f203162018-02-18 22:04:55 +01001049 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1050 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001051 BSSGP[0].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001052 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1053 }
1054 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001055 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {
Harald Welte6f203162018-02-18 22:04:55 +01001056 setverdict(pass);
1057 }
1058 [] as_xid(apars);
1059 }
1060}
1061
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001062function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false) runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001063 var Gtp1cUnitdata g_ud;
1064 var integer seq_nr := 23;
1065 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1066
Alexander Couzens0e510e62018-07-28 23:06:00 +02001067 BSSGP[0].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001068 if (error_ind) {
1069 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1070 } else {
1071 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1072 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001073
1074 timer T := 5.0;
1075 T.start;
1076
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001077 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001078 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001079 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Harald Welte57b9b7f2018-02-18 22:28:13 +01001080 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001081 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1082 repeat;
1083 }
1084 [] T.timeout {
1085 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1086 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001087 }
1088}
1089
Harald Welte6f203162018-02-18 22:04:55 +01001090
Harald Welteeded9ad2018-02-17 20:57:34 +01001091/* Table 10.5.156/3GPP TS 24.008 */
1092template (value) QoSV t_QosDefault := {
1093 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1094 delayClass := '100'B, /* best effort */
1095 spare1 := '00'B,
1096 precedenceClass := '010'B, /* normal */
1097 spare2 := '0'B,
1098 peakThroughput := '0000'B, /* subscribed */
1099 meanThroughput := '00000'B, /* subscribed */
1100 spare3 := '000'B,
1101 deliverErroneusSDU := omit,
1102 deliveryOrder := omit,
1103 trafficClass := omit,
1104 maxSDUSize := omit,
1105 maxBitrateUplink := omit,
1106 maxBitrateDownlink := omit,
1107 sduErrorRatio := omit,
1108 residualBER := omit,
1109 trafficHandlingPriority := omit,
1110 transferDelay := omit,
1111 guaranteedBitRateUplink := omit,
1112 guaranteedBitRateDownlink := omit,
1113 sourceStatisticsDescriptor := omit,
1114 signallingIndication := omit,
1115 spare4 := omit,
1116 maxBitrateDownlinkExt := omit,
1117 guaranteedBitRateDownlinkExt := omit,
1118 maxBitrateUplinkExt := omit,
1119 guaranteedBitRateUplinkExt := omit,
1120 maxBitrateDownlinkExt2 := omit,
1121 guaranteedBitRateDownlinkExt2 := omit,
1122 maxBitrateUplinkExt2 := omit,
1123 guaranteedBitRateUplinkExt2 := omit
1124}
1125
1126/* 10.5.6.4 / 3GPP TS 24.008 */
1127template (value) PDPAddressV t_AddrIPv4dyn := {
1128 pdpTypeOrg := '0001'B, /* IETF */
1129 spare := '0000'B,
1130 pdpTypeNum := '21'O, /* IPv4 */
1131 addressInfo := omit
1132}
1133template (value) PDPAddressV t_AddrIPv6dyn := {
1134 pdpTypeOrg := '0001'B, /* IETF */
1135 spare := '0000'B,
1136 pdpTypeNum := '53'O, /* IPv6 */
1137 addressInfo := omit
1138}
1139
Harald Welte37692d82018-02-18 15:21:34 +01001140template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001141 tid := '000'B,
1142 nsapi := '0101'B, /* < 5 are reserved */
1143 sapi := '0011'B, /* 3/5/9/11 */
1144 qos := t_QosDefault,
1145 addr := t_AddrIPv4dyn,
1146 apn := omit,
1147 pco := omit,
1148 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001149 gtp_resp_cause := int2oct(128, 1),
1150 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001151
1152 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001153 ggsn_tei_c := f_rnd_octstring(4),
1154 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001155 ggsn_ip_c := f_inet_addr(ggsn_ip),
1156 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001157 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001158
Harald Welteeded9ad2018-02-17 20:57:34 +01001159 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001160 sgsn_tei_u := omit,
1161 sgsn_ip_c := omit,
1162 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001163}
1164
Harald Welte37692d82018-02-18 15:21:34 +01001165template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1166 connId := 1,
1167 remName := f_inet_ntoa(ip),
1168 remPort := GTP1U_PORT
1169}
1170
1171template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1172 connId := 1,
1173 remName := f_inet_ntoa(ip),
1174 remPort := GTP1C_PORT
1175}
1176
1177private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1178 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1179 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1180}
1181
1182private altstep as_xid(PdpActPars apars) runs on BSSGP_ConnHdlr {
Harald Welte2aaac1b2019-05-02 10:02:53 +02001183 [] BSSGP[0].receive(tr_BD_LLC(tr_LLC_XID_MT_CMD(?, apars.sapi))) {
Harald Welte37692d82018-02-18 15:21:34 +01001184 repeat;
1185 }
1186}
1187
1188template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1189 pDU_SN_UNITDATA := {
1190 nsapi := nsapi,
1191 moreBit := ?,
1192 snPduType := '1'B,
1193 firstSegmentIndicator := ?,
1194 spareBit := ?,
1195 pcomp := ?,
1196 dcomp := ?,
1197 npduNumber := ?,
1198 segmentNumber := ?,
1199 npduNumberContinued := ?,
1200 dataSegmentSnUnitdataPdu := payload
1201 }
1202}
1203
1204/* simple case: single segment, no compression */
1205template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1206 pDU_SN_UNITDATA := {
1207 nsapi := nsapi,
1208 moreBit := '0'B,
1209 snPduType := '1'B,
1210 firstSegmentIndicator := '1'B,
1211 spareBit := '0'B,
1212 pcomp := '0000'B,
1213 dcomp := '0000'B,
1214 npduNumber := '0000'B,
1215 segmentNumber := '0000'B,
1216 npduNumberContinued := '00'O,
1217 dataSegmentSnUnitdataPdu := payload
1218 }
1219}
1220
1221/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
1222private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1223 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1224 f_gtpu_send(apars, payload);
1225 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1226 alt {
1227 [] as_xid(apars);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001228 [] BSSGP[0].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
Harald Welte37692d82018-02-18 15:21:34 +01001229 }
1230}
1231
Pau Espin Pedrol8be4d192018-07-18 13:43:44 +02001232/* Transceive given 'payload' as MT message from Gb -> OsmoSGSN -> GTP */
Harald Welte37692d82018-02-18 15:21:34 +01001233private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1234 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1235 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1236 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001237 BSSGP[0].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
Harald Welte37692d82018-02-18 15:21:34 +01001238 /* Expect PDU via GTP from SGSN on simulated GGSN */
1239 alt {
1240 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1241 }
1242}
1243
Harald Welteeded9ad2018-02-17 20:57:34 +01001244private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001245 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001246
1247 /* first perform regular attach */
1248 f_TC_attach(id);
1249
1250 f_pdp_ctx_act(apars);
1251}
1252testcase TC_attach_pdp_act() runs on test_CT {
1253 var BSSGP_ConnHdlr vc_conn;
1254 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001255 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001256 vc_conn.done;
1257}
Harald Welteb2124b22018-02-16 22:26:56 +01001258
Harald Welte835b15f2018-02-18 14:39:11 +01001259/* PDP Context activation for not-attached subscriber; expect fail */
1260private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001261 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001262 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 +01001263 apars.apn, apars.pco));
1264 alt {
1265 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001266 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001267 setverdict(pass);
1268 }
1269 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1270 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001271 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001272 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001273 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001274 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001275 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001276 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001277 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001278 }
1279}
1280testcase TC_pdp_act_unattached() runs on test_CT {
1281 var BSSGP_ConnHdlr vc_conn;
1282 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001283 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001284 vc_conn.done;
1285}
1286
Harald Welte37692d82018-02-18 15:21:34 +01001287/* ATTACH + PDP CTX ACT + user plane traffic */
1288private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1289 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1290
1291 /* first perform regular attach */
1292 f_TC_attach(id);
1293 /* then activate PDP context */
1294 f_pdp_ctx_act(apars);
1295 /* then transceive a downlink PDU */
1296 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1297 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1298}
1299testcase TC_attach_pdp_act_user() runs on test_CT {
1300 var BSSGP_ConnHdlr vc_conn;
1301 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001302 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001303 vc_conn.done;
1304}
1305
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001306/* ATTACH + PDP CTX ACT; reject from GGSN */
1307private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1308 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1309
1310 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1311 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1312
1313 /* first perform regular attach */
1314 f_TC_attach(id);
1315 /* then activate PDP context */
1316 f_pdp_ctx_act(apars);
1317}
1318testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1319 var BSSGP_ConnHdlr vc_conn;
1320 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001321 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001322 vc_conn.done;
1323}
Harald Welte835b15f2018-02-18 14:39:11 +01001324
Harald Welte6f203162018-02-18 22:04:55 +01001325/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1326private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1327 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1328
1329 /* first perform regular attach */
1330 f_TC_attach(id);
1331 /* then activate PDP context */
1332 f_pdp_ctx_act(apars);
1333 /* then transceive a downlink PDU */
1334 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1335 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1336
1337 f_pdp_ctx_deact_mo(apars, '00'O);
1338}
1339testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1340 var BSSGP_ConnHdlr vc_conn;
1341 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001342 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 +01001343 vc_conn.done;
1344}
1345
Harald Welte57b9b7f2018-02-18 22:28:13 +01001346/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1347private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1348 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1349
1350 /* first perform regular attach */
1351 f_TC_attach(id);
1352 /* then activate PDP context */
1353 f_pdp_ctx_act(apars);
1354 /* then transceive a downlink PDU */
1355 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1356 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1357
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001358 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001359}
1360testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1361 var BSSGP_ConnHdlr vc_conn;
1362 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001363 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 +01001364 vc_conn.done;
1365}
1366
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001367/* ATTACH + ATTACH (2nd) */
1368private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1369 g_pars.t_guard := 5.0;
1370
1371 /* first perform regular attach */
1372 f_TC_attach(id);
1373
1374 /* second to perform regular attach */
1375 f_TC_attach(id);
1376}
1377
1378
1379testcase TC_attach_second_attempt() runs on test_CT {
1380 var BSSGP_ConnHdlr vc_conn;
1381 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001382 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001383 vc_conn.done;
1384}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001385
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001386private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001387 var Gtp1cUnitdata g_ud;
1388 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1389
1390 /* first perform regular attach */
1391 f_TC_attach(id);
1392 /* Activate a pdp context against the GGSN */
1393 f_pdp_ctx_act(apars);
1394 /* Wait to receive first echo request and send initial Restart counter */
1395 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1396 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1397 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1398 }
1399 /* Wait to receive second echo request and send incremented Restart
1400 counter. This will fake a restarted GGSN, and pdp ctx allocated
1401 should be released by SGSN */
1402 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1403 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1404 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1405 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1406 }
1407 var OCT1 cause_network_failure := int2oct(38, 1)
1408 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001409 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true))) {
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001410 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001411 setverdict(pass);
1412 }
1413 [] as_xid(apars);
1414 }
1415 setverdict(pass);
1416}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001417/* ATTACH + trigger Recovery procedure through EchoResp */
1418testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001419 var BSSGP_ConnHdlr vc_conn;
1420 g_use_echo := true
1421 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001422 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 +02001423 vc_conn.done;
1424 g_use_echo := false
1425}
1426
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001427private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1428 var Gtp1cUnitdata g_ud;
1429 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1430 var integer seq_nr := 23;
1431 var GtpPeer peer;
1432 /* first perform regular attach */
1433 f_TC_attach(id);
1434
1435 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1436 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1437 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1438 f_pdp_ctx_act(apars, true);
1439
1440 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1441/* received. */
1442 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1443
1444 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1445 would be great to have an active pdp context here before triggering
1446 Recovery, and making sure the the DEACT request is sent by the SGSN.
1447 */
1448
1449 /* Activate a pdp context against the GGSN, send incremented Recovery
1450 IE. This should trigger the recovery path, but still this specific
1451 CTX activation should work. */
1452 apars.exp_rej_cause := omit; /* default value for tests */
1453 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
1454 f_pdp_ctx_act(apars, true);
1455
1456 setverdict(pass);
1457}
1458/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1459testcase TC_attach_restart_ctr_create() runs on test_CT {
1460 var BSSGP_ConnHdlr vc_conn;
1461 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001462 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 +02001463 vc_conn.done;
1464}
1465
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001466/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
1467private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
1468 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1469 var integer seq_nr := 23;
1470 var GtpPeer peer;
1471 var integer i;
1472
1473 /* first perform regular attach */
1474 f_TC_attach(id);
1475 /* then activate PDP context */
1476 f_pdp_ctx_act(apars);
1477
Alexander Couzens0e510e62018-07-28 23:06:00 +02001478 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001479 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1480 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1481
1482 for (i := 0; i < 5; i := i+1) {
1483 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001484 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001485 [] as_xid(apars);
1486 }
1487 }
1488
1489 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
1490
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001491 f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001492 setverdict(pass);
1493}
1494testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
1495 var BSSGP_ConnHdlr vc_conn;
1496 f_init();
1497 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001498 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 +02001499 vc_conn.done;
1500}
1501
Alexander Couzens5e307b42018-05-22 18:12:20 +02001502private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
1503 /* MS: perform regular attach */
1504 f_TC_attach(id);
1505
1506 /* HLR: cancel the location request */
1507 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
1508 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02001509
1510 /* ensure no Detach Request got received */
1511 timer T := 5.0;
1512 T.start;
1513 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001514 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(*, *, *))) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001515 T.stop;
1516 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02001517 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001518 }
1519 [] T.timeout {
1520 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02001521 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001522 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001523 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001524 repeat;
1525 }
1526 }
1527}
1528
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001529/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
1530private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
1531 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1532
1533 /* first perform regular attach */
1534 f_TC_attach(id);
1535 /* then activate PDP context */
1536 f_pdp_ctx_act(apars);
1537 /* then transceive a downlink PDU */
1538 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1539
1540 /* Send Error indication as response from upload PDU and expect deact towards MS */
1541 f_pdp_ctx_deact_mt(apars, true);
1542}
1543testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
1544 var BSSGP_ConnHdlr vc_conn;
1545 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001546 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 +02001547 vc_conn.done;
1548}
1549
Alexander Couzens5e307b42018-05-22 18:12:20 +02001550testcase TC_hlr_location_cancel_request_update() runs on test_CT {
1551 /* MS <-> SGSN: GMM Attach
1552 * HLR -> SGSN: Cancel Location Request
1553 * HLR <- SGSN: Cancel Location Ack
1554 */
1555 var BSSGP_ConnHdlr vc_conn;
1556 f_init();
1557 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001558 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02001559 vc_conn.done;
1560}
1561
1562
Alexander Couzensc87967a2018-05-22 16:09:54 +02001563private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
1564 /* MS: perform regular attach */
1565 f_TC_attach(id);
1566
1567 /* HLR: cancel the location request */
1568 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
1569 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
1570 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
1571
1572 /* MS: receive a Detach Request */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001573 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?)));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001574 f_send_l3_gmm_llc(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001575
1576 setverdict(pass);
1577}
1578
1579testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
1580 /* MS <-> SGSN: GMM Attach
1581 * HLR -> SGSN: Cancel Location Request
1582 * HLR <- SGSN: Cancel Location Ack
1583 * MS <- SGSN: Detach Request
1584 * SGSN-> MS: Detach Complete
1585 */
1586 var BSSGP_ConnHdlr vc_conn;
1587 f_init();
1588 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001589 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001590 vc_conn.done;
1591}
1592
1593
Alexander Couzens6c47f292018-05-22 17:09:49 +02001594private function f_hlr_location_cancel_request_unknown_subscriber(
1595 charstring id,
1596 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
1597
1598 /* HLR: cancel the location request */
1599 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
1600
1601 /* cause 2 = IMSI_UNKNOWN */
1602 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
1603
1604 setverdict(pass);
1605}
1606
1607private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001608 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001609}
1610
1611testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
1612 /* HLR -> SGSN: Cancel Location Request
1613 * HLR <- SGSN: Cancel Location Error
1614 */
1615
1616 var BSSGP_ConnHdlr vc_conn;
1617 f_init();
1618 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001619 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 +02001620 vc_conn.done;
1621}
1622
1623private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001624 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001625}
1626
1627testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
1628 /* HLR -> SGSN: Cancel Location Request
1629 * HLR <- SGSN: Cancel Location Error
1630 */
1631
1632 var BSSGP_ConnHdlr vc_conn;
1633 f_init();
1634 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001635 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 +02001636 vc_conn.done;
1637}
1638
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001639private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
1640 f_TC_attach(id);
1641 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1642}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001643
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001644testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
1645 /* MS <-> SGSN: Attach
1646 * MS -> SGSN: Detach Req (Power off)
1647 * VTY -> SGSN: Check if MS is NOT in subscriber cache
1648 */
1649 var BSSGP_ConnHdlr vc_conn;
1650 var integer id := 33;
1651 var charstring imsi := hex2str(f_gen_imsi(id));
1652
1653 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001654 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001655 vc_conn.done;
1656
1657 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1658}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001659
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001660/* Attempt an attach, but loose the Identification Request (IMEI) */
1661private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
1662 var integer count_req := 0;
1663 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1664
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001665 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 +02001666
1667 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001668 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001669 /* break */
1670 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001671 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001672 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001673 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001674 repeat;
1675 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001676 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001677 /* ignore ID REQ IMEI */
1678 count_req := count_req + 1;
1679 repeat;
1680 }
1681 }
1682 if (count_req != 5) {
1683 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001684 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001685 }
1686 setverdict(pass);
1687}
1688
1689testcase TC_attach_no_imei_response() runs on test_CT {
1690 /* MS -> SGSN: Attach Request IMSI
1691 * MS <- SGSN: Identity Request IMSI (optional)
1692 * MS -> SGSN: Identity Response IMSI (optional)
1693 * MS <- SGSN: Identity Request IMEI
1694 * MS -x SGSN: no response
1695 * MS <- SGSN: re-send: Identity Request IMEI 4x
1696 * MS <- SGSN: Attach Reject
1697 */
1698 var BSSGP_ConnHdlr vc_conn;
1699 f_init();
1700 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001701 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 +02001702 vc_conn.done;
1703}
1704
Alexander Couzens53f20562018-06-12 16:24:12 +02001705/* Attempt an attach, but loose the Identification Request (IMSI) */
1706private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
1707 var integer count_req := 0;
1708 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1709
1710 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
1711 g_pars.p_tmsi := 'c0000035'O;
1712
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001713 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 +02001714
1715 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001716 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001717 /* break */
1718 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001719 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001720 /* ignore ID REQ IMSI */
1721 count_req := count_req + 1;
1722 repeat;
1723 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001724 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001725 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001726 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02001727 repeat;
1728 }
1729 }
1730 if (count_req != 5) {
1731 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001732 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02001733 }
1734 setverdict(pass);
1735}
1736
1737testcase TC_attach_no_imsi_response() runs on test_CT {
1738 /* MS -> SGSN: Attach Request TMSI (unknown)
1739 * MS <- SGSN: Identity Request IMEI (optional)
1740 * MS -> SGSN: Identity Response IMEI (optional)
1741 * MS <- SGSN: Identity Request IMSI
1742 * MS -x SGSN: no response
1743 * MS <- SGSN: re-send: Identity Request IMSI 4x
1744 * MS <- SGSN: Attach Reject
1745 */
1746 var BSSGP_ConnHdlr vc_conn;
1747 f_init();
1748 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001749 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 +02001750 vc_conn.done;
1751}
1752
Alexander Couzenscf818962018-06-05 18:00:00 +02001753private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
1754 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
1755}
1756
1757testcase TC_attach_check_subscriber_list() runs on test_CT {
1758 /* MS <-> SGSN: Attach
1759 * VTY -> SGSN: Check if MS is in subscriber cache
1760 */
1761 var BSSGP_ConnHdlr vc_conn;
1762 var integer id := 34;
1763 var charstring imsi := hex2str(f_gen_imsi(id));
1764
1765 f_init();
1766 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001767 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02001768 vc_conn.done;
1769
1770 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1771 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
1772}
1773
Alexander Couzensf9858652018-06-07 16:14:53 +02001774private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
1775 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1776 var BssgpDecoded bd;
1777
1778 /* unregister the old IMSI */
1779 f_bssgp_client_unregister(g_pars.imsi);
1780 /* Simulate a foreign IMSI */
Alexander Couzens03d12242018-08-07 16:13:52 +02001781 g_pars.imsi := '001010123456700'H;
Alexander Couzens51114d12018-07-31 18:41:56 +02001782 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Alexander Couzensf9858652018-06-07 16:14:53 +02001783
1784 /* there is no auth */
1785 g_pars.net.expect_auth := false;
1786
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001787 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 +02001788 f_gmm_auth();
1789 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001790 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzensf9858652018-06-07 16:14:53 +02001791 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001792 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02001793 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001794 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
Alexander Couzensf9858652018-06-07 16:14:53 +02001795 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001796 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02001797 setverdict(pass);
1798 }
1799 }
1800}
Alexander Couzens03d12242018-08-07 16:13:52 +02001801
1802private function f_TC_attach_closed_add_vty(charstring id) runs on BSSGP_ConnHdlr {
1803
1804 f_TC_attach_closed_foreign(id);
1805 f_TC_attach_closed_imsi_added(id);
1806
1807}
1808
1809
Alexander Couzensf9858652018-06-07 16:14:53 +02001810testcase TC_attach_closed_add_vty() runs on test_CT {
1811 /* VTY-> SGSN: policy close
1812 * MS -> SGSN: Attach Request
1813 * MS <- SGSN: Identity Request IMSI
1814 * MS -> SGSN: Identity Response IMSI
1815 * MS <- SGSN: Attach Reject
1816 * VTY-> SGSN: policy imsi-acl add IMSI
1817 * MS -> SGSN: Attach Request
1818 * MS <- SGSN: Identity Request IMSI
1819 * MS -> SGSN: Identity Response IMSI
1820 * MS <- SGSN: Identity Request IMEI
1821 * MS -> SGSN: Identity Response IMEI
1822 * MS <- SGSN: Attach Accept
1823 */
1824 var BSSGP_ConnHdlr vc_conn;
1825 f_init();
1826 f_sleep(1.0);
1827 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1828 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
Alexander Couzens03d12242018-08-07 16:13:52 +02001829 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456700");
1830 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456700");
Alexander Couzensf9858652018-06-07 16:14:53 +02001831 /* test with foreign IMSI: Must Reject */
Alexander Couzens03d12242018-08-07 16:13:52 +02001832 vc_conn := f_start_handler(refers(f_TC_attach_closed_add_vty), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02001833 vc_conn.done;
1834}
1835
Alexander Couzens0085bd72018-06-12 19:08:44 +02001836/* Attempt an attach, but never answer a Attach Complete */
1837private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
1838 var integer count_req := 0;
1839
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001840 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 +02001841 f_gmm_auth();
1842
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02001843 timer T := 10.0;
1844 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02001845 alt {
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02001846 [] T.timeout {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001847 /* break */
1848 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001849 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001850 /* ignore */
1851 count_req := count_req + 1;
Alexander Couzensfa0a75f2018-08-07 15:45:04 +02001852 T.start;
Alexander Couzens0085bd72018-06-12 19:08:44 +02001853 repeat;
1854 }
1855 }
1856 if (count_req != 5) {
1857 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02001858 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02001859 }
1860 setverdict(pass);
1861}
1862
1863testcase TC_attach_check_complete_resend() runs on test_CT {
1864 /* MS -> SGSN: Attach Request IMSI
1865 * MS <- SGSN: Identity Request *
1866 * MS -> SGSN: Identity Response *
1867 * MS <- SGSN: Attach Complete 5x
1868 */
1869 var BSSGP_ConnHdlr vc_conn;
1870 f_init();
1871 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001872 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 +02001873 vc_conn.done;
1874}
1875
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001876private function f_routing_area_update(RoutingAreaIdentificationV ra, integer bssgp := 0) runs on BSSGP_ConnHdlr {
1877 var BssgpDecoded bd;
1878
1879 /* then send RAU */
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001880 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 +02001881 alt {
1882 [] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
Alexander Couzens90fe6a22018-07-31 19:37:32 +02001883 f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept, bssgp);
Alexander Couzenscdfb7512018-07-31 15:37:14 +02001884 f_send_l3_gmm_llc(ts_GMM_RAU_COMPL, bssgp);
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001885 setverdict(pass);
1886 }
1887 [] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
1888 setverdict(fail, "Unexpected RAU Reject");
1889 mtc.stop;
1890 }
1891 [] BSSGP[bssgp].receive { repeat; }
1892 }
1893}
1894
Alexander Couzensbfda9212018-07-31 03:17:33 +02001895private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
1896 var BssgpDecoded bd;
1897
1898 /* first perform regular attach */
1899 f_TC_attach(id);
1900
1901 /* then send RAU */
1902 f_routing_area_update(g_pars.ra);
1903
1904 /* do another RAU */
1905 f_routing_area_update(g_pars.ra);
1906
1907 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1908}
1909
1910testcase TC_attach_rau_a_a() runs on test_CT {
1911 /* MS <-> SGSN: Successful Attach
1912 * MS -> SGSN: Routing Area Update Request
1913 * MS <- SGSN: Routing Area Update Accept
1914 * MS -> SGSN: Routing Area Update Request
1915 * MS <- SGSN: Routing Area Update Accept
1916 * MS -> SGSN: Detach (PowerOff)
1917 */
1918 var BSSGP_ConnHdlr vc_conn;
1919 f_init();
1920 f_sleep(1.0);
1921 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
1922 vc_conn.done;
1923}
1924
Alexander Couzensbe837bd2018-07-31 04:20:11 +02001925private function f_TC_attach_rau_a_b(charstring id) runs on BSSGP_ConnHdlr {
1926 var BssgpDecoded bd;
1927
1928 f_TC_attach(id);
1929
1930 log("attach complete sending rau");
1931 f_routing_area_update(g_pars.ra, 0);
1932
1933 log("rau complete unregistering");
1934 f_bssgp_client_unregister(g_pars.imsi);
1935 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[1], BSSGP_PROC[1]);
1936
1937 log("sending second RAU via different RA");
1938 f_routing_area_update(f_cellid_to_RAI(g_pars.bssgp_cell_id[1]), 1);
1939
1940 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true, 1);
1941}
1942
1943testcase TC_attach_rau_a_b() runs on test_CT {
1944 /* MS <-> SGSN: Successful Attach
1945 * MS -> SGSN: Routing Area _a_ Update Request
1946 * MS <- SGSN: Routing Area _a_ Update Accept
1947 * MS -> SGSN: Routing Area _b_ Update Request
1948 * MS <- SGSN: Routing Area _b_ Update Accept
1949 * MS -> SGSN: Detach (PowerOff)
1950 */
1951 var BSSGP_ConnHdlr vc_conn;
1952 f_init();
1953 f_sleep(1.0);
1954 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_b), testcasename(), g_gb, 38);
1955 vc_conn.done;
1956}
1957
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02001958private function f_TC_attach_gmm_attach_req_while_gmm_attach(charstring id) runs on BSSGP_ConnHdlr {
1959 var integer count_req := 0;
1960 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1961 var RoutingAreaIdentificationV rand_rai := f_random_RAI();
1962 var BssgpDecoded bd;
1963
1964 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
1965
1966 alt {
1967 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
1968 setverdict(fail, "Unexpected GMM ATTACH REJECT");
1969 mtc.stop;
1970 }
1971 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
1972 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
1973 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
1974 repeat;
1975 }
1976 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
1977 /* send out a second GMM_Attach Request.
1978 * If the SGSN follows the rules, this 2nd ATTACH REQ should be ignored, because
1979 * of the same content */
1980 f_send_l3_gmm_llc(ts_GMM_ATTACH_REQ(f_mi_get_lv(), rand_rai, true, false, omit, omit));
1981 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
1982 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
1983 }
1984 }
1985 f_sleep(1.0);
1986
1987 /* we've sent already a IMEI answer, we should NOT asked again for IMEI */
1988 alt {
1989 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
1990 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
1991 f_send_l3_gmm_llc(ts_GMM_ID_RESP(mi));
1992 repeat;
1993 }
1994 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
1995 setverdict(fail, "Unexpected GMM ID REQ (IMEI).");
1996 mtc.stop;
1997 }
1998 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
1999 setverdict(fail, "Unexpected GMM ATTACH REJECT");
2000 mtc.stop;
2001 }
2002 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
2003 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
2004 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
2005 setverdict(pass);
2006 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
2007 }
2008 }
2009}
2010
2011testcase TC_attach_gmm_attach_req_while_gmm_attach() runs on test_CT {
2012 /* Testing if the SGSN ignore Attach Request with the exact same content */
2013 /* MS -> SGSN: Attach Request IMSI
2014 * MS <- SGSN: Identity Request IMSI (optional)
2015 * MS -> SGSN: Identity Response IMSI (optional)
2016 * MS <- SGSN: Identity Request IMEI
2017 * MS -> SGSN: Attach Request (2nd)
2018 * MS <- SGSN: Identity Response IMEI
2019 * MS <- SGSN: Attach Accept
2020 * MS -> SGSN: Attach Complete
2021 */
2022 var BSSGP_ConnHdlr vc_conn;
2023 f_init();
2024 f_sleep(1.0);
2025 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
2026 vc_conn := f_start_handler(refers(f_TC_attach_gmm_attach_req_while_gmm_attach), testcasename(), g_gb, 39);
2027 vc_conn.done;
2028}
2029
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002030private function f_TC_attach_usim_resync(charstring id) runs on BSSGP_ConnHdlr {
2031 var BssgpDecoded bd;
2032 var RoutingAreaIdentificationV old_ra := f_random_RAI();
2033
2034 var template PDU_L3_MS_SGSN attach_req := ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit);
2035
2036 /* send Attach Request */
2037 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
2038 * 3G auth vectors */
2039 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
2040 /* The thing is, if the solSACapability is 'omit', then the
2041 * revisionLevelIndicatior is at the wrong place! */
2042 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
2043 f_send_l3_gmm_llc(attach_req);
2044
2045 /* do the auth */
2046 var PDU_L3_MS_SGSN l3_mo;
2047 var PDU_L3_SGSN_MS l3_mt;
2048 var default di := activate(as_mm_identity());
2049
2050 var GSUP_IE auth_tuple;
2051 var template AuthenticationParameterAUTNTLV autn;
2052
2053 g_pars.vec := f_gen_auth_vec_3g();
2054 autn := {
2055 elementIdentifier := '28'O,
2056 lengthIndicator := lengthof(g_pars.vec.autn),
2057 autnValue := g_pars.vec.autn
2058 };
2059 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2060 g_pars.vec.sres,
2061 g_pars.vec.kc,
2062 g_pars.vec.ik,
2063 g_pars.vec.ck,
2064 g_pars.vec.autn,
2065 g_pars.vec.res));
2066 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
2067 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
2068 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2069
2070 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2071 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
2072 BSSGP[0].receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
2073
2074 /* send the gmm auth failure with resync IE */
2075 f_send_l3_gmm_llc(ts_GMM_AUTH_FAIL_UMTS_AKA_RESYNC(g_pars.vec.auts));
2076
2077 /* wait for the GSUP resync request */
2078 GSUP.receive(tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
2079 g_pars.imsi,
2080 g_pars.vec.auts,
2081 g_pars.vec.rand));
2082
2083 /* generate new key material */
2084 g_pars.vec := f_gen_auth_vec_3g();
2085 autn := {
2086 elementIdentifier := '28'O,
2087 lengthIndicator := lengthof(g_pars.vec.autn),
2088 autnValue := g_pars.vec.autn
2089 };
2090
2091 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
2092 g_pars.vec.sres,
2093 g_pars.vec.kc,
2094 g_pars.vec.ik,
2095 g_pars.vec.ck,
2096 g_pars.vec.autn,
2097 g_pars.vec.res));
2098 /* send new key material */
2099 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
2100
2101 /* wait for the new Auth Request */
2102 auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
2103 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
2104 BSSGP[0].receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
2105 l3_mt := bd.l3_mt;
2106 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
2107 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2108 auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
2109 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
2110 valueField := substr(g_pars.vec.res, 0, 4)
2111 };
2112 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
2113 elementIdentifier := '21'O,
2114 lengthIndicator := lengthof(g_pars.vec.res) - 4,
2115 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
2116 };
2117 l3_mo := valueof(auth_ciph_resp);
2118 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
2119 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
2120 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
2121 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
2122 }
2123 f_send_l3_gmm_llc(l3_mo);
2124 deactivate(di);
2125
2126 /* Expect SGSN to perform LU with HLR */
2127 f_gmm_gsup_lu_isd();
2128
2129 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
2130 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
2131 }
2132 f_send_l3_gmm_llc(ts_GMM_ATTACH_COMPL);
2133 setverdict(pass);
2134}
2135
2136testcase TC_attach_usim_resync() runs on test_CT {
2137 /* MS -> SGSN: Attach Request
2138 * MS <- SGSN: Identity Request IMSI
2139 * MS -> SGSN: Identity Response IMSI
2140 * MS <- SGSN: Identity Request IMEI
2141 * MS -> SGSN: Identity Response IMEI
2142 * HLR<- SGSN: SAI Request
2143 * HLR-> SGSN: SAI Response
2144 * MS <- SGSN: Auth Request
2145 * MS -> SGSN: Auth Failure (with AUTS)
2146 * HLR<- SGSN: SAI Request (with AUTS & RAND)
2147 * HLR-> SGSN: SAI Response (new key material)
2148 * MS <- SGSN: Auth Request (new key material)
2149 * MS -> SGSN: Auth Response
2150 * MS <- SGSN: Attach Accept
2151 * MS -> SGSN: Attach Complete
2152 */
2153 var BSSGP_ConnHdlr vc_conn;
2154 f_init();
2155 f_sleep(1.0);
2156 vc_conn := f_start_handler(refers(f_TC_attach_usim_resync), testcasename(), g_gb, 40);
2157 vc_conn.done;
2158}
2159
Harald Weltea05b8072019-04-23 22:35:05 +02002160
2161/* Send LLC NULL to see if the SGSN survives it (OS#3952) */
2162private function f_TC_llc_null(charstring id) runs on BSSGP_ConnHdlr {
2163 f_gmm_attach(false, false);
2164 f_sleep(1.0);
2165 f_send_llc(ts_LLC_NULL('0'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
2166 /* try to detach to check if SGSN is still alive */
2167 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
2168}
2169testcase TC_llc_null() runs on test_CT {
2170 var BSSGP_ConnHdlr vc_conn;
2171 f_init();
2172 f_sleep(1.0);
2173 vc_conn := f_start_handler(refers(f_TC_llc_null), testcasename(), g_gb, 41);
2174 vc_conn.done;
2175}
2176
Harald Welte645a1512019-04-23 23:18:23 +02002177/* Send LLC SABM to see if the SGSN rejects it properly with DM */
2178private function f_TC_llc_sabm_dm_llgmm(charstring id) runs on BSSGP_ConnHdlr {
2179 f_gmm_attach(false, false);
2180 f_sleep(1.0);
2181 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LLGMM, LLC_CR_UL_CMD));
2182 BSSGP[0].receive(tr_BD_LLC(tr_LLC_DM(?, c_LLC_SAPI_LLGMM, LLC_CR_DL_RSP)));
2183 setverdict(pass);
2184}
2185testcase TC_llc_sabm_dm_llgmm() runs on test_CT {
2186 var BSSGP_ConnHdlr vc_conn;
2187 f_init();
2188 f_sleep(1.0);
2189 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_llgmm), testcasename(), g_gb, 42);
2190 vc_conn.done;
2191}
2192
2193/* Send LLC SABM to see if the SGSN rejects it properly with DM */
2194private function f_TC_llc_sabm_dm_ll5(charstring id) runs on BSSGP_ConnHdlr {
2195 f_gmm_attach(false, false);
2196 f_sleep(1.0);
2197 f_send_llc(ts_LLC_SABM({}, '1'B, c_LLC_SAPI_LL5, LLC_CR_UL_CMD));
2198 BSSGP[0].receive(tr_BD_LLC(tr_LLC_DM(?, c_LLC_SAPI_LL5, LLC_CR_DL_RSP)));
2199 setverdict(pass);
2200}
2201testcase TC_llc_sabm_dm_ll5() runs on test_CT {
2202 var BSSGP_ConnHdlr vc_conn;
2203 f_init();
2204 f_sleep(1.0);
2205 vc_conn := f_start_handler(refers(f_TC_llc_sabm_dm_ll5), testcasename(), g_gb, 43);
2206 vc_conn.done;
2207}
2208
Harald Welte2aaac1b2019-05-02 10:02:53 +02002209/* test XID handshake with empty L3 info: expect empty return (some phones require that, OS#3426 */
2210private function f_TC_xid_empty_l3(charstring id) runs on BSSGP_ConnHdlr {
2211 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2212 var template (value) XID_Information xid;
2213 var template XID_Information xid_rx;
2214
2215 /* first perform regular attach */
2216 f_TC_attach(id);
2217 /* then activate PDP context */
2218 f_pdp_ctx_act(apars);
2219
2220 /* start MO XID */
2221 xid := { ts_XID_L3(''O) };
2222 xid_rx := { tr_XID_L3(''O) };
2223 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
2224 alt {
2225 [] BSSGP[0].receive(tr_BD_LLC(tr_LLC_XID(xid_rx, apars.sapi)));
2226 [] as_xid(apars);
2227 }
2228 setverdict(pass);
2229}
2230testcase TC_xid_empty_l3() runs on test_CT {
2231 var BSSGP_ConnHdlr vc_conn;
2232 f_init();
2233 f_sleep(1.0);
2234 vc_conn := f_start_handler(refers(f_TC_xid_empty_l3), testcasename(), g_gb, 44);
2235 vc_conn.done;
2236}
2237
2238private function f_TC_xid_n201u(charstring id) runs on BSSGP_ConnHdlr {
2239 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
2240 var template (value) XID_Information xid;
2241 var template XID_Information xid_rx;
2242
2243 /* first perform regular attach */
2244 f_TC_attach(id);
2245 /* then activate PDP context */
2246 f_pdp_ctx_act(apars);
2247
2248 /* start MO XID */
2249 xid := { ts_XID_N201U(1234) };
2250 xid_rx := { tr_XID_N201U(1234) };
2251 f_send_llc(ts_LLC_XID_MO_CMD(xid, apars.sapi));
2252 alt {
2253 [] BSSGP[0].receive(tr_BD_LLC(tr_LLC_XID_MT_RSP(xid_rx, apars.sapi)));
2254 [] as_xid(apars);
2255 }
2256 setverdict(pass);
2257}
2258testcase TC_xid_n201u() runs on test_CT {
2259 var BSSGP_ConnHdlr vc_conn;
2260 f_init();
2261 f_sleep(1.0);
2262 vc_conn := f_start_handler(refers(f_TC_xid_n201u), testcasename(), g_gb, 45);
2263 vc_conn.done;
2264}
2265
Harald Welte645a1512019-04-23 23:18:23 +02002266
2267
Harald Welte5ac31492018-02-15 20:39:13 +01002268control {
Harald Welte5b7c8122018-02-16 21:48:17 +01002269 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01002270 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02002271 execute( TC_attach_umts_aka_umts_res() );
2272 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01002273 execute( TC_attach_auth_id_timeout() );
2274 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01002275 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01002276 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01002277 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01002278 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01002279 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01002280 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02002281 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02002282 execute( TC_attach_no_imsi_response() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02002283 execute( TC_attach_closed_add_vty(), 20.0 );
2284 execute( TC_attach_check_subscriber_list(), 20.0 );
2285 execute( TC_attach_detach_check_subscriber_list(), 20.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02002286 execute( TC_attach_check_complete_resend() );
Alexander Couzensd81876a2018-08-07 12:43:16 +02002287 execute( TC_hlr_location_cancel_request_update(), 20.0 );
2288 execute( TC_hlr_location_cancel_request_withdraw(), 20.0 );
2289 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 20.0 );
2290 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 20.0 );
Harald Welte04683d02018-02-16 22:43:45 +01002291 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01002292 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02002293 execute( TC_attach_rau_a_a() );
Alexander Couzensbe837bd2018-07-31 04:20:11 +02002294 execute( TC_attach_rau_a_b() );
Alexander Couzens0c6324f2018-09-14 16:37:04 +02002295 execute( TC_attach_usim_resync() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01002296 execute( TC_detach_unknown_nopoweroff() );
2297 execute( TC_detach_unknown_poweroff() );
2298 execute( TC_detach_nopoweroff() );
2299 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01002300 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01002301 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01002302 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01002303 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01002304 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01002305 execute( TC_attach_pdp_act_user_deact_mt() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02002306 execute( TC_attach_second_attempt() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02002307 execute( TC_attach_restart_ctr_echo() );
2308 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02002309 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02002310 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Alexander Couzenscf3c93d2018-08-07 19:48:27 +02002311 execute( TC_attach_gmm_attach_req_while_gmm_attach() );
Harald Weltea05b8072019-04-23 22:35:05 +02002312
Harald Welte2aaac1b2019-05-02 10:02:53 +02002313 execute( TC_xid_empty_l3() );
2314 execute( TC_xid_n201u() );
2315
Harald Weltea05b8072019-04-23 22:35:05 +02002316 execute( TC_llc_null() );
Harald Welte645a1512019-04-23 23:18:23 +02002317 execute( TC_llc_sabm_dm_llgmm() );
2318 execute( TC_llc_sabm_dm_ll5() );
Harald Welte5ac31492018-02-15 20:39:13 +01002319}
Harald Welte96a33b02018-02-04 10:36:22 +01002320
2321
2322
2323}