blob: 00f6e2efddf97b94a739f1651c1b9e51d8b26017 [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;
Harald Welteb9f0fdc2020-12-09 14:44:50 +010017import from Misc_Helpers all;
Daniel Willmann423d8f42020-09-08 18:58:22 +020018import from GSM_Types all;
19import from Native_Functions all;
20import from NS_Types all;
21import from NS_Emulation all;
22import from BSSGP_Types all;
23import from BSSGP_Emulation all;
24import from SCCPasp_Types all;
25import from Osmocom_Gb_Types all;
26
27import from MobileL3_CommonIE_Types all;
28import from MobileL3_GMM_SM_Types all;
29import from MobileL3_Types all;
30import from L3_Templates all;
31import from L3_Common all;
32
33import from TELNETasp_PortType all;
34import from Osmocom_VTY_Functions all;
35
36import from LLC_Types all;
37import from LLC_Templates all;
38
39import from GSM_RR_Types all;
40
Harald Welte6d63f742020-11-15 19:44:04 +010041/* mcc_mnc is 24.008 10.5.5.15 encoded. 262 42 */
42const BcdMccMnc c_mcc_mnc := '262F42'H;
43
Harald Welte0d5fceb2020-11-29 16:04:07 +010044/* 48.016 section 6.1.4.2: The default maximum information field size of 1600 octets shall be supported on the Gb interface */
45const integer max_fr_info_size := 1600;
46
Daniel Willmann423d8f42020-09-08 18:58:22 +020047modulepar {
Harald Weltef6e59b02020-12-08 08:29:09 +010048 boolean mp_enable_bss_load_sharing := false;
Daniel Willmann2c9300f2020-12-01 10:54:08 +010049 /* SGSN NS configuration */
Harald Welte6d63f742020-11-15 19:44:04 +010050 NSConfigurations mp_nsconfig_sgsn := {
Daniel Willmann423d8f42020-09-08 18:58:22 +020051 {
Daniel Willmann423d8f42020-09-08 18:58:22 +020052 nsei := 101,
53 role_sgsn := true,
Harald Welte90f19742020-11-06 19:34:40 +010054 handle_sns := false,
55 nsvc := {
56 {
57 provider := {
58 ip := {
59 address_family := AF_INET,
60 local_udp_port := 7777,
61 local_ip := "127.0.0.1",
62 remote_udp_port := 23000,
63 remote_ip := "127.0.0.1"
64 }
65 },
66 nsvci := 101
67 }
68 }
Daniel Willmann423d8f42020-09-08 18:58:22 +020069 }
70 };
Daniel Willmann2c9300f2020-12-01 10:54:08 +010071 /* BSS NSEI start at 2000 + x
72 * NSVCI start from value of NSEI + 100
73 * UDP port is NSVCI * 10 */
Harald Welte6d63f742020-11-15 19:44:04 +010074 NSConfigurations mp_nsconfig_pcu := {
Daniel Willmann423d8f42020-09-08 18:58:22 +020075 {
Daniel Willmann2c9300f2020-12-01 10:54:08 +010076 nsei := 2001,
Daniel Willmann423d8f42020-09-08 18:58:22 +020077 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +010078 handle_sns := false,
79 nsvc := {
80 {
81 provider := {
82 ip := {
83 address_family := AF_INET,
84 local_udp_port := 21010,
85 local_ip := "127.0.0.1",
86 remote_udp_port := 23000,
87 remote_ip := "127.0.0.1"
88 }
89 },
Daniel Willmann2c9300f2020-12-01 10:54:08 +010090 nsvci := 2101
Harald Welte90f19742020-11-06 19:34:40 +010091 }
92 }
Daniel Willmann423d8f42020-09-08 18:58:22 +020093 },
94 {
Daniel Willmann2c9300f2020-12-01 10:54:08 +010095 nsei := 2002,
Daniel Willmann423d8f42020-09-08 18:58:22 +020096 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +010097 handle_sns := false,
98 nsvc := {
99 {
100 provider := {
101 ip := {
102 address_family := AF_INET,
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100103 local_udp_port := 21020,
Harald Welte90f19742020-11-06 19:34:40 +0100104 local_ip := "127.0.0.1",
105 remote_udp_port := 23000,
106 remote_ip := "127.0.0.1"
107 }
108 },
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100109 nsvci := 2102
Harald Welte90f19742020-11-06 19:34:40 +0100110 }
111 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200112 },
113 {
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100114 nsei := 2003,
Daniel Willmann423d8f42020-09-08 18:58:22 +0200115 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +0100116 handle_sns := false,
117 nsvc := {
118 {
119 provider := {
120 ip := {
121 address_family := AF_INET,
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100122 local_udp_port := 21030,
Harald Welte90f19742020-11-06 19:34:40 +0100123 local_ip := "127.0.0.1",
124 remote_udp_port := 23000,
125 remote_ip := "127.0.0.1"
126 }
127 },
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100128 nsvci := 2103
Harald Welte90f19742020-11-06 19:34:40 +0100129 }
130 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200131 }
132 };
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100133 /* BVCI are NSEI*10 + x
134 * The first NSE only has one BVC, the second one 2 and so on
135 * The Cell ID is BVCI + 10000
136 * LAC/RAC are configured in such a way that:
137 * LAC 13135 is present once in NSE(2001), twice in NSE(2002) and once in NSE(2003)
138 * LAC 13300 is present twice in NSE(2003)
139 * RAI 13135-1 is present in NSE(2002) and NSE(2003)
140 * RAI 13300-0 is present twice in NSE(2003)
141 */
Harald Welte6d63f742020-11-15 19:44:04 +0100142 BssgpConfigs mp_gbconfigs := {
143 {
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100144 nsei := 2001,
Harald Welte6d63f742020-11-15 19:44:04 +0100145 sgsn_role := false,
146 bvc := {
147 {
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100148 bvci := 20011,
Harald Welte6d63f742020-11-15 19:44:04 +0100149 cell_id := {
150 ra_id := {
151 lai := {
152 mcc_mnc := c_mcc_mnc,
153 lac := 13135
154 },
155 rac := 0
156 },
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100157 cell_id := 30011
Harald Welte6d63f742020-11-15 19:44:04 +0100158 },
159 depth := BSSGP_DECODE_DEPTH_BSSGP,
160 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
161 }
162 }
163 }, {
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100164 nsei := 2002,
Harald Welte6d63f742020-11-15 19:44:04 +0100165 sgsn_role := false,
166 bvc := {
167 {
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100168 bvci := 20021,
Harald Welte6d63f742020-11-15 19:44:04 +0100169 cell_id := {
170 ra_id := {
171 lai := {
172 mcc_mnc := c_mcc_mnc,
Harald Welte0e188242020-11-22 21:46:48 +0100173 lac := 13135
Harald Welte6d63f742020-11-15 19:44:04 +0100174 },
Harald Welte0e188242020-11-22 21:46:48 +0100175 rac := 1
Harald Welte6d63f742020-11-15 19:44:04 +0100176 },
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100177 cell_id := 30021
178 },
179 depth := BSSGP_DECODE_DEPTH_BSSGP,
180 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
181 },
182 {
183 bvci := 20022,
184 cell_id := {
185 ra_id := {
186 lai := {
187 mcc_mnc := c_mcc_mnc,
188 lac := 13135
189 },
190 rac := 2
191 },
192 cell_id := 30022
Harald Welte6d63f742020-11-15 19:44:04 +0100193 },
194 depth := BSSGP_DECODE_DEPTH_BSSGP,
195 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
196 }
197 }
198 }, {
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100199 nsei := 2003,
Harald Welte6d63f742020-11-15 19:44:04 +0100200 sgsn_role := false,
201 bvc := {
202 {
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100203 bvci := 20031,
204 cell_id := {
205 ra_id := {
206 lai := {
207 mcc_mnc := c_mcc_mnc,
208 lac := 13135
209 },
210 rac := 1
211 },
212 cell_id := 30031
213 },
214 depth := BSSGP_DECODE_DEPTH_BSSGP,
215 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
216 },
217 {
218 bvci := 20032,
Harald Welte6d63f742020-11-15 19:44:04 +0100219 cell_id := {
220 ra_id := {
221 lai := {
222 mcc_mnc := c_mcc_mnc,
223 lac := 13300
224 },
225 rac := 0
226 },
Daniel Willmann2c9300f2020-12-01 10:54:08 +0100227 cell_id := 30032
228 },
229 depth := BSSGP_DECODE_DEPTH_BSSGP,
230 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
231 },
232 {
233 bvci := 20033,
234 cell_id := {
235 ra_id := {
236 lai := {
237 mcc_mnc := c_mcc_mnc,
238 lac := 13300
239 },
240 rac := 0
241 },
242 cell_id := 30033
Harald Welte6d63f742020-11-15 19:44:04 +0100243 },
244 depth := BSSGP_DECODE_DEPTH_BSSGP,
245 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
246 }
247 }
248 }
249 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200250};
251
Daniel Willmann423d8f42020-09-08 18:58:22 +0200252type record GbInstance {
253 NS_CT vc_NS,
254 BSSGP_CT vc_BSSGP,
Harald Welte67dc8c22020-11-17 18:32:29 +0100255 BSSGP_BVC_CTs vc_BSSGP_BVC,
Daniel Willmann423d8f42020-09-08 18:58:22 +0200256 BssgpConfig cfg
257};
Harald Welte67dc8c22020-11-17 18:32:29 +0100258type record of BSSGP_BVC_CT BSSGP_BVC_CTs
Daniel Willmann423d8f42020-09-08 18:58:22 +0200259
260const integer NUM_PCU := 3;
Harald Welte6d63f742020-11-15 19:44:04 +0100261type record of GbInstance GbInstances;
262type record of BssgpConfig BssgpConfigs;
263type record of NSConfiguration NSConfigurations;
264type record of BssgpCellId BssgpCellIds;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200265
266const integer NUM_SGSN := 1;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200267
268type component test_CT {
Harald Welte6d63f742020-11-15 19:44:04 +0100269 var GbInstances g_pcu;
270 var GbInstances g_sgsn;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200271
272 port BSSGP_CT_PROC_PT PROC;
273
Harald Weltefbae83f2020-11-15 23:25:55 +0100274 port BSSGP_BVC_MGMT_PT SGSN_MGMT;
275 port BSSGP_BVC_MGMT_PT PCU_MGMT;
276
Daniel Willmann423d8f42020-09-08 18:58:22 +0200277 port TELNETasp_PT GBPVTY;
278
279 var boolean g_initialized := false;
280 var boolean g_use_echo := false;
Harald Welte16786e92020-11-27 19:11:56 +0100281
282 var ro_integer g_roi := {};
Harald Welte425d3762020-12-09 14:33:18 +0100283 timer g_Tguard;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200284};
285
286type component BSSGP_ConnHdlr {
Harald Welte3dd21b32020-11-17 19:21:00 +0100287 /* array of per-BVC ports on the PCU side */
Harald Welte158becf2020-12-09 12:32:32 +0100288 port BSSGP_PT PCU_PTP[NUM_PCU];
Daniel Willmann423d8f42020-09-08 18:58:22 +0200289 port BSSGP_PT PCU_SIG[NUM_PCU];
290 port BSSGP_PROC_PT PCU_PROC[NUM_PCU];
Harald Welte3dd21b32020-11-17 19:21:00 +0100291 /* component reference to the component to which we're currently connected */
292 var BSSGP_BVC_CT pcu_ct[NUM_PCU];
Harald Welte0e188242020-11-22 21:46:48 +0100293 /* BSSGP BVC configuration of the component to which we're currently connected */
294 var BssgpBvcConfig pcu_bvc_cfg[NUM_PCU];
Harald Welte3dd21b32020-11-17 19:21:00 +0100295
296 /* array of per-BVC ports on the SGSN side */
Harald Welte158becf2020-12-09 12:32:32 +0100297 port BSSGP_PT SGSN_PTP[NUM_SGSN];
Daniel Willmann423d8f42020-09-08 18:58:22 +0200298 port BSSGP_PT SGSN_SIG[NUM_SGSN];
299 port BSSGP_PROC_PT SGSN_PROC[NUM_SGSN];
Harald Welte3dd21b32020-11-17 19:21:00 +0100300 /* component reference to the component to which we're currently connected */
301 var BSSGP_BVC_CT sgsn_ct[NUM_PCU];
Daniel Willmann423d8f42020-09-08 18:58:22 +0200302
303 var BSSGP_ConnHdlrPars g_pars;
304 timer g_Tguard;
305 var LLC_Entities llc;
Harald Welte0e188242020-11-22 21:46:48 +0100306
307 var ro_integer g_roi := {};
Daniel Willmann423d8f42020-09-08 18:58:22 +0200308}
309
310type record SGSN_ConnHdlrNetworkPars {
311 boolean expect_ptmsi,
312 boolean expect_auth,
313 boolean expect_ciph
314};
315
316type record BSSGP_ConnHdlrPars {
317 /* IMEI of the simulated ME */
318 hexstring imei,
319 /* IMSI of the simulated MS */
320 hexstring imsi,
321 /* MSISDN of the simulated MS (probably unused) */
322 hexstring msisdn,
323 /* P-TMSI allocated to the simulated MS */
324 OCT4 p_tmsi optional,
325 OCT3 p_tmsi_sig optional,
326 /* TLLI of the simulated MS */
327 OCT4 tlli,
328 OCT4 tlli_old optional,
329 RoutingAreaIdentificationV ra optional,
Harald Welte16357a92020-11-17 18:20:00 +0100330 GbInstances pcu,
Harald Welte3dd21b32020-11-17 19:21:00 +0100331 GbInstances sgsn,
Daniel Willmann423d8f42020-09-08 18:58:22 +0200332 float t_guard
333};
334
335private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {
336 /* mcc_mnc is encoded as of 24.008 10.5.5.15 */
337 var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;
338
339 var RoutingAreaIdentificationV ret := {
340 mccDigit1 := mcc_mnc[0],
341 mccDigit2 := mcc_mnc[1],
342 mccDigit3 := mcc_mnc[2],
343 mncDigit3 := mcc_mnc[3],
344 mncDigit1 := mcc_mnc[4],
345 mncDigit2 := mcc_mnc[5],
346 lac := int2oct(cell_id.ra_id.lai.lac, 16),
347 rac := int2oct(cell_id.ra_id.rac, 8)
348 }
349 return ret;
350};
351
Harald Welte95339432020-12-02 18:50:52 +0100352private function f_fix_create_cb(inout BssgpConfig cfg)
353{
354 for (var integer i := 0; i < lengthof(cfg.bvc); i := i + 1) {
355 if (not isbound(cfg.bvc[i].create_cb)) {
356 cfg.bvc[i].create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
357 }
358 }
359}
360
Daniel Willmann423d8f42020-09-08 18:58:22 +0200361private function f_init_gb_pcu(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
Harald Welteb419d0e2020-11-16 16:45:05 +0100362 var charstring ns_id := id & "-NS(PCU[" & int2str(offset) & "])";
363 var charstring bssgp_id := id & "-BSSGP(PCU[" & int2str(offset) & "])";
364 gb.vc_NS := NS_CT.create(ns_id);
365 gb.vc_BSSGP := BSSGP_CT.create(bssgp_id);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200366 /* connect lower end of BSSGP emulation with NS upper port */
367 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
368
Harald Welteb419d0e2020-11-16 16:45:05 +0100369 gb.vc_NS.start(NSStart(mp_nsconfig_pcu[offset], ns_id));
370 gb.vc_BSSGP.start(BssgpStart(gb.cfg, bssgp_id));
Daniel Willmann423d8f42020-09-08 18:58:22 +0200371
372 for (var integer i := 0; i < lengthof(gb.cfg.bvc); i := i + 1) {
373 connect(self:PROC, gb.vc_BSSGP:PROC);
374 gb.vc_BSSGP_BVC[i] := f_bssgp_get_bvci_ct(gb.cfg.bvc[i].bvci, PROC);
375 disconnect(self:PROC, gb.vc_BSSGP:PROC);
Harald Weltefbae83f2020-11-15 23:25:55 +0100376 connect(self:PCU_MGMT, gb.vc_BSSGP_BVC[i]:MGMT);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200377 }
Harald Welte16786e92020-11-27 19:11:56 +0100378 connect(self:PCU_MGMT, gb.vc_BSSGP:MGMT);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200379}
380
381private function f_init_gb_sgsn(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
Harald Welteb419d0e2020-11-16 16:45:05 +0100382 var charstring ns_id := id & "-NS(SGSN[" & int2str(offset) & "])";
383 var charstring bssgp_id := id & "-BSSGP(SGSN[" & int2str(offset) & "])";
384 gb.vc_NS := NS_CT.create(ns_id);
385 gb.vc_BSSGP := BSSGP_CT.create(bssgp_id);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200386 /* connect lower end of BSSGP emulation with NS upper port */
387 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
388
Harald Welteb419d0e2020-11-16 16:45:05 +0100389 gb.vc_NS.start(NSStart(mp_nsconfig_sgsn[offset], ns_id));
390 gb.vc_BSSGP.start(BssgpStart(gb.cfg, bssgp_id));
Daniel Willmann423d8f42020-09-08 18:58:22 +0200391
392 for (var integer i := 0; i < lengthof(gb.cfg.bvc); i := i + 1) {
393 connect(self:PROC, gb.vc_BSSGP:PROC);
394 gb.vc_BSSGP_BVC[i] := f_bssgp_get_bvci_ct(gb.cfg.bvc[i].bvci, PROC);
395 disconnect(self:PROC, gb.vc_BSSGP:PROC);
Harald Weltefbae83f2020-11-15 23:25:55 +0100396 connect(self:SGSN_MGMT, gb.vc_BSSGP_BVC[i]:MGMT);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200397 }
Harald Welte16786e92020-11-27 19:11:56 +0100398 connect(self:SGSN_MGMT, gb.vc_BSSGP:MGMT);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200399}
400
401
Harald Welteb9f0fdc2020-12-09 14:44:50 +0100402private function f_destroy_gb(inout GbInstance gb) runs on test_CT {
403 gb.vc_NS.stop;
404 gb.vc_BSSGP.stop;
405
406 for (var integer i := 0; i < lengthof(gb.cfg.bvc); i := i + 1) {
407 gb.vc_BSSGP_BVC[i].stop;
408 }
409}
410
Daniel Willmann423d8f42020-09-08 18:58:22 +0200411private function f_init_vty() runs on test_CT {
412 map(self:GBPVTY, system:GBPVTY);
413 f_vty_set_prompts(GBPVTY);
414 f_vty_transceive(GBPVTY, "enable");
415}
416
Harald Weltefbae83f2020-11-15 23:25:55 +0100417type record of integer ro_integer;
418
419private function ro_integer_contains(ro_integer r, integer x) return boolean {
420 for (var integer j := 0; j < lengthof(r); j := j+1) {
421 if (r[j] == x) {
422 return true;
423 }
424 }
425 return false;
426}
427
Harald Welte425d3762020-12-09 14:33:18 +0100428function f_init(float t_guard := 30.0) runs on test_CT {
Harald Weltefbae83f2020-11-15 23:25:55 +0100429 var ro_integer bvci_unblocked := {};
430 var BssgpStatusIndication bsi;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200431 var integer i;
432
433 if (g_initialized == true) {
434 return;
435 }
436 g_initialized := true;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200437
Harald Welte425d3762020-12-09 14:33:18 +0100438 g_Tguard.start(t_guard);
439 activate(as_gTguard(g_Tguard));
440
Daniel Willmann423d8f42020-09-08 18:58:22 +0200441 g_sgsn[0].cfg := {
Harald Welte6d63f742020-11-15 19:44:04 +0100442 nsei := mp_nsconfig_sgsn[0].nsei,
Daniel Willmann423d8f42020-09-08 18:58:22 +0200443 sgsn_role := true,
Harald Welte6d63f742020-11-15 19:44:04 +0100444 bvc := { }
445 }
446 for (i := 0; i < lengthof(mp_gbconfigs); i := i+1) {
447 g_pcu[i].cfg := mp_gbconfigs[i];
Harald Welte95339432020-12-02 18:50:52 +0100448 /* make sure all have a proper crate_cb, which cannot be specified in config file */
449 f_fix_create_cb(g_pcu[i].cfg);
Harald Welte6d63f742020-11-15 19:44:04 +0100450 /* concatenate all the PCU-side BVCs for the SGSN side */
Harald Welte95339432020-12-02 18:50:52 +0100451 g_sgsn[0].cfg.bvc := g_sgsn[0].cfg.bvc & g_pcu[i].cfg.bvc;
Harald Welte6d63f742020-11-15 19:44:04 +0100452 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200453
454 f_init_vty();
Harald Welte6d63f742020-11-15 19:44:04 +0100455 for (i := 0; i < lengthof(mp_nsconfig_sgsn); i := i+1) {
Daniel Willmann443fc572020-11-18 13:26:57 +0100456 f_vty_transceive(GBPVTY, "nsvc nsei " & int2str(g_sgsn[i].cfg.nsei) & " force-unconfigured");
Daniel Willmannad93c052020-12-04 14:14:38 +0100457 }
458 for (i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
459 f_vty_transceive(GBPVTY, "nsvc nsei " & int2str(g_pcu[i].cfg.nsei) & " force-unconfigured");
460 f_vty_transceive(GBPVTY, "delete-gbproxy-peer " & int2str(g_pcu[i].cfg.nsei) & " only-bvc");
461 }
462
463 for (i := 0; i < lengthof(mp_nsconfig_sgsn); i := i+1) {
Harald Welteea1ba592020-11-17 18:05:13 +0100464 f_init_gb_sgsn(g_sgsn[i], "GbProxy_Test", i);
Harald Welte6d63f742020-11-15 19:44:04 +0100465 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200466 f_sleep(4.0);
Harald Welte6d63f742020-11-15 19:44:04 +0100467 for (i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
Harald Welteb419d0e2020-11-16 16:45:05 +0100468 f_init_gb_pcu(g_pcu[i], "GbProxy_Test", i);
Harald Welte6d63f742020-11-15 19:44:04 +0100469 }
Harald Weltefbae83f2020-11-15 23:25:55 +0100470
471 /* wait until all BVC are unblocked on both sides */
Harald Welted2801272020-11-17 19:22:58 +0100472 timer T := 15.0;
Harald Weltefbae83f2020-11-15 23:25:55 +0100473 T.start;
474 alt {
475 [] SGSN_MGMT.receive(BssgpStatusIndication:{*, ?, BVC_S_UNBLOCKED}) -> value bsi {
476 bvci_unblocked := bvci_unblocked & { bsi.bvci };
477 if (lengthof(bvci_unblocked) != lengthof(g_sgsn[0].cfg.bvc)) {
478 repeat;
479 }
480 }
481 [] SGSN_MGMT.receive(BssgpStatusIndication:{*, ?, ?}) {
482 repeat;
483 }
Harald Welte3c905152020-11-26 20:56:09 +0100484 [] SGSN_MGMT.receive(BssgpResetIndication:?) {
485 repeat;
486 }
Harald Weltefbae83f2020-11-15 23:25:55 +0100487 [] SGSN_MGMT.receive {
488 setverdict(fail, "Received unexpected message on SGSN_MGMT");
489 mtc.stop;
490 }
491
492 [] PCU_MGMT.receive(BssgpStatusIndication:{*, ?, BVC_S_UNBLOCKED}) -> value bsi {
493 repeat;
494 }
495 [] PCU_MGMT.receive(BssgpStatusIndication:{*, ?, ?}) {
496 repeat;
497 }
498 [] PCU_MGMT.receive(BssgpResetIndication:{0}) {
499 repeat;
500 }
501 [] PCU_MGMT.receive {
502 setverdict(fail, "Received unexpected message on PCU_MGMT");
503 mtc.stop;
504 }
505
506 [] T.timeout {
Harald Welte6929e322020-12-12 13:10:45 +0100507 setverdict(fail, "Timeout waiting for unblock of all BVCs on SGSN side; ",
508 "unblocked so far: ", bvci_unblocked, "expected: ", g_sgsn[0].cfg.bvc);
509 /* don't stop here but print below analysis */
Harald Weltefbae83f2020-11-15 23:25:55 +0100510 }
511 }
512
513 /* iterate over list and check all BVCI */
514 for (i := 0; i < lengthof(g_sgsn[0].cfg.bvc); i := i+1) {
515 var BssgpBvci bvci := g_sgsn[0].cfg.bvc[i].bvci;
516 if (not ro_integer_contains(bvci_unblocked, bvci)) {
517 setverdict(fail, "BVCI=", bvci, " was not unblocked during start-up");
518 mtc.stop;
519 }
520 }
Harald Welte425d3762020-12-09 14:33:18 +0100521
522 /* re-start guard timer after all BVCs are up, so it only counts the actual test case */
523 g_Tguard.start(t_guard);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200524}
525
526function f_cleanup() runs on test_CT {
Harald Welteb9f0fdc2020-12-09 14:44:50 +0100527 var integer i;
528
529 for (i := 0; i < lengthof(mp_nsconfig_sgsn); i := i+1) {
530 f_destroy_gb(g_sgsn[i]);
531 }
532 for (i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
533 f_destroy_gb(g_pcu[i]);
534 }
535
536 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200537}
538
539type function void_fn(charstring id) runs on BSSGP_ConnHdlr;
540
541/* helper function to create, connect and start a BSSGP_ConnHdlr component */
Harald Welte6d63f742020-11-15 19:44:04 +0100542function f_start_handler(void_fn fn, charstring id, GbInstances pcu, GbInstances sgsn, integer imsi_suffix,
Daniel Willmann423d8f42020-09-08 18:58:22 +0200543 float t_guard := 30.0)
544runs on test_CT return BSSGP_ConnHdlr {
545 var BSSGP_ConnHdlr vc_conn;
546
547 var BSSGP_ConnHdlrPars pars := {
548 imei := f_gen_imei(imsi_suffix),
549 imsi := f_gen_imsi(imsi_suffix),
550 msisdn := f_gen_msisdn(imsi_suffix),
551 p_tmsi := omit,
552 p_tmsi_sig := omit,
553 tlli := f_gprs_tlli_random(),
554 tlli_old := omit,
555 ra := omit,
Harald Welte16357a92020-11-17 18:20:00 +0100556 pcu := g_pcu,
Harald Welte3dd21b32020-11-17 19:21:00 +0100557 sgsn := g_sgsn,
Daniel Willmann423d8f42020-09-08 18:58:22 +0200558 t_guard := t_guard
559 };
560
561 vc_conn := BSSGP_ConnHdlr.create(id);
Daniel Willmann423d8f42020-09-08 18:58:22 +0200562
563 vc_conn.start(f_handler_init(fn, id, pars));
564 return vc_conn;
565}
566
Harald Welte3dd21b32020-11-17 19:21:00 +0100567/* 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 +0100568private function f_connect_to_pcu_bvc(integer port_idx, integer nse_idx, integer bvc_idx)
569runs on BSSGP_ConnHdlr {
570 var BSSGP_BVC_CT bvc_ct := g_pars.pcu[nse_idx].vc_BSSGP_BVC[bvc_idx]
Harald Welte158becf2020-12-09 12:32:32 +0100571 if (PCU_PTP[port_idx].checkstate("Connected")) {
Harald Welte3dd21b32020-11-17 19:21:00 +0100572 /* unregister + disconnect from old BVC */
573 f_client_unregister(g_pars.imsi, PCU_PROC[port_idx]);
Harald Welte158becf2020-12-09 12:32:32 +0100574 disconnect(self:PCU_PTP[port_idx], pcu_ct[port_idx]:BSSGP_SP);
Harald Welte3dd21b32020-11-17 19:21:00 +0100575 disconnect(self:PCU_SIG[port_idx], pcu_ct[port_idx]:BSSGP_SP_SIG);
576 disconnect(self:PCU_PROC[port_idx], pcu_ct[port_idx]:BSSGP_PROC);
577 }
578 /* connect to new BVC and register us */
Harald Welte158becf2020-12-09 12:32:32 +0100579 connect(self:PCU_PTP[port_idx], bvc_ct:BSSGP_SP);
Harald Welte3dd21b32020-11-17 19:21:00 +0100580 connect(self:PCU_SIG[port_idx], bvc_ct:BSSGP_SP_SIG);
581 connect(self:PCU_PROC[port_idx], bvc_ct:BSSGP_PROC);
582 f_client_register(g_pars.imsi, g_pars.tlli, PCU_PROC[port_idx]);
583 pcu_ct[port_idx] := bvc_ct;
Harald Welte0e188242020-11-22 21:46:48 +0100584 pcu_bvc_cfg[port_idx] := g_pars.pcu[nse_idx].cfg.bvc[bvc_idx];
Harald Welte3dd21b32020-11-17 19:21:00 +0100585}
586
587/* Connect the SGSN-side per-BVC ports (SGSN/SGSN_SIG/SGSN_PROC) array slot 'port_idx' to specified per-BVC component */
588private function f_connect_to_sgsn_bvc(integer port_idx, BSSGP_BVC_CT bvc_ct) runs on BSSGP_ConnHdlr {
Harald Welte158becf2020-12-09 12:32:32 +0100589 if (SGSN_PTP[port_idx].checkstate("Connected")) {
Harald Welte3dd21b32020-11-17 19:21:00 +0100590 /* unregister + disconnect from old BVC */
591 f_client_unregister(g_pars.imsi, SGSN_PROC[port_idx]);
Harald Welte158becf2020-12-09 12:32:32 +0100592 disconnect(self:SGSN_PTP[port_idx], sgsn_ct[port_idx]:BSSGP_SP);
Harald Welte3dd21b32020-11-17 19:21:00 +0100593 disconnect(self:SGSN_SIG[port_idx], sgsn_ct[port_idx]:BSSGP_SP_SIG);
594 disconnect(self:SGSN_PROC[port_idx], sgsn_ct[port_idx]:BSSGP_PROC);
595 }
596 /* connect to new BVC and register us */
Harald Welte158becf2020-12-09 12:32:32 +0100597 connect(self:SGSN_PTP[port_idx], bvc_ct:BSSGP_SP);
Harald Welte3dd21b32020-11-17 19:21:00 +0100598 connect(self:SGSN_SIG[port_idx], bvc_ct:BSSGP_SP_SIG);
599 connect(self:SGSN_PROC[port_idx], bvc_ct:BSSGP_PROC);
600 f_client_register(g_pars.imsi, g_pars.tlli, SGSN_PROC[port_idx]);
601 sgsn_ct[port_idx] := bvc_ct;
602}
603
Harald Welte425d3762020-12-09 14:33:18 +0100604private altstep as_gTguard(timer Tguard) {
605 [] Tguard.timeout {
Daniel Willmann423d8f42020-09-08 18:58:22 +0200606 setverdict(fail, "Tguard timeout");
607 mtc.stop;
608 }
609}
610
611/* first function called in every ConnHdlr */
612private function f_handler_init(void_fn fn, charstring id, BSSGP_ConnHdlrPars pars)
613runs on BSSGP_ConnHdlr {
Harald Welte1e834f32020-11-15 20:02:59 +0100614 var integer i;
Daniel Willmann423d8f42020-09-08 18:58:22 +0200615 /* do some common stuff like setting up g_pars */
616 g_pars := pars;
617
618 llc := f_llc_create(false);
619
Harald Welte3dd21b32020-11-17 19:21:00 +0100620 /* default connections on PCU side: First BVC of each NSE/PCU */
621 for (i := 0; i < lengthof(g_pars.pcu); i := i+1) {
Harald Welte0e188242020-11-22 21:46:48 +0100622 f_connect_to_pcu_bvc(port_idx := i, nse_idx := i, bvc_idx := 0);
Harald Welte1e834f32020-11-15 20:02:59 +0100623 }
Harald Welte3dd21b32020-11-17 19:21:00 +0100624
625 /* default connections on SGSN side: First BVC of each NSE/SGSN */
626 for (i := 0; i < lengthof(g_pars.sgsn); i := i+1) {
627 f_connect_to_sgsn_bvc(i, g_pars.sgsn[i].vc_BSSGP_BVC[0]);
Harald Welte1e834f32020-11-15 20:02:59 +0100628 }
Daniel Willmann423d8f42020-09-08 18:58:22 +0200629
630 g_Tguard.start(pars.t_guard);
Harald Welte425d3762020-12-09 14:33:18 +0100631 activate(as_gTguard(g_Tguard));
Daniel Willmann423d8f42020-09-08 18:58:22 +0200632
633 /* call the user-supplied test case function */
634 fn.apply(id);
635}
636
Harald Welte1e834f32020-11-15 20:02:59 +0100637private function f_client_register(hexstring imsi, OCT4 tlli, BSSGP_PROC_PT PT)
638runs on BSSGP_ConnHdlr {
639 PT.call(BSSGP_register_client:{imsi, tlli}) {
640 [] PT.getreply(BSSGP_register_client:{imsi, tlli}) {};
641 }
642}
643
644private function f_client_unregister(hexstring imsi, BSSGP_PROC_PT PT)
645runs on BSSGP_ConnHdlr {
646 PT.call(BSSGP_unregister_client:{imsi}) {
647 [] PT.getreply(BSSGP_unregister_client:{imsi}) {};
648 }
649}
650
Harald Welte22ef5d92020-11-16 13:35:14 +0100651/* Send 'tx' on PTP-BVCI from PCU; expect 'rx' on SGSN */
652friend function f_pcu2sgsn(template (value) PDU_BSSGP tx, template (present) PDU_BSSGP exp_rx,
Daniel Willmann4798fd72020-11-24 16:23:29 +0100653 integer pcu_idx := 0, integer sgsn_idx := 0, boolean use_sig := false) runs on BSSGP_ConnHdlr {
Harald Welte22ef5d92020-11-16 13:35:14 +0100654 var PDU_BSSGP rx;
655 timer T := 1.0;
656
Daniel Willmann4798fd72020-11-24 16:23:29 +0100657 if (use_sig) {
658 PCU_SIG[pcu_idx].send(tx);
659 } else {
Harald Welte158becf2020-12-09 12:32:32 +0100660 PCU_PTP[pcu_idx].send(tx);
Daniel Willmann4798fd72020-11-24 16:23:29 +0100661 }
662
Harald Welte22ef5d92020-11-16 13:35:14 +0100663 T.start;
664 alt {
Daniel Willmann4798fd72020-11-24 16:23:29 +0100665 [use_sig] SGSN_SIG[sgsn_idx].receive(exp_rx) {
666 setverdict(pass);
667 }
Harald Welte158becf2020-12-09 12:32:32 +0100668 [not use_sig] SGSN_PTP[sgsn_idx].receive(exp_rx) {
Harald Welte22ef5d92020-11-16 13:35:14 +0100669 setverdict(pass);
670 }
Harald Welte158becf2020-12-09 12:32:32 +0100671 [] SGSN_PTP[sgsn_idx].receive(PDU_BSSGP:?) -> value rx {
Harald Welte22ef5d92020-11-16 13:35:14 +0100672 setverdict(fail, "Unexpected BSSGP on SGSN side: ", rx);
673 mtc.stop;
674 }
Daniel Willmann4798fd72020-11-24 16:23:29 +0100675 [] SGSN_SIG[sgsn_idx].receive(PDU_BSSGP:?) -> value rx {
676 setverdict(fail, "Unexpected SIG BSSGP on SGSN side: ", rx);
677 mtc.stop;
678 }
Harald Welte22ef5d92020-11-16 13:35:14 +0100679 [] T.timeout {
Harald Welte8b326412020-11-29 16:05:38 +0100680 setverdict(fail, "Timeout waiting for BSSGP on SGSN side: ", exp_rx);
Harald Welte22ef5d92020-11-16 13:35:14 +0100681 mtc.stop;
682 }
683 }
684}
685
686/* Send 'tx' on PTP-BVCI from SGSN; expect 'rx' on PCU */
687friend function f_sgsn2pcu(template (value) PDU_BSSGP tx, template (present) PDU_BSSGP exp_rx,
Daniel Willmann4798fd72020-11-24 16:23:29 +0100688 integer sgsn_idx:= 0, integer pcu_idx := 0, boolean use_sig := false) runs on BSSGP_ConnHdlr {
Harald Welte22ef5d92020-11-16 13:35:14 +0100689 var PDU_BSSGP rx;
690 timer T := 1.0;
691
Daniel Willmann4798fd72020-11-24 16:23:29 +0100692 if (use_sig) {
693 SGSN_SIG[sgsn_idx].send(tx);
694 } else {
Harald Welte158becf2020-12-09 12:32:32 +0100695 SGSN_PTP[sgsn_idx].send(tx);
Daniel Willmann4798fd72020-11-24 16:23:29 +0100696 }
697
Harald Welte22ef5d92020-11-16 13:35:14 +0100698 T.start;
699 alt {
Daniel Willmann4798fd72020-11-24 16:23:29 +0100700 [use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {
701 setverdict(pass);
702 }
Harald Welte158becf2020-12-09 12:32:32 +0100703 [not use_sig] PCU_PTP[pcu_idx].receive(exp_rx) {
Harald Welte22ef5d92020-11-16 13:35:14 +0100704 setverdict(pass);
705 }
Harald Welte158becf2020-12-09 12:32:32 +0100706 [] PCU_PTP[pcu_idx].receive(PDU_BSSGP:?) -> value rx {
Harald Welte22ef5d92020-11-16 13:35:14 +0100707 setverdict(fail, "Unexpected BSSGP on PCU side: ", rx);
708 mtc.stop;
709 }
Daniel Willmann4798fd72020-11-24 16:23:29 +0100710 [] PCU_SIG[pcu_idx].receive(PDU_BSSGP:?) -> value rx {
711 setverdict(fail, "Unexpected SIG BSSGP on PCU side: ", rx);
712 mtc.stop;
713 }
Harald Welte22ef5d92020-11-16 13:35:14 +0100714 [] T.timeout {
Harald Welte8b326412020-11-29 16:05:38 +0100715 setverdict(fail, "Timeout waiting for BSSGP on PCU side: ", exp_rx);
Harald Welte22ef5d92020-11-16 13:35:14 +0100716 mtc.stop;
717 }
718 }
719}
Harald Welte1e834f32020-11-15 20:02:59 +0100720
Harald Welte3807ed12020-11-24 19:05:22 +0100721/***********************************************************************
722 * GlobaLTest_CT: Using the per-NSE GLOBAL ports on PCU + SGSN side
723 ***********************************************************************/
724
725type component GlobalTest_CT extends test_CT {
726 port BSSGP_PT G_PCU[NUM_PCU];
727 port BSSGP_PT G_SGSN[NUM_SGSN];
728};
729
Harald Welte299aa482020-12-09 15:10:55 +0100730/* connect the signaling BVC of each NSE to the G_PCU / G_SGSN ports */
Harald Welte3807ed12020-11-24 19:05:22 +0100731private function f_global_init() runs on GlobalTest_CT {
732 var integer i;
733 for (i := 0; i < lengthof(g_sgsn); i := i+1) {
734 connect(self:G_SGSN[i], g_sgsn[i].vc_BSSGP:GLOBAL);
735 }
736 for (i := 0; i < lengthof(g_pcu); i := i+1) {
737 connect(self:G_PCU[i], g_pcu[i].vc_BSSGP:GLOBAL);
738 }
739}
740
Harald Welte299aa482020-12-09 15:10:55 +0100741/* connect the first PTP BVC of each NSE to the G_PCU / G_SGSN ports */
742private function f_global_init_ptp() runs on GlobalTest_CT {
743 var integer i;
744 for (i := 0; i < lengthof(g_sgsn); i := i+1) {
745 connect(self:G_SGSN[i], g_sgsn[i].vc_BSSGP_BVC[0]:GLOBAL);
746 }
747 for (i := 0; i < lengthof(g_pcu); i := i+1) {
748 connect(self:G_PCU[i], g_pcu[i].vc_BSSGP_BVC[0]:GLOBAL);
749 }
750}
751
Harald Welte3807ed12020-11-24 19:05:22 +0100752/* Send 'tx' on PTP-BVCI from PCU; expect 'rx' on SGSN */
753friend function f_global_pcu2sgsn(template (value) PDU_BSSGP tx, template (present) PDU_BSSGP exp_rx,
754 integer pcu_idx := 0, integer sgsn_idx := 0) runs on GlobalTest_CT {
755 var PDU_BSSGP rx;
756 timer T := 1.0;
757
758 G_PCU[pcu_idx].send(tx);
759 T.start;
760 alt {
761 [] G_SGSN[sgsn_idx].receive(exp_rx) {
762 setverdict(pass);
763 }
764 [] G_SGSN[sgsn_idx].receive(PDU_BSSGP:?) -> value rx {
765 setverdict(fail, "Unexpected BSSGP on SGSN side: ", rx);
766 mtc.stop;
767 }
768 [] T.timeout {
Harald Weltedc805c02020-12-11 10:59:17 +0100769 setverdict(fail, "Timeout waiting for BSSGP on SGSN side: ", exp_rx);
Harald Welte3807ed12020-11-24 19:05:22 +0100770 mtc.stop;
771 }
772 }
773}
774
775/* Send 'tx' on PTP-BVCI from SGSN; expect 'rx' on PCU */
776friend function f_global_sgsn2pcu(template (value) PDU_BSSGP tx, template (present) PDU_BSSGP exp_rx,
777 integer sgsn_idx := 0, integer pcu_idx := 0) runs on GlobalTest_CT {
778 var PDU_BSSGP rx;
779 timer T := 1.0;
780
781 G_SGSN[sgsn_idx].send(tx);
782 T.start;
783 alt {
784 [] G_PCU[pcu_idx].receive(exp_rx) {
785 setverdict(pass);
786 }
787 [] G_PCU[pcu_idx].receive(PDU_BSSGP:?) -> value rx {
788 setverdict(fail, "Unexpected BSSGP on PCU side: ", rx);
789 mtc.stop;
790 }
791 [] T.timeout {
Harald Weltedc805c02020-12-11 10:59:17 +0100792 setverdict(fail, "Timeout waiting for BSSGP on PCU side: ", exp_rx);
Harald Welte3807ed12020-11-24 19:05:22 +0100793 mtc.stop;
794 }
795 }
796}
797
798
Daniel Willmann423d8f42020-09-08 18:58:22 +0200799/* TODO:
800 * Detach without Attach
801 * SM procedures without attach / RAU
802 * ATTACH / RAU
803 ** with / without authentication
804 ** with / without P-TMSI allocation
805 * re-transmissions of LLC frames
806 * PDP Context activation
807 ** with different GGSN config in SGSN VTY
808 ** with different PDP context type (v4/v6/v46)
809 ** timeout from GGSN
810 ** multiple / secondary PDP context
811 */
812
813private function f_TC_BVC_bringup(charstring id) runs on BSSGP_ConnHdlr {
814 f_sleep(5.0);
815 setverdict(pass);
816}
817
818testcase TC_BVC_bringup() runs on test_CT {
819 var BSSGP_ConnHdlr vc_conn;
820 f_init();
821
822 vc_conn := f_start_handler(refers(f_TC_BVC_bringup), testcasename(), g_pcu, g_sgsn, 51);
823 vc_conn.done;
824
825 f_cleanup();
826}
827
828friend function f_bssgp_suspend(integer ran_idx := 0) runs on BSSGP_ConnHdlr return OCT1 {
Harald Welte16357a92020-11-17 18:20:00 +0100829 var BssgpBvcConfig bvcc := g_pars.pcu[ran_idx].cfg.bvc[0];
Daniel Willmann423d8f42020-09-08 18:58:22 +0200830 timer T := 5.0;
831 var PDU_BSSGP rx_pdu;
Harald Welte16357a92020-11-17 18:20:00 +0100832 PCU_SIG[ran_idx].send(ts_BSSGP_SUSPEND(g_pars.tlli, bvcc.cell_id.ra_id));
Daniel Willmann423d8f42020-09-08 18:58:22 +0200833 T.start;
834 alt {
Harald Welte16357a92020-11-17 18:20:00 +0100835 [] 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 +0200836 return rx_pdu.pDU_BSSGP_SUSPEND_ACK.suspend_Reference_Number.suspend_Reference_Number_value;
837 }
Harald Welte16357a92020-11-17 18:20:00 +0100838 [] 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 +0200839 setverdict(fail, "SUSPEND-NACK in response to SUSPEND for TLLI ", g_pars.tlli);
840 mtc.stop;
841 }
842 [] T.timeout {
843 setverdict(fail, "No SUSPEND-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
844 mtc.stop;
845 }
846 }
847 return '00'O;
848}
849
850friend function f_bssgp_resume(OCT1 susp_ref, integer ran_idx := 0) runs on BSSGP_ConnHdlr {
Harald Welte16357a92020-11-17 18:20:00 +0100851 var BssgpBvcConfig bvcc := g_pars.pcu[ran_idx].cfg.bvc[0];
Daniel Willmann423d8f42020-09-08 18:58:22 +0200852 timer T := 5.0;
Harald Welte16357a92020-11-17 18:20:00 +0100853 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 +0200854 T.start;
855 alt {
Harald Welte16357a92020-11-17 18:20:00 +0100856 [] PCU_SIG[ran_idx].receive(tr_BSSGP_RESUME_ACK(g_pars.tlli, bvcc.cell_id.ra_id));
857 [] PCU_SIG[ran_idx].receive(tr_BSSGP_RESUME_NACK(g_pars.tlli, bvcc.cell_id.ra_id, ?)) {
Daniel Willmann423d8f42020-09-08 18:58:22 +0200858 setverdict(fail, "RESUME-NACK in response to RESUME for TLLI ", g_pars.tlli);
859 mtc.stop;
860 }
861 [] T.timeout {
862 setverdict(fail, "No RESUME-ACK in response to SUSPEND for TLLI ", g_pars.tlli);
863 mtc.stop;
864 }
865 }
866}
867
868
Harald Welte92686012020-11-15 21:45:49 +0100869/* send uplink-unitdata of a variety of different sizes; expect it to show up on SGSN */
870private function f_TC_ul_unitdata(charstring id) runs on BSSGP_ConnHdlr {
Harald Welte16357a92020-11-17 18:20:00 +0100871 var integer ran_idx := 0;
872 var BssgpBvcConfig bvcc := g_pars.pcu[ran_idx].cfg.bvc[0];
Harald Welte92686012020-11-15 21:45:49 +0100873 var integer i;
874
Harald Welte0d5fceb2020-11-29 16:04:07 +0100875 for (i := 0; i < max_fr_info_size-4; i := i+4) {
Harald Welte92686012020-11-15 21:45:49 +0100876 var octetstring payload := f_rnd_octstring(i);
Harald Welte16357a92020-11-17 18:20:00 +0100877 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 +0100878 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte16357a92020-11-17 18:20:00 +0100879 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 +0100880
Harald Welte0d5fceb2020-11-29 16:04:07 +0100881 log("UL-UNITDATA(payload_size=", i);
Harald Welte22ef5d92020-11-16 13:35:14 +0100882 f_pcu2sgsn(pdu_tx, pdu_rx);
Harald Welte92686012020-11-15 21:45:49 +0100883 }
884 setverdict(pass);
885}
886
887testcase TC_ul_unitdata() runs on test_CT
888{
889 var BSSGP_ConnHdlr vc_conn;
890 f_init();
891
892 vc_conn := f_start_handler(refers(f_TC_ul_unitdata), testcasename(), g_pcu, g_sgsn, 1);
893 vc_conn.done;
894 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
895
896 f_cleanup();
897}
898
Harald Welte78d8db92020-11-15 23:27:27 +0100899/* send downlink-unitdata of a variety of different sizes; expect it to show up on PCU */
900private function f_TC_dl_unitdata(charstring id) runs on BSSGP_ConnHdlr {
901 var integer i;
902
Harald Welte0d5fceb2020-11-29 16:04:07 +0100903 for (i := 0; i < max_fr_info_size-4; i := i+4) {
Harald Welte78d8db92020-11-15 23:27:27 +0100904 var octetstring payload := f_rnd_octstring(i);
905 var template (value) PDU_BSSGP pdu_tx :=
906 ts_BSSGP_DL_UD(g_pars.tlli, payload, omit, ts_BSSGP_IMSI(g_pars.imsi));
907 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
908 var template (present) PDU_BSSGP pdu_rx :=
909 tr_BSSGP_DL_UD(g_pars.tlli, payload, tr_BSSGP_IMSI(g_pars.imsi));
910
Harald Welte0d5fceb2020-11-29 16:04:07 +0100911 log("DL-UNITDATA(payload_size=", i);
Harald Welte22ef5d92020-11-16 13:35:14 +0100912 f_sgsn2pcu(pdu_tx, pdu_rx);
Harald Welte78d8db92020-11-15 23:27:27 +0100913 }
914 setverdict(pass);
915}
916
917testcase TC_dl_unitdata() runs on test_CT
918{
919 var BSSGP_ConnHdlr vc_conn;
920 f_init();
921
922 vc_conn := f_start_handler(refers(f_TC_dl_unitdata), testcasename(), g_pcu, g_sgsn, 2);
923 vc_conn.done;
924 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
925
926 f_cleanup();
927}
Harald Welte92686012020-11-15 21:45:49 +0100928
Harald Welte6dc2ac42020-11-16 09:16:17 +0100929private function f_TC_ra_capability(charstring id) runs on BSSGP_ConnHdlr {
930 var integer i;
931
932 for (i := 0; i < 10; i := i+1) {
933 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_RA_CAP(g_pars.tlli, { ts_RaCapRec_BSSGP });
934 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
935 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_RA_CAP(g_pars.tlli, { tr_RaCapRec_BSSGP })
936
Harald Welte22ef5d92020-11-16 13:35:14 +0100937 f_sgsn2pcu(pdu_tx, pdu_rx);
Harald Welte6dc2ac42020-11-16 09:16:17 +0100938 }
939 setverdict(pass);
940}
941testcase TC_ra_capability() runs on test_CT
942{
943 var BSSGP_ConnHdlr vc_conn;
944 f_init();
945
946 vc_conn := f_start_handler(refers(f_TC_ra_capability), testcasename(), g_pcu, g_sgsn, 3);
947 vc_conn.done;
948 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
949
950 f_cleanup();
951}
952
Daniel Willmannace3ece2020-11-16 19:53:26 +0100953private function f_TC_ra_capability_upd(charstring id) runs on BSSGP_ConnHdlr {
954 var integer i;
955 var OCT1 tag;
956 for (i := 0; i < 10; i := i+1) {
957 tag := int2oct(23 + i, 1);
958 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_RA_CAP_UPD(g_pars.tlli, tag);
959 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
960 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_RA_CAP_UPD(g_pars.tlli, tag)
961
962 f_pcu2sgsn(pdu_tx, pdu_rx);
963
964 pdu_tx := ts_BSSGP_RA_CAP_UPD_ACK(g_pars.tlli, tag, '42'O);
965 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
966 pdu_rx := tr_BSSGP_RA_CAP_UPD_ACK(g_pars.tlli, tag, '42'O)
967
968 f_sgsn2pcu(pdu_tx, pdu_rx);
969 }
970 setverdict(pass);
971}
972testcase TC_ra_capability_upd() runs on test_CT
973{
974 var BSSGP_ConnHdlr vc_conn;
975 f_init();
976
Daniel Willmann54833f22020-11-19 15:43:52 +0100977 vc_conn := f_start_handler(refers(f_TC_ra_capability_upd), testcasename(), g_pcu, g_sgsn, 4);
Daniel Willmannace3ece2020-11-16 19:53:26 +0100978 vc_conn.done;
979 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
980
981 f_cleanup();
982}
983
Daniel Willmann165d6612020-11-19 14:27:29 +0100984private function f_TC_radio_status(charstring id) runs on BSSGP_ConnHdlr {
985 var integer i;
986 var BssgpRadioCause cause := BSSGP_RADIO_CAUSE_CONTACT_LOST;
987 for (i := 0; i < 10; i := i+1) {
988 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_RADIO_STATUS(g_pars.tlli, cause);
989 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
990 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_RADIO_STATUS(g_pars.tlli, cause)
991
992 f_pcu2sgsn(pdu_tx, pdu_rx);
993 }
994 setverdict(pass);
995}
996testcase TC_radio_status() runs on test_CT
997{
998 var BSSGP_ConnHdlr vc_conn;
999 f_init();
1000
Daniel Willmann54833f22020-11-19 15:43:52 +01001001 vc_conn := f_start_handler(refers(f_TC_radio_status), testcasename(), g_pcu, g_sgsn, 5);
Daniel Willmann165d6612020-11-19 14:27:29 +01001002 vc_conn.done;
1003 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
1004
1005 f_cleanup();
1006}
1007
Harald Welte3807ed12020-11-24 19:05:22 +01001008private function f_TC_suspend() runs on GlobalTest_CT {
Daniel Willmannfa67f492020-11-19 15:48:05 +01001009 var integer i;
Daniel Willmann165d6612020-11-19 14:27:29 +01001010
Daniel Willmannfa67f492020-11-19 15:48:05 +01001011 /* TODO: Generate RA ID for each ConnHdlr */
Harald Welte3807ed12020-11-24 19:05:22 +01001012 var RoutingAreaIdentification ra_id := g_pcu[0].cfg.bvc[0].cell_id.ra_id;
Daniel Willmannfa67f492020-11-19 15:48:05 +01001013 for (i := 0; i < 10; i := i+1) {
Harald Welte3807ed12020-11-24 19:05:22 +01001014 var OCT4 tlli := f_gprs_tlli_random();
1015 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_SUSPEND(tlli, ra_id);
Daniel Willmannfa67f492020-11-19 15:48:05 +01001016 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +01001017 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_SUSPEND(tlli, ra_id);
Daniel Willmannfa67f492020-11-19 15:48:05 +01001018
Harald Welte3807ed12020-11-24 19:05:22 +01001019 f_global_pcu2sgsn(pdu_tx, pdu_rx);
Daniel Willmannfa67f492020-11-19 15:48:05 +01001020
Harald Welte3807ed12020-11-24 19:05:22 +01001021 pdu_tx := ts_BSSGP_SUSPEND_ACK(tlli, ra_id, int2oct(i, 1));
Daniel Willmannfa67f492020-11-19 15:48:05 +01001022 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +01001023 pdu_rx := tr_BSSGP_SUSPEND_ACK(tlli, ra_id, int2oct(i, 1));
Daniel Willmannfa67f492020-11-19 15:48:05 +01001024
Harald Welte3807ed12020-11-24 19:05:22 +01001025 f_global_sgsn2pcu(pdu_tx, pdu_rx);
Daniel Willmannfa67f492020-11-19 15:48:05 +01001026
Daniel Willmann4c534bb2021-01-07 18:05:10 +01001027 pdu_tx := ts_BSSGP_SUSPEND(tlli, ra_id);
1028 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
1029 pdu_rx := tr_BSSGP_SUSPEND(tlli, ra_id);
1030
1031 f_global_pcu2sgsn(pdu_tx, pdu_rx);
1032
Daniel Willmannfa67f492020-11-19 15:48:05 +01001033 /* These messages are simple passed through so just also test sending NACK */
Harald Welte3807ed12020-11-24 19:05:22 +01001034 pdu_tx := ts_BSSGP_SUSPEND_NACK(tlli, ra_id, BSSGP_CAUSE_UNKNOWN_MS);
Daniel Willmannfa67f492020-11-19 15:48:05 +01001035 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +01001036 pdu_rx := tr_BSSGP_SUSPEND_NACK(tlli, ra_id, BSSGP_CAUSE_UNKNOWN_MS);
Daniel Willmannfa67f492020-11-19 15:48:05 +01001037
Harald Welte3807ed12020-11-24 19:05:22 +01001038 f_global_sgsn2pcu(pdu_tx, pdu_rx);
Daniel Willmannfa67f492020-11-19 15:48:05 +01001039 }
1040 setverdict(pass);
1041}
Harald Welte3807ed12020-11-24 19:05:22 +01001042testcase TC_suspend() runs on GlobalTest_CT
Daniel Willmannfa67f492020-11-19 15:48:05 +01001043{
Daniel Willmannfa67f492020-11-19 15:48:05 +01001044 f_init();
Harald Welte3807ed12020-11-24 19:05:22 +01001045 f_global_init();
1046 f_TC_suspend();
Daniel Willmannfa67f492020-11-19 15:48:05 +01001047 f_cleanup();
1048}
Harald Welte6dc2ac42020-11-16 09:16:17 +01001049
Harald Welte3807ed12020-11-24 19:05:22 +01001050private function f_TC_resume() runs on GlobalTest_CT {
Daniel Willmann087a33d2020-11-19 15:58:43 +01001051 var integer i;
1052
1053 /* TODO: Generate RA ID for each ConnHdlr */
Harald Welte3807ed12020-11-24 19:05:22 +01001054 var RoutingAreaIdentification ra_id := g_pcu[0].cfg.bvc[0].cell_id.ra_id;
Daniel Willmann087a33d2020-11-19 15:58:43 +01001055 for (i := 0; i < 10; i := i+1) {
Harald Welte3807ed12020-11-24 19:05:22 +01001056 var OCT4 tlli := f_gprs_tlli_random();
1057 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_RESUME(tlli, ra_id, int2oct(i, 1));
Daniel Willmann087a33d2020-11-19 15:58:43 +01001058 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +01001059 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_RESUME(tlli, ra_id, int2oct(i, 1));
Daniel Willmann087a33d2020-11-19 15:58:43 +01001060
Harald Welte3807ed12020-11-24 19:05:22 +01001061 f_global_pcu2sgsn(pdu_tx, pdu_rx);
Daniel Willmann087a33d2020-11-19 15:58:43 +01001062
Harald Welte3807ed12020-11-24 19:05:22 +01001063 pdu_tx := ts_BSSGP_RESUME_ACK(tlli, ra_id);
Daniel Willmann087a33d2020-11-19 15:58:43 +01001064 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +01001065 pdu_rx := tr_BSSGP_RESUME_ACK(tlli, ra_id);
Daniel Willmann087a33d2020-11-19 15:58:43 +01001066
Harald Welte3807ed12020-11-24 19:05:22 +01001067 f_global_sgsn2pcu(pdu_tx, pdu_rx);
Daniel Willmann087a33d2020-11-19 15:58:43 +01001068
Daniel Willmann4c534bb2021-01-07 18:05:10 +01001069 pdu_tx := ts_BSSGP_RESUME(tlli, ra_id, int2oct(i, 1));
1070 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
1071 pdu_rx := tr_BSSGP_RESUME(tlli, ra_id, int2oct(i, 1));
1072
1073 f_global_pcu2sgsn(pdu_tx, pdu_rx);
1074
Daniel Willmann087a33d2020-11-19 15:58:43 +01001075 /* These messages are simple passed through so just also test sending NACK */
Harald Welte3807ed12020-11-24 19:05:22 +01001076 pdu_tx := ts_BSSGP_RESUME_NACK(tlli, ra_id, BSSGP_CAUSE_UNKNOWN_MS);
Daniel Willmann087a33d2020-11-19 15:58:43 +01001077 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
Harald Welte3807ed12020-11-24 19:05:22 +01001078 pdu_rx := tr_BSSGP_RESUME_NACK(tlli, ra_id, BSSGP_CAUSE_UNKNOWN_MS);
Daniel Willmann087a33d2020-11-19 15:58:43 +01001079
Harald Welte3807ed12020-11-24 19:05:22 +01001080 f_global_sgsn2pcu(pdu_tx, pdu_rx);
Daniel Willmann087a33d2020-11-19 15:58:43 +01001081 }
1082 setverdict(pass);
1083}
Harald Welte3807ed12020-11-24 19:05:22 +01001084testcase TC_resume() runs on GlobalTest_CT
Daniel Willmann087a33d2020-11-19 15:58:43 +01001085{
Daniel Willmann087a33d2020-11-19 15:58:43 +01001086 f_init();
Harald Welte3807ed12020-11-24 19:05:22 +01001087 f_global_init();
1088 f_TC_resume();
Daniel Willmann087a33d2020-11-19 15:58:43 +01001089 f_cleanup();
1090}
1091
Harald Weltef8ef0282020-11-18 12:16:59 +01001092/* test the load-sharing between multiple NS-VC on the BSS side */
1093private function f_TC_dl_ud_unidir(charstring id) runs on BSSGP_ConnHdlr {
1094 var integer i;
1095
1096 for (i := 0; i < 10; i := i+1) {
1097 var octetstring payload := f_rnd_octstring(i);
1098 var template (value) PDU_BSSGP pdu_tx :=
1099 ts_BSSGP_DL_UD(g_pars.tlli, payload, omit, ts_BSSGP_IMSI(g_pars.imsi));
Harald Welte158becf2020-12-09 12:32:32 +01001100 SGSN_PTP[0].send(pdu_tx);
Harald Weltef8ef0282020-11-18 12:16:59 +01001101 }
1102 setverdict(pass);
1103}
1104testcase TC_load_sharing_dl() runs on test_CT_NS
1105{
1106 const integer num_ue := 10;
1107 var BSSGP_ConnHdlr vc_conn[num_ue];
1108 f_init();
1109
1110 /* all BVC are now fully brought up. We disconnect BSSGP from NS on the BSS
1111 * side so we get the raw NsUnitdataIndication and hence observe different
1112 * NSVCI */
1113 disconnect(g_pcu[0].vc_NS:NS_SP, g_pcu[0].vc_BSSGP:BSCP);
1114 connect(g_pcu[0].vc_NS:NS_SP, self:NS);
1115
1116 /* there may still be some NS-VCs coming up? After all, the BVC-RESET succeeds after the first
1117 * of the NS-VC is ALIVE/UNBLOCKED */
1118 f_sleep(3.0);
1119
1120 /* start parallel components generating DL-UNITDATA from the SGSN side */
1121 for (var integer i:= 0; i < num_ue; i := i+1) {
1122 vc_conn[i] := f_start_handler(refers(f_TC_dl_ud_unidir), testcasename(), g_pcu, g_sgsn, 5+i);
1123 }
1124
1125 /* now start counting all the messages that were queued before */
1126 /* TODO: We have a hard-coded assumption of 4 NS-VC in one NSE/NS-VCG here! */
1127 var ro_integer rx_count := { 0, 0, 0, 0 };
1128 timer T := 2.0;
1129 T.start;
1130 alt {
1131 [] as_NsUdiCount(0, rx_count);
1132 [] as_NsUdiCount(1, rx_count);
1133 [] as_NsUdiCount(2, rx_count);
1134 [] as_NsUdiCount(3, rx_count);
1135 [] NS.receive(NsUnitdataIndication:{0,?,?,*,*}) { repeat; } /* signaling BVC */
1136 [] NS.receive(NsStatusIndication:?) { repeat; }
1137 [] NS.receive {
1138 setverdict(fail, "Rx unexpected NS");
1139 mtc.stop;
1140 }
1141 [] T.timeout {
1142 }
1143 }
1144 for (var integer i := 0; i < lengthof(rx_count); i := i+1) {
1145 log("Rx on NSVCI ", mp_nsconfig_pcu[0].nsvc[i].nsvci, ": ", rx_count[i]);
1146 if (rx_count[i] == 0) {
1147 setverdict(fail, "Data not shared over all NSVC");
1148 }
1149 }
1150 setverdict(pass);
1151}
1152private altstep as_NsUdiCount(integer nsvc_idx, inout ro_integer roi) runs on test_CT_NS {
1153 var NsUnitdataIndication udi;
1154 var BssgpBvcConfig bvcc := g_pcu[0].cfg.bvc[0];
1155 [] NS.receive(NsUnitdataIndication:{bvcc.bvci, g_pcu[0].cfg.nsei, mp_nsconfig_pcu[0].nsvc[nsvc_idx].nsvci, *, *}) -> value udi {
1156 roi[nsvc_idx] := roi[nsvc_idx] + 1;
1157 repeat;
1158 }
1159}
1160type component test_CT_NS extends test_CT {
1161 port NS_PT NS;
1162};
1163
1164
Harald Welte0e188242020-11-22 21:46:48 +01001165/***********************************************************************
1166 * PAGING PS procedure
1167 ***********************************************************************/
1168
1169private function f_send_paging_ps(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1170 boolean use_sig := false)
1171runs on BSSGP_ConnHdlr return template (present) PDU_BSSGP {
1172 var template (value) PDU_BSSGP pdu_tx;
1173 var template (present) PDU_BSSGP pdu_rx;
1174 /* we always specify '0' as BVCI in the templates below, as we override it with
1175 * 'p4' later anyway */
1176 pdu_rx := tr_BSSGP_PS_PAGING(0);
1177 pdu_rx.pDU_BSSGP_PAGING_PS.iMSI := tr_BSSGP_IMSI(g_pars.imsi);
1178 if (ispresent(g_pars.p_tmsi)) {
1179 pdu_tx := ts_BSSGP_PS_PAGING_PTMSI(0, g_pars.imsi, oct2int(g_pars.p_tmsi));
1180 pdu_rx.pDU_BSSGP_PAGING_PS.pTMSI := tr_BSSGP_TMSI(oct2int(g_pars.p_tmsi));
1181 } else {
1182 pdu_tx := ts_BSSGP_PS_PAGING_IMSI(0, g_pars.imsi);
1183 pdu_rx.pDU_BSSGP_PAGING_PS.pTMSI := omit;
1184 }
1185 pdu_tx.pDU_BSSGP_PAGING_PS.paging_Field4 := p4;
1186 pdu_rx.pDU_BSSGP_PAGING_PS.paging_Field4 := p4;
1187 if (use_sig == false) {
Harald Welte158becf2020-12-09 12:32:32 +01001188 SGSN_PTP[sgsn_idx].send(pdu_tx);
Harald Welte0e188242020-11-22 21:46:48 +01001189 } else {
1190 SGSN_SIG[sgsn_idx].send(pdu_tx);
1191 }
1192 return pdu_rx;
1193}
1194
1195/* send paging defined by 'p4' on given SGSN-side index (ptp or signaling) and expect one paging to arrive on
1196 * specified PCU index */
1197private function f_send_paging_ps_exp_one_bss(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1198 boolean use_sig := false,integer pcu_idx := 0)
1199runs on BSSGP_ConnHdlr {
1200 var template (present) PDU_BSSGP exp_rx;
Daniel Willmann1a859712020-12-04 00:59:45 +01001201 var boolean test_done := false;
Harald Welte0e188242020-11-22 21:46:48 +01001202 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1203 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1204 exp_rx := f_send_paging_ps(p4, sgsn_idx, use_sig);
1205 /* Expect paging to propagate to the one BSS addressed by the BVCI only */
1206 timer T := 2.0;
1207 T.start;
1208 alt {
Harald Welte158becf2020-12-09 12:32:32 +01001209 [not use_sig and not test_done] PCU_PTP[pcu_idx].receive(exp_rx) {
Harald Welte0e188242020-11-22 21:46:48 +01001210 setverdict(pass);
Daniel Willmann1a859712020-12-04 00:59:45 +01001211 test_done := true;
Harald Welte0e188242020-11-22 21:46:48 +01001212 repeat;
1213 }
1214 [not use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {
1215 setverdict(fail, "Received paging on SIGNALING BVC, expected PTP BVC");
1216 }
Daniel Willmann1a859712020-12-04 00:59:45 +01001217 [use_sig and not test_done] PCU_SIG[pcu_idx].receive(exp_rx) {
Harald Welte0e188242020-11-22 21:46:48 +01001218 setverdict(pass);
Daniel Willmann1a859712020-12-04 00:59:45 +01001219 test_done := true;
Harald Welte0e188242020-11-22 21:46:48 +01001220 repeat;
1221 }
Harald Welte158becf2020-12-09 12:32:32 +01001222 [use_sig] PCU_PTP[pcu_idx].receive(exp_rx) {
Harald Welte0e188242020-11-22 21:46:48 +01001223 setverdict(fail, "Received paging on PTP BVC, expected SIGNALING BVC");
1224 }
Harald Welte158becf2020-12-09 12:32:32 +01001225 [] any from PCU_PTP.receive(exp_rx) {
Harald Welte0e188242020-11-22 21:46:48 +01001226 setverdict(fail, "Paging received on unexpected BVC");
1227 }
1228 [] any from PCU_SIG.receive(exp_rx) {
1229 setverdict(fail, "Paging received on unexpected BVC");
1230 }
Harald Welte158becf2020-12-09 12:32:32 +01001231 [] any from PCU_PTP.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
Harald Welte0e188242020-11-22 21:46:48 +01001232 setverdict(fail, "Different Paging than expected received PTP BVC");
1233 }
1234 [] any from PCU_SIG.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
1235 setverdict(fail, "Different Paging than expected on SIGNALING BVC");
1236 }
Daniel Willmann1a859712020-12-04 00:59:45 +01001237 [not test_done] T.timeout {
1238 setverdict(fail, "Timeout waiting for paging");
1239 }
1240 [test_done] T.timeout;
Harald Welte0e188242020-11-22 21:46:48 +01001241 }
1242}
1243
Harald Welte7462a592020-11-23 22:07:07 +01001244/* send a PS-PAGING but don't expect it to show up on any PTP or SIG BVC */
1245private function f_send_paging_ps_exp_no_bss(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1246 boolean use_sig := false)
1247runs on BSSGP_ConnHdlr {
1248 var template (present) PDU_BSSGP exp_rx;
1249 exp_rx := f_send_paging_ps(p4, sgsn_idx, use_sig);
1250 /* Expect paging to propagate to no BSS */
1251 timer T := 2.0;
1252 T.start;
1253 alt {
Harald Welte158becf2020-12-09 12:32:32 +01001254 [] any from PCU_PTP.receive(exp_rx) {
Harald Welte7462a592020-11-23 22:07:07 +01001255 setverdict(fail, "Paging received on unexpected BVC");
1256 }
1257 [] any from PCU_SIG.receive(exp_rx) {
1258 setverdict(fail, "Paging received on unexpected BVC");
1259 }
Harald Welte158becf2020-12-09 12:32:32 +01001260 [] any from PCU_PTP.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
Harald Welte7462a592020-11-23 22:07:07 +01001261 setverdict(fail, "Different Paging received on PTP BVC");
1262 }
1263 [] any from PCU_SIG.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
1264 setverdict(fail, "Different Paging received on SIGNALING BVC");
1265 }
1266 [] T.timeout {
1267 setverdict(pass);
1268 }
1269 }
1270}
1271
Harald Welte0e188242020-11-22 21:46:48 +01001272private function f_TC_paging_ps_ptp_bss(charstring id) runs on BSSGP_ConnHdlr
1273{
1274 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1275 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1276 f_send_paging_ps_exp_one_bss(ts_BssgpP4BssArea, 0, false, 0);
1277}
1278testcase TC_paging_ps_ptp_bss() runs on test_CT {
1279 var BSSGP_ConnHdlr vc_conn;
1280 f_init();
1281
1282 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_bss), testcasename(), g_pcu, g_sgsn, 9);
1283 vc_conn.done;
1284
1285 f_cleanup();
1286}
1287
1288/* PS-PAGING on PTP-BVC for Location Area */
1289private function f_TC_paging_ps_ptp_lac(charstring id) runs on BSSGP_ConnHdlr
1290{
1291 var template (present) PDU_BSSGP exp_rx;
1292 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1293 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1294 f_send_paging_ps_exp_one_bss(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, false, 0);
1295}
1296testcase TC_paging_ps_ptp_lac() runs on test_CT {
1297 var BSSGP_ConnHdlr vc_conn;
1298 f_init();
1299
1300 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_lac), testcasename(), g_pcu, g_sgsn, 10);
1301 vc_conn.done;
1302
1303 f_cleanup();
1304}
1305
Harald Welte7462a592020-11-23 22:07:07 +01001306/* PS-PAGING on PTP-BVC for unknown Location Area */
1307private function f_TC_paging_ps_ptp_lac_unknown(charstring id) runs on BSSGP_ConnHdlr
1308{
1309 var GSM_Types.LocationAreaIdentification unknown_la := {
1310 mcc_mnc := '567F99'H,
1311 lac := 33333
1312 };
1313 /* as it's sent on the PTP BVC, we expect it to pass even for unknown LAC */
1314 f_send_paging_ps_exp_one_bss(ts_BssgpP4LAC(unknown_la), 0, false, 0);
1315}
1316testcase TC_paging_ps_ptp_lac_unknown() runs on test_CT {
1317 var BSSGP_ConnHdlr vc_conn;
1318 f_init();
1319
1320 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_lac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1321 vc_conn.done;
1322
1323 f_cleanup();
1324}
1325
Harald Welte0e188242020-11-22 21:46:48 +01001326/* PS-PAGING on PTP-BVC for Routeing Area */
1327private function f_TC_paging_ps_ptp_rac(charstring id) runs on BSSGP_ConnHdlr
1328{
1329 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1330 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1331 f_send_paging_ps_exp_one_bss(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, false, 0);
1332}
1333testcase TC_paging_ps_ptp_rac() runs on test_CT {
1334 var BSSGP_ConnHdlr vc_conn;
1335 f_init();
1336
1337 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_rac), testcasename(), g_pcu, g_sgsn, 11);
1338 vc_conn.done;
1339
1340 f_cleanup();
1341}
1342
Harald Welte7462a592020-11-23 22:07:07 +01001343/* PS-PAGING on PTP-BVC for unknown Routeing Area */
1344private function f_TC_paging_ps_ptp_rac_unknown(charstring id) runs on BSSGP_ConnHdlr
1345{
1346 var RoutingAreaIdentification unknown_ra := {
1347 lai := {
1348 mcc_mnc := '567F99'H,
1349 lac := 33333
1350 },
1351 rac := 254
1352 };
1353 /* as it's sent on the PTP BVC, we expect it to pass even for unknown RAC */
1354 f_send_paging_ps_exp_one_bss(ts_BssgpP4RAC(unknown_ra), 0, false, 0);
1355}
1356testcase TC_paging_ps_ptp_rac_unknown() runs on test_CT {
1357 var BSSGP_ConnHdlr vc_conn;
1358 f_init();
1359
1360 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_rac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1361 vc_conn.done;
1362
1363 f_cleanup();
1364}
1365
Harald Welte0e188242020-11-22 21:46:48 +01001366/* PS-PAGING on PTP-BVC for BVCI (one cell) */
1367private function f_TC_paging_ps_ptp_bvci(charstring id) runs on BSSGP_ConnHdlr
1368{
1369 /* this should be the normal case for MS in READY MM state after a lower layer failure */
1370 f_send_paging_ps_exp_one_bss(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, false, 0);
1371}
1372testcase TC_paging_ps_ptp_bvci() runs on test_CT {
1373 var BSSGP_ConnHdlr vc_conn;
1374 f_init();
1375
1376 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_bvci), testcasename(), g_pcu, g_sgsn, 12);
1377 vc_conn.done;
1378
1379 f_cleanup();
1380}
1381
Harald Welte7462a592020-11-23 22:07:07 +01001382/* PS-PAGING on PTP-BVC for unknown BVCI */
1383private function f_TC_paging_ps_ptp_bvci_unknown(charstring id) runs on BSSGP_ConnHdlr
1384{
1385 /* as it's sent on the PTP BVC, we expect it to pass even for unknown BVCI */
1386 f_send_paging_ps_exp_one_bss(ts_BssgpP4Bvci(33333), 0, false, 0);
1387}
1388testcase TC_paging_ps_ptp_bvci_unknown() runs on test_CT {
1389 var BSSGP_ConnHdlr vc_conn;
1390 f_init();
1391
1392 vc_conn := f_start_handler(refers(f_TC_paging_ps_ptp_bvci_unknown), testcasename(), g_pcu, g_sgsn, 11);
1393 vc_conn.done;
1394
1395 f_cleanup();
1396}
1397
Harald Welte0e188242020-11-22 21:46:48 +01001398/* altstep for expecting BSSGP PDU on signaling BVC of given pcu_idx + storing in 'roi' */
1399private altstep as_paging_sig_pcu(integer pcu_idx, template (present) PDU_BSSGP exp_rx, inout ro_integer roi)
1400runs on BSSGP_ConnHdlr {
1401[] PCU_SIG[pcu_idx].receive(exp_rx) {
1402 if (ro_integer_contains(roi, pcu_idx)) {
1403 setverdict(fail, "Received multiple paging on same SIG BVC");
1404 }
1405 roi := roi & { pcu_idx };
1406 repeat;
1407 }
Harald Welte158becf2020-12-09 12:32:32 +01001408[] PCU_PTP[pcu_idx].receive(exp_rx) {
Harald Welte0e188242020-11-22 21:46:48 +01001409 setverdict(fail, "Received paging on PTP BVC, expected SIGNALING BVC");
1410 }
1411[] PCU_SIG[pcu_idx].receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
1412 setverdict(fail, "Different Paging than expected received SIGNALING BVC");
1413 }
Harald Welte158becf2020-12-09 12:32:32 +01001414[] PCU_PTP[pcu_idx].receive(PDU_BSSGP:{pDU_BSSGP_PAGING_PS:=?}) {
Harald Welte0e188242020-11-22 21:46:48 +01001415 setverdict(fail, "Different Paging than expected received PTP BVC");
1416 }
1417}
1418
1419type record of default ro_default;
1420
1421/* send PS-PAGING on SIG BVC, expect it to arrive on given list of PCU indexes */
1422private function f_send_paging_ps_exp_multi(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1423 ro_integer exp_on_pcu_idx) runs on BSSGP_ConnHdlr
1424{
1425 var template (present) PDU_BSSGP exp_rx;
1426 exp_rx := f_send_paging_ps(p4, 0, true);
1427
1428 /* FIXME: make sure the relevant BVCs/BSS are connected to the ports! */
1429 var ro_default defaults := {};
1430 for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
1431 var default d := activate(as_paging_sig_pcu(i, exp_rx, g_roi));
1432 defaults := defaults & { d };
1433 }
1434 f_sleep(2.0);
1435 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
1436 deactivate(defaults[i]);
1437 }
1438 log("Paging received on PCU ", g_roi);
1439
1440 for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
1441 var boolean rx_on_i := ro_integer_contains(g_roi, i);
1442 var boolean exp_on_i := ro_integer_contains(exp_on_pcu_idx, i);
1443 if (exp_on_i and not rx_on_i) {
1444 setverdict(fail, "PS-PAGING not received on ", mp_nsconfig_pcu[i].nsei);
1445 }
1446 if (not exp_on_i and rx_on_i) {
1447 setverdict(fail, "PS-PAGING not expected but received on ", mp_nsconfig_pcu[i].nsei);
1448 }
1449 }
1450 setverdict(pass);
1451}
1452
1453/* PS-PAGING on SIG-BVC for BSS Area */
1454private function f_TC_paging_ps_sig_bss(charstring id) runs on BSSGP_ConnHdlr
1455{
1456 /* we expect the paging to arrive on all three NSE */
1457 f_send_paging_ps_exp_multi(ts_BssgpP4BssArea, 0, {0, 1, 2});
1458}
1459testcase TC_paging_ps_sig_bss() runs on test_CT {
1460 var BSSGP_ConnHdlr vc_conn;
1461 f_init();
1462
1463 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_bss), testcasename(), g_pcu, g_sgsn, 13);
1464 vc_conn.done;
1465
1466 f_cleanup();
1467}
1468
1469/* PS-PAGING on SIG-BVC for Location Area */
1470private function f_TC_paging_ps_sig_lac(charstring id) runs on BSSGP_ConnHdlr
1471{
Daniel Willmann2c9300f2020-12-01 10:54:08 +01001472 /* The first LAC (13135) is shared by all three NSEs */
1473 f_send_paging_ps_exp_multi(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, {0, 1, 2});
1474 /* Reset state */
1475 g_roi := {};
1476 /* Make LAC (13300) available on pcu index 2 */
1477 f_connect_to_pcu_bvc(port_idx := 2, nse_idx := 2, bvc_idx := 1);
1478 f_send_paging_ps_exp_multi(ts_BssgpP4LAC(pcu_bvc_cfg[2].cell_id.ra_id.lai), 0, {2});
Harald Welte0e188242020-11-22 21:46:48 +01001479}
1480testcase TC_paging_ps_sig_lac() runs on test_CT {
1481 var BSSGP_ConnHdlr vc_conn;
1482 f_init();
1483
1484 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_lac), testcasename(), g_pcu, g_sgsn, 14);
1485 vc_conn.done;
1486
1487 f_cleanup();
1488}
1489
Harald Welte7462a592020-11-23 22:07:07 +01001490/* PS-PAGING on SIG-BVC for unknown Location Area */
1491private function f_TC_paging_ps_sig_lac_unknown(charstring id) runs on BSSGP_ConnHdlr
1492{
1493 var GSM_Types.LocationAreaIdentification unknown_la := {
1494 mcc_mnc := '567F99'H,
1495 lac := 33333
1496 };
1497 f_send_paging_ps_exp_no_bss(ts_BssgpP4LAC(unknown_la), 0, true);
1498}
1499testcase TC_paging_ps_sig_lac_unknown() runs on test_CT {
1500 var BSSGP_ConnHdlr vc_conn;
1501 f_init();
1502
1503 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_lac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1504 vc_conn.done;
1505
1506 f_cleanup();
1507}
1508
Harald Welte0e188242020-11-22 21:46:48 +01001509/* PS-PAGING on SIG-BVC for Routeing Area */
1510private function f_TC_paging_ps_sig_rac(charstring id) runs on BSSGP_ConnHdlr
1511{
Daniel Willmann2c9300f2020-12-01 10:54:08 +01001512 /* Only PCU index 0 has a matching BVC with the RA ID */
Harald Welte0e188242020-11-22 21:46:48 +01001513 f_send_paging_ps_exp_multi(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, {0});
Daniel Willmann2c9300f2020-12-01 10:54:08 +01001514 g_roi := {};
1515 /* PCU index 1 and 2 have a matching BVC with the RA ID */
1516 f_send_paging_ps_exp_multi(ts_BssgpP4RAC(pcu_bvc_cfg[2].cell_id.ra_id), 0, {1, 2});
1517 g_roi := {};
1518 /* PCU index 2 has two matching BVCs with the RA ID */
1519 f_connect_to_pcu_bvc(port_idx := 2, nse_idx := 2, bvc_idx := 1);
1520 f_send_paging_ps_exp_multi(ts_BssgpP4RAC(pcu_bvc_cfg[2].cell_id.ra_id), 0, {2});
Harald Welte0e188242020-11-22 21:46:48 +01001521}
1522testcase TC_paging_ps_sig_rac() runs on test_CT {
1523 var BSSGP_ConnHdlr vc_conn;
1524 f_init();
1525
1526 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_rac), testcasename(), g_pcu, g_sgsn, 15);
1527 vc_conn.done;
1528
1529 f_cleanup();
1530}
1531
Harald Welte7462a592020-11-23 22:07:07 +01001532/* PS-PAGING on SIG-BVC for unknown Routeing Area */
1533private function f_TC_paging_ps_sig_rac_unknown(charstring id) runs on BSSGP_ConnHdlr
1534{
1535 var RoutingAreaIdentification unknown_ra := {
1536 lai := {
1537 mcc_mnc := '567F99'H,
1538 lac := 33333
1539 },
1540 rac := 254
1541 };
1542 f_send_paging_ps_exp_no_bss(ts_BssgpP4RAC(unknown_ra), 0, true);
1543}
1544testcase TC_paging_ps_sig_rac_unknown() runs on test_CT {
1545 var BSSGP_ConnHdlr vc_conn;
1546 f_init();
1547
1548 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_rac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1549 vc_conn.done;
1550
1551 f_cleanup();
1552}
1553
Harald Welte0e188242020-11-22 21:46:48 +01001554/* PS-PAGING on SIG-BVC for BVCI (one cell) */
1555private function f_TC_paging_ps_sig_bvci(charstring id) runs on BSSGP_ConnHdlr
1556{
1557 f_send_paging_ps_exp_multi(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, {0});
1558}
1559testcase TC_paging_ps_sig_bvci() runs on test_CT {
1560 var BSSGP_ConnHdlr vc_conn;
1561 f_init();
1562
1563 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_bvci), testcasename(), g_pcu, g_sgsn, 16);
1564 vc_conn.done;
1565
1566 f_cleanup();
1567}
1568
Harald Welte7462a592020-11-23 22:07:07 +01001569/* PS-PAGING on SIG-BVC for unknown BVCI */
1570private function f_TC_paging_ps_sig_bvci_unknown(charstring id) runs on BSSGP_ConnHdlr
1571{
1572 f_send_paging_ps_exp_no_bss(ts_BssgpP4Bvci(33333), 0, true);
1573}
1574testcase TC_paging_ps_sig_bvci_unknown() runs on test_CT {
1575 var BSSGP_ConnHdlr vc_conn;
1576 f_init();
1577
1578 vc_conn := f_start_handler(refers(f_TC_paging_ps_sig_bvci_unknown), testcasename(), g_pcu, g_sgsn, 11);
1579 vc_conn.done;
1580
1581 f_cleanup();
1582}
1583
1584
Harald Welte0e188242020-11-22 21:46:48 +01001585
1586/***********************************************************************
1587 * PAGING CS procedure
1588 ***********************************************************************/
1589
1590private function f_send_paging_cs(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1591 boolean use_sig := false)
1592runs on BSSGP_ConnHdlr return template (present) PDU_BSSGP {
1593 var template (value) PDU_BSSGP pdu_tx;
1594 var template (present) PDU_BSSGP pdu_rx;
1595 /* we always specify '0' as BVCI in the templates below, as we override it with
1596 * 'p4' later anyway */
1597 pdu_rx := tr_BSSGP_CS_PAGING(0);
1598 pdu_rx.pDU_BSSGP_PAGING_CS.iMSI := tr_BSSGP_IMSI(g_pars.imsi);
1599 if (ispresent(g_pars.p_tmsi)) {
1600 pdu_tx := ts_BSSGP_CS_PAGING_PTMSI(0, g_pars.imsi, oct2int(g_pars.p_tmsi));
1601 pdu_rx.pDU_BSSGP_PAGING_CS.tMSI := tr_BSSGP_TMSI(oct2int(g_pars.p_tmsi));
1602 } else {
1603 pdu_tx := ts_BSSGP_CS_PAGING_IMSI(0, g_pars.imsi);
1604 pdu_rx.pDU_BSSGP_PAGING_CS.tMSI := omit;
1605 }
1606 pdu_tx.pDU_BSSGP_PAGING_CS.paging_Field4 := p4;
1607 pdu_rx.pDU_BSSGP_PAGING_CS.paging_Field4 := p4;
1608 if (use_sig == false) {
Harald Welte158becf2020-12-09 12:32:32 +01001609 SGSN_PTP[sgsn_idx].send(pdu_tx);
Harald Welte0e188242020-11-22 21:46:48 +01001610 } else {
1611 SGSN_SIG[sgsn_idx].send(pdu_tx);
1612 }
1613 return pdu_rx;
1614}
1615
1616/* send paging defined by 'p4' on given SGSN-side index (ptp or signaling) and expect one paging to arrive on
1617 * specified PCU index */
1618private function f_send_paging_cs_exp_one_bss(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1619 boolean use_sig := false,integer pcu_idx := 0)
1620runs on BSSGP_ConnHdlr {
1621 var template (present) PDU_BSSGP exp_rx;
Daniel Willmann1a859712020-12-04 00:59:45 +01001622 var boolean test_done := false;
Harald Welte0e188242020-11-22 21:46:48 +01001623 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1624 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1625 exp_rx := f_send_paging_cs(p4, sgsn_idx, use_sig);
1626 /* Expect paging to propagate to the one BSS addressed by the BVCI only */
1627 timer T := 2.0;
1628 T.start;
1629 alt {
Harald Welte158becf2020-12-09 12:32:32 +01001630 [not use_sig and not test_done] PCU_PTP[pcu_idx].receive(exp_rx) {
Harald Welte0e188242020-11-22 21:46:48 +01001631 setverdict(pass);
Daniel Willmann1a859712020-12-04 00:59:45 +01001632 test_done := true;
Harald Welte0e188242020-11-22 21:46:48 +01001633 repeat;
1634 }
1635 [not use_sig] PCU_SIG[pcu_idx].receive(exp_rx) {
1636 setverdict(fail, "Received paging on SIGNALING BVC, expected PTP BVC");
1637 }
Daniel Willmann1a859712020-12-04 00:59:45 +01001638 [use_sig and not test_done] PCU_SIG[pcu_idx].receive(exp_rx) {
Harald Welte0e188242020-11-22 21:46:48 +01001639 setverdict(pass);
Daniel Willmann1a859712020-12-04 00:59:45 +01001640 test_done := true;
Harald Welte0e188242020-11-22 21:46:48 +01001641 repeat;
1642 }
Harald Welte158becf2020-12-09 12:32:32 +01001643 [use_sig] PCU_PTP[pcu_idx].receive(exp_rx) {
Harald Welte0e188242020-11-22 21:46:48 +01001644 setverdict(fail, "Received paging on PTP BVC, expected SIGNALING BVC");
1645 }
Harald Welte158becf2020-12-09 12:32:32 +01001646 [] any from PCU_PTP.receive(exp_rx) {
Harald Welte0e188242020-11-22 21:46:48 +01001647 setverdict(fail, "Paging received on unexpected BVC");
1648 }
1649 [] any from PCU_SIG.receive(exp_rx) {
1650 setverdict(fail, "Paging received on unexpected BVC");
1651 }
Harald Welte158becf2020-12-09 12:32:32 +01001652 [] any from PCU_PTP.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_CS:=?}) {
Harald Welte0e188242020-11-22 21:46:48 +01001653 setverdict(fail, "Different Paging than expected received PTP BVC");
1654 }
1655 [] any from PCU_SIG.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_CS:=?}) {
1656 setverdict(fail, "Different Paging than expected on SIGNALING BVC");
1657 }
Daniel Willmann1a859712020-12-04 00:59:45 +01001658 [not test_done] T.timeout {
1659 setverdict(fail, "Timeout while waiting for paging")
1660 }
1661 [test_done] T.timeout;
Harald Welte0e188242020-11-22 21:46:48 +01001662 }
1663}
1664
Harald Welte7462a592020-11-23 22:07:07 +01001665/* send a CS-PAGING but don't expect it to show up on any PTP or SIG BVC */
1666private function f_send_paging_cs_exp_no_bss(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1667 boolean use_sig := false)
1668runs on BSSGP_ConnHdlr {
1669 var template (present) PDU_BSSGP exp_rx;
1670 exp_rx := f_send_paging_cs(p4, sgsn_idx, use_sig);
1671 /* Expect paging to propagate to no BSS */
1672 timer T := 2.0;
1673 T.start;
1674 alt {
Harald Welte158becf2020-12-09 12:32:32 +01001675 [] any from PCU_PTP.receive(exp_rx) {
Harald Welte7462a592020-11-23 22:07:07 +01001676 setverdict(fail, "Paging received on unexpected BVC");
1677 }
1678 [] any from PCU_SIG.receive(exp_rx) {
1679 setverdict(fail, "Paging received on unexpected BVC");
1680 }
Harald Welte158becf2020-12-09 12:32:32 +01001681 [] any from PCU_PTP.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_CS:=?}) {
Harald Welte7462a592020-11-23 22:07:07 +01001682 setverdict(fail, "Different Paging received on PTP BVC");
1683 }
1684 [] any from PCU_SIG.receive(PDU_BSSGP:{pDU_BSSGP_PAGING_CS:=?}) {
1685 setverdict(fail, "Different Paging received on SIGNALING BVC");
1686 }
1687 [] T.timeout {
1688 setverdict(pass);
1689 }
1690 }
1691}
1692
Harald Welte0e188242020-11-22 21:46:48 +01001693private function f_TC_paging_cs_ptp_bss(charstring id) runs on BSSGP_ConnHdlr
1694{
1695 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1696 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1697 f_send_paging_cs_exp_one_bss(ts_BssgpP4BssArea, 0, false, 0);
1698}
1699testcase TC_paging_cs_ptp_bss() runs on test_CT {
1700 var BSSGP_ConnHdlr vc_conn;
1701 f_init();
1702
1703 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_bss), testcasename(), g_pcu, g_sgsn, 17);
1704 vc_conn.done;
1705
1706 f_cleanup();
1707}
1708
1709/* CS-PAGING on PTP-BVC for Location Area */
1710private function f_TC_paging_cs_ptp_lac(charstring id) runs on BSSGP_ConnHdlr
1711{
1712 var template (present) PDU_BSSGP exp_rx;
1713 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1714 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1715 f_send_paging_cs_exp_one_bss(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, false, 0);
1716}
1717testcase TC_paging_cs_ptp_lac() runs on test_CT {
1718 var BSSGP_ConnHdlr vc_conn;
1719 f_init();
1720
1721 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_lac), testcasename(), g_pcu, g_sgsn, 18);
1722 vc_conn.done;
1723
1724 f_cleanup();
1725}
1726
Harald Welte7462a592020-11-23 22:07:07 +01001727/* CS-PAGING on PTP-BVC for unknown Location Area */
1728private function f_TC_paging_cs_ptp_lac_unknown(charstring id) runs on BSSGP_ConnHdlr
1729{
1730 var GSM_Types.LocationAreaIdentification unknown_la := {
1731 mcc_mnc := '567F99'H,
1732 lac := 33333
1733 };
1734 /* as it's sent on the PTP BVC, we expect it to pass even for unknown LAC */
1735 f_send_paging_cs_exp_one_bss(ts_BssgpP4LAC(unknown_la), 0, false, 0);
1736}
1737testcase TC_paging_cs_ptp_lac_unknown() runs on test_CT {
1738 var BSSGP_ConnHdlr vc_conn;
1739 f_init();
1740
1741 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_lac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1742 vc_conn.done;
1743
1744 f_cleanup();
1745}
1746
Harald Welte0e188242020-11-22 21:46:48 +01001747/* CS-PAGING on PTP-BVC for Routeing Area */
1748private function f_TC_paging_cs_ptp_rac(charstring id) runs on BSSGP_ConnHdlr
1749{
1750 /* doesn't really make sense: Sending to a single BVCI means the message ends up
1751 * at that BVC (cell) only, and paging all over the BSS area is not possible */
1752 f_send_paging_cs_exp_one_bss(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, false, 0);
1753}
1754testcase TC_paging_cs_ptp_rac() runs on test_CT {
1755 var BSSGP_ConnHdlr vc_conn;
1756 f_init();
1757
1758 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_rac), testcasename(), g_pcu, g_sgsn, 19);
1759 vc_conn.done;
1760
1761 f_cleanup();
1762}
1763
Harald Welte7462a592020-11-23 22:07:07 +01001764/* CS-PAGING on PTP-BVC for unknown Routeing Area */
1765private function f_TC_paging_cs_ptp_rac_unknown(charstring id) runs on BSSGP_ConnHdlr
1766{
1767 var RoutingAreaIdentification unknown_ra := {
1768 lai := {
1769 mcc_mnc := '567F99'H,
1770 lac := 33333
1771 },
1772 rac := 254
1773 };
1774 /* as it's sent on the PTP BVC, we expect it to pass even for unknown RAC */
1775 f_send_paging_cs_exp_one_bss(ts_BssgpP4RAC(unknown_ra), 0, false, 0);
1776}
1777testcase TC_paging_cs_ptp_rac_unknown() runs on test_CT {
1778 var BSSGP_ConnHdlr vc_conn;
1779 f_init();
1780
1781 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_rac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1782 vc_conn.done;
1783
1784 f_cleanup();
1785}
1786
Harald Welte0e188242020-11-22 21:46:48 +01001787/* CS-PAGING on PTP-BVC for BVCI (one cell) */
1788private function f_TC_paging_cs_ptp_bvci(charstring id) runs on BSSGP_ConnHdlr
1789{
1790 /* this should be the normal case for MS in READY MM state after a lower layer failure */
1791 f_send_paging_cs_exp_one_bss(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, false, 0);
1792}
1793testcase TC_paging_cs_ptp_bvci() runs on test_CT {
1794 var BSSGP_ConnHdlr vc_conn;
1795 f_init();
1796
1797 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_bvci), testcasename(), g_pcu, g_sgsn, 20);
1798 vc_conn.done;
1799
1800 f_cleanup();
1801}
1802
Harald Welte7462a592020-11-23 22:07:07 +01001803/* CS-PAGING on PTP-BVC for unknown BVCI */
1804private function f_TC_paging_cs_ptp_bvci_unknown(charstring id) runs on BSSGP_ConnHdlr
1805{
1806 /* as it's sent on the PTP BVC, we expect it to pass even for unknown BVCI */
1807 f_send_paging_cs_exp_one_bss(ts_BssgpP4Bvci(33333), 0, false, 0);
1808}
1809testcase TC_paging_cs_ptp_bvci_unknown() runs on test_CT {
1810 var BSSGP_ConnHdlr vc_conn;
1811 f_init();
1812
1813 vc_conn := f_start_handler(refers(f_TC_paging_cs_ptp_bvci_unknown), testcasename(), g_pcu, g_sgsn, 11);
1814 vc_conn.done;
1815
1816 f_cleanup();
1817}
1818
Harald Welte0e188242020-11-22 21:46:48 +01001819/* send CS-PAGING on SIG BVC, expect it to arrive on given list of PCU indexes */
1820private function f_send_paging_cs_exp_multi(template (value) Paging_Field4 p4, integer sgsn_idx := 0,
1821 ro_integer exp_on_pcu_idx) runs on BSSGP_ConnHdlr
1822{
1823 var template (present) PDU_BSSGP exp_rx;
1824 exp_rx := f_send_paging_cs(p4, 0, true);
1825
1826 /* FIXME: make sure the relevant BVCs/BSS are connected to the ports! */
1827 var ro_default defaults := {};
1828 for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
1829 var default d := activate(as_paging_sig_pcu(i, exp_rx, g_roi));
1830 defaults := defaults & { d };
1831 }
1832 f_sleep(2.0);
1833 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
1834 deactivate(defaults[i]);
1835 }
1836 log("Paging received on PCU ", g_roi);
1837
1838 for (var integer i := 0; i < lengthof(mp_nsconfig_pcu); i := i+1) {
1839 var boolean rx_on_i := ro_integer_contains(g_roi, i);
1840 var boolean exp_on_i := ro_integer_contains(exp_on_pcu_idx, i);
1841 if (exp_on_i and not rx_on_i) {
1842 setverdict(fail, "PS-PAGING not received on ", mp_nsconfig_pcu[i].nsei);
1843 }
1844 if (not exp_on_i and rx_on_i) {
1845 setverdict(fail, "PS-PAGING not expected but received on ", mp_nsconfig_pcu[i].nsei);
1846 }
1847 }
1848 setverdict(pass);
1849}
1850
1851/* CS-PAGING on SIG-BVC for BSS Area */
1852private function f_TC_paging_cs_sig_bss(charstring id) runs on BSSGP_ConnHdlr
1853{
1854 /* we expect the paging to arrive on all three NSE */
1855 f_send_paging_cs_exp_multi(ts_BssgpP4BssArea, 0, {0, 1, 2});
1856}
1857testcase TC_paging_cs_sig_bss() runs on test_CT {
1858 var BSSGP_ConnHdlr vc_conn;
1859 f_init();
1860
1861 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_bss), testcasename(), g_pcu, g_sgsn, 13);
1862 vc_conn.done;
1863
1864 f_cleanup();
1865}
1866
1867/* CS-PAGING on SIG-BVC for Location Area */
1868private function f_TC_paging_cs_sig_lac(charstring id) runs on BSSGP_ConnHdlr
1869{
Daniel Willmannd4fb73c2020-12-07 13:57:17 +01001870 /* The first LAC (13135) is shared by all three NSEs */
1871 f_send_paging_cs_exp_multi(ts_BssgpP4LAC(pcu_bvc_cfg[0].cell_id.ra_id.lai), 0, {0, 1, 2});
1872 /* Reset state */
1873 g_roi := {};
1874 /* Make LAC (13300) available on pcu index 2 */
1875 f_connect_to_pcu_bvc(port_idx := 2, nse_idx := 2, bvc_idx := 1);
1876 f_send_paging_cs_exp_multi(ts_BssgpP4LAC(pcu_bvc_cfg[2].cell_id.ra_id.lai), 0, {2});
Harald Welte0e188242020-11-22 21:46:48 +01001877}
1878testcase TC_paging_cs_sig_lac() runs on test_CT {
1879 var BSSGP_ConnHdlr vc_conn;
1880 f_init();
1881
1882 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_lac), testcasename(), g_pcu, g_sgsn, 14);
1883 vc_conn.done;
1884
1885 f_cleanup();
1886}
1887
Harald Welte7462a592020-11-23 22:07:07 +01001888/* CS-PAGING on SIG-BVC for unknown Location Area */
1889private function f_TC_paging_cs_sig_lac_unknown(charstring id) runs on BSSGP_ConnHdlr
1890{
1891 var GSM_Types.LocationAreaIdentification unknown_la := {
1892 mcc_mnc := '567F99'H,
1893 lac := 33333
1894 };
1895 f_send_paging_cs_exp_no_bss(ts_BssgpP4LAC(unknown_la), 0, true);
1896}
1897testcase TC_paging_cs_sig_lac_unknown() runs on test_CT {
1898 var BSSGP_ConnHdlr vc_conn;
1899 f_init();
1900
1901 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_lac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1902 vc_conn.done;
1903
1904 f_cleanup();
1905}
1906
Harald Welte0e188242020-11-22 21:46:48 +01001907/* CS-PAGING on SIG-BVC for Routeing Area */
1908private function f_TC_paging_cs_sig_rac(charstring id) runs on BSSGP_ConnHdlr
1909{
Daniel Willmannd4fb73c2020-12-07 13:57:17 +01001910 /* Only PCU index 0 has a matching BVC with the RA ID */
Harald Welte0e188242020-11-22 21:46:48 +01001911 f_send_paging_cs_exp_multi(ts_BssgpP4RAC(pcu_bvc_cfg[0].cell_id.ra_id), 0, {0});
Daniel Willmannd4fb73c2020-12-07 13:57:17 +01001912 g_roi := {};
1913 /* PCU index 1 and 2 have a matching BVC with the RA ID */
1914 f_send_paging_cs_exp_multi(ts_BssgpP4RAC(pcu_bvc_cfg[2].cell_id.ra_id), 0, {1, 2});
1915 g_roi := {};
1916 /* PCU index 2 has two matching BVCs with the RA ID */
1917 f_connect_to_pcu_bvc(port_idx := 2, nse_idx := 2, bvc_idx := 1);
1918 f_send_paging_cs_exp_multi(ts_BssgpP4RAC(pcu_bvc_cfg[2].cell_id.ra_id), 0, {2});
Harald Welte0e188242020-11-22 21:46:48 +01001919}
1920testcase TC_paging_cs_sig_rac() runs on test_CT {
1921 var BSSGP_ConnHdlr vc_conn;
1922 f_init();
1923
1924 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_rac), testcasename(), g_pcu, g_sgsn, 15);
1925 vc_conn.done;
1926
1927 f_cleanup();
1928}
1929
Harald Welte7462a592020-11-23 22:07:07 +01001930/* CS-PAGING on SIG-BVC for unknown Routeing Area */
1931private function f_TC_paging_cs_sig_rac_unknown(charstring id) runs on BSSGP_ConnHdlr
1932{
1933 var RoutingAreaIdentification unknown_ra := {
1934 lai := {
1935 mcc_mnc := '567F99'H,
1936 lac := 33333
1937 },
1938 rac := 254
1939 };
1940 f_send_paging_cs_exp_no_bss(ts_BssgpP4RAC(unknown_ra), 0, true);
1941}
1942testcase TC_paging_cs_sig_rac_unknown() runs on test_CT {
1943 var BSSGP_ConnHdlr vc_conn;
1944 f_init();
1945
1946 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_rac_unknown), testcasename(), g_pcu, g_sgsn, 11);
1947 vc_conn.done;
1948
1949 f_cleanup();
1950}
1951
Harald Welte0e188242020-11-22 21:46:48 +01001952/* CS-PAGING on SIG-BVC for BVCI (one cell) */
1953private function f_TC_paging_cs_sig_bvci(charstring id) runs on BSSGP_ConnHdlr
1954{
1955 f_send_paging_cs_exp_multi(ts_BssgpP4Bvci(pcu_bvc_cfg[0].bvci), 0, {0});
1956}
1957testcase TC_paging_cs_sig_bvci() runs on test_CT {
1958 var BSSGP_ConnHdlr vc_conn;
1959 f_init();
1960
1961 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_bvci), testcasename(), g_pcu, g_sgsn, 16);
1962 vc_conn.done;
1963
1964 f_cleanup();
1965}
1966
Harald Welte7462a592020-11-23 22:07:07 +01001967/* CS-PAGING on SIG-BVC for unknown BVCI */
1968private function f_TC_paging_cs_sig_bvci_unknown(charstring id) runs on BSSGP_ConnHdlr
1969{
1970 f_send_paging_cs_exp_no_bss(ts_BssgpP4Bvci(33333), 0, true);
1971}
1972testcase TC_paging_cs_sig_bvci_unknown() runs on test_CT {
1973 var BSSGP_ConnHdlr vc_conn;
1974 f_init();
1975
1976 vc_conn := f_start_handler(refers(f_TC_paging_cs_sig_bvci_unknown), testcasename(), g_pcu, g_sgsn, 11);
1977 vc_conn.done;
1978
1979 f_cleanup();
1980}
1981
Harald Welte4f91c3b2020-12-09 12:25:51 +01001982/***********************************************************************
1983 * FLUSH-LL procedure
1984 ***********************************************************************/
1985
Daniel Willmann91a8e25b2020-11-24 14:50:59 +01001986private function f_TC_flush_ll(charstring id) runs on BSSGP_ConnHdlr {
1987 var BssgpBvci bvci := g_pars.pcu[0].cfg.bvc[0].bvci;
1988 var integer i;
1989 for (i := 0; i < 10; i := i+1) {
1990 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_FLUSH_LL(g_pars.tlli, bvci, bvci_new := bvci);
1991 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
1992 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_FLUSH_LL(g_pars.tlli, bvci, bvci_new := bvci);
1993
1994 f_sgsn2pcu(pdu_tx, pdu_rx, use_sig := true);
1995
1996 pdu_tx := ts_BSSGP_FLUSH_LL_ACK(g_pars.tlli, int2oct(0, 1), 23, bvci_new := bvci);
1997 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
1998 pdu_rx := tr_BSSGP_FLUSH_LL_ACK(g_pars.tlli, int2oct(0, 1), 23, bvci_new := bvci);
1999
2000 f_pcu2sgsn(pdu_tx, pdu_rx, use_sig := true);
2001 }
2002 setverdict(pass);
2003}
2004testcase TC_flush_ll() runs on test_CT
2005{
2006 var BSSGP_ConnHdlr vc_conn;
2007 f_init();
2008
2009 vc_conn := f_start_handler(refers(f_TC_flush_ll), testcasename(), g_pcu, g_sgsn, 6);
2010 vc_conn.done;
2011 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
2012
2013 f_cleanup();
2014}
Harald Welte6dc2ac42020-11-16 09:16:17 +01002015
Harald Welte4f91c3b2020-12-09 12:25:51 +01002016/***********************************************************************
2017 * SGSN-INVOKE-TRACE procedure
2018 ***********************************************************************/
2019
Harald Weltef8e5c5d2020-11-27 22:37:23 +01002020private altstep as_bssgp_g_pcu_count(integer pcu_idx, template (present) PDU_BSSGP exp_rx, inout ro_integer roi)
2021runs on GlobalTest_CT {
2022[] G_PCU[pcu_idx].receive(exp_rx) from g_pcu[pcu_idx].vc_BSSGP {
2023 if (ro_integer_contains(roi, pcu_idx)) {
2024 setverdict(fail, "Received multiple on same SIG BVC");
2025 }
2026 roi := roi & { pcu_idx };
2027 repeat;
2028 }
2029}
2030/* send a INVOKE-TRACE from SGSN and expect to receive a copy on each NSE */
2031testcase TC_trace() runs on GlobalTest_CT
2032{
2033 var BSSGP_ConnHdlr vc_conn;
2034 f_init();
2035 f_global_init();
2036
2037 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_INVOKE_TRACE('23'O, '4321'O);
2038 var template (present) PDU_BSSGP exp_rx := ts_BSSGP_INVOKE_TRACE('23'O, '4321'O);
2039
2040 var ro_default defaults := {};
2041 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
2042 activate(as_bssgp_g_pcu_count(i, exp_rx, g_roi));
2043 }
2044 G_SGSN[0].send(pdu_tx);
2045 f_sleep(2.0);
2046 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
2047 deactivate(defaults[i]);
2048 }
2049
2050 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
2051 if (not ro_integer_contains(g_roi, i)) {
2052 setverdict(fail, "Failed to receive TRACE on PCU index ", i);
2053 }
2054 }
2055 setverdict(pass);
2056
2057 f_cleanup();
2058}
2059
Harald Welte4f91c3b2020-12-09 12:25:51 +01002060/***********************************************************************
2061 * LLC-DISCARDED procedure
2062 ***********************************************************************/
2063
Harald Weltec0351d12020-11-27 22:49:02 +01002064private function f_TC_llc_discarded(charstring id) runs on BSSGP_ConnHdlr {
2065 var BssgpBvci bvci := g_pars.pcu[0].cfg.bvc[0].bvci;
2066
2067 var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_LLC_DISCARDED(g_pars.tlli, 23, bvci, 2342);
2068 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
2069 var template (present) PDU_BSSGP pdu_rx := tr_BSSGP_LLC_DISCARDED(g_pars.tlli, 23, bvci, 2342);
2070
2071 f_pcu2sgsn(pdu_tx, pdu_rx, use_sig := true);
2072
2073 setverdict(pass);
2074}
2075/* Send a LLC-DISCARDED from BSS side and expect it to show up on SGSN (SIG BVC) */
2076testcase TC_llc_discarded() runs on test_CT
2077{
2078 var BSSGP_ConnHdlr vc_conn;
2079 f_init();
2080
2081 vc_conn := f_start_handler(refers(f_TC_llc_discarded), testcasename(), g_pcu, g_sgsn, 6);
2082 vc_conn.done;
2083 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
2084
2085 f_cleanup();
2086}
2087
Harald Welte4f91c3b2020-12-09 12:25:51 +01002088/***********************************************************************
2089 * OVERLOAD procedure
2090 ***********************************************************************/
2091
Harald Weltef20af412020-11-28 16:11:11 +01002092/* Send an OVERLOAD from SGSN side and expect it to show up on each PCU (SIG BVC) */
2093testcase TC_overload() runs on GlobalTest_CT
2094{
2095 f_init();
2096 f_global_init();
2097
2098 var template (value) PDU_BSSGP pdu_tx := ts_OVERLOAD('1'B);
2099 var template (present) PDU_BSSGP exp_rx := tr_OVERLOAD('1'B);
2100
2101 var ro_default defaults := {};
2102 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
2103 activate(as_bssgp_g_pcu_count(i, exp_rx, g_roi));
2104 }
2105 G_SGSN[0].send(pdu_tx);
2106 f_sleep(2.0);
2107 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
2108 deactivate(defaults[i]);
2109 }
2110
2111 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
2112 if (not ro_integer_contains(g_roi, i)) {
2113 setverdict(fail, "Failed to receive OVERLOAD on PCU index ", i);
2114 }
2115 }
2116 setverdict(pass);
2117
2118 f_cleanup();
2119}
2120
Harald Welte4f91c3b2020-12-09 12:25:51 +01002121/***********************************************************************
2122 * BVC-BLOCK / BVC-UNBLOCK procedure
2123 ***********************************************************************/
2124
Harald Welte239aa502020-11-24 23:14:20 +01002125private function f_block_ptp_bvc_from_pcu(integer pcu_idx, integer bvc_idx) runs on test_CT
2126{
2127 var BSSGP_BVC_CT bvc_ct := g_pcu[pcu_idx].vc_BSSGP_BVC[bvc_idx];
2128 var BssgpBvcConfig bvc_cfg := g_pcu[pcu_idx].cfg.bvc[bvc_idx];
2129 var Nsei nsei_pcu := g_pcu[pcu_idx].cfg.nsei;
2130
2131 SGSN_MGMT.clear;
2132 PCU_MGMT.clear;
2133
2134 /* block the PTP BVC from the PCU side */
2135 PCU_MGMT.send(BssgpBlockRequest:{cause:=BSSGP_CAUSE_OM_INTERVENTION}) to bvc_ct;
2136 /* expect state on both PCU and SGSN side to change */
2137 interleave {
2138 [] PCU_MGMT.receive(tr_BssgpStsInd(nsei_pcu, bvc_cfg.bvci, BVC_S_BLOCKED)) from bvc_ct;
2139 [] SGSN_MGMT.receive(tr_BssgpStsInd(*, bvc_cfg.bvci, BVC_S_BLOCKED));
2140 }
2141 setverdict(pass);
2142}
2143testcase TC_bvc_block_ptp() runs on test_CT
2144{
2145 f_init();
2146 f_sleep(1.0);
2147 f_block_ptp_bvc_from_pcu(0, 0);
2148 f_cleanup();
2149}
2150
2151private function f_unblock_ptp_bvc_from_pcu(integer pcu_idx, integer bvc_idx) runs on test_CT
2152{
2153 var BSSGP_BVC_CT bvc_ct := g_pcu[pcu_idx].vc_BSSGP_BVC[bvc_idx];
2154 var BssgpBvcConfig bvc_cfg := g_pcu[pcu_idx].cfg.bvc[bvc_idx];
2155 var Nsei nsei_pcu := g_pcu[pcu_idx].cfg.nsei;
2156
2157 SGSN_MGMT.clear;
2158 PCU_MGMT.clear;
2159
2160 /* block the PTP BVC from the PCU side */
2161 PCU_MGMT.send(BssgpUnblockRequest:{}) to bvc_ct;
2162 /* expect state on both PCU and SGSN side to change */
2163 interleave {
2164 [] PCU_MGMT.receive(tr_BssgpStsInd(nsei_pcu, bvc_cfg.bvci, BVC_S_UNBLOCKED)) from bvc_ct;
2165 [] SGSN_MGMT.receive(tr_BssgpStsInd(*, bvc_cfg.bvci, BVC_S_UNBLOCKED));
2166 }
2167 setverdict(pass);
2168}
2169testcase TC_bvc_unblock_ptp() runs on test_CT
2170{
2171 f_init();
2172 f_sleep(1.0);
2173 f_block_ptp_bvc_from_pcu(0, 0);
2174 f_sleep(1.0);
2175 f_unblock_ptp_bvc_from_pcu(0, 0);
2176 f_cleanup();
2177}
2178
Harald Welte4f91c3b2020-12-09 12:25:51 +01002179/***********************************************************************
2180 * BVC-RESET procedure
2181 ***********************************************************************/
2182
Harald Welte60a8ec72020-11-25 17:12:53 +01002183private altstep as_ignore_status(BSSGP_BVC_MGMT_PT pt) {
2184[] pt.receive(BssgpStatusIndication:?) { repeat; }
2185}
2186private function f_get_sgsn_bvc_ct(integer sgsn_idx, BssgpBvci bvci) runs on test_CT return BSSGP_BVC_CT {
2187 for (var integer i := 0; i < lengthof(g_sgsn[sgsn_idx].cfg.bvc); i := i+1) {
2188 if (g_sgsn[sgsn_idx].cfg.bvc[i].bvci == bvci) {
2189 return g_sgsn[sgsn_idx].vc_BSSGP_BVC[i];
2190 }
2191 }
2192 return null;
2193}
2194private function f_reset_ptp_bvc_from_pcu(integer pcu_idx, integer bvc_idx) runs on test_CT
2195{
2196 var BSSGP_BVC_CT pcu_bvc_ct := g_pcu[pcu_idx].vc_BSSGP_BVC[bvc_idx];
2197 var BssgpBvcConfig bvc_cfg := g_pcu[pcu_idx].cfg.bvc[bvc_idx];
2198 var Nsei nsei_pcu := g_pcu[pcu_idx].cfg.nsei;
2199 var BSSGP_BVC_CT sgsn_bvc_ct := f_get_sgsn_bvc_ct(0, bvc_cfg.bvci);
2200 var default d;
2201
2202 SGSN_MGMT.clear;
2203 PCU_MGMT.clear;
2204
2205 /* block the PTP BVC from the PCU side */
2206 PCU_MGMT.send(BssgpResetRequest:{cause:=BSSGP_CAUSE_OM_INTERVENTION}) to pcu_bvc_ct;
2207 /* expect state on both PCU and SGSN side to change */
2208 d := activate(as_ignore_status(SGSN_MGMT));
2209 interleave {
2210 [] PCU_MGMT.receive(tr_BssgpStsInd(nsei_pcu, bvc_cfg.bvci, BVC_S_BLOCKED)) from pcu_bvc_ct;
2211 [] SGSN_MGMT.receive(BssgpResetIndication:{bvc_cfg.bvci}) from sgsn_bvc_ct;
2212 }
2213 deactivate(d);
2214 setverdict(pass);
2215}
2216/* Send a BVC-RESET for a PTP BVC from the BSS side: expect it to propagate */
2217testcase TC_bvc_reset_ptp_from_bss() runs on test_CT
2218{
2219 f_init();
2220 f_sleep(3.0);
2221 f_reset_ptp_bvc_from_pcu(0, 0);
2222 f_cleanup();
2223}
2224
Harald Welte16786e92020-11-27 19:11:56 +01002225private altstep as_count_bvc_block(integer sgsn_idx, BssgpBvci bvci, inout ro_integer roi)
2226runs on test_CT {
2227 var BSSGP_BVC_CT sgsn_bvc_ct := f_get_sgsn_bvc_ct(sgsn_idx, bvci);
2228 [] SGSN_MGMT.receive(tr_BssgpStsInd(?, bvci, BVC_S_BLOCKED)) from sgsn_bvc_ct {
2229 roi := roi & { bvci };
Harald Welteb2647f72020-12-07 14:36:35 +01002230 repeat;
Harald Welte16786e92020-11-27 19:11:56 +01002231 }
2232}
2233/* reset the signaling BVC from one BSS; expect no signaling BVC reset on SGSN; but BVC-BLOCK for PTP */
2234testcase TC_bvc_reset_sig_from_bss() runs on test_CT {
2235
2236 f_init();
2237 f_sleep(3.0);
2238
2239 /* Start BVC-RESET procedure for BVCI=0 */
2240 PCU_MGMT.send(BssgpResetRequest:{cause:=BSSGP_CAUSE_OM_INTERVENTION}) to g_pcu[0].vc_BSSGP;
2241
2242 /* Activate altsteps: One for each PTP BVC within that PCUs NSE */
2243 var ro_default defaults := {};
2244 for (var integer i := 0; i < lengthof(g_pcu[0].cfg.bvc); i := i+1) {
2245 var BssgpBvcConfig bvcc := g_pcu[0].cfg.bvc[i];
2246 var default d := activate(as_count_bvc_block(0, bvcc.bvci, g_roi));
2247 defaults := defaults & { d };
2248 }
2249
2250 timer T := 3.0;
2251 T.start;
2252 alt {
2253 [] SGSN_MGMT.receive(BssgpResetIndication:{0}) {
2254 setverdict(fail, "BSS-side Reset of BVCI=0 should not propagate");
2255 }
2256 [] T.timeout;
2257 }
2258
2259 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
2260 deactivate(defaults[i]);
2261 }
2262
2263 /* check if BVC-block was received on all expected BVC */
2264 for (var integer i := 0; i < lengthof(g_pcu[0].cfg.bvc); i := i+1) {
2265 var BssgpBvcConfig bvcc := g_pcu[0].cfg.bvc[i];
2266 if (not ro_integer_contains(g_roi, bvcc.bvci)) {
2267 setverdict(fail, "Missing SGSN-side BVC-BLOCK of BVCI=", bvcc.bvci);
2268 }
2269 }
2270
2271 /* check if BVC-block was not received on any unexpected BVC is not required as
2272 * such a message would basically run into 'no matching clause' */
Daniel Willmannf2590212020-12-04 14:20:50 +01002273 setverdict(pass);
Harald Welte16786e92020-11-27 19:11:56 +01002274 f_cleanup();
2275}
2276
Harald Welte60a8ec72020-11-25 17:12:53 +01002277private function f_reset_ptp_bvc_from_sgsn(integer pcu_idx, integer bvc_idx) runs on test_CT
2278{
2279 var BSSGP_BVC_CT pcu_bvc_ct := g_pcu[pcu_idx].vc_BSSGP_BVC[bvc_idx];
2280 var BssgpBvcConfig bvc_cfg := g_pcu[pcu_idx].cfg.bvc[bvc_idx];
2281 var Nsei nsei_pcu := g_pcu[pcu_idx].cfg.nsei;
2282 var BSSGP_BVC_CT sgsn_bvc_ct := f_get_sgsn_bvc_ct(0, bvc_cfg.bvci);
2283 var default d;
2284
2285 SGSN_MGMT.clear;
2286 PCU_MGMT.clear;
2287
2288 /* block the PTP BVC from the PCU side */
2289 SGSN_MGMT.send(BssgpResetRequest:{cause:=BSSGP_CAUSE_OM_INTERVENTION}) to sgsn_bvc_ct;
2290 /* expect state on both PCU and SGSN side to change */
2291 d := activate(as_ignore_status(PCU_MGMT));
2292 interleave {
2293 [] SGSN_MGMT.receive(tr_BssgpStsInd(?, bvc_cfg.bvci, BVC_S_BLOCKED)) from sgsn_bvc_ct;
2294 [] PCU_MGMT.receive(BssgpResetIndication:{bvc_cfg.bvci}) from pcu_bvc_ct;
2295 }
2296 deactivate(d);
2297 setverdict(pass);
2298}
2299/* Send a BVC-RESET for a PTP BVC from the SGSN side: expect it to propagate */
2300testcase TC_bvc_reset_ptp_from_sgsn() runs on test_CT
2301{
2302 f_init();
2303 f_sleep(3.0);
2304 f_reset_ptp_bvc_from_sgsn(0, 0);
2305 f_cleanup();
2306}
2307
Daniel Willmannef7015f2021-01-08 00:43:56 +01002308private altstep as_ignore_mgmt(BSSGP_BVC_MGMT_PT pt) {
2309 [] pt.receive {repeat; }
2310}
2311
Harald Welte16786e92020-11-27 19:11:56 +01002312private altstep as_count_bvc0_block(integer pcu_idx, Nsei nsei, inout ro_integer roi)
2313runs on test_CT {
2314 var BSSGP_CT pcu_ct := g_pcu[pcu_idx].vc_BSSGP;
2315 [] PCU_MGMT.receive(BssgpResetIndication:{0}) from pcu_ct {
2316 roi := roi & { nsei };
Daniel Willmannef7015f2021-01-08 00:43:56 +01002317 repeat;
Harald Welte16786e92020-11-27 19:11:56 +01002318 }
2319}
Daniel Willmannef7015f2021-01-08 00:43:56 +01002320
Harald Welte16786e92020-11-27 19:11:56 +01002321/* reset the signaling BVC from the SGSN; expect all signaling BVC on all BSS to be reset */
2322testcase TC_bvc_reset_sig_from_sgsn() runs on test_CT {
2323
2324 f_init();
2325 f_sleep(3.0);
2326
Daniel Willmannef7015f2021-01-08 00:43:56 +01002327 SGSN_MGMT.clear;
2328 PCU_MGMT.clear;
2329
Harald Welte16786e92020-11-27 19:11:56 +01002330 /* Start BVC-RESET procedure for BVCI=0 */
2331 SGSN_MGMT.send(BssgpResetRequest:{cause:=BSSGP_CAUSE_OM_INTERVENTION}) to g_sgsn[0].vc_BSSGP;
2332
Daniel Willmannef7015f2021-01-08 00:43:56 +01002333 /* Defaults match in reverse activation order, this one is a catch-all for Status indications
2334 * and reset indications sent from other components (like the ptp_bvcs). If we don't drain
2335 * the port and a different message sits at the front we wait forever and fail the test.
2336 */
2337 var ro_default defaults := { activate(as_ignore_mgmt(PCU_MGMT)) };
2338
Harald Welte16786e92020-11-27 19:11:56 +01002339 /* Activate altsteps: One for each PCU NSE */
Harald Welte16786e92020-11-27 19:11:56 +01002340 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
2341 var NSConfiguration nscfg := mp_nsconfig_pcu[i];
2342 var default d := activate(as_count_bvc0_block(i, nscfg.nsei, g_roi));
2343 defaults := defaults & { d };
2344 }
2345
2346 f_sleep(3.0);
2347
2348 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
2349 deactivate(defaults[i]);
2350 }
2351
2352 /* check if BVC-block was received on all expected BVC */
2353 for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
2354 var NSConfiguration nscfg := mp_nsconfig_pcu[i];
2355 if (not ro_integer_contains(g_roi, nscfg.nsei)) {
2356 setverdict(fail, "Missing PCU-side BVC-RESET of BVCI=0 on PCU index ", i);
2357 }
2358 }
2359
2360 /* check if BVC-block was not received on any unexpected BVC is not required as
2361 * such a message would basically run into 'no matching clause' */
2362
2363 f_cleanup();
2364}
2365
Harald Welte299aa482020-12-09 15:10:55 +01002366/***********************************************************************
2367 * FLOW-CONTROL-BVC procedure
2368 ***********************************************************************/
2369
2370private altstep as_g_count_sgsn(integer sgsn_idx, inout ro_integer roi,
2371 template PDU_BSSGP exp_rx, template (omit) PDU_BSSGP tx_reply)
2372runs on GlobalTest_CT {
2373 [] G_SGSN[sgsn_idx].receive(exp_rx) {
2374 roi := roi & { sgsn_idx };
2375 if (ispresent(tx_reply)) {
2376 G_SGSN[sgsn_idx].send(tx_reply);
2377 }
2378 }
2379}
2380/* Send FC-BVC from simulated PCU; expect each SGSN to receive it; expect PCU to receive ACK */
2381testcase TC_fc_bvc() runs on GlobalTest_CT
2382{
2383 f_init();
2384 f_global_init_ptp();
2385
2386 var template (value) PDU_BSSGP pdu_tx := t_BVC_FC_BVC(10240, 2000, 1024, 1000, '01'O);
2387 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
2388 var template (present) PDU_BSSGP pdu_rx := tr_BVC_FC_BVC(10240, 2000, 1024, 1000, '01'O);
2389 var template (omit) PDU_BSSGP ack_tx :=
2390 t_BVC_FC_BVC_ACK(pdu_tx.pDU_BSSGP_FLOW_CONTROL_BVC.tag.unstructured_Value);
2391
2392 /* Send a FC-BVC from BSS to gbproxy, expect an ACK in response */
2393 G_PCU[0].send(pdu_tx);
2394
2395 /* Activate altsteps: One for each SGSN-side PTP BVC port */
2396 var ro_default defaults := {};
2397 for (var integer i := 0; i < lengthof(g_sgsn); i := i+1) {
2398 var default d := activate(as_g_count_sgsn(i, g_roi, pdu_rx, ack_tx));
2399 defaults := defaults & { d };
2400 }
2401
2402 f_sleep(3.0);
2403
2404 for (var integer i := 0; i < lengthof(defaults); i := i+1) {
2405 deactivate(defaults[i]);
2406 }
2407
2408 /* check if BVC-block was received on all expected BVC */
2409 for (var integer i := 0; i < lengthof(g_sgsn); i := i+1) {
2410 if (not ro_integer_contains(g_roi, i)) {
2411 setverdict(fail, "Missing BVC-FLOW-CONTROL on SGSN index ", i);
2412 }
2413 }
2414
2415 /* Expect ACK on PCU side */
2416 G_PCU[0].receive(ack_tx);
2417
2418 setverdict(pass);
2419
2420 f_cleanup();
2421}
2422
Harald Weltecc3894b2020-12-09 16:50:12 +01002423/***********************************************************************
2424 * FLOW-CONTROL-MS procedure
2425 ***********************************************************************/
2426
2427private function f_TC_fc_ms(charstring id) runs on BSSGP_ConnHdlr {
2428 var BssgpBvci bvci := g_pars.pcu[0].cfg.bvc[0].bvci;
2429
2430 var template (value) PDU_BSSGP fc_tx := ts_BVC_FC_MS(g_pars.tlli, 100, 200, '12'O);
2431 /* we cannot use pdu_tx as there are some subtle differences in the length field :/ */
2432 var template (present) PDU_BSSGP fc_rx := tr_BVC_FC_MS(g_pars.tlli, 100, 200, '12'O);
2433 var template (value) PDU_BSSGP ack_tx := ts_BVC_FC_MS_ACK(g_pars.tlli, '12'O);
2434
2435 f_pcu2sgsn(fc_tx, fc_rx, use_sig := false);
2436 f_sgsn2pcu(ack_tx, ack_tx, use_sig := false);
2437
2438 setverdict(pass);
2439}
2440/* Send a FLOW-CONTROL-MS from BSS side and expect it to show up on SGSN (PTP BVC) */
2441testcase TC_fc_ms() runs on test_CT
2442{
2443 var BSSGP_ConnHdlr vc_conn;
2444 f_init();
2445
2446 vc_conn := f_start_handler(refers(f_TC_fc_ms), testcasename(), g_pcu, g_sgsn, 21);
2447 vc_conn.done;
2448 /* TODO: start multiple handlers (UEs) on various cells on same and other NSEs */
2449
2450 f_cleanup();
2451}
2452
2453
Harald Welte299aa482020-12-09 15:10:55 +01002454
Daniel Willmann423d8f42020-09-08 18:58:22 +02002455control {
2456 execute( TC_BVC_bringup() );
Harald Welte92686012020-11-15 21:45:49 +01002457 execute( TC_ul_unitdata() );
Harald Welte78d8db92020-11-15 23:27:27 +01002458 execute( TC_dl_unitdata() );
Harald Welte6dc2ac42020-11-16 09:16:17 +01002459 execute( TC_ra_capability() );
Daniel Willmannace3ece2020-11-16 19:53:26 +01002460 execute( TC_ra_capability_upd() );
Daniel Willmann165d6612020-11-19 14:27:29 +01002461 execute( TC_radio_status() );
Daniel Willmannfa67f492020-11-19 15:48:05 +01002462 execute( TC_suspend() );
Daniel Willmann087a33d2020-11-19 15:58:43 +01002463 execute( TC_resume() );
Harald Weltef8e5c5d2020-11-27 22:37:23 +01002464 execute( TC_trace() );
Harald Weltec0351d12020-11-27 22:49:02 +01002465 execute( TC_llc_discarded() );
Harald Weltef20af412020-11-28 16:11:11 +01002466 execute( TC_overload() );
Harald Welte239aa502020-11-24 23:14:20 +01002467 execute( TC_bvc_block_ptp() );
2468 execute( TC_bvc_unblock_ptp() );
Harald Welte60a8ec72020-11-25 17:12:53 +01002469 execute( TC_bvc_reset_ptp_from_bss() );
Harald Welte16786e92020-11-27 19:11:56 +01002470 execute( TC_bvc_reset_sig_from_bss() );
Harald Welte60a8ec72020-11-25 17:12:53 +01002471 execute( TC_bvc_reset_ptp_from_sgsn() );
Harald Welte16786e92020-11-27 19:11:56 +01002472 execute( TC_bvc_reset_sig_from_sgsn() );
Harald Weltef6e59b02020-12-08 08:29:09 +01002473 if (mp_enable_bss_load_sharing) {
Harald Weltef8ef0282020-11-18 12:16:59 +01002474 /* don't enable this by default, as we don't yet have any automatic test setup for FR with 4 NS-VC */
2475 execute( TC_load_sharing_dl() );
2476 }
Harald Welte0e188242020-11-22 21:46:48 +01002477
2478 /* PAGING-PS over PTP BVC */
2479 execute( TC_paging_ps_ptp_bss() );
2480 execute( TC_paging_ps_ptp_lac() );
Harald Welte7462a592020-11-23 22:07:07 +01002481 execute( TC_paging_ps_ptp_lac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002482 execute( TC_paging_ps_ptp_rac() );
Harald Welte7462a592020-11-23 22:07:07 +01002483 execute( TC_paging_ps_ptp_rac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002484 execute( TC_paging_ps_ptp_bvci() );
Harald Welte7462a592020-11-23 22:07:07 +01002485 execute( TC_paging_ps_ptp_bvci_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002486
2487 /* PAGING-PS over SIG BVC */
2488 execute( TC_paging_ps_sig_bss() );
2489 execute( TC_paging_ps_sig_lac() );
Harald Welte7462a592020-11-23 22:07:07 +01002490 execute( TC_paging_ps_sig_lac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002491 execute( TC_paging_ps_sig_rac() );
Harald Welte7462a592020-11-23 22:07:07 +01002492 execute( TC_paging_ps_sig_rac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002493 execute( TC_paging_ps_sig_bvci() );
Harald Welte7462a592020-11-23 22:07:07 +01002494 execute( TC_paging_ps_sig_bvci_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002495
2496 /* PAGING-CS over PTP BVC */
2497 execute( TC_paging_cs_ptp_bss() );
2498 execute( TC_paging_cs_ptp_lac() );
Harald Welte7462a592020-11-23 22:07:07 +01002499 execute( TC_paging_cs_ptp_lac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002500 execute( TC_paging_cs_ptp_rac() );
Harald Welte7462a592020-11-23 22:07:07 +01002501 execute( TC_paging_cs_ptp_rac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002502 execute( TC_paging_cs_ptp_bvci() );
Harald Welte7462a592020-11-23 22:07:07 +01002503 execute( TC_paging_cs_ptp_bvci_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002504
2505 /* PAGING-CS over SIG BVC */
2506 execute( TC_paging_cs_sig_bss() );
2507 execute( TC_paging_cs_sig_lac() );
Harald Welte7462a592020-11-23 22:07:07 +01002508 execute( TC_paging_cs_sig_lac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002509 execute( TC_paging_cs_sig_rac() );
Harald Welte7462a592020-11-23 22:07:07 +01002510 execute( TC_paging_cs_sig_rac_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002511 execute( TC_paging_cs_sig_bvci() );
Harald Welte7462a592020-11-23 22:07:07 +01002512 execute( TC_paging_cs_sig_bvci_unknown() );
Harald Welte0e188242020-11-22 21:46:48 +01002513
2514
Daniel Willmann91a8e25b2020-11-24 14:50:59 +01002515 execute( TC_flush_ll() );
Harald Welte299aa482020-12-09 15:10:55 +01002516 execute( TC_fc_bvc() );
Harald Weltecc3894b2020-12-09 16:50:12 +01002517 execute( TC_fc_ms() );
Daniel Willmann423d8f42020-09-08 18:58:22 +02002518}
2519
2520
2521}