blob: 2233eceb6a3cd344daeda2afc3bfc62848ed2a38 [file] [log] [blame]
Daniel Willmann423d8f42020-09-08 18:58:22 +02001module GBProxy_Tests {
2
3/* Osmocom GBProxy test suite in TTCN-3
4 * (C) 2020 sysmocom - s.f.m.c. GmbH
5 * All rights reserved.
6 *
7 * Author: Daniel Willmann <dwillmann@sysmocom.de>
8
9 * Released under the terms of GNU General Public License, Version 2 or
10 * (at your option) any later version.
11 *
12 * SPDX-License-Identifier: GPL-2.0-or-later
13 */
14
15import from General_Types all;
16import from Osmocom_Types all;
17import from GSM_Types all;
18import from Native_Functions all;
19import from NS_Types all;
20import from NS_Emulation all;
21import from BSSGP_Types all;
22import from BSSGP_Emulation all;
23import from SCCPasp_Types all;
24import from Osmocom_Gb_Types all;
25
26import from MobileL3_CommonIE_Types all;
27import from MobileL3_GMM_SM_Types all;
28import from MobileL3_Types all;
29import from L3_Templates all;
30import from L3_Common all;
31
32import from TELNETasp_PortType all;
33import from Osmocom_VTY_Functions all;
34
35import from LLC_Types all;
36import from LLC_Templates all;
37
38import from GSM_RR_Types all;
39
Harald Welte6d63f742020-11-15 19:44:04 +010040/* mcc_mnc is 24.008 10.5.5.15 encoded. 262 42 */
41const BcdMccMnc c_mcc_mnc := '262F42'H;
42
Harald Welte0d5fceb2020-11-29 16:04:07 +010043/* 48.016 section 6.1.4.2: The default maximum information field size of 1600 octets shall be supported on the Gb interface */
44const integer max_fr_info_size := 1600;
45
Daniel Willmann423d8f42020-09-08 18:58:22 +020046modulepar {
47 /* IP/port on which we run our internal GSUP/HLR emulation */
Harald Welte6d63f742020-11-15 19:44:04 +010048 NSConfigurations mp_nsconfig_sgsn := {
Daniel Willmann423d8f42020-09-08 18:58:22 +020049 {
Daniel Willmann423d8f42020-09-08 18:58:22 +020050 nsei := 101,
51 role_sgsn := true,
Harald Welte90f19742020-11-06 19:34:40 +010052 handle_sns := false,
53 nsvc := {
54 {
55 provider := {
56 ip := {
57 address_family := AF_INET,
58 local_udp_port := 7777,
59 local_ip := "127.0.0.1",
60 remote_udp_port := 23000,
61 remote_ip := "127.0.0.1"
62 }
63 },
64 nsvci := 101
65 }
66 }
Daniel Willmann423d8f42020-09-08 18:58:22 +020067 }
68 };
Harald Welte6d63f742020-11-15 19:44:04 +010069 NSConfigurations mp_nsconfig_pcu := {
Daniel Willmann423d8f42020-09-08 18:58:22 +020070 {
Daniel Willmann423d8f42020-09-08 18:58:22 +020071 nsei := 96,
72 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +010073 handle_sns := false,
74 nsvc := {
75 {
76 provider := {
77 ip := {
78 address_family := AF_INET,
79 local_udp_port := 21010,
80 local_ip := "127.0.0.1",
81 remote_udp_port := 23000,
82 remote_ip := "127.0.0.1"
83 }
84 },
85 nsvci := 97
86 }
87 }
Daniel Willmann423d8f42020-09-08 18:58:22 +020088 },
89 {
Daniel Willmann423d8f42020-09-08 18:58:22 +020090 nsei := 97,
91 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +010092 handle_sns := false,
93 nsvc := {
94 {
95 provider := {
96 ip := {
97 address_family := AF_INET,
98 local_udp_port := 21011,
99 local_ip := "127.0.0.1",
100 remote_udp_port := 23000,
101 remote_ip := "127.0.0.1"
102 }
103 },
104 nsvci := 98
105 }
106 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200107 },
108 {
Daniel Willmann423d8f42020-09-08 18:58:22 +0200109 nsei := 98,
110 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +0100111 handle_sns := false,
112 nsvc := {
113 {
114 provider := {
115 ip := {
116 address_family := AF_INET,
117 local_udp_port := 21012,
118 local_ip := "127.0.0.1",
119 remote_udp_port := 23000,
120 remote_ip := "127.0.0.1"
121 }
122 },
123 nsvci := 99
124 }
125 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200126 }
127 };
Harald Welte6d63f742020-11-15 19:44:04 +0100128 BssgpConfigs mp_gbconfigs := {
129 {
130 nsei := 96,
131 sgsn_role := false,
132 bvc := {
133 {
134 bvci := 196,
135 cell_id := {
136 ra_id := {
137 lai := {
138 mcc_mnc := c_mcc_mnc,
139 lac := 13135
140 },
141 rac := 0
142 },
143 cell_id := 20960
144 },
145 depth := BSSGP_DECODE_DEPTH_BSSGP,
146 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
147 }
148 }
149 }, {
150 nsei := 97,
151 sgsn_role := false,
152 bvc := {
153 {
154 bvci := 210,
155 cell_id := {
156 ra_id := {
157 lai := {
158 mcc_mnc := c_mcc_mnc,
Harald Welte0e188242020-11-22 21:46:48 +0100159 lac := 13135
Harald Welte6d63f742020-11-15 19:44:04 +0100160 },
Harald Welte0e188242020-11-22 21:46:48 +0100161 rac := 1
Harald Welte6d63f742020-11-15 19:44:04 +0100162 },
163 cell_id := 20961
164 },
165 depth := BSSGP_DECODE_DEPTH_BSSGP,
166 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
167 }
168 }
169 }, {
170 nsei := 98,
171 sgsn_role := false,
172 bvc := {
173 {
174 bvci := 220,
175 cell_id := {
176 ra_id := {
177 lai := {
178 mcc_mnc := c_mcc_mnc,
179 lac := 13300
180 },
181 rac := 0
182 },
183 cell_id := 20962
184 },
185 depth := BSSGP_DECODE_DEPTH_BSSGP,
186 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
187 }
188 }
189 }
190 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200191};
192
Daniel Willmann423d8f42020-09-08 18:58:22 +0200193type record GbInstance {
194 NS_CT vc_NS,
195 BSSGP_CT vc_BSSGP,
Harald Welte67dc8c22020-11-17 18:32:29 +0100196 BSSGP_BVC_CTs vc_BSSGP_BVC,
Daniel Willmann423d8f42020-09-08 18:58:22 +0200197 BssgpConfig cfg
198};
Harald Welte67dc8c22020-11-17 18:32:29 +0100199type record of BSSGP_BVC_CT BSSGP_BVC_CTs
Daniel Willmann423d8f42020-09-08 18:58:22 +0200200
201const integer NUM_PCU := 3;
Harald Welte6d63f742020-11-15 19:44:04 +0100202type record of GbInstance GbInstances;
203type record of BssgpConfig BssgpConfigs;
204type record of NSConfiguration NSConfigurations;
205type record of BssgpCellId BssgpCellIds;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200206
207const integer NUM_SGSN := 1;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200208
209type component test_CT {
Harald Welte6d63f742020-11-15 19:44:04 +0100210 var GbInstances g_pcu;
211 var GbInstances g_sgsn;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200212
213 port BSSGP_CT_PROC_PT PROC;
214
Harald Weltefbae83f2020-11-15 23:25:55 +0100215 port BSSGP_BVC_MGMT_PT SGSN_MGMT;
216 port BSSGP_BVC_MGMT_PT PCU_MGMT;
217
Daniel Willmann423d8f42020-09-08 18:58:22 +0200218 port TELNETasp_PT GBPVTY;
219
220 var boolean g_initialized := false;
221 var boolean g_use_echo := false;
Harald Welte16786e92020-11-27 19:11:56 +0100222
223 var ro_integer g_roi := {};
Daniel Willmann423d8f42020-09-08 18:58:22 +0200224};
225
226type component BSSGP_ConnHdlr {
Harald Welte3dd21b32020-11-17 19:21:00 +0100227 /* array of per-BVC ports on the PCU side */
Daniel Willmann423d8f42020-09-08 18:58:22 +0200228 port BSSGP_PT PCU[NUM_PCU];
229 port BSSGP_PT PCU_SIG[NUM_PCU];
230 port BSSGP_PROC_PT PCU_PROC[NUM_PCU];
Harald Welte3dd21b32020-11-17 19:21:00 +0100231 /* component reference to the component to which we're currently connected */
232 var BSSGP_BVC_CT pcu_ct[NUM_PCU];
Harald Welte0e188242020-11-22 21:46:48 +0100233 /* BSSGP BVC configuration of the component to which we're currently connected */
234 var BssgpBvcConfig pcu_bvc_cfg[NUM_PCU];
Harald Welte3dd21b32020-11-17 19:21:00 +0100235
236 /* array of per-BVC ports on the SGSN side */
Daniel Willmann423d8f42020-09-08 18:58:22 +0200237 port BSSGP_PT SGSN[NUM_SGSN];
238 port BSSGP_PT SGSN_SIG[NUM_SGSN];
239 port BSSGP_PROC_PT SGSN_PROC[NUM_SGSN];
Harald Welte3dd21b32020-11-17 19:21:00 +0100240 /* component reference to the component to which we're currently connected */
241 var BSSGP_BVC_CT sgsn_ct[NUM_PCU];
Daniel Willmann423d8f42020-09-08 18:58:22 +0200242
243 var BSSGP_ConnHdlrPars g_pars;
244 timer g_Tguard;
245 var LLC_Entities llc;
Harald Welte0e188242020-11-22 21:46:48 +0100246
247 var ro_integer g_roi := {};
Daniel Willmann423d8f42020-09-08 18:58:22 +0200248}
249
250type record SGSN_ConnHdlrNetworkPars {
251 boolean expect_ptmsi,
252 boolean expect_auth,
253 boolean expect_ciph
254};
255
256type record BSSGP_ConnHdlrPars {
257 /* IMEI of the simulated ME */
258 hexstring imei,
259 /* IMSI of the simulated MS */
260 hexstring imsi,
261 /* MSISDN of the simulated MS (probably unused) */
262 hexstring msisdn,
263 /* P-TMSI allocated to the simulated MS */
264 OCT4 p_tmsi optional,
265 OCT3 p_tmsi_sig optional,
266 /* TLLI of the simulated MS */
267 OCT4 tlli,
268 OCT4 tlli_old optional,
269 RoutingAreaIdentificationV ra optional,
Harald Welte16357a92020-11-17 18:20:00 +0100270 GbInstances pcu,
Harald Welte3dd21b32020-11-17 19:21:00 +0100271 GbInstances sgsn,
Daniel Willmann423d8f42020-09-08 18:58:22 +0200272 float t_guard
273};
274
275private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {
276 /* mcc_mnc is encoded as of 24.008 10.5.5.15 */
277 var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;
278
279 var RoutingAreaIdentificationV ret := {
280 mccDigit1 := mcc_mnc[0],
281 mccDigit2 := mcc_mnc[1],
282 mccDigit3 := mcc_mnc[2],
283 mncDigit3 := mcc_mnc[3],
284 mncDigit1 := mcc_mnc[4],
285 mncDigit2 := mcc_mnc[5],
286 lac := int2oct(cell_id.ra_id.lai.lac, 16),
287 rac := int2oct(cell_id.ra_id.rac, 8)
288 }
289 return ret;
290};
291
Harald Welte95339432020-12-02 18:50:52 +0100292private function f_fix_create_cb(inout BssgpConfig cfg)
293{
294 for (var integer i := 0; i < lengthof(cfg.bvc); i := i + 1) {
295 if (not isbound(cfg.bvc[i].create_cb)) {
296 cfg.bvc[i].create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
297 }
298 }
299}
300
Daniel Willmann423d8f42020-09-08 18:58:22 +0200301private function f_init_gb_pcu(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
Harald Welteb419d0e2020-11-16 16:45:05 +0100302 var charstring ns_id := id & "-NS(PCU[" & int2str(offset) & "])";
303 var charstring bssgp_id := id & "-BSSGP(PCU[" & int2str(offset) & "])";
304 gb.vc_NS := NS_CT.create(ns_id);
305 gb.vc_BSSGP := BSSGP_CT.create(bssgp_id);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200306 /* connect lower end of BSSGP emulation with NS upper port */
307 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
308
Harald Welteb419d0e2020-11-16 16:45:05 +0100309 gb.vc_NS.start(NSStart(mp_nsconfig_pcu[offset], ns_id));
310 gb.vc_BSSGP.start(BssgpStart(gb.cfg, bssgp_id));
Daniel Willmann423d8f42020-09-08 18:58:22 +0200311
312 for (var integer i := 0; i < lengthof(gb.cfg.bvc); i := i + 1) {
313 connect(self:PROC, gb.vc_BSSGP:PROC);
314 gb.vc_BSSGP_BVC[i] := f_bssgp_get_bvci_ct(gb.cfg.bvc[i].bvci, PROC);
315 disconnect(self:PROC, gb.vc_BSSGP:PROC);
Harald Weltefbae83f2020-11-15 23:25:55 +0100316 connect(self:PCU_MGMT, gb.vc_BSSGP_BVC[i]:MGMT);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200317 }
Harald Welte16786e92020-11-27 19:11:56 +0100318 connect(self:PCU_MGMT, gb.vc_BSSGP:MGMT);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200319}
320
321private function f_init_gb_sgsn(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
Harald Welteb419d0e2020-11-16 16:45:05 +0100322 var charstring ns_id := id & "-NS(SGSN[" & int2str(offset) & "])";
323 var charstring bssgp_id := id & "-BSSGP(SGSN[" & int2str(offset) & "])";
324 gb.vc_NS := NS_CT.create(ns_id);
325 gb.vc_BSSGP := BSSGP_CT.create(bssgp_id);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200326 /* connect lower end of BSSGP emulation with NS upper port */
327 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
328
Harald Welteb419d0e2020-11-16 16:45:05 +0100329 gb.vc_NS.start(NSStart(mp_nsconfig_sgsn[offset], ns_id));
330 gb.vc_BSSGP.start(BssgpStart(gb.cfg, bssgp_id));
Daniel Willmann423d8f42020-09-08 18:58:22 +0200331
332 for (var integer i := 0; i < lengthof(gb.cfg.bvc); i := i + 1) {
333 connect(self:PROC, gb.vc_BSSGP:PROC);
334 gb.vc_BSSGP_BVC[i] := f_bssgp_get_bvci_ct(gb.cfg.bvc[i].bvci, PROC);
335 disconnect(self:PROC, gb.vc_BSSGP:PROC);
Harald Weltefbae83f2020-11-15 23:25:55 +0100336 connect(self:SGSN_MGMT, gb.vc_BSSGP_BVC[i]:MGMT);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200337 }
Harald Welte16786e92020-11-27 19:11:56 +0100338 connect(self:SGSN_MGMT, gb.vc_BSSGP:MGMT);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200339}
340
341
342private function f_init_vty() runs on test_CT {
343 map(self:GBPVTY, system:GBPVTY);
344 f_vty_set_prompts(GBPVTY);
345 f_vty_transceive(GBPVTY, "enable");
346}
347
Harald Weltefbae83f2020-11-15 23:25:55 +0100348type record of integer ro_integer;
349
350private function ro_integer_contains(ro_integer r, integer x) return boolean {
351 for (var integer j := 0; j < lengthof(r); j := j+1) {
352 if (r[j] == x) {
353 return true;
354 }
355 }
356 return false;
357}
358
Harald Welte6d63f742020-11-15 19:44:04 +0100359function f_init() runs on test_CT {
Harald Weltefbae83f2020-11-15 23:25:55 +0100360 var ro_integer bvci_unblocked := {};
361 var BssgpStatusIndication bsi;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200362 var integer i;
363
364 if (g_initialized == true) {
365 return;
366 }
367 g_initialized := true;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200368
369 g_sgsn[0].cfg := {
Harald Welte6d63f742020-11-15 19:44:04 +0100370 nsei := mp_nsconfig_sgsn[0].nsei,
Daniel Willmann423d8f42020-09-08 18:58:22 +0200371 sgsn_role := true,
Harald Welte6d63f742020-11-15 19:44:04 +0100372 bvc := { }
373 }
374 for (i := 0; i < lengthof(mp_gbconfigs); i := i+1) {
375 g_pcu[i].cfg := mp_gbconfigs[i];
Harald Welte95339432020-12-02 18:50:52 +0100376 /* make sure all have a proper crate_cb, which cannot be specified in config file */
377 f_fix_create_cb(g_pcu[i].cfg);
Harald Welte6d63f742020-11-15 19:44:04 +0100378 /* concatenate all the PCU-side BVCs for the SGSN side */
Harald Welte95339432020-12-02 18:50:52 +0100379 g_sgsn[0].cfg.bvc := g_sgsn[0].cfg.bvc & g_pcu[i].cfg.bvc;
Harald Welte6d63f742020-11-15 19:44:04 +0100380 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200381
382 f_init_vty();
Harald Welte6d63f742020-11-15 19:44:04 +0100383 for (i := 0; i < lengthof(mp_nsconfig_sgsn); i := i+1) {
Daniel Willmann443fc572020-11-18 13:26:57 +0100384 f_vty_transceive(GBPVTY, "nsvc nsei " & int2str(g_sgsn[i].cfg.nsei) & " force-unconfigured");
Daniel Willmannad93c052020-12-04 14:14:38 +0100385 }
386 for (i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
387 f_vty_transceive(GBPVTY, "nsvc nsei " & int2str(g_pcu[i].cfg.nsei) & " force-unconfigured");
388 f_vty_transceive(GBPVTY, "delete-gbproxy-peer " & int2str(g_pcu[i].cfg.nsei) & " only-bvc");
389 }
390
391 for (i := 0; i < lengthof(mp_nsconfig_sgsn); i := i+1) {
Harald Welteea1ba592020-11-17 18:05:13 +0100392 f_init_gb_sgsn(g_sgsn[i], "GbProxy_Test", i);
Harald Welte6d63f742020-11-15 19:44:04 +0100393 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200394 f_sleep(4.0);
Harald Welte6d63f742020-11-15 19:44:04 +0100395 for (i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
Harald Welteb419d0e2020-11-16 16:45:05 +0100396 f_init_gb_pcu(g_pcu[i], "GbProxy_Test", i);
Harald Welte6d63f742020-11-15 19:44:04 +0100397 }
Harald Weltefbae83f2020-11-15 23:25:55 +0100398
399 /* wait until all BVC are unblocked on both sides */
Harald Welted2801272020-11-17 19:22:58 +0100400 timer T := 15.0;
Harald Weltefbae83f2020-11-15 23:25:55 +0100401 T.start;
402 alt {
403 [] SGSN_MGMT.receive(BssgpStatusIndication:{*, ?, BVC_S_UNBLOCKED}) -> value bsi {
404 bvci_unblocked := bvci_unblocked & { bsi.bvci };
405 if (lengthof(bvci_unblocked) != lengthof(g_sgsn[0].cfg.bvc)) {
406 repeat;
407 }
408 }
409 [] SGSN_MGMT.receive(BssgpStatusIndication:{*, ?, ?}) {
410 repeat;
411 }
Harald Welte3c905152020-11-26 20:56:09 +0100412 [] SGSN_MGMT.receive(BssgpResetIndication:?) {
413 repeat;
414 }
Harald Weltefbae83f2020-11-15 23:25:55 +0100415 [] SGSN_MGMT.receive {
416 setverdict(fail, "Received unexpected message on SGSN_MGMT");
417 mtc.stop;
418 }
419
420 [] PCU_MGMT.receive(BssgpStatusIndication:{*, ?, BVC_S_UNBLOCKED}) -> value bsi {
421 repeat;
422 }
423 [] PCU_MGMT.receive(BssgpStatusIndication:{*, ?, ?}) {
424 repeat;
425 }
426 [] PCU_MGMT.receive(BssgpResetIndication:{0}) {
427 repeat;
428 }
429 [] PCU_MGMT.receive {
430 setverdict(fail, "Received unexpected message on PCU_MGMT");
431 mtc.stop;
432 }
433
434 [] T.timeout {
435 setverdict(fail, "Timeout waiting for unblock of all BVCs");
436 mtc.stop;
437 }
438 }
439
440 /* iterate over list and check all BVCI */
441 for (i := 0; i < lengthof(g_sgsn[0].cfg.bvc); i := i+1) {
442 var BssgpBvci bvci := g_sgsn[0].cfg.bvc[i].bvci;
443 if (not ro_integer_contains(bvci_unblocked, bvci)) {
444 setverdict(fail, "BVCI=", bvci, " was not unblocked during start-up");
445 mtc.stop;
446 }
447 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200448}
449
450function f_cleanup() runs on test_CT {
451 self.stop;
452}
453
454type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
455
456/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Harald Welte6d63f742020-11-15 19:44:04 +0100457function f_start_handler(void_fn fn, charstring id, GbInstances pcu, GbInstances sgsn, integer imsi_suffix,
Daniel Willmann423d8f42020-09-08 18:58:22 +0200458 float t_guard := 30.0)
459runs on test_CT return BSSGP_ConnHdlr {
460 var BSSGP_ConnHdlr vc_conn;
461
462 var BSSGP_ConnHdlrPars pars := {
463 imei := f_gen_imei(imsi_suffix),
464 imsi := f_gen_imsi(imsi_suffix),
465 msisdn := f_gen_msisdn(imsi_suffix),
466 p_tmsi := omit,
467 p_tmsi_sig := omit,
468 tlli := f_gprs_tlli_random(),
469 tlli_old := omit,
470 ra := omit,
Harald Welte16357a92020-11-17 18:20:00 +0100471 pcu := g_pcu,
Harald Welte3dd21b32020-11-17 19:21:00 +0100472 sgsn := g_sgsn,
Daniel Willmann423d8f42020-09-08 18:58:22 +0200473 t_guard := t_guard
474 };
475
476 vc_conn := BSSGP_ConnHdlr.create(id);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200477
478 vc_conn.start(f_handler_init(fn, id, pars));
479 return vc_conn;
480}
481
Harald Welte3dd21b32020-11-17 19:21:00 +0100482/* Connect the PCU-side per-BVC ports (PCU/PCU_SIG/PCU_PROC) array slot 'port_idx' to specified per-BVC component */
Harald Welte0e188242020-11-22 21:46:48 +0100483private function f_connect_to_pcu_bvc(integer port_idx, integer nse_idx, integer bvc_idx)
484runs on BSSGP_ConnHdlr {
485 var BSSGP_BVC_CT bvc_ct := g_pars.pcu[nse_idx].vc_BSSGP_BVC[bvc_idx]
Harald Welte3dd21b32020-11-17 19:21:00 +0100486 if (PCU[port_idx].checkstate("Connected")) {
487 /* unregister + disconnect from old BVC */
488 f_client_unregister(g_pars.imsi, PCU_PROC[port_idx]);
489 disconnect(self:PCU[port_idx], pcu_ct[port_idx]:BSSGP_SP);
490 disconnect(self:PCU_SIG[port_idx], pcu_ct[port_idx]:BSSGP_SP_SIG);
491 disconnect(self:PCU_PROC[port_idx], pcu_ct[port_idx]:BSSGP_PROC);
492 }
493 /* connect to new BVC and register us */
494 connect(self:PCU[port_idx], bvc_ct:BSSGP_SP);
495 connect(self:PCU_SIG[port_idx], bvc_ct:BSSGP_SP_SIG);
496 connect(self:PCU_PROC[port_idx], bvc_ct:BSSGP_PROC);
497 f_client_register(g_pars.imsi, g_pars.tlli, PCU_PROC[port_idx]);
498 pcu_ct[port_idx] := bvc_ct;
Harald Welte0e188242020-11-22 21:46:48 +0100499 pcu_bvc_cfg[port_idx] := g_pars.pcu[nse_idx].cfg.bvc[bvc_idx];
Harald Welte3dd21b32020-11-17 19:21:00 +0100500}
501
502/* Connect the SGSN-side per-BVC ports (SGSN/SGSN_SIG/SGSN_PROC) array slot 'port_idx' to specified per-BVC component */
503private function f_connect_to_sgsn_bvc(integer port_idx, BSSGP_BVC_CT bvc_ct) runs on BSSGP_ConnHdlr {
504 if (SGSN[port_idx].checkstate("Connected")) {
505 /* unregister + disconnect from old BVC */
506 f_client_unregister(g_pars.imsi, SGSN_PROC[port_idx]);
507 disconnect(self:SGSN[port_idx], sgsn_ct[port_idx]:BSSGP_SP);
508 disconnect(self:SGSN_SIG[port_idx], sgsn_ct[port_idx]:BSSGP_SP_SIG);
509 disconnect(self:SGSN_PROC[port_idx], sgsn_ct[port_idx]:BSSGP_PROC);
510 }
511 /* connect to new BVC and register us */
512 connect(self:SGSN[port_idx], bvc_ct:BSSGP_SP);
513 connect(self:SGSN_SIG[port_idx], bvc_ct:BSSGP_SP_SIG);
514 connect(self:SGSN_PROC[port_idx], bvc_ct:BSSGP_PROC);
515 f_client_register(g_pars.imsi, g_pars.tlli, SGSN_PROC[port_idx]);
516 sgsn_ct[port_idx] := bvc_ct;
517}
518
Daniel Willmann423d8f42020-09-08 18:58:22 +0200519private altstep as_Tguard() runs on BSSGP_ConnHdlr {
520 [] g_Tguard.timeout {
521 setverdict(fail, "Tguard timeout");
522 mtc.stop;
523 }
524}
525
526/* first function called in every ConnHdlr */
527private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
528runs on BSSGP_ConnHdlr {
Harald Welte1e834f32020-11-15 20:02:59 +0100529 var integer i;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200530 /* do some common stuff like setting up g_pars */
531 g_pars := pars;
532
533 llc := f_llc_create(false);
534
Harald Welte3dd21b32020-11-17 19:21:00 +0100535 /* default connections on PCU side: First BVC of each NSE/PCU */
536 for (i := 0; i < lengthof(g_pars.pcu); i := i+1) {
Harald Welte0e188242020-11-22 21:46:48 +0100537 f_connect_to_pcu_bvc(port_idx := i, nse_idx := i, bvc_idx := 0);
Harald Welte1e834f32020-11-15 20:02:59 +0100538 }
Harald Welte3dd21b32020-11-17 19:21:00 +0100539
540 /* default connections on SGSN side: First BVC of each NSE/SGSN */
541 for (i := 0; i < lengthof(g_pars.sgsn); i := i+1) {
542 f_connect_to_sgsn_bvc(i, g_pars.sgsn[i].vc_BSSGP_BVC[0]);
Harald Welte1e834f32020-11-15 20:02:59 +0100543 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200544
545 g_Tguard.start(pars.t_guard);
546 activate(as_Tguard());
547
548 /* call the user-supplied test case function */
549 fn.apply(id);
550}
551
Harald Welte1e834f32020-11-15 20:02:59 +0100552private function f_client_register(hexstring imsi, OCT4 tlli, BSSGP_PROC_PT PT)
553runs on BSSGP_ConnHdlr {
554 PT.call(BSSGP_register_client:{imsi, tlli}) {
555 [] PT.getreply(BSSGP_register_client:{imsi, tlli}) {};
556 }
557}
558
559private function f_client_unregister(hexstring imsi, BSSGP_PROC_PT PT)
560runs on BSSGP_ConnHdlr {
561 PT.call(BSSGP_unregister_client:{imsi}) {
562 [] PT.getreply(BSSGP_unregister_client:{imsi}) {};
563 }
564}
565
Harald Welte22ef5d92020-11-16 13:35:14 +0100566/* Send 'tx' on PTP-BVCI from PCU; expect 'rx' on SGSN */
567friend function f_pcu2sgsn(template (value) PDU_BSSGP tx, template (present) PDU_BSSGP exp_rx,
Daniel Willmann4798fd72020-11-24 16:23:29 +0100568 integer pcu_idx := 0, integer sgsn_idx := 0, boolean use_sig := false) runs on BSSGP_ConnHdlr {
Harald Welte22ef5d92020-11-16 13:35:14 +0100569 var PDU_BSSGP rx;
570 timer T := 1.0;
571
Daniel Willmann4798fd72020-11-24 16:23:29 +0100572 if (use_sig) {
573 PCU_SIG[pcu_idx].send(tx);
574 } else {
575 PCU[pcu_idx].send(tx);
576 }
577
Harald Welte22ef5d92020-11-16 13:35:14 +0100578 T.start;
579 alt {
Daniel Willmann4798fd72020-11-24 16:23:29 +0100580 [use_sig] SGSN_SIG[sgsn_idx].receive(exp_rx) {
581 setverdict(pass);
582 }
583 [not use_sig] SGSN[sgsn_idx].receive(exp_rx) {
Harald Welte22ef5d92020-11-16 13:35:14 +0100584 setverdict(pass);
585 }
586 [] SGSN[sgsn_idx].receive(PDU_BSSGP:?) -> value rx {
587 setverdict(fail, "Unexpected BSSGP on SGSN side: ", rx);
588 mtc.stop;
589 }
Daniel Willmann4798fd72020-11-24 16:23:29 +0100590 [] SGSN_SIG[sgsn_idx].receive(PDU_BSSGP:?) -> value rx {
591 setverdict(fail, "Unexpected SIG BSSGP on SGSN side: ", rx);
592 mtc.stop;
593 }
Harald Welte22ef5d92020-11-16 13:35:14 +0100594 [] T.timeout {
Harald Welte8b326412020-11-29 16:05:38 +0100595 setverdict(fail, "Timeout waiting for BSSGP on SGSN side: ", exp_rx);
Harald Welte22ef5d92020-11-16 13:35:14 +0100596 mtc.stop;
597 }
598 }
599}
600
601/* Send 'tx' on PTP-BVCI from SGSN; expect 'rx' on PCU */
602friend function f_sgsn2pcu(template (value) PDU_BSSGP tx, template (present) PDU_BSSGP exp_rx,
Daniel Willmann4798fd72020-11-24 16:23:29 +0100603 integer sgsn_idx:= 0, integer pcu_idx := 0, boolean use_sig := false) runs on BSSGP_ConnHdlr {
Harald Welte22ef5d92020-11-16 13:35:14 +0100604 var PDU_BSSGP rx;
605 timer T := 1.0;
606
Daniel Willmann4798fd72020-11-24 16:23:29 +0100607 if (use_sig) {
608 SGSN_SIG[sgsn_idx].send(tx);
609 } else {
610 SGSN[sgsn_idx].send(tx);
611 }
612
Harald Welte22ef5d92020-11-16 13:35:14 +0100613 T.start;
614 alt {
Daniel Willmann4798fd72020-11-24 16:23:29 +0100615 [use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {
616 setverdict(pass);
617 }
618 [not use_sig] PCU[pcu_idx].receive(exp_rx) {
Harald Welte22ef5d92020-11-16 13:35:14 +0100619 setverdict(pass);
620 }
621 [] PCU[pcu_idx].receive(PDU_BSSGP:?) -> value rx {
622 setverdict(fail, "Unexpected BSSGP on PCU side: ", rx);
623 mtc.stop;
624 }
Daniel Willmann4798fd72020-11-24 16:23:29 +0100625 [] PCU_SIG[pcu_idx].receive(PDU_BSSGP:?) -> value rx {
626 setverdict(fail, "Unexpected SIG BSSGP on PCU side: ", rx);
627 mtc.stop;
628 }
Harald Welte22ef5d92020-11-16 13:35:14 +0100629 [] T.timeout {
Harald Welte8b326412020-11-29 16:05:38 +0100630 setverdict(fail, "Timeout waiting for BSSGP on PCU side: ", exp_rx);
Harald Welte22ef5d92020-11-16 13:35:14 +0100631 mtc.stop;
632 }
633 }
634}
Harald Welte1e834f32020-11-15 20:02:59 +0100635
Harald Welte3807ed12020-11-24 19:05:22 +0100636/***********************************************************************
637 * GlobaLTest_CT: Using the per-NSE GLOBAL ports on PCU + SGSN side
638 ***********************************************************************/
639
640type component GlobalTest_CT extends test_CT {
641 port BSSGP_PT G_PCU[NUM_PCU];
642 port BSSGP_PT G_SGSN[NUM_SGSN];
643};
644
645private function f_global_init() runs on GlobalTest_CT {
646 var integer i;
647 for (i := 0; i < lengthof(g_sgsn); i := i+1) {
648 connect(self:G_SGSN[i], g_sgsn[i].vc_BSSGP:GLOBAL);
649 }
650 for (i := 0; i < lengthof(g_pcu); i := i+1) {
651 connect(self:G_PCU[i], g_pcu[i].vc_BSSGP:GLOBAL);
652 }
653}
654
655/* Send 'tx' on PTP-BVCI from PCU; expect 'rx' on SGSN */
656friend function f_global_pcu2sgsn(template (value) PDU_BSSGP tx, template (present) PDU_BSSGP exp_rx,
657 integer pcu_idx := 0, integer sgsn_idx := 0) runs on GlobalTest_CT {
658 var PDU_BSSGP rx;
659 timer T := 1.0;
660
661 G_PCU[pcu_idx].send(tx);
662 T.start;
663 alt {
664 [] G_SGSN[sgsn_idx].receive(exp_rx) {
665 setverdict(pass);
666 }
667 [] G_SGSN[sgsn_idx].receive(PDU_BSSGP:?) -> value rx {
668 setverdict(fail, "Unexpected BSSGP on SGSN side: ", rx);
669 mtc.stop;
670 }
671 [] T.timeout {
672 setverdict(fail, "Timeout waiting for BSSGP on SGSN side: ", rx);
673 mtc.stop;
674 }
675 }
676}
677
678/* Send 'tx' on PTP-BVCI from SGSN; expect 'rx' on PCU */
679friend function f_global_sgsn2pcu(template (value) PDU_BSSGP tx, template (present) PDU_BSSGP exp_rx,
680 integer sgsn_idx := 0, integer pcu_idx := 0) runs on GlobalTest_CT {
681 var PDU_BSSGP rx;
682 timer T := 1.0;
683
684 G_SGSN[sgsn_idx].send(tx);
685 T.start;
686 alt {
687 [] G_PCU[pcu_idx].receive(exp_rx) {
688 setverdict(pass);
689 }
690 [] G_PCU[pcu_idx].receive(PDU_BSSGP:?) -> value rx {
691 setverdict(fail, "Unexpected BSSGP on PCU side: ", rx);
692 mtc.stop;
693 }
694 [] T.timeout {
695 setverdict(fail, "Timeout waiting for BSSGP on PCU side: ", rx);
696 mtc.stop;
697 }
698 }
699}
700
701
Daniel Willmann423d8f42020-09-08 18:58:22 +0200702/* TODO:
703 * Detach without Attach
704 * SM procedures without attach / RAU
705 * ATTACH / RAU
706 ** with / without authentication
707 ** with / without P-TMSI allocation
708 * re-transmissions of LLC frames
709 * PDP Context activation
710 ** with different GGSN config in SGSN VTY
711 ** with different PDP context type (v4/v6/v46)
712 ** timeout from GGSN
713 ** multiple / secondary PDP context
714 */
715
716private function f_TC_BVC_bringup(charstring id) runs on BSSGP_ConnHdlr {
717 f_sleep(5.0);
718 setverdict(pass);
719}
720
721testcase TC_BVC_bringup() runs on test_CT {
722 var BSSGP_ConnHdlr vc_conn;
723 f_init();
724
725 vc_conn := f_start_handler(refers(f_TC_BVC_bringup), testcasename(), g_pcu, g_sgsn, 51);
726 vc_conn.done;
727
728 f_cleanup();
729}
730
731friend function f_bssgp_suspend(integer ran_idx := 0) runs on BSSGP_ConnHdlr return OCT1 {
Harald Welte16357a92020-11-17 18:20:00 +0100732 var BssgpBvcConfig bvcc := g_pars.pcu[ran_idx].cfg.bvc[0];
Daniel Willmann423d8f42020-09-08 18:58:22 +0200733 timer T := 5.0;
734 var PDU_BSSGP rx_pdu;
Harald Welte16357a92020-11-17 18:20:00 +0100735 PCU_SIG[ran_idx].send(ts_BSSGP_SUSPEND(g_pars.tlli, bvcc.cell_id.ra_id));
Daniel Willmann423d8f42020-09-08 18:58:22 +0200736 T.start;
737 alt {
Harald Welte16357a92020-11-17 18:20:00 +0100738 [] PCU_SIG[ran_idx].receive(tr_BSSGP_SUSPEND_ACK(g_pars.tlli, bvcc.cell_id.ra_id, ?)) -> value rx_pdu {
Daniel Willmann423d8f42020-09-08 18:58:22 +0200739 return rx_pdu.pDU_BSSGP_SUSPEND_ACK.suspend_Reference_Number.suspend_Reference_Number_value;
740 }
Harald Welte16357a92020-11-17 18:20:00 +0100741 [] PCU_SIG[ran_idx].receive(tr_BSSGP_SUSPEND_NACK(g_pars.tlli, bvcc.cell_id.ra_id, ?)) -> value rx_pdu {
Daniel Willmann423d8f42020-09-08 18:58:22 +0200742 setverdict(fail, "SUSPEND-NACK in response to SUSPEND for TLLI ", g_pars.tlli);
743 mtc.stop;
744 }
745 [] T.timeout {
746 setverdict(fail, "No SUSPEND-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
747 mtc.stop;
748 }
749 }
750 return '00'O;
751}
752
753friend function f_bssgp_resume(OCT1 susp_ref, integer ran_idx := 0) runs on BSSGP_ConnHdlr {
Harald Welte16357a92020-11-17 18:20:00 +0100754 var BssgpBvcConfig bvcc := g_pars.pcu[ran_idx].cfg.bvc[0];
Daniel Willmann423d8f42020-09-08 18:58:22 +0200755 timer T := 5.0;
Harald Welte16357a92020-11-17 18:20:00 +0100756 PCU_SIG[ran_idx].send(ts_BSSGP_RESUME(g_pars.tlli, bvcc.cell_id.ra_id, susp_ref));
Daniel Willmann423d8f42020-09-08 18:58:22 +0200757 T.start;
758 alt {
Harald Welte16357a92020-11-17 18:20:00 +0100759 [] PCU_SIG[ran_idx].receive(tr_BSSGP_RESUME_ACK(g_pars.tlli, bvcc.cell_id.ra_id));
760 [] PCU_SIG[ran_idx].receive(tr_BSSGP_RESUME_NACK(g_pars.tlli, bvcc.cell_id.ra_id, ?)) {
Daniel Willmann423d8f42020-09-08 18:58:22 +0200761 setverdict(fail, "RESUME-NACK in response to RESUME for TLLI ", g_pars.tlli);
762 mtc.stop;
763 }
764 [] T.timeout {
765 setverdict(fail, "No RESUME-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
766 mtc.stop;
767 }
768 }
769}
770
771
Harald Welte92686012020-11-15 21:45:49 +0100772/* send uplink-unitdata of a variety of different sizes; expect it to show up on SGSN */
773private function f_TC_ul_unitdata(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte16357a92020-11-17 18:20:00 +0100774 var integer ran_idx := 0;
775 var BssgpBvcConfig bvcc := g_pars.pcu[ran_idx].cfg.bvc[0];
Harald Welte92686012020-11-15 21:45:49 +0100776 var integer i;
777
Harald Welte0d5fceb2020-11-29 16:04:07 +0100778 for (i := 0; i < max_fr_info_size-4; i := i+4) {
Harald Welte92686012020-11-15 21:45:49 +0100779 var octetstring payload := f_rnd_octstring(i);
Harald Welte16357a92020-11-17 18:20:00 +0100780 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_UL_UD(g_pars.tlli, bvcc.cell_id, payload);
Harald Welte92686012020-11-15 21:45:49 +0100781 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte16357a92020-11-17 18:20:00 +0100782 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_UL_UD(g_pars.tlli, bvcc.cell_id, payload);
Harald Welte92686012020-11-15 21:45:49 +0100783
Harald Welte0d5fceb2020-11-29 16:04:07 +0100784 log("UL-UNITDATA(payload_size=", i);
Harald Welte22ef5d92020-11-16 13:35:14 +0100785 f_pcu2sgsn(pdu_tx, pdu_rx);
Harald Welte92686012020-11-15 21:45:49 +0100786 }
787 setverdict(pass);
788}
789
790testcase TC_ul_unitdata() runs on test_CT
791{
792 var BSSGP_ConnHdlr vc_conn;
793 f_init();
794
795 vc_conn := f_start_handler(refers(f_TC_ul_unitdata), testcasename(), g_pcu, g_sgsn, 1);
796 vc_conn.done;
797 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
798
799 f_cleanup();
800}
801
Harald Welte78d8db92020-11-15 23:27:27 +0100802/* send downlink-unitdata of a variety of different sizes; expect it to show up on PCU */
803private function f_TC_dl_unitdata(charstring id) runs on BSSGP_ConnHdlr {
804 var integer i;
805
Harald Welte0d5fceb2020-11-29 16:04:07 +0100806 for (i := 0; i < max_fr_info_size-4; i := i+4) {
Harald Welte78d8db92020-11-15 23:27:27 +0100807 var octetstring payload := f_rnd_octstring(i);
808 var template (value) PDU_BSSGP pdu_tx :=
809 ts_BSSGP_DL_UD(g_pars.tlli, payload, omit, ts_BSSGP_IMSI(g_pars.imsi));
810 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
811 var template (present) PDU_BSSGP pdu_rx :=
812 tr_BSSGP_DL_UD(g_pars.tlli, payload, tr_BSSGP_IMSI(g_pars.imsi));
813
Harald Welte0d5fceb2020-11-29 16:04:07 +0100814 log("DL-UNITDATA(payload_size=", i);
Harald Welte22ef5d92020-11-16 13:35:14 +0100815 f_sgsn2pcu(pdu_tx, pdu_rx);
Harald Welte78d8db92020-11-15 23:27:27 +0100816 }
817 setverdict(pass);
818}
819
820testcase TC_dl_unitdata() runs on test_CT
821{
822 var BSSGP_ConnHdlr vc_conn;
823 f_init();
824
825 vc_conn := f_start_handler(refers(f_TC_dl_unitdata), testcasename(), g_pcu, g_sgsn, 2);
826 vc_conn.done;
827 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
828
829 f_cleanup();
830}
Harald Welte92686012020-11-15 21:45:49 +0100831
Harald Welte6dc2ac42020-11-16 09:16:17 +0100832private function f_TC_ra_capability(charstring id) runs on BSSGP_ConnHdlr {
833 var integer i;
834
835 for (i := 0; i < 10; i := i+1) {
836 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_RA_CAP(g_pars.tlli, { ts_RaCapRec_BSSGP });
837 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
838 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_RA_CAP(g_pars.tlli, { tr_RaCapRec_BSSGP })
839
Harald Welte22ef5d92020-11-16 13:35:14 +0100840 f_sgsn2pcu(pdu_tx, pdu_rx);
Harald Welte6dc2ac42020-11-16 09:16:17 +0100841 }
842 setverdict(pass);
843}
844testcase TC_ra_capability() runs on test_CT
845{
846 var BSSGP_ConnHdlr vc_conn;
847 f_init();
848
849 vc_conn := f_start_handler(refers(f_TC_ra_capability), testcasename(), g_pcu, g_sgsn, 3);
850 vc_conn.done;
851 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
852
853 f_cleanup();
854}
855
Daniel Willmannace3ece2020-11-16 19:53:26 +0100856private function f_TC_ra_capability_upd(charstring id) runs on BSSGP_ConnHdlr {
857 var integer i;
858 var OCT1 tag;
859 for (i := 0; i < 10; i := i+1) {
860 tag := int2oct(23 + i, 1);
861 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_RA_CAP_UPD(g_pars.tlli, tag);
862 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
863 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_RA_CAP_UPD(g_pars.tlli, tag)
864
865 f_pcu2sgsn(pdu_tx, pdu_rx);
866
867 pdu_tx := ts_BSSGP_RA_CAP_UPD_ACK(g_pars.tlli, tag, '42'O);
868 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
869 pdu_rx := tr_BSSGP_RA_CAP_UPD_ACK(g_pars.tlli, tag, '42'O)
870
871 f_sgsn2pcu(pdu_tx, pdu_rx);
872 }
873 setverdict(pass);
874}
875testcase TC_ra_capability_upd() runs on test_CT
876{
877 var BSSGP_ConnHdlr vc_conn;
878 f_init();
879
Daniel Willmann54833f22020-11-19 15:43:52 +0100880 vc_conn := f_start_handler(refers(f_TC_ra_capability_upd), testcasename(), g_pcu, g_sgsn, 4);
Daniel Willmannace3ece2020-11-16 19:53:26 +0100881 vc_conn.done;
882 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
883
884 f_cleanup();
885}
886
Daniel Willmann165d6612020-11-19 14:27:29 +0100887private function f_TC_radio_status(charstring id) runs on BSSGP_ConnHdlr {
888 var integer i;
889 var BssgpRadioCause cause := BSSGP_RADIO_CAUSE_CONTACT_LOST;
890 for (i := 0; i < 10; i := i+1) {
891 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_RADIO_STATUS(g_pars.tlli, cause);
892 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
893 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_RADIO_STATUS(g_pars.tlli, cause)
894
895 f_pcu2sgsn(pdu_tx, pdu_rx);
896 }
897 setverdict(pass);
898}
899testcase TC_radio_status() runs on test_CT
900{
901 var BSSGP_ConnHdlr vc_conn;
902 f_init();
903
Daniel Willmann54833f22020-11-19 15:43:52 +0100904 vc_conn := f_start_handler(refers(f_TC_radio_status), testcasename(), g_pcu, g_sgsn, 5);
Daniel Willmann165d6612020-11-19 14:27:29 +0100905 vc_conn.done;
906 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
907
908 f_cleanup();
909}
910
Harald Welte3807ed12020-11-24 19:05:22 +0100911private function f_TC_suspend() runs on GlobalTest_CT {
Daniel Willmannfa67f492020-11-19 15:48:05 +0100912 var integer i;
Daniel Willmann165d6612020-11-19 14:27:29 +0100913
Daniel Willmannfa67f492020-11-19 15:48:05 +0100914 /* TODO: Generate RA ID for each ConnHdlr */
Harald Welte3807ed12020-11-24 19:05:22 +0100915 var RoutingAreaIdentification ra_id := g_pcu[0].cfg.bvc[0].cell_id.ra_id;
Daniel Willmannfa67f492020-11-19 15:48:05 +0100916 for (i := 0; i < 10; i := i+1) {
Harald Welte3807ed12020-11-24 19:05:22 +0100917 var OCT4 tlli := f_gprs_tlli_random();
918 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_SUSPEND(tlli, ra_id);
Daniel Willmannfa67f492020-11-19 15:48:05 +0100919 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +0100920 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_SUSPEND(tlli, ra_id);
Daniel Willmannfa67f492020-11-19 15:48:05 +0100921
Harald Welte3807ed12020-11-24 19:05:22 +0100922 f_global_pcu2sgsn(pdu_tx, pdu_rx);
Daniel Willmannfa67f492020-11-19 15:48:05 +0100923
Harald Welte3807ed12020-11-24 19:05:22 +0100924 pdu_tx := ts_BSSGP_SUSPEND_ACK(tlli, ra_id, int2oct(i, 1));
Daniel Willmannfa67f492020-11-19 15:48:05 +0100925 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +0100926 pdu_rx := tr_BSSGP_SUSPEND_ACK(tlli, ra_id, int2oct(i, 1));
Daniel Willmannfa67f492020-11-19 15:48:05 +0100927
Harald Welte3807ed12020-11-24 19:05:22 +0100928 f_global_sgsn2pcu(pdu_tx, pdu_rx);
Daniel Willmannfa67f492020-11-19 15:48:05 +0100929
930 /* These messages are simple passed through so just also test sending NACK */
Harald Welte3807ed12020-11-24 19:05:22 +0100931 pdu_tx := ts_BSSGP_SUSPEND_NACK(tlli, ra_id, BSSGP_CAUSE_UNKNOWN_MS);
Daniel Willmannfa67f492020-11-19 15:48:05 +0100932 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +0100933 pdu_rx := tr_BSSGP_SUSPEND_NACK(tlli, ra_id, BSSGP_CAUSE_UNKNOWN_MS);
Daniel Willmannfa67f492020-11-19 15:48:05 +0100934
Harald Welte3807ed12020-11-24 19:05:22 +0100935 f_global_sgsn2pcu(pdu_tx, pdu_rx);
Daniel Willmannfa67f492020-11-19 15:48:05 +0100936 }
937 setverdict(pass);
938}
Harald Welte3807ed12020-11-24 19:05:22 +0100939testcase TC_suspend() runs on GlobalTest_CT
Daniel Willmannfa67f492020-11-19 15:48:05 +0100940{
Daniel Willmannfa67f492020-11-19 15:48:05 +0100941 f_init();
Harald Welte3807ed12020-11-24 19:05:22 +0100942 f_global_init();
943 f_TC_suspend();
Daniel Willmannfa67f492020-11-19 15:48:05 +0100944 f_cleanup();
945}
Harald Welte6dc2ac42020-11-16 09:16:17 +0100946
Harald Welte3807ed12020-11-24 19:05:22 +0100947private function f_TC_resume() runs on GlobalTest_CT {
Daniel Willmann087a33d2020-11-19 15:58:43 +0100948 var integer i;
949
950 /* TODO: Generate RA ID for each ConnHdlr */
Harald Welte3807ed12020-11-24 19:05:22 +0100951 var RoutingAreaIdentification ra_id := g_pcu[0].cfg.bvc[0].cell_id.ra_id;
Daniel Willmann087a33d2020-11-19 15:58:43 +0100952 for (i := 0; i < 10; i := i+1) {
Harald Welte3807ed12020-11-24 19:05:22 +0100953 var OCT4 tlli := f_gprs_tlli_random();
954 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_RESUME(tlli, ra_id, int2oct(i, 1));
Daniel Willmann087a33d2020-11-19 15:58:43 +0100955 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +0100956 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_RESUME(tlli, ra_id, int2oct(i, 1));
Daniel Willmann087a33d2020-11-19 15:58:43 +0100957
Harald Welte3807ed12020-11-24 19:05:22 +0100958 f_global_pcu2sgsn(pdu_tx, pdu_rx);
Daniel Willmann087a33d2020-11-19 15:58:43 +0100959
Harald Welte3807ed12020-11-24 19:05:22 +0100960 pdu_tx := ts_BSSGP_RESUME_ACK(tlli, ra_id);
Daniel Willmann087a33d2020-11-19 15:58:43 +0100961 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +0100962 pdu_rx := tr_BSSGP_RESUME_ACK(tlli, ra_id);
Daniel Willmann087a33d2020-11-19 15:58:43 +0100963
Harald Welte3807ed12020-11-24 19:05:22 +0100964 f_global_sgsn2pcu(pdu_tx, pdu_rx);
Daniel Willmann087a33d2020-11-19 15:58:43 +0100965
966 /* These messages are simple passed through so just also test sending NACK */
Harald Welte3807ed12020-11-24 19:05:22 +0100967 pdu_tx := ts_BSSGP_RESUME_NACK(tlli, ra_id, BSSGP_CAUSE_UNKNOWN_MS);
Daniel Willmann087a33d2020-11-19 15:58:43 +0100968 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +0100969 pdu_rx := tr_BSSGP_RESUME_NACK(tlli, ra_id, BSSGP_CAUSE_UNKNOWN_MS);
Daniel Willmann087a33d2020-11-19 15:58:43 +0100970
Harald Welte3807ed12020-11-24 19:05:22 +0100971 f_global_sgsn2pcu(pdu_tx, pdu_rx);
Daniel Willmann087a33d2020-11-19 15:58:43 +0100972 }
973 setverdict(pass);
974}
Harald Welte3807ed12020-11-24 19:05:22 +0100975testcase TC_resume() runs on GlobalTest_CT
Daniel Willmann087a33d2020-11-19 15:58:43 +0100976{
Daniel Willmann087a33d2020-11-19 15:58:43 +0100977 f_init();
Harald Welte3807ed12020-11-24 19:05:22 +0100978 f_global_init();
979 f_TC_resume();
Daniel Willmann087a33d2020-11-19 15:58:43 +0100980 f_cleanup();
981}
982
Harald Weltef8ef0282020-11-18 12:16:59 +0100983/* test the load-sharing between multiple NS-VC on the BSS side */
984private function f_TC_dl_ud_unidir(charstring id) runs on BSSGP_ConnHdlr {
985 var integer i;
986
987 for (i := 0; i < 10; i := i+1) {
988 var octetstring payload := f_rnd_octstring(i);
989 var template (value) PDU_BSSGP pdu_tx :=
990 ts_BSSGP_DL_UD(g_pars.tlli, payload, omit, ts_BSSGP_IMSI(g_pars.imsi));
991 SGSN[0].send(pdu_tx);
992 }
993 setverdict(pass);
994}
995testcase TC_load_sharing_dl() runs on test_CT_NS
996{
997 const integer num_ue := 10;
998 var BSSGP_ConnHdlr vc_conn[num_ue];
999 f_init();
1000
1001 /* all BVC are now fully brought up. We disconnect BSSGP from NS on the BSS
1002 * side so we get the raw NsUnitdataIndication and hence observe different
1003 * NSVCI */
1004 disconnect(g_pcu[0].vc_NS:NS_SP, g_pcu[0].vc_BSSGP:BSCP);
1005 connect(g_pcu[0].vc_NS:NS_SP, self:NS);
1006
1007 /* there may still be some NS-VCs coming up? After all, the BVC-RESET succeeds after the first
1008 * of the NS-VC is ALIVE/UNBLOCKED */
1009 f_sleep(3.0);
1010
1011 /* start parallel components generating DL-UNITDATA from the SGSN side */
1012 for (var integer i:= 0; i < num_ue; i := i+1) {
1013 vc_conn[i] := f_start_handler(refers(f_TC_dl_ud_unidir), testcasename(), g_pcu, g_sgsn, 5+i);
1014 }
1015
1016 /* now start counting all the messages that were queued before */
1017 /* TODO: We have a hard-coded assumption of 4 NS-VC in one NSE/NS-VCG here! */
1018 var ro_integer rx_count := { 0, 0, 0, 0 };
1019 timer T := 2.0;
1020 T.start;
1021 alt {
1022 [] as_NsUdiCount(0, rx_count);
1023 [] as_NsUdiCount(1, rx_count);
1024 [] as_NsUdiCount(2, rx_count);
1025 [] as_NsUdiCount(3, rx_count);
1026 [] NS.receive(NsUnitdataIndication:{0,?,?,*,*}) { repeat; } /* signaling BVC */
1027 [] NS.receive(NsStatusIndication:?) { repeat; }
1028 [] NS.receive {
1029 setverdict(fail, "Rx unexpected NS");
1030 mtc.stop;
1031 }
1032 [] T.timeout {
1033 }
1034 }
1035 for (var integer i := 0; i < lengthof(rx_count); i := i+1) {
1036 log("Rx on NSVCI ", mp_nsconfig_pcu[0].nsvc[i].nsvci, ": ", rx_count[i]);
1037 if (rx_count[i] == 0) {
1038 setverdict(fail, "Data not shared over all NSVC");
1039 }
1040 }
1041 setverdict(pass);
1042}
1043private altstep as_NsUdiCount(integer nsvc_idx, inout ro_integer roi) runs on test_CT_NS {
1044 var NsUnitdataIndication udi;
1045 var BssgpBvcConfig bvcc := g_pcu[0].cfg.bvc[0];
1046 [] NS.receive(NsUnitdataIndication:{bvcc.bvci, g_pcu[0].cfg.nsei, mp_nsconfig_pcu[0].nsvc[nsvc_idx].nsvci, *, *}) -> value udi {
1047 roi[nsvc_idx] := roi[nsvc_idx] + 1;
1048 repeat;
1049 }
1050}
1051type component test_CT_NS extends test_CT {
1052 port NS_PT NS;
1053};
1054
1055
Harald Welte0e188242020-11-22 21:46:48 +01001056/***********************************************************************
1057 * PAGING PS procedure
1058 ***********************************************************************/
1059
1060private function f_send_paging_ps(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1061 boolean use_sig := false)
1062runs on BSSGP_ConnHdlr return template (present) PDU_BSSGP {
1063 var template (value) PDU_BSSGP pdu_tx;
1064 var template (present) PDU_BSSGP pdu_rx;
1065 /* we always specify '0' as BVCI in the templates below, as we override it with
1066 * 'p4' later anyway */
1067 pdu_rx := tr_BSSGP_PS_PAGING(0);
1068 pdu_rx.pDU_BSSGP_PAGING_PS.iMSI := tr_BSSGP_IMSI(g_pars.imsi);
1069 if (ispresent(g_pars.p_tmsi)) {
1070 pdu_tx := ts_BSSGP_PS_PAGING_PTMSI(0, g_pars.imsi, oct2int(g_pars.p_tmsi));
1071 pdu_rx.pDU_BSSGP_PAGING_PS.pTMSI := tr_BSSGP_TMSI(oct2int(g_pars.p_tmsi));
1072 } else {
1073 pdu_tx := ts_BSSGP_PS_PAGING_IMSI(0, g_pars.imsi);
1074 pdu_rx.pDU_BSSGP_PAGING_PS.pTMSI := omit;
1075 }
1076 pdu_tx.pDU_BSSGP_PAGING_PS.paging_Field4 := p4;
1077 pdu_rx.pDU_BSSGP_PAGING_PS.paging_Field4 := p4;
1078 if (use_sig == false) {
1079 SGSN[sgsn_idx].send(pdu_tx);
1080 } else {
1081 SGSN_SIG[sgsn_idx].send(pdu_tx);
1082 }
1083 return pdu_rx;
1084}
1085
1086/* send paging defined by 'p4' on given SGSN-side index (ptp or signaling) and expect one paging to arrive on
1087 * specified PCU index */
1088private function f_send_paging_ps_exp_one_bss(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1089 boolean use_sig := false,integer pcu_idx := 0)
1090runs on BSSGP_ConnHdlr {
1091 var template (present) PDU_BSSGP exp_rx;
1092 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1093 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1094 exp_rx := f_send_paging_ps(p4, sgsn_idx, use_sig);
1095 /* Expect paging to propagate to the one BSS addressed by the BVCI only */
1096 timer T := 2.0;
1097 T.start;
1098 alt {
1099 [not use_sig] PCU[pcu_idx].receive(exp_rx) {
1100 setverdict(pass);
1101 repeat;
1102 }
1103 [not use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {
1104 setverdict(fail, "Received paging on SIGNALING BVC, expected PTP BVC");
1105 }
1106 [use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {
1107 setverdict(pass);
1108 repeat;
1109 }
1110 [use_sig] PCU[pcu_idx].receive(exp_rx) {
1111 setverdict(fail, "Received paging on PTP BVC, expected SIGNALING BVC");
1112 }
1113 [] any from PCU.receive(exp_rx) {
1114 setverdict(fail, "Paging received on unexpected BVC");
1115 }
1116 [] any from PCU_SIG.receive(exp_rx) {
1117 setverdict(fail, "Paging received on unexpected BVC");
1118 }
1119 [] any from PCU.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
1120 setverdict(fail, "Different Paging than expected received PTP BVC");
1121 }
1122 [] any from PCU_SIG.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
1123 setverdict(fail, "Different Paging than expected on SIGNALING BVC");
1124 }
1125 [] T.timeout;
1126 }
1127}
1128
Harald Welte7462a592020-11-23 22:07:07 +01001129/* send a PS-PAGING but don't expect it to show up on any PTP or SIG BVC */
1130private function f_send_paging_ps_exp_no_bss(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1131 boolean use_sig := false)
1132runs on BSSGP_ConnHdlr {
1133 var template (present) PDU_BSSGP exp_rx;
1134 exp_rx := f_send_paging_ps(p4, sgsn_idx, use_sig);
1135 /* Expect paging to propagate to no BSS */
1136 timer T := 2.0;
1137 T.start;
1138 alt {
1139 [] any from PCU.receive(exp_rx) {
1140 setverdict(fail, "Paging received on unexpected BVC");
1141 }
1142 [] any from PCU_SIG.receive(exp_rx) {
1143 setverdict(fail, "Paging received on unexpected BVC");
1144 }
1145 [] any from PCU.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
1146 setverdict(fail, "Different Paging received on PTP BVC");
1147 }
1148 [] any from PCU_SIG.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
1149 setverdict(fail, "Different Paging received on SIGNALING BVC");
1150 }
1151 [] T.timeout {
1152 setverdict(pass);
1153 }
1154 }
1155}
1156
Harald Welte0e188242020-11-22 21:46:48 +01001157private function f_TC_paging_ps_ptp_bss(charstring id) runs on BSSGP_ConnHdlr
1158{
1159 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1160 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1161 f_send_paging_ps_exp_one_bss(ts_BssgpP4BssArea, 0, false, 0);
1162}
1163testcase TC_paging_ps_ptp_bss() runs on test_CT {
1164 var BSSGP_ConnHdlr vc_conn;
1165 f_init();
1166
1167 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_bss), testcasename(), g_pcu, g_sgsn, 9);
1168 vc_conn.done;
1169
1170 f_cleanup();
1171}
1172
1173/* PS-PAGING on PTP-BVC for Location Area */
1174private function f_TC_paging_ps_ptp_lac(charstring id) runs on BSSGP_ConnHdlr
1175{
1176 var template (present) PDU_BSSGP exp_rx;
1177 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1178 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1179 f_send_paging_ps_exp_one_bss(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, false, 0);
1180}
1181testcase TC_paging_ps_ptp_lac() runs on test_CT {
1182 var BSSGP_ConnHdlr vc_conn;
1183 f_init();
1184
1185 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_lac), testcasename(), g_pcu, g_sgsn, 10);
1186 vc_conn.done;
1187
1188 f_cleanup();
1189}
1190
Harald Welte7462a592020-11-23 22:07:07 +01001191/* PS-PAGING on PTP-BVC for unknown Location Area */
1192private function f_TC_paging_ps_ptp_lac_unknown(charstring id) runs on BSSGP_ConnHdlr
1193{
1194 var GSM_Types.LocationAreaIdentification unknown_la := {
1195 mcc_mnc := '567F99'H,
1196 lac := 33333
1197 };
1198 /* as it's sent on the PTP BVC, we expect it to pass even for unknown LAC */
1199 f_send_paging_ps_exp_one_bss(ts_BssgpP4LAC(unknown_la), 0, false, 0);
1200}
1201testcase TC_paging_ps_ptp_lac_unknown() runs on test_CT {
1202 var BSSGP_ConnHdlr vc_conn;
1203 f_init();
1204
1205 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_lac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1206 vc_conn.done;
1207
1208 f_cleanup();
1209}
1210
Harald Welte0e188242020-11-22 21:46:48 +01001211/* PS-PAGING on PTP-BVC for Routeing Area */
1212private function f_TC_paging_ps_ptp_rac(charstring id) runs on BSSGP_ConnHdlr
1213{
1214 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1215 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1216 f_send_paging_ps_exp_one_bss(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, false, 0);
1217}
1218testcase TC_paging_ps_ptp_rac() runs on test_CT {
1219 var BSSGP_ConnHdlr vc_conn;
1220 f_init();
1221
1222 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_rac), testcasename(), g_pcu, g_sgsn, 11);
1223 vc_conn.done;
1224
1225 f_cleanup();
1226}
1227
Harald Welte7462a592020-11-23 22:07:07 +01001228/* PS-PAGING on PTP-BVC for unknown Routeing Area */
1229private function f_TC_paging_ps_ptp_rac_unknown(charstring id) runs on BSSGP_ConnHdlr
1230{
1231 var RoutingAreaIdentification unknown_ra := {
1232 lai := {
1233 mcc_mnc := '567F99'H,
1234 lac := 33333
1235 },
1236 rac := 254
1237 };
1238 /* as it's sent on the PTP BVC, we expect it to pass even for unknown RAC */
1239 f_send_paging_ps_exp_one_bss(ts_BssgpP4RAC(unknown_ra), 0, false, 0);
1240}
1241testcase TC_paging_ps_ptp_rac_unknown() runs on test_CT {
1242 var BSSGP_ConnHdlr vc_conn;
1243 f_init();
1244
1245 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_rac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1246 vc_conn.done;
1247
1248 f_cleanup();
1249}
1250
Harald Welte0e188242020-11-22 21:46:48 +01001251/* PS-PAGING on PTP-BVC for BVCI (one cell) */
1252private function f_TC_paging_ps_ptp_bvci(charstring id) runs on BSSGP_ConnHdlr
1253{
1254 /* this should be the normal case for MS in READY MM state after a lower layer failure */
1255 f_send_paging_ps_exp_one_bss(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, false, 0);
1256}
1257testcase TC_paging_ps_ptp_bvci() runs on test_CT {
1258 var BSSGP_ConnHdlr vc_conn;
1259 f_init();
1260
1261 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_bvci), testcasename(), g_pcu, g_sgsn, 12);
1262 vc_conn.done;
1263
1264 f_cleanup();
1265}
1266
Harald Welte7462a592020-11-23 22:07:07 +01001267/* PS-PAGING on PTP-BVC for unknown BVCI */
1268private function f_TC_paging_ps_ptp_bvci_unknown(charstring id) runs on BSSGP_ConnHdlr
1269{
1270 /* as it's sent on the PTP BVC, we expect it to pass even for unknown BVCI */
1271 f_send_paging_ps_exp_one_bss(ts_BssgpP4Bvci(33333), 0, false, 0);
1272}
1273testcase TC_paging_ps_ptp_bvci_unknown() runs on test_CT {
1274 var BSSGP_ConnHdlr vc_conn;
1275 f_init();
1276
1277 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_bvci_unknown), testcasename(), g_pcu, g_sgsn, 11);
1278 vc_conn.done;
1279
1280 f_cleanup();
1281}
1282
Harald Welte0e188242020-11-22 21:46:48 +01001283/* altstep for expecting BSSGP PDU on signaling BVC of given pcu_idx + storing in 'roi' */
1284private altstep as_paging_sig_pcu(integer pcu_idx, template (present) PDU_BSSGP exp_rx, inout ro_integer roi)
1285runs on BSSGP_ConnHdlr {
1286[] PCU_SIG[pcu_idx].receive(exp_rx) {
1287 if (ro_integer_contains(roi, pcu_idx)) {
1288 setverdict(fail, "Received multiple paging on same SIG BVC");
1289 }
1290 roi := roi & { pcu_idx };
1291 repeat;
1292 }
1293[] PCU[pcu_idx].receive(exp_rx) {
1294 setverdict(fail, "Received paging on PTP BVC, expected SIGNALING BVC");
1295 }
1296[] PCU_SIG[pcu_idx].receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
1297 setverdict(fail, "Different Paging than expected received SIGNALING BVC");
1298 }
1299[] PCU[pcu_idx].receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
1300 setverdict(fail, "Different Paging than expected received PTP BVC");
1301 }
1302}
1303
1304type record of default ro_default;
1305
1306/* send PS-PAGING on SIG BVC, expect it to arrive on given list of PCU indexes */
1307private function f_send_paging_ps_exp_multi(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1308 ro_integer exp_on_pcu_idx) runs on BSSGP_ConnHdlr
1309{
1310 var template (present) PDU_BSSGP exp_rx;
1311 exp_rx := f_send_paging_ps(p4, 0, true);
1312
1313 /* FIXME: make sure the relevant BVCs/BSS are connected to the ports! */
1314 var ro_default defaults := {};
1315 for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
1316 var default d := activate(as_paging_sig_pcu(i, exp_rx, g_roi));
1317 defaults := defaults & { d };
1318 }
1319 f_sleep(2.0);
1320 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
1321 deactivate(defaults[i]);
1322 }
1323 log("Paging received on PCU ", g_roi);
1324
1325 for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
1326 var boolean rx_on_i := ro_integer_contains(g_roi, i);
1327 var boolean exp_on_i := ro_integer_contains(exp_on_pcu_idx, i);
1328 if (exp_on_i and not rx_on_i) {
1329 setverdict(fail, "PS-PAGING not received on ", mp_nsconfig_pcu[i].nsei);
1330 }
1331 if (not exp_on_i and rx_on_i) {
1332 setverdict(fail, "PS-PAGING not expected but received on ", mp_nsconfig_pcu[i].nsei);
1333 }
1334 }
1335 setverdict(pass);
1336}
1337
1338/* PS-PAGING on SIG-BVC for BSS Area */
1339private function f_TC_paging_ps_sig_bss(charstring id) runs on BSSGP_ConnHdlr
1340{
1341 /* we expect the paging to arrive on all three NSE */
1342 f_send_paging_ps_exp_multi(ts_BssgpP4BssArea, 0, {0, 1, 2});
1343}
1344testcase TC_paging_ps_sig_bss() runs on test_CT {
1345 var BSSGP_ConnHdlr vc_conn;
1346 f_init();
1347
1348 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_bss), testcasename(), g_pcu, g_sgsn, 13);
1349 vc_conn.done;
1350
1351 f_cleanup();
1352}
1353
1354/* PS-PAGING on SIG-BVC for Location Area */
1355private function f_TC_paging_ps_sig_lac(charstring id) runs on BSSGP_ConnHdlr
1356{
1357 /* Both PCU index 0 and 1 have a BVC within the LAC */
1358 f_send_paging_ps_exp_multi(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, {0, 1});
1359}
1360testcase TC_paging_ps_sig_lac() runs on test_CT {
1361 var BSSGP_ConnHdlr vc_conn;
1362 f_init();
1363
1364 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_lac), testcasename(), g_pcu, g_sgsn, 14);
1365 vc_conn.done;
1366
1367 f_cleanup();
1368}
1369
Harald Welte7462a592020-11-23 22:07:07 +01001370/* PS-PAGING on SIG-BVC for unknown Location Area */
1371private function f_TC_paging_ps_sig_lac_unknown(charstring id) runs on BSSGP_ConnHdlr
1372{
1373 var GSM_Types.LocationAreaIdentification unknown_la := {
1374 mcc_mnc := '567F99'H,
1375 lac := 33333
1376 };
1377 f_send_paging_ps_exp_no_bss(ts_BssgpP4LAC(unknown_la), 0, true);
1378}
1379testcase TC_paging_ps_sig_lac_unknown() runs on test_CT {
1380 var BSSGP_ConnHdlr vc_conn;
1381 f_init();
1382
1383 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_lac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1384 vc_conn.done;
1385
1386 f_cleanup();
1387}
1388
Harald Welte0e188242020-11-22 21:46:48 +01001389/* PS-PAGING on SIG-BVC for Routeing Area */
1390private function f_TC_paging_ps_sig_rac(charstring id) runs on BSSGP_ConnHdlr
1391{
1392 /* Only PCU index 0 has a matching BVC within the LAC */
1393 f_send_paging_ps_exp_multi(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, {0});
1394}
1395testcase TC_paging_ps_sig_rac() runs on test_CT {
1396 var BSSGP_ConnHdlr vc_conn;
1397 f_init();
1398
1399 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_rac), testcasename(), g_pcu, g_sgsn, 15);
1400 vc_conn.done;
1401
1402 f_cleanup();
1403}
1404
Harald Welte7462a592020-11-23 22:07:07 +01001405/* PS-PAGING on SIG-BVC for unknown Routeing Area */
1406private function f_TC_paging_ps_sig_rac_unknown(charstring id) runs on BSSGP_ConnHdlr
1407{
1408 var RoutingAreaIdentification unknown_ra := {
1409 lai := {
1410 mcc_mnc := '567F99'H,
1411 lac := 33333
1412 },
1413 rac := 254
1414 };
1415 f_send_paging_ps_exp_no_bss(ts_BssgpP4RAC(unknown_ra), 0, true);
1416}
1417testcase TC_paging_ps_sig_rac_unknown() runs on test_CT {
1418 var BSSGP_ConnHdlr vc_conn;
1419 f_init();
1420
1421 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_rac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1422 vc_conn.done;
1423
1424 f_cleanup();
1425}
1426
Harald Welte0e188242020-11-22 21:46:48 +01001427/* PS-PAGING on SIG-BVC for BVCI (one cell) */
1428private function f_TC_paging_ps_sig_bvci(charstring id) runs on BSSGP_ConnHdlr
1429{
1430 f_send_paging_ps_exp_multi(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, {0});
1431}
1432testcase TC_paging_ps_sig_bvci() runs on test_CT {
1433 var BSSGP_ConnHdlr vc_conn;
1434 f_init();
1435
1436 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_bvci), testcasename(), g_pcu, g_sgsn, 16);
1437 vc_conn.done;
1438
1439 f_cleanup();
1440}
1441
Harald Welte7462a592020-11-23 22:07:07 +01001442/* PS-PAGING on SIG-BVC for unknown BVCI */
1443private function f_TC_paging_ps_sig_bvci_unknown(charstring id) runs on BSSGP_ConnHdlr
1444{
1445 f_send_paging_ps_exp_no_bss(ts_BssgpP4Bvci(33333), 0, true);
1446}
1447testcase TC_paging_ps_sig_bvci_unknown() runs on test_CT {
1448 var BSSGP_ConnHdlr vc_conn;
1449 f_init();
1450
1451 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_bvci_unknown), testcasename(), g_pcu, g_sgsn, 11);
1452 vc_conn.done;
1453
1454 f_cleanup();
1455}
1456
1457
Harald Welte0e188242020-11-22 21:46:48 +01001458
1459/***********************************************************************
1460 * PAGING CS procedure
1461 ***********************************************************************/
1462
1463private function f_send_paging_cs(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1464 boolean use_sig := false)
1465runs on BSSGP_ConnHdlr return template (present) PDU_BSSGP {
1466 var template (value) PDU_BSSGP pdu_tx;
1467 var template (present) PDU_BSSGP pdu_rx;
1468 /* we always specify '0' as BVCI in the templates below, as we override it with
1469 * 'p4' later anyway */
1470 pdu_rx := tr_BSSGP_CS_PAGING(0);
1471 pdu_rx.pDU_BSSGP_PAGING_CS.iMSI := tr_BSSGP_IMSI(g_pars.imsi);
1472 if (ispresent(g_pars.p_tmsi)) {
1473 pdu_tx := ts_BSSGP_CS_PAGING_PTMSI(0, g_pars.imsi, oct2int(g_pars.p_tmsi));
1474 pdu_rx.pDU_BSSGP_PAGING_CS.tMSI := tr_BSSGP_TMSI(oct2int(g_pars.p_tmsi));
1475 } else {
1476 pdu_tx := ts_BSSGP_CS_PAGING_IMSI(0, g_pars.imsi);
1477 pdu_rx.pDU_BSSGP_PAGING_CS.tMSI := omit;
1478 }
1479 pdu_tx.pDU_BSSGP_PAGING_CS.paging_Field4 := p4;
1480 pdu_rx.pDU_BSSGP_PAGING_CS.paging_Field4 := p4;
1481 if (use_sig == false) {
1482 SGSN[sgsn_idx].send(pdu_tx);
1483 } else {
1484 SGSN_SIG[sgsn_idx].send(pdu_tx);
1485 }
1486 return pdu_rx;
1487}
1488
1489/* send paging defined by 'p4' on given SGSN-side index (ptp or signaling) and expect one paging to arrive on
1490 * specified PCU index */
1491private function f_send_paging_cs_exp_one_bss(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1492 boolean use_sig := false,integer pcu_idx := 0)
1493runs on BSSGP_ConnHdlr {
1494 var template (present) PDU_BSSGP exp_rx;
1495 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1496 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1497 exp_rx := f_send_paging_cs(p4, sgsn_idx, use_sig);
1498 /* Expect paging to propagate to the one BSS addressed by the BVCI only */
1499 timer T := 2.0;
1500 T.start;
1501 alt {
1502 [not use_sig] PCU[pcu_idx].receive(exp_rx) {
1503 setverdict(pass);
1504 repeat;
1505 }
1506 [not use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {
1507 setverdict(fail, "Received paging on SIGNALING BVC, expected PTP BVC");
1508 }
1509 [use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {
1510 setverdict(pass);
1511 repeat;
1512 }
1513 [use_sig] PCU[pcu_idx].receive(exp_rx) {
1514 setverdict(fail, "Received paging on PTP BVC, expected SIGNALING BVC");
1515 }
1516 [] any from PCU.receive(exp_rx) {
1517 setverdict(fail, "Paging received on unexpected BVC");
1518 }
1519 [] any from PCU_SIG.receive(exp_rx) {
1520 setverdict(fail, "Paging received on unexpected BVC");
1521 }
1522 [] any from PCU.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_CS:=?}) {
1523 setverdict(fail, "Different Paging than expected received PTP BVC");
1524 }
1525 [] any from PCU_SIG.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_CS:=?}) {
1526 setverdict(fail, "Different Paging than expected on SIGNALING BVC");
1527 }
1528 [] T.timeout;
1529 }
1530}
1531
Harald Welte7462a592020-11-23 22:07:07 +01001532/* send a CS-PAGING but don't expect it to show up on any PTP or SIG BVC */
1533private function f_send_paging_cs_exp_no_bss(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1534 boolean use_sig := false)
1535runs on BSSGP_ConnHdlr {
1536 var template (present) PDU_BSSGP exp_rx;
1537 exp_rx := f_send_paging_cs(p4, sgsn_idx, use_sig);
1538 /* Expect paging to propagate to no BSS */
1539 timer T := 2.0;
1540 T.start;
1541 alt {
1542 [] any from PCU.receive(exp_rx) {
1543 setverdict(fail, "Paging received on unexpected BVC");
1544 }
1545 [] any from PCU_SIG.receive(exp_rx) {
1546 setverdict(fail, "Paging received on unexpected BVC");
1547 }
1548 [] any from PCU.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_CS:=?}) {
1549 setverdict(fail, "Different Paging received on PTP BVC");
1550 }
1551 [] any from PCU_SIG.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_CS:=?}) {
1552 setverdict(fail, "Different Paging received on SIGNALING BVC");
1553 }
1554 [] T.timeout {
1555 setverdict(pass);
1556 }
1557 }
1558}
1559
Harald Welte0e188242020-11-22 21:46:48 +01001560private function f_TC_paging_cs_ptp_bss(charstring id) runs on BSSGP_ConnHdlr
1561{
1562 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1563 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1564 f_send_paging_cs_exp_one_bss(ts_BssgpP4BssArea, 0, false, 0);
1565}
1566testcase TC_paging_cs_ptp_bss() runs on test_CT {
1567 var BSSGP_ConnHdlr vc_conn;
1568 f_init();
1569
1570 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_bss), testcasename(), g_pcu, g_sgsn, 17);
1571 vc_conn.done;
1572
1573 f_cleanup();
1574}
1575
1576/* CS-PAGING on PTP-BVC for Location Area */
1577private function f_TC_paging_cs_ptp_lac(charstring id) runs on BSSGP_ConnHdlr
1578{
1579 var template (present) PDU_BSSGP exp_rx;
1580 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1581 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1582 f_send_paging_cs_exp_one_bss(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, false, 0);
1583}
1584testcase TC_paging_cs_ptp_lac() runs on test_CT {
1585 var BSSGP_ConnHdlr vc_conn;
1586 f_init();
1587
1588 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_lac), testcasename(), g_pcu, g_sgsn, 18);
1589 vc_conn.done;
1590
1591 f_cleanup();
1592}
1593
Harald Welte7462a592020-11-23 22:07:07 +01001594/* CS-PAGING on PTP-BVC for unknown Location Area */
1595private function f_TC_paging_cs_ptp_lac_unknown(charstring id) runs on BSSGP_ConnHdlr
1596{
1597 var GSM_Types.LocationAreaIdentification unknown_la := {
1598 mcc_mnc := '567F99'H,
1599 lac := 33333
1600 };
1601 /* as it's sent on the PTP BVC, we expect it to pass even for unknown LAC */
1602 f_send_paging_cs_exp_one_bss(ts_BssgpP4LAC(unknown_la), 0, false, 0);
1603}
1604testcase TC_paging_cs_ptp_lac_unknown() runs on test_CT {
1605 var BSSGP_ConnHdlr vc_conn;
1606 f_init();
1607
1608 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_lac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1609 vc_conn.done;
1610
1611 f_cleanup();
1612}
1613
Harald Welte0e188242020-11-22 21:46:48 +01001614/* CS-PAGING on PTP-BVC for Routeing Area */
1615private function f_TC_paging_cs_ptp_rac(charstring id) runs on BSSGP_ConnHdlr
1616{
1617 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1618 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1619 f_send_paging_cs_exp_one_bss(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, false, 0);
1620}
1621testcase TC_paging_cs_ptp_rac() runs on test_CT {
1622 var BSSGP_ConnHdlr vc_conn;
1623 f_init();
1624
1625 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_rac), testcasename(), g_pcu, g_sgsn, 19);
1626 vc_conn.done;
1627
1628 f_cleanup();
1629}
1630
Harald Welte7462a592020-11-23 22:07:07 +01001631/* CS-PAGING on PTP-BVC for unknown Routeing Area */
1632private function f_TC_paging_cs_ptp_rac_unknown(charstring id) runs on BSSGP_ConnHdlr
1633{
1634 var RoutingAreaIdentification unknown_ra := {
1635 lai := {
1636 mcc_mnc := '567F99'H,
1637 lac := 33333
1638 },
1639 rac := 254
1640 };
1641 /* as it's sent on the PTP BVC, we expect it to pass even for unknown RAC */
1642 f_send_paging_cs_exp_one_bss(ts_BssgpP4RAC(unknown_ra), 0, false, 0);
1643}
1644testcase TC_paging_cs_ptp_rac_unknown() runs on test_CT {
1645 var BSSGP_ConnHdlr vc_conn;
1646 f_init();
1647
1648 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_rac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1649 vc_conn.done;
1650
1651 f_cleanup();
1652}
1653
Harald Welte0e188242020-11-22 21:46:48 +01001654/* CS-PAGING on PTP-BVC for BVCI (one cell) */
1655private function f_TC_paging_cs_ptp_bvci(charstring id) runs on BSSGP_ConnHdlr
1656{
1657 /* this should be the normal case for MS in READY MM state after a lower layer failure */
1658 f_send_paging_cs_exp_one_bss(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, false, 0);
1659}
1660testcase TC_paging_cs_ptp_bvci() runs on test_CT {
1661 var BSSGP_ConnHdlr vc_conn;
1662 f_init();
1663
1664 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_bvci), testcasename(), g_pcu, g_sgsn, 20);
1665 vc_conn.done;
1666
1667 f_cleanup();
1668}
1669
Harald Welte7462a592020-11-23 22:07:07 +01001670/* CS-PAGING on PTP-BVC for unknown BVCI */
1671private function f_TC_paging_cs_ptp_bvci_unknown(charstring id) runs on BSSGP_ConnHdlr
1672{
1673 /* as it's sent on the PTP BVC, we expect it to pass even for unknown BVCI */
1674 f_send_paging_cs_exp_one_bss(ts_BssgpP4Bvci(33333), 0, false, 0);
1675}
1676testcase TC_paging_cs_ptp_bvci_unknown() runs on test_CT {
1677 var BSSGP_ConnHdlr vc_conn;
1678 f_init();
1679
1680 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_bvci_unknown), testcasename(), g_pcu, g_sgsn, 11);
1681 vc_conn.done;
1682
1683 f_cleanup();
1684}
1685
Harald Welte0e188242020-11-22 21:46:48 +01001686/* send CS-PAGING on SIG BVC, expect it to arrive on given list of PCU indexes */
1687private function f_send_paging_cs_exp_multi(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1688 ro_integer exp_on_pcu_idx) runs on BSSGP_ConnHdlr
1689{
1690 var template (present) PDU_BSSGP exp_rx;
1691 exp_rx := f_send_paging_cs(p4, 0, true);
1692
1693 /* FIXME: make sure the relevant BVCs/BSS are connected to the ports! */
1694 var ro_default defaults := {};
1695 for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
1696 var default d := activate(as_paging_sig_pcu(i, exp_rx, g_roi));
1697 defaults := defaults & { d };
1698 }
1699 f_sleep(2.0);
1700 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
1701 deactivate(defaults[i]);
1702 }
1703 log("Paging received on PCU ", g_roi);
1704
1705 for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
1706 var boolean rx_on_i := ro_integer_contains(g_roi, i);
1707 var boolean exp_on_i := ro_integer_contains(exp_on_pcu_idx, i);
1708 if (exp_on_i and not rx_on_i) {
1709 setverdict(fail, "PS-PAGING not received on ", mp_nsconfig_pcu[i].nsei);
1710 }
1711 if (not exp_on_i and rx_on_i) {
1712 setverdict(fail, "PS-PAGING not expected but received on ", mp_nsconfig_pcu[i].nsei);
1713 }
1714 }
1715 setverdict(pass);
1716}
1717
1718/* CS-PAGING on SIG-BVC for BSS Area */
1719private function f_TC_paging_cs_sig_bss(charstring id) runs on BSSGP_ConnHdlr
1720{
1721 /* we expect the paging to arrive on all three NSE */
1722 f_send_paging_cs_exp_multi(ts_BssgpP4BssArea, 0, {0, 1, 2});
1723}
1724testcase TC_paging_cs_sig_bss() runs on test_CT {
1725 var BSSGP_ConnHdlr vc_conn;
1726 f_init();
1727
1728 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_bss), testcasename(), g_pcu, g_sgsn, 13);
1729 vc_conn.done;
1730
1731 f_cleanup();
1732}
1733
1734/* CS-PAGING on SIG-BVC for Location Area */
1735private function f_TC_paging_cs_sig_lac(charstring id) runs on BSSGP_ConnHdlr
1736{
1737 /* Both PCU index 0 and 1 have a BVC within the LAC */
1738 f_send_paging_cs_exp_multi(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, {0, 1});
1739}
1740testcase TC_paging_cs_sig_lac() runs on test_CT {
1741 var BSSGP_ConnHdlr vc_conn;
1742 f_init();
1743
1744 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_lac), testcasename(), g_pcu, g_sgsn, 14);
1745 vc_conn.done;
1746
1747 f_cleanup();
1748}
1749
Harald Welte7462a592020-11-23 22:07:07 +01001750/* CS-PAGING on SIG-BVC for unknown Location Area */
1751private function f_TC_paging_cs_sig_lac_unknown(charstring id) runs on BSSGP_ConnHdlr
1752{
1753 var GSM_Types.LocationAreaIdentification unknown_la := {
1754 mcc_mnc := '567F99'H,
1755 lac := 33333
1756 };
1757 f_send_paging_cs_exp_no_bss(ts_BssgpP4LAC(unknown_la), 0, true);
1758}
1759testcase TC_paging_cs_sig_lac_unknown() runs on test_CT {
1760 var BSSGP_ConnHdlr vc_conn;
1761 f_init();
1762
1763 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_lac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1764 vc_conn.done;
1765
1766 f_cleanup();
1767}
1768
Harald Welte0e188242020-11-22 21:46:48 +01001769/* CS-PAGING on SIG-BVC for Routeing Area */
1770private function f_TC_paging_cs_sig_rac(charstring id) runs on BSSGP_ConnHdlr
1771{
1772 /* Only PCU index 0 has a matching BVC within the LAC */
1773 f_send_paging_cs_exp_multi(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, {0});
1774}
1775testcase TC_paging_cs_sig_rac() runs on test_CT {
1776 var BSSGP_ConnHdlr vc_conn;
1777 f_init();
1778
1779 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_rac), testcasename(), g_pcu, g_sgsn, 15);
1780 vc_conn.done;
1781
1782 f_cleanup();
1783}
1784
Harald Welte7462a592020-11-23 22:07:07 +01001785/* CS-PAGING on SIG-BVC for unknown Routeing Area */
1786private function f_TC_paging_cs_sig_rac_unknown(charstring id) runs on BSSGP_ConnHdlr
1787{
1788 var RoutingAreaIdentification unknown_ra := {
1789 lai := {
1790 mcc_mnc := '567F99'H,
1791 lac := 33333
1792 },
1793 rac := 254
1794 };
1795 f_send_paging_cs_exp_no_bss(ts_BssgpP4RAC(unknown_ra), 0, true);
1796}
1797testcase TC_paging_cs_sig_rac_unknown() runs on test_CT {
1798 var BSSGP_ConnHdlr vc_conn;
1799 f_init();
1800
1801 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_rac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1802 vc_conn.done;
1803
1804 f_cleanup();
1805}
1806
Harald Welte0e188242020-11-22 21:46:48 +01001807/* CS-PAGING on SIG-BVC for BVCI (one cell) */
1808private function f_TC_paging_cs_sig_bvci(charstring id) runs on BSSGP_ConnHdlr
1809{
1810 f_send_paging_cs_exp_multi(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, {0});
1811}
1812testcase TC_paging_cs_sig_bvci() runs on test_CT {
1813 var BSSGP_ConnHdlr vc_conn;
1814 f_init();
1815
1816 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_bvci), testcasename(), g_pcu, g_sgsn, 16);
1817 vc_conn.done;
1818
1819 f_cleanup();
1820}
1821
Harald Welte7462a592020-11-23 22:07:07 +01001822/* CS-PAGING on SIG-BVC for unknown BVCI */
1823private function f_TC_paging_cs_sig_bvci_unknown(charstring id) runs on BSSGP_ConnHdlr
1824{
1825 f_send_paging_cs_exp_no_bss(ts_BssgpP4Bvci(33333), 0, true);
1826}
1827testcase TC_paging_cs_sig_bvci_unknown() runs on test_CT {
1828 var BSSGP_ConnHdlr vc_conn;
1829 f_init();
1830
1831 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_bvci_unknown), testcasename(), g_pcu, g_sgsn, 11);
1832 vc_conn.done;
1833
1834 f_cleanup();
1835}
1836
Daniel Willmann91a8e25b2020-11-24 14:50:59 +01001837private function f_TC_flush_ll(charstring id) runs on BSSGP_ConnHdlr {
1838 var BssgpBvci bvci := g_pars.pcu[0].cfg.bvc[0].bvci;
1839 var integer i;
1840 for (i := 0; i < 10; i := i+1) {
1841 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_FLUSH_LL(g_pars.tlli, bvci, bvci_new := bvci);
1842 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
1843 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_FLUSH_LL(g_pars.tlli, bvci, bvci_new := bvci);
1844
1845 f_sgsn2pcu(pdu_tx, pdu_rx, use_sig := true);
1846
1847 pdu_tx := ts_BSSGP_FLUSH_LL_ACK(g_pars.tlli, int2oct(0, 1), 23, bvci_new := bvci);
1848 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
1849 pdu_rx := tr_BSSGP_FLUSH_LL_ACK(g_pars.tlli, int2oct(0, 1), 23, bvci_new := bvci);
1850
1851 f_pcu2sgsn(pdu_tx, pdu_rx, use_sig := true);
1852 }
1853 setverdict(pass);
1854}
1855testcase TC_flush_ll() runs on test_CT
1856{
1857 var BSSGP_ConnHdlr vc_conn;
1858 f_init();
1859
1860 vc_conn := f_start_handler(refers(f_TC_flush_ll), testcasename(), g_pcu, g_sgsn, 6);
1861 vc_conn.done;
1862 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
1863
1864 f_cleanup();
1865}
Harald Welte6dc2ac42020-11-16 09:16:17 +01001866
Harald Weltef8e5c5d2020-11-27 22:37:23 +01001867private altstep as_bssgp_g_pcu_count(integer pcu_idx, template (present) PDU_BSSGP exp_rx, inout ro_integer roi)
1868runs on GlobalTest_CT {
1869[] G_PCU[pcu_idx].receive(exp_rx) from g_pcu[pcu_idx].vc_BSSGP {
1870 if (ro_integer_contains(roi, pcu_idx)) {
1871 setverdict(fail, "Received multiple on same SIG BVC");
1872 }
1873 roi := roi & { pcu_idx };
1874 repeat;
1875 }
1876}
1877/* send a INVOKE-TRACE from SGSN and expect to receive a copy on each NSE */
1878testcase TC_trace() runs on GlobalTest_CT
1879{
1880 var BSSGP_ConnHdlr vc_conn;
1881 f_init();
1882 f_global_init();
1883
1884 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_INVOKE_TRACE('23'O, '4321'O);
1885 var template (present) PDU_BSSGP exp_rx := ts_BSSGP_INVOKE_TRACE('23'O, '4321'O);
1886
1887 var ro_default defaults := {};
1888 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
1889 activate(as_bssgp_g_pcu_count(i, exp_rx, g_roi));
1890 }
1891 G_SGSN[0].send(pdu_tx);
1892 f_sleep(2.0);
1893 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
1894 deactivate(defaults[i]);
1895 }
1896
1897 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
1898 if (not ro_integer_contains(g_roi, i)) {
1899 setverdict(fail, "Failed to receive TRACE on PCU index ", i);
1900 }
1901 }
1902 setverdict(pass);
1903
1904 f_cleanup();
1905}
1906
Harald Weltec0351d12020-11-27 22:49:02 +01001907private function f_TC_llc_discarded(charstring id) runs on BSSGP_ConnHdlr {
1908 var BssgpBvci bvci := g_pars.pcu[0].cfg.bvc[0].bvci;
1909
1910 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_LLC_DISCARDED(g_pars.tlli, 23, bvci, 2342);
1911 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
1912 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_LLC_DISCARDED(g_pars.tlli, 23, bvci, 2342);
1913
1914 f_pcu2sgsn(pdu_tx, pdu_rx, use_sig := true);
1915
1916 setverdict(pass);
1917}
1918/* Send a LLC-DISCARDED from BSS side and expect it to show up on SGSN (SIG BVC) */
1919testcase TC_llc_discarded() runs on test_CT
1920{
1921 var BSSGP_ConnHdlr vc_conn;
1922 f_init();
1923
1924 vc_conn := f_start_handler(refers(f_TC_llc_discarded), testcasename(), g_pcu, g_sgsn, 6);
1925 vc_conn.done;
1926 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
1927
1928 f_cleanup();
1929}
1930
Harald Weltef20af412020-11-28 16:11:11 +01001931/* Send an OVERLOAD from SGSN side and expect it to show up on each PCU (SIG BVC) */
1932testcase TC_overload() runs on GlobalTest_CT
1933{
1934 f_init();
1935 f_global_init();
1936
1937 var template (value) PDU_BSSGP pdu_tx := ts_OVERLOAD('1'B);
1938 var template (present) PDU_BSSGP exp_rx := tr_OVERLOAD('1'B);
1939
1940 var ro_default defaults := {};
1941 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
1942 activate(as_bssgp_g_pcu_count(i, exp_rx, g_roi));
1943 }
1944 G_SGSN[0].send(pdu_tx);
1945 f_sleep(2.0);
1946 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
1947 deactivate(defaults[i]);
1948 }
1949
1950 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
1951 if (not ro_integer_contains(g_roi, i)) {
1952 setverdict(fail, "Failed to receive OVERLOAD on PCU index ", i);
1953 }
1954 }
1955 setverdict(pass);
1956
1957 f_cleanup();
1958}
1959
Harald Welte239aa502020-11-24 23:14:20 +01001960private function f_block_ptp_bvc_from_pcu(integer pcu_idx, integer bvc_idx) runs on test_CT
1961{
1962 var BSSGP_BVC_CT bvc_ct := g_pcu[pcu_idx].vc_BSSGP_BVC[bvc_idx];
1963 var BssgpBvcConfig bvc_cfg := g_pcu[pcu_idx].cfg.bvc[bvc_idx];
1964 var Nsei nsei_pcu := g_pcu[pcu_idx].cfg.nsei;
1965
1966 SGSN_MGMT.clear;
1967 PCU_MGMT.clear;
1968
1969 /* block the PTP BVC from the PCU side */
1970 PCU_MGMT.send(BssgpBlockRequest:{cause:=BSSGP_CAUSE_OM_INTERVENTION}) to bvc_ct;
1971 /* expect state on both PCU and SGSN side to change */
1972 interleave {
1973 [] PCU_MGMT.receive(tr_BssgpStsInd(nsei_pcu, bvc_cfg.bvci, BVC_S_BLOCKED)) from bvc_ct;
1974 [] SGSN_MGMT.receive(tr_BssgpStsInd(*, bvc_cfg.bvci, BVC_S_BLOCKED));
1975 }
1976 setverdict(pass);
1977}
1978testcase TC_bvc_block_ptp() runs on test_CT
1979{
1980 f_init();
1981 f_sleep(1.0);
1982 f_block_ptp_bvc_from_pcu(0, 0);
1983 f_cleanup();
1984}
1985
1986private function f_unblock_ptp_bvc_from_pcu(integer pcu_idx, integer bvc_idx) runs on test_CT
1987{
1988 var BSSGP_BVC_CT bvc_ct := g_pcu[pcu_idx].vc_BSSGP_BVC[bvc_idx];
1989 var BssgpBvcConfig bvc_cfg := g_pcu[pcu_idx].cfg.bvc[bvc_idx];
1990 var Nsei nsei_pcu := g_pcu[pcu_idx].cfg.nsei;
1991
1992 SGSN_MGMT.clear;
1993 PCU_MGMT.clear;
1994
1995 /* block the PTP BVC from the PCU side */
1996 PCU_MGMT.send(BssgpUnblockRequest:{}) to bvc_ct;
1997 /* expect state on both PCU and SGSN side to change */
1998 interleave {
1999 [] PCU_MGMT.receive(tr_BssgpStsInd(nsei_pcu, bvc_cfg.bvci, BVC_S_UNBLOCKED)) from bvc_ct;
2000 [] SGSN_MGMT.receive(tr_BssgpStsInd(*, bvc_cfg.bvci, BVC_S_UNBLOCKED));
2001 }
2002 setverdict(pass);
2003}
2004testcase TC_bvc_unblock_ptp() runs on test_CT
2005{
2006 f_init();
2007 f_sleep(1.0);
2008 f_block_ptp_bvc_from_pcu(0, 0);
2009 f_sleep(1.0);
2010 f_unblock_ptp_bvc_from_pcu(0, 0);
2011 f_cleanup();
2012}
2013
Harald Welte60a8ec72020-11-25 17:12:53 +01002014private altstep as_ignore_status(BSSGP_BVC_MGMT_PT pt) {
2015[] pt.receive(BssgpStatusIndication:?) { repeat; }
2016}
2017private function f_get_sgsn_bvc_ct(integer sgsn_idx, BssgpBvci bvci) runs on test_CT return BSSGP_BVC_CT {
2018 for (var integer i := 0; i < lengthof(g_sgsn[sgsn_idx].cfg.bvc); i := i+1) {
2019 if (g_sgsn[sgsn_idx].cfg.bvc[i].bvci == bvci) {
2020 return g_sgsn[sgsn_idx].vc_BSSGP_BVC[i];
2021 }
2022 }
2023 return null;
2024}
2025private function f_reset_ptp_bvc_from_pcu(integer pcu_idx, integer bvc_idx) runs on test_CT
2026{
2027 var BSSGP_BVC_CT pcu_bvc_ct := g_pcu[pcu_idx].vc_BSSGP_BVC[bvc_idx];
2028 var BssgpBvcConfig bvc_cfg := g_pcu[pcu_idx].cfg.bvc[bvc_idx];
2029 var Nsei nsei_pcu := g_pcu[pcu_idx].cfg.nsei;
2030 var BSSGP_BVC_CT sgsn_bvc_ct := f_get_sgsn_bvc_ct(0, bvc_cfg.bvci);
2031 var default d;
2032
2033 SGSN_MGMT.clear;
2034 PCU_MGMT.clear;
2035
2036 /* block the PTP BVC from the PCU side */
2037 PCU_MGMT.send(BssgpResetRequest:{cause:=BSSGP_CAUSE_OM_INTERVENTION}) to pcu_bvc_ct;
2038 /* expect state on both PCU and SGSN side to change */
2039 d := activate(as_ignore_status(SGSN_MGMT));
2040 interleave {
2041 [] PCU_MGMT.receive(tr_BssgpStsInd(nsei_pcu, bvc_cfg.bvci, BVC_S_BLOCKED)) from pcu_bvc_ct;
2042 [] SGSN_MGMT.receive(BssgpResetIndication:{bvc_cfg.bvci}) from sgsn_bvc_ct;
2043 }
2044 deactivate(d);
2045 setverdict(pass);
2046}
2047/* Send a BVC-RESET for a PTP BVC from the BSS side: expect it to propagate */
2048testcase TC_bvc_reset_ptp_from_bss() runs on test_CT
2049{
2050 f_init();
2051 f_sleep(3.0);
2052 f_reset_ptp_bvc_from_pcu(0, 0);
2053 f_cleanup();
2054}
2055
Harald Welte16786e92020-11-27 19:11:56 +01002056private altstep as_count_bvc_block(integer sgsn_idx, BssgpBvci bvci, inout ro_integer roi)
2057runs on test_CT {
2058 var BSSGP_BVC_CT sgsn_bvc_ct := f_get_sgsn_bvc_ct(sgsn_idx, bvci);
2059 [] SGSN_MGMT.receive(tr_BssgpStsInd(?, bvci, BVC_S_BLOCKED)) from sgsn_bvc_ct {
2060 roi := roi & { bvci };
2061 }
2062}
2063/* reset the signaling BVC from one BSS; expect no signaling BVC reset on SGSN; but BVC-BLOCK for PTP */
2064testcase TC_bvc_reset_sig_from_bss() runs on test_CT {
2065
2066 f_init();
2067 f_sleep(3.0);
2068
2069 /* Start BVC-RESET procedure for BVCI=0 */
2070 PCU_MGMT.send(BssgpResetRequest:{cause:=BSSGP_CAUSE_OM_INTERVENTION}) to g_pcu[0].vc_BSSGP;
2071
2072 /* Activate altsteps: One for each PTP BVC within that PCUs NSE */
2073 var ro_default defaults := {};
2074 for (var integer i := 0; i < lengthof(g_pcu[0].cfg.bvc); i := i+1) {
2075 var BssgpBvcConfig bvcc := g_pcu[0].cfg.bvc[i];
2076 var default d := activate(as_count_bvc_block(0, bvcc.bvci, g_roi));
2077 defaults := defaults & { d };
2078 }
2079
2080 timer T := 3.0;
2081 T.start;
2082 alt {
2083 [] SGSN_MGMT.receive(BssgpResetIndication:{0}) {
2084 setverdict(fail, "BSS-side Reset of BVCI=0 should not propagate");
2085 }
2086 [] T.timeout;
2087 }
2088
2089 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
2090 deactivate(defaults[i]);
2091 }
2092
2093 /* check if BVC-block was received on all expected BVC */
2094 for (var integer i := 0; i < lengthof(g_pcu[0].cfg.bvc); i := i+1) {
2095 var BssgpBvcConfig bvcc := g_pcu[0].cfg.bvc[i];
2096 if (not ro_integer_contains(g_roi, bvcc.bvci)) {
2097 setverdict(fail, "Missing SGSN-side BVC-BLOCK of BVCI=", bvcc.bvci);
2098 }
2099 }
2100
2101 /* check if BVC-block was not received on any unexpected BVC is not required as
2102 * such a message would basically run into 'no matching clause' */
Daniel Willmannf2590212020-12-04 14:20:50 +01002103 setverdict(pass);
Harald Welte16786e92020-11-27 19:11:56 +01002104 f_cleanup();
2105}
2106
Harald Welte60a8ec72020-11-25 17:12:53 +01002107private function f_reset_ptp_bvc_from_sgsn(integer pcu_idx, integer bvc_idx) runs on test_CT
2108{
2109 var BSSGP_BVC_CT pcu_bvc_ct := g_pcu[pcu_idx].vc_BSSGP_BVC[bvc_idx];
2110 var BssgpBvcConfig bvc_cfg := g_pcu[pcu_idx].cfg.bvc[bvc_idx];
2111 var Nsei nsei_pcu := g_pcu[pcu_idx].cfg.nsei;
2112 var BSSGP_BVC_CT sgsn_bvc_ct := f_get_sgsn_bvc_ct(0, bvc_cfg.bvci);
2113 var default d;
2114
2115 SGSN_MGMT.clear;
2116 PCU_MGMT.clear;
2117
2118 /* block the PTP BVC from the PCU side */
2119 SGSN_MGMT.send(BssgpResetRequest:{cause:=BSSGP_CAUSE_OM_INTERVENTION}) to sgsn_bvc_ct;
2120 /* expect state on both PCU and SGSN side to change */
2121 d := activate(as_ignore_status(PCU_MGMT));
2122 interleave {
2123 [] SGSN_MGMT.receive(tr_BssgpStsInd(?, bvc_cfg.bvci, BVC_S_BLOCKED)) from sgsn_bvc_ct;
2124 [] PCU_MGMT.receive(BssgpResetIndication:{bvc_cfg.bvci}) from pcu_bvc_ct;
2125 }
2126 deactivate(d);
2127 setverdict(pass);
2128}
2129/* Send a BVC-RESET for a PTP BVC from the SGSN side: expect it to propagate */
2130testcase TC_bvc_reset_ptp_from_sgsn() runs on test_CT
2131{
2132 f_init();
2133 f_sleep(3.0);
2134 f_reset_ptp_bvc_from_sgsn(0, 0);
2135 f_cleanup();
2136}
2137
Harald Welte16786e92020-11-27 19:11:56 +01002138private altstep as_count_bvc0_block(integer pcu_idx, Nsei nsei, inout ro_integer roi)
2139runs on test_CT {
2140 var BSSGP_CT pcu_ct := g_pcu[pcu_idx].vc_BSSGP;
2141 [] PCU_MGMT.receive(BssgpResetIndication:{0}) from pcu_ct {
2142 roi := roi & { nsei };
2143 }
2144}
2145/* reset the signaling BVC from the SGSN; expect all signaling BVC on all BSS to be reset */
2146testcase TC_bvc_reset_sig_from_sgsn() runs on test_CT {
2147
2148 f_init();
2149 f_sleep(3.0);
2150
2151 /* Start BVC-RESET procedure for BVCI=0 */
2152 SGSN_MGMT.send(BssgpResetRequest:{cause:=BSSGP_CAUSE_OM_INTERVENTION}) to g_sgsn[0].vc_BSSGP;
2153
2154 /* Activate altsteps: One for each PCU NSE */
2155 var ro_default defaults := {};
2156 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
2157 var NSConfiguration nscfg := mp_nsconfig_pcu[i];
2158 var default d := activate(as_count_bvc0_block(i, nscfg.nsei, g_roi));
2159 defaults := defaults & { d };
2160 }
2161
2162 f_sleep(3.0);
2163
2164 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
2165 deactivate(defaults[i]);
2166 }
2167
2168 /* check if BVC-block was received on all expected BVC */
2169 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
2170 var NSConfiguration nscfg := mp_nsconfig_pcu[i];
2171 if (not ro_integer_contains(g_roi, nscfg.nsei)) {
2172 setverdict(fail, "Missing PCU-side BVC-RESET of BVCI=0 on PCU index ", i);
2173 }
2174 }
2175
2176 /* check if BVC-block was not received on any unexpected BVC is not required as
2177 * such a message would basically run into 'no matching clause' */
2178
2179 f_cleanup();
2180}
2181
Daniel Willmann423d8f42020-09-08 18:58:22 +02002182control {
2183 execute( TC_BVC_bringup() );
Harald Welte92686012020-11-15 21:45:49 +01002184 execute( TC_ul_unitdata() );
Harald Welte78d8db92020-11-15 23:27:27 +01002185 execute( TC_dl_unitdata() );
Harald Welte6dc2ac42020-11-16 09:16:17 +01002186 execute( TC_ra_capability() );
Daniel Willmannace3ece2020-11-16 19:53:26 +01002187 execute( TC_ra_capability_upd() );
Daniel Willmann165d6612020-11-19 14:27:29 +01002188 execute( TC_radio_status() );
Daniel Willmannfa67f492020-11-19 15:48:05 +01002189 execute( TC_suspend() );
Daniel Willmann087a33d2020-11-19 15:58:43 +01002190 execute( TC_resume() );
Harald Weltef8e5c5d2020-11-27 22:37:23 +01002191 execute( TC_trace() );
Harald Weltec0351d12020-11-27 22:49:02 +01002192 execute( TC_llc_discarded() );
Harald Weltef20af412020-11-28 16:11:11 +01002193 execute( TC_overload() );
Harald Welte239aa502020-11-24 23:14:20 +01002194 execute( TC_bvc_block_ptp() );
2195 execute( TC_bvc_unblock_ptp() );
Harald Welte60a8ec72020-11-25 17:12:53 +01002196 execute( TC_bvc_reset_ptp_from_bss() );
Harald Welte16786e92020-11-27 19:11:56 +01002197 execute( TC_bvc_reset_sig_from_bss() );
Harald Welte60a8ec72020-11-25 17:12:53 +01002198 execute( TC_bvc_reset_ptp_from_sgsn() );
Harald Welte16786e92020-11-27 19:11:56 +01002199 execute( TC_bvc_reset_sig_from_sgsn() );
Harald Weltef8ef0282020-11-18 12:16:59 +01002200 if (false) {
2201 /* don't enable this by default, as we don't yet have any automatic test setup for FR with 4 NS-VC */
2202 execute( TC_load_sharing_dl() );
2203 }
Harald Welte0e188242020-11-22 21:46:48 +01002204
2205 /* PAGING-PS over PTP BVC */
2206 execute( TC_paging_ps_ptp_bss() );
2207 execute( TC_paging_ps_ptp_lac() );
Harald Welte7462a592020-11-23 22:07:07 +01002208 execute( TC_paging_ps_ptp_lac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002209 execute( TC_paging_ps_ptp_rac() );
Harald Welte7462a592020-11-23 22:07:07 +01002210 execute( TC_paging_ps_ptp_rac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002211 execute( TC_paging_ps_ptp_bvci() );
Harald Welte7462a592020-11-23 22:07:07 +01002212 execute( TC_paging_ps_ptp_bvci_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002213
2214 /* PAGING-PS over SIG BVC */
2215 execute( TC_paging_ps_sig_bss() );
2216 execute( TC_paging_ps_sig_lac() );
Harald Welte7462a592020-11-23 22:07:07 +01002217 execute( TC_paging_ps_sig_lac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002218 execute( TC_paging_ps_sig_rac() );
Harald Welte7462a592020-11-23 22:07:07 +01002219 execute( TC_paging_ps_sig_rac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002220 execute( TC_paging_ps_sig_bvci() );
Harald Welte7462a592020-11-23 22:07:07 +01002221 execute( TC_paging_ps_sig_bvci_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002222
2223 /* PAGING-CS over PTP BVC */
2224 execute( TC_paging_cs_ptp_bss() );
2225 execute( TC_paging_cs_ptp_lac() );
Harald Welte7462a592020-11-23 22:07:07 +01002226 execute( TC_paging_cs_ptp_lac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002227 execute( TC_paging_cs_ptp_rac() );
Harald Welte7462a592020-11-23 22:07:07 +01002228 execute( TC_paging_cs_ptp_rac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002229 execute( TC_paging_cs_ptp_bvci() );
Harald Welte7462a592020-11-23 22:07:07 +01002230 execute( TC_paging_cs_ptp_bvci_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002231
2232 /* PAGING-CS over SIG BVC */
2233 execute( TC_paging_cs_sig_bss() );
2234 execute( TC_paging_cs_sig_lac() );
Harald Welte7462a592020-11-23 22:07:07 +01002235 execute( TC_paging_cs_sig_lac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002236 execute( TC_paging_cs_sig_rac() );
Harald Welte7462a592020-11-23 22:07:07 +01002237 execute( TC_paging_cs_sig_rac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002238 execute( TC_paging_cs_sig_bvci() );
Harald Welte7462a592020-11-23 22:07:07 +01002239 execute( TC_paging_cs_sig_bvci_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002240
2241
Daniel Willmann91a8e25b2020-11-24 14:50:59 +01002242 execute( TC_flush_ll() );
Daniel Willmann423d8f42020-09-08 18:58:22 +02002243}
2244
2245
2246}