blob: 6d917387d34aec91bbe77d600d472888423ce248 [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
47 NSConfiguration mp_nsconfig := {
48 local_udp_port := 23000,
49 local_ip := "127.0.0.1",
50 remote_udp_port := 21000,
51 remote_ip := "127.0.0.1",
52 nsvci := 0,
53 nsei := 2342
54 };
Harald Welte5ac31492018-02-15 20:39:13 +010055};
56
57type record GbInstance {
58 NS_CT vc_NS,
59 BSSGP_CT vc_BSSGP,
60 BssgpConfig cfg
61};
Harald Welte96a33b02018-02-04 10:36:22 +010062
Alexander Couzens51114d12018-07-31 18:41:56 +020063type record length(3) of GbInstance GbInstances;
64type record length(3) of BssgpCellId BssgpCellIds;
65
Harald Welte96a33b02018-02-04 10:36:22 +010066type component test_CT {
Alexander Couzens51114d12018-07-31 18:41:56 +020067 var GbInstances g_gb;
Harald Welte96a33b02018-02-04 10:36:22 +010068
Harald Welte5ac31492018-02-15 20:39:13 +010069 var GSUP_Emulation_CT vc_GSUP;
70 var IPA_Emulation_CT vc_GSUP_IPA;
71 /* only to get events from IPA underneath GSUP */
72 port IPA_CTRL_PT GSUP_IPA_EVENT;
Harald Welte96a33b02018-02-04 10:36:22 +010073
Harald Welteeded9ad2018-02-17 20:57:34 +010074 var GTP_Emulation_CT vc_GTP;
75
Harald Weltebd194722018-02-16 22:11:08 +010076 port TELNETasp_PT SGSNVTY;
77
Harald Welte96a33b02018-02-04 10:36:22 +010078 var boolean g_initialized := false;
Pau Espin Pedroldc27e482018-07-10 14:02:49 +020079 var boolean g_use_echo := false;
Harald Welte96a33b02018-02-04 10:36:22 +010080};
81
Harald Welteeded9ad2018-02-17 20:57:34 +010082type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +010083 var BSSGP_ConnHdlrPars g_pars;
Harald Welte62e29582018-02-16 21:17:11 +010084 timer g_Tguard;
Harald Welte5ac31492018-02-15 20:39:13 +010085}
86
87type record SGSN_ConnHdlrNetworkPars {
88 boolean expect_ptmsi,
89 boolean expect_auth,
90 boolean expect_ciph
91};
92
93type record BSSGP_ConnHdlrPars {
94 /* IMEI of the simulated ME */
95 hexstring imei,
Alexander Couzens8f0fb002018-05-02 19:30:55 +020096 /* IMSI of the simulated MS */
Harald Welte5ac31492018-02-15 20:39:13 +010097 hexstring imsi,
98 /* MSISDN of the simulated MS (probably unused) */
99 hexstring msisdn,
100 /* P-TMSI allocated to the simulated MS */
101 OCT4 p_tmsi optional,
Harald Welte04683d02018-02-16 22:43:45 +0100102 OCT3 p_tmsi_sig optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100103 /* TLLI of the simulated MS */
104 OCT4 tlli,
Harald Weltef70997d2018-02-17 10:11:19 +0100105 OCT4 tlli_old optional,
Harald Welte5ac31492018-02-15 20:39:13 +0100106 RoutingAreaIdentificationV ra optional,
Alexander Couzens51114d12018-07-31 18:41:56 +0200107 BssgpCellIds bssgp_cell_id,
Harald Welte5ac31492018-02-15 20:39:13 +0100108 AuthVector vec optional,
Harald Welte62e29582018-02-16 21:17:11 +0100109 SGSN_ConnHdlrNetworkPars net,
110 float t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100111};
112
Alexander Couzens89508702018-07-31 04:16:10 +0200113private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {
114 var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;
115
116 var RoutingAreaIdentificationV ret := {
117 mccDigit1 := mcc_mnc[0],
118 mccDigit2 := mcc_mnc[1],
119 mccDigit3 := mcc_mnc[2],
120 mncDigit3 := mcc_mnc[5],
121 mncDigit1 := mcc_mnc[3],
122 mncDigit2 := mcc_mnc[4],
123 lac := int2oct(cell_id.ra_id.lai.lac, 16),
124 rac := int2oct(cell_id.ra_id.rac, 8)
125 }
126 return ret;
127};
128
Alexander Couzens51114d12018-07-31 18:41:56 +0200129private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
130 gb.vc_NS := NS_CT.create(id & "-NS" & int2str(offset));
131 gb.vc_BSSGP := BSSGP_CT.create(id & "-BSSGP" & int2str(offset));
Harald Welte5ac31492018-02-15 20:39:13 +0100132 /* connect lower end of BSSGP emulation with NS upper port */
133 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
134 /* connect lower end of NS emulation to NS codec port (on top of IPL4) */
135 map(gb.vc_NS:NSCP, system:NS_CODEC_PORT);
136
Alexander Couzens2c12b242018-07-31 00:30:11 +0200137 gb.vc_NS.start(NSStart(mp_nsconfig));
Harald Welte5ac31492018-02-15 20:39:13 +0100138 gb.vc_BSSGP.start(BssgpStart(gb.cfg));
139}
140
141private function f_init_gsup(charstring id) runs on test_CT {
142 id := id & "-GSUP";
143 var GsupOps ops := {
144 create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
145 };
146
147 vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
148 vc_GSUP := GSUP_Emulation_CT.create(id);
149
150 map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
151 connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
152 /* we use this hack to get events like ASP_IPA_EVENT_UP */
153 connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
154
155 vc_GSUP.start(GSUP_Emulation.main(ops, id));
156 vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
157
158 /* wait for incoming connection to GSUP port before proceeding */
159 timer T := 10.0;
160 T.start;
161 alt {
162 [] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
163 [] T.timeout {
164 setverdict(fail, "No connection to GSUP Port");
Daniel Willmannafce8662018-07-06 23:11:32 +0200165 mtc.stop;
Harald Welte5ac31492018-02-15 20:39:13 +0100166 }
167 }
168}
169
Harald Welteeded9ad2018-02-17 20:57:34 +0100170private function f_init_gtp(charstring id) runs on test_CT {
171 id := id & "-GTP";
172
173 var GtpEmulationCfg gtp_cfg := {
174 gtpc_bind_ip := mp_ggsn_ip,
175 gtpc_bind_port := GTP1C_PORT,
176 gtpu_bind_ip := mp_ggsn_ip,
177 gtpu_bind_port := GTP1U_PORT,
178 sgsn_role := false
179 };
180
181 vc_GTP := GTP_Emulation_CT.create(id);
182 vc_GTP.start(GTP_Emulation.main(gtp_cfg));
183}
184
Harald Weltebd194722018-02-16 22:11:08 +0100185private function f_init_vty() runs on test_CT {
186 map(self:SGSNVTY, system:SGSNVTY);
187 f_vty_set_prompts(SGSNVTY);
188 f_vty_transceive(SGSNVTY, "enable");
189 f_vty_config(SGSNVTY, "sgsn", "auth-policy remote");
190}
191
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200192private function f_vty_enable_echo_interval(boolean enable) runs on test_CT {
193 if (enable) {
194 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 echo-interval 5");
195 } else {
196 f_vty_config(SGSNVTY, "sgsn", "ggsn 0 no echo-interval");
197 }
198}
199
Harald Weltebd194722018-02-16 22:11:08 +0100200
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100201function f_init(BcdMccMnc mcc_mnc := '26242F'H) runs on test_CT {
Harald Welte96a33b02018-02-04 10:36:22 +0100202 if (g_initialized == true) {
203 return;
204 }
205 g_initialized := true;
Harald Welte5ac31492018-02-15 20:39:13 +0100206 g_gb[0].cfg := {
207 nsei := 96,
208 bvci := 196,
209 cell_id := {
210 ra_id := {
211 lai := {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100212 mcc_mnc := mcc_mnc, lac := 13135},
Harald Welte5ac31492018-02-15 20:39:13 +0100213 rac := 0
214 },
215 cell_id := 20960
216 },
217 sgsn_role := false
218 };
Alexander Couzens5e2ba752018-07-03 15:13:07 +0200219 g_gb[1].cfg := {
220 nsei := 97,
221 bvci := 210,
222 cell_id := {
223 ra_id := {
224 lai := {
225 mcc_mnc := mcc_mnc, lac := 13200},
226 rac := 0
227 },
228 cell_id := 20961
229 },
230 sgsn_role := false
231 };
232 g_gb[2].cfg := {
233 nsei := 98,
234 bvci := 220,
235 cell_id := {
236 ra_id := {
237 lai := {
238 mcc_mnc := mcc_mnc, lac := 13300},
239 rac := 0
240 },
241 cell_id := 20962
242 },
243 sgsn_role := false
244 };
Harald Welte96a33b02018-02-04 10:36:22 +0100245
Alexander Couzens51114d12018-07-31 18:41:56 +0200246 f_init_gb(g_gb[0], "SGSN_Test-Gb0", 0);
247 f_init_gb(g_gb[1], "SGSN_Test-Gb1", 1);
248 f_init_gb(g_gb[2], "SGSN_Test-Gb2", 2);
Harald Welte5ac31492018-02-15 20:39:13 +0100249 f_init_gsup("SGSN_Test");
Harald Welteeded9ad2018-02-17 20:57:34 +0100250 f_init_gtp("SGSN_Test");
Harald Weltebd194722018-02-16 22:11:08 +0100251 f_init_vty();
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200252 f_vty_enable_echo_interval(g_use_echo);
Harald Welte5ac31492018-02-15 20:39:13 +0100253}
Harald Welte96a33b02018-02-04 10:36:22 +0100254
Harald Welte5ac31492018-02-15 20:39:13 +0100255type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
256
257/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Alexander Couzens51114d12018-07-31 18:41:56 +0200258function f_start_handler(void_fn fn, charstring id, GbInstances gb, integer imsi_suffix,
Harald Welte62e29582018-02-16 21:17:11 +0100259 float t_guard := 30.0)
Harald Welte5ac31492018-02-15 20:39:13 +0100260runs on test_CT return BSSGP_ConnHdlr {
261 var BSSGP_ConnHdlr vc_conn;
262 var SGSN_ConnHdlrNetworkPars net_pars := {
263 expect_ptmsi := true,
264 expect_auth := true,
265 expect_ciph := false
266 };
267 var BSSGP_ConnHdlrPars pars := {
268 imei := f_gen_imei(imsi_suffix),
269 imsi := f_gen_imsi(imsi_suffix),
270 msisdn := f_gen_msisdn(imsi_suffix),
271 p_tmsi := omit,
Harald Welte04683d02018-02-16 22:43:45 +0100272 p_tmsi_sig := omit,
Harald Welte14a0f942018-02-16 20:42:23 +0100273 tlli := f_gprs_tlli_random(),
Harald Weltef70997d2018-02-17 10:11:19 +0100274 tlli_old := omit,
Harald Welte5ac31492018-02-15 20:39:13 +0100275 ra := omit,
Alexander Couzens51114d12018-07-31 18:41:56 +0200276 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 +0100277 vec := omit,
Harald Welte62e29582018-02-16 21:17:11 +0100278 net := net_pars,
279 t_guard := t_guard
Harald Welte5ac31492018-02-15 20:39:13 +0100280 };
281
282 vc_conn := BSSGP_ConnHdlr.create(id);
Alexander Couzens51114d12018-07-31 18:41:56 +0200283 connect(vc_conn:BSSGP[0], gb[0].vc_BSSGP:BSSGP_SP);
284 connect(vc_conn:BSSGP_PROC[0], gb[0].vc_BSSGP:BSSGP_PROC);
285 connect(vc_conn:BSSGP[1], gb[1].vc_BSSGP:BSSGP_SP);
286 connect(vc_conn:BSSGP_PROC[1], gb[1].vc_BSSGP:BSSGP_PROC);
287 connect(vc_conn:BSSGP[2], gb[2].vc_BSSGP:BSSGP_SP);
288 connect(vc_conn:BSSGP_PROC[2], gb[2].vc_BSSGP:BSSGP_PROC);
Harald Welte5ac31492018-02-15 20:39:13 +0100289
290 connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
291 connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
292
Harald Welteeded9ad2018-02-17 20:57:34 +0100293 connect(vc_conn:GTP, vc_GTP:CLIENT);
294 connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
295
Harald Welte5ac31492018-02-15 20:39:13 +0100296 vc_conn.start(f_handler_init(fn, id, pars));
297 return vc_conn;
298}
299
Harald Welte62e29582018-02-16 21:17:11 +0100300private altstep as_Tguard() runs on BSSGP_ConnHdlr {
301 [] g_Tguard.timeout {
302 setverdict(fail, "Tguard timeout");
Daniel Willmannafce8662018-07-06 23:11:32 +0200303 mtc.stop;
Harald Welte62e29582018-02-16 21:17:11 +0100304 }
305}
306
Harald Welte5ac31492018-02-15 20:39:13 +0100307/* first function called in every ConnHdlr */
308private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
309runs on BSSGP_ConnHdlr {
310 /* do some common stuff like setting up g_pars */
311 g_pars := pars;
312
313 /* register with BSSGP core */
Alexander Couzens51114d12018-07-31 18:41:56 +0200314 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welte5ac31492018-02-15 20:39:13 +0100315 /* tell GSUP dispatcher to send this IMSI to us */
316 f_create_gsup_expect(hex2str(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100317 /* tell GTP dispatcher to send this IMSI to us */
318 f_gtp_register_imsi(g_pars.imsi);
Harald Welte5ac31492018-02-15 20:39:13 +0100319
Harald Welte62e29582018-02-16 21:17:11 +0100320 g_Tguard.start(pars.t_guard);
321 activate(as_Tguard());
322
Harald Welte5ac31492018-02-15 20:39:13 +0100323 /* call the user-supplied test case function */
324 fn.apply(id);
325 f_bssgp_client_unregister(g_pars.imsi);
Harald Welte96a33b02018-02-04 10:36:22 +0100326}
327
328/* TODO:
Harald Welte96a33b02018-02-04 10:36:22 +0100329 * Detach without Attach
330 * SM procedures without attach / RAU
331 * ATTACH / RAU
332 ** with / without authentication
333 ** with / without P-TMSI allocation
Harald Welte96a33b02018-02-04 10:36:22 +0100334 * re-transmissions of LLC frames
335 * PDP Context activation
336 ** with different GGSN config in SGSN VTY
337 ** with different PDP context type (v4/v6/v46)
338 ** timeout from GGSN
Harald Welte6f203162018-02-18 22:04:55 +0100339 ** multiple / secondary PDP context
Harald Welte96a33b02018-02-04 10:36:22 +0100340 */
341
342testcase TC_wait_ns_up() runs on test_CT {
343 f_init();
344 f_sleep(20.0);
345}
346
Harald Welte5ac31492018-02-15 20:39:13 +0100347altstep as_mm_identity() runs on BSSGP_ConnHdlr {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100348 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200349 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Harald Welte5ac31492018-02-15 20:39:13 +0100350 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens0e510e62018-07-28 23:06:00 +0200351 BSSGP[0].send(ts_GMM_ID_RESP(mi));
Harald Welte5ac31492018-02-15 20:39:13 +0100352 repeat;
353 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200354 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Harald Welte5ac31492018-02-15 20:39:13 +0100355 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens0e510e62018-07-28 23:06:00 +0200356 BSSGP[0].send(ts_GMM_ID_RESP(mi));
Harald Welte5ac31492018-02-15 20:39:13 +0100357 repeat;
358 }
359}
Harald Welte96a33b02018-02-04 10:36:22 +0100360
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200361/* perform GMM authentication (if expected).
362 * Note, for umts_aka_challenge to work, the revisionLevelIndicatior needs to
363 * be 1 to mark R99 capability, in the GMM Attach Request, see f_gmm_attach(). */
364function f_gmm_auth (boolean umts_aka_challenge := false, boolean force_gsm_sres := false) runs on BSSGP_ConnHdlr {
Harald Welte5ac31492018-02-15 20:39:13 +0100365 var BssgpDecoded bd;
366 var PDU_L3_MS_SGSN l3_mo;
367 var PDU_L3_SGSN_MS l3_mt;
368 var default di := activate(as_mm_identity());
369 if (g_pars.net.expect_auth) {
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200370 var GSUP_IE auth_tuple;
371 var template AuthenticationParameterAUTNTLV autn;
372
373 if (umts_aka_challenge) {
374 g_pars.vec := f_gen_auth_vec_3g();
375 autn := {
376 elementIdentifier := '28'O,
377 lengthIndicator := lengthof(g_pars.vec.autn),
378 autnValue := g_pars.vec.autn
379 };
380
381 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,
382 g_pars.vec.sres,
383 g_pars.vec.kc,
384 g_pars.vec.ik,
385 g_pars.vec.ck,
386 g_pars.vec.autn,
387 g_pars.vec.res));
388 log("GSUP sends 2G and 3G auth tuples", auth_tuple);
389 } else {
390 g_pars.vec := f_gen_auth_vec_2g();
391 autn := omit;
392 auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand,
393 g_pars.vec.sres,
394 g_pars.vec.kc));
395 log("GSUP sends only 2G auth tuple", auth_tuple);
396 }
Harald Welte5ac31492018-02-15 20:39:13 +0100397 GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));
398 GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200399
400 var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
401 auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200402 BSSGP[0].receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
Harald Welte5ac31492018-02-15 20:39:13 +0100403 l3_mt := bd.l3_mt;
404 var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200405 var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
406
407 if (umts_aka_challenge and not force_gsm_sres) {
408 /* set UMTS response instead */
409 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationParResp := {
410 valueField := substr(g_pars.vec.res, 0, 4)
411 };
412 auth_ciph_resp.msgs.gprs_mm.authenticationAndCipheringResponse.authenticationRespParExt := {
413 elementIdentifier := '21'O,
414 lengthIndicator := lengthof(g_pars.vec.res) - 4,
415 valueField := substr(g_pars.vec.res, 4, lengthof(g_pars.vec.res) - 4)
416 };
417 }
418
419 l3_mo := valueof(auth_ciph_resp);
Harald Welte5ac31492018-02-15 20:39:13 +0100420 if (ispresent(l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest) and
421 l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.imeisvRequest.valueField == '001'B) {
422 l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
423 valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
424 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200425 BSSGP[0].send(l3_mo);
Harald Welte76dee092018-02-16 22:12:59 +0100426 } else {
427 /* wait for identity procedure */
428 f_sleep(1.0);
Harald Welte5ac31492018-02-15 20:39:13 +0100429 }
Harald Welte76dee092018-02-16 22:12:59 +0100430
Harald Welte5ac31492018-02-15 20:39:13 +0100431 deactivate(di);
432}
433
Harald Weltef70997d2018-02-17 10:11:19 +0100434function f_upd_ptmsi_and_tlli(OCT4 p_tmsi) runs on BSSGP_ConnHdlr {
435 g_pars.p_tmsi := p_tmsi;
436 /* update TLLI */
437 g_pars.tlli_old := g_pars.tlli;
438 g_pars.tlli := g_pars.p_tmsi or4b 'c0000000'O;
439 f_bssgp_client_llgmm_assign(g_pars.tlli_old, g_pars.tlli);
440}
441
Harald Welte04683d02018-02-16 22:43:45 +0100442function f_process_attach_accept(PDU_GMM_AttachAccept aa) runs on BSSGP_ConnHdlr {
443 /* mandatory IE */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100444 var hexstring aa_plmn := f_RAI_to_plmn_hexstr(aa.routingAreaIdentification);
Alexander Couzens51114d12018-07-31 18:41:56 +0200445 if (not (g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc == aa_plmn)) {
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100446 setverdict(fail, "mismatching PLMN in Attach Accept: " & hex2str(aa_plmn)
Alexander Couzens51114d12018-07-31 18:41:56 +0200447 & "; expected " & hex2str(g_pars.bssgp_cell_id[0].ra_id.lai.mcc_mnc));
Daniel Willmannafce8662018-07-06 23:11:32 +0200448 mtc.stop;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100449 }
Harald Welte04683d02018-02-16 22:43:45 +0100450 g_pars.ra := aa.routingAreaIdentification;
451 if (ispresent(aa.allocatedPTMSI)) {
452 if (not g_pars.net.expect_ptmsi) {
453 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200454 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100455 }
Harald Weltef70997d2018-02-17 10:11:19 +0100456 f_upd_ptmsi_and_tlli(aa.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
Harald Welte04683d02018-02-16 22:43:45 +0100457 }
458 if (ispresent(aa.msIdentity)) {
459 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200460 mtc.stop;
Harald Welte04683d02018-02-16 22:43:45 +0100461 }
462 /* P-TMSI.sig */
463 if (ispresent(aa.ptmsiSignature)) {
464 g_pars.p_tmsi_sig := aa.ptmsiSignature.valueField;
465 }
466 /* updateTimer */
467 // aa.readyTimer
468 /* T3302, T3319, T3323, T3312_ext, T3324 */
469}
470
Harald Welte91636de2018-02-17 10:16:14 +0100471function f_process_rau_accept(PDU_GMM_RoutingAreaUpdateAccept ra) runs on BSSGP_ConnHdlr {
472 /* mandatory IE */
473 g_pars.ra := ra.routingAreaId;
474 if (ispresent(ra.allocatedPTMSI)) {
475 if (not g_pars.net.expect_ptmsi) {
476 setverdict(fail, "unexpected P-TMSI allocation");
Daniel Willmannafce8662018-07-06 23:11:32 +0200477 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100478 }
479 f_upd_ptmsi_and_tlli(ra.allocatedPTMSI.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi.octets);
480 }
481 if (ispresent(ra.msIdentity)) {
482 setverdict(fail, "unexpected TMSI allocation in non-combined attach");
Daniel Willmannafce8662018-07-06 23:11:32 +0200483 mtc.stop;
Harald Welte91636de2018-02-17 10:16:14 +0100484 }
485 /* P-TMSI.sig */
486 if (ispresent(ra.ptmsiSignature)) {
487 g_pars.p_tmsi_sig := ra.ptmsiSignature.valueField;
488 }
489 /* updateTimer */
490 // aa.readyTimer
491 /* T3302, T3319, T3323, T3312_ext, T3324 */
492}
493
494
Harald Welte5a4fa042018-02-16 20:59:21 +0100495function f_random_RAI(HEX0_3n mcc := '262'H, HEX0_3n mnc := '42'H) return RoutingAreaIdentificationV {
496 return f_RAI(mcc, mnc, f_rnd_octstring(2), f_rnd_octstring(1));
497}
498
Harald Welte23178c52018-02-17 09:36:33 +0100499/* return a MobileIdentityLV: P-TMSI if we have one, IMSI otherwise */
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100500private function f_mi_get_lv() runs on BSSGP_ConnHdlr return MobileL3_CommonIE_Types.MobileIdentityLV {
Harald Welte23178c52018-02-17 09:36:33 +0100501 if (ispresent(g_pars.p_tmsi)) {
502 return valueof(ts_MI_TMSI_LV(g_pars.p_tmsi));
503 } else {
504 return valueof(ts_MI_IMSI_LV(g_pars.imsi));
505 }
506}
507
Harald Welte311ec272018-02-17 09:40:03 +0100508private function f_gmm_gsup_lu_isd() runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100509 var GSUP_PDU gsup;
Harald Welte311ec272018-02-17 09:40:03 +0100510 /* Expect MSC to perform LU with HLR */
511 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
Harald Welteeded9ad2018-02-17 20:57:34 +0100512 gsup := valueof(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
513 gsup.ies := gsup.ies & { valueof(ts_GSUP_IE_PdpInfo(char2oct("*"), '0121'O, ''O)) };
514 GSUP.send(gsup);
Harald Welte311ec272018-02-17 09:40:03 +0100515 GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
516 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
517}
518
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200519private function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100520 var BssgpDecoded bd;
Harald Welte5a4fa042018-02-16 20:59:21 +0100521 var RoutingAreaIdentificationV old_ra := f_random_RAI();
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200522 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 +0100523
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200524 /* indicate R99 capability of the MS to enable UMTS AKA in presence of
525 * 3G auth vectors */
526 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.revisionLevelIndicatior := '1'B;
527 /* The thing is, if the solSACapability is 'omit', then the
528 * revisionLevelIndicatior is at the wrong place! */
529 attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
530
Alexander Couzens0e510e62018-07-28 23:06:00 +0200531 BSSGP[0].send(attach_req);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200532 f_gmm_auth(umts_aka_challenge, force_gsm_sres);
Alexander Couzens5844d5b2018-05-14 06:30:56 +0200533 /* Expect SGSN to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100534 f_gmm_gsup_lu_isd();
Harald Welte5ac31492018-02-15 20:39:13 +0100535
Alexander Couzens0e510e62018-07-28 23:06:00 +0200536 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100537 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
538 }
539 /* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200540 BSSGP[0].send(ts_GMM_ATTACH_COMPL);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200541}
542
543private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
544 f_gmm_attach(false, false);
Harald Welte5a4fa042018-02-16 20:59:21 +0100545 setverdict(pass);
Harald Welte5ac31492018-02-15 20:39:13 +0100546}
547
548testcase TC_attach() runs on test_CT {
549 var BSSGP_ConnHdlr vc_conn;
550 f_init();
551 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200552 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1);
Harald Welte5ac31492018-02-15 20:39:13 +0100553 vc_conn.done;
554}
555
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100556testcase TC_attach_mnc3() runs on test_CT {
557 var BSSGP_ConnHdlr vc_conn;
558 f_init('023042'H);
559 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200560 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, 1001);
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100561 vc_conn.done;
562}
563
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200564private function f_TC_attach_umts_aka_umts_res(charstring id) runs on BSSGP_ConnHdlr {
565 f_gmm_attach(true, false);
566 setverdict(pass);
567}
568testcase TC_attach_umts_aka_umts_res() runs on test_CT {
569 var BSSGP_ConnHdlr vc_conn;
570 f_init();
571 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200572 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_umts_res), testcasename(), g_gb, 1002);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200573 vc_conn.done;
574}
575
576private function f_TC_attach_umts_aka_gsm_sres(charstring id) runs on BSSGP_ConnHdlr {
577 f_gmm_attach(true, true);
578 setverdict(pass);
579}
580testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
581 var BSSGP_ConnHdlr vc_conn;
582 f_init();
583 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200584 vc_conn := f_start_handler(refers(f_TC_attach_umts_aka_gsm_sres), testcasename(), g_gb, 1003);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +0200585 vc_conn.done;
586}
587
Harald Welte5b7c8122018-02-16 21:48:17 +0100588/* MS never responds to ID REQ, expect ATTACH REJECT */
589private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100590 var RoutingAreaIdentificationV old_ra := f_random_RAI();
591
Alexander Couzens0e510e62018-07-28 23:06:00 +0200592 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100593 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200594 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100595 /* don't send ID Response */
596 repeat;
597 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200598 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100599 setverdict(pass);
600 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200601 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100602 setverdict(fail, "Wrong Attach Reject Cause");
Daniel Willmannafce8662018-07-06 23:11:32 +0200603 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100604 }
605 }
606}
607testcase TC_attach_auth_id_timeout() runs on test_CT {
608 var BSSGP_ConnHdlr vc_conn;
609 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200610 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 +0100611 vc_conn.done;
612}
613
614/* HLR never responds to SAI REQ, expect ATTACH REJECT */
615private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte5b7c8122018-02-16 21:48:17 +0100616 var RoutingAreaIdentificationV old_ra := f_random_RAI();
617
Alexander Couzens0e510e62018-07-28 23:06:00 +0200618 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100619 alt {
620 [] as_mm_identity();
621 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
622 }
623 /* don't send SAI-response from HLR */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200624 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Welte5b7c8122018-02-16 21:48:17 +0100625 setverdict(pass);
626}
627testcase TC_attach_auth_sai_timeout() runs on test_CT {
628 var BSSGP_ConnHdlr vc_conn;
629 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200630 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_timeout), testcasename(), g_gb, 3);
Harald Welte5b7c8122018-02-16 21:48:17 +0100631 vc_conn.done;
632}
633
Harald Weltefe253882018-02-17 09:25:00 +0100634/* HLR rejects SAI, expect ATTACH REJECT */
635private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
Harald Weltefe253882018-02-17 09:25:00 +0100636 var RoutingAreaIdentificationV old_ra := f_random_RAI();
637
Alexander Couzens0e510e62018-07-28 23:06:00 +0200638 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Weltefe253882018-02-17 09:25:00 +0100639 alt {
640 [] as_mm_identity();
641 [] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
642 GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
643 }
644 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200645 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
Harald Weltefe253882018-02-17 09:25:00 +0100646 setverdict(pass);
647}
648testcase TC_attach_auth_sai_reject() runs on test_CT {
649 var BSSGP_ConnHdlr vc_conn;
650 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +0200651 vc_conn := f_start_handler(refers(f_TC_attach_auth_sai_reject), testcasename(), g_gb, 4);
Harald Weltefe253882018-02-17 09:25:00 +0100652 vc_conn.done;
653}
654
Harald Welte5b7c8122018-02-16 21:48:17 +0100655/* HLR never responds to UL REQ, expect ATTACH REJECT */
656private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100657 var BssgpDecoded bd;
Harald Welte5b7c8122018-02-16 21:48:17 +0100658 var RoutingAreaIdentificationV old_ra := f_random_RAI();
659
Alexander Couzens0e510e62018-07-28 23:06:00 +0200660 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte5b7c8122018-02-16 21:48:17 +0100661 f_gmm_auth();
662 /* Expect MSC to perform LU with HLR */
663 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
664 /* Never follow-up with ISD_REQ or UL_RES */
665 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200666 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welte5b7c8122018-02-16 21:48:17 +0100667 setverdict(pass);
668 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200669 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100670 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Harald Welte5b7c8122018-02-16 21:48:17 +0100671 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200672 mtc.stop;
Harald Welte5b7c8122018-02-16 21:48:17 +0100673 }
674 }
675}
676testcase TC_attach_gsup_lu_timeout() runs on test_CT {
677 var BSSGP_ConnHdlr vc_conn;
678 f_init();
679 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200680 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_timeout), testcasename(), g_gb, 5);
Harald Welte5b7c8122018-02-16 21:48:17 +0100681 vc_conn.done;
682}
683
Harald Welteb7c14e92018-02-17 09:29:16 +0100684/* HLR rejects UL REQ, expect ATTACH REJECT */
685private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdlr {
686 var BssgpDecoded bd;
Harald Welteb7c14e92018-02-17 09:29:16 +0100687 var RoutingAreaIdentificationV old_ra := f_random_RAI();
688
Alexander Couzens0e510e62018-07-28 23:06:00 +0200689 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb7c14e92018-02-17 09:29:16 +0100690 f_gmm_auth();
691 /* Expect MSC to perform LU with HLR */
692 GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
693 GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
694 }
695 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200696 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welteb7c14e92018-02-17 09:29:16 +0100697 setverdict(pass);
698 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200699 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welteb7c14e92018-02-17 09:29:16 +0100700 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
701 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200702 mtc.stop;
Harald Welteb7c14e92018-02-17 09:29:16 +0100703 }
704 }
705}
706testcase TC_attach_gsup_lu_reject() runs on test_CT {
707 var BSSGP_ConnHdlr vc_conn;
708 f_init();
709 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200710 vc_conn := f_start_handler(refers(f_TC_attach_gsup_lu_reject), testcasename(), g_gb, 6);
Harald Welteb7c14e92018-02-17 09:29:16 +0100711 vc_conn.done;
712}
713
714
Harald Welte3823e2e2018-02-16 21:53:48 +0100715/* Attempt of combined GPRS + IMSI attach: network should ACK only GPRS attach */
716private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100717 var BssgpDecoded bd;
Harald Welte3823e2e2018-02-16 21:53:48 +0100718 var RoutingAreaIdentificationV old_ra := f_random_RAI();
719
Alexander Couzens0e510e62018-07-28 23:06:00 +0200720 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
Harald Welte3823e2e2018-02-16 21:53:48 +0100721 f_gmm_auth();
722 /* Expect MSC to perform LU with HLR */
Harald Welte311ec272018-02-17 09:40:03 +0100723 f_gmm_gsup_lu_isd();
Harald Welte3823e2e2018-02-16 21:53:48 +0100724
Alexander Couzens0e510e62018-07-28 23:06:00 +0200725 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100726 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
727 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200728 BSSGP[0].send(ts_GMM_ATTACH_COMPL);
Harald Welte3823e2e2018-02-16 21:53:48 +0100729 setverdict(pass);
730}
Harald Welte3823e2e2018-02-16 21:53:48 +0100731testcase TC_attach_combined() runs on test_CT {
732 var BSSGP_ConnHdlr vc_conn;
733 f_init();
734 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200735 vc_conn := f_start_handler(refers(f_TC_attach_combined), testcasename(), g_gb, 7);
Harald Welte3823e2e2018-02-16 21:53:48 +0100736 vc_conn.done;
737}
738
Harald Welte76dee092018-02-16 22:12:59 +0100739/* Attempt of GPRS ATTACH in 'accept all' mode */
740private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100741 var BssgpDecoded bd;
Harald Welte76dee092018-02-16 22:12:59 +0100742 var RoutingAreaIdentificationV old_ra := f_random_RAI();
743
744 g_pars.net.expect_auth := false;
745
Alexander Couzens0e510e62018-07-28 23:06:00 +0200746 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welte76dee092018-02-16 22:12:59 +0100747 f_gmm_auth();
Alexander Couzens0e510e62018-07-28 23:06:00 +0200748 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
Harald Welte04683d02018-02-16 22:43:45 +0100749 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
750 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200751 BSSGP[0].send(ts_GMM_ATTACH_COMPL);
Harald Welte76dee092018-02-16 22:12:59 +0100752 setverdict(pass);
753}
754testcase TC_attach_accept_all() runs on test_CT {
755 var BSSGP_ConnHdlr vc_conn;
756 f_init();
757 f_sleep(1.0);
758 f_vty_config(SGSNVTY, "sgsn", "auth-policy accept-all");
Alexander Couzens51114d12018-07-31 18:41:56 +0200759 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 8);
Harald Welte76dee092018-02-16 22:12:59 +0100760 vc_conn.done;
761}
Harald Welte5b7c8122018-02-16 21:48:17 +0100762
Harald Welteb2124b22018-02-16 22:26:56 +0100763/* Attempt of GPRS ATTACH in 'accept all' mode */
764private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdlr {
Harald Welteb2124b22018-02-16 22:26:56 +0100765 var RoutingAreaIdentificationV old_ra := f_random_RAI();
766
767 /* Simulate a foreign IMSI */
768 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +0200769 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Harald Welteb2124b22018-02-16 22:26:56 +0100770
771 g_pars.net.expect_auth := false;
772
Alexander Couzens0e510e62018-07-28 23:06:00 +0200773 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Harald Welteb2124b22018-02-16 22:26:56 +0100774 alt {
775 [] as_mm_identity();
Alexander Couzens0e510e62018-07-28 23:06:00 +0200776 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
Harald Welteb2124b22018-02-16 22:26:56 +0100777 setverdict(pass);
778 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200779 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Harald Welteb2124b22018-02-16 22:26:56 +0100780 setverdict(pass);
781 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200782 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200783 setverdict(fail);
Daniel Willmannafce8662018-07-06 23:11:32 +0200784 mtc.stop;
Alexander Couzens0ca0d9c2018-06-12 14:01:34 +0200785 }
Harald Welteb2124b22018-02-16 22:26:56 +0100786 }
787}
788testcase TC_attach_closed() runs on test_CT {
789 var BSSGP_ConnHdlr vc_conn;
790 f_init();
791 f_sleep(1.0);
792 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
793 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +0200794 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Harald Welteb2124b22018-02-16 22:26:56 +0100795 vc_conn.done;
796 /* test with home IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +0200797 vc_conn := f_start_handler(refers(f_TC_attach_accept_all), testcasename(), g_gb, 10);
Harald Welteb2124b22018-02-16 22:26:56 +0100798 vc_conn.done;
799}
800
Harald Welte04683d02018-02-16 22:43:45 +0100801/* Routing Area Update from Unknown TLLI -> REJECT */
802private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte04683d02018-02-16 22:43:45 +0100803 var RoutingAreaIdentificationV old_ra := f_random_RAI();
804
Alexander Couzens0e510e62018-07-28 23:06:00 +0200805 BSSGP[0].send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, old_ra, false, omit, omit));
Harald Welte04683d02018-02-16 22:43:45 +0100806 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200807 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
Harald Welte04683d02018-02-16 22:43:45 +0100808 setverdict(pass);
809 }
810 /* FIXME: Expect XID RESET? */
Alexander Couzens0e510e62018-07-28 23:06:00 +0200811 [] BSSGP[0].receive { repeat; }
Harald Welte04683d02018-02-16 22:43:45 +0100812 }
813}
814testcase TC_rau_unknown() runs on test_CT {
815 var BSSGP_ConnHdlr vc_conn;
816 f_init();
817 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200818 vc_conn := f_start_handler(refers(f_TC_rau_unknown), testcasename(), g_gb, 11);
Harald Welte04683d02018-02-16 22:43:45 +0100819 vc_conn.done;
820}
821
Harald Welte91636de2018-02-17 10:16:14 +0100822private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
823 var BssgpDecoded bd;
824
825 /* first perform regular attach */
826 f_TC_attach(id);
827
Alexander Couzens5dce90d2018-07-31 03:16:37 +0200828 f_routing_area_update(g_pars.ra);
829
Harald Welte91636de2018-02-17 10:16:14 +0100830}
831testcase TC_attach_rau() runs on test_CT {
832 var BSSGP_ConnHdlr vc_conn;
833 f_init();
834 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200835 vc_conn := f_start_handler(refers(f_TC_attach_rau), testcasename(), g_gb, 12);
Harald Welte91636de2018-02-17 10:16:14 +0100836 vc_conn.done;
837}
Harald Welte04683d02018-02-16 22:43:45 +0100838
Harald Welte6abb9fe2018-02-17 15:24:48 +0100839/* general GPRS DETACH helper */
840function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge) runs on BSSGP_ConnHdlr {
841 var BssgpDecoded bd;
842 timer T := 5.0;
Alexander Couzens0e510e62018-07-28 23:06:00 +0200843 BSSGP[0].send(ts_GMM_DET_REQ_MO(detach_type, power_off));
Harald Welte6abb9fe2018-02-17 15:24:48 +0100844 if (expect_purge) {
845 GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
846 GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
847 }
848 T.start;
849 alt {
850 [not expect_purge] GSUP.receive(tr_GSUP_PURGE_MS_REQ(?)) {
851 setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
Daniel Willmannafce8662018-07-06 23:11:32 +0200852 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100853 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200854 [power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100855 g_pars.ra := omit;
856 setverdict(fail, "Unexpected ATTACH ACCEPT in no-power-off DETACH");
Daniel Willmannafce8662018-07-06 23:11:32 +0200857 mtc.stop;
Harald Welte6abb9fe2018-02-17 15:24:48 +0100858 /* TODO: check if any PDP contexts are deactivated on network side? */
859 }
860 [power_off] T.timeout {
861 setverdict(pass);
862 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200863 [not power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
Harald Welte6abb9fe2018-02-17 15:24:48 +0100864 g_pars.ra := omit;
865 setverdict(pass);
866 /* TODO: check if any PDP contexts are deactivated on network side? */
867 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200868 [] BSSGP[0].receive { repeat; }
Harald Welte6abb9fe2018-02-17 15:24:48 +0100869 }
870}
871
872/* IMSI DETACH (non-power-off) for unknown TLLI */
873private function f_TC_detach_unknown_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
874 f_detach_mo(c_GMM_DTT_MO_GPRS, false, false);
875}
876testcase TC_detach_unknown_nopoweroff() runs on test_CT {
877 var BSSGP_ConnHdlr vc_conn;
878 f_init();
879 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200880 vc_conn := f_start_handler(refers(f_TC_detach_unknown_nopoweroff), testcasename(), g_gb, 13);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100881 vc_conn.done;
882}
883
884/* IMSI DETACH (power-off) for unknown TLLI */
885private function f_TC_detach_unknown_poweroff(charstring id) runs on BSSGP_ConnHdlr {
886 f_detach_mo(c_GMM_DTT_MO_GPRS, true, false);
887}
888testcase TC_detach_unknown_poweroff() runs on test_CT {
889 var BSSGP_ConnHdlr vc_conn;
890 f_init();
891 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200892 vc_conn := f_start_handler(refers(f_TC_detach_unknown_poweroff), testcasename(), g_gb, 14);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100893 vc_conn.done;
894}
895
896/* IMSI DETACH (non-power-off) for known TLLI */
897private function f_TC_detach_nopoweroff(charstring id) runs on BSSGP_ConnHdlr {
898 /* first perform regular attach */
899 f_TC_attach(id);
900
901 f_detach_mo(c_GMM_DTT_MO_GPRS, false, true);
902}
903testcase TC_detach_nopoweroff() runs on test_CT {
904 var BSSGP_ConnHdlr vc_conn;
905 f_init();
906 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200907 vc_conn := f_start_handler(refers(f_TC_detach_nopoweroff), testcasename(), g_gb, 15);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100908 vc_conn.done;
909}
910
911/* IMSI DETACH (power-off) for known TLLI */
912private function f_TC_detach_poweroff(charstring id) runs on BSSGP_ConnHdlr {
913 /* first perform regular attach */
914 f_TC_attach(id);
915
916 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
917}
918testcase TC_detach_poweroff() runs on test_CT {
919 var BSSGP_ConnHdlr vc_conn;
920 f_init();
921 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +0200922 vc_conn := f_start_handler(refers(f_TC_detach_poweroff), testcasename(), g_gb, 16);
Harald Welte6abb9fe2018-02-17 15:24:48 +0100923 vc_conn.done;
924}
925
Harald Welteeded9ad2018-02-17 20:57:34 +0100926type record PdpActPars {
Harald Welte822f9102018-02-18 20:39:06 +0100927 BIT3 tid, /* L3 Transaction ID */
928 BIT4 nsapi, /* SNDCP NSAPI */
929 BIT4 sapi, /* LLC SAPI */
930 QoSV qos, /* QoS parameters */
931 PDPAddressV addr, /* IP address */
932 octetstring apn optional, /* APN name */
933 ProtocolConfigOptionsV pco optional, /* protoco config opts */
934 OCT1 exp_rej_cause optional, /* expected SM reject cause */
Harald Welte1d6ae932018-02-18 21:24:44 +0100935 OCT1 gtp_resp_cause, /* GTP response cause */
Harald Welte822f9102018-02-18 20:39:06 +0100936 OCT4 chg_id, /* GTP Charging Identifier */
Harald Welte6abb9fe2018-02-17 15:24:48 +0100937
Harald Welte822f9102018-02-18 20:39:06 +0100938 OCT4 ggsn_tei_c, /* GGSN TEI Control*/
939 OCT4 ggsn_tei_u, /* GGSN TEI User */
940 octetstring ggsn_ip_c, /* GGSN IP Control */
941 octetstring ggsn_ip_u, /* GGSN IP User */
Pau Espin Pedroldc27e482018-07-10 14:02:49 +0200942 OCT1 ggsn_restart_ctr, /* GGSN Restart Counter */
Harald Welteeded9ad2018-02-17 20:57:34 +0100943
Harald Welte822f9102018-02-18 20:39:06 +0100944 OCT4 sgsn_tei_c optional, /* SGSN TEI Control */
945 OCT4 sgsn_tei_u optional, /* SGSN TEI User */
946 octetstring sgsn_ip_c optional, /* SGSN IP Control */
947 octetstring sgsn_ip_u optional /* SGSN IP USer */
Harald Welteeded9ad2018-02-17 20:57:34 +0100948};
949
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100950
951private function f_process_gtp_ctx_act_req(inout PdpActPars apars, PDU_GTPC gtpc) runs on BSSGP_ConnHdlr {
952 var GTPC_PDUs gtpc_rx := gtpc.gtpc_pdu;
953 apars.sgsn_tei_c := gtpc_rx.createPDPContextRequest.teidControlPlane.teidControlPlane;
954 apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI;
955 apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf;
956 apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf;
957 f_gtp_register_teid(apars.ggsn_tei_c);
958 f_gtp_register_teid(apars.ggsn_tei_u);
959}
960
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200961function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false) runs on BSSGP_ConnHdlr {
Harald Welteeded9ad2018-02-17 20:57:34 +0100962 var boolean exp_rej := ispresent(apars.exp_rej_cause);
963 var Gtp1cUnitdata g_ud;
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200964 var template Recovery_gtpc recovery := omit;
965
966 if (send_recovery) {
967 recovery := ts_Recovery(apars.ggsn_restart_ctr);
968 }
Harald Welteeded9ad2018-02-17 20:57:34 +0100969
Alexander Couzens0e510e62018-07-28 23:06:00 +0200970 BSSGP[0].send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
Harald Welteeded9ad2018-02-17 20:57:34 +0100971 apars.apn, apars.pco));
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100972 GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
973 f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
974 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
975 GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
976 apars.sgsn_tei_c, apars.gtp_resp_cause,
977 apars.ggsn_tei_c, apars.ggsn_tei_u,
978 apars.nsapi,
Pau Espin Pedrol94013452018-07-17 15:50:21 +0200979 apars.ggsn_ip_c, apars.ggsn_ip_u, apars.chg_id,
980 omit, recovery));
Harald Welteeded9ad2018-02-17 20:57:34 +0100981 }
982 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +0200983 [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 +0100984 setverdict(pass);
985 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200986 [exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100987 setverdict(fail, "Unexpected PDP CTX ACT ACC");
Daniel Willmannafce8662018-07-06 23:11:32 +0200988 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +0100989 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200990 [not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
Harald Welteeded9ad2018-02-17 20:57:34 +0100991 setverdict(fail, "Unexpected PDP CTX ACT FAIL");
Daniel Willmannafce8662018-07-06 23:11:32 +0200992 mtc.stop;
Harald Welteeded9ad2018-02-17 20:57:34 +0100993 }
Alexander Couzens0e510e62018-07-28 23:06:00 +0200994 [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 +0100995 setverdict(pass);
996 }
Harald Welte5b5ca1b2018-02-18 21:25:03 +0100997 [] as_xid(apars);
Harald Welteeded9ad2018-02-17 20:57:34 +0100998 }
999}
1000
Harald Welte6f203162018-02-18 22:04:55 +01001001function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause) runs on BSSGP_ConnHdlr {
1002 var boolean exp_rej := ispresent(apars.exp_rej_cause);
1003 var Gtp1cUnitdata g_ud;
1004
Alexander Couzens0e510e62018-07-28 23:06:00 +02001005 BSSGP[0].send(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
Harald Welte6f203162018-02-18 22:04:55 +01001006 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
1007 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001008 BSSGP[0].clear;
Harald Welte6f203162018-02-18 22:04:55 +01001009 GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
1010 }
1011 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001012 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {
Harald Welte6f203162018-02-18 22:04:55 +01001013 setverdict(pass);
1014 }
1015 [] as_xid(apars);
1016 }
1017}
1018
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001019function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false) runs on BSSGP_ConnHdlr {
Harald Welte57b9b7f2018-02-18 22:28:13 +01001020 var Gtp1cUnitdata g_ud;
1021 var integer seq_nr := 23;
1022 var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1023
Alexander Couzens0e510e62018-07-28 23:06:00 +02001024 BSSGP[0].clear;
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001025 if (error_ind) {
1026 GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
1027 } else {
1028 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1029 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001030
1031 timer T := 5.0;
1032 T.start;
1033
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001034 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001035 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
1036 BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Harald Welte57b9b7f2018-02-18 22:28:13 +01001037 }
Alexander Couzens5e71c142018-08-07 17:21:24 +02001038 [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
1039 repeat;
1040 }
1041 [] T.timeout {
1042 setverdict(fail, "Waiting for SM_DEACT_PDP_REQ_MT");
1043 }
Harald Welte57b9b7f2018-02-18 22:28:13 +01001044 }
1045}
1046
Harald Welte6f203162018-02-18 22:04:55 +01001047
Harald Welteeded9ad2018-02-17 20:57:34 +01001048/* Table 10.5.156/3GPP TS 24.008 */
1049template (value) QoSV t_QosDefault := {
1050 reliabilityClass := '011'B, /* unacknowledged GTP+LLC, acknowledged RLC */
1051 delayClass := '100'B, /* best effort */
1052 spare1 := '00'B,
1053 precedenceClass := '010'B, /* normal */
1054 spare2 := '0'B,
1055 peakThroughput := '0000'B, /* subscribed */
1056 meanThroughput := '00000'B, /* subscribed */
1057 spare3 := '000'B,
1058 deliverErroneusSDU := omit,
1059 deliveryOrder := omit,
1060 trafficClass := omit,
1061 maxSDUSize := omit,
1062 maxBitrateUplink := omit,
1063 maxBitrateDownlink := omit,
1064 sduErrorRatio := omit,
1065 residualBER := omit,
1066 trafficHandlingPriority := omit,
1067 transferDelay := omit,
1068 guaranteedBitRateUplink := omit,
1069 guaranteedBitRateDownlink := omit,
1070 sourceStatisticsDescriptor := omit,
1071 signallingIndication := omit,
1072 spare4 := omit,
1073 maxBitrateDownlinkExt := omit,
1074 guaranteedBitRateDownlinkExt := omit,
1075 maxBitrateUplinkExt := omit,
1076 guaranteedBitRateUplinkExt := omit,
1077 maxBitrateDownlinkExt2 := omit,
1078 guaranteedBitRateDownlinkExt2 := omit,
1079 maxBitrateUplinkExt2 := omit,
1080 guaranteedBitRateUplinkExt2 := omit
1081}
1082
1083/* 10.5.6.4 / 3GPP TS 24.008 */
1084template (value) PDPAddressV t_AddrIPv4dyn := {
1085 pdpTypeOrg := '0001'B, /* IETF */
1086 spare := '0000'B,
1087 pdpTypeNum := '21'O, /* IPv4 */
1088 addressInfo := omit
1089}
1090template (value) PDPAddressV t_AddrIPv6dyn := {
1091 pdpTypeOrg := '0001'B, /* IETF */
1092 spare := '0000'B,
1093 pdpTypeNum := '53'O, /* IPv6 */
1094 addressInfo := omit
1095}
1096
Harald Welte37692d82018-02-18 15:21:34 +01001097template (value) PdpActPars t_PdpActPars(charstring ggsn_ip) := {
Harald Welteeded9ad2018-02-17 20:57:34 +01001098 tid := '000'B,
1099 nsapi := '0101'B, /* < 5 are reserved */
1100 sapi := '0011'B, /* 3/5/9/11 */
1101 qos := t_QosDefault,
1102 addr := t_AddrIPv4dyn,
1103 apn := omit,
1104 pco := omit,
1105 exp_rej_cause := omit,
Harald Welte1d6ae932018-02-18 21:24:44 +01001106 gtp_resp_cause := int2oct(128, 1),
1107 chg_id := f_rnd_octstring(4),
Harald Welteeded9ad2018-02-17 20:57:34 +01001108
1109 /* FIXME: make below dynamic !! */
Harald Welte1d6ae932018-02-18 21:24:44 +01001110 ggsn_tei_c := f_rnd_octstring(4),
1111 ggsn_tei_u := f_rnd_octstring(4),
Harald Welte37692d82018-02-18 15:21:34 +01001112 ggsn_ip_c := f_inet_addr(ggsn_ip),
1113 ggsn_ip_u := f_inet_addr(ggsn_ip),
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001114 ggsn_restart_ctr := int2oct(2, 1),
Harald Welteeded9ad2018-02-17 20:57:34 +01001115
Harald Welteeded9ad2018-02-17 20:57:34 +01001116 sgsn_tei_c := omit,
Harald Weltef8af5d62018-02-18 15:06:42 +01001117 sgsn_tei_u := omit,
1118 sgsn_ip_c := omit,
1119 sgsn_ip_u := omit
Harald Welteeded9ad2018-02-17 20:57:34 +01001120}
1121
Harald Welte37692d82018-02-18 15:21:34 +01001122template (value) GtpPeer ts_GtpPeerU(octetstring ip) := {
1123 connId := 1,
1124 remName := f_inet_ntoa(ip),
1125 remPort := GTP1U_PORT
1126}
1127
1128template (value) GtpPeer ts_GtpPeerC(octetstring ip) := {
1129 connId := 1,
1130 remName := f_inet_ntoa(ip),
1131 remPort := GTP1C_PORT
1132}
1133
1134private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1135 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1136 GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
1137}
1138
1139private altstep as_xid(PdpActPars apars) runs on BSSGP_ConnHdlr {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001140 [] BSSGP[0].receive(tr_BD_LLC(tr_LLC_XID(?, apars.sapi))) {
Harald Welte37692d82018-02-18 15:21:34 +01001141 repeat;
1142 }
1143}
1144
1145template PDU_SN tr_SN_UD(template BIT4 nsapi, template octetstring payload) := {
1146 pDU_SN_UNITDATA := {
1147 nsapi := nsapi,
1148 moreBit := ?,
1149 snPduType := '1'B,
1150 firstSegmentIndicator := ?,
1151 spareBit := ?,
1152 pcomp := ?,
1153 dcomp := ?,
1154 npduNumber := ?,
1155 segmentNumber := ?,
1156 npduNumberContinued := ?,
1157 dataSegmentSnUnitdataPdu := payload
1158 }
1159}
1160
1161/* simple case: single segment, no compression */
1162template (value) PDU_SN ts_SN_UD(BIT4 nsapi, octetstring payload) := {
1163 pDU_SN_UNITDATA := {
1164 nsapi := nsapi,
1165 moreBit := '0'B,
1166 snPduType := '1'B,
1167 firstSegmentIndicator := '1'B,
1168 spareBit := '0'B,
1169 pcomp := '0000'B,
1170 dcomp := '0000'B,
1171 npduNumber := '0000'B,
1172 segmentNumber := '0000'B,
1173 npduNumberContinued := '00'O,
1174 dataSegmentSnUnitdataPdu := payload
1175 }
1176}
1177
1178/* Transceive given 'payload' as MT message from GTP -> OsmoSGSN -> Gb */
1179private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1180 /* Send PDU via GTP from our simulated GGSN to the SGSN */
1181 f_gtpu_send(apars, payload);
1182 /* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
1183 alt {
1184 [] as_xid(apars);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001185 [] BSSGP[0].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
Harald Welte37692d82018-02-18 15:21:34 +01001186 }
1187}
1188
Pau Espin Pedrol8be4d192018-07-18 13:43:44 +02001189/* Transceive given 'payload' as MT message from Gb -> OsmoSGSN -> GTP */
Harald Welte37692d82018-02-18 15:21:34 +01001190private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
1191 /* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
1192 var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
1193 var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001194 BSSGP[0].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
Harald Welte37692d82018-02-18 15:21:34 +01001195 /* Expect PDU via GTP from SGSN on simulated GGSN */
1196 alt {
1197 [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
1198 }
1199}
1200
Harald Welteeded9ad2018-02-17 20:57:34 +01001201private function f_TC_attach_pdp_act(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001202 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Harald Welteeded9ad2018-02-17 20:57:34 +01001203
1204 /* first perform regular attach */
1205 f_TC_attach(id);
1206
1207 f_pdp_ctx_act(apars);
1208}
1209testcase TC_attach_pdp_act() runs on test_CT {
1210 var BSSGP_ConnHdlr vc_conn;
1211 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001212 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act), testcasename(), g_gb, 17);
Harald Welteeded9ad2018-02-17 20:57:34 +01001213 vc_conn.done;
1214}
Harald Welteb2124b22018-02-16 22:26:56 +01001215
Harald Welte835b15f2018-02-18 14:39:11 +01001216/* PDP Context activation for not-attached subscriber; expect fail */
1217private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte37692d82018-02-18 15:21:34 +01001218 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001219 BSSGP[0].send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
Harald Welte835b15f2018-02-18 14:39:11 +01001220 apars.apn, apars.pco));
1221 alt {
1222 /* We might want toalso actually expect a PDPC CTX ACT REJ? */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001223 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001224 setverdict(pass);
1225 }
1226 [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
1227 setverdict(fail, "Unexpected GTP PDP CTX ACT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001228 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001229 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001230 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
Harald Welte835b15f2018-02-18 14:39:11 +01001231 setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
Daniel Willmannafce8662018-07-06 23:11:32 +02001232 mtc.stop;
Harald Welte835b15f2018-02-18 14:39:11 +01001233 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001234 [] BSSGP[0].receive { repeat; }
Harald Welte835b15f2018-02-18 14:39:11 +01001235 }
1236}
1237testcase TC_pdp_act_unattached() runs on test_CT {
1238 var BSSGP_ConnHdlr vc_conn;
1239 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001240 vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb, 18);
Harald Welte835b15f2018-02-18 14:39:11 +01001241 vc_conn.done;
1242}
1243
Harald Welte37692d82018-02-18 15:21:34 +01001244/* ATTACH + PDP CTX ACT + user plane traffic */
1245private function f_TC_attach_pdp_act_user(charstring id) runs on BSSGP_ConnHdlr {
1246 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1247
1248 /* first perform regular attach */
1249 f_TC_attach(id);
1250 /* then activate PDP context */
1251 f_pdp_ctx_act(apars);
1252 /* then transceive a downlink PDU */
1253 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1254 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1255}
1256testcase TC_attach_pdp_act_user() runs on test_CT {
1257 var BSSGP_ConnHdlr vc_conn;
1258 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001259 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_user), testcasename(), g_gb, 19);
Harald Welte37692d82018-02-18 15:21:34 +01001260 vc_conn.done;
1261}
1262
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001263/* ATTACH + PDP CTX ACT; reject from GGSN */
1264private function f_TC_attach_pdp_act_ggsn_reject(charstring id) runs on BSSGP_ConnHdlr {
1265 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1266
1267 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1268 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1269
1270 /* first perform regular attach */
1271 f_TC_attach(id);
1272 /* then activate PDP context */
1273 f_pdp_ctx_act(apars);
1274}
1275testcase TC_attach_pdp_act_ggsn_reject() runs on test_CT {
1276 var BSSGP_ConnHdlr vc_conn;
1277 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001278 vc_conn := f_start_handler(refers(f_TC_attach_pdp_act_ggsn_reject), testcasename(), g_gb, 20);
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001279 vc_conn.done;
1280}
Harald Welte835b15f2018-02-18 14:39:11 +01001281
Harald Welte6f203162018-02-18 22:04:55 +01001282/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MO direction */
1283private function f_TC_attach_pdp_act_user_deact_mo(charstring id) runs on BSSGP_ConnHdlr {
1284 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1285
1286 /* first perform regular attach */
1287 f_TC_attach(id);
1288 /* then activate PDP context */
1289 f_pdp_ctx_act(apars);
1290 /* then transceive a downlink PDU */
1291 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1292 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1293
1294 f_pdp_ctx_deact_mo(apars, '00'O);
1295}
1296testcase TC_attach_pdp_act_user_deact_mo() runs on test_CT {
1297 var BSSGP_ConnHdlr vc_conn;
1298 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001299 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 +01001300 vc_conn.done;
1301}
1302
Harald Welte57b9b7f2018-02-18 22:28:13 +01001303/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction */
1304private function f_TC_attach_pdp_act_user_deact_mt(charstring id) runs on BSSGP_ConnHdlr {
1305 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1306
1307 /* first perform regular attach */
1308 f_TC_attach(id);
1309 /* then activate PDP context */
1310 f_pdp_ctx_act(apars);
1311 /* then transceive a downlink PDU */
1312 f_gtpu_xceive_mt(apars, f_rnd_octstring(100));
1313 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1314
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001315 f_pdp_ctx_deact_mt(apars, false);
Harald Welte57b9b7f2018-02-18 22:28:13 +01001316}
1317testcase TC_attach_pdp_act_user_deact_mt() runs on test_CT {
1318 var BSSGP_ConnHdlr vc_conn;
1319 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001320 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 +01001321 vc_conn.done;
1322}
1323
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001324/* ATTACH + ATTACH (2nd) */
1325private function f_TC_attach_forget_tlli_attach(charstring id) runs on BSSGP_ConnHdlr {
1326 g_pars.t_guard := 5.0;
1327
1328 /* first perform regular attach */
1329 f_TC_attach(id);
1330
1331 /* second to perform regular attach */
1332 f_TC_attach(id);
1333}
1334
1335
1336testcase TC_attach_second_attempt() runs on test_CT {
1337 var BSSGP_ConnHdlr vc_conn;
1338 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001339 vc_conn := f_start_handler(refers(f_TC_attach_forget_tlli_attach), testcasename(), g_gb, 22);
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001340 vc_conn.done;
1341}
Harald Welte57b9b7f2018-02-18 22:28:13 +01001342
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001343private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnHdlr {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001344 var Gtp1cUnitdata g_ud;
1345 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1346
1347 /* first perform regular attach */
1348 f_TC_attach(id);
1349 /* Activate a pdp context against the GGSN */
1350 f_pdp_ctx_act(apars);
1351 /* Wait to receive first echo request and send initial Restart counter */
1352 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1353 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1354 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1355 }
1356 /* Wait to receive second echo request and send incremented Restart
1357 counter. This will fake a restarted GGSN, and pdp ctx allocated
1358 should be released by SGSN */
1359 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1360 GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
1361 var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
1362 GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
1363 }
1364 var OCT1 cause_network_failure := int2oct(38, 1)
1365 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001366 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true))) {
1367 BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001368 setverdict(pass);
1369 }
1370 [] as_xid(apars);
1371 }
1372 setverdict(pass);
1373}
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001374/* ATTACH + trigger Recovery procedure through EchoResp */
1375testcase TC_attach_restart_ctr_echo() runs on test_CT {
Pau Espin Pedroldc27e482018-07-10 14:02:49 +02001376 var BSSGP_ConnHdlr vc_conn;
1377 g_use_echo := true
1378 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001379 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 +02001380 vc_conn.done;
1381 g_use_echo := false
1382}
1383
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001384private function f_TC_attach_restart_ctr_create(charstring id) runs on BSSGP_ConnHdlr {
1385 var Gtp1cUnitdata g_ud;
1386 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1387 var integer seq_nr := 23;
1388 var GtpPeer peer;
1389 /* first perform regular attach */
1390 f_TC_attach(id);
1391
1392 /* Use this CTX ACT to send initial Restart counter to SGSN. */
1393 apars.gtp_resp_cause := int2oct(199, 1); /* no resources available */
1394 apars.exp_rej_cause := '1a'O; /* insufficient resources */
1395 f_pdp_ctx_act(apars, true);
1396
1397 /* Increment restart_ctr. This will fake a restarted GGSN when CreatePdpResp is
1398/* received. */
1399 apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
1400
1401 /* FIXME: Once we can easily handle different pdp ctx simultaneously, it
1402 would be great to have an active pdp context here before triggering
1403 Recovery, and making sure the the DEACT request is sent by the SGSN.
1404 */
1405
1406 /* Activate a pdp context against the GGSN, send incremented Recovery
1407 IE. This should trigger the recovery path, but still this specific
1408 CTX activation should work. */
1409 apars.exp_rej_cause := omit; /* default value for tests */
1410 apars.gtp_resp_cause := int2oct(128, 1); /* default value for tests */
1411 f_pdp_ctx_act(apars, true);
1412
1413 setverdict(pass);
1414}
1415/* ATTACH + trigger Recovery procedure through CreatePdpResp */
1416testcase TC_attach_restart_ctr_create() runs on test_CT {
1417 var BSSGP_ConnHdlr vc_conn;
1418 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001419 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 +02001420 vc_conn.done;
1421}
1422
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001423/* ATTACH + PDP CTX ACT + user plane traffic + PDP CTX DEACT in MT direction + trigger T3395 */
1424private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs on BSSGP_ConnHdlr {
1425 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1426 var integer seq_nr := 23;
1427 var GtpPeer peer;
1428 var integer i;
1429
1430 /* first perform regular attach */
1431 f_TC_attach(id);
1432 /* then activate PDP context */
1433 f_pdp_ctx_act(apars);
1434
Alexander Couzens0e510e62018-07-28 23:06:00 +02001435 BSSGP[0].clear;
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001436 peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
1437 GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
1438
1439 for (i := 0; i < 5; i := i+1) {
1440 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001441 [] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {}
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001442 [] as_xid(apars);
1443 }
1444 }
1445
1446 GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
1447
Alexander Couzens0e510e62018-07-28 23:06:00 +02001448 BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001449 setverdict(pass);
1450}
1451testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
1452 var BSSGP_ConnHdlr vc_conn;
1453 f_init();
1454 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001455 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 +02001456 vc_conn.done;
1457}
1458
Alexander Couzens5e307b42018-05-22 18:12:20 +02001459private function f_TC_hlr_location_cancel_request_update(charstring id) runs on BSSGP_ConnHdlr {
1460 /* MS: perform regular attach */
1461 f_TC_attach(id);
1462
1463 /* HLR: cancel the location request */
1464 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_UPDATE));
1465 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
Alexander Couzens5e307b42018-05-22 18:12:20 +02001466
1467 /* ensure no Detach Request got received */
1468 timer T := 5.0;
1469 T.start;
1470 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001471 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(*, *, *))) {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001472 T.stop;
1473 setverdict(fail, "Unexpected GMM Detach Request");
Daniel Willmannafce8662018-07-06 23:11:32 +02001474 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001475 }
1476 [] T.timeout {
1477 setverdict(pass);
Daniel Willmannafce8662018-07-06 23:11:32 +02001478 mtc.stop;
Alexander Couzens5e307b42018-05-22 18:12:20 +02001479 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001480 [] BSSGP[0].receive {
Alexander Couzens5e307b42018-05-22 18:12:20 +02001481 repeat;
1482 }
1483 }
1484}
1485
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001486/* ATTACH + PDP CTX ACT + user plane traffic + ERROR IND in MT direction */
1487private function f_TC_attach_pdp_act_user_error_ind_ggsn(charstring id) runs on BSSGP_ConnHdlr {
1488 var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
1489
1490 /* first perform regular attach */
1491 f_TC_attach(id);
1492 /* then activate PDP context */
1493 f_pdp_ctx_act(apars);
1494 /* then transceive a downlink PDU */
1495 f_gtpu_xceive_mo(apars, f_rnd_octstring(200));
1496
1497 /* Send Error indication as response from upload PDU and expect deact towards MS */
1498 f_pdp_ctx_deact_mt(apars, true);
1499}
1500testcase TC_attach_pdp_act_user_error_ind_ggsn() runs on test_CT {
1501 var BSSGP_ConnHdlr vc_conn;
1502 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001503 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 +02001504 vc_conn.done;
1505}
1506
Alexander Couzens5e307b42018-05-22 18:12:20 +02001507testcase TC_hlr_location_cancel_request_update() runs on test_CT {
1508 /* MS <-> SGSN: GMM Attach
1509 * HLR -> SGSN: Cancel Location Request
1510 * HLR <- SGSN: Cancel Location Ack
1511 */
1512 var BSSGP_ConnHdlr vc_conn;
1513 f_init();
1514 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001515 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_update), testcasename(), g_gb, 31);
Alexander Couzens5e307b42018-05-22 18:12:20 +02001516 vc_conn.done;
1517}
1518
1519
Alexander Couzensc87967a2018-05-22 16:09:54 +02001520private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs on BSSGP_ConnHdlr {
1521 /* MS: perform regular attach */
1522 f_TC_attach(id);
1523
1524 /* HLR: cancel the location request */
1525 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, OSMO_GSUP_CANCEL_TYPE_WITHDRAW));
1526 GSUP.receive(tr_GSUP_CL_RES(g_pars.imsi));
1527 GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
1528
1529 /* MS: receive a Detach Request */
Alexander Couzens0e510e62018-07-28 23:06:00 +02001530 BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?)));
1531 BSSGP[0].send(ts_GMM_DET_ACCEPT_MO);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001532
1533 setverdict(pass);
1534}
1535
1536testcase TC_hlr_location_cancel_request_withdraw() runs on test_CT {
1537 /* MS <-> SGSN: GMM Attach
1538 * HLR -> SGSN: Cancel Location Request
1539 * HLR <- SGSN: Cancel Location Ack
1540 * MS <- SGSN: Detach Request
1541 * SGSN-> MS: Detach Complete
1542 */
1543 var BSSGP_ConnHdlr vc_conn;
1544 f_init();
1545 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001546 vc_conn := f_start_handler(refers(f_TC_hlr_location_cancel_request_withdraw), testcasename(), g_gb, 29);
Alexander Couzensc87967a2018-05-22 16:09:54 +02001547 vc_conn.done;
1548}
1549
1550
Alexander Couzens6c47f292018-05-22 17:09:49 +02001551private function f_hlr_location_cancel_request_unknown_subscriber(
1552 charstring id,
1553 GSUP_CancelType canceltype) runs on BSSGP_ConnHdlr {
1554
1555 /* HLR: cancel the location request */
1556 GSUP.send(ts_GSUP_CL_REQ(g_pars.imsi, canceltype));
1557
1558 /* cause 2 = IMSI_UNKNOWN */
1559 GSUP.receive(tr_GSUP_CL_ERR(g_pars.imsi, 2));
1560
1561 setverdict(pass);
1562}
1563
1564private function f_TC_hlr_location_cancel_request_unknown_subscriber_withdraw(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001565 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001566}
1567
1568testcase TC_hlr_location_cancel_request_unknown_subscriber_withdraw() runs on test_CT {
1569 /* HLR -> SGSN: Cancel Location Request
1570 * HLR <- SGSN: Cancel Location Error
1571 */
1572
1573 var BSSGP_ConnHdlr vc_conn;
1574 f_init();
1575 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001576 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 +02001577 vc_conn.done;
1578}
1579
1580private function f_TC_hlr_location_cancel_request_unknown_subscriber_update(charstring id) runs on BSSGP_ConnHdlr {
Alexander Couzensace6fc62018-06-05 16:29:02 +02001581 f_hlr_location_cancel_request_unknown_subscriber(id, OSMO_GSUP_CANCEL_TYPE_WITHDRAW);
Alexander Couzens6c47f292018-05-22 17:09:49 +02001582}
1583
1584testcase TC_hlr_location_cancel_request_unknown_subscriber_update() runs on test_CT {
1585 /* HLR -> SGSN: Cancel Location Request
1586 * HLR <- SGSN: Cancel Location Error
1587 */
1588
1589 var BSSGP_ConnHdlr vc_conn;
1590 f_init();
1591 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001592 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 +02001593 vc_conn.done;
1594}
1595
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001596private function f_TC_attach_detach_check_subscriber_list(charstring id) runs on BSSGP_ConnHdlr {
1597 f_TC_attach(id);
1598 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1599}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001600
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001601testcase TC_attach_detach_check_subscriber_list() runs on test_CT {
1602 /* MS <-> SGSN: Attach
1603 * MS -> SGSN: Detach Req (Power off)
1604 * VTY -> SGSN: Check if MS is NOT in subscriber cache
1605 */
1606 var BSSGP_ConnHdlr vc_conn;
1607 var integer id := 33;
1608 var charstring imsi := hex2str(f_gen_imsi(id));
1609
1610 f_init();
Alexander Couzens51114d12018-07-31 18:41:56 +02001611 vc_conn := f_start_handler(refers(f_TC_attach_detach_check_subscriber_list), testcasename(), g_gb, id);
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001612 vc_conn.done;
1613
1614 f_vty_transceive_not_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1615}
Alexander Couzens6c47f292018-05-22 17:09:49 +02001616
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001617/* Attempt an attach, but loose the Identification Request (IMEI) */
1618private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnHdlr {
1619 var integer count_req := 0;
1620 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1621
Alexander Couzens0e510e62018-07-28 23:06:00 +02001622 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001623
1624 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001625 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001626 /* break */
1627 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001628 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001629 mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001630 BSSGP[0].send(ts_GMM_ID_RESP(mi));
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001631 repeat;
1632 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001633 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001634 /* ignore ID REQ IMEI */
1635 count_req := count_req + 1;
1636 repeat;
1637 }
1638 }
1639 if (count_req != 5) {
1640 setverdict(fail, "Did not received GMM ID Request Type IMEI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001641 mtc.stop;
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001642 }
1643 setverdict(pass);
1644}
1645
1646testcase TC_attach_no_imei_response() runs on test_CT {
1647 /* MS -> SGSN: Attach Request IMSI
1648 * MS <- SGSN: Identity Request IMSI (optional)
1649 * MS -> SGSN: Identity Response IMSI (optional)
1650 * MS <- SGSN: Identity Request IMEI
1651 * MS -x SGSN: no response
1652 * MS <- SGSN: re-send: Identity Request IMEI 4x
1653 * MS <- SGSN: Attach Reject
1654 */
1655 var BSSGP_ConnHdlr vc_conn;
1656 f_init();
1657 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001658 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 +02001659 vc_conn.done;
1660}
1661
Alexander Couzens53f20562018-06-12 16:24:12 +02001662/* Attempt an attach, but loose the Identification Request (IMSI) */
1663private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnHdlr {
1664 var integer count_req := 0;
1665 var MobileL3_CommonIE_Types.MobileIdentityLV mi;
1666
1667 /* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
1668 g_pars.p_tmsi := 'c0000035'O;
1669
Alexander Couzens0e510e62018-07-28 23:06:00 +02001670 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens53f20562018-06-12 16:24:12 +02001671
1672 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001673 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001674 /* break */
1675 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001676 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001677 /* ignore ID REQ IMSI */
1678 count_req := count_req + 1;
1679 repeat;
1680 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001681 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
Alexander Couzens53f20562018-06-12 16:24:12 +02001682 mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
Alexander Couzens0e510e62018-07-28 23:06:00 +02001683 BSSGP[0].send(ts_GMM_ID_RESP(mi));
Alexander Couzens53f20562018-06-12 16:24:12 +02001684 repeat;
1685 }
1686 }
1687 if (count_req != 5) {
1688 setverdict(fail, "Did not received GMM ID Request Type IMSI 5 times!");
Daniel Willmannafce8662018-07-06 23:11:32 +02001689 mtc.stop;
Alexander Couzens53f20562018-06-12 16:24:12 +02001690 }
1691 setverdict(pass);
1692}
1693
1694testcase TC_attach_no_imsi_response() runs on test_CT {
1695 /* MS -> SGSN: Attach Request TMSI (unknown)
1696 * MS <- SGSN: Identity Request IMEI (optional)
1697 * MS -> SGSN: Identity Response IMEI (optional)
1698 * MS <- SGSN: Identity Request IMSI
1699 * MS -x SGSN: no response
1700 * MS <- SGSN: re-send: Identity Request IMSI 4x
1701 * MS <- SGSN: Attach Reject
1702 */
1703 var BSSGP_ConnHdlr vc_conn;
1704 f_init();
1705 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001706 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 +02001707 vc_conn.done;
1708}
1709
Alexander Couzenscf818962018-06-05 18:00:00 +02001710private function f_sgsn_vty_destroy_subscriber_imsi(TELNETasp_PT pt, charstring imsi) {
1711 f_vty_transceive(pt, "update-subscriber imsi " & imsi & " destroy");
1712}
1713
1714testcase TC_attach_check_subscriber_list() runs on test_CT {
1715 /* MS <-> SGSN: Attach
1716 * VTY -> SGSN: Check if MS is in subscriber cache
1717 */
1718 var BSSGP_ConnHdlr vc_conn;
1719 var integer id := 34;
1720 var charstring imsi := hex2str(f_gen_imsi(id));
1721
1722 f_init();
1723 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001724 vc_conn := f_start_handler(refers(f_TC_attach), testcasename(), g_gb, id);
Alexander Couzenscf818962018-06-05 18:00:00 +02001725 vc_conn.done;
1726
1727 f_vty_transceive_match(SGSNVTY, "show subscriber cache", pattern "* IMSI: {imsi}*");
1728 f_sgsn_vty_destroy_subscriber_imsi(SGSNVTY, imsi);
1729}
1730
Alexander Couzensf9858652018-06-07 16:14:53 +02001731private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_ConnHdlr {
1732 var RoutingAreaIdentificationV old_ra := f_random_RAI();
1733 var BssgpDecoded bd;
1734
1735 /* unregister the old IMSI */
1736 f_bssgp_client_unregister(g_pars.imsi);
1737 /* Simulate a foreign IMSI */
1738 g_pars.imsi := '001010123456789'H;
Alexander Couzens51114d12018-07-31 18:41:56 +02001739 f_bssgp_client_register(g_pars.imsi, g_pars.tlli, g_pars.bssgp_cell_id[0]);
Alexander Couzensf9858652018-06-07 16:14:53 +02001740
1741 /* there is no auth */
1742 g_pars.net.expect_auth := false;
1743
Alexander Couzens0e510e62018-07-28 23:06:00 +02001744 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
Alexander Couzensf9858652018-06-07 16:14:53 +02001745 f_gmm_auth();
1746 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001747 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzensf9858652018-06-07 16:14:53 +02001748 setverdict(fail, "Received unexpected GMM Attach REJECT");
Daniel Willmannafce8662018-07-06 23:11:32 +02001749 mtc.stop;
Alexander Couzensf9858652018-06-07 16:14:53 +02001750 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001751 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
Alexander Couzensf9858652018-06-07 16:14:53 +02001752 f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
Alexander Couzens0e510e62018-07-28 23:06:00 +02001753 BSSGP[0].send(ts_GMM_ATTACH_COMPL);
Alexander Couzensf9858652018-06-07 16:14:53 +02001754 setverdict(pass);
1755 }
1756 }
1757}
1758testcase TC_attach_closed_add_vty() runs on test_CT {
1759 /* VTY-> SGSN: policy close
1760 * MS -> SGSN: Attach Request
1761 * MS <- SGSN: Identity Request IMSI
1762 * MS -> SGSN: Identity Response IMSI
1763 * MS <- SGSN: Attach Reject
1764 * VTY-> SGSN: policy imsi-acl add IMSI
1765 * MS -> SGSN: Attach Request
1766 * MS <- SGSN: Identity Request IMSI
1767 * MS -> SGSN: Identity Response IMSI
1768 * MS <- SGSN: Identity Request IMEI
1769 * MS -> SGSN: Identity Response IMEI
1770 * MS <- SGSN: Attach Accept
1771 */
1772 var BSSGP_ConnHdlr vc_conn;
1773 f_init();
1774 f_sleep(1.0);
1775 f_vty_config(SGSNVTY, "sgsn", "auth-policy closed");
1776 f_vty_config(SGSNVTY, "sgsn", "imsi-acl del 001010123456789");
1777 /* test with foreign IMSI: Must Reject */
Alexander Couzens51114d12018-07-31 18:41:56 +02001778 vc_conn := f_start_handler(refers(f_TC_attach_closed_foreign), testcasename(), g_gb, 9);
Alexander Couzensf9858652018-06-07 16:14:53 +02001779 vc_conn.done;
1780 f_vty_config(SGSNVTY, "sgsn", "imsi-acl add 001010123456789");
1781 /* test with same IMSI: Must Accept */
Alexander Couzens51114d12018-07-31 18:41:56 +02001782 vc_conn := f_start_handler(refers(f_TC_attach_closed_imsi_added), testcasename(), g_gb, 10);
Alexander Couzensf9858652018-06-07 16:14:53 +02001783 vc_conn.done;
1784}
1785
Alexander Couzens0085bd72018-06-12 19:08:44 +02001786/* Attempt an attach, but never answer a Attach Complete */
1787private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
1788 var integer count_req := 0;
1789
Alexander Couzens0e510e62018-07-28 23:06:00 +02001790 BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
Alexander Couzens0085bd72018-06-12 19:08:44 +02001791 f_gmm_auth();
1792
1793 alt {
Alexander Couzens0e510e62018-07-28 23:06:00 +02001794 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001795 /* break */
1796 }
Alexander Couzens0e510e62018-07-28 23:06:00 +02001797 [] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
Alexander Couzens0085bd72018-06-12 19:08:44 +02001798 /* ignore */
1799 count_req := count_req + 1;
1800 repeat;
1801 }
1802 }
1803 if (count_req != 5) {
1804 setverdict(fail, "Did not received GMM Attach Complete.");
Daniel Willmannafce8662018-07-06 23:11:32 +02001805 mtc.stop;
Alexander Couzens0085bd72018-06-12 19:08:44 +02001806 }
1807 setverdict(pass);
1808}
1809
1810testcase TC_attach_check_complete_resend() runs on test_CT {
1811 /* MS -> SGSN: Attach Request IMSI
1812 * MS <- SGSN: Identity Request *
1813 * MS -> SGSN: Identity Response *
1814 * MS <- SGSN: Attach Complete 5x
1815 */
1816 var BSSGP_ConnHdlr vc_conn;
1817 f_init();
1818 f_sleep(1.0);
Alexander Couzens51114d12018-07-31 18:41:56 +02001819 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 +02001820 vc_conn.done;
1821}
1822
Alexander Couzens5dce90d2018-07-31 03:16:37 +02001823private function f_routing_area_update(RoutingAreaIdentificationV ra, integer bssgp := 0) runs on BSSGP_ConnHdlr {
1824 var BssgpDecoded bd;
1825
1826 /* then send RAU */
1827 BSSGP[bssgp].send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit));
1828 alt {
1829 [] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
1830 f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept);
1831 BSSGP[bssgp].send(ts_GMM_RAU_COMPL);
1832 setverdict(pass);
1833 }
1834 [] BSSGP[bssgp].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
1835 setverdict(fail, "Unexpected RAU Reject");
1836 mtc.stop;
1837 }
1838 [] BSSGP[bssgp].receive { repeat; }
1839 }
1840}
1841
Alexander Couzensbfda9212018-07-31 03:17:33 +02001842private function f_TC_attach_rau_a_a(charstring id) runs on BSSGP_ConnHdlr {
1843 var BssgpDecoded bd;
1844
1845 /* first perform regular attach */
1846 f_TC_attach(id);
1847
1848 /* then send RAU */
1849 f_routing_area_update(g_pars.ra);
1850
1851 /* do another RAU */
1852 f_routing_area_update(g_pars.ra);
1853
1854 f_detach_mo(c_GMM_DTT_MO_GPRS, true, true);
1855}
1856
1857testcase TC_attach_rau_a_a() runs on test_CT {
1858 /* MS <-> SGSN: Successful Attach
1859 * MS -> SGSN: Routing Area Update Request
1860 * MS <- SGSN: Routing Area Update Accept
1861 * MS -> SGSN: Routing Area Update Request
1862 * MS <- SGSN: Routing Area Update Accept
1863 * MS -> SGSN: Detach (PowerOff)
1864 */
1865 var BSSGP_ConnHdlr vc_conn;
1866 f_init();
1867 f_sleep(1.0);
1868 vc_conn := f_start_handler(refers(f_TC_attach_rau_a_a), testcasename(), g_gb, 37);
1869 vc_conn.done;
1870}
1871
Harald Welte5ac31492018-02-15 20:39:13 +01001872control {
Harald Welte5b7c8122018-02-16 21:48:17 +01001873 execute( TC_attach() );
Neels Hofmeyr8df7d152018-03-14 19:03:28 +01001874 execute( TC_attach_mnc3() );
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +02001875 execute( TC_attach_umts_aka_umts_res() );
1876 execute( TC_attach_umts_aka_gsm_sres() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001877 execute( TC_attach_auth_id_timeout() );
1878 execute( TC_attach_auth_sai_timeout() );
Harald Weltefe253882018-02-17 09:25:00 +01001879 execute( TC_attach_auth_sai_reject() );
Harald Welte5b7c8122018-02-16 21:48:17 +01001880 execute( TC_attach_gsup_lu_timeout() );
Harald Welteb7c14e92018-02-17 09:29:16 +01001881 execute( TC_attach_gsup_lu_reject() );
Harald Welte3823e2e2018-02-16 21:53:48 +01001882 execute( TC_attach_combined() );
Harald Welte76dee092018-02-16 22:12:59 +01001883 execute( TC_attach_accept_all() );
Harald Welteb2124b22018-02-16 22:26:56 +01001884 execute( TC_attach_closed() );
Alexander Couzens667dd7f2018-06-12 16:24:01 +02001885 execute( TC_attach_no_imei_response() );
Alexander Couzens53f20562018-06-12 16:24:12 +02001886 execute( TC_attach_no_imsi_response() );
Alexander Couzensf9858652018-06-07 16:14:53 +02001887 execute( TC_attach_closed_add_vty(), 10.0 );
Alexander Couzenscf818962018-06-05 18:00:00 +02001888 execute( TC_attach_check_subscriber_list(), 10.0 );
Alexander Couzens49bb4b42018-06-05 16:28:36 +02001889 execute( TC_attach_detach_check_subscriber_list(), 10.0 );
Alexander Couzens0085bd72018-06-12 19:08:44 +02001890 execute( TC_attach_check_complete_resend() );
Alexander Couzens5e307b42018-05-22 18:12:20 +02001891 execute( TC_hlr_location_cancel_request_update(), 10.0 );
Alexander Couzens234c5882018-05-29 15:48:44 +02001892 execute( TC_hlr_location_cancel_request_withdraw(), 10.0 );
1893 execute( TC_hlr_location_cancel_request_unknown_subscriber_withdraw(), 10.0 );
1894 execute( TC_hlr_location_cancel_request_unknown_subscriber_update(), 10.0 );
Harald Welte04683d02018-02-16 22:43:45 +01001895 execute( TC_rau_unknown() );
Harald Welte91636de2018-02-17 10:16:14 +01001896 execute( TC_attach_rau() );
Alexander Couzensbfda9212018-07-31 03:17:33 +02001897 execute( TC_attach_rau_a_a() );
Harald Welte6abb9fe2018-02-17 15:24:48 +01001898 execute( TC_detach_unknown_nopoweroff() );
1899 execute( TC_detach_unknown_poweroff() );
1900 execute( TC_detach_nopoweroff() );
1901 execute( TC_detach_poweroff() );
Harald Welteeded9ad2018-02-17 20:57:34 +01001902 execute( TC_attach_pdp_act() );
Harald Welte835b15f2018-02-18 14:39:11 +01001903 execute( TC_pdp_act_unattached() );
Harald Welte37692d82018-02-18 15:21:34 +01001904 execute( TC_attach_pdp_act_user() );
Harald Welte5b5ca1b2018-02-18 21:25:03 +01001905 execute( TC_attach_pdp_act_ggsn_reject() );
Harald Welte6f203162018-02-18 22:04:55 +01001906 execute( TC_attach_pdp_act_user_deact_mo() );
Harald Welte57b9b7f2018-02-18 22:28:13 +01001907 execute( TC_attach_pdp_act_user_deact_mt() );
Alexander Couzens187ad5d2018-05-02 19:31:10 +02001908 execute( TC_attach_second_attempt() );
Pau Espin Pedrol94013452018-07-17 15:50:21 +02001909 execute( TC_attach_restart_ctr_echo() );
1910 execute( TC_attach_restart_ctr_create() );
Pau Espin Pedrol72edc8a2018-07-16 15:10:08 +02001911 execute( TC_attach_pdp_act_deact_mt_t3395_expire() );
Pau Espin Pedrol482dde62018-07-18 13:47:42 +02001912 execute( TC_attach_pdp_act_user_error_ind_ggsn() );
Harald Welte5ac31492018-02-15 20:39:13 +01001913}
Harald Welte96a33b02018-02-04 10:36:22 +01001914
1915
1916
1917}