blob: 1648a92857bab5ad62eafeab7a5cd0e11561a3d0 [file] [log] [blame]
Harald Weltea0895f92018-03-08 11:51:23 +01001module PCU_Tests {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002
3/* "RAW" PCU tests: Talk directly to the PCU socket of OsmoPCU on the one hand side (emulating
4 the BTS/BSC side PCU socket server) and the Gb interface on the other hand side. No NS/BSSGP
5 Emulation is used; rather, we simply use the NS_CodecPort to implement both standard and non-
6 standard procedures on the NS and BSSGP level. The goal of these tests is to test exactly
7 those NS and BSSGP implementations on the BSS (PCU) side. */
8
9/* (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +070010 * (C) 2019-2020 Vadim Yanitskiy <axilirator@gmail.com>
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020011 * All rights reserved.
12 *
13 * Released under the terms of GNU General Public License, Version 2 or
14 * (at your option) any later version.
15 *
16 * SPDX-License-Identifier: GPL-2.0-or-later
17 */
18
19friend module PCU_Tests_NS;
20
21import from General_Types all;
22import from Osmocom_Types all;
23import from GSM_Types all;
24import from GSM_RR_Types all;
Vadim Yanitskiy150d6d12022-10-20 19:10:04 +070025import from GSM_RestOctets all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020026
27import from Osmocom_VTY_Functions all;
28import from TELNETasp_PortType all;
29
30import from MobileL3_GMM_SM_Types all;
31import from RLCMAC_CSN1_Types all;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020032import from RLCMAC_CSN1_Templates all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020033import from RLCMAC_Types all;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020034import from RLCMAC_Templates all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020035
36import from MobileL3_CommonIE_Types all;
37import from L3_Templates all;
38
39import from NS_Types all;
40import from BSSGP_Types all;
41import from Osmocom_Gb_Types all;
42
43import from BSSGP_Emulation all; /* BssgpConfig */
44import from NS_Emulation all; /* NSConfiguration */
45
46import from UD_Types all;
47import from PCUIF_Types all;
48import from PCUIF_CodecPort all;
49import from PCUIF_Components all;
50import from IPL4asp_Types all;
51import from Native_Functions all;
52import from SGSN_Components all;
Pau Espin Pedrolaedc5112020-05-16 17:30:42 +020053import from GPRS_Components all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020054
Daniel Willmann535aea62020-09-21 13:27:08 +020055import from StatsD_Types all;
56import from StatsD_CodecPort all;
57import from StatsD_CodecPort_CtrlFunct all;
58import from StatsD_Checker all;
59
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010060import from IPA_Emulation all;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +010061import from Osmocom_CTRL_Types all;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010062import from Osmocom_CTRL_Adapter all;
63import from Osmocom_CTRL_Functions all;
64
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020065modulepar {
66 charstring mp_pcu_sock_path := PCU_SOCK_DEFAULT;
67
68 float X2002 := 0.2; /* Timer -2002, IMM ASSIGN confirm delay */
Daniel Willmann535aea62020-09-21 13:27:08 +020069
70 charstring mp_pcu_statsd_ip := "127.0.0.1";
71 integer mp_pcu_statsd_port := 8125;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010072
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +020073 charstring mp_ctrl_neigh_ip := ""; /* Use new PCUIF over IPA multiplex for Neigh Addr Resolution */
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010074 integer mp_ctrl_neigh_port := 4248;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020075}
76
77
78/* FIXME: make sure to use parameters from mp_gb_cfg.cell_id in the PCU INFO IND */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +010079friend template (value) PCUIF_info_ind ts_PCUIF_INFO_default(template (value) PCUIF_Flags flags := c_PCUIF_Flags_default)
80:= {
Vadim Yanitskiyc1559302020-07-19 16:39:12 +070081 version := PCUIF_Types.mp_pcuif_version,
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +010082 flags := flags,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +010083 trx := ts_PCUIF_InfoTrxs_def(GPRS_Components.mp_base_arfcn),
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020084 bsic := 7,
85 mcc := 262,
86 mnc := 42,
87 mnc_3_digits := 0,
88 lac := 13135,
89 rac := 0,
90 nsei := mp_nsconfig.nsei,
91 nse_timer := { 3, 3, 3, 3, 30, 3, 10 },
92 cell_timer := { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 },
93 cell_id := 20960,
94 repeat_time := 5 * 50,
95 repeat_count := 3,
Harald Welte5339b2e2020-10-04 22:52:56 +020096 bvci := mp_gb_cfg.bvc[0].bvci,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020097 t3142 := 20,
98 t3169 := 5,
99 t3191 := 5,
100 t3193_10ms := 160,
101 t3195 := 5,
Pau Espin Pedrol76de1662021-03-01 17:40:58 +0100102 n3101 := 10,
103 n3103 := 4,
104 n3105 := 8,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200105 cv_countdown := 15,
106 dl_tbf_ext := 250 * 10, /* ms */
107 ul_tbf_ext := 250 * 10, /* ms */
108 initial_cs := 2,
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +0100109 initial_mcs := 1,
Harald Welte90f19742020-11-06 19:34:40 +0100110 nsvci := { mp_nsconfig.nsvc[0].nsvci, 0 },
111 local_port := { mp_nsconfig.nsvc[0].provider.ip.remote_udp_port, 0 },
112 remote_port := { mp_nsconfig.nsvc[0].provider.ip.local_udp_port, 0 },
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100113 remote_addr := f_PCUIF_RemoteAddr(
Harald Welte90f19742020-11-06 19:34:40 +0100114 f_PCUIF_AF2addr_type(mp_nsconfig.nsvc[0].provider.ip.address_family), mp_nsconfig.nsvc[0].provider.ip.local_ip)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200115}
116
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100117/* Passed in RAN-INFO message from emulated neighbor using RIM */
118const octetstring si1_default := '198fb100000000000000000000000000007900002b'O;
119const octetstring si3_default := '1b753000f110236ec9033c2747407900003c0b2b2b'O;
120const octetstring si13_default := '009000185a6fc9e08410ab2b2b2b2b2b2b2b2b2b2b'O;
121const octetstring si_default := si1_default & si3_default & si13_default;
122
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +0100123const MultislotCap_GPRS mscap_gprs_def := {
124 gprsmultislotclass := '00011'B,
125 gprsextendeddynalloccap := '0'B
126};
127const MultislotCap_EGPRS mscap_egprs_def := {
128 egprsmultislotclass := '00011'B,
129 egprsextendeddynalloccap := '0'B
130};
131template (value) MSRadioAccessCapabilityV ms_racap_gprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, omit) };
132template (value) MSRadioAccessCapabilityV ms_racap_egprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, mscap_egprs_def) };
133
134const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs_def := {
135 gprsmultislotclass := '00011'B,
136 gprsextendeddynalloccap := '0'B
137};
138const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs_def := {
139 egprsmultislotclass := '00011'B,
140 egprsextendeddynalloccap := '0'B
141};
142template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, omit)) };
143template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, bssgp_mscap_egprs_def)) };
144
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200145type record lqual_range {
146 /* component reference to the IPA_Client component used for RSL */
147 uint8_t low,
148 uint8_t high
149}
150
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +0100151type component RAW_PCU_Test_CT extends bssgp_CT, MS_BTS_IFACE_CT, StatsD_ConnHdlr, CTRL_Adapter_CT {
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700152 /* PCU interface abstraction component */
153 var RAW_PCUIF_CT vc_PCUIF;
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700154
Daniel Willmann535aea62020-09-21 13:27:08 +0200155 /* StatsD */
156 var StatsD_Checker_CT vc_STATSD;
157
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200158 /* Connection to the PCUIF component */
159 port RAW_PCU_MSG_PT PCUIF;
160 /* VTY connection to the PCU */
161 port TELNETasp_PT PCUVTY;
162
163 /* Uplink CS/MCS thresholds, default from pcu_main.c: */
164 var lqual_range g_cs_lqual_ranges[4] := {{low := 0, high := 6},
165 {low := 5, high := 8},
166 {low := 7, high := 13},
167 {low := 12,high := 35}};
168 var lqual_range g_mcs_lqual_ranges[9] := {{low := 0, high := 6},
169 {low := 5, high := 8},
170 {low := 7, high := 13},
171 {low := 12,high := 15},
172 {low := 14, high := 17},
173 {low := 16, high := 18},
174 {low := 17,high := 20},
175 {low := 19, high := 24},
176 {low := 23,high := 35}};
177 var uint8_t g_cs_initial_dl := 1;
178 var uint8_t g_cs_initial_ul := 1;
179 var uint8_t g_mcs_initial_dl := 1;
180 var uint8_t g_mcs_initial_ul := 1;
181 var uint8_t g_cs_max_dl := 4;
182 var uint8_t g_cs_max_ul := 4;
183 var uint8_t g_mcs_max_dl := 9;
184 var uint8_t g_mcs_max_ul := 9;
185
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200186 var boolean g_force_two_phase_access := false;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200187
188 /* Guard timeout */
189 timer g_T_guard := 60.0;
190};
191
192private altstep as_Tguard_RAW() runs on RAW_PCU_Test_CT {
193 [] g_T_guard.timeout {
194 setverdict(fail, "Timeout of T_guard");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700195 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200196 }
197}
198
199private function f_pcuvty_set_allowed_cs_mcs() runs on RAW_PCU_Test_CT {
200 f_vty_config2(PCUVTY, {"pcu"}, "cs " & int2str(g_cs_initial_dl) & " " & int2str(g_cs_initial_ul));
201 f_vty_config2(PCUVTY, {"pcu"}, "cs max " & int2str(g_cs_max_dl) & " " & int2str(g_cs_max_ul));
202
203 f_vty_config2(PCUVTY, {"pcu"}, "mcs " & int2str(g_mcs_initial_dl) & " " & int2str(g_mcs_initial_ul));
204 f_vty_config2(PCUVTY, {"pcu"}, "mcs max " & int2str(g_mcs_max_dl) & " " & int2str(g_mcs_max_ul));
205}
206
207private function f_pcuvty_set_link_quality_ranges() runs on RAW_PCU_Test_CT {
208 var charstring cmd;
209
210 cmd := "cs link-quality-ranges" &
211 " cs1 " & int2str(g_cs_lqual_ranges[0].high) &
212 " cs2 " & int2str(g_cs_lqual_ranges[1].low) & " " & int2str(g_cs_lqual_ranges[1].high) &
213 " cs3 " & int2str(g_cs_lqual_ranges[2].low) & " " & int2str(g_cs_lqual_ranges[2].high) &
214 " cs4 " & int2str(g_cs_lqual_ranges[3].low);
215 f_vty_config2(PCUVTY, {"pcu"}, cmd);
216
217 cmd := "mcs link-quality-ranges" &
218 " mcs1 " & int2str(g_mcs_lqual_ranges[0].high) &
219 " mcs2 " & int2str(g_mcs_lqual_ranges[1].low) & " " & int2str(g_mcs_lqual_ranges[1].high) &
220 " mcs3 " & int2str(g_mcs_lqual_ranges[2].low) & " " & int2str(g_mcs_lqual_ranges[2].high) &
221 " mcs4 " & int2str(g_mcs_lqual_ranges[3].low) & " " & int2str(g_mcs_lqual_ranges[3].high) &
222 " mcs5 " & int2str(g_mcs_lqual_ranges[4].low) & " " & int2str(g_mcs_lqual_ranges[4].high) &
223 " mcs6 " & int2str(g_mcs_lqual_ranges[5].low) & " " & int2str(g_mcs_lqual_ranges[5].high) &
224 " mcs7 " & int2str(g_mcs_lqual_ranges[6].low) & " " & int2str(g_mcs_lqual_ranges[6].high) &
225 " mcs8 " & int2str(g_mcs_lqual_ranges[7].low) & " " & int2str(g_mcs_lqual_ranges[7].high) &
226 " mcs9 " & int2str(g_mcs_lqual_ranges[8].low);
227 f_vty_config2(PCUVTY, {"pcu"}, cmd);
228}
229
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100230private function f_pcuvty_flush_neigh_caches() runs on RAW_PCU_Test_CT {
231 f_pcuvty_set_neigh_caches(0, 0);
232}
233
234private function f_pcuvty_set_neigh_caches(integer neigh_cache_secs := -1, integer si_cache_secs := -1)
235runs on RAW_PCU_Test_CT {
236 if (neigh_cache_secs == -1) {
237 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 default");
238 } else {
239 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 " & int2str(neigh_cache_secs));
240 }
241 if (si_cache_secs == -1) {
242 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 default");
243 } else {
244 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 " & int2str(si_cache_secs));
245 }
246}
247
Pau Espin Pedrole8a94442021-11-15 17:05:46 +0100248private function f_pcuvty_set_timer(integer t, integer val)
249runs on RAW_PCU_Test_CT {
250 if (t >= 0) {
251 f_vty_config2(PCUVTY, {"pcu"}, "timer T" & int2str(t) & " " & int2str(val));
252 } else {
253 f_vty_config2(PCUVTY, {"pcu"}, "timer X" & int2str(t * -1) & " " & int2str(val));
254 }
255}
256
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100257private function f_init_vty(charstring id, boolean egprs_only) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200258 map(self:PCUVTY, system:PCUVTY);
259 f_vty_set_prompts(PCUVTY);
260 f_vty_transceive(PCUVTY, "enable");
261
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100262 /* This will be removed soon, not needed. EGPRS support is controlled through pcu_ind flags */
263 if (egprs_only) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200264 f_vty_config2(PCUVTY, {"pcu"}, "egprs only");
265 } else {
266 f_vty_config2(PCUVTY, {"pcu"}, "no egprs");
267 }
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200268
269 if (g_force_two_phase_access) {
270 f_vty_config2(PCUVTY, {"pcu"}, "two-phase-access");
271 } else {
272 f_vty_config2(PCUVTY, {"pcu"}, "no two-phase-access");
273 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200274}
275
Pau Espin Pedrol2456dad2020-04-30 20:22:38 +0200276function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200277runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200278 /* Start the guard timer */
279 g_T_guard.start;
280 activate(as_Tguard_RAW());
281
282 /* Init PCU interface component */
Pau Espin Pedrol835fd302022-02-22 17:04:06 +0100283 vc_PCUIF := RAW_PCUIF_CT.create("PCUIF") alive;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200284 connect(vc_PCUIF:MTC, self:PCUIF);
285 map(vc_PCUIF:PCU, system:PCU);
286
287 /* Create one BTS component (we may want more some day) */
Pau Espin Pedrol835fd302022-02-22 17:04:06 +0100288 vc_BTS := RAW_PCU_BTS_CT.create("BTS") alive;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200289 connect(vc_BTS:PCUIF, vc_PCUIF:BTS);
290 connect(vc_BTS:TC, self:BTS);
291
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100292 f_init_vty(id, f_pcuif_ind_flags_egprs_enabled(valueof(info_ind.flags)));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200293
Daniel Willmann535aea62020-09-21 13:27:08 +0200294 f_init_statsd(id, vc_STATSD, mp_pcu_statsd_ip, mp_pcu_statsd_port);
295 /* This is normally done in the ConnHdlr component, but here
296 * the Test_CT doubles as ConnHdlr */
297 connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
298
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200299 vc_PCUIF.start(f_PCUIF_CT_handler(mp_pcu_sock_path));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100300 vc_BTS.start(f_BTS_CT_handler(0, valueof(info_ind), true));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200301
302 /* Wait until the BTS is ready (SI13 negotiated) */
303 BTS.receive(tr_RAW_PCU_EV(BTS_EV_SI13_NEGO));
304}
305
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700306/* Register TLLI of each allocated GprsMS instance */
307private function f_multi_ms_bssgp_register()
308runs on RAW_PCU_Test_CT {
309 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
310 f_bssgp_client_llgmm_assign(TLLI_UNUSED, g_ms[i].tlli);
311 }
312}
313
314/* Allocate [and activate] an Uplink TBF for each allocated GprsMS instance */
315private function f_multi_ms_establish_tbf(boolean do_activate := false)
316runs on RAW_PCU_Test_CT {
317 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
318 /* Establish an Uplink TBF */
319 f_ms_establish_ul_tbf(g_ms[i]);
320
321 /* Send a random block, so this TBF becomes "active" */
322 if (do_activate) {
323 /* FIXME: use the new APU by Pau to get correct TRX/TS here */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100324 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, i mod 8);
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700325 var octetstring dummy := f_rnd_octstring(12);
326 var RlcmacDlBlock dl_block;
327 var uint32_t poll_fn;
328
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200329 f_ms_tx_ul_data_block(g_ms[i], dummy, with_tlli := true, fn := g_ms[i].ul_tbf.start_time_fn, nr := nr);
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700330 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := nr);
331 }
332 }
333}
334
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100335private function f_ms_establish_ul_tbf_2phase_access(inout GprsMS ms,
336 template (omit) RlcmacUlCtrlMsg pkt_res_req := omit)
337runs on RAW_PCU_Test_CT return PollFnCtx {
338 var PollFnCtx pollctx;
339
340 /* Single block (two phase) packet access */
341 var uint16_t ra := bit2int(chan_req_sb);
342 if (g_force_two_phase_access) {
343 /* If 2phase access is enforced by the network, then let's
344 * request a One phase packet access, we'll receive a single block
345 * anyway
346 */
347 ra := bit2int(chan_req_def);
348 }
349
350 /* Establish an Uplink TBF */
351 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
352 f_ms_establish_ul_tbf(ms);
353
354 /* Make sure we've got an Uplink TBF assignment */
355 if (not match(ms.ul_tbf.ass.ccch, tr_PacketUlSglAssign)) {
356 setverdict(fail, "Wrong Packet Uplink Assignment received: ", ms.ul_tbf.ass.ccch, " vs exp: ", tr_PacketUlSglAssign);
357 f_shutdown(__BFILE__, __LINE__);
358 }
359
360 /* Send PACKET RESOURCE REQUEST
361 * (see 3GPP TS 04.60 "7.1.3.1 Initiation of the Packet resource request procedure")
362 */
363 if (istemplatekind(pkt_res_req, "omit")) {
364 pkt_res_req := ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit);
365 }
366
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200367 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(valueof(pkt_res_req)), ms.ul_tbf.start_time_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100368 /* Store 1st UlTBF context before receiving next one, will
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100369 * overwrite the TS allocation on MS with info from new UL TBF:
370 */
371 pollctx.tstrxbts := f_ms_tx_TsTrxBtsNum(ms);
372 f_ms_rx_pkt_ass_pacch(ms, pollctx.fn, tr_RLCMAC_UL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
373 return pollctx;
374}
375
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200376testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +0200377 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
Pau Espin Pedrol2889f872021-01-11 14:43:35 +0100378 var GprsTlli tlli := TLLI_UNUSED;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200379 timer T;
380
381 /* Initialize NS/BSSGP side */
382 f_init_bssgp();
383
384 /* Initialize the PCU interface abstraction */
385 f_init_raw(testcasename());
386
387 /* Establish BSSGP connection to the PCU */
388 f_bssgp_establish();
389
390 BTS.send(ts_PCUIF_SUSP_REQ(0, tlli, ra_id, 0));
391
392 T.start(2.0);
393 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100394 [] BSSGP_GLOBAL[0].receive(tr_BSSGP_SUSPEND(tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200395 setverdict(pass);
396 }
397 [] T.timeout {
398 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
399 }
400 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700401
402 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200403}
404
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100405/* Make sure TBF is released and no data is sent for in after reciving a Suspend Request from that MS. See OS#4761 */
406testcase TC_pcuif_suspend_active_tbf() runs on RAW_PCU_Test_CT {
407 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200408 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100409 var RlcmacDlBlock dl_block;
410 var octetstring data := f_rnd_octstring(10);
411 var uint32_t sched_fn;
412 var uint32_t dl_fn;
413 var GprsMS ms;
414 timer T;
415
416 /* Initialize NS/BSSGP side */
417 f_init_bssgp();
418 /* Initialize GPRS MS side */
419 f_init_gprs_ms();
420 ms := g_ms[0]; /* We only use first MS in this test */
421
422 /* Initialize the PCU interface abstraction */
423 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
424
425 /* Establish BSSGP connection to the PCU */
426 f_bssgp_establish();
427 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
428
429 /* Establish an Uplink TBF */
430 f_ms_establish_ul_tbf(ms);
431
432 /* Send one UL block (with TLLI since we are in One-Phase Access
433 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200434 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100435 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
436 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
437 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
438
439 /* UL block should be received in SGSN */
440 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
441
442 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
443 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
444 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
445
446 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
447 f_sleep(X2002);
448 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
449
450 /* MS has moved to CS, it sent SUSP REQ to BTS and PCU gets it, TBF is freed: */
451 BTS.send(ts_PCUIF_SUSP_REQ(0, ms.tlli, ra_id, 0));
452
453 T.start(2.0);
454 alt {
455 [] BSSGP_GLOBAL[0].receive(tr_BSSGP_SUSPEND(ms.tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
456 setverdict(pass);
457 }
458 [] T.timeout {
459 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
460 f_shutdown(__BFILE__, __LINE__);
461 }
462 }
463
464 /* Make sure we don't receive data for that TBF since it was released
465 * before. Also check our TBF is not polled for UL. */
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200466 f_pcuif_rx_data_req_pdtch(data_msg);
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +0100467 if (data_msg.dl_block == omit) {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200468 /* IDLE block, expected on new PCU versions */
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200469 } else {
470 setverdict(fail, "Unexpected dl_block", data_msg.dl_block);
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100471 f_shutdown(__BFILE__, __LINE__);
472 }
473
474 /* New data arrives, PCU should page the MS since no TBF active exists: */
475 /* Send some more data, it will never reach the MS */
476 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
477 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
478
479 f_shutdown(__BFILE__, __LINE__, final := true);
480}
481
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200482/* Test of correct Timing Advance at the time of TBF establishment
483 * (derived from timing offset of the Access Burst). */
484testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200485 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200486
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200487 /* Initialize GPRS MS side */
488 f_init_gprs_ms();
489 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200490 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100491 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200492
493 /* We cannot send too many TBF requests in a short time because
494 * at some point the PCU will fail to allocate a new TBF. */
495 for (var TimingAdvance ta := 0; ta < 64; ta := ta + 16) {
496 /* Establish an Uplink TBF (send RACH.ind with current TA) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200497 ms.ta := ta;
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700498 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200499
500 /* Make sure Timing Advance IE matches out expectations */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200501 if (ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance != ta) {
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700502 setverdict(fail, "Timing Advance mismatch: ",
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200503 ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance,
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700504 " vs expected ", ta);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700505 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200506 }
507 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700508
509 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200510}
511
Vadim Yanitskiy866f8702021-05-26 14:50:27 +0200512/* Verify Timing Advance value indicated in Packet Uplink ACK/NACK message
513 * sent in response to the first Uplink block after resource allocation. */
514testcase TC_ta_ul_ack_nack_first_block() runs on RAW_PCU_Test_CT {
515 var GprsMS ms := valueof(t_GprsMS_def);
516 var PacketUlAckNack ul_ack_nack;
517 var PacketTimingAdvance pkt_ta;
518 var RlcmacDlBlock dl_block;
519 var uint32_t sched_fn;
520
521 /* Initialize NS/BSSGP side */
522 f_init_bssgp();
523
524 /* Initialize the PCU interface abstraction */
525 f_init_raw(testcasename());
526
527 /* Establish BSSGP connection to the PCU */
528 f_bssgp_establish();
529 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
530
531 /* Establish an Uplink TBF */
532 f_ms_establish_ul_tbf(ms);
533
534 /* In a busy network, there can be a significant delay between resource
535 * allocation (Packet Uplink Assignment above) and the actual time when
536 * the MS is allowed to transmit the first Uplink data block. */
537
538 /* Simulate a delay > 0 */
539 ms.ta := 2;
540
541 /* We're in One-Phase Access contention resoultion, include TLLI */
542 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
543 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
544
545 ul_ack_nack := dl_block.ctrl.payload.u.ul_ack_nack;
546 if (ispresent(ul_ack_nack.gprs.pkt_ta)) {
547 pkt_ta := ul_ack_nack.gprs.pkt_ta;
548 } else if (ispresent(ul_ack_nack.egprs.pkt_ta)) {
549 pkt_ta := ul_ack_nack.egprs.pkt_ta;
550 } else {
551 setverdict(fail, "PacketTimingAdvance IE is not present");
552 f_shutdown(__BFILE__, __LINE__);
553 }
554
555 if (not ispresent(pkt_ta.val)) {
556 setverdict(fail, "Timing Advance value is not present");
557 f_shutdown(__BFILE__, __LINE__);
558 } else if (pkt_ta.val != ms.ta) {
559 setverdict(fail, "Timing Advance mismatch: expected ",
560 ms.ta, ", but received ", pkt_ta.val);
561 f_shutdown(__BFILE__, __LINE__);
562 }
563}
564
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200565/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
566 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
567 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
568 * no active TBF exists at the moment of establishment (idle mode). */
569testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100570 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200571
572 /* Initialize NS/BSSGP side */
573 f_init_bssgp();
574
575 /* Initialize the PCU interface abstraction */
576 f_init_raw(testcasename());
577
578 /* Establish BSSGP connection to the PCU */
579 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100580 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200581
582 /* SGSN sends some DL data, PCU will initiate Packet Downlink
583 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100584 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
585 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200586
587 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
588 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
589 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100590 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700591 setverdict(fail, "Timing Advance value doesn't match");
592 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700593
594 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200595}
596
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200597/* Verify that the PCU generates idle blocks in PTCCH/D
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200598 * while neither Uplink nor Downlink TBF is established. */
599testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100600 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200601 timer T;
602
603 /* Initialize the PCU interface abstraction */
604 f_init_raw(testcasename());
605
606 /* Sent an RTS.req for PTCCH/D */
607 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
608 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
609 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100610
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200611 T.start(5.0);
612 alt {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200613 [] BTS.receive(tr_PCUIF_DATA_PTCCH(0,
614 tr_PCUIF_DATA(0, 7, sapi := PCU_IF_SAPI_PTCCH),
615 omit)) {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200616 }
617 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg) {
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +0100618 setverdict(fail, "Expected IDLE block instead of PTCCH/D block");
619 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200620 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200621 [] BTS.receive(PCUIF_Message:?) { repeat; }
622 [] T.timeout {
623 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700624 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200625 }
626 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100627 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700628
629 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200630}
631
632/* Test of correct Timing Advance during an active Uplink TBF.
633 *
634 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
635 * are not continuous and there can be long time gaps between them. This happens
636 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
637 * significantly change between such rare Uplink transmissions, so GPRS introduces
638 * additional mechanisms to control Timing Advance, and thus reduce interference
639 * between neighboring TDMA time-slots.
640 *
641 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
642 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
643 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
644 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
645 * among with the initial Timing Advance value. And here PTCCH comes to play.
646 *
647 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
648 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
649 * continuously. To ensure continuous measurements of the signal propagation
650 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
651 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
652 *
653 * The purpose of this test case is to verify the assignment of Timing Advance
654 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
655 * first establishes several Uplink TBFs, but does not transmit any Uplink
656 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
657 * indications to the PCU, checking the correctness of two received PTCCH/D
658 * messages (period of PTCCH/D is two multi-frames).
659 */
660
661/* List of ToA values for Access Bursts to be sent on PTCCH/U,
662 * each ToA (Timing of Arrival) value is in units of 1/4 of
663 * a symbol (i.e. 1 symbol is 4 QTA units). */
664type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
665const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
666 0, 0, 0, 0,
667 0, 0, 0, 0,
668 0, 0, 0, 0,
669 0, 0, 0, 0
670};
671
672private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
673 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
674runs on RAW_PCU_Test_CT {
675 var RAW_PCU_Event event;
676 var integer ss;
677
678 /* Send Access Bursts on PTCCH/U for every TA Index */
679 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
680 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700681 if (ss < 0) { /* Shall not happen */
682 f_shutdown(__BFILE__, __LINE__);
683 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200684
685 log("Sending an Access Burst on PTCCH/U",
686 ", sub-slot=", ss, " (TAI)",
687 ", fn=", event.data.tdma_fn,
688 ", ToA=", toa_map[ss], " (QTA)");
689 /* TODO: do we care about RA and burst format? */
690 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
691 ra := oct2int('3A'O),
692 is_11bit := 0,
693 burst_type := BURST_TYPE_0,
694 fn := event.data.tdma_fn,
695 arfcn := 871,
696 qta := toa_map[ss],
697 sapi := PCU_IF_SAPI_PTCCH));
698 repeat;
699 }
700}
701
702private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
703 template PTCCHDownlinkMsg t_ta_msg)
704runs on RAW_PCU_Test_CT {
705 var PTCCHDownlinkMsg ta_msg;
706 var PCUIF_Message pcu_msg;
707 timer T;
708
709 /* First, send an RTS.req for the upcoming PTCCH/D block */
710 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
711 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
712 arfcn := 871, block_nr := 0));
713 T.start(2.0);
714 alt {
715 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
716 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
717 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
718 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
719 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
720 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
721 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
722 log("Rx PTCCH/D message: ", ta_msg);
723
724 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700725 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200726 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
727 }
728 }
729 [] BTS.receive { repeat; }
730 [] T.timeout {
731 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200732 }
733 }
734}
735
736testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
737 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200738 var GprsMS ms;
739
740 /* Initialize GPRS MS side */
741 f_init_gprs_ms();
742 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200743
744 /* Initialize the PCU interface abstraction */
745 f_init_raw(testcasename());
746
747 /* Enable forwarding of PTCCH/U TDMA events to us */
748 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
749
750 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
751 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200752 /* Establish an Uplink TBF */
753 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200754
755 /* We expect incremental TFI/USF assignment (dynamic allocation) */
756 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200757 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200758 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700759 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200760 }
761
762 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200763 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200764 setverdict(fail, "Failed to match Timing Advance Index for #", i);
765 /* Keep going, the current OsmoPCU does not assign TA Index */
766 }
767 }
768
769 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
770 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
771 for (var integer i := 0; i < 7; i := i + 1) {
772 /* ToA in units of 1/4 of a symbol */
773 toa_map[i] := (i + 1) * 7 * 4;
774 }
775
776 /* Now we have all 7 TBFs established in one-phase access mode,
777 * however we will not be sending any data on them. Instead, we
778 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
779 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
780 *
781 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
782 * time-slots, so at the moment of scheduling a PTCCH/D block
783 * the PCU has odd number of PTCCH/U Access Bursts received. */
784 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
785 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
786 /* Other values are not known (yet) */
787 tai3_ta := ?));
788 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
789 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
790 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
791 /* Other values are out of our interest */
792 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700793
794 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200795}
796
797/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
798 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
799 *
800 * NOTE: the ranges are intentionally overlapping because OsmoPCU
801 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
802private template integer CS1_lqual_dB_range := (-infinity .. 6);
803private template integer CS2_lqual_dB_range := (5 .. 8);
804private template integer CS3_lqual_dB_range := (7 .. 13);
805private template integer CS4_lqual_dB_range := (12 .. infinity);
806
807testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200808 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200809 var GprsMS ms;
810 var uint32_t unused_fn, sched_fn;
811 var uint4_t cv;
812
813 /* Initialize GPRS MS side */
814 f_init_gprs_ms();
815 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200816
817 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100818 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200819
820 f_pcuvty_set_allowed_cs_mcs();
821 f_pcuvty_set_link_quality_ranges();
822
823 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200824 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200825
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200826
827 /* The actual / old link quality values. We need to keep track of the old
828 * (basically previous) link quality value, because OsmoPCU actually
829 * changes the coding scheme if not only the actual, but also the old
830 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200831 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200832 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200833
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200834 /* Send one UL block (with TLLI since we are in One-Phase Access
835 contention resoultion) and make sure it is ACKED fine. */
836 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
837 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200838 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200839 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
840 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
841 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200842
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200843 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
844 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200845 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200846 lqual_old := ms.lqual_cb;
847 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200848
849 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200850 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
851 if (i > g_bs_cv_max) {
852 cv := 15;
853 } else {
854 cv := i;
855 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200856
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200857 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
858
859 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
860 f_rx_rlcmac_dl_block(dl_block, unused_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +0700861 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200862 continue;
863 }
864 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
865 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
866 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
867 f_shutdown(__BFILE__, __LINE__);
868 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200869
870 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
871 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
872
873 /* Match the received Channel Coding Command. Since we are increasing
874 * the link quality value on each iteration and not decreasing, there
875 * is no need to check the both old and current link quality values. */
876 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200877 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200878 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
879 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
880 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
881 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
882 }
883
884 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
885 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200886 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200887 }
888 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700889
890 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200891}
892
893/* Test the max UL CS set by VTY works fine */
894testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200895 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200896 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200897 var uint32_t unused_fn, sched_fn;
898 var GprsMS ms;
899
900 /* Initialize GPRS MS side */
901 f_init_gprs_ms();
902 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200903
904 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100905 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200906
907 /* Set initial UL CS to 3 */
908 g_cs_initial_ul := 3;
909 f_pcuvty_set_allowed_cs_mcs();
910 f_pcuvty_set_link_quality_ranges();
911
912 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200913 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200914
915 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200916 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200917
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200918 /* Send one UL block (with TLLI since we are in One-Phase Access
919 contention resoultion) and make sure it is ACKED fine. */
920 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
921 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200922 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200923 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
924 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
925 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200926
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200927 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
928 while (true) {
929 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
930 f_rx_rlcmac_dl_block(dl_block, unused_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +0700931 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200932 continue;
933 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200934
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200935 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
936 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
937 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
938 f_shutdown(__BFILE__, __LINE__);
939 break;
940 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200941
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200942 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200943 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200944 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200945 if (last_ch_coding != CH_CODING_CS3) {
946 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200947 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200948 }
949
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200950 /* Remaining UL blocks are used to make sure regardless of initial
951 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200952 /* 0 dB, make sure we downgrade CS */
953 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200954 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200955 f_ms_tx_ul_data_block_multi(ms, 5);
956 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
957 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
958 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200959
960 if (last_ch_coding != CH_CODING_CS1) {
961 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200962 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200963 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700964
965 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200966}
967
968/* Test the max UL CS set by VTY works fine */
969testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200970 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200971 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200972 var uint32_t unused_fn, sched_fn;
973 var GprsMS ms;
974
975 /* Initialize GPRS MS side */
976 f_init_gprs_ms();
977 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200978
979 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100980 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200981
982 /* Set maximum allowed UL CS to 3 */
983 g_cs_max_ul := 3;
984 f_pcuvty_set_allowed_cs_mcs();
985 f_pcuvty_set_link_quality_ranges();
986
987 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200988 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200989
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200990 /* Send one UL block (with TLLI since we are in One-Phase Access
991 contention resoultion) and make sure it is ACKED fine. */
992 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
993 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200994 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200995 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
996 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
997 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200998
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200999 ms.lqual_cb := 40*10; /* 40 dB */
1000 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001001
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001002 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1003 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001004
1005 if (last_ch_coding != CH_CODING_CS3) {
1006 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +02001007 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001008 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001009
1010 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001011}
1012
Pau Espin Pedrol75122592020-11-03 15:22:59 +01001013/* Test the initial DL CS set by VTY works fine */
1014testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
1015 var octetstring data := f_rnd_octstring(10);
1016 var CodingScheme exp_dl_cs_mcs;
1017 var RlcmacDlBlock dl_block;
1018 var uint32_t poll_fn;
1019 var GprsMS ms;
1020
1021 /* Initialize NS/BSSGP side */
1022 f_init_bssgp();
1023 /* Initialize GPRS MS side */
1024 f_init_gprs_ms();
1025 ms := g_ms[0]; /* We only use first MS in this test */
1026
1027 /* Initialize the PCU interface abstraction */
1028 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1029
1030 /* Set initial allowed DL CS to 3 */
1031 g_cs_initial_dl := 3;
1032 exp_dl_cs_mcs := CS_3;
1033 /* Set maximum allowed UL CS to 4 */
1034 g_cs_max_dl := 4;
1035 f_pcuvty_set_allowed_cs_mcs();
1036 f_pcuvty_set_link_quality_ranges();
1037
1038 /* Establish BSSGP connection to the PCU */
1039 f_bssgp_establish();
1040 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1041
1042 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1043 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1044 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1045
1046 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1047 f_sleep(X2002);
1048 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1049
1050 /* ACK the DL block */
1051 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1052 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1053 f_dl_block_ack_fn(dl_block, poll_fn));
1054
1055 f_shutdown(__BFILE__, __LINE__, final := true);
1056}
1057
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001058/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001059function f_dl_data_exp_cs(template (present) CodingScheme exp_final_cs := ?, template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001060 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001061 var RlcmacDlBlock prev_dl_block, dl_block;
1062 var uint32_t ack_fn;
1063 var uint32_t fn;
1064 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001065 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001066 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001067 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
1068 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001069 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001070
1071 if (using_egprs) {
1072 exp_tmp_csmcs := mcs_egprs_any;
1073 bsn_mod := 2048;
1074 } else {
1075 exp_tmp_csmcs := cs_gprs_any;
1076 bsn_mod := 128;
1077 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001078
1079 /* Establish BSSGP connection to the PCU */
1080 f_bssgp_establish();
1081
1082 ms := g_ms[0]; /* We only use first MS in this test */
1083 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1084
1085 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001086 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001087 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1088
1089 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1090 f_sleep(X2002);
1091
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001092 for (var integer i := 0; i < 800; i := i + 1) {
1093 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001094 f_rx_rlcmac_dl_block(dl_block, fn);
1095
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07001096 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001097 /* No more data to receive, done */
1098 break;
1099 }
1100
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001101 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001102
1103 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001104 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001105
1106 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001107 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001108 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001109 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, using_egprs), ack_fn);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001110 if (tx_data_remain != 0) {
1111 /* Submit more data from time to time to keep the TBF ongoing */
1112 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1113 tx_data_remain := tx_data_remain - 1;
1114 }
1115 }
1116 prev_dl_block := dl_block;
1117 }
1118
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001119 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1120 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001121
1122
1123 f_shutdown(__BFILE__, __LINE__, final := true);
1124}
1125
1126/* Verify DL CS above "cs max" set by VTY is never used */
1127testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1128 /* Initialize NS/BSSGP side */
1129 f_init_bssgp();
1130 /* Initialize GPRS MS side */
1131 f_init_gprs_ms();
1132
1133 /* Initialize the PCU interface abstraction */
1134 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1135
1136 /* Set maximum allowed DL CS to 3 */
1137 g_cs_initial_dl := 1;
1138 g_cs_max_dl := 3;
1139 f_pcuvty_set_allowed_cs_mcs();
1140 f_pcuvty_set_link_quality_ranges();
1141
1142 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1143}
1144
1145/* Check DL CS4 is used in good link conditions if allowed by config */
1146testcase TC_dl_cs1_to_cs4() runs on RAW_PCU_Test_CT {
1147 /* Initialize NS/BSSGP side */
1148 f_init_bssgp();
1149 /* Initialize GPRS MS side */
1150 f_init_gprs_ms();
1151
1152 /* Initialize the PCU interface abstraction */
1153 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1154
1155 /* Set initial DL CS to 1 & maximum allowed DL CS to 4 */
1156 g_cs_initial_dl := 1;
1157 g_cs_max_dl := 4;
1158 f_pcuvty_set_allowed_cs_mcs();
1159 f_pcuvty_set_link_quality_ranges();
1160
1161 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1162}
1163
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001164/* Test the initial UL MCS set by VTY works fine */
1165testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1166 var RlcmacDlBlock dl_block;
1167 var PollFnCtx pollctx;
1168 var EgprsChCodingCommand last_ch_coding;
1169 var uint32_t unused_fn, sched_fn;
1170 var GprsMS ms;
1171 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001172
1173 /* Initialize GPRS MS side */
1174 f_init_gprs_ms();
1175 ms := g_ms[0]; /* We only use first MS in this test */
1176
1177 /* Initialize the PCU interface abstraction */
1178 f_init_raw(testcasename());
1179
1180 /* Set initial UL MCS to 3 */
1181 g_mcs_initial_ul := 3;
1182 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1183 f_pcuvty_set_allowed_cs_mcs();
1184 f_pcuvty_set_link_quality_ranges();
1185
1186 /* Take lqual (dB->cB) so that we stay in that MCS */
1187 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1188
1189 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001190 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_egprs_def));
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001191
1192 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1193 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1194 f_shutdown(__BFILE__, __LINE__);
1195 }
1196
1197 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1198 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1199
1200 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1201 while (true) {
1202 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1203 f_rx_rlcmac_dl_block(dl_block, unused_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07001204 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001205 continue;
1206 }
1207
1208 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1209 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1210 f_shutdown(__BFILE__, __LINE__);
1211 break;
1212 }
1213
1214 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1215 break;
1216 }
1217 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1218 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1219 f_shutdown(__BFILE__, __LINE__);
1220 }
1221
1222 /* Remaining UL blocks are used to make sure regardless of initial
1223 * lqual, we can go lower at any time
1224 * 0 dB, make sure we downgrade MCS */
1225 ms.lqual_cb := 0;
1226 /* 5 UL blocks, check we are in same initial MCS: */
1227 f_ms_tx_ul_data_block_multi(ms, 5);
1228 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1229 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1230 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1231
1232 if (last_ch_coding != CH_CODING_MCS1) {
1233 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1234 f_shutdown(__BFILE__, __LINE__);
1235 }
1236
1237 f_shutdown(__BFILE__, __LINE__, final := true);
1238}
1239
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001240/* Test the maximum UL MCS set by VTY works fine */
1241testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1242 var RlcmacDlBlock dl_block;
1243 var EgprsChCodingCommand last_ch_coding;
1244 var PollFnCtx pollctx;
1245 var uint32_t unused_fn, sched_fn;
1246 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001247
1248 /* Initialize GPRS MS side */
1249 f_init_gprs_ms();
1250 ms := g_ms[0]; /* We only use first MS in this test */
1251
1252 /* Initialize the PCU interface abstraction */
1253 f_init_raw(testcasename());
1254
1255 /* Set maximum allowed UL MCS to 5 */
1256 g_mcs_max_ul := 5;
1257 f_pcuvty_set_allowed_cs_mcs();
1258 f_pcuvty_set_link_quality_ranges();
1259
1260 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001261 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_egprs_def));
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001262 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1263 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1264
1265 ms.lqual_cb := 40*10; /* 40 dB */
1266 f_ms_tx_ul_data_block_multi(ms, 16);
1267
1268 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1269 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1270
1271 if (last_ch_coding != CH_CODING_MCS5) {
1272 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1273 f_shutdown(__BFILE__, __LINE__);
1274 }
1275
1276 f_shutdown(__BFILE__, __LINE__, final := true);
1277}
1278
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001279/* Test the initial DL CS set by VTY works fine */
1280testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1281 var octetstring data := f_rnd_octstring(10);
1282 var CodingScheme exp_dl_cs_mcs;
1283 var RlcmacDlBlock dl_block;
1284 var uint32_t poll_fn;
1285 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001286
1287 /* Initialize NS/BSSGP side */
1288 f_init_bssgp();
1289 /* Initialize GPRS MS side */
1290 f_init_gprs_ms();
1291 ms := g_ms[0]; /* We only use first MS in this test */
1292
1293 /* Initialize the PCU interface abstraction */
1294 f_init_raw(testcasename());
1295
1296 /* Set initial allowed DL MCS to 3 */
1297 g_mcs_initial_dl := 3;
1298 exp_dl_cs_mcs := MCS_3;
1299 /* Set maximum allowed DL MCS to 4 */
1300 g_mcs_max_dl := 4;
1301 f_pcuvty_set_allowed_cs_mcs();
1302 f_pcuvty_set_link_quality_ranges();
1303
1304 /* Establish BSSGP connection to the PCU */
1305 f_bssgp_establish();
1306 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1307
1308 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001309 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001310 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1311
1312 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1313 f_sleep(X2002);
1314 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1315
1316 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001317 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1318 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, ischosen(dl_block.data_egprs)),
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001319 f_dl_block_ack_fn(dl_block, poll_fn));
1320
1321 f_shutdown(__BFILE__, __LINE__, final := true);
1322}
1323
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001324/* Verify DL MCS above "mcs max" set by VTY is never used */
1325testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1326 /* Initialize NS/BSSGP side */
1327 f_init_bssgp();
1328 /* Initialize GPRS MS side */
1329 f_init_gprs_ms();
1330
1331 /* Initialize the PCU interface abstraction */
1332 f_init_raw(testcasename());
1333
1334 /* Set maximum allowed DL CS to 3 */
1335 g_mcs_initial_dl := 1;
1336 g_mcs_max_dl := 3;
1337 f_pcuvty_set_allowed_cs_mcs();
1338 f_pcuvty_set_link_quality_ranges();
1339
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001340 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_mcs_max_dl, true), bssgp_ms_racap_egprs_def);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001341}
1342
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02001343/* Verify PCU drops TBF after some time of inactivity. */
1344testcase TC_t3141() runs on RAW_PCU_Test_CT {
1345 var PCUIF_info_ind info_ind;
1346 var template (value) TsTrxBtsNum nr;
1347 var BTS_PDTCH_Block data_msg;
1348 var GprsMS ms;
1349 var uint3_t rx_usf;
1350 timer T_3141 := 1.0;
1351 var boolean ul_tbf_usf_req := false;
1352
1353 /* Initialize NS/BSSGP side */
1354 f_init_bssgp();
1355 /* Initialize GPRS MS side */
1356 f_init_gprs_ms();
1357 ms := g_ms[0]; /* We only use first MS in this test */
1358
1359 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1360 /* Only use 1 PDCH to simplify test: */
1361 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
1362 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
1363 /* Initialize the PCU interface abstraction */
1364 f_init_raw(testcasename(), info_ind);
1365
1366 f_vty_config2(PCUVTY, {"pcu"}, "timer T3141 1");
1367
1368 /* Establish BSSGP connection to the PCU */
1369 f_bssgp_establish();
1370 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1371
1372 /* Establish a one-phase access Uplink TBF */
1373 f_ms_establish_ul_tbf(ms);
1374
1375 T_3141.start;
1376
1377 /* Now we wait for PCU to transmit our USF */
1378 nr := ts_TsTrxBtsNum;
1379 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1380 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1381 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1382 block_nr := nr.blk_nr));
1383
1384 alt {
1385 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1386 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1387 ?)) -> value data_msg {
1388 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1389 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1390 f_shutdown(__BFILE__, __LINE__);
1391 }
1392
1393 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1394 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1395 /* PCU requests our USF, transmit WITHOUT tlli to avoid contention resolution success */
1396 ul_tbf_usf_req := true;
1397 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15, with_tlli := false, fn := f_next_pdch_block(data_msg.raw.fn))
1398 } else if (rx_usf == USF_UNUSED) {
1399 if (data_msg.raw.fn >= ms.ul_tbf.start_time_fn) {
1400 if (ul_tbf_usf_req) {
1401 /* TBF was dropped by T3141, success */
1402 setverdict(pass);
1403 break;
1404 } else {
1405 log("PCU never requested USF, unexpected");
1406 f_shutdown(__BFILE__, __LINE__);
1407 }
1408 } /* else: Keep waiting for TBF to be active by network */
1409 } else {
1410 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1411 f_shutdown(__BFILE__, __LINE__);
1412 }
1413
1414 /* Make sure we don't receive a Ul ACK/NACK with TLLI set: */
1415 if (match(data_msg.dl_block,
1416 tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
1417 tr_UlAckNackGprs(tlli := ?,
1418 acknack_desc := ?,
1419 rel99 := *))))
1420 {
1421 log("Received UL ACK/NACK with TLLI set");
1422 f_shutdown(__BFILE__, __LINE__);
1423 }
1424
1425 nr := ts_TsTrxBtsNum;
1426 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1427 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1428 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1429 block_nr := nr.blk_nr));
1430 repeat;
1431 }
Pau Espin Pedrole5fe6e72022-02-22 15:15:00 +01001432 [ul_tbf_usf_req] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1433 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1434 omit)) {
1435 /* TBF was dropped by T3141, and PCU answered with an IDLE block to
1436 our last RTS.req because there's no longer any MS listening on
1437 the TS. */
1438 setverdict(pass);
1439 break;
1440 }
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02001441 [] T_3141.timeout {
1442 log("T_3141 expired but TBF is still active, unexpected");
1443 f_shutdown(__BFILE__, __LINE__);
1444 }
1445 [] BTS.receive {
1446 /* We should never receive non-dummy messages, aka UL ACK/NACK,
1447 * because we never sent the TLLI to the PCU */
1448 setverdict(fail, "Unexpected BTS message");
1449 f_shutdown(__BFILE__, __LINE__);
1450 }
1451 }
1452
1453 f_shutdown(__BFILE__, __LINE__, final := true);
1454}
1455
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001456/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1457 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1458 * T3169. See OS#5033 */
1459testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1460 var PCUIF_info_ind info_ind;
1461 var template (value) TsTrxBtsNum nr;
1462 var BTS_PDTCH_Block data_msg;
1463 var GprsMS ms;
1464 var uint3_t rx_usf;
1465 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1466 var integer n3101 := 0;
1467 timer T_3169 := 1.0;
1468
1469 /* Initialize NS/BSSGP side */
1470 f_init_bssgp();
1471 /* Initialize GPRS MS side */
1472 f_init_gprs_ms();
1473 ms := g_ms[0]; /* We only use first MS in this test */
1474
1475 /* Initialize the PCU interface abstraction */
1476 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1477 info_ind.n3101 := N3101_MAX;
1478 info_ind.t3169 := 1;
1479 f_init_raw(testcasename(), info_ind);
1480
1481 /* Establish BSSGP connection to the PCU */
1482 f_bssgp_establish();
1483 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1484
1485 /* Establish UL TBF */
1486 f_ms_establish_ul_tbf(ms);
1487
1488 /* Now we wait for PCU to transmit our USF */
1489 nr := ts_TsTrxBtsNum;
1490 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1491 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1492 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1493 block_nr := nr.blk_nr));
1494
1495 alt {
1496 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1497 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1498 ?)) -> value data_msg {
1499 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1500 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1501 f_shutdown(__BFILE__, __LINE__);
1502 }
1503
1504 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1505 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1506 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1507 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001508 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1509 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001510 f_shutdown(__BFILE__, __LINE__);
1511 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001512 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001513 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1514 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1515 if (not T_3169.running) {
1516 log("T3169 started");
1517 T_3169.start;
1518 }
1519 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1520 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1521 f_shutdown(__BFILE__, __LINE__);
1522 } else {
1523 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1524 }
1525 nr := ts_TsTrxBtsNum;
1526 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1527 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1528 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1529 block_nr := nr.blk_nr));
1530 repeat;
1531 }
Pau Espin Pedrol907ba202021-11-12 17:25:24 +01001532 /* We may already receive empty (idle) blocks before our own TTCN3 timer
1533 * triggers due to the TBF being released. Keep going until our T_3169 triggers. */
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01001534 [n3101 == N3101_MAX + 1] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001535 [] T_3169.timeout {
1536 log("T_3169 expired");
1537 /* Done in alt */
1538 }
1539 [] BTS.receive {
1540 setverdict(fail, "Unexpected BTS message");
1541 f_shutdown(__BFILE__, __LINE__);
1542 }
1543 }
1544
1545 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1546 /* USFs as per previous TBF since they were freed at expiration time: */
1547 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1548 var uint5_t old_tfi := ms.ul_tbf.tfi;
1549 f_ms_establish_ul_tbf(ms);
1550 if (old_tfi != ms.ul_tbf.tfi) {
1551 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1552 f_shutdown(__BFILE__, __LINE__);
1553 }
1554 for (var integer i := 0; i < 8; i := i +1) {
1555 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1556 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1557 f_shutdown(__BFILE__, __LINE__);
1558 }
1559 }
1560
1561 f_shutdown(__BFILE__, __LINE__, final := true);
1562}
1563
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001564
1565/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1566 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1567 the final UL ACK sent at us. */
1568testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1569 var PCUIF_info_ind info_ind;
1570 var BTS_PDTCH_Block data_msg;
1571 var RlcmacDlBlock dl_block;
1572 var uint32_t sched_fn;
1573 var template (value) TsTrxBtsNum nr;
1574 var template RlcmacDlBlock exp_ul_ack;
1575 var template UlAckNackGprs exp_ul_ack_sub;
1576 var GprsMS ms;
1577 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1578 var integer N3103 := 0;
1579 timer T_3169 := 1.0;
1580
1581 /* Initialize GPRS MS side */
1582 f_init_gprs_ms();
1583 ms := g_ms[0]; /* We only use first MS in this test */
1584
1585 /* Initialize the PCU interface abstraction */
1586 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1587 info_ind.n3103 := N3103_MAX;
1588 info_ind.t3169 := 1;
1589 f_init_raw(testcasename(), info_ind);
1590
1591 /* Establish an Uplink TBF */
1592 f_ms_establish_ul_tbf(ms);
1593
Pau Espin Pedrol93ae4522021-05-11 15:58:26 +02001594 f_ms_tx_ul_data_block_multi(ms, 5, with_tlli := true);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001595 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1596 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1597
1598 nr := ts_TsTrxBtsNum;
1599 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1600 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1601 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1602 block_nr := nr.blk_nr));
1603 alt {
1604 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1605 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1606 exp_ul_ack)) -> value data_msg {
1607 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1608 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1609 f_shutdown(__BFILE__, __LINE__);
1610 }
1611
1612 nr := ts_TsTrxBtsNum;
1613 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1614 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1615 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1616 block_nr := nr.blk_nr));
1617 N3103 := N3103 + 1;
1618 if (N3103 == N3103_MAX) {
1619 /* At this point in time (N3103_MAX reached), PCU is
1620 * moving the TBF to RELEASE state so no data/ctrl for
1621 * it is tx'ed, hence the dummy blocks: */
1622 T_3169.start;
1623 }
1624 repeat;
1625 }
1626 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1627 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1628 exp_ul_ack)) -> value data_msg {
1629 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1630 f_shutdown(__BFILE__, __LINE__);
1631 }
1632 [] as_ms_rx_ignore_dummy(ms, nr);
Pau Espin Pedrol907ba202021-11-12 17:25:24 +01001633 [] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001634 [T_3169.running] T_3169.timeout {
1635 log("T_3169 timeout");
1636 /* Done in alt, wait for pending RTS initiated previously in
1637 * above case before continuing (expect /* Dummy block): */
1638 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1639 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07001640 tr_RLCMAC_DL_DUMMY_CTRL));
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001641 }
1642 [] BTS.receive {
1643 setverdict(fail, "Unexpected BTS message");
1644 f_shutdown(__BFILE__, __LINE__);
1645 }
1646 }
1647
1648 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1649 * USFs as per previous TBF since they were freed at expiration time: */
1650 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1651 var uint5_t old_tfi := ms.ul_tbf.tfi;
1652 f_ms_establish_ul_tbf(ms);
1653 if (old_tfi != ms.ul_tbf.tfi) {
1654 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1655 f_shutdown(__BFILE__, __LINE__);
1656 }
1657 for (var integer i := 0; i < 8; i := i +1) {
1658 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1659 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1660 f_shutdown(__BFILE__, __LINE__);
1661 }
1662 }
1663
1664 f_shutdown(__BFILE__, __LINE__, final := true);
1665}
1666
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001667/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1668 * point the TBF is no longer available. In order to get to start of T3191, we
1669 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1670 * until TBF release procedure starts after draining DL queue. */
1671testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1672 var PCUIF_info_ind info_ind;
1673 var RlcmacDlBlock dl_block;
1674 var octetstring data1 := f_rnd_octstring(200);
1675 var octetstring data2 := f_rnd_octstring(10);
1676 var uint32_t dl_fn;
1677 var template (value) TsTrxBtsNum nr;
1678 var BTS_PDTCH_Block data_msg;
1679 var GprsMS ms;
1680
1681 /* Initialize NS/BSSGP side */
1682 f_init_bssgp();
1683 /* Initialize GPRS MS side */
1684 f_init_gprs_ms();
1685 ms := g_ms[0]; /* We only use first MS in this test */
1686
1687 /* Initialize the PCU interface abstraction */
1688 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1689 /* Set timer to 1 sec (default 5) to speedup test: */
1690 info_ind.t3191 := 1;
1691 f_init_raw(testcasename(), info_ind);
1692
1693 /* Establish BSSGP connection to the PCU */
1694 f_bssgp_establish();
1695 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1696
1697 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1698 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1699 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1700
1701 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1702 f_sleep(X2002);
1703
1704 while (true) {
1705 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1706
1707 /* Keep Ack/Nack description updated (except for last BSN) */
1708 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1709
1710 if (f_dl_block_rrbp_valid(dl_block)) {
1711 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1712 f_dl_block_ack_fn(dl_block, dl_fn));
1713 break;
1714 }
1715 }
1716
1717 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1718 nr := ts_TsTrxBtsNum;
1719 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1720 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1721 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1722 block_nr := nr.blk_nr));
1723 alt {
1724 [] as_ms_rx_ignore_dummy(ms, nr);
1725 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1726 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1727 ?)) -> value data_msg {
1728 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1729 log("Received FINAL_ACK");
1730 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1731 break;
1732 }
1733 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1734 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1735 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1736 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1737 }
1738 nr := ts_TsTrxBtsNum;
1739 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1740 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1741 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1742 block_nr := nr.blk_nr));
1743 repeat;
1744 }
1745 [] BTS.receive {
1746 setverdict(fail, "Unexpected BTS message");
1747 f_shutdown(__BFILE__, __LINE__);
1748 }
1749 }
1750
1751 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1752 to time out. We simply sleep instead of requesting blocks because
1753 otherwise retransmissions would keep restarting the timer. */
1754 f_sleep(int2float(info_ind.t3191));
1755
1756 /* The TBF should be freed now, so new data should trigger an Assignment: */
1757 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1758 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1759
1760 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1761 f_sleep(X2002);
1762 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1763 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1764 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1765 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1766 f_dl_block_ack_fn(dl_block, dl_fn));
1767
1768 f_shutdown(__BFILE__, __LINE__, final := true);
1769}
1770
1771/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1772testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1773 var PCUIF_info_ind info_ind;
1774 var RlcmacDlBlock dl_block;
1775 var octetstring data1 := f_rnd_octstring(1400);
1776 var octetstring data2 := f_rnd_octstring(10);
1777 var uint32_t dl_fn;
1778 var GprsMS ms;
1779
1780 /* Initialize NS/BSSGP side */
1781 f_init_bssgp();
1782 /* Initialize GPRS MS side */
1783 f_init_gprs_ms();
1784 ms := g_ms[0]; /* We only use first MS in this test */
1785
1786 /* Initialize the PCU interface abstraction */
1787 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1788 /* Set timer to 1 sec (default 5) to speedup test: */
1789 info_ind.t3191 := 1;
1790 f_init_raw(testcasename(), info_ind);
1791
1792 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1793
1794 /* Establish BSSGP connection to the PCU */
1795 f_bssgp_establish();
1796 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1797
1798 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1799 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1800 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1801
1802 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1803 f_sleep(X2002);
1804
1805 /* Send enough DL data to at least be able to DL ACK once (excl the
1806 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1807 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1808 while (true) {
1809 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1810
1811 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1812 log("Received FINAL_ACK");
1813 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1814 break;
1815 }
1816
1817 /* Keep Ack/Nack description updated (except for last BSN) */
1818 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1819
1820 if (f_dl_block_rrbp_valid(dl_block)) {
1821 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1822 f_dl_block_ack_fn(dl_block, dl_fn));
1823 }
1824 }
1825
1826 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1827 to time out. We simply sleep instead of requesting blocks because
1828 otherwise retransmissions would keep restarting the timer. */
1829 f_sleep(int2float(info_ind.t3191));
1830
1831 /* The TBF should be freed now, so new data should trigger an Assignment: */
1832 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1833 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1834
1835 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1836 f_sleep(X2002);
1837 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1838 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1839 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1840 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1841 f_dl_block_ack_fn(dl_block, dl_fn));
1842
1843 f_shutdown(__BFILE__, __LINE__, final := true);
1844}
1845
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001846/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1847 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1848 * T3193) after DL TBF release */
1849testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001850 var RlcmacDlBlock dl_block;
1851 var octetstring data := f_rnd_octstring(10);
1852 var boolean ok;
1853 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001854 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001855 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001856 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1857
1858 /* Initialize NS/BSSGP side */
1859 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001860 /* Initialize GPRS MS side */
1861 f_init_gprs_ms();
1862 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001863
1864 /* Initialize the PCU interface abstraction */
1865 f_init_raw(testcasename());
1866
1867 /* Establish BSSGP connection to the PCU */
1868 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001869 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001870
1871 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001872 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1873 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001874
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001875 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1876 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001877 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001878
1879 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001880 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1881 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1882 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001883
1884 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001885 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001886 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001887 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001888 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001889
1890 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001891
1892 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001893 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001894 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1895 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1896 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001897
1898 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001899}
1900
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001901/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1902 freed and no longer available. Trigger it by sending DL blocks and never DL
1903 ACKing the data (which are requested through RRBP) */
1904testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1905 var PCUIF_info_ind info_ind;
1906 var RlcmacDlBlock dl_block;
1907 var octetstring data1 := f_rnd_octstring(1000);
1908 var octetstring data2 := f_rnd_octstring(10);
1909 var uint32_t dl_fn;
1910 var template (value) TsTrxBtsNum nr;
1911 var BTS_PDTCH_Block data_msg;
1912 var GprsMS ms;
1913 const integer N3105_MAX := 2;
1914 var integer N3105 := 0;
1915 timer T_3195 := 1.0;
1916 var integer num_poll_recv := 0;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001917 var template RlcmacDlBlock dl_block_exp;
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001918
1919 /* Initialize NS/BSSGP side */
1920 f_init_bssgp();
1921 /* Initialize GPRS MS side */
1922 f_init_gprs_ms();
1923 ms := g_ms[0]; /* We only use first MS in this test */
1924
1925 /* Initialize the PCU interface abstraction */
1926 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1927 /* Speedup test: */
1928 info_ind.n3105 := N3105_MAX;
1929 info_ind.t3195 := 1;
1930 f_init_raw(testcasename(), info_ind);
1931
1932 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1933 * MS and retransmitted after the TBF is released and later on created
1934 * (because the MS is reused) */
1935 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1936
1937 /* Establish BSSGP connection to the PCU */
1938 f_bssgp_establish();
1939 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1940
1941 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1942 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1943 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1944
1945 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1946 f_sleep(X2002);
1947
1948 /* Now we go on receiving DL data and not answering RRBP: */
1949 nr := ts_TsTrxBtsNum;
1950 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1951 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1952 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1953 block_nr := nr.blk_nr));
1954 alt {
1955 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1956 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1957 tr_RLCMAC_DATA)) -> value data_msg {
1958 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1959 if (num_poll_recv == 0) {
1960 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1961 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1962 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1963 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1964 } else {
1965 log("Ignoring RRBP ", num_poll_recv);
1966 N3105 := N3105 + 1;
1967 }
1968 num_poll_recv := num_poll_recv + 1;
1969 }
1970
1971 nr := ts_TsTrxBtsNum;
1972 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1973 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1974 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1975 block_nr := nr.blk_nr));
1976 repeat;
1977 }
1978 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001979 * RELEASE state so no data for it is tx'ed, hence the dummy/idle blocks:
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001980 */
1981 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1982 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07001983 tr_RLCMAC_DL_DUMMY_CTRL)) -> value data_msg {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001984 if (not T_3195.running) {
1985 T_3195.start;
1986 /* We even send some new data, nothing should be sent to MS */
1987 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1988 }
1989 nr := ts_TsTrxBtsNum;
1990 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1991 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1992 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1993 block_nr := nr.blk_nr));
1994 repeat;
1995 }
Pau Espin Pedrol518e82f2021-11-12 17:24:33 +01001996 /* We may already receive idle blocks before our own TTCN3 timer
1997 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01001998 [N3105 == N3105_MAX] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001999 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002000 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002001 /* Done in alt, wait for pending RTS initiated previously in
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002002 * above case before continuing (expect empty block): */
2003 dl_block_exp := omit;
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002004 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2005 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02002006 dl_block_exp));
2007 }
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002008 [] BTS.receive {
2009 setverdict(fail, "Unexpected BTS message");
2010 f_shutdown(__BFILE__, __LINE__);
2011 }
2012 }
2013
2014 /* after T_3195 timeout, TBF is released */
2015 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
2016 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2017
2018 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2019 f_sleep(X2002);
2020 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
2021
2022 /* ACK the DL block */
2023 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2024 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2025 f_dl_block_ack_fn(dl_block, dl_fn));
2026
2027 f_shutdown(__BFILE__, __LINE__, final := true);
2028}
2029
Pau Espin Pedrole8a94442021-11-15 17:05:46 +01002030/* Verify configured T3172 is properly transmitted as WAIT_INDICATION in Pkt Access Reject in PACCH. */
2031function f_TC_t3172(integer t3172_ms, BIT1 wait_ind_size) runs on RAW_PCU_Test_CT {
2032 var PCUIF_info_ind info_ind;
2033 var template IARRestOctets rest;
2034 var BIT11 ra11;
2035 var GprsMS ms;
2036 var octetstring data := f_rnd_octstring(10);
2037 var RlcmacDlBlock dl_block;
2038 var template RlcmacDlBlock rej_tmpl;
2039 var uint32_t dl_fn;
2040 var uint32_t sched_fn;
2041 var uint8_t wait_ind_val;
2042
2043 /* Initialize NS/BSSGP side */
2044 f_init_bssgp();
2045 /* Initialize GPRS MS side */
2046 f_init_gprs_ms();
2047 ms := g_ms[0]; /* We only use first MS in this test */
2048
2049 info_ind := valueof(ts_PCUIF_INFO_default);
2050
2051 /* Only the first TRX is enabled. */
2052 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
2053 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
2054
2055 /* Initialize the PCU interface abstraction */
2056 f_init_raw(testcasename(), info_ind);
2057
2058 f_pcuvty_set_timer(3172, t3172_ms);
2059
2060 /* Establish BSSGP connection to the PCU */
2061 f_bssgp_establish();
2062 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2063
2064 var EGPRSPktChRequest req := {
2065 one_phase := {
2066 tag := '0'B,
2067 multislot_class := '10101'B,
2068 priority := '01'B,
2069 random_bits := '101'B
2070 }
2071 };
2072
2073 /* We send 7 requests, the IUT gives us all available USFs (0..6) */
2074 for (var integer i := 0; i < 7; i := i + 1) {
2075 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
2076 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
2077 }
2078
2079 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2080 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2081 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2082
2083 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2084 f_sleep(X2002);
2085 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
2086
2087 /* ACK the DL block */
2088 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2089 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc, false, ts_ChannelReqDescription()),
2090 f_dl_block_ack_fn(dl_block, dl_fn));
2091
2092 /* Since all USF are taken, we should receive a Reject: */
2093
2094 if (wait_ind_size == '0'B) {
2095 wait_ind_val := t3172_ms / 1000;
2096 } else {
2097 wait_ind_val := t3172_ms / 20;
2098 }
2099 rej_tmpl := tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_ACC_REJ(
2100 tr_PacketAccessRejectStruct_TLLI(ms.tlli,
2101 wait_ind_val,
2102 wait_ind_size)));
2103 template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum;
2104 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2105 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2106 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2107 block_nr := nr.blk_nr));
2108 alt {
2109 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2110 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2111 rej_tmpl));
2112 [] BTS.receive {
2113 setverdict(fail, "Unexpected BTS message");
2114 f_shutdown(__BFILE__, __LINE__);
2115 }
2116 }
2117 f_shutdown(__BFILE__, __LINE__, final := true);
2118}
2119testcase TC_t3172_wait_ind_size0() runs on RAW_PCU_Test_CT {
2120 /* size=0 means value is provided in seconds. Due to value being 8
2121 * bit, in the 20ms step case (size=1) the maximum value possible is 20 * 255
2122 * = 5100. Hence, values above it should use size=0 to be able to
2123 * provide values in range. Let's use 6 seconds, 6000ms
2124 */
2125 f_TC_t3172(6000, '0'B);
2126}
2127testcase TC_t3172_wait_ind_size1() runs on RAW_PCU_Test_CT {
2128 f_TC_t3172(3000, '1'B);
2129}
2130
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002131/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
2132testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002133 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002134 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002135 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002136 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002137
2138 /* Initialize NS/BSSGP side */
2139 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002140 /* Initialize GPRS MS side */
2141 f_init_gprs_ms();
2142 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002143
2144 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002145 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002146
2147 /* Establish BSSGP connection to the PCU */
2148 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002149 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002150
2151 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002152 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002153
2154 /* Send one UL block (with TLLI since we are in One-Phase Access
2155 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002156 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002157 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002158 f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002159 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2160 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002161 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002162
2163 /* Send enough blocks to test whole procedure: Until Nth block
2164 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
2165 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002166 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002167 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2168 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002169 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002170
2171 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002172 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, total_payload));
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002173
2174 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002175}
2176
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002177/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
2178testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
2179 var RlcmacDlBlock dl_block;
2180 var uint32_t dl_fn, sched_fn;
2181 var octetstring payload;
2182 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002183 var template (value) LlcBlockHdr blk_hdr;
2184 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002185 var integer blk_len;
2186 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002187 var GprsMS ms;
2188
2189 /* Initialize NS/BSSGP side */
2190 f_init_bssgp();
2191 /* Initialize GPRS MS side */
2192 f_init_gprs_ms();
2193 ms := g_ms[0]; /* We only use first MS in this test */
2194
2195 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002196 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002197
2198 /* Establish BSSGP connection to the PCU */
2199 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002200 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002201
2202 /* Establish an Uplink TBF */
2203 f_ms_establish_ul_tbf(ms);
2204
2205 /* Send one UL block (with TLLI since we are in One-Phase Access
2206 contention resoultion) and make sure it is ACKED fine. */
2207 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002208 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2209 more := false, e := true);
2210 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002211 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002212 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
2213 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002214 cv := 15,
2215 bsn := ms.ul_tbf.bsn,
2216 blocks := blocks,
2217 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002218 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002219 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002220
2221 /* ACK and check it was received fine */
2222 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2223 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2224 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2225 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002226 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, payload));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002227
2228 /* Test sending LLC PDUS of incrementing size */
2229 var integer max_size := 49;
2230 for (var integer i := 1; i <= max_size; i := i + 1) {
2231 var integer cv;
2232 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
2233 log("Sending DATA.ind with LLC payload size ", i);
2234 if (i < max_size - g_bs_cv_max) {
2235 cv := 15;
2236 } else {
2237 cv := max_size - i;
2238 }
2239
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002240 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
2241 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002242 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002243 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2244 more := false, e := true);
2245 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002246 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002247 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
2248 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002249 cv := cv,
2250 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002251 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002252 f_ultbf_inc_bsn(ms.ul_tbf);
2253 f_ms_tx_ul_block(ms, ul_data);
2254
2255 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002256 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, payload));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002257
2258 /* we will receive UL ACK/NACK from time to time, handle it. */
2259 f_rx_rlcmac_dl_block(dl_block, dl_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07002260 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002261 continue;
2262 }
2263 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2264 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2265 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2266 f_shutdown(__BFILE__, __LINE__);
2267 }
2268
2269 log("Rx Packet Uplink ACK / NACK");
2270 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2271 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2272 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2273 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002274
2275 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002276}
2277
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002278function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2279 var octetstring payload;
2280 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002281 var template (value) LlcBlockHdr blk_hdr;
2282 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002283 var integer block_len, max_valid_data_len;
2284 timer T;
2285
2286 block_len := f_rlcmac_cs_mcs2block_len(cs);
2287 /* We need to send with TLLI since we are in One-Phase Access Contenion
2288 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
2289 * indicator, -1 for spare bits octet at the end */
2290 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2291 payload := f_rnd_octstring(max_valid_data_len + 1); /* +1 to write LLC data on last padding octet */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002292 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2293 more := false, e := true);
2294 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002295 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2296 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002297 cv := cv,
2298 bsn := ms.ul_tbf.bsn,
2299 blocks := blocks,
2300 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002301 f_ultbf_inc_bsn(ms.ul_tbf);
2302 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2303
2304 T.start(0.5);
2305 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002306 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002307 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2308 f_shutdown(__BFILE__, __LINE__);
2309 }
2310 [] T.timeout {
2311 setverdict(pass);
2312 }
2313 }
2314}
2315/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2316 blocks intentionally contain last byte of data placed in last byte of RLC
2317 containing padding/spare bits, which is incorrect. Spare bits exist and are
2318 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2319 discounting padding in octet" */
2320testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2321 var GprsMS ms;
2322 var integer block_len, max_valid_data_len;
2323
2324 /* Initialize NS/BSSGP side */
2325 f_init_bssgp();
2326 /* Initialize GPRS MS side */
2327 f_init_gprs_ms();
2328 ms := g_ms[0]; /* We only use first MS in this test */
2329
2330 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002331 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002332
2333 /* Establish BSSGP connection to the PCU */
2334 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002335 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002336
2337 /* Establish an Uplink TBF */
2338 f_ms_establish_ul_tbf(ms);
2339
2340 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2341 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2342 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2343
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002344 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002345}
2346
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002347/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2348 * answered, so TBFs for uplink and later for downlink are created.
2349 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002350private function f_TC_mo_ping_pong_1phase_access(template (present) CodingScheme exp_cs_mcs := ?) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002351 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002352 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002353 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002354 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002355 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002356
2357 /* Initialize NS/BSSGP side */
2358 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002359 /* Initialize GPRS MS side */
2360 f_init_gprs_ms();
2361 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002362
2363 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002364 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002365
2366 /* Establish BSSGP connection to the PCU */
2367 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002368 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002369
2370 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002371 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002372
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002373 /* Send one UL block (with TLLI since we are in One-Phase Access
2374 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002375 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002376 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2377 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002378 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002379
2380 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002381 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002382
2383 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002384 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2385 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002386
2387 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2388 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002389 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002390
2391 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002392 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2393 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2394 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002395
2396 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002397}
2398
2399/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2400 * answered, so TBFs for uplink and later for downlink are created.
2401 */
2402testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002403 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002404 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002405}
2406
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002407/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2408 * answered, so TBFs for uplink and later for downlink are created.
2409 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002410private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2411 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002412 template (present) CodingScheme exp_ul_cs_mcs := ?,
2413 template (present) CodingScheme exp_dl_cs_mcs := ?)
2414runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002415 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002416 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002417 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002418 var uint32_t sched_fn;
2419 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002420 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002421 var GprsMS ms;
2422
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002423 /* Initialize NS/BSSGP side */
2424 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002425 /* Initialize GPRS MS side */
2426 f_init_gprs_ms();
2427 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002428
2429 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002430 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002431
2432 /* Establish BSSGP connection to the PCU */
2433 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002434 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002435
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002436 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2437 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002438
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002439 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2440 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_cs_mcs);
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002441 f_shutdown(__BFILE__, __LINE__);
2442 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002443
2444 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2445 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002446 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002447
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002448 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002449 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002450
2451 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002452 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002453
2454 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002455 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002456 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2457 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002458 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002459 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002460 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002461
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002462 /* PCU acks the UL data after having received CV=0) */
2463 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2464
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002465 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002466 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_dl_cs_mcs);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002467
2468 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002469 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2470 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, ischosen(dl_block.data_egprs)),
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002471 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002472
2473 f_shutdown(__BFILE__, __LINE__, final := true);
2474}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002475
2476testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002477 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2478 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002479
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002480 f_TC_mo_ping_pong_2phase_access(c_PCUIF_Flags_noMCS, ms_racap_gprs_def, exp_ul_cs_mcs, exp_dl_cs_mcs);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01002481
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002482 var StatsDExpects expect := {
2483 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2484 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2485 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2486 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2487 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2488 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2489 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2490 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2491 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2492 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2493 };
2494 f_statsd_expect(expect);
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002495}
2496
2497testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002498 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2499 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002500
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002501 f_TC_mo_ping_pong_2phase_access(c_PCUIF_Flags_default, ms_racap_egprs_def, exp_ul_cs_mcs, exp_dl_cs_mcs);
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002502
2503 var StatsDExpects expect := {
2504 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2505 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2506 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2507 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2508 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2509 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2510 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2511 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2512 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2513 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2514 };
2515 f_statsd_expect(expect);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002516}
2517
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002518testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2519 /* Configure PCU to force two phase access */
2520 g_force_two_phase_access := true;
2521
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002522 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002523 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002524
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002525 f_TC_mo_ping_pong_2phase_access(c_PCUIF_Flags_noMCS, ms_racap_gprs_def, exp_ul_cs_mcs, exp_dl_cs_mcs);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01002526
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002527 var StatsDExpects expect := {
2528 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2529 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2530 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
2531 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
2532 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2533 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2534 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2535 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2536 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2537 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2538 };
2539 f_statsd_expect(expect);
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002540}
2541
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002542/* Test scenario where SGSN wants to send some data against MS and it is
2543 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2544 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002545private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2546 template (present) CodingScheme exp_cs_mcs := ?)
2547runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002548 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002549 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002550 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002551 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002552 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002553
2554 /* Initialize NS/BSSGP side */
2555 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002556 /* Initialize GPRS MS side */
2557 f_init_gprs_ms();
2558 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002559
2560 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002561 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002562
2563 /* Establish BSSGP connection to the PCU */
2564 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002565 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002566
2567 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002568 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2569 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002570
2571 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2572 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002573 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002574
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002575 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002576 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2577 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, ischosen(dl_block.data_egprs), c_ChReqDesc_default),
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002578 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002579
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002580 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002581 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002582
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002583 /* Send one UL block (with TLLI since we are in One-Phase Access
2584 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002585 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002586 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2587 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002588 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002589
2590 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002591 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002592
2593 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002594}
2595
2596testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002597 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002598 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2599}
2600
2601/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2602/* information about the MS */
2603testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002604 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002605 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002606}
2607
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002608/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2609 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2610 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2611 * be transferred).
2612 */
2613testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002614 var RlcmacDlBlock dl_block;
2615 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002616 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002617 var octetstring total_payload;
2618 var octetstring payload;
2619 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002620 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002621 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002622 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002623
2624 /* Initialize NS/BSSGP side */
2625 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002626 /* Initialize GPRS MS side */
2627 f_init_gprs_ms();
2628 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002629
2630 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002631 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002632
2633 /* Establish BSSGP connection to the PCU */
2634 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002635 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002636
2637 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002638 f_ms_establish_ul_tbf(ms);
2639 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002640
2641 /* Send one UL block (with TLLI since we are in One-Phase Access
2642 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002643 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002644 f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002645
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002646 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2647 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002648 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002649 total_payload := payload;
2650
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002651 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2652
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002653 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002654 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002655 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002656 total_payload := total_payload & payload;
2657
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002658 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002659 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002660 total_payload := total_payload & payload;
2661
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002662 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002663 ms.ul_tbf.bsn := ms.ul_tbf.bsn + 1; /* LOST PAYLOAD bsn=3, will be retransmitted, next bsn is increased +2 */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002664 total_payload := total_payload & lost_payload;
2665
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002666 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002667 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002668 total_payload := total_payload & payload;
2669
2670 /* Send enough blocks to finish the transmission (since we were sending BSN=15, send BS_CV_MAX packets) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002671 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002672
2673 /* On CV=0, we'll receive a UL ACK asking about missing block */
2674 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2675 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002676 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2677 tfi := tfi,
2678 cv := 15,
2679 bsn := 3,
2680 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002681 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002682
2683 /* Now final ack is recieved */
2684 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2685 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002686 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002687
2688 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002689 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, total_payload));
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002690
2691 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002692}
2693
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002694/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2695 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2696 * timeout occurs (specified by sent RRBP on DL block). */
2697testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002698 var RlcmacDlBlock dl_block;
2699 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002700 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002701 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002702
2703 /* Initialize NS/BSSGP side */
2704 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002705 /* Initialize GPRS MS side */
2706 f_init_gprs_ms();
2707 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002708
2709 /* Initialize the PCU interface abstraction */
2710 f_init_raw(testcasename());
2711
2712 /* Establish BSSGP connection to the PCU */
2713 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002714 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002715
2716 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002717 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2718 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002719
2720 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2721 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002722 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002723
2724 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2725 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2726 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002727 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002728
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002729 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2730 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002731 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002732
2733 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002734 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2735 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2736 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002737
2738 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002739}
2740
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002741/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2742testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2743 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2744 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002745 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002746 var RlcmacDlBlock dl_block;
2747 var uint32_t ack_fn;
2748 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002749 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002750 timer T := 5.0;
2751
2752 /* Initialize NS/BSSGP side */
2753 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002754 /* Initialize GPRS MS side */
2755 f_init_gprs_ms();
2756 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002757
2758 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002759 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002760
Daniel Willmann535aea62020-09-21 13:27:08 +02002761 f_statsd_reset();
2762
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002763 /* Establish BSSGP connection to the PCU */
2764 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002765 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002766
2767 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002768 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2769 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002770
2771 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2772 f_sleep(X2002);
2773
2774 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2775 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002776 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002777
2778 /* TDMA frame number on which we are supposed to send the ACK */
2779 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2780
2781 /* SGSN sends more blocks during the indicated RRBP */
2782 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2783 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002784 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002785
2786 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2787
2788 /* Make sure this block has the same TFI as was assigned
2789 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002790 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002791 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2792 dl_block.data.mac_hdr.hdr_ext.tfi);
2793 f_shutdown(__BFILE__, __LINE__);
2794 }
2795
2796 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002797 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002798
2799 /* Break if this is the end of RRBP */
2800 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002801 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002802 break;
2803 }
2804 }
2805
2806 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002807 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc), fn := fn);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002808
2809 /* Make sure that the next block (after the Ack) is dummy */
2810 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2811
Daniel Willmann535aea62020-09-21 13:27:08 +02002812 var StatsDExpects expect := {
2813 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2814 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2815 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2816 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2817 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002818 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002819 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2820 };
2821 f_statsd_expect(expect);
2822
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002823 f_shutdown(__BFILE__, __LINE__, final := true);
2824}
2825
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002826/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2827 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2828 * Check "3GPP TS 44.060" Annex B. */
2829testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2830 var RlcmacDlBlock dl_block;
2831 var octetstring dataA := f_rnd_octstring(20);
2832 var octetstring dataB := f_rnd_octstring(13);
2833 var octetstring dataC := f_rnd_octstring(3);
2834 var octetstring dataD := f_rnd_octstring(12);
2835 var uint32_t sched_fn;
2836 var GprsMS ms;
2837 var template (value) RlcmacUlBlock ul_data;
2838
2839 /* Initialize NS/BSSGP side */
2840 f_init_bssgp();
2841 /* Initialize GPRS MS side */
2842 f_init_gprs_ms();
2843 ms := g_ms[0]; /* We only use first MS in this test */
2844
2845 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002846 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002847
2848 /* Establish BSSGP connection to the PCU */
2849 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002850 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002851
2852 /* Establish an Uplink TBF */
2853 f_ms_establish_ul_tbf(ms);
2854
2855 /* Summary of what's transmitted:
2856 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2857 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2858 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2859 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2860 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2861 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2862 */
2863
2864 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002865 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2866 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002867 cv := 3,
2868 bsn := ms.ul_tbf.bsn,
2869 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2870 tlli := ms.tlli);
2871 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2872 * RLCMAC block being sent. */
2873 ul_data.data.mac_hdr.e := true;
2874 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002875 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002876
2877 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002878 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2879 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002880 cv := 2,
2881 bsn := ms.ul_tbf.bsn,
2882 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2883 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2884 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2885 },
2886 tlli := ms.tlli);
2887 f_ultbf_inc_bsn(ms.ul_tbf);
2888 f_ms_tx_ul_block(ms, ul_data);
2889
2890 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002891 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataA));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002892
2893 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002894 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2895 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002896 cv := 1,
2897 bsn := ms.ul_tbf.bsn,
2898 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2899 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2900 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2901 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2902 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2903 },
2904 tlli := ms.tlli);
2905 f_ultbf_inc_bsn(ms.ul_tbf);
2906 f_ms_tx_ul_block(ms, ul_data);
2907
2908 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002909 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2910 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataC));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002911
2912 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002913 ul_data := t_RLCMAC_UL_DATA_TLLI(
2914 cs := CS_1,
2915 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002916 cv := 0,
2917 bsn := ms.ul_tbf.bsn,
2918 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2919 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2920 },
2921 tlli := ms.tlli);
2922 f_ultbf_inc_bsn(ms.ul_tbf);
2923 f_ms_tx_ul_block(ms, ul_data);
2924
2925 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002926 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataD));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002927
2928 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2929 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2930 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2931
2932 f_shutdown(__BFILE__, __LINE__, final := true);
2933}
2934
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002935/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2936 * ACK/NACK is not answered */
2937testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2938 var RlcmacDlBlock dl_block;
2939 var octetstring data1 := f_rnd_octstring(200);
2940 var octetstring data2 := f_rnd_octstring(10);
2941 var uint32_t dl_fn;
2942 var GprsMS ms;
2943 var template (value) TsTrxBtsNum nr;
2944 var BTS_PDTCH_Block data_msg;
2945
2946 /* Initialize NS/BSSGP side */
2947 f_init_bssgp();
2948 /* Initialize GPRS MS side */
2949 f_init_gprs_ms();
2950 ms := g_ms[0]; /* We only use first MS in this test */
2951
2952 /* Initialize the PCU interface abstraction */
2953 f_init_raw(testcasename())
2954
2955 /* Establish BSSGP connection to the PCU */
2956 f_bssgp_establish();
2957 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2958
2959 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2960 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2961 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2962
2963 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2964 f_sleep(X2002);
2965
2966 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2967 while (true) {
2968 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2969
2970 /* Keep Ack/Nack description updated (except for last BSN) */
2971 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2972
2973 if (f_dl_block_rrbp_valid(dl_block)) {
2974 /* Don't transmit DL ACK here on purpose ignore it */
2975 break;
2976 }
2977 }
2978
2979 /* PCU starts whole process again */
2980 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2981
2982 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2983 f_sleep(X2002);
2984
2985 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2986 /* DL data), after that we receive only DUMMY blocks so we are done */
2987 var boolean data_received := false;
2988 nr := ts_TsTrxBtsNum;
2989 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2990 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2991 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2992 block_nr := nr.blk_nr));
2993 alt {
2994 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2995 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07002996 tr_RLCMAC_DL_DUMMY_CTRL)) { /* done */ }
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002997 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2998 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2999 tr_RLCMAC_DATA)) -> value data_msg {
3000 data_received := true;
3001 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
3002 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
3003 log("Received FINAL_ACK");
3004 ms.dl_tbf.acknack_desc.final_ack := '1'B;
3005 }
3006 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
3007 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3008 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
3009 }
3010 nr := ts_TsTrxBtsNum;
3011 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3012 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3013 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3014 block_nr := nr.blk_nr));
3015 repeat;
3016 }
3017 [] BTS.receive {
3018 setverdict(fail, "Unexpected BTS message");
3019 f_shutdown(__BFILE__, __LINE__);
3020 }
3021 }
3022
3023 f_shutdown(__BFILE__, __LINE__, final := true);
3024}
3025
Pau Espin Pedrol6844c162022-04-01 15:40:06 +02003026/* OS#5508: Verify scheduling of LLC frames with SAPI=1 (GMM) takes precedence
3027 * over SAPI2/7/8 which in turn take prececende over others */
3028testcase TC_dl_llc_sapi_priority() runs on RAW_PCU_Test_CT {
3029 var octetstring data_sapi1 := f_pad_oct('01'O, 19, 'ff'O);
3030 var octetstring data_sapi2 := f_pad_oct('02'O, 19, 'ff'O);
3031 var octetstring data_sapi7 := f_pad_oct('07'O, 19, 'ff'O);
3032 var octetstring data_sapi8 := f_pad_oct('08'O, 19, 'ff'O);
3033 var octetstring data_sapi_other := f_pad_oct('03'O, 19, 'ff'O);
3034 var RlcmacDlBlock dl_block;
3035 var uint32_t dl_fn;
3036 var GprsMS ms;
3037 var integer state := 1;
3038
3039 /* Initialize NS/BSSGP side */
3040 f_init_bssgp();
3041 /* Initialize GPRS MS side */
3042 f_init_gprs_ms();
3043 ms := g_ms[0]; /* We only use first MS in this test */
3044
3045 /* Initialize the PCU interface abstraction */
3046 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3047
3048 /* Lock to CS1 to keep same DL RLCMAC data block size: */
3049 g_cs_initial_dl := 1;
3050 g_mcs_max_dl := 1;
3051 f_pcuvty_set_allowed_cs_mcs();
3052
3053 /* Establish BSSGP connection to the PCU */
3054 f_bssgp_establish();
3055 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3056
3057 /* SGSN sends some low prio DL data, PCU will page on CCCH (PCH) */
3058 for (var integer i := 0; i < 10; i := i + 1) {
3059 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi_other));
3060 }
3061 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi2));
3062 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi7));
3063 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi8));
3064 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi1));
3065 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3066
3067 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3068 f_sleep(X2002);
3069
3070 while (state != 0) {
3071 var OCT1 rx_sapi;
3072 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
3073 rx_sapi := dl_block.data.blocks[0].payload[0];
3074
3075 select (state) {
3076 case(1) { /* We expect the first GMM LLC frame here (SAPI=1, highest prio) */
3077 if (rx_sapi != '01'O) {
3078 setverdict(fail, "Wrong prio: Expected LLC SAPI 1 (GMM) but got ", rx_sapi);
3079 f_shutdown(__BFILE__, __LINE__);
3080 }
3081 state := 2;
3082 }
3083 case(2) { /* We expect the second LLC frame here (SAPI=2, middle prio) */
3084 if (rx_sapi != '02'O) {
3085 setverdict(fail, "Wrong prio: Expected LLC SAPI 2 but got ", rx_sapi);
3086 f_shutdown(__BFILE__, __LINE__);
3087 }
3088 state := 7;
3089 }
3090 case(7) { /* We expect the third LLC frame here (SAPI=7, middle prio) */
3091 if (rx_sapi != '07'O) {
3092 setverdict(fail, "Wrong prio: Expected LLC SAPI 7 but got ", rx_sapi);
3093 f_shutdown(__BFILE__, __LINE__);
3094 }
3095 state := 8;
3096 }
3097 case(8) { /* We expect the fourth LLC frame here (SAPI=8, middle prio) */
3098 if (rx_sapi != '08'O) {
3099 setverdict(fail, "Wrong prio: Expected LLC SAPI 8 but got ", rx_sapi);
3100 f_shutdown(__BFILE__, __LINE__);
3101 }
3102 state := 3;
3103 }
3104 case(3) { /* We expect the other LLC frame here (SAPI=3, lower prio) */
3105 if (rx_sapi != '03'O) {
3106 setverdict(fail, "Wrong prio: Expected LLC SAPI 3 but got ", rx_sapi);
3107 f_shutdown(__BFILE__, __LINE__);
3108 }
3109 state := 0; /* Done, break */
3110 }
3111 }
3112 /* Keep Ack/Nack description updated (except for last BSN) */
3113 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
3114
3115 if (f_dl_block_rrbp_valid(dl_block)) {
3116 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3117 f_dl_block_ack_fn(dl_block, dl_fn));
3118 }
3119 }
3120
3121 f_shutdown(__BFILE__, __LINE__, final := true);
3122}
3123
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003124/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
3125testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003126 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003127 var octetstring data := f_rnd_octstring(10);
3128 var PacketDlAssign dl_tbf_ass;
3129 var RlcmacDlBlock dl_block;
3130 var uint32_t poll_fn;
3131 var uint32_t sched_fn;
3132 var GprsMS ms;
3133 timer T := 5.0;
3134
3135 /* Initialize NS/BSSGP side */
3136 f_init_bssgp();
3137 /* Initialize GPRS MS side */
3138 f_init_gprs_ms();
3139 ms := g_ms[0]; /* We only use first MS in this test */
3140
3141 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003142 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3143 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003144
3145 /* Initialize the PCU interface abstraction */
3146 f_init_raw(testcasename(), info_ind);
3147
3148 /* Establish BSSGP connection to the PCU */
3149 f_bssgp_establish();
3150 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3151
3152 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
3153 through PDCH (no multiblock assignment possible through PCH) */
3154 f_ms_establish_ul_tbf(ms);
3155
3156 /* Send one UL block (with TLLI since we are in One-Phase Access
3157 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003158 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
3159 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003160 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3161 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3162
3163 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
3164 var MultislotCap_GPRS_BSSGP mscap_gprs := {
3165 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3166 gprsextendeddynalloccap := '0'B
3167 };
3168 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
3169 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3170 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
3171 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
3172 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
3173 f_shutdown(__BFILE__, __LINE__);
3174 }
3175 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3176
3177 f_shutdown(__BFILE__, __LINE__, final := true);
3178}
3179
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003180testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003181 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003182 var RlcmacDlBlock dl_block;
3183 var octetstring data := f_rnd_octstring(10);
3184 var PollFnCtx pollctx;
3185 var uint32_t sched_fn;
3186 var GprsMS ms;
3187
3188 var MultislotCap_GPRS mscap_gprs := {
3189 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3190 gprsextendeddynalloccap := '0'B
3191 };
3192 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3193
3194
3195 /* Initialize NS/BSSGP side */
3196 f_init_bssgp();
3197 /* Initialize GPRS MS side */
3198 f_init_gprs_ms();
3199 ms := g_ms[0]; /* We only use first MS in this test */
3200
3201 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003202 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3203 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003204
3205 /* Initialize the PCU interface abstraction */
3206 f_init_raw(testcasename(), info_ind);
3207
3208 /* Establish BSSGP connection to the PCU */
3209 f_bssgp_establish();
3210 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3211
3212 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3213 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3214
3215 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3216 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
3217
3218 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3219 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
3220 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
3221 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
3222 f_shutdown(__BFILE__, __LINE__);
3223 }
3224 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3225
3226 f_shutdown(__BFILE__, __LINE__, final := true);
3227}
3228
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003229testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
3230 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3231 var RlcmacDlBlock dl_block;
3232 var octetstring data := f_rnd_octstring(10);
3233 var PollFnCtx pollctx;
3234 var uint32_t sched_fn;
3235 var GprsMS ms;
3236
3237 var MultislotCap_GPRS mscap_gprs := {
3238 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3239 gprsextendeddynalloccap := '0'B
3240 };
3241 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3242
3243
3244 /* Initialize NS/BSSGP side */
3245 f_init_bssgp();
3246 /* Initialize GPRS MS side */
3247 f_init_gprs_ms();
3248 ms := g_ms[0]; /* We only use first MS in this test */
3249
3250 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003251 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3252 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003253
3254 /* Initialize the PCU interface abstraction */
3255 f_init_raw(testcasename(), info_ind);
3256
3257 /* Establish BSSGP connection to the PCU */
3258 f_bssgp_establish();
3259 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3260
3261 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3262 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3263
3264 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
3265 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
3266 f_shutdown(__BFILE__, __LINE__);
3267 }
3268
3269 f_shutdown(__BFILE__, __LINE__, final := true);
3270}
3271
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003272/* Test scenario where MS wants to request a new TBF once the current one is
3273 * ending, by means of sending a Packet Resource Request on ul slot provided by
3274 * last Pkt Ul ACK's RRBP.
3275 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3276testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003277 var RlcmacDlBlock dl_block;
3278 var octetstring data := f_rnd_octstring(10);
3279 var uint32_t sched_fn;
3280 var uint32_t dl_fn;
3281 var template RlcmacDlBlock acknack_tmpl;
3282 var GprsMS ms;
3283
3284 /* Initialize NS/BSSGP side */
3285 f_init_bssgp();
3286 /* Initialize GPRS MS side */
3287 f_init_gprs_ms();
3288 ms := g_ms[0]; /* We only use first MS in this test */
3289
3290 /* Initialize the PCU interface abstraction */
3291 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003292 f_statsd_reset();
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003293
3294 /* Establish BSSGP connection to the PCU */
3295 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003296 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003297
3298 /* Establish an Uplink TBF */
3299 f_ms_establish_ul_tbf(ms);
3300
3301 /* Send one UL block (with TLLI since we are in One-Phase Access
3302 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003303 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003304
3305 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003306 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003307
3308 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3309 tr_UlAckNackGprs(ms.tlli,
3310 tr_AckNackDescription(final_ack := '1'B),
3311 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3312 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3313
3314 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3315
3316 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07003317 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)), sched_fn);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07003318 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003319 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3320 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3321
3322 /* Send one UL block (without TLLI since we are in Second-Phase Access)
3323 and make sure it is ACKED fine */
3324 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
3325
3326 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003327 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003328
3329 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3330 /* ACK the ACK */
3331 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3332
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003333 var StatsDExpects expect := {
3334 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
3335 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
3336 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
3337 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3338 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
3339 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 1, max := 1 },
3340 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
3341 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
3342 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
3343 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
3344 };
3345 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003346
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003347 f_shutdown(__BFILE__, __LINE__, final := true);
3348}
3349
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003350/* Test scenario where MS wants to request a new TBF once the current one is
3351 * ending, by means of sending a Packet Resource Request on ul slot provided by
3352 * last Pkt Ul ACK's RRBP. new Pkt Ul Ass is never confirmed by the MS in this test.
3353 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3354testcase TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() runs on RAW_PCU_Test_CT {
3355 var PCUIF_info_ind info_ind;
3356 var RlcmacDlBlock dl_block;
3357 var octetstring data := f_rnd_octstring(10);
3358 var uint32_t sched_fn;
3359 var uint32_t dl_fn;
3360 var template (value) TsTrxBtsNum nr;
3361 var BTS_PDTCH_Block data_msg;
3362 var template RlcmacDlBlock acknack_tmpl;
3363 var GprsMS ms;
3364 const integer N3105_MAX := 2;
3365 var integer N3105 := 0;
3366 timer T_3195 := 1.0 + 0.5; /* 0.5: extra offset since we cannot match exactly */
3367
3368 /* Initialize NS/BSSGP side */
3369 f_init_bssgp();
3370 /* Initialize GPRS MS side */
3371 f_init_gprs_ms();
3372 ms := g_ms[0]; /* We only use first MS in this test */
3373
3374 /* Initialize the PCU interface abstraction */
3375 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3376 /* Speedup test: */
3377 info_ind.n3105 := N3105_MAX;
3378 info_ind.t3195 := 1;
3379 f_init_raw(testcasename(), info_ind);
3380
3381 /* Establish BSSGP connection to the PCU */
3382 f_bssgp_establish();
3383 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3384
3385 /* Establish an Uplink TBF */
3386 f_ms_establish_ul_tbf(ms);
3387
3388 /* Send one UL block (with TLLI since we are in One-Phase Access
3389 contention resoultion) and make sure it is ACKED fine */
3390 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
3391
3392 /* UL block should be received in SGSN */
3393 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
3394
3395 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3396 tr_UlAckNackGprs(ms.tlli,
3397 tr_AckNackDescription(final_ack := '1'B),
3398 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3399 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3400
3401 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3402
3403 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
3404 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)), sched_fn);
3405
3406 /* Now Keep ignoring the Pkt Ul Ass on PACCH: */
3407 /* Now we go on receiving DL data and not answering RRBP: */
3408 nr := ts_TsTrxBtsNum;
3409 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3410 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3411 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3412 block_nr := nr.blk_nr));
3413 alt {
3414 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3415 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3416 tr_RLCMAC_UL_PACKET_ASS)) -> value data_msg {
3417 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
3418 log("Ignoring RRBP N3105 ", N3105);
3419 N3105 := N3105 + 1;
3420 }
3421 nr := ts_TsTrxBtsNum;
3422 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3423 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3424 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3425 block_nr := nr.blk_nr));
3426 repeat;
3427 }
3428 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
3429 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
3430 */
3431 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3432 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07003433 tr_RLCMAC_DL_DUMMY_CTRL)) -> value data_msg {
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003434 if (not T_3195.running) {
3435 T_3195.start;
3436 }
3437 nr := ts_TsTrxBtsNum;
3438 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3439 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3440 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3441 block_nr := nr.blk_nr));
3442 repeat;
3443 }
3444 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3445 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3446 omit)) -> value data_msg {
3447 /* We may already receive idle blocks before our own TTCN3 timer
3448 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
3449 nr := ts_TsTrxBtsNum;
3450 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3451 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3452 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3453 block_nr := nr.blk_nr));
3454 repeat;
3455 }
3456 /* We receive Dummy blocks in between Pkt Ul Ass while PCU waits for us to ack it */
3457 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3458 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07003459 tr_RLCMAC_DL_DUMMY_CTRL)) -> value data_msg {
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003460 log("Ignoring Dummy block FN ", data_msg.raw.fn);
3461 nr := ts_TsTrxBtsNum;
3462 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3463 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3464 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3465 block_nr := nr.blk_nr));
3466 repeat;
3467 }
3468 [T_3195.running] T_3195.timeout {
3469 log("T_3195 timeout");
3470 /* Done in alt, wait for pending RTS initiated previously in
3471 * above case before continuing (expect nothing to be sent since there's no active TBF): */
3472 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3473 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3474 omit));
3475 }
3476 [] BTS.receive {
3477 setverdict(fail, "Unexpected BTS message");
3478 f_shutdown(__BFILE__, __LINE__);
3479 }
3480 }
3481
3482 f_shutdown(__BFILE__, __LINE__, final := true);
3483}
3484
Pau Espin Pedrol59aa1092021-11-15 18:53:34 +01003485/* Test scenario where MS wants to request a new UL TBF using a DL (EGPRS) ACK/NACK
3486 * transmitted on ul slot provided by its DL TBF.
3487 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3488function f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(boolean use_egprs) runs on RAW_PCU_Test_CT {
3489 var GprsMS ms;
3490 var octetstring data := f_rnd_octstring(10);
3491 var RlcmacDlBlock dl_block;
3492 var template RlcmacDlBlock rej_tmpl;
3493 var uint32_t dl_fn;
3494 var uint32_t sched_fn;
3495 var template (value) MSRadioAccessCapabilityV_BSSGP racap_tmpl;
3496
3497 if (use_egprs == true) {
3498 racap_tmpl := bssgp_ms_racap_egprs_def;
3499 } else {
3500 racap_tmpl := bssgp_ms_racap_gprs_def;
3501 }
3502
3503 /* Initialize NS/BSSGP side */
3504 f_init_bssgp();
3505 /* Initialize GPRS MS side */
3506 f_init_gprs_ms();
3507 ms := g_ms[0]; /* We only use first MS in this test */
3508 /* Initialize the PCU interface abstraction */
3509 f_init_raw(testcasename());
3510
3511 /* Establish BSSGP connection to the PCU */
3512 f_bssgp_establish();
3513 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3514
3515 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3516 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, racap_tmpl));
3517 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3518
3519 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3520 f_sleep(X2002);
3521 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3522
3523 /* ACK the DL block, asking for new UL TBF by including ChanReqDesc */
3524 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
3525 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, use_egprs, ts_ChannelReqDescription()),
3526 f_dl_block_ack_fn(dl_block, dl_fn));
3527
3528 /* We should receive a Pkt Ul ASS */
3529 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
3530 f_shutdown(__BFILE__, __LINE__, final := true);
3531}
3532testcase TC_ul_tbf_reestablish_with_pkt_dl_ack_nack() runs on RAW_PCU_Test_CT {
3533 f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(false);
3534}
3535testcase TC_ul_tbf_reestablish_with_pkt_dl_ack_nack_egprs() runs on RAW_PCU_Test_CT {
3536 f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(true);
3537}
3538
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003539/* Test CS paging over the BTS<->PCU socket.
3540 * When a (class B or C, not A) MS has an active TBF (or is on the PDCH), the MS can not react on CS paging over CCCH.
3541 * Paging should be send on the PACCH.
3542 *
3543 * 1. Send a Paging Request over PCU socket.
3544 * 2. Send a Ready-To-Send message over PCU socket
3545 * 3. Expect a Paging Frame
3546 */
3547testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003548 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003549 var MobileIdentityLV mi;
3550 var octetstring mi_enc_lv;
3551 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003552 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003553
3554 /* Initialize NS/BSSGP side */
3555 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003556 /* Initialize GPRS MS side */
3557 f_init_gprs_ms();
3558 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003559
3560 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003561 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003562
3563 /* Establish BSSGP connection to the PCU */
3564 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003565 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003566
3567 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003568 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003569
3570 /* build mobile Identity */
3571 mi := valueof(ts_MI_IMSI_LV(imsi));
3572 mi_enc_lv := enc_MobileIdentityLV(mi);
3573 /* Send paging request */
3574 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
3575 sapi :=PCU_IF_SAPI_PDTCH));
3576
3577 /* Receive it on BTS side towards MS */
3578 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3579
3580 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003581 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3582 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3583 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3584 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003585
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003586 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003587}
3588
3589/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
3590 */
3591private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3592runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003593 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003594 var hexstring imsi := f_gen_imsi(42);
3595 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003596 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003597
3598 /* Initialize NS/BSSGP side */
3599 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003600 /* Initialize GPRS MS side */
3601 f_init_gprs_ms();
3602 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003603
3604 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003605 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003606
3607 /* Establish BSSGP connection to the PCU */
3608 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003609 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003610
3611 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003612 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003613
3614 /* Send paging request with or without TMSI */
3615 if (use_ptmsi) {
3616 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3617 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3618 } else {
3619 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3620 }
3621
3622 /* Receive it on BTS side towards MS */
3623 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3624
3625 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003626 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003627 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003628 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3629 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3630 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003631 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003632 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3633 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3634 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003635 }
3636
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003637 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003638}
3639
3640testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3641 f_tc_paging_cs_from_sgsn(0, true);
3642}
3643
3644testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3645 f_tc_paging_cs_from_sgsn(0);
3646}
3647
3648testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003649 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003650}
3651
3652/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3653 */
3654private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3655runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003656 var integer imsi_suff_tx := 423;
3657 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003658 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003659
3660 /* Initialize NS/BSSGP side */
3661 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003662 /* Initialize GPRS MS side */
3663 f_init_gprs_ms();
3664 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003665
Oliver Smith61b4e732021-07-22 08:14:29 +02003666 f_statsd_reset();
3667
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003668 /* Establish BSSGP connection to the PCU */
3669 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003670 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003671
3672 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3673 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3674 if (use_ptmsi) {
3675 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3676 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3677 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3678 } else {
3679 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3680 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3681 }
3682
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003683 var StatsDExpects expect := {
3684 { name := "TTCN3.pcu.sgsn.0.rx_paging_ps", mtype := "c", min := 1, max := 1 },
3685 /* After the PCU receives the paging request from SGSN,
3686 * and it doesn't have any errors, PCU sends it to the
3687 * BTS to do paging over PCH. */
3688 { name := "TTCN3.bts.0.pch.requests", mtype := "c", min := 1, max := 1 }
3689 };
3690 f_statsd_expect(expect);
Oliver Smithfbd39312021-07-27 15:23:39 +02003691}
3692
3693testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3694 /* Initialize the PCU interface abstraction */
3695 f_init_raw(testcasename());
3696
3697 f_tc_paging_ps_from_sgsn(0, true);
Oliver Smith61b4e732021-07-22 08:14:29 +02003698
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003699 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003700}
3701
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003702testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003703 /* Initialize the PCU interface abstraction */
3704 f_init_raw(testcasename());
3705
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003706 f_tc_paging_ps_from_sgsn(0);
Oliver Smithfbd39312021-07-27 15:23:39 +02003707
3708 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003709}
3710
3711testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003712 /* Initialize the PCU interface abstraction */
3713 f_init_raw(testcasename());
3714
Harald Welte5339b2e2020-10-04 22:52:56 +02003715 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Oliver Smithfbd39312021-07-27 15:23:39 +02003716
3717 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003718}
3719
Oliver Smithe1a77c42021-07-28 13:36:09 +02003720testcase TC_paging_pch_timeout() runs on RAW_PCU_Test_CT {
3721 /* Initialize the PCU interface abstraction */
3722 f_init_raw(testcasename());
3723
3724 /* Set T3113 to 1s to shorten the test duration */
3725 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 1");
3726
3727 /* Reset stats and send paging PS request */
3728 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
3729
3730 /* Verify that counter increases when T3113 times out (MS did not start
3731 * TBF to respond to paging). */
3732 f_sleep(1.2);
3733 var StatsDExpects expect := {
3734 { name := "TTCN3.bts.0.pch.requests.timeout", mtype := "c", min := 1, max := 1 }
3735 };
3736 f_statsd_expect(expect);
3737
3738 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 default");
3739 f_shutdown(__BFILE__, __LINE__, final := true);
3740}
3741
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003742/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3743testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3744 var RlcmacDlBlock dl_block;
3745 var octetstring data := f_rnd_octstring(10);
3746 var uint32_t sched_fn;
3747 var uint32_t dl_fn;
3748 var GprsMS ms;
3749
3750 /* Initialize NS/BSSGP side */
3751 f_init_bssgp();
3752 /* Initialize GPRS MS side */
3753 f_init_gprs_ms();
3754 ms := g_ms[0]; /* We only use first MS in this test */
3755
3756 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003757 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003758
Daniel Willmann535aea62020-09-21 13:27:08 +02003759 f_statsd_reset();
3760
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003761 /* Establish BSSGP connection to the PCU */
3762 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003763 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003764
3765 /* Establish an Uplink TBF */
3766 f_ms_establish_ul_tbf(ms);
3767
3768 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003769 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003770 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3771 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3772 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3773
3774 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003775 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003776
3777 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3778 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3779 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3780
3781 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3782 f_sleep(X2002);
3783 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3784
3785 /* ACK the DL block */
3786 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3787 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3788 f_dl_block_ack_fn(dl_block, dl_fn));
3789
Daniel Willmann535aea62020-09-21 13:27:08 +02003790 var StatsDExpects expect := {
3791 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3792 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3793 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3794 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003795 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003796 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003797 };
3798 f_statsd_expect(expect);
3799
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003800 f_shutdown(__BFILE__, __LINE__, final := true);
3801}
3802
3803/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3804testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3805 var RlcmacDlBlock dl_block;
3806 var octetstring data := f_rnd_octstring(10);
3807 var uint32_t sched_fn;
3808 var uint32_t dl_fn;
3809 var GprsMS ms;
3810
3811 /* Initialize NS/BSSGP side */
3812 f_init_bssgp();
3813 /* Initialize GPRS MS side */
3814 f_init_gprs_ms();
3815 ms := g_ms[0]; /* We only use first MS in this test */
3816
3817 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003818 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003819
3820 /* Establish BSSGP connection to the PCU */
3821 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003822 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003823
3824 /* Establish an Uplink TBF */
3825 f_ms_establish_ul_tbf(ms);
3826
3827 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003828 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003829 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3830 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3831 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3832
3833 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003834 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003835
3836 /* Now SGSN sends some DL data with an invalid IMSI */
3837 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3838
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003839 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003840
3841 /* TODO: make sure no data is sent over PCU -> MS */
3842
3843 f_shutdown(__BFILE__, __LINE__, final := true);
3844}
3845
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003846private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3847 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3848 var octetstring data := f_rnd_octstring(6);
3849 var RlcmacDlBlock dl_block;
3850 var GprsMS ms;
3851 var uint32_t fn;
3852
3853 /* Initialize NS/BSSGP side */
3854 f_init_bssgp();
3855 /* Initialize GPRS MS side */
3856 f_init_gprs_ms();
3857 ms := g_ms[0]; /* We only use first MS in this test */
3858
3859 /* Initialize the PCU interface abstraction */
3860 f_init_raw(testcasename());
3861
3862 /* Establish BSSGP connection to the PCU */
3863 f_bssgp_establish();
3864 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3865
3866 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3867 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3868 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3869
3870 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3871 f_sleep(X2002);
3872
3873 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3874 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3875
3876 if (ischosen(dl_block.data_egprs)) {
3877 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3878 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3879 f_shutdown(__BFILE__, __LINE__);
3880 }
3881 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3882 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3883 f_shutdown(__BFILE__, __LINE__);
3884 }
3885 if (not match(dl_block.data_egprs.blocks[1].payload,
3886 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3887 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3888 f_shutdown(__BFILE__, __LINE__);
3889 }
3890 } else if (lengthof(dl_block.data.blocks) > 1) {
3891 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3892 f_shutdown(__BFILE__, __LINE__);
3893 }
3894
3895 f_shutdown(__BFILE__, __LINE__, final := true);
3896}
3897
3898/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3899 * containing llc data. See OS#4849 */
3900testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3901 f_tc_dl_data_no_llc_ui_dummy(omit);
3902}
3903
3904/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3905 * containing llc data. See OS#4849 */
3906testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003907 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003908}
3909
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003910private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003911 template GsmRrMessage t_imm_ass := ?,
3912 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003913runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003914 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003915 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003916
3917 ra11 := enc_EGPRSPktChRequest2uint(req);
3918 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3919
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003920 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003921 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003922 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003923 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003924 }
3925
3926 setverdict(pass);
3927}
3928
3929testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3930 var template GsmRrMessage imm_ass;
3931 var template IaRestOctets rest;
3932 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003933 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003934
3935 /* Initialize the PCU interface abstraction */
3936 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003937 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003938
3939 var EGPRSPktChRequest req := {
3940 /* NOTE: other fields are set in the loop */
3941 signalling := { tag := '110011'B }
3942 };
3943
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003944 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003945 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3946 req.signalling.random_bits := ext_ra;
3947
3948 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3949 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3950 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3951 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3952
3953 f_TC_egprs_pkt_chan_req(req, imm_ass);
3954 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003955
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003956 var StatsDExpects expect := {
3957 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3958 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3959 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3960 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
3961 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3962 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
3963 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
3964 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3965 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3966 };
3967 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003968
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003969 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003970}
3971
3972testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3973 var template GsmRrMessage imm_ass;
3974 var template IaRestOctets rest;
3975 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003976 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003977
3978 /* Initialize the PCU interface abstraction */
3979 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003980 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003981
3982 var EGPRSPktChRequest req := {
3983 /* NOTE: other fields are set in the loop */
3984 one_phase := { tag := '0'B }
3985 };
3986
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003987 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003988 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3989 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3990 var BIT2 priority := substr(ext_ra, 0, 2);
3991 var BIT3 rand := substr(ext_ra, 2, 3);
3992
3993 req.one_phase.multislot_class := mslot_class;
3994 req.one_phase.priority := priority;
3995 req.one_phase.random_bits := rand;
3996
3997 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3998 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3999 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
4000 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
4001
4002 f_TC_egprs_pkt_chan_req(req, imm_ass);
4003 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004004
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004005 var StatsDExpects expect := {
4006 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4007 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4008 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := num_req, max := num_req },
4009 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4010 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
4011 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := num_req, max := num_req },
4012 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4013 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4014 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4015 };
4016 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004017
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004018 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004019}
4020
4021testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
4022 var template GsmRrMessage imm_ass;
4023 var template IaRestOctets rest;
4024 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004025 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004026
4027 /* Initialize the PCU interface abstraction */
4028 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004029 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004030
4031 var EGPRSPktChRequest req := {
4032 /* NOTE: other fields are set in the loop */
4033 two_phase := { tag := '110000'B }
4034 };
4035
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004036 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004037 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
4038 var BIT2 priority := substr(ext_ra, 0, 2);
4039 var BIT3 rand := substr(ext_ra, 2, 3);
4040
4041 req.two_phase.priority := priority;
4042 req.two_phase.random_bits := rand;
4043
4044 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
4045 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
4046 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
4047 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
4048
4049 f_TC_egprs_pkt_chan_req(req, imm_ass);
4050 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004051
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004052 var StatsDExpects expect := {
4053 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4054 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4055 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4056 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
4057 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
4058 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
4059 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
4060 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4061 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4062 };
4063 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004064
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004065 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004066}
4067
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004068private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
4069 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004070 PCUIF_BurstType bt := BURST_TYPE_1,
4071 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004072runs on RAW_PCU_Test_CT {
4073 var template ReqRefWaitInd tr_ref;
4074 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004075
4076 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
4077 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
4078 ra := bit2int(ra11), is_11bit := 1,
4079 burst_type := bt, fn := fn,
4080 arfcn := 871));
4081
4082 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07004083 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004084
4085 /* Just to have a short-name reference to the actual message */
4086 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
4087
4088 /* Make sure that Request Reference list contains at least one entry
4089 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004090 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004091 if (not match(iar.payload, { *, tr_ref, * })) {
4092 setverdict(fail, "Request Reference list does not match");
4093 f_shutdown(__BFILE__, __LINE__);
4094 }
4095
4096 /* Match Feature Indicator (must indicate PS domain) */
4097 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
4098 setverdict(fail, "Feature Indicator does not match");
4099 f_shutdown(__BFILE__, __LINE__);
4100 }
4101
4102 /* Match IAR Rest Octets */
4103 if (not match(iar.rest_octets, rest)) {
4104 setverdict(fail, "IAR Rest Octets does not match: ",
4105 iar.rest_octets, " vs expected ", rest);
4106 f_shutdown(__BFILE__, __LINE__);
4107 }
4108
4109 setverdict(pass);
4110}
4111
4112/* Verify the contents of RR Immediate Assignment Reject message and its
4113 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
4114testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
4115 var template IARRestOctets rest;
4116 var BIT5 ext_ra;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004117 const integer num_req := 6;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004118
4119 /* Initialize the PCU interface abstraction */
4120 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004121 f_statsd_reset();
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004122
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004123 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004124 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
4125 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
4126
4127 /* Intentionally incorrect message (see table 11.2.5a.2) */
4128 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
4129 }
4130
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004131 var StatsDExpects expect := {
4132 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4133 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4134 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4135 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4136 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
4137 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
4138 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
4139 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4140 };
4141 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004142
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004143 f_shutdown(__BFILE__, __LINE__, final := true);
4144}
4145
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004146/* At the moment, the IUT does not support any emergency services. Make sure
4147 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
4148testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
4149 var template IARRestOctets rest;
4150 var BIT5 ext_ra;
4151 var BIT11 ra11;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004152 const integer num_req := 6;
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004153
4154 /* Initialize the PCU interface abstraction */
4155 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004156 f_statsd_reset();
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004157
4158 var EGPRSPktChRequest req := {
4159 /* NOTE: other fields are set in the loop */
4160 emergency := { tag := '110111'B }
4161 };
4162
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004163 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004164 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
4165 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
4166
4167 req.emergency.random_bits := ext_ra;
4168 ra11 := enc_EGPRSPktChRequest2bits(req);
4169
4170 /* Intentionally incorrect message (see table 11.2.5a.2) */
4171 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
4172 }
4173
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004174 var StatsDExpects expect := {
4175 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4176 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4177 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4178 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4179 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
4180 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
4181 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
4182 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4183 };
4184 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004185
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004186 f_shutdown(__BFILE__, __LINE__, final := true);
4187}
4188
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004189/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
4190testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004191 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004192 var template IARRestOctets rest;
4193 var BIT11 ra11;
4194
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004195 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004196 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07004197
4198 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004199 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
4200 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004201
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004202 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004203 f_init_raw(testcasename(), info_ind);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004204 f_statsd_reset();
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004205
4206 var EGPRSPktChRequest req := {
4207 one_phase := {
4208 tag := '0'B,
4209 multislot_class := '10101'B,
4210 priority := '01'B,
4211 random_bits := '101'B
4212 }
4213 };
4214
4215 /* We send 7 requests, the IUT gives us all available USFs (0..6).
4216 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
4217 for (var integer i := 0; i < 7; i := i + 1) {
4218 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
4219 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
4220 }
4221
4222 ra11 := enc_EGPRSPktChRequest2bits(req);
4223 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
4224
4225 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004226 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004227
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004228 var StatsDExpects expect := {
4229 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 8, max := 8 },
4230 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 8, max := 8 },
4231 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 8, max := 8 },
4232 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4233 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := 0, max := 0 },
4234 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 7, max := 7 },
4235 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 7, max := 7 },
4236 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4237 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4238 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := 1, max := 1 },
4239 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4240 };
4241 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004242
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004243 f_shutdown(__BFILE__, __LINE__, final := true);
4244}
4245
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004246/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004247private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004248return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004249 /* Pick a random MA length in range 2 .. max_ma_len */
4250 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
4251
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004252 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
4253 hsn := f_rnd_int(63),
4254 maio := f_rnd_int(63),
4255 ma := f_rnd_bitstring(ma_len));
4256}
4257
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004258private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
4259 in GsmRrMessage rr_msg)
4260{
4261 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004262 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004263
4264 var template PacketChannelDescription tr_pkt_chan_desc := {
4265 channel_Type_spare := ?,
4266 tn := ?,
4267 tsc := ts.tsc,
4268 presence := '1'B,
4269 zero := omit,
4270 one := {
4271 maio := ts.maio,
4272 hsn := ts.hsn
4273 }
4274 };
4275
4276 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
4277 setverdict(fail, "Packet Channel Description does not match: ",
4278 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
4279 }
4280
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004281 /* Mobile Allocation is expected to be octet-aligned */
4282 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
4283 var template MobileAllocationLV tr_ma := {
4284 len := ma_oct_len, /* in bytes */
4285 ma := substr(ts.ma, 0, ma_oct_len * 8)
4286 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004287
4288 if (not match(ia.mobile_allocation, tr_ma)) {
4289 setverdict(fail, "Mobile Allocation does not match: ",
4290 ia.mobile_allocation, " vs ", tr_ma);
4291 }
4292
4293 setverdict(pass);
4294}
4295
4296/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
4297testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004298 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004299 var GprsMS ms := valueof(t_GprsMS_def);
4300
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004301 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004302 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004303
4304 /* Initialize the PCU interface abstraction */
4305 f_init_raw(testcasename(), info_ind);
4306
4307 /* EGPRS Packet Channel Request (cause=Signalling) */
4308 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
4309
4310 /* Establish an Uplink EGPRS TBF */
4311 f_ms_establish_ul_tbf(ms);
4312
4313 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4314 f_shutdown(__BFILE__, __LINE__, final := true);
4315}
4316
4317/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
4318testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004319 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004320 var GprsMS ms := valueof(t_GprsMS_def);
4321
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004322 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004323 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004324
4325 /* Initialize the PCU interface abstraction */
4326 f_init_raw(testcasename(), info_ind);
4327
4328 /* Establish an Uplink TBF */
4329 f_ms_establish_ul_tbf(ms);
4330
4331 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4332 f_shutdown(__BFILE__, __LINE__, final := true);
4333}
4334
4335/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
4336testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004337 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004338 var GprsMS ms := valueof(t_GprsMS_def);
4339
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004340 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004341 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004342
4343 /* Initialize NS/BSSGP side */
4344 f_init_bssgp();
4345
4346 /* Initialize the PCU interface abstraction */
4347 f_init_raw(testcasename(), info_ind);
4348
4349 /* Establish BSSGP connection to the PCU */
4350 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004351 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004352
4353 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
4354 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
4355 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4356
4357 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
4358 f_shutdown(__BFILE__, __LINE__, final := true);
4359}
4360
4361private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
4362 in FrequencyParameters fp)
4363{
4364 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004365 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004366
4367 /* Table 12.8.1: Frequency Parameters information elements */
4368 var template FrequencyParameters tr_fp := {
4369 tsc := ts.tsc,
4370 presence := '10'B, /* Direct encoding 1 */
4371 arfcn := omit,
4372 indirect := omit,
4373 direct1 := {
4374 maio := ts.maio,
4375 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
4376 mobile_allocation := {
4377 hsn := ts.hsn,
4378 rfl_number_list_present := '0'B,
4379 rfl_number_list := omit,
4380 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004381 ma_length := ts.ma_bit_len,
4382 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004383 }
4384 },
4385 direct2 := omit
4386 };
4387
4388 if (not match(fp, tr_fp)) {
4389 setverdict(fail, "Frequency Parameters IE does not match: ",
4390 fp, " vs ", tr_fp);
4391 }
4392
4393 setverdict(pass);
4394}
4395
4396/* Make sure that Packet Uplink Assignment contains hopping parameters */
4397testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004398 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004399 var GprsMS ms := valueof(t_GprsMS_def);
4400 var uint32_t poll_fn;
4401
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004402 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004403 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004404
4405 /* Initialize the PCU interface abstraction */
4406 f_init_raw(testcasename(), info_ind);
4407
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004408 /* Single block (two phase) packet access */
4409 var uint16_t ra := bit2int(chan_req_sb);
4410 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
4411
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004412 /* Establish an Uplink TBF */
4413 f_ms_establish_ul_tbf(ms);
4414
4415 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004416 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
4417 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004418
4419 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004420 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
4421 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004422
4423 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
4424 var template (omit) FrequencyParameters fp;
4425 if (ua.is_egprs == '1'B) {
4426 fp := ua.egprs.freq_par;
4427 } else {
4428 fp := ua.gprs.freq_par;
4429 }
4430
4431 /* This is an optional IE, so it's worth to check its presence */
4432 if (istemplatekind(fp, "omit")) {
4433 setverdict(fail, "Frequency Parameters IE is not present");
4434 f_shutdown(__BFILE__, __LINE__);
4435 }
4436
4437 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
4438 f_shutdown(__BFILE__, __LINE__, final := true);
4439}
4440
4441/* Make sure that Packet Downlink Assignment contains hopping parameters */
4442testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004443 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004444 var octetstring data := f_rnd_octstring(10);
4445 var GprsMS ms := valueof(t_GprsMS_def);
4446 var RlcmacDlBlock dl_block;
4447 var uint32_t poll_fn;
4448
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004449 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004450 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004451
4452 /* Initialize NS/BSSGP side */
4453 f_init_bssgp();
4454
4455 /* Initialize the PCU interface abstraction */
4456 f_init_raw(testcasename(), info_ind);
4457
4458 /* Establish BSSGP connection to the PCU */
4459 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004460 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004461
4462 /* Establish an Uplink TBF */
4463 f_ms_establish_ul_tbf(ms);
4464
4465 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004466 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004467
4468 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4469 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
4470 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4471
4472 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
4473 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4474
4475 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004476 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4477 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004478
4479 /* This is an optional IE, so it's worth to check its presence */
4480 if (not ispresent(da.freq_par)) {
4481 setverdict(fail, "Frequency Parameters IE is not present");
4482 f_shutdown(__BFILE__, __LINE__);
4483 }
4484
4485 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
4486 f_shutdown(__BFILE__, __LINE__, final := true);
4487}
4488
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004489/* Check if the IUT handles subsequent INFO.ind messages */
4490testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004491 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004492 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004493
4494 /* Initialize the PCU interface abstraction */
4495 f_init_raw(testcasename(), info_ind);
4496
4497 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
4498 for (var integer i := 0; i < 16; i := i + 1) {
4499 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004500 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004501 }
4502
4503 f_shutdown(__BFILE__, __LINE__, final := true);
4504}
4505
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004506/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
4507testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
4508 var PCUIF_info_ind info_ind;
4509 var integer i;
4510 const integer num_ms := 8;
4511
4512 /* Initialize NS/BSSGP side */
4513 f_init_bssgp();
4514 /* Initialize GPRS MS side */
4515 f_init_gprs_ms(num_ms);
4516
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01004517 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004518 /* Only the 3 first TRX are enabled. The enabled ones all have same
4519 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004520 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
4521 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
4522 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
4523 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004524
4525 /* Initialize the PCU interface abstraction */
4526 f_init_raw(testcasename(), info_ind);
4527
4528 /* Establish BSSGP connection to the PCU */
4529 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004530 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004531
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004532 /* Establish an Uplink TBF for each GprsMS instance */
4533 f_multi_ms_establish_tbf(do_activate := false);
4534
4535 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004536 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004537 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01004538 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004539 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004540 f_shutdown(__BFILE__, __LINE__);
4541 }
4542 }
4543
4544 f_shutdown(__BFILE__, __LINE__, final := true);
4545}
4546
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004547/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
4548 * downgraded to CS1-4 so that GPRS can read the USF).
4549 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
4550 */
4551testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
4552 var PCUIF_info_ind info_ind;
4553 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
4554 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004555 var uint32_t sched_fn, dl_fn, ack_fn;
4556 var octetstring data := f_rnd_octstring(10);
4557 var RlcmacDlBlock dl_block;
4558 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004559 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004560 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
4561 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
4562
4563 /* Initialize NS/BSSGP side */
4564 f_init_bssgp();
4565 /* Initialize GPRS MS side */
4566 f_init_gprs_ms(num_ms);
4567
4568 info_ind := valueof(ts_PCUIF_INFO_default);
4569 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004570 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
4571 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004572
4573 /* Initialize the PCU interface abstraction */
4574 f_init_raw(testcasename(), info_ind);
4575
4576 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
4577 g_mcs_initial_dl := 5;
4578 g_mcs_max_dl := 5;
4579 f_pcuvty_set_allowed_cs_mcs();
4580
4581 /* Establish BSSGP connection to the PCU */
4582 f_bssgp_establish();
4583 f_multi_ms_bssgp_register();
4584
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004585 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004586 pollctx := f_ms_establish_ul_tbf_2phase_access(g_ms[0], ts_RlcMacUlCtrl_PKT_RES_REQ(g_ms[0].tlli, ms_racap_gprs_def));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004587 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
4588 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
4589 f_shutdown(__BFILE__, __LINE__);
4590 }
4591 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4592 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4593
4594 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004595 pollctx := f_ms_establish_ul_tbf_2phase_access(g_ms[1], ts_RlcMacUlCtrl_PKT_RES_REQ(g_ms[1].tlli, ms_racap_egprs_def));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004596 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
4597 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
4598 f_shutdown(__BFILE__, __LINE__);
4599 }
4600 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4601 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4602
4603 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
4604 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4605 f_sleep(0.1);
4606 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4607 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4608 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
4609 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4610 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
4611 /* ACK the DL block */
4612 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
4613 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
4614 f_dl_block_ack_fn(dl_block, dl_fn));
4615
4616 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
4617 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4618 f_sleep(0.1);
4619 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4620 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4621 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
4622 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4623 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
4624 /* ACK the DL block */
4625 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
4626 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
4627 f_dl_block_ack_fn(dl_block, dl_fn));
4628
4629 data := f_rnd_octstring(1400);
4630 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4631 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4632
4633 for (var integer i := 0; i < 800; i := i + 1) {
4634 f_rx_rlcmac_dl_block(dl_block, dl_fn);
4635
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07004636 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL)) {
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004637 /* No more data to receive, done */
4638 break;
4639 }
4640
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004641 usf_ms := -1;
4642
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004643 if (ischosen(dl_block.ctrl)) {
4644 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
4645 f_shutdown(__BFILE__, __LINE__);
4646 } else if (ischosen(dl_block.data_egprs)) {
4647 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
4648 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
4649 f_shutdown(__BFILE__, __LINE__);
4650 }
4651 tgt_ms := 1;
4652 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
4653 if (dl_block.data_egprs.mcs > MCS_4) {
4654 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
4655 f_shutdown(__BFILE__, __LINE__);
4656 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004657 usf_ms := 0;
4658 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004659 } else {
4660 if (dl_block.data_egprs.mcs <= MCS_4) {
4661 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
4662 f_shutdown(__BFILE__, __LINE__);
4663 }
4664 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004665 usf_ms := 1;
4666 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004667 }
4668 }
4669 } else {
4670 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
4671 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
4672 f_shutdown(__BFILE__, __LINE__);
4673 }
4674 tgt_ms := 0;
4675 if (match(dl_block.data.mac_hdr.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004676 usf_ms := 0;
4677 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004678 } else if (match(dl_block.data.mac_hdr.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004679 usf_ms := 1;
4680 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004681 }
4682 }
4683
4684 /* Keep Ack/Nack description updated */
4685 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
4686
4687 /* TDMA frame number on which we are supposed to send the ACK */
4688 if (f_dl_block_rrbp_valid(dl_block)) {
4689 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
4690 f_ms_tx_ul_block(g_ms[tgt_ms], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[tgt_ms].dl_tbf, ischosen(dl_block.data_egprs)), ack_fn);
4691 if (tx_data_remain != 0) {
4692 /* Submit more data from time to time to keep the TBF ongoing */
4693 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4694 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4695 tx_data_remain := tx_data_remain - 1;
4696 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004697 } else if (tx_data_remain != 0) {
4698 /* keep sending UL blocks when requested by USF to avoid
4699 * UL TBF timeout and hence stop receival of USFs */
4700 if (usf_ms != -1) {
4701 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
4702 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004703 }
4704 }
4705
4706 log("results: ms_gprs_usf_count=", ms_gprs_usf_count, " / ms_egprs_usf_count=", ms_egprs_usf_count);
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004707 /* He we check that DL blocks scheduled at GPRS can still request UL
4708 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
4709 * condition also ensures the downgrade to <=MCS4 condition is tested
4710 * above */
4711 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
4712 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004713 f_shutdown(__BFILE__, __LINE__);
4714 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004715 /* Here check for some level of fairness between them (at least ~40%): */
4716 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
4717 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
4718 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
4719 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
4720 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4721 f_shutdown(__BFILE__, __LINE__);
4722 }
4723 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
4724 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4725 f_shutdown(__BFILE__, __LINE__);
4726 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004727
4728 f_shutdown(__BFILE__, __LINE__, final := true);
4729}
4730
4731
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004732private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4733 boolean exp_imsi, boolean exp_tmsi)
4734runs on RAW_PCU_Test_CT {
4735 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4736 var integer pending := lengthof(g_ms);
4737 var RlcmacDlBlock dl_block;
4738 var boolean f1, f2;
4739
4740 while (pending > 0) {
4741 var uint32_t poll_fn;
4742
4743 /* Obtain a Downlink block and make sure it is a paging request */
4744 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4745 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4746 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4747 break;
4748 }
4749
4750 /* This should not happen in general, but who knows... */
4751 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4752 if (not ispresent(req.repeated_pageinfo)) {
4753 setverdict(fail, "Repeated Page Info IE is absent?!?");
4754 break;
4755 }
4756
4757 /* A single message may contain several MIs depending on their type */
4758 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4759 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4760 ps_domain := false);
4761 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4762 ps_domain := false);
4763 if (not f1 and not f2)
4764 { continue; }
4765
4766 /* Detect duplicate MIs */
4767 if (mask[i] == '1'B) {
4768 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4769 continue;
4770 }
4771
4772 mask[i] := '1'B;
4773 }
4774
4775 pending := pending - lengthof(req.repeated_pageinfo);
4776 }
4777
4778 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4779 if (mask[i] != '1'B) {
4780 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4781 log("===== mask := ", mask);
4782 }
4783 }
4784
4785 /* All messages must have been received by now, expect a dummy block */
4786 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4787}
4788
4789private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4790runs on RAW_PCU_Test_CT {
4791 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4792 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4793
4794 /* Initialize NS/BSSGP side */
4795 f_init_bssgp();
4796
4797 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004798 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004799
4800 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4801 f_init_gprs_ms(7 * 8);
4802
4803 /* Initialize the PCU interface abstraction */
4804 f_init_raw(testcasename(), info_ind);
4805
4806 /* Establish BSSGP connection to the PCU */
4807 f_bssgp_establish();
4808 f_multi_ms_bssgp_register();
4809
4810 /* Establish an Uplink TBF for each GprsMS instance */
4811 f_multi_ms_establish_tbf(do_activate := true);
4812}
4813
4814testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4815 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4816
4817 /* Common part: send INFO.ind, establish TBFs... */
4818 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4819
4820 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4821 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4822 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4823 }
4824
4825 /* FIXME: work around a race condition between PCUIF and BSSGP */
4826 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4827
4828 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4829 * The IUT is expected to page on all PDCH slots of all transceivers. */
4830 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4831 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4832 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4833 }
4834
4835 f_shutdown(__BFILE__, __LINE__, final := true);
4836}
4837
4838testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4839 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4840
4841 /* Common part: send INFO.ind, establish TBFs... */
4842 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4843
4844 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4845 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4846 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4847 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4848 }
4849
4850 /* FIXME: work around a race condition between PCUIF and BSSGP */
4851 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4852
4853 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4854 * The IUT is expected to page on all PDCH slots of all transceivers. */
4855 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4856 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4857 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4858 }
4859
4860 f_shutdown(__BFILE__, __LINE__, final := true);
4861}
4862
4863testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4864 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4865
4866 /* Common part: send INFO.ind, establish TBFs... */
4867 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4868
4869 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4870 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4871 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4872 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4873 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4874 } else {
4875 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4876 }
4877 }
4878
4879 /* FIXME: work around a race condition between PCUIF and BSSGP */
4880 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4881
4882 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4883 * The IUT is expected to page on all PDCH slots of all transceivers. */
4884 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4885 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4886 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4887 }
4888
4889 f_shutdown(__BFILE__, __LINE__, final := true);
4890}
4891
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004892private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004893runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4894 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004895 var integer i := 0;
4896 while (true) {
4897 f_rx_rlcmac_dl_block(dl_block, sched_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07004898 if (not match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004899 break;
4900 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004901 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004902 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4903 f_shutdown(__BFILE__, __LINE__);
4904 }
4905 i := i + 1;
4906 }
4907 return dl_block;
4908}
4909
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004910private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4911runs on RAW_PCU_Test_CT {
4912 var BssgpCellId src := valueof(ts_BssgpCellId(ts_RAI(ts_LAI(f_enc_BcdMccMnc(info_ind.mcc, info_ind.mnc, info_ind.mnc_3_digits == 1),
4913 info_ind.lac),
4914 info_ind.rac),
4915 info_ind.cell_id));
4916 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4917 423),
4918 2),
4919 5));
4920 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4921 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4922 var template (value) RAN_Information_RIM_Container res_cont :=
4923 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4924 ts_RIM_Sequence_Number(2),
4925 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4926 ts_RIM_Protocol_Version_Number(1),
4927 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4928 omit);
4929 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4930 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4931 res_cont));
4932}
4933
4934altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4935runs on RAW_PCU_Test_CT {
4936 /* RIM procedure: */
4937 var BssgpCellId src := valueof(ts_BssgpCellId(ts_RAI(ts_LAI(f_enc_BcdMccMnc(info_ind.mcc, info_ind.mnc, info_ind.mnc_3_digits == 1),
4938 info_ind.lac),
4939 info_ind.rac),
4940 info_ind.cell_id));
4941 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4942 423),
4943 2),
4944 5));
4945 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4946 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4947 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4948 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4949 tr_RAN_Information_Request_RIM_Container)) {
4950 if (do_answer) {
4951 f_outbound_nacc_rim_tx_resp(info_ind);
4952 }
4953 if (do_repeat) {
4954 repeat;
4955 }
4956 }
4957}
4958
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004959private function f_handle_nacc_rac_ci_query(PCUIF_info_ind info_ind, GsmArfcn req_arfcn, uint6_t req_bsic,
4960 boolean answer := true, boolean use_old_ctrl_iface := false)
4961runs on RAW_PCU_Test_CT {
4962 if (use_old_ctrl_iface == true) {
4963 f_ipa_ctrl_wait_link_up();
4964 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4965 int2str(info_ind.lac) & "." &
4966 int2str(info_ind.cell_id) & "." &
4967 int2str(req_arfcn) & "." &
4968 int2str(req_bsic);
4969 if (answer) {
4970 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4971 } else {
4972 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4973 }
4974 } else {
4975 var PCUIF_Message pcu_msg;
4976 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
4977 if (answer) {
4978 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
4979 }
4980 }
4981}
4982
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004983/* Start NACC from MS side */
4984private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004985 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004986 boolean skip_final_ctrl_ack := false,
4987 boolean use_old_ctrl_iface := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004988runs on RAW_PCU_Test_CT {
4989 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4990 var RlcmacDlBlock dl_block;
4991 var uint32_t sched_fn;
4992 var GsmArfcn req_arfcn := 862;
4993 var uint6_t req_bsic := 43;
4994
4995 /* Start NACC from MS side */
4996 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4997 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4998
4999 if (exp_rac_ci_query == true) {
5000 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005001 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005002 }
5003
5004 if (exp_si_query == true) {
5005 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005006 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005007 }
5008
5009 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005010 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005011
5012 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5013 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5014 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5015 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5016 f_shutdown(__BFILE__, __LINE__);
5017 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005018 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005019 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005020 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5021 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5022 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005023}
5024
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005025/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
5026testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005027 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005028 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005029 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005030 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005031
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005032 if (use_old_ctrl_iface) {
5033 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5034 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5035 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005036
5037 /* Initialize NS/BSSGP side */
5038 f_init_bssgp();
5039 /* Initialize GPRS MS side */
5040 f_init_gprs_ms();
5041 ms := g_ms[0]; /* We only use first MS in this test */
5042
5043 /* Initialize the PCU interface abstraction */
5044 f_init_raw(testcasename(), info_ind);
5045
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005046 /* Make sure we are not affected by full cache from previous tests */
5047 f_pcuvty_flush_neigh_caches();
5048
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005049 /* Establish BSSGP connection to the PCU */
5050 f_bssgp_establish();
5051 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5052
5053 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005054 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005055 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5056 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5057
5058 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005059 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005060
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005061 f_shutdown(__BFILE__, __LINE__, final := true);
5062}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005063
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005064/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
5065testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
5066 var PollFnCtx pollctx;
5067 var GprsMS ms;
5068 var RlcmacDlBlock dl_block;
5069 var uint32_t sched_fn;
5070 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005071 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005072
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005073 if (use_old_ctrl_iface) {
5074 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5075 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5076 }
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005077
5078 /* Initialize NS/BSSGP side */
5079 f_init_bssgp();
5080 /* Initialize GPRS MS side */
5081 f_init_gprs_ms();
5082 ms := g_ms[0]; /* We only use first MS in this test */
5083
5084 /* Initialize the PCU interface abstraction */
5085 f_init_raw(testcasename(), info_ind);
5086
5087 /* Make sure we are not affected by full cache from previous tests */
5088 f_pcuvty_flush_neigh_caches();
5089
5090 /* Establish BSSGP connection to the PCU */
5091 f_bssgp_establish();
5092 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5093
5094 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005095 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005096 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5097 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5098
5099 /* Start NACC from MS side, avoid sending final CTRL ACK */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005100 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005101
5102 /* Wait until we receive something non-dummy */
5103 dl_block := f_skip_dummy(0, sched_fn);
5104 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
5105 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5106 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5107 }
5108 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5109 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5110 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5111 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5112 }
5113
5114 f_shutdown(__BFILE__, __LINE__, final := true);
5115}
5116
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005117/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
5118testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
5119 var PollFnCtx pollctx;
5120 var GprsMS ms;
5121 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005122 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005123 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005124
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005125 if (use_old_ctrl_iface) {
5126 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5127 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5128 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005129
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005130 /* Initialize NS/BSSGP side */
5131 f_init_bssgp();
5132 /* Initialize GPRS MS side */
5133 f_init_gprs_ms();
5134 ms := g_ms[0]; /* We only use first MS in this test */
5135
5136 /* Initialize the PCU interface abstraction */
5137 f_init_raw(testcasename(), info_ind);
5138
5139 /* Make sure we are not affected by full cache from previous tests */
5140 f_pcuvty_flush_neigh_caches();
5141 /* Set timeout values for caches so that entries will be in cache during second try */
5142 f_pcuvty_set_neigh_caches(10, 10);
5143
5144 /* Establish BSSGP connection to the PCU */
5145 f_bssgp_establish();
5146 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5147
5148 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005149 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005150 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5151 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5152
5153 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005154 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005155
5156 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005157 f_outbound_nacc_success(ms, info_ind, false, false, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005158
5159 f_shutdown(__BFILE__, __LINE__, final := true);
5160}
5161
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005162/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
5163 * TS 44.060 sec 8.8) twice, the second time after caches timed out
5164 */
5165testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
5166 var PollFnCtx pollctx;
5167 var GprsMS ms;
5168 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005169 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005170 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005171
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005172 if (use_old_ctrl_iface) {
5173 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5174 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5175 }
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005176
5177 /* Initialize NS/BSSGP side */
5178 f_init_bssgp();
5179 /* Initialize GPRS MS side */
5180 f_init_gprs_ms();
5181 ms := g_ms[0]; /* We only use first MS in this test */
5182
5183 /* Initialize the PCU interface abstraction */
5184 f_init_raw(testcasename(), info_ind);
5185
5186 /* Make sure we are not affected by full cache from previous tests */
5187 f_pcuvty_flush_neigh_caches();
5188 /* Set timeout values for caches so that entries will be erased before the second try */
5189 f_pcuvty_set_neigh_caches(1, 1);
5190
5191 /* Establish BSSGP connection to the PCU */
5192 f_bssgp_establish();
5193 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5194
5195 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005196 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005197 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5198 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5199
5200 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005201 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005202
5203 /* CTRL client should have disconnected from us */
5204 f_ipa_ctrl_wait_link_down();
5205 /* wait for cache entries to time out */
5206 f_sleep(2.0);
5207 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005208 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005209
5210 f_shutdown(__BFILE__, __LINE__, final := true);
5211}
5212
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005213/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005214testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
5215 var RlcmacDlBlock dl_block;
5216 var PollFnCtx pollctx;
5217 var uint32_t sched_fn;
5218 var GprsMS ms;
5219 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5220 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005221 var GsmArfcn req_arfcn := 862;
5222 var uint6_t req_bsic := 43;
5223
5224 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
5225 * resolution CTRL port, to trigger Conn Refused by socket:
5226 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5227 */
5228
5229 /* Initialize NS/BSSGP side */
5230 f_init_bssgp();
5231 /* Initialize GPRS MS side */
5232 f_init_gprs_ms();
5233 ms := g_ms[0]; /* We only use first MS in this test */
5234
5235 /* Initialize the PCU interface abstraction */
5236 f_init_raw(testcasename(), info_ind);
5237
5238 /* Make sure we are not affected by full cache from previous tests */
5239 f_pcuvty_flush_neigh_caches();
5240
5241 /* Establish BSSGP connection to the PCU */
5242 f_bssgp_establish();
5243 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5244
5245 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005246 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005247 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5248 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5249
5250 /* Start NACC from MS side */
5251 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5252 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5253
5254 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005255 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005256 /* Make sure it is a Pkt Cell Chg Continue */
5257 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5258 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5259 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005260 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5261 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5262 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5263 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5264 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005265
5266 f_shutdown(__BFILE__, __LINE__, final := true);
5267}
5268
5269/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005270testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
5271 var RlcmacDlBlock dl_block;
5272 var PollFnCtx pollctx;
5273 var uint32_t sched_fn;
5274 var GprsMS ms;
5275 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5276 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005277 var GsmArfcn req_arfcn := 862;
5278 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005279 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005280
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005281 if (use_old_ctrl_iface) {
5282 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5283 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5284 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005285
5286 /* Initialize NS/BSSGP side */
5287 f_init_bssgp();
5288 /* Initialize GPRS MS side */
5289 f_init_gprs_ms();
5290 ms := g_ms[0]; /* We only use first MS in this test */
5291
5292 /* Initialize the PCU interface abstraction */
5293 f_init_raw(testcasename(), info_ind);
5294
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005295 /* Make sure we are not affected by full cache from previous tests */
5296 f_pcuvty_flush_neigh_caches();
5297
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005298 /* Establish BSSGP connection to the PCU */
5299 f_bssgp_establish();
5300 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5301
5302 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005303 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005304 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5305 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5306
5307 /* Start NACC from MS side */
5308 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5309 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5310
5311 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005312 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005313 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, false, use_old_ctrl_iface);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005314
5315 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005316 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005317 /* Make sure it is a Pkt Cell Chg Continue */
5318 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5319 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5320 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005321 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5322 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5323 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5324 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5325 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005326
5327 f_shutdown(__BFILE__, __LINE__, final := true);
5328}
5329
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005330/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
5331testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
5332 var RlcmacDlBlock dl_block;
5333 var PollFnCtx pollctx;
5334 var uint32_t sched_fn;
5335 var GprsMS ms;
5336 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5337 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005338 var GsmArfcn req_arfcn := 862;
5339 var uint6_t req_bsic := 43;
5340
5341 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5342 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5343
5344 /* Initialize NS/BSSGP side */
5345 f_init_bssgp();
5346 /* Initialize GPRS MS side */
5347 f_init_gprs_ms();
5348 ms := g_ms[0]; /* We only use first MS in this test */
5349
5350 /* Initialize the PCU interface abstraction */
5351 f_init_raw(testcasename(), info_ind);
5352
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005353 /* Make sure we are not affected by full cache from previous tests */
5354 f_pcuvty_flush_neigh_caches();
5355
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005356 /* Establish BSSGP connection to the PCU */
5357 f_bssgp_establish();
5358 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5359
5360 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005361 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005362 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5363 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5364
5365 /* Start NACC from MS side */
5366 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5367 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5368
5369 /* osmo-pcu should now ask for resolution: */
5370 f_ipa_ctrl_wait_link_up();
5371 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5372 int2str(info_ind.lac) & "." &
5373 int2str(info_ind.cell_id) & "." &
5374 int2str(req_arfcn) & "." &
5375 int2str(req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005376 /* we receive RAC+CI resolution request and we send incorrectly formated response */
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005377 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
5378
5379 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005380 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005381 /* Make sure it is a Pkt Cell Chg Continue */
5382 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5383 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5384 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005385 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5386 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5387 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5388 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5389 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005390
5391 f_shutdown(__BFILE__, __LINE__, final := true);
5392}
5393
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005394/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
5395testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
5396 var RlcmacDlBlock dl_block;
5397 var PollFnCtx pollctx;
5398 var uint32_t sched_fn;
5399 var GprsMS ms;
5400 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5401 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005402 var GsmArfcn req_arfcn := 862;
5403 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005404 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005405 var BssgpCellId src := valueof(ts_BssgpCellId(ts_RAI(ts_LAI(f_enc_BcdMccMnc(info_ind.mcc, info_ind.mnc, info_ind.mnc_3_digits == 1), /* '262F42'H */
5406 info_ind.lac),
5407 info_ind.rac),
5408 info_ind.cell_id));
5409 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
5410 423),
5411 2),
5412 5));
5413 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
5414 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
5415
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005416 if (use_old_ctrl_iface) {
5417 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5418 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5419 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005420
5421 /* Initialize NS/BSSGP side */
5422 f_init_bssgp();
5423 /* Initialize GPRS MS side */
5424 f_init_gprs_ms();
5425 ms := g_ms[0]; /* We only use first MS in this test */
5426
5427 /* Initialize the PCU interface abstraction */
5428 f_init_raw(testcasename(), info_ind);
5429
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005430 /* Make sure we are not affected by full cache from previous tests */
5431 f_pcuvty_flush_neigh_caches();
5432
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005433 /* Establish BSSGP connection to the PCU */
5434 f_bssgp_establish();
5435 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5436
5437 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005438 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005439 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5440 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5441
5442 /* Start NACC from MS side */
5443 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5444 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5445
5446 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005447 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005448
5449 /* RIM procedure: */
5450 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5451 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5452 tr_RAN_Information_Request_RIM_Container));
5453 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
5454
5455 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005456 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005457 /* Make sure it is a Pkt Cell Chg Continue */
5458 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5459 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5460 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005461 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5462 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5463 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5464 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5465 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005466
5467 f_shutdown(__BFILE__, __LINE__, final := true);
5468}
5469
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005470/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
5471testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
5472 var PollFnCtx pollctx;
5473 var GprsMS ms;
5474 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5475 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5476 var RlcmacDlBlock dl_block;
5477 var uint32_t sched_fn;
5478 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005479 var charstring ctrl_var;
5480 var PCUIF_Message pcu_msg;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005481 var GsmArfcn req_arfcn := 862;
5482 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005483 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005484
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005485 if (use_old_ctrl_iface) {
5486 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5487 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5488 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005489
5490 /* Initialize NS/BSSGP side */
5491 f_init_bssgp();
5492 /* Initialize GPRS MS side */
5493 f_init_gprs_ms();
5494 ms := g_ms[0]; /* We only use first MS in this test */
5495
5496 /* Initialize the PCU interface abstraction */
5497 f_init_raw(testcasename(), info_ind);
5498
5499 /* Make sure we are not affected by full cache from previous tests */
5500 f_pcuvty_flush_neigh_caches();
5501
5502 /* Establish BSSGP connection to the PCU */
5503 f_bssgp_establish();
5504 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5505
5506 /* Send PACKET RESOURCE REQUEST */
5507 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5508 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5509 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5510
5511 /* Start NACC from MS side */
5512 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5513 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5514
5515 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005516 if (use_old_ctrl_iface) {
5517 f_ipa_ctrl_wait_link_up();
5518 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5519 int2str(info_ind.lac) & "." &
5520 int2str(info_ind.cell_id) & "." &
5521 int2str(req_arfcn) & "." &
5522 int2str(req_bsic);
5523 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5524 } else {
5525 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5526 }
5527
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005528 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
5529 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5530 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005531
5532 if (use_old_ctrl_iface) {
5533 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5534 } else {
5535 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5536 }
5537
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005538 timer T := 2.0;
5539 T.start;
5540 alt {
5541 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005542 [use_old_ctrl_iface] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005543 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
5544 f_shutdown(__BFILE__, __LINE__);
5545 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005546 [not use_old_ctrl_iface] BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg {
5547 setverdict(fail, "Received unexpected PCUIF resolution after duplicate Pkt Cell Change Notification:", pcu_msg);
5548 f_shutdown(__BFILE__, __LINE__);
5549 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005550 [] T.timeout {
5551 setverdict(pass);
5552 }
5553 }
5554
5555 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005556 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005557
5558 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5559 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5560 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5561 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5562 f_shutdown(__BFILE__, __LINE__);
5563 }
5564 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5565 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5566 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5567 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5568 }
5569
5570 f_shutdown(__BFILE__, __LINE__, final := true);
5571}
5572
5573/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
5574testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
5575 var PollFnCtx pollctx;
5576 var GprsMS ms;
5577 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5578 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5579 var RlcmacDlBlock dl_block;
5580 var uint32_t sched_fn;
5581 var CtrlMessage rx_ctrl;
5582 var GsmArfcn req_arfcn := 862;
5583 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005584 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005585
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005586 if (use_old_ctrl_iface) {
5587 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5588 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5589 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005590
5591 /* Initialize NS/BSSGP side */
5592 f_init_bssgp();
5593 /* Initialize GPRS MS side */
5594 f_init_gprs_ms();
5595 ms := g_ms[0]; /* We only use first MS in this test */
5596
5597 /* Initialize the PCU interface abstraction */
5598 f_init_raw(testcasename(), info_ind);
5599
5600 /* Make sure we are not affected by full cache from previous tests */
5601 f_pcuvty_flush_neigh_caches();
5602
5603 /* Establish BSSGP connection to the PCU */
5604 f_bssgp_establish();
5605 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5606
5607 /* Send PACKET RESOURCE REQUEST */
5608 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5609 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5610 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5611
5612 /* Start NACC from MS side */
5613 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5614 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5615
5616 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005617 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005618 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5619 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
5620 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5621 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5622 f_outbound_nacc_rim_tx_resp(info_ind);
5623 timer T := 1.0;
5624 T.start;
5625 alt {
5626 [] RIM.receive {
5627 setverdict(fail, "Received unexpected RIM message");
5628 f_shutdown(__BFILE__, __LINE__);
5629 }
5630 [] T.timeout {
5631 setverdict(pass);
5632 }
5633 }
5634
5635 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005636 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005637
5638 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5639 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5640 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5641 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5642 f_shutdown(__BFILE__, __LINE__);
5643 }
5644 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5645 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5646 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5647 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5648 }
5649
5650 f_shutdown(__BFILE__, __LINE__, final := true);
5651}
5652
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005653/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
5654testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
5655 var PollFnCtx pollctx;
5656 var GprsMS ms;
5657 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5658 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5659 var RlcmacDlBlock dl_block;
5660 var uint32_t sched_fn;
5661 var CtrlMessage rx_ctrl;
5662 var GsmArfcn req_arfcn := 862;
5663 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005664 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005665
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005666 if (use_old_ctrl_iface) {
5667 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5668 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5669 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005670
5671 /* Initialize NS/BSSGP side */
5672 f_init_bssgp();
5673 /* Initialize GPRS MS side */
5674 f_init_gprs_ms();
5675 ms := g_ms[0]; /* We only use first MS in this test */
5676
5677 /* Initialize the PCU interface abstraction */
5678 f_init_raw(testcasename(), info_ind);
5679
5680 /* Make sure we are not affected by full cache from previous tests */
5681 f_pcuvty_flush_neigh_caches();
5682
5683 /* Establish BSSGP connection to the PCU */
5684 f_bssgp_establish();
5685 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5686
5687 /* Send PACKET RESOURCE REQUEST */
5688 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5689 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5690 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5691
5692 /* Start NACC from MS side */
5693 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5694 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5695
5696 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005697 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005698 /* RIM procedure: */
5699 as_outbound_nacc_rim_resolve(info_ind);
5700
5701 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
5702 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5703 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5704
5705 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
5706 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5707
5708 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5709 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5710 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5711 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5712 f_shutdown(__BFILE__, __LINE__);
5713 }
5714 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5715 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5716 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5717 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5718 }
5719}
5720
5721/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
5722testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
5723 var PollFnCtx pollctx;
5724 var GprsMS ms;
5725 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5726 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5727 var RlcmacDlBlock dl_block;
5728 var uint32_t sched_fn;
5729 var CtrlMessage rx_ctrl;
5730 var GsmArfcn req_arfcn := 862;
5731 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005732 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005733
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005734 if (use_old_ctrl_iface) {
5735 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5736 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5737 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005738
5739 /* Initialize NS/BSSGP side */
5740 f_init_bssgp();
5741 /* Initialize GPRS MS side */
5742 f_init_gprs_ms();
5743 ms := g_ms[0]; /* We only use first MS in this test */
5744
5745 /* Initialize the PCU interface abstraction */
5746 f_init_raw(testcasename(), info_ind);
5747
5748 /* Make sure we are not affected by full cache from previous tests */
5749 f_pcuvty_flush_neigh_caches();
5750
5751 /* Establish BSSGP connection to the PCU */
5752 f_bssgp_establish();
5753 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5754
5755 /* Send PACKET RESOURCE REQUEST */
5756 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5757 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5758 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5759
5760 /* Start NACC from MS side */
5761 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5762 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5763
5764 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005765 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005766 /* RIM procedure: */
5767 as_outbound_nacc_rim_resolve(info_ind);
5768
5769 /* Announce SI back to MS, continue NACC procedure */
5770 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5771
5772 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5773 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5774
5775 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5776 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5777 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5778 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5779 f_shutdown(__BFILE__, __LINE__);
5780 }
5781 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5782 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5783 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5784 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5785 }
5786}
5787
5788/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5789testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
5790 var PollFnCtx pollctx;
5791 var GprsMS ms;
5792 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5793 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5794 var RlcmacDlBlock dl_block;
5795 var uint32_t sched_fn;
5796 var CtrlMessage rx_ctrl;
5797 var GsmArfcn req_arfcn := 862;
5798 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005799 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005800
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005801 if (use_old_ctrl_iface) {
5802 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5803 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5804 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005805
5806 /* Initialize NS/BSSGP side */
5807 f_init_bssgp();
5808 /* Initialize GPRS MS side */
5809 f_init_gprs_ms();
5810 ms := g_ms[0]; /* We only use first MS in this test */
5811
5812 /* Initialize the PCU interface abstraction */
5813 f_init_raw(testcasename(), info_ind);
5814
5815 /* Make sure we are not affected by full cache from previous tests */
5816 f_pcuvty_flush_neigh_caches();
5817
5818 /* Establish BSSGP connection to the PCU */
5819 f_bssgp_establish();
5820 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5821
5822 /* Send PACKET RESOURCE REQUEST */
5823 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5824 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5825 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5826
5827 /* Start NACC from MS side */
5828 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5829 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5830
5831 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005832 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005833 /* RIM procedure: */
5834 as_outbound_nacc_rim_resolve(info_ind);
5835
5836 /* Announce SI back to MS, continue NACC procedure */
5837 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5838
5839 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5840 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5841 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5842 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5843 f_shutdown(__BFILE__, __LINE__);
5844 }
5845 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5846 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5847
5848 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5849 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5850 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5851 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5852 }
5853}
5854
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005855/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5856 * while waiting for CTRL resolution */
5857testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5858 var PollFnCtx pollctx;
5859 var GprsMS ms;
5860 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5861 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5862 var RlcmacDlBlock dl_block;
5863 var uint32_t sched_fn;
5864 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005865 var charstring ctrl_var;
5866 var PCUIF_Message pcu_msg;
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005867 var GsmArfcn req_arfcn := 862;
5868 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005869 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005870
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005871 if (use_old_ctrl_iface) {
5872 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5873 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5874 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005875
5876 /* Initialize NS/BSSGP side */
5877 f_init_bssgp();
5878 /* Initialize GPRS MS side */
5879 f_init_gprs_ms();
5880 ms := g_ms[0]; /* We only use first MS in this test */
5881
5882 /* Initialize the PCU interface abstraction */
5883 f_init_raw(testcasename(), info_ind);
5884
5885 /* Make sure we are not affected by full cache from previous tests */
5886 f_pcuvty_flush_neigh_caches();
5887
5888 /* Establish BSSGP connection to the PCU */
5889 f_bssgp_establish();
5890 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5891
5892 /* Send PACKET RESOURCE REQUEST */
5893 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5894 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5895 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5896
5897 /* Start NACC from MS side */
5898 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5899 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5900
5901 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005902 if (use_old_ctrl_iface) {
5903 f_ipa_ctrl_wait_link_up();
5904 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5905 int2str(info_ind.lac) & "." &
5906 int2str(info_ind.cell_id) & "." &
5907 int2str(req_arfcn) & "." &
5908 int2str(req_bsic);
5909 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5910 } else {
5911 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5912 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005913 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5914 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5915 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5916 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005917 if (use_old_ctrl_iface) {
5918 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5919 } else {
5920 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5921 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005922 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005923 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005924
5925 /* And finally everything continues as usual with RIN procedure */
5926 as_outbound_nacc_rim_resolve(info_ind);
5927
5928 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005929 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005930
5931 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5932 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5933 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5934 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5935 f_shutdown(__BFILE__, __LINE__);
5936 }
5937 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5938 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5939 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5940 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5941 }
5942
5943 f_shutdown(__BFILE__, __LINE__, final := true);
5944}
5945
5946/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5947 * while waiting for SI resolution */
5948testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5949 var PollFnCtx pollctx;
5950 var GprsMS ms;
5951 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5952 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5953 var RlcmacDlBlock dl_block;
5954 var uint32_t sched_fn;
5955 var CtrlMessage rx_ctrl;
5956 var GsmArfcn req_arfcn := 862;
5957 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005958 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005959
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005960 if (use_old_ctrl_iface) {
5961 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5962 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5963 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005964
5965 /* Initialize NS/BSSGP side */
5966 f_init_bssgp();
5967 /* Initialize GPRS MS side */
5968 f_init_gprs_ms();
5969 ms := g_ms[0]; /* We only use first MS in this test */
5970
5971 /* Initialize the PCU interface abstraction */
5972 f_init_raw(testcasename(), info_ind);
5973
5974 /* Make sure we are not affected by full cache from previous tests */
5975 f_pcuvty_flush_neigh_caches();
5976
5977 /* Establish BSSGP connection to the PCU */
5978 f_bssgp_establish();
5979 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5980
5981 /* Send PACKET RESOURCE REQUEST */
5982 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5983 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5984 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5985
5986 /* Start NACC from MS side */
5987 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5988 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5989
5990 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005991 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005992 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5993 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5994 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5995 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5996 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5997 f_outbound_nacc_rim_tx_resp(info_ind);
5998
5999 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006000 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006001
6002 /* And finally everything continues as usual with RIN procedure */
6003 as_outbound_nacc_rim_resolve(info_ind);
6004
6005 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01006006 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006007
6008 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6009 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6010 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6011 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6012 f_shutdown(__BFILE__, __LINE__);
6013 }
6014 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6015 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6016 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6017 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6018 }
6019
6020 f_shutdown(__BFILE__, __LINE__, final := true);
6021}
6022
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006023/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
6024 * while sending Pkt Neigh Data Change */
6025testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
6026 var PollFnCtx pollctx;
6027 var GprsMS ms;
6028 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6029 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6030 var RlcmacDlBlock dl_block;
6031 var uint32_t sched_fn;
6032 var CtrlMessage rx_ctrl;
6033 var GsmArfcn req_arfcn := 862;
6034 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006035 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006036
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006037 if (use_old_ctrl_iface) {
6038 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6039 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6040 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006041
6042 /* Initialize NS/BSSGP side */
6043 f_init_bssgp();
6044 /* Initialize GPRS MS side */
6045 f_init_gprs_ms();
6046 ms := g_ms[0]; /* We only use first MS in this test */
6047
6048 /* Initialize the PCU interface abstraction */
6049 f_init_raw(testcasename(), info_ind);
6050
6051 /* Make sure we are not affected by full cache from previous tests */
6052 f_pcuvty_flush_neigh_caches();
6053
6054 /* Establish BSSGP connection to the PCU */
6055 f_bssgp_establish();
6056 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6057
6058 /* Send PACKET RESOURCE REQUEST */
6059 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6060 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6061 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6062
6063 /* Start NACC from MS side */
6064 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6065 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6066
6067 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006068 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006069 /* RIM procedure: */
6070 as_outbound_nacc_rim_resolve(info_ind);
6071
6072 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
6073 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
6074 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6075 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6076
6077 /* It should trigger RAC_CI resolution to start again: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006078 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006079 /* RIM procedure: */
6080 as_outbound_nacc_rim_resolve(info_ind);
6081 /* Transmit SI back to MS */
6082 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6083
6084 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6085 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6086 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6087 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6088 f_shutdown(__BFILE__, __LINE__);
6089 }
6090 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6091 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6092 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6093 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6094 }
6095}
6096
6097/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
6098testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
6099 var PollFnCtx pollctx;
6100 var GprsMS ms;
6101 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6102 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6103 var RlcmacDlBlock dl_block;
6104 var uint32_t sched_fn;
6105 var CtrlMessage rx_ctrl;
6106 var GsmArfcn req_arfcn := 862;
6107 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006108 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006109
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006110 if (use_old_ctrl_iface) {
6111 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6112 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6113 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006114
6115 /* Initialize NS/BSSGP side */
6116 f_init_bssgp();
6117 /* Initialize GPRS MS side */
6118 f_init_gprs_ms();
6119 ms := g_ms[0]; /* We only use first MS in this test */
6120
6121 /* Initialize the PCU interface abstraction */
6122 f_init_raw(testcasename(), info_ind);
6123
6124 /* Make sure we are not affected by full cache from previous tests */
6125 f_pcuvty_flush_neigh_caches();
6126
6127 /* Establish BSSGP connection to the PCU */
6128 f_bssgp_establish();
6129 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6130
6131 /* Send PACKET RESOURCE REQUEST */
6132 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6133 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6134 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6135
6136 /* Start NACC from MS side */
6137 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6138 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6139
6140 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006141 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006142 /* RIM procedure: */
6143 as_outbound_nacc_rim_resolve(info_ind);
6144
6145 /* Announce SI back to MS, continue NACC procedure */
6146 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6147
6148 /* trigger a Pkt Cell Change Notif with different tgt cell */
6149 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6150 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6151
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006152 /* It should trigger RAC_CI resolution to start again: */
6153 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6154
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006155 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6156 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
6157
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006158 /* RIM procedure: */
6159 as_outbound_nacc_rim_resolve(info_ind);
6160 /* Transmit SI back to MS */
6161 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6162
6163 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6164 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6165 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6166 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6167 f_shutdown(__BFILE__, __LINE__);
6168 }
6169 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6170 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6171 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6172 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6173 }
6174}
6175
6176/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
6177testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
6178 var PollFnCtx pollctx;
6179 var GprsMS ms;
6180 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6181 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6182 var RlcmacDlBlock dl_block;
6183 var uint32_t sched_fn;
6184 var CtrlMessage rx_ctrl;
6185 var GsmArfcn req_arfcn := 862;
6186 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006187 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006188
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006189 if (use_old_ctrl_iface) {
6190 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6191 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6192 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006193
6194 /* Initialize NS/BSSGP side */
6195 f_init_bssgp();
6196 /* Initialize GPRS MS side */
6197 f_init_gprs_ms();
6198 ms := g_ms[0]; /* We only use first MS in this test */
6199
6200 /* Initialize the PCU interface abstraction */
6201 f_init_raw(testcasename(), info_ind);
6202
6203 /* Make sure we are not affected by full cache from previous tests */
6204 f_pcuvty_flush_neigh_caches();
6205
6206 /* Establish BSSGP connection to the PCU */
6207 f_bssgp_establish();
6208 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6209
6210 /* Send PACKET RESOURCE REQUEST */
6211 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6212 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6213 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6214
6215 /* Start NACC from MS side */
6216 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6217 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6218
6219 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006220 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006221 /* RIM procedure: */
6222 as_outbound_nacc_rim_resolve(info_ind);
6223
6224 /* Announce SI back to MS, continue NACC procedure */
6225 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6226
6227 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6228 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6229 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6230 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6231 f_shutdown(__BFILE__, __LINE__);
6232 }
6233
6234 /* trigger a Pkt Cell Change Notif with different tgt cell */
6235 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6236 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6237
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006238 /* It should trigger RAC_CI resolution to start again: */
6239 /* When using new PCUIF interface for resolution, we must
6240 * PCUIF.receive() here since that's the first message in the PCUIF
6241 * queue that PCU will have sent. Calling other functions doing
6242 * PCUIF.receive() (like f_ms_tx_ul_block() below) will make them fail
6243 * due to unexpected message receive. */
6244 if (not use_old_ctrl_iface) {
6245 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6246 }
6247
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006248 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6249 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6250 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6251 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6252 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006253
6254 /* When using CTRL interface, we must schedule the ACK before (see
6255 * above) blocking here waiting for the resoltion, otherwise we'll be
6256 * too late scheduling by the time the resolution is done. */
6257 if (use_old_ctrl_iface) {
6258 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6259 }
6260
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006261 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6262 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
6263
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006264 /* RIM procedure: */
6265 as_outbound_nacc_rim_resolve(info_ind);
6266 /* Transmit SI back to MS */
6267 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6268
6269 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6270 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6271 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6272 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6273 f_shutdown(__BFILE__, __LINE__);
6274 }
6275 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6276 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6277 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6278 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6279 }
6280}
6281
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006282/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
6283testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
6284 var PollFnCtx pollctx;
6285 var GprsMS ms;
6286 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6287 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6288 var RlcmacDlBlock dl_block;
6289 var uint32_t sched_fn, dl_fn;
6290 var CtrlMessage rx_ctrl;
6291 var GsmArfcn req_arfcn := 862;
6292 var uint6_t req_bsic := 43;
6293 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006294 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006295
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006296 if (use_old_ctrl_iface) {
6297 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6298 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6299 }
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006300
6301 /* Initialize NS/BSSGP side */
6302 f_init_bssgp();
6303 /* Initialize GPRS MS side */
6304 f_init_gprs_ms();
6305 ms := g_ms[0]; /* We only use first MS in this test */
6306
6307 /* Initialize the PCU interface abstraction */
6308 f_init_raw(testcasename(), info_ind);
6309
6310 /* Make sure we are not affected by full cache from previous tests */
6311 f_pcuvty_flush_neigh_caches();
6312
6313 /* Establish BSSGP connection to the PCU */
6314 f_bssgp_establish();
6315 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6316
6317 /* Send PACKET RESOURCE REQUEST */
6318 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6319 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6320 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6321
6322 /* Start NACC from MS side */
6323 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6324 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6325
6326 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006327 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006328 /* RIM procedure: */
6329 as_outbound_nacc_rim_resolve(info_ind);
6330
6331 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
6332 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
6333 f_sleep(0.1);
6334 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
6335 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
6336
6337 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
6338 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
6339 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
6340 * Data with unassigned DL TBF in line above): */
6341 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6342 /* Continue receiving Pkt Cell Neighbor Data */
6343 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
6344
6345 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6346 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6347 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6348 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6349 f_shutdown(__BFILE__, __LINE__);
6350 }
6351 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6352 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6353 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6354 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6355 }
6356
6357 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
6358 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
6359 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
6360 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
6361 f_dl_block_ack_fn(dl_block, dl_fn));
6362}
6363
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006364
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006365function f_do_inbound_nacc(template (value) RIM_Routing_Information tx_src_addr, template RIM_Routing_Information rx_dst_addr)
6366runs on RAW_PCU_Test_CT
6367{
6368 var template (value) RAN_Information_Request_RIM_Container req_cont;
6369 var template (value) PDU_BSSGP bssgp_rim_pdu;
6370 var template PDU_BSSGP bssgp_rim_pdu_expect;
6371 var template RAN_Information_RIM_Container rim_cont_expect;
6372 var RIM_Routing_Address bts_addr;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006373
6374 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006375 var template PCUIF_Message si1_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, '5506'O & si1_default, 0, 0, 0, 0, 32767);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006376 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006377 var template PCUIF_Message si3_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, '4906'O & si3_default, 0, 0, 0, 0, 32767);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006378 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02006379 var template PCUIF_Message si13_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, '0106'O & si13_default, 0, 0, 0, 0, 32767);
6380 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006381 f_sleep(1.0);
6382
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006383 bts_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006384
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006385 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6386 ts_RIM_Sequence_Number(1),
6387 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6388 ts_RIM_Protocol_Version_Number(1),
6389 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6390 omit);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006391 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
6392 tx_src_addr, req_cont);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006393
6394 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6395 tr_RIM_Sequence_Number(1),
6396 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6397 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006398 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 3, si_default)),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006399 omit);
6400
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006401 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(rx_dst_addr,
6402 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006403 rim_cont_expect);
6404 RIM.send(bssgp_rim_pdu);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006405 timer T := 2.0;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006406 T.start;
6407 alt {
6408 [] RIM.receive(bssgp_rim_pdu_expect) { }
6409 [] RIM.receive {
6410 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6411 }
6412 [] T.timeout {
6413 setverdict(fail, "No BSSGP RIM PDU received");
6414 mtc.stop;
6415 }
6416 }
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006417}
6418/* Send a RIM RAN info request to the PCU and verify the response, we expect
6419 * getting the system information back which we have transfered to the PCU via
6420 * PCUIF on startup. */
6421testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
6422 /* Initialize NS/BSSGP side */
6423 f_init_bssgp();
6424
6425 /* Initialize the PCU interface abstraction */
6426 f_init_raw(testcasename());
6427
6428 /* Establish BSSGP connection to the PCU */
6429 f_bssgp_establish();
6430
6431 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6432 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6433
6434 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6435 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr));
6436
6437 f_shutdown(__BFILE__, __LINE__, final := true);
6438}
6439
6440/* Same as TC_rim_ran_info_req_single_rep, but using an EUTRAN eNodeB ID as
6441 * Routing information, to verify PCU handles that kind of address just fine
6442 */
6443testcase TC_rim_ran_info_req_single_rep_eutran() runs on RAW_PCU_Test_CT {
6444 /* Initialize NS/BSSGP side */
6445 f_init_bssgp();
6446
6447 /* Initialize the PCU interface abstraction */
6448 f_init_raw(testcasename());
6449
6450 /* Establish BSSGP connection to the PCU */
6451 f_bssgp_establish();
6452
6453 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6454 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_enbid(src_cid, tac := 3, gnbid := '12345678123456'O));
6455
6456 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr),
6457 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006458
6459 f_shutdown(__BFILE__, __LINE__, final := true);
6460}
6461
6462/* Same as above, but in this case we simulate the rare case in which the PCU
6463 * has no system information available. We expect getting a response back but
6464 * with no system information inside. */
6465testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006466 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006467 var PCUIF_Message pcu_msg;
6468 timer T := 2.0;
6469
6470 /* Initialize NS/BSSGP side */
6471 f_init_bssgp();
6472
6473 /* Initialize the PCU interface abstraction */
6474 f_init_raw(testcasename(), info_ind);
6475
6476 /* Establish BSSGP connection to the PCU */
6477 f_bssgp_establish();
6478
6479 /* Clear sysinfo from the PCU */
6480 var template PCUIF_Message si1_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, '01'O, 0, 0, 0, 0, 32767);
6481 BTS.send(si1_data_ind);
6482 var template PCUIF_Message si3_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, '03'O, 0, 0, 0, 0, 32767);
6483 BTS.send(si3_data_ind);
6484 var template PCUIF_Message si16_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, '0b'O, 0, 0, 0, 0, 32767);
6485 BTS.send(si16_data_ind);
6486 f_sleep(1.0);
6487
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006488 var RIM_Routing_Address dst_addr;
6489 var RIM_Routing_Address src_addr;
6490 var template (value) RAN_Information_Request_RIM_Container req_cont;
6491 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006492 var template PDU_BSSGP bssgp_rim_pdu_expect;
6493 var template RAN_Information_RIM_Container rim_cont_expect;
6494
6495 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006496 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6497 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006498
6499 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6500 ts_RIM_Sequence_Number(1),
6501 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6502 ts_RIM_Protocol_Version_Number(1),
6503 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6504 omit);
6505 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6506 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6507 req_cont);
6508
6509
6510 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6511 tr_RIM_Sequence_Number(1),
6512 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6513 tr_RIM_Protocol_Version_Number(1),
6514 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
6515 omit);
6516
6517 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6518 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6519 rim_cont_expect);
6520 RIM.send(bssgp_rim_pdu);
6521 T.start;
6522 alt {
6523 [] RIM.receive(bssgp_rim_pdu_expect) { }
6524 [] RIM.receive {
6525 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6526 }
6527 [] T.timeout {
6528 setverdict(fail, "No BSSGP RIM PDU received");
6529 mtc.stop;
6530 }
6531 }
6532
6533 f_shutdown(__BFILE__, __LINE__, final := true);
6534}
6535
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006536/* Verify PCU schedule idle blocks (len=0) if no TBF attached to it. See OS#4772, SYS#4919 */
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006537testcase TC_pdch_energy_saving() runs on RAW_PCU_Test_CT {
6538 var PCUIF_info_ind info_ind;
6539 var template (value) TsTrxBtsNum nr;
6540 var RlcmacDlBlock dl_block;
6541 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006542 var integer ts;
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006543 timer T;
6544
6545 /* Initialize NS/BSSGP side */
6546 f_init_bssgp();
6547
6548 info_ind := valueof(ts_PCUIF_INFO_default);
6549 /* The 2 first TRX are enabled. */
6550 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (2 .. 7));
6551 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6552 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 1);
6553
6554 /* Initialize the PCU interface abstraction */
6555 f_init_raw(testcasename(), info_ind);
6556
6557 /* Establish BSSGP connection to the PCU */
6558 f_bssgp_establish();
6559
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006560 for (ts := 0; ts < 2; ts := ts + 1) {
6561 nr := ts_TsTrxBtsNum(ts_nr := 7, trx_nr := ts, bts_nr := 0, blk_nr := 0);
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006562
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006563 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
6564 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
6565 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), block_nr := nr.blk_nr));
6566 T.start(0.5);
6567 alt {
6568 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
6569 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
6570 omit)) -> value data_msg {
6571 setverdict(pass);
6572 T.stop;
6573 }
6574 [] as_rx_fail_dummy(nr);
6575 [] BTS.receive {
6576 setverdict(fail, "Unexpected block from BTS");
6577 f_shutdown(__BFILE__, __LINE__);
6578 }
6579 [] T.timeout {
6580 setverdict(fail, "Expected IDLE block from BTS");
6581 f_shutdown(__BFILE__, __LINE__);
6582 }
6583 }
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006584 }
6585
6586 f_shutdown(__BFILE__, __LINE__, final := true);
6587}
6588
Oliver Smith3d174882021-09-03 11:38:51 +02006589/* Test stats for available and occupied PDCHs */
6590testcase TC_stat_pdch_avail_occ() runs on RAW_PCU_Test_CT {
6591 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6592 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6593
6594 /* Initialize NS/BSSGP side */
6595 f_init_bssgp();
6596
Oliver Smithedcded22021-09-14 09:26:55 +02006597 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6598 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6599 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6600 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6601 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6602 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
Oliver Smith3d174882021-09-03 11:38:51 +02006603
Oliver Smith72d0c692021-09-08 10:03:52 +02006604 /* Allocate 4 GprsMS instances */
Oliver Smith3d174882021-09-03 11:38:51 +02006605 f_init_gprs_ms(4);
6606
6607 /* Initialize the PCU interface abstraction */
6608 f_init_raw(testcasename(), info_ind);
6609
6610 /* Reset stats */
6611 f_statsd_reset();
6612
6613 /* Establish BSSGP */
6614 f_bssgp_establish();
6615
6616 /* 8 PDCHs available, 0 occupied */
6617 var StatsDExpects expect := {
6618 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006619 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6620 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6621 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
Oliver Smith3d174882021-09-03 11:38:51 +02006622 };
6623 f_statsd_expect(expect);
6624
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006625 /* Establish an Uplink TBF for each GprsMS instance (3x GPRS, 1x EGPRS) */
Oliver Smith3d174882021-09-03 11:38:51 +02006626 f_multi_ms_bssgp_register();
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006627 f_ms_establish_ul_tbf(g_ms[0]);
6628 f_ms_establish_ul_tbf(g_ms[1]);
6629 f_ms_establish_ul_tbf(g_ms[2]);
6630 f_ms_establish_ul_tbf_2phase_access(g_ms[3], ts_RlcMacUlCtrl_PKT_RES_REQ(g_ms[3].tlli, ms_racap_egprs_def));
Oliver Smith3d174882021-09-03 11:38:51 +02006631
6632 /* 4 PDCHs occupied */
6633 expect := {
6634 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006635 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 4, max := 4 },
6636 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 3, max := 3 },
6637 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
Oliver Smith3d174882021-09-03 11:38:51 +02006638 };
6639 f_statsd_expect(expect);
6640
6641 f_shutdown(__BFILE__, __LINE__, final := true);
6642}
6643
Oliver Smithf04762d2021-09-14 17:20:38 +02006644/* Test stats for available and occupied PDCHs, for MS which is not known by
6645 * the PCU (e.g. because it was forgotten due to no interaction, and old DL
6646 * data arrives from SGSN) */
6647function f_tc_stat_pdch_avail_occ_ms_not_known(boolean egprs) runs on RAW_PCU_Test_CT {
6648 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6649 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6650
6651 /* Ensure a deterministic slot allocation of 1 PDCH with MS class 1 */
6652 const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs := {
6653 gprsmultislotclass := '00001'B,
6654 gprsextendeddynalloccap := '0'B
6655 };
6656 const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs := {
6657 egprsmultislotclass := '00001'B,
6658 egprsextendeddynalloccap := '0'B
6659 };
6660 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs := {
6661 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, omit)) };
6662 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs := {
6663 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, bssgp_mscap_egprs)) };
6664
6665 /* Initialize NS/BSSGP side */
6666 f_init_bssgp();
6667
6668 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6669 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6670 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6671 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6672 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6673 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
6674
6675 /* Allocate 1 GprsMS instance */
6676 f_init_gprs_ms(1);
6677
6678 /* Initialize the PCU interface abstraction */
6679 f_init_raw(testcasename(), info_ind);
6680
6681 /* Reset stats */
6682 f_statsd_reset();
6683
6684 /* Establish BSSGP */
6685 f_bssgp_establish();
6686
6687 /* 8 PDCHs available, 0 occupied */
6688 var StatsDExpects expect := {
6689 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6690 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6691 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6692 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6693 };
6694 f_statsd_expect(expect);
6695
6696 var GprsMS ms := g_ms[0]; /* We only use first MS in this test */
6697 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6698
6699 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
6700 var octetstring data := f_rnd_octstring(1400);
6701 if (egprs) {
6702 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs));
6703 } else {
6704 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_gprs));
6705 }
6706 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
6707
6708 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
6709 f_sleep(X2002);
6710
6711 /* 1 PDCH occupied */
6712 if (egprs) {
6713 expect := {
6714 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6715 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6716 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6717 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
6718 };
6719 } else {
6720 expect := {
6721 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6722 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6723 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 1, max := 1 },
6724 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6725 };
6726 }
6727 f_statsd_expect(expect);
6728
6729 /* Clean up */
6730 f_shutdown(__BFILE__, __LINE__, final := true);
6731}
6732testcase TC_stat_pdch_avail_occ_ms_not_known_gprs() runs on RAW_PCU_Test_CT {
6733 f_tc_stat_pdch_avail_occ_ms_not_known(false);
6734}
6735testcase TC_stat_pdch_avail_occ_ms_not_known_egprs() runs on RAW_PCU_Test_CT {
6736 f_tc_stat_pdch_avail_occ_ms_not_known(true);
6737}
6738
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006739/* Make sure that bts.0.pdch.all_allocated is set when we allocate all resources */
6740testcase TC_ratectr_all_available_allocated() runs on RAW_PCU_Test_CT {
6741 var PCUIF_info_ind info_ind;
6742 var template IARRestOctets rest;
6743 var BIT11 ra11;
6744
6745 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006746
6747 /* Only the first TRX is enabled. */
6748 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
6749 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6750
6751 /* Initialize the PCU interface abstraction */
6752 f_init_raw(testcasename(), info_ind);
6753 f_statsd_reset();
6754
6755 var EGPRSPktChRequest req := {
6756 one_phase := {
6757 tag := '0'B,
6758 multislot_class := '10101'B,
6759 priority := '01'B,
6760 random_bits := '101'B
6761 }
6762 };
6763
6764 /* We send 7 requests, the IUT gives us all available USFs (0..6) */
6765 for (var integer i := 0; i < 7; i := i + 1) {
6766 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
6767 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
6768 }
6769
6770 ra11 := enc_EGPRSPktChRequest2bits(req);
6771 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
6772
6773 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrol209dc7d2021-11-15 16:25:08 +01006774 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006775
6776 /* bts.0.pdch.all_allocated is updated once per second, wait some time to make sure it was updated. */
6777 f_sleep(2.0);
6778 var StatsDExpects expect := {
6779 { name := "TTCN3.bts.0.pdch.all_allocated", mtype := "c", min := 1, max := 1 }
6780 };
6781 f_statsd_expect(expect);
6782
6783 f_shutdown(__BFILE__, __LINE__, final := true);
6784}
6785
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006786control {
6787 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01006788 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006789 execute( TC_ta_ptcch_idle() );
6790 execute( TC_ta_rach_imm_ass() );
Vadim Yanitskiy866f8702021-05-26 14:50:27 +02006791 execute( TC_ta_ul_ack_nack_first_block() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006792 execute( TC_ta_idle_dl_tbf_ass() );
6793 execute( TC_ta_ptcch_ul_multi_tbf() );
6794 execute( TC_cs_lqual_ul_tbf() );
6795 execute( TC_cs_initial_ul() );
6796 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01006797 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01006798 execute( TC_cs_max_dl() );
6799 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01006800 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01006801 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01006802 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01006803 execute( TC_mcs_max_dl() );
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02006804 execute( TC_t3141() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01006805 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02006806 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01006807 execute( TC_x2031_t3191() );
6808 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006809 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01006810 execute( TC_n3105_max_t3195() );
Pau Espin Pedrole8a94442021-11-15 17:05:46 +01006811 execute( TC_t3172_wait_ind_size0() );
6812 execute( TC_t3172_wait_ind_size1() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02006813 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02006814 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02006815 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006816 execute( TC_mo_ping_pong() );
6817 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02006818 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006819 execute( TC_mt_ping_pong() );
6820 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006821 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006822 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07006823 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006824 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01006825 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol6844c162022-04-01 15:40:06 +02006826 execute( TC_dl_llc_sapi_priority() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006827 execute( TC_paging_cs_from_bts() );
6828 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
6829 execute( TC_paging_cs_from_sgsn_sign() );
6830 execute( TC_paging_cs_from_sgsn_ptp() );
6831 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
6832 execute( TC_paging_ps_from_sgsn_sign() );
6833 execute( TC_paging_ps_from_sgsn_ptp() );
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01006834 execute( TC_paging_pch_timeout() );
6835
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07006836 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
6837 execute( TC_paging_cs_multi_ms_imsi() );
6838 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02006839 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
6840 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01006841 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
6842 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006843
6844 /* EGPRS specific test cases */
6845 execute( TC_egprs_pkt_chan_req_signalling() );
6846 execute( TC_egprs_pkt_chan_req_one_phase() );
6847 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07006848 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07006849 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07006850 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02006851
6852 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07006853
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006854 /* Immediate Assignment on AGCH/PCH */
6855 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
6856 execute( TC_pcuif_fh_imm_ass_ul() );
6857 execute( TC_pcuif_fh_imm_ass_dl() );
6858 /* Packet Uplink/Downlink Assignment on PACCH */
6859 execute( TC_pcuif_fh_pkt_ass_ul() );
6860 execute( TC_pcuif_fh_pkt_ass_dl() );
6861 execute( TC_multitrx_multims_alloc() );
6862 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
6863 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
6864 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
Pau Espin Pedrol37604572021-10-15 14:36:16 +02006865 execute( TC_ul_tbf_reestablish_with_pkt_resource_req() );
Pau Espin Pedrold658f342021-10-15 14:52:22 +02006866 execute( TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() );
Pau Espin Pedrol59aa1092021-11-15 18:53:34 +01006867 execute( TC_ul_tbf_reestablish_with_pkt_dl_ack_nack() );
6868 execute( TC_ul_tbf_reestablish_with_pkt_dl_ack_nack_egprs() );
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006869
Pau Espin Pedrole1303052020-11-16 11:13:51 +01006870 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07006871
6872 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01006873 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01006874 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01006875 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01006876 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01006877 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01006878 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01006879 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
6880 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006881 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
6882 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
6883 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006884 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
6885 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006886 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
6887 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
6888 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006889 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006890 if (mp_ctrl_neigh_ip != "") { /* PCU using old CTRL neigh addr resolution iface */
6891 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
6892 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
6893 }
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006894
6895 execute( TC_rim_ran_info_req_single_rep() );
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006896 execute( TC_rim_ran_info_req_single_rep_eutran() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006897 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006898
6899 execute (TC_pdch_energy_saving() );
Oliver Smith3d174882021-09-03 11:38:51 +02006900
6901 execute( TC_stat_pdch_avail_occ() );
Oliver Smithf04762d2021-09-14 17:20:38 +02006902 execute( TC_stat_pdch_avail_occ_ms_not_known_gprs() );
6903 execute( TC_stat_pdch_avail_occ_ms_not_known_egprs() );
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006904 execute( TC_ratectr_all_available_allocated() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006905}
6906
Harald Weltea419df22019-03-21 17:23:04 +01006907}