blob: e4858683241eec21b5d47ef71a70de4618769775 [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
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +0200433 contention resolution) 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
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +0200541 /* We're in One-Phase Access contention resolution, include TLLI */
Vadim Yanitskiy866f8702021-05-26 14:50:27 +0200542 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 }
Pau Espin Pedrol002658a2023-04-12 18:13:56 +0200563
564 f_shutdown(__BFILE__, __LINE__, final := true);
Vadim Yanitskiy866f8702021-05-26 14:50:27 +0200565}
566
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200567/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
568 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
569 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
570 * no active TBF exists at the moment of establishment (idle mode). */
571testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100572 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200573
574 /* Initialize NS/BSSGP side */
575 f_init_bssgp();
576
577 /* Initialize the PCU interface abstraction */
578 f_init_raw(testcasename());
579
580 /* Establish BSSGP connection to the PCU */
581 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100582 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200583
584 /* SGSN sends some DL data, PCU will initiate Packet Downlink
585 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100586 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
587 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200588
589 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
590 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
591 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100592 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700593 setverdict(fail, "Timing Advance value doesn't match");
594 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700595
596 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200597}
598
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200599/* Verify that the PCU generates idle blocks in PTCCH/D
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200600 * while neither Uplink nor Downlink TBF is established. */
601testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100602 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200603 timer T;
604
605 /* Initialize the PCU interface abstraction */
606 f_init_raw(testcasename());
607
608 /* Sent an RTS.req for PTCCH/D */
609 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
610 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
611 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100612
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200613 T.start(5.0);
614 alt {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200615 [] BTS.receive(tr_PCUIF_DATA_PTCCH(0,
616 tr_PCUIF_DATA(0, 7, sapi := PCU_IF_SAPI_PTCCH),
617 omit)) {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200618 }
619 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg) {
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +0100620 setverdict(fail, "Expected IDLE block instead of PTCCH/D block");
621 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200622 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200623 [] BTS.receive(PCUIF_Message:?) { repeat; }
624 [] T.timeout {
625 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700626 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200627 }
628 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100629 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700630
631 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200632}
633
634/* Test of correct Timing Advance during an active Uplink TBF.
635 *
636 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
637 * are not continuous and there can be long time gaps between them. This happens
638 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
639 * significantly change between such rare Uplink transmissions, so GPRS introduces
640 * additional mechanisms to control Timing Advance, and thus reduce interference
641 * between neighboring TDMA time-slots.
642 *
643 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
644 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
645 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
646 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
647 * among with the initial Timing Advance value. And here PTCCH comes to play.
648 *
649 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
650 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
651 * continuously. To ensure continuous measurements of the signal propagation
652 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
653 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
654 *
655 * The purpose of this test case is to verify the assignment of Timing Advance
656 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
657 * first establishes several Uplink TBFs, but does not transmit any Uplink
658 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
659 * indications to the PCU, checking the correctness of two received PTCCH/D
660 * messages (period of PTCCH/D is two multi-frames).
661 */
662
663/* List of ToA values for Access Bursts to be sent on PTCCH/U,
664 * each ToA (Timing of Arrival) value is in units of 1/4 of
665 * a symbol (i.e. 1 symbol is 4 QTA units). */
666type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
667const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
668 0, 0, 0, 0,
669 0, 0, 0, 0,
670 0, 0, 0, 0,
671 0, 0, 0, 0
672};
673
674private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
675 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
676runs on RAW_PCU_Test_CT {
677 var RAW_PCU_Event event;
678 var integer ss;
679
680 /* Send Access Bursts on PTCCH/U for every TA Index */
681 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
682 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700683 if (ss < 0) { /* Shall not happen */
684 f_shutdown(__BFILE__, __LINE__);
685 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200686
687 log("Sending an Access Burst on PTCCH/U",
688 ", sub-slot=", ss, " (TAI)",
689 ", fn=", event.data.tdma_fn,
690 ", ToA=", toa_map[ss], " (QTA)");
691 /* TODO: do we care about RA and burst format? */
692 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
693 ra := oct2int('3A'O),
694 is_11bit := 0,
695 burst_type := BURST_TYPE_0,
696 fn := event.data.tdma_fn,
697 arfcn := 871,
698 qta := toa_map[ss],
699 sapi := PCU_IF_SAPI_PTCCH));
700 repeat;
701 }
702}
703
704private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
705 template PTCCHDownlinkMsg t_ta_msg)
706runs on RAW_PCU_Test_CT {
707 var PTCCHDownlinkMsg ta_msg;
708 var PCUIF_Message pcu_msg;
709 timer T;
710
711 /* First, send an RTS.req for the upcoming PTCCH/D block */
712 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
713 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
714 arfcn := 871, block_nr := 0));
715 T.start(2.0);
716 alt {
717 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
718 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
719 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
720 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
721 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
722 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
723 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
724 log("Rx PTCCH/D message: ", ta_msg);
725
726 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700727 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200728 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
729 }
730 }
731 [] BTS.receive { repeat; }
732 [] T.timeout {
733 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200734 }
735 }
736}
737
738testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
739 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200740 var GprsMS ms;
741
742 /* Initialize GPRS MS side */
743 f_init_gprs_ms();
744 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200745
746 /* Initialize the PCU interface abstraction */
747 f_init_raw(testcasename());
748
749 /* Enable forwarding of PTCCH/U TDMA events to us */
750 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
751
752 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
753 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200754 /* Establish an Uplink TBF */
755 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200756
757 /* We expect incremental TFI/USF assignment (dynamic allocation) */
758 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200759 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200760 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700761 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200762 }
763
764 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200765 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200766 setverdict(fail, "Failed to match Timing Advance Index for #", i);
767 /* Keep going, the current OsmoPCU does not assign TA Index */
768 }
769 }
770
771 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
772 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
773 for (var integer i := 0; i < 7; i := i + 1) {
774 /* ToA in units of 1/4 of a symbol */
775 toa_map[i] := (i + 1) * 7 * 4;
776 }
777
778 /* Now we have all 7 TBFs established in one-phase access mode,
779 * however we will not be sending any data on them. Instead, we
780 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
781 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
782 *
783 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
784 * time-slots, so at the moment of scheduling a PTCCH/D block
785 * the PCU has odd number of PTCCH/U Access Bursts received. */
786 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
787 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
788 /* Other values are not known (yet) */
789 tai3_ta := ?));
790 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
791 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
792 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
793 /* Other values are out of our interest */
794 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700795
796 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200797}
798
799/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
800 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
801 *
802 * NOTE: the ranges are intentionally overlapping because OsmoPCU
803 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
804private template integer CS1_lqual_dB_range := (-infinity .. 6);
805private template integer CS2_lqual_dB_range := (5 .. 8);
806private template integer CS3_lqual_dB_range := (7 .. 13);
807private template integer CS4_lqual_dB_range := (12 .. infinity);
808
809testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200810 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200811 var GprsMS ms;
812 var uint32_t unused_fn, sched_fn;
813 var uint4_t cv;
814
815 /* Initialize GPRS MS side */
816 f_init_gprs_ms();
817 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200818
819 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100820 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200821
822 f_pcuvty_set_allowed_cs_mcs();
823 f_pcuvty_set_link_quality_ranges();
824
825 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200826 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200827
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200828
829 /* The actual / old link quality values. We need to keep track of the old
830 * (basically previous) link quality value, because OsmoPCU actually
831 * changes the coding scheme if not only the actual, but also the old
832 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200833 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200834 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200835
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200836 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +0200837 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200838 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
839 /* 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 +0200840 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 +0200841 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
842 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
843 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200844
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200845 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
846 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200847 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200848 lqual_old := ms.lqual_cb;
849 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200850
851 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200852 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
853 if (i > g_bs_cv_max) {
854 cv := 15;
855 } else {
856 cv := i;
857 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200858
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200859 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
860
861 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
862 f_rx_rlcmac_dl_block(dl_block, unused_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +0700863 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200864 continue;
865 }
866 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
867 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
868 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
869 f_shutdown(__BFILE__, __LINE__);
870 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200871
872 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
873 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
874
875 /* Match the received Channel Coding Command. Since we are increasing
876 * the link quality value on each iteration and not decreasing, there
877 * is no need to check the both old and current link quality values. */
878 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200879 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200880 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
881 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
882 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
883 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
884 }
885
886 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
887 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200888 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200889 }
890 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700891
892 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200893}
894
895/* Test the max UL CS set by VTY works fine */
896testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200897 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200898 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200899 var uint32_t unused_fn, sched_fn;
900 var GprsMS ms;
901
902 /* Initialize GPRS MS side */
903 f_init_gprs_ms();
904 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200905
906 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100907 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200908
909 /* Set initial UL CS to 3 */
910 g_cs_initial_ul := 3;
911 f_pcuvty_set_allowed_cs_mcs();
912 f_pcuvty_set_link_quality_ranges();
913
914 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200915 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200916
917 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200918 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200919
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200920 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +0200921 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200922 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
923 /* 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 +0200924 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 +0200925 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
926 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
927 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200928
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200929 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
930 while (true) {
931 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
932 f_rx_rlcmac_dl_block(dl_block, unused_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +0700933 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200934 continue;
935 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200936
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200937 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
938 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
939 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
940 f_shutdown(__BFILE__, __LINE__);
941 break;
942 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200943
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200944 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200945 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200946 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200947 if (last_ch_coding != CH_CODING_CS3) {
948 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200949 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200950 }
951
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200952 /* Remaining UL blocks are used to make sure regardless of initial
953 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200954 /* 0 dB, make sure we downgrade CS */
955 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200956 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200957 f_ms_tx_ul_data_block_multi(ms, 5);
958 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
959 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
960 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200961
962 if (last_ch_coding != CH_CODING_CS1) {
963 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200964 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200965 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700966
967 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200968}
969
970/* Test the max UL CS set by VTY works fine */
971testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200972 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200973 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200974 var uint32_t unused_fn, sched_fn;
975 var GprsMS ms;
976
977 /* Initialize GPRS MS side */
978 f_init_gprs_ms();
979 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200980
981 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100982 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200983
984 /* Set maximum allowed UL CS to 3 */
985 g_cs_max_ul := 3;
986 f_pcuvty_set_allowed_cs_mcs();
987 f_pcuvty_set_link_quality_ranges();
988
989 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200990 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200991
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200992 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +0200993 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200994 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
995 /* 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 +0200996 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 +0200997 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
998 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
999 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001000
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001001 ms.lqual_cb := 40*10; /* 40 dB */
1002 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001003
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001004 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1005 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001006
1007 if (last_ch_coding != CH_CODING_CS3) {
1008 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +02001009 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001010 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001011
1012 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001013}
1014
Pau Espin Pedrol75122592020-11-03 15:22:59 +01001015/* Test the initial DL CS set by VTY works fine */
1016testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
1017 var octetstring data := f_rnd_octstring(10);
1018 var CodingScheme exp_dl_cs_mcs;
1019 var RlcmacDlBlock dl_block;
1020 var uint32_t poll_fn;
1021 var GprsMS ms;
1022
1023 /* Initialize NS/BSSGP side */
1024 f_init_bssgp();
1025 /* Initialize GPRS MS side */
1026 f_init_gprs_ms();
1027 ms := g_ms[0]; /* We only use first MS in this test */
1028
1029 /* Initialize the PCU interface abstraction */
1030 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1031
1032 /* Set initial allowed DL CS to 3 */
1033 g_cs_initial_dl := 3;
1034 exp_dl_cs_mcs := CS_3;
1035 /* Set maximum allowed UL CS to 4 */
1036 g_cs_max_dl := 4;
1037 f_pcuvty_set_allowed_cs_mcs();
1038 f_pcuvty_set_link_quality_ranges();
1039
1040 /* Establish BSSGP connection to the PCU */
1041 f_bssgp_establish();
1042 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1043
1044 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1045 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1046 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1047
1048 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1049 f_sleep(X2002);
1050 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1051
1052 /* ACK the DL block */
1053 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1054 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1055 f_dl_block_ack_fn(dl_block, poll_fn));
1056
1057 f_shutdown(__BFILE__, __LINE__, final := true);
1058}
1059
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001060/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001061function 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 +01001062 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001063 var RlcmacDlBlock prev_dl_block, dl_block;
1064 var uint32_t ack_fn;
1065 var uint32_t fn;
1066 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001067 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001068 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001069 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
1070 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001071 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001072
1073 if (using_egprs) {
1074 exp_tmp_csmcs := mcs_egprs_any;
1075 bsn_mod := 2048;
1076 } else {
1077 exp_tmp_csmcs := cs_gprs_any;
1078 bsn_mod := 128;
1079 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001080
1081 /* Establish BSSGP connection to the PCU */
1082 f_bssgp_establish();
1083
1084 ms := g_ms[0]; /* We only use first MS in this test */
1085 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1086
1087 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001088 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001089 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1090
1091 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1092 f_sleep(X2002);
1093
Pau Espin Pedrole3e2bf62022-11-29 14:32:48 +01001094 /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
1095 fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
1096
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001097 for (var integer i := 0; i < 800; i := i + 1) {
1098 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001099
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07001100 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001101 /* No more data to receive, done */
1102 break;
1103 }
1104
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001105 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001106
1107 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001108 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001109
1110 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001111 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001112 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001113 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 +01001114 if (tx_data_remain != 0) {
1115 /* Submit more data from time to time to keep the TBF ongoing */
1116 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1117 tx_data_remain := tx_data_remain - 1;
1118 }
1119 }
1120 prev_dl_block := dl_block;
Pau Espin Pedrole3e2bf62022-11-29 14:32:48 +01001121 f_rx_rlcmac_dl_block(dl_block, fn);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001122 }
1123
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001124 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1125 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001126
1127
1128 f_shutdown(__BFILE__, __LINE__, final := true);
1129}
1130
1131/* Verify DL CS above "cs max" set by VTY is never used */
1132testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1133 /* Initialize NS/BSSGP side */
1134 f_init_bssgp();
1135 /* Initialize GPRS MS side */
1136 f_init_gprs_ms();
1137
1138 /* Initialize the PCU interface abstraction */
1139 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1140
1141 /* Set maximum allowed DL CS to 3 */
1142 g_cs_initial_dl := 1;
1143 g_cs_max_dl := 3;
1144 f_pcuvty_set_allowed_cs_mcs();
1145 f_pcuvty_set_link_quality_ranges();
1146
1147 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02001148
1149 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001150}
1151
1152/* Check DL CS4 is used in good link conditions if allowed by config */
1153testcase TC_dl_cs1_to_cs4() runs on RAW_PCU_Test_CT {
1154 /* Initialize NS/BSSGP side */
1155 f_init_bssgp();
1156 /* Initialize GPRS MS side */
1157 f_init_gprs_ms();
1158
1159 /* Initialize the PCU interface abstraction */
1160 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1161
1162 /* Set initial DL CS to 1 & maximum allowed DL CS to 4 */
1163 g_cs_initial_dl := 1;
1164 g_cs_max_dl := 4;
1165 f_pcuvty_set_allowed_cs_mcs();
1166 f_pcuvty_set_link_quality_ranges();
1167
1168 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02001169
1170 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001171}
1172
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001173/* Test the initial UL MCS set by VTY works fine */
1174testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1175 var RlcmacDlBlock dl_block;
1176 var PollFnCtx pollctx;
1177 var EgprsChCodingCommand last_ch_coding;
1178 var uint32_t unused_fn, sched_fn;
1179 var GprsMS ms;
1180 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001181
1182 /* Initialize GPRS MS side */
1183 f_init_gprs_ms();
1184 ms := g_ms[0]; /* We only use first MS in this test */
1185
1186 /* Initialize the PCU interface abstraction */
1187 f_init_raw(testcasename());
1188
1189 /* Set initial UL MCS to 3 */
1190 g_mcs_initial_ul := 3;
1191 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1192 f_pcuvty_set_allowed_cs_mcs();
1193 f_pcuvty_set_link_quality_ranges();
1194
1195 /* Take lqual (dB->cB) so that we stay in that MCS */
1196 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1197
1198 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001199 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 +01001200
1201 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1202 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1203 f_shutdown(__BFILE__, __LINE__);
1204 }
1205
1206 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1207 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1208
1209 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1210 while (true) {
1211 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1212 f_rx_rlcmac_dl_block(dl_block, unused_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07001213 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001214 continue;
1215 }
1216
1217 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1218 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1219 f_shutdown(__BFILE__, __LINE__);
1220 break;
1221 }
1222
1223 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1224 break;
1225 }
1226 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1227 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1228 f_shutdown(__BFILE__, __LINE__);
1229 }
1230
1231 /* Remaining UL blocks are used to make sure regardless of initial
1232 * lqual, we can go lower at any time
1233 * 0 dB, make sure we downgrade MCS */
1234 ms.lqual_cb := 0;
1235 /* 5 UL blocks, check we are in same initial MCS: */
1236 f_ms_tx_ul_data_block_multi(ms, 5);
1237 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1238 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1239 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1240
1241 if (last_ch_coding != CH_CODING_MCS1) {
1242 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1243 f_shutdown(__BFILE__, __LINE__);
1244 }
1245
1246 f_shutdown(__BFILE__, __LINE__, final := true);
1247}
1248
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001249/* Test the maximum UL MCS set by VTY works fine */
1250testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1251 var RlcmacDlBlock dl_block;
1252 var EgprsChCodingCommand last_ch_coding;
1253 var PollFnCtx pollctx;
1254 var uint32_t unused_fn, sched_fn;
1255 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001256
1257 /* Initialize GPRS MS side */
1258 f_init_gprs_ms();
1259 ms := g_ms[0]; /* We only use first MS in this test */
1260
1261 /* Initialize the PCU interface abstraction */
1262 f_init_raw(testcasename());
1263
1264 /* Set maximum allowed UL MCS to 5 */
1265 g_mcs_max_ul := 5;
1266 f_pcuvty_set_allowed_cs_mcs();
1267 f_pcuvty_set_link_quality_ranges();
1268
1269 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001270 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 +01001271 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1272 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1273
1274 ms.lqual_cb := 40*10; /* 40 dB */
1275 f_ms_tx_ul_data_block_multi(ms, 16);
1276
1277 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1278 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1279
1280 if (last_ch_coding != CH_CODING_MCS5) {
1281 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1282 f_shutdown(__BFILE__, __LINE__);
1283 }
1284
1285 f_shutdown(__BFILE__, __LINE__, final := true);
1286}
1287
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001288/* Test the initial DL CS set by VTY works fine */
1289testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1290 var octetstring data := f_rnd_octstring(10);
1291 var CodingScheme exp_dl_cs_mcs;
1292 var RlcmacDlBlock dl_block;
1293 var uint32_t poll_fn;
1294 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001295
1296 /* Initialize NS/BSSGP side */
1297 f_init_bssgp();
1298 /* Initialize GPRS MS side */
1299 f_init_gprs_ms();
1300 ms := g_ms[0]; /* We only use first MS in this test */
1301
1302 /* Initialize the PCU interface abstraction */
1303 f_init_raw(testcasename());
1304
1305 /* Set initial allowed DL MCS to 3 */
1306 g_mcs_initial_dl := 3;
1307 exp_dl_cs_mcs := MCS_3;
1308 /* Set maximum allowed DL MCS to 4 */
1309 g_mcs_max_dl := 4;
1310 f_pcuvty_set_allowed_cs_mcs();
1311 f_pcuvty_set_link_quality_ranges();
1312
1313 /* Establish BSSGP connection to the PCU */
1314 f_bssgp_establish();
1315 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1316
1317 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001318 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001319 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1320
1321 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1322 f_sleep(X2002);
1323 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1324
1325 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001326 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1327 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 +01001328 f_dl_block_ack_fn(dl_block, poll_fn));
1329
1330 f_shutdown(__BFILE__, __LINE__, final := true);
1331}
1332
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001333/* Verify DL MCS above "mcs max" set by VTY is never used */
1334testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1335 /* Initialize NS/BSSGP side */
1336 f_init_bssgp();
1337 /* Initialize GPRS MS side */
1338 f_init_gprs_ms();
1339
1340 /* Initialize the PCU interface abstraction */
1341 f_init_raw(testcasename());
1342
1343 /* Set maximum allowed DL CS to 3 */
1344 g_mcs_initial_dl := 1;
1345 g_mcs_max_dl := 3;
1346 f_pcuvty_set_allowed_cs_mcs();
1347 f_pcuvty_set_link_quality_ranges();
1348
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001349 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_mcs_max_dl, true), bssgp_ms_racap_egprs_def);
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02001350
1351 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001352}
1353
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02001354/* Verify PCU drops TBF after some time of inactivity. */
1355testcase TC_t3141() runs on RAW_PCU_Test_CT {
1356 var PCUIF_info_ind info_ind;
1357 var template (value) TsTrxBtsNum nr;
1358 var BTS_PDTCH_Block data_msg;
1359 var GprsMS ms;
1360 var uint3_t rx_usf;
1361 timer T_3141 := 1.0;
1362 var boolean ul_tbf_usf_req := false;
1363
1364 /* Initialize NS/BSSGP side */
1365 f_init_bssgp();
1366 /* Initialize GPRS MS side */
1367 f_init_gprs_ms();
1368 ms := g_ms[0]; /* We only use first MS in this test */
1369
1370 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1371 /* Only use 1 PDCH to simplify test: */
1372 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
1373 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
1374 /* Initialize the PCU interface abstraction */
1375 f_init_raw(testcasename(), info_ind);
1376
1377 f_vty_config2(PCUVTY, {"pcu"}, "timer T3141 1");
1378
1379 /* Establish BSSGP connection to the PCU */
1380 f_bssgp_establish();
1381 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1382
1383 /* Establish a one-phase access Uplink TBF */
1384 f_ms_establish_ul_tbf(ms);
1385
1386 T_3141.start;
1387
1388 /* Now we wait for PCU to transmit our USF */
1389 nr := ts_TsTrxBtsNum;
1390 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1391 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1392 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1393 block_nr := nr.blk_nr));
1394
1395 alt {
1396 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1397 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1398 ?)) -> value data_msg {
1399 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1400 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1401 f_shutdown(__BFILE__, __LINE__);
1402 }
1403
1404 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1405 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1406 /* PCU requests our USF, transmit WITHOUT tlli to avoid contention resolution success */
1407 ul_tbf_usf_req := true;
1408 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))
1409 } else if (rx_usf == USF_UNUSED) {
1410 if (data_msg.raw.fn >= ms.ul_tbf.start_time_fn) {
1411 if (ul_tbf_usf_req) {
1412 /* TBF was dropped by T3141, success */
1413 setverdict(pass);
1414 break;
1415 } else {
1416 log("PCU never requested USF, unexpected");
1417 f_shutdown(__BFILE__, __LINE__);
1418 }
1419 } /* else: Keep waiting for TBF to be active by network */
1420 } else {
1421 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1422 f_shutdown(__BFILE__, __LINE__);
1423 }
1424
1425 /* Make sure we don't receive a Ul ACK/NACK with TLLI set: */
1426 if (match(data_msg.dl_block,
1427 tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
1428 tr_UlAckNackGprs(tlli := ?,
1429 acknack_desc := ?,
1430 rel99 := *))))
1431 {
1432 log("Received UL ACK/NACK with TLLI set");
1433 f_shutdown(__BFILE__, __LINE__);
1434 }
1435
1436 nr := ts_TsTrxBtsNum;
1437 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1438 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1439 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1440 block_nr := nr.blk_nr));
1441 repeat;
1442 }
Pau Espin Pedrole5fe6e72022-02-22 15:15:00 +01001443 [ul_tbf_usf_req] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1444 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1445 omit)) {
1446 /* TBF was dropped by T3141, and PCU answered with an IDLE block to
1447 our last RTS.req because there's no longer any MS listening on
1448 the TS. */
1449 setverdict(pass);
1450 break;
1451 }
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02001452 [] T_3141.timeout {
1453 log("T_3141 expired but TBF is still active, unexpected");
1454 f_shutdown(__BFILE__, __LINE__);
1455 }
1456 [] BTS.receive {
1457 /* We should never receive non-dummy messages, aka UL ACK/NACK,
1458 * because we never sent the TLLI to the PCU */
1459 setverdict(fail, "Unexpected BTS message");
1460 f_shutdown(__BFILE__, __LINE__);
1461 }
1462 }
1463
1464 f_shutdown(__BFILE__, __LINE__, final := true);
1465}
1466
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001467/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1468 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1469 * T3169. See OS#5033 */
1470testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1471 var PCUIF_info_ind info_ind;
1472 var template (value) TsTrxBtsNum nr;
1473 var BTS_PDTCH_Block data_msg;
1474 var GprsMS ms;
1475 var uint3_t rx_usf;
1476 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1477 var integer n3101 := 0;
1478 timer T_3169 := 1.0;
1479
1480 /* Initialize NS/BSSGP side */
1481 f_init_bssgp();
1482 /* Initialize GPRS MS side */
1483 f_init_gprs_ms();
1484 ms := g_ms[0]; /* We only use first MS in this test */
1485
1486 /* Initialize the PCU interface abstraction */
1487 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1488 info_ind.n3101 := N3101_MAX;
1489 info_ind.t3169 := 1;
1490 f_init_raw(testcasename(), info_ind);
1491
1492 /* Establish BSSGP connection to the PCU */
1493 f_bssgp_establish();
1494 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1495
1496 /* Establish UL TBF */
1497 f_ms_establish_ul_tbf(ms);
1498
1499 /* Now we wait for PCU to transmit our USF */
1500 nr := ts_TsTrxBtsNum;
1501 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1502 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1503 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1504 block_nr := nr.blk_nr));
1505
1506 alt {
1507 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1508 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1509 ?)) -> value data_msg {
1510 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1511 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1512 f_shutdown(__BFILE__, __LINE__);
1513 }
1514
1515 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1516 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1517 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1518 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001519 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1520 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001521 f_shutdown(__BFILE__, __LINE__);
1522 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001523 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001524 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1525 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1526 if (not T_3169.running) {
1527 log("T3169 started");
1528 T_3169.start;
1529 }
1530 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1531 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1532 f_shutdown(__BFILE__, __LINE__);
1533 } else {
1534 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1535 }
1536 nr := ts_TsTrxBtsNum;
1537 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1538 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1539 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1540 block_nr := nr.blk_nr));
1541 repeat;
1542 }
Pau Espin Pedrol907ba202021-11-12 17:25:24 +01001543 /* We may already receive empty (idle) blocks before our own TTCN3 timer
1544 * triggers due to the TBF being released. Keep going until our T_3169 triggers. */
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01001545 [n3101 == N3101_MAX + 1] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001546 [] T_3169.timeout {
1547 log("T_3169 expired");
1548 /* Done in alt */
1549 }
1550 [] BTS.receive {
1551 setverdict(fail, "Unexpected BTS message");
1552 f_shutdown(__BFILE__, __LINE__);
1553 }
1554 }
1555
1556 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1557 /* USFs as per previous TBF since they were freed at expiration time: */
1558 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1559 var uint5_t old_tfi := ms.ul_tbf.tfi;
1560 f_ms_establish_ul_tbf(ms);
1561 if (old_tfi != ms.ul_tbf.tfi) {
1562 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1563 f_shutdown(__BFILE__, __LINE__);
1564 }
1565 for (var integer i := 0; i < 8; i := i +1) {
1566 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1567 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1568 f_shutdown(__BFILE__, __LINE__);
1569 }
1570 }
1571
1572 f_shutdown(__BFILE__, __LINE__, final := true);
1573}
1574
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001575
1576/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1577 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1578 the final UL ACK sent at us. */
1579testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1580 var PCUIF_info_ind info_ind;
1581 var BTS_PDTCH_Block data_msg;
1582 var RlcmacDlBlock dl_block;
1583 var uint32_t sched_fn;
1584 var template (value) TsTrxBtsNum nr;
1585 var template RlcmacDlBlock exp_ul_ack;
1586 var template UlAckNackGprs exp_ul_ack_sub;
1587 var GprsMS ms;
1588 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1589 var integer N3103 := 0;
1590 timer T_3169 := 1.0;
1591
1592 /* Initialize GPRS MS side */
1593 f_init_gprs_ms();
1594 ms := g_ms[0]; /* We only use first MS in this test */
1595
1596 /* Initialize the PCU interface abstraction */
1597 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1598 info_ind.n3103 := N3103_MAX;
1599 info_ind.t3169 := 1;
1600 f_init_raw(testcasename(), info_ind);
1601
1602 /* Establish an Uplink TBF */
1603 f_ms_establish_ul_tbf(ms);
1604
Pau Espin Pedrol93ae4522021-05-11 15:58:26 +02001605 f_ms_tx_ul_data_block_multi(ms, 5, with_tlli := true);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001606 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1607 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1608
1609 nr := ts_TsTrxBtsNum;
1610 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1611 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1612 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1613 block_nr := nr.blk_nr));
1614 alt {
1615 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1616 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1617 exp_ul_ack)) -> value data_msg {
1618 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1619 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1620 f_shutdown(__BFILE__, __LINE__);
1621 }
1622
1623 nr := ts_TsTrxBtsNum;
1624 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1625 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1626 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1627 block_nr := nr.blk_nr));
1628 N3103 := N3103 + 1;
1629 if (N3103 == N3103_MAX) {
1630 /* At this point in time (N3103_MAX reached), PCU is
1631 * moving the TBF to RELEASE state so no data/ctrl for
1632 * it is tx'ed, hence the dummy blocks: */
1633 T_3169.start;
1634 }
1635 repeat;
1636 }
1637 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1638 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1639 exp_ul_ack)) -> value data_msg {
1640 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1641 f_shutdown(__BFILE__, __LINE__);
1642 }
1643 [] as_ms_rx_ignore_dummy(ms, nr);
Pau Espin Pedrol907ba202021-11-12 17:25:24 +01001644 [] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001645 [T_3169.running] T_3169.timeout {
1646 log("T_3169 timeout");
1647 /* Done in alt, wait for pending RTS initiated previously in
1648 * above case before continuing (expect /* Dummy block): */
1649 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1650 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07001651 tr_RLCMAC_DL_DUMMY_CTRL));
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001652 }
1653 [] BTS.receive {
1654 setverdict(fail, "Unexpected BTS message");
1655 f_shutdown(__BFILE__, __LINE__);
1656 }
1657 }
1658
1659 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1660 * USFs as per previous TBF since they were freed at expiration time: */
1661 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1662 var uint5_t old_tfi := ms.ul_tbf.tfi;
1663 f_ms_establish_ul_tbf(ms);
1664 if (old_tfi != ms.ul_tbf.tfi) {
1665 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1666 f_shutdown(__BFILE__, __LINE__);
1667 }
1668 for (var integer i := 0; i < 8; i := i +1) {
1669 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1670 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1671 f_shutdown(__BFILE__, __LINE__);
1672 }
1673 }
1674
1675 f_shutdown(__BFILE__, __LINE__, final := true);
1676}
1677
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001678/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1679 * point the TBF is no longer available. In order to get to start of T3191, we
1680 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1681 * until TBF release procedure starts after draining DL queue. */
1682testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1683 var PCUIF_info_ind info_ind;
1684 var RlcmacDlBlock dl_block;
1685 var octetstring data1 := f_rnd_octstring(200);
1686 var octetstring data2 := f_rnd_octstring(10);
1687 var uint32_t dl_fn;
1688 var template (value) TsTrxBtsNum nr;
1689 var BTS_PDTCH_Block data_msg;
1690 var GprsMS ms;
1691
1692 /* Initialize NS/BSSGP side */
1693 f_init_bssgp();
1694 /* Initialize GPRS MS side */
1695 f_init_gprs_ms();
1696 ms := g_ms[0]; /* We only use first MS in this test */
1697
1698 /* Initialize the PCU interface abstraction */
1699 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1700 /* Set timer to 1 sec (default 5) to speedup test: */
1701 info_ind.t3191 := 1;
1702 f_init_raw(testcasename(), info_ind);
1703
1704 /* Establish BSSGP connection to the PCU */
1705 f_bssgp_establish();
1706 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1707
1708 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1709 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1710 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1711
1712 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1713 f_sleep(X2002);
1714
1715 while (true) {
1716 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1717
1718 /* Keep Ack/Nack description updated (except for last BSN) */
1719 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1720
1721 if (f_dl_block_rrbp_valid(dl_block)) {
1722 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1723 f_dl_block_ack_fn(dl_block, dl_fn));
1724 break;
1725 }
1726 }
1727
1728 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1729 nr := ts_TsTrxBtsNum;
1730 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1731 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1732 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1733 block_nr := nr.blk_nr));
1734 alt {
1735 [] as_ms_rx_ignore_dummy(ms, nr);
1736 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1737 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1738 ?)) -> value data_msg {
1739 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1740 log("Received FINAL_ACK");
1741 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1742 break;
1743 }
1744 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1745 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1746 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1747 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1748 }
1749 nr := ts_TsTrxBtsNum;
1750 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1751 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1752 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1753 block_nr := nr.blk_nr));
1754 repeat;
1755 }
1756 [] BTS.receive {
1757 setverdict(fail, "Unexpected BTS message");
1758 f_shutdown(__BFILE__, __LINE__);
1759 }
1760 }
1761
1762 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1763 to time out. We simply sleep instead of requesting blocks because
1764 otherwise retransmissions would keep restarting the timer. */
1765 f_sleep(int2float(info_ind.t3191));
1766
1767 /* The TBF should be freed now, so new data should trigger an Assignment: */
1768 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1769 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1770
1771 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1772 f_sleep(X2002);
1773 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1774 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1775 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1776 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1777 f_dl_block_ack_fn(dl_block, dl_fn));
1778
1779 f_shutdown(__BFILE__, __LINE__, final := true);
1780}
1781
1782/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1783testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1784 var PCUIF_info_ind info_ind;
1785 var RlcmacDlBlock dl_block;
1786 var octetstring data1 := f_rnd_octstring(1400);
1787 var octetstring data2 := f_rnd_octstring(10);
1788 var uint32_t dl_fn;
1789 var GprsMS ms;
1790
1791 /* Initialize NS/BSSGP side */
1792 f_init_bssgp();
1793 /* Initialize GPRS MS side */
1794 f_init_gprs_ms();
1795 ms := g_ms[0]; /* We only use first MS in this test */
1796
1797 /* Initialize the PCU interface abstraction */
1798 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1799 /* Set timer to 1 sec (default 5) to speedup test: */
1800 info_ind.t3191 := 1;
1801 f_init_raw(testcasename(), info_ind);
1802
1803 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1804
1805 /* Establish BSSGP connection to the PCU */
1806 f_bssgp_establish();
1807 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1808
1809 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1810 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1811 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1812
1813 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1814 f_sleep(X2002);
1815
1816 /* Send enough DL data to at least be able to DL ACK once (excl the
1817 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1818 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1819 while (true) {
1820 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1821
1822 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1823 log("Received FINAL_ACK");
1824 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1825 break;
1826 }
1827
1828 /* Keep Ack/Nack description updated (except for last BSN) */
1829 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1830
1831 if (f_dl_block_rrbp_valid(dl_block)) {
1832 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1833 f_dl_block_ack_fn(dl_block, dl_fn));
1834 }
1835 }
1836
1837 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1838 to time out. We simply sleep instead of requesting blocks because
1839 otherwise retransmissions would keep restarting the timer. */
1840 f_sleep(int2float(info_ind.t3191));
1841
1842 /* The TBF should be freed now, so new data should trigger an Assignment: */
1843 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1844 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1845
1846 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1847 f_sleep(X2002);
1848 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1849 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1850 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1851 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1852 f_dl_block_ack_fn(dl_block, dl_fn));
1853
1854 f_shutdown(__BFILE__, __LINE__, final := true);
1855}
1856
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001857/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1858 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1859 * T3193) after DL TBF release */
1860testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001861 var RlcmacDlBlock dl_block;
1862 var octetstring data := f_rnd_octstring(10);
1863 var boolean ok;
1864 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001865 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001866 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001867 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1868
1869 /* Initialize NS/BSSGP side */
1870 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001871 /* Initialize GPRS MS side */
1872 f_init_gprs_ms();
1873 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001874
1875 /* Initialize the PCU interface abstraction */
1876 f_init_raw(testcasename());
1877
Pau Espin Pedrol1c6a9e42023-06-20 11:54:56 +02001878 /* Disable "idle DL TBF alive" timer, to make the test easier and avoid
1879 * having to keep receiving dummy LLC blocks for a while until the last
1880 * block with FBI=1 is set. This way the first and only DL block is already
1881 * the FBI one. */
1882 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1883
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001884 /* Establish BSSGP connection to the PCU */
1885 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001886 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001887
1888 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001889 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1890 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001891
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001892 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1893 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001894 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol1c6a9e42023-06-20 11:54:56 +02001895 if (dl_block.data.mac_hdr.hdr_ext.fbi == false) {
1896 setverdict(fail, "Expected DL data block with FBI=1 but got FBI=0");
1897 f_shutdown(__BFILE__, __LINE__);
1898 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001899
1900 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001901 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1902 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1903 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001904
1905 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001906 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001907 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001908 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001909 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001910
1911 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001912
1913 /* 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 +07001914 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001915 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1916 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1917 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001918
1919 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001920}
1921
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001922/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1923 freed and no longer available. Trigger it by sending DL blocks and never DL
1924 ACKing the data (which are requested through RRBP) */
1925testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1926 var PCUIF_info_ind info_ind;
1927 var RlcmacDlBlock dl_block;
1928 var octetstring data1 := f_rnd_octstring(1000);
1929 var octetstring data2 := f_rnd_octstring(10);
1930 var uint32_t dl_fn;
1931 var template (value) TsTrxBtsNum nr;
1932 var BTS_PDTCH_Block data_msg;
1933 var GprsMS ms;
1934 const integer N3105_MAX := 2;
1935 var integer N3105 := 0;
1936 timer T_3195 := 1.0;
1937 var integer num_poll_recv := 0;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001938 var template RlcmacDlBlock dl_block_exp;
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001939
1940 /* Initialize NS/BSSGP side */
1941 f_init_bssgp();
1942 /* Initialize GPRS MS side */
1943 f_init_gprs_ms();
1944 ms := g_ms[0]; /* We only use first MS in this test */
1945
1946 /* Initialize the PCU interface abstraction */
1947 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1948 /* Speedup test: */
1949 info_ind.n3105 := N3105_MAX;
1950 info_ind.t3195 := 1;
1951 f_init_raw(testcasename(), info_ind);
1952
1953 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1954 * MS and retransmitted after the TBF is released and later on created
1955 * (because the MS is reused) */
1956 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1957
1958 /* Establish BSSGP connection to the PCU */
1959 f_bssgp_establish();
1960 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1961
1962 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1963 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1964 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1965
1966 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1967 f_sleep(X2002);
1968
1969 /* Now we go on receiving DL data and not answering RRBP: */
1970 nr := ts_TsTrxBtsNum;
1971 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1972 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1973 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1974 block_nr := nr.blk_nr));
1975 alt {
1976 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1977 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1978 tr_RLCMAC_DATA)) -> value data_msg {
1979 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1980 if (num_poll_recv == 0) {
1981 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1982 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1983 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1984 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1985 } else {
1986 log("Ignoring RRBP ", num_poll_recv);
1987 N3105 := N3105 + 1;
1988 }
1989 num_poll_recv := num_poll_recv + 1;
1990 }
1991
1992 nr := ts_TsTrxBtsNum;
1993 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1994 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1995 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1996 block_nr := nr.blk_nr));
1997 repeat;
1998 }
1999 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02002000 * RELEASE state so no data for it is tx'ed, hence the dummy/idle blocks:
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002001 */
2002 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2003 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07002004 tr_RLCMAC_DL_DUMMY_CTRL)) -> value data_msg {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002005 if (not T_3195.running) {
2006 T_3195.start;
2007 /* We even send some new data, nothing should be sent to MS */
2008 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2009 }
2010 nr := ts_TsTrxBtsNum;
2011 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2012 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2013 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2014 block_nr := nr.blk_nr));
2015 repeat;
2016 }
Pau Espin Pedrol518e82f2021-11-12 17:24:33 +01002017 /* We may already receive idle blocks before our own TTCN3 timer
2018 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002019 [N3105 == N3105_MAX] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002020 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002021 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002022 /* Done in alt, wait for pending RTS initiated previously in
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002023 * above case before continuing (expect empty block): */
2024 dl_block_exp := omit;
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002025 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2026 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02002027 dl_block_exp));
2028 }
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002029 [] BTS.receive {
2030 setverdict(fail, "Unexpected BTS message");
2031 f_shutdown(__BFILE__, __LINE__);
2032 }
2033 }
2034
2035 /* after T_3195 timeout, TBF is released */
2036 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
2037 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2038
2039 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2040 f_sleep(X2002);
2041 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
2042
2043 /* ACK the DL block */
2044 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2045 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2046 f_dl_block_ack_fn(dl_block, dl_fn));
2047
2048 f_shutdown(__BFILE__, __LINE__, final := true);
2049}
2050
Pau Espin Pedrole8a94442021-11-15 17:05:46 +01002051/* Verify configured T3172 is properly transmitted as WAIT_INDICATION in Pkt Access Reject in PACCH. */
2052function f_TC_t3172(integer t3172_ms, BIT1 wait_ind_size) runs on RAW_PCU_Test_CT {
2053 var PCUIF_info_ind info_ind;
2054 var template IARRestOctets rest;
2055 var BIT11 ra11;
2056 var GprsMS ms;
2057 var octetstring data := f_rnd_octstring(10);
2058 var RlcmacDlBlock dl_block;
2059 var template RlcmacDlBlock rej_tmpl;
2060 var uint32_t dl_fn;
2061 var uint32_t sched_fn;
2062 var uint8_t wait_ind_val;
2063
2064 /* Initialize NS/BSSGP side */
2065 f_init_bssgp();
2066 /* Initialize GPRS MS side */
2067 f_init_gprs_ms();
2068 ms := g_ms[0]; /* We only use first MS in this test */
2069
2070 info_ind := valueof(ts_PCUIF_INFO_default);
2071
2072 /* Only the first TRX is enabled. */
2073 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
2074 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
2075
2076 /* Initialize the PCU interface abstraction */
2077 f_init_raw(testcasename(), info_ind);
2078
2079 f_pcuvty_set_timer(3172, t3172_ms);
2080
2081 /* Establish BSSGP connection to the PCU */
2082 f_bssgp_establish();
2083 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2084
2085 var EGPRSPktChRequest req := {
2086 one_phase := {
2087 tag := '0'B,
2088 multislot_class := '10101'B,
2089 priority := '01'B,
2090 random_bits := '101'B
2091 }
2092 };
2093
2094 /* We send 7 requests, the IUT gives us all available USFs (0..6) */
2095 for (var integer i := 0; i < 7; i := i + 1) {
2096 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
2097 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
2098 }
2099
2100 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2101 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2102 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2103
2104 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2105 f_sleep(X2002);
2106 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
2107
2108 /* ACK the DL block */
2109 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2110 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc, false, ts_ChannelReqDescription()),
2111 f_dl_block_ack_fn(dl_block, dl_fn));
2112
2113 /* Since all USF are taken, we should receive a Reject: */
2114
2115 if (wait_ind_size == '0'B) {
2116 wait_ind_val := t3172_ms / 1000;
2117 } else {
2118 wait_ind_val := t3172_ms / 20;
2119 }
2120 rej_tmpl := tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_ACC_REJ(
2121 tr_PacketAccessRejectStruct_TLLI(ms.tlli,
2122 wait_ind_val,
2123 wait_ind_size)));
2124 template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum;
2125 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2126 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2127 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2128 block_nr := nr.blk_nr));
2129 alt {
2130 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2131 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2132 rej_tmpl));
2133 [] BTS.receive {
2134 setverdict(fail, "Unexpected BTS message");
2135 f_shutdown(__BFILE__, __LINE__);
2136 }
2137 }
2138 f_shutdown(__BFILE__, __LINE__, final := true);
2139}
2140testcase TC_t3172_wait_ind_size0() runs on RAW_PCU_Test_CT {
2141 /* size=0 means value is provided in seconds. Due to value being 8
2142 * bit, in the 20ms step case (size=1) the maximum value possible is 20 * 255
2143 * = 5100. Hence, values above it should use size=0 to be able to
2144 * provide values in range. Let's use 6 seconds, 6000ms
2145 */
2146 f_TC_t3172(6000, '0'B);
2147}
2148testcase TC_t3172_wait_ind_size1() runs on RAW_PCU_Test_CT {
2149 f_TC_t3172(3000, '1'B);
2150}
2151
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002152/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
2153testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002154 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002155 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002156 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002157 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002158
2159 /* Initialize NS/BSSGP side */
2160 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002161 /* Initialize GPRS MS side */
2162 f_init_gprs_ms();
2163 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002164
2165 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002166 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002167
2168 /* Establish BSSGP connection to the PCU */
2169 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002170 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002171
2172 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002173 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002174
2175 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002176 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002177 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002178 /* 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 +02002179 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 +02002180 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2181 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002182 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002183
2184 /* Send enough blocks to test whole procedure: Until Nth block
2185 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
2186 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002187 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002188 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2189 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002190 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002191
2192 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002193 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 +07002194
2195 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002196}
2197
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002198/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
2199testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
2200 var RlcmacDlBlock dl_block;
2201 var uint32_t dl_fn, sched_fn;
2202 var octetstring payload;
2203 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002204 var template (value) LlcBlockHdr blk_hdr;
2205 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002206 var integer blk_len;
2207 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002208 var GprsMS ms;
2209
2210 /* Initialize NS/BSSGP side */
2211 f_init_bssgp();
2212 /* Initialize GPRS MS side */
2213 f_init_gprs_ms();
2214 ms := g_ms[0]; /* We only use first MS in this test */
2215
2216 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002217 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002218
2219 /* Establish BSSGP connection to the PCU */
2220 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002221 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002222
2223 /* Establish an Uplink TBF */
2224 f_ms_establish_ul_tbf(ms);
2225
2226 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002227 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002228 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002229 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2230 more := false, e := true);
2231 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002232 /* 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 +01002233 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
2234 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002235 cv := 15,
2236 bsn := ms.ul_tbf.bsn,
2237 blocks := blocks,
2238 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002239 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002240 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002241
2242 /* ACK and check it was received fine */
2243 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2244 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2245 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2246 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002247 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 +02002248
2249 /* Test sending LLC PDUS of incrementing size */
2250 var integer max_size := 49;
2251 for (var integer i := 1; i <= max_size; i := i + 1) {
2252 var integer cv;
2253 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
2254 log("Sending DATA.ind with LLC payload size ", i);
2255 if (i < max_size - g_bs_cv_max) {
2256 cv := 15;
2257 } else {
2258 cv := max_size - i;
2259 }
2260
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002261 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
2262 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002263 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002264 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2265 more := false, e := true);
2266 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002267 /* 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 +01002268 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
2269 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002270 cv := cv,
2271 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002272 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002273 f_ultbf_inc_bsn(ms.ul_tbf);
2274 f_ms_tx_ul_block(ms, ul_data);
2275
2276 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002277 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 +02002278
2279 /* we will receive UL ACK/NACK from time to time, handle it. */
2280 f_rx_rlcmac_dl_block(dl_block, dl_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07002281 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002282 continue;
2283 }
2284 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2285 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2286 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2287 f_shutdown(__BFILE__, __LINE__);
2288 }
2289
2290 log("Rx Packet Uplink ACK / NACK");
2291 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2292 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2293 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2294 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002295
2296 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002297}
2298
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002299function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2300 var octetstring payload;
2301 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002302 var template (value) LlcBlockHdr blk_hdr;
2303 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002304 var integer block_len, max_valid_data_len;
2305 timer T;
2306
2307 block_len := f_rlcmac_cs_mcs2block_len(cs);
2308 /* We need to send with TLLI since we are in One-Phase Access Contenion
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002309 * resolution), so that's -4 bytes of data, -3 for headers, -1 for LI
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002310 * indicator, -1 for spare bits octet at the end */
2311 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2312 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 +07002313 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2314 more := false, e := true);
2315 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002316 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2317 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002318 cv := cv,
2319 bsn := ms.ul_tbf.bsn,
2320 blocks := blocks,
2321 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002322 f_ultbf_inc_bsn(ms.ul_tbf);
2323 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2324
2325 T.start(0.5);
2326 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002327 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002328 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2329 f_shutdown(__BFILE__, __LINE__);
2330 }
2331 [] T.timeout {
2332 setverdict(pass);
2333 }
2334 }
2335}
2336/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2337 blocks intentionally contain last byte of data placed in last byte of RLC
2338 containing padding/spare bits, which is incorrect. Spare bits exist and are
2339 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2340 discounting padding in octet" */
2341testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2342 var GprsMS ms;
2343 var integer block_len, max_valid_data_len;
2344
2345 /* Initialize NS/BSSGP side */
2346 f_init_bssgp();
2347 /* Initialize GPRS MS side */
2348 f_init_gprs_ms();
2349 ms := g_ms[0]; /* We only use first MS in this test */
2350
2351 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002352 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002353
2354 /* Establish BSSGP connection to the PCU */
2355 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002356 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002357
2358 /* Establish an Uplink TBF */
2359 f_ms_establish_ul_tbf(ms);
2360
2361 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2362 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2363 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2364
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002365 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002366}
2367
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002368/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2369 * answered, so TBFs for uplink and later for downlink are created.
2370 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002371private 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 +02002372 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002373 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002374 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002375 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002376 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002377
2378 /* Initialize NS/BSSGP side */
2379 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002380 /* Initialize GPRS MS side */
2381 f_init_gprs_ms();
2382 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002383
2384 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002385 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002386
2387 /* Establish BSSGP connection to the PCU */
2388 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002389 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002390
2391 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002392 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002393
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002394 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002395 contention resolution) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002396 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 +02002397 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2398 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002399 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002400
2401 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002402 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002403
2404 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002405 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2406 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002407
2408 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2409 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002410 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002411
2412 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002413 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2414 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2415 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002416
2417 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002418}
2419
2420/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2421 * answered, so TBFs for uplink and later for downlink are created.
2422 */
2423testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002424 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002425 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002426}
2427
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002428/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2429 * answered, so TBFs for uplink and later for downlink are created.
2430 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002431private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2432 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002433 template (present) CodingScheme exp_ul_cs_mcs := ?,
2434 template (present) CodingScheme exp_dl_cs_mcs := ?)
2435runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002436 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002437 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002438 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002439 var uint32_t sched_fn;
2440 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002441 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002442 var GprsMS ms;
2443
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002444 /* Initialize NS/BSSGP side */
2445 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002446 /* Initialize GPRS MS side */
2447 f_init_gprs_ms();
2448 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002449
2450 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002451 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002452
2453 /* Establish BSSGP connection to the PCU */
2454 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002455 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002456
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002457 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2458 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 +02002459
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002460 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2461 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 +02002462 f_shutdown(__BFILE__, __LINE__);
2463 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002464
2465 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2466 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002467 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002468
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002469 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002470 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 +02002471
2472 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002473 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002474
2475 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002476 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002477 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2478 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002479 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002480 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002481 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002482
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002483 /* PCU acks the UL data after having received CV=0) */
2484 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2485
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002486 /* 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 +02002487 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 +02002488
2489 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002490 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2491 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 +02002492 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002493
2494 f_shutdown(__BFILE__, __LINE__, final := true);
2495}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002496
2497testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002498 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2499 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002500
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002501 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 +01002502
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002503 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 Pedrol002658a2023-04-12 18:13:56 +02002516
2517 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002518}
2519
2520testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002521 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2522 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002523
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002524 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 +01002525
2526 var StatsDExpects expect := {
2527 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2528 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2529 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2530 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2531 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2532 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2533 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2534 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2535 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2536 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2537 };
2538 f_statsd_expect(expect);
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02002539
2540 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002541}
2542
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002543testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2544 /* Configure PCU to force two phase access */
2545 g_force_two_phase_access := true;
2546
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002547 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002548 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002549
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002550 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 +01002551
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002552 var StatsDExpects expect := {
2553 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2554 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2555 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
2556 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
2557 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2558 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2559 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2560 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2561 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2562 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2563 };
2564 f_statsd_expect(expect);
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02002565
2566 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002567}
2568
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002569/* Test scenario where SGSN wants to send some data against MS and it is
2570 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2571 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002572private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2573 template (present) CodingScheme exp_cs_mcs := ?)
2574runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002575 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002576 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002577 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002578 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002579 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002580
2581 /* Initialize NS/BSSGP side */
2582 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002583 /* Initialize GPRS MS side */
2584 f_init_gprs_ms();
2585 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002586
2587 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002588 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002589
2590 /* Establish BSSGP connection to the PCU */
2591 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002592 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002593
2594 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002595 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2596 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002597
2598 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2599 f_sleep(X2002);
Pau Espin Pedrol3f2b5e42022-11-29 14:54:34 +01002600 /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
2601 dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
2602
2603 f_rlcmac_dl_block_exp_data(dl_block, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002604
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002605 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002606 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2607 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 +02002608 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002609
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002610 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002611 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002612
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002613 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002614 contention resolution) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002615 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002616 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2617 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002618 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002619
2620 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002621 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002622
2623 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002624}
2625
2626testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002627 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002628 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2629}
2630
2631/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2632/* information about the MS */
2633testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002634 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002635 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002636}
2637
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002638/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2639 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2640 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2641 * be transferred).
2642 */
2643testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002644 var RlcmacDlBlock dl_block;
2645 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002646 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002647 var octetstring total_payload;
2648 var octetstring payload;
2649 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002650 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002651 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002652 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002653
2654 /* Initialize NS/BSSGP side */
2655 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002656 /* Initialize GPRS MS side */
2657 f_init_gprs_ms();
2658 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002659
2660 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002661 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002662
2663 /* Establish BSSGP connection to the PCU */
2664 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002665 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002666
2667 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002668 f_ms_establish_ul_tbf(ms);
2669 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002670
2671 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002672 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002673 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 +02002674 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 +02002675
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002676 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2677 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002678 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002679 total_payload := payload;
2680
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002681 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2682
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002683 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002684 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002685 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002686 total_payload := total_payload & payload;
2687
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002688 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002689 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002690 total_payload := total_payload & payload;
2691
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002692 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002693 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 +02002694 total_payload := total_payload & lost_payload;
2695
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002696 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002697 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002698 total_payload := total_payload & payload;
2699
2700 /* 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 +02002701 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002702
2703 /* On CV=0, we'll receive a UL ACK asking about missing block */
2704 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2705 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002706 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2707 tfi := tfi,
2708 cv := 15,
2709 bsn := 3,
2710 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002711 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002712
2713 /* Now final ack is recieved */
2714 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2715 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002716 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002717
2718 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002719 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 +07002720
2721 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002722}
2723
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002724/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2725 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2726 * timeout occurs (specified by sent RRBP on DL block). */
2727testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002728 var RlcmacDlBlock dl_block;
2729 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002730 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002731 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002732
2733 /* Initialize NS/BSSGP side */
2734 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002735 /* Initialize GPRS MS side */
2736 f_init_gprs_ms();
2737 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002738
2739 /* Initialize the PCU interface abstraction */
2740 f_init_raw(testcasename());
2741
2742 /* Establish BSSGP connection to the PCU */
2743 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002744 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002745
2746 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002747 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2748 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002749
2750 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2751 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002752 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002753
2754 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2755 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2756 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002757 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002758
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002759 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2760 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002761 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002762
2763 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002764 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2765 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2766 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002767
2768 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002769}
2770
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002771/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2772testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2773 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2774 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002775 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002776 var RlcmacDlBlock dl_block;
2777 var uint32_t ack_fn;
2778 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002779 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002780 timer T := 5.0;
2781
2782 /* Initialize NS/BSSGP side */
2783 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002784 /* Initialize GPRS MS side */
2785 f_init_gprs_ms();
2786 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002787
2788 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002789 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002790
Daniel Willmann535aea62020-09-21 13:27:08 +02002791 f_statsd_reset();
2792
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002793 /* Establish BSSGP connection to the PCU */
2794 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002795 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002796
2797 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002798 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2799 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002800
2801 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2802 f_sleep(X2002);
Pau Espin Pedrol45b98aa2022-11-29 14:50:39 +01002803 /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
2804 fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002805
2806 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
Pau Espin Pedrol45b98aa2022-11-29 14:50:39 +01002807 f_rlcmac_dl_block_exp_data(dl_block, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002808 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002809
2810 /* TDMA frame number on which we are supposed to send the ACK */
2811 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2812
2813 /* SGSN sends more blocks during the indicated RRBP */
2814 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2815 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002816 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002817
2818 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2819
2820 /* Make sure this block has the same TFI as was assigned
2821 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002822 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002823 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2824 dl_block.data.mac_hdr.hdr_ext.tfi);
2825 f_shutdown(__BFILE__, __LINE__);
2826 }
2827
2828 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002829 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002830
2831 /* Break if this is the end of RRBP */
2832 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002833 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002834 break;
2835 }
2836 }
2837
2838 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002839 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 +07002840
2841 /* Make sure that the next block (after the Ack) is dummy */
2842 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2843
Daniel Willmann535aea62020-09-21 13:27:08 +02002844 var StatsDExpects expect := {
2845 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2846 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2847 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2848 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2849 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002850 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002851 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2852 };
2853 f_statsd_expect(expect);
2854
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002855 f_shutdown(__BFILE__, __LINE__, final := true);
2856}
2857
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002858/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2859 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2860 * Check "3GPP TS 44.060" Annex B. */
2861testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2862 var RlcmacDlBlock dl_block;
2863 var octetstring dataA := f_rnd_octstring(20);
2864 var octetstring dataB := f_rnd_octstring(13);
2865 var octetstring dataC := f_rnd_octstring(3);
2866 var octetstring dataD := f_rnd_octstring(12);
2867 var uint32_t sched_fn;
2868 var GprsMS ms;
2869 var template (value) RlcmacUlBlock ul_data;
2870
2871 /* Initialize NS/BSSGP side */
2872 f_init_bssgp();
2873 /* Initialize GPRS MS side */
2874 f_init_gprs_ms();
2875 ms := g_ms[0]; /* We only use first MS in this test */
2876
2877 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002878 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002879
2880 /* Establish BSSGP connection to the PCU */
2881 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002882 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002883
2884 /* Establish an Uplink TBF */
2885 f_ms_establish_ul_tbf(ms);
2886
2887 /* Summary of what's transmitted:
2888 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2889 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2890 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2891 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2892 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2893 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2894 */
2895
2896 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002897 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2898 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002899 cv := 3,
2900 bsn := ms.ul_tbf.bsn,
2901 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2902 tlli := ms.tlli);
2903 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2904 * RLCMAC block being sent. */
2905 ul_data.data.mac_hdr.e := true;
2906 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002907 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002908
2909 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002910 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2911 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002912 cv := 2,
2913 bsn := ms.ul_tbf.bsn,
2914 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2915 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2916 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2917 },
2918 tlli := ms.tlli);
2919 f_ultbf_inc_bsn(ms.ul_tbf);
2920 f_ms_tx_ul_block(ms, ul_data);
2921
2922 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002923 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 +02002924
2925 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002926 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2927 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002928 cv := 1,
2929 bsn := ms.ul_tbf.bsn,
2930 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2931 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2932 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2933 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2934 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2935 },
2936 tlli := ms.tlli);
2937 f_ultbf_inc_bsn(ms.ul_tbf);
2938 f_ms_tx_ul_block(ms, ul_data);
2939
2940 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002941 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2942 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 +02002943
2944 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002945 ul_data := t_RLCMAC_UL_DATA_TLLI(
2946 cs := CS_1,
2947 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002948 cv := 0,
2949 bsn := ms.ul_tbf.bsn,
2950 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2951 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2952 },
2953 tlli := ms.tlli);
2954 f_ultbf_inc_bsn(ms.ul_tbf);
2955 f_ms_tx_ul_block(ms, ul_data);
2956
2957 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002958 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 +02002959
2960 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2961 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2962 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2963
2964 f_shutdown(__BFILE__, __LINE__, final := true);
2965}
2966
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002967/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2968 * ACK/NACK is not answered */
2969testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2970 var RlcmacDlBlock dl_block;
2971 var octetstring data1 := f_rnd_octstring(200);
2972 var octetstring data2 := f_rnd_octstring(10);
2973 var uint32_t dl_fn;
2974 var GprsMS ms;
2975 var template (value) TsTrxBtsNum nr;
2976 var BTS_PDTCH_Block data_msg;
2977
2978 /* Initialize NS/BSSGP side */
2979 f_init_bssgp();
2980 /* Initialize GPRS MS side */
2981 f_init_gprs_ms();
2982 ms := g_ms[0]; /* We only use first MS in this test */
2983
2984 /* Initialize the PCU interface abstraction */
2985 f_init_raw(testcasename())
2986
2987 /* Establish BSSGP connection to the PCU */
2988 f_bssgp_establish();
2989 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2990
2991 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2992 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2993 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2994
2995 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2996 f_sleep(X2002);
2997
2998 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2999 while (true) {
3000 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
3001
3002 /* Keep Ack/Nack description updated (except for last BSN) */
3003 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
3004
3005 if (f_dl_block_rrbp_valid(dl_block)) {
3006 /* Don't transmit DL ACK here on purpose ignore it */
3007 break;
3008 }
3009 }
3010
3011 /* PCU starts whole process again */
3012 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3013
3014 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3015 f_sleep(X2002);
3016
3017 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
3018 /* DL data), after that we receive only DUMMY blocks so we are done */
3019 var boolean data_received := false;
3020 nr := ts_TsTrxBtsNum;
3021 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3022 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3023 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3024 block_nr := nr.blk_nr));
3025 alt {
3026 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3027 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07003028 tr_RLCMAC_DL_DUMMY_CTRL)) { /* done */ }
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01003029 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3030 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3031 tr_RLCMAC_DATA)) -> value data_msg {
3032 data_received := true;
3033 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
3034 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
3035 log("Received FINAL_ACK");
3036 ms.dl_tbf.acknack_desc.final_ack := '1'B;
3037 }
3038 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
3039 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3040 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
3041 }
3042 nr := ts_TsTrxBtsNum;
3043 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3044 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3045 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3046 block_nr := nr.blk_nr));
3047 repeat;
3048 }
3049 [] BTS.receive {
3050 setverdict(fail, "Unexpected BTS message");
3051 f_shutdown(__BFILE__, __LINE__);
3052 }
3053 }
3054
3055 f_shutdown(__BFILE__, __LINE__, final := true);
3056}
3057
Pau Espin Pedrol6844c162022-04-01 15:40:06 +02003058/* OS#5508: Verify scheduling of LLC frames with SAPI=1 (GMM) takes precedence
3059 * over SAPI2/7/8 which in turn take prececende over others */
3060testcase TC_dl_llc_sapi_priority() runs on RAW_PCU_Test_CT {
3061 var octetstring data_sapi1 := f_pad_oct('01'O, 19, 'ff'O);
3062 var octetstring data_sapi2 := f_pad_oct('02'O, 19, 'ff'O);
3063 var octetstring data_sapi7 := f_pad_oct('07'O, 19, 'ff'O);
3064 var octetstring data_sapi8 := f_pad_oct('08'O, 19, 'ff'O);
3065 var octetstring data_sapi_other := f_pad_oct('03'O, 19, 'ff'O);
3066 var RlcmacDlBlock dl_block;
3067 var uint32_t dl_fn;
3068 var GprsMS ms;
3069 var integer state := 1;
3070
3071 /* Initialize NS/BSSGP side */
3072 f_init_bssgp();
3073 /* Initialize GPRS MS side */
3074 f_init_gprs_ms();
3075 ms := g_ms[0]; /* We only use first MS in this test */
3076
3077 /* Initialize the PCU interface abstraction */
3078 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3079
3080 /* Lock to CS1 to keep same DL RLCMAC data block size: */
3081 g_cs_initial_dl := 1;
3082 g_mcs_max_dl := 1;
3083 f_pcuvty_set_allowed_cs_mcs();
3084
3085 /* Establish BSSGP connection to the PCU */
3086 f_bssgp_establish();
3087 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3088
3089 /* SGSN sends some low prio DL data, PCU will page on CCCH (PCH) */
3090 for (var integer i := 0; i < 10; i := i + 1) {
3091 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi_other));
3092 }
3093 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi2));
3094 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi7));
3095 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi8));
3096 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi1));
3097 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3098
3099 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3100 f_sleep(X2002);
3101
3102 while (state != 0) {
3103 var OCT1 rx_sapi;
3104 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
3105 rx_sapi := dl_block.data.blocks[0].payload[0];
3106
3107 select (state) {
3108 case(1) { /* We expect the first GMM LLC frame here (SAPI=1, highest prio) */
3109 if (rx_sapi != '01'O) {
3110 setverdict(fail, "Wrong prio: Expected LLC SAPI 1 (GMM) but got ", rx_sapi);
3111 f_shutdown(__BFILE__, __LINE__);
3112 }
3113 state := 2;
3114 }
3115 case(2) { /* We expect the second LLC frame here (SAPI=2, middle prio) */
3116 if (rx_sapi != '02'O) {
3117 setverdict(fail, "Wrong prio: Expected LLC SAPI 2 but got ", rx_sapi);
3118 f_shutdown(__BFILE__, __LINE__);
3119 }
3120 state := 7;
3121 }
3122 case(7) { /* We expect the third LLC frame here (SAPI=7, middle prio) */
3123 if (rx_sapi != '07'O) {
3124 setverdict(fail, "Wrong prio: Expected LLC SAPI 7 but got ", rx_sapi);
3125 f_shutdown(__BFILE__, __LINE__);
3126 }
3127 state := 8;
3128 }
3129 case(8) { /* We expect the fourth LLC frame here (SAPI=8, middle prio) */
3130 if (rx_sapi != '08'O) {
3131 setverdict(fail, "Wrong prio: Expected LLC SAPI 8 but got ", rx_sapi);
3132 f_shutdown(__BFILE__, __LINE__);
3133 }
3134 state := 3;
3135 }
3136 case(3) { /* We expect the other LLC frame here (SAPI=3, lower prio) */
3137 if (rx_sapi != '03'O) {
3138 setverdict(fail, "Wrong prio: Expected LLC SAPI 3 but got ", rx_sapi);
3139 f_shutdown(__BFILE__, __LINE__);
3140 }
3141 state := 0; /* Done, break */
3142 }
3143 }
3144 /* Keep Ack/Nack description updated (except for last BSN) */
3145 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
3146
3147 if (f_dl_block_rrbp_valid(dl_block)) {
3148 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3149 f_dl_block_ack_fn(dl_block, dl_fn));
3150 }
3151 }
3152
3153 f_shutdown(__BFILE__, __LINE__, final := true);
3154}
3155
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003156/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
3157testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003158 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003159 var octetstring data := f_rnd_octstring(10);
3160 var PacketDlAssign dl_tbf_ass;
3161 var RlcmacDlBlock dl_block;
3162 var uint32_t poll_fn;
3163 var uint32_t sched_fn;
3164 var GprsMS ms;
3165 timer T := 5.0;
3166
3167 /* Initialize NS/BSSGP side */
3168 f_init_bssgp();
3169 /* Initialize GPRS MS side */
3170 f_init_gprs_ms();
3171 ms := g_ms[0]; /* We only use first MS in this test */
3172
3173 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003174 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3175 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003176
3177 /* Initialize the PCU interface abstraction */
3178 f_init_raw(testcasename(), info_ind);
3179
3180 /* Establish BSSGP connection to the PCU */
3181 f_bssgp_establish();
3182 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3183
3184 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
3185 through PDCH (no multiblock assignment possible through PCH) */
3186 f_ms_establish_ul_tbf(ms);
3187
3188 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02003189 contention resolution) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003190 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
3191 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003192 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3193 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3194
3195 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
3196 var MultislotCap_GPRS_BSSGP mscap_gprs := {
3197 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3198 gprsextendeddynalloccap := '0'B
3199 };
3200 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
3201 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3202 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
3203 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
3204 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
3205 f_shutdown(__BFILE__, __LINE__);
3206 }
3207 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3208
3209 f_shutdown(__BFILE__, __LINE__, final := true);
3210}
3211
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003212testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003213 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003214 var RlcmacDlBlock dl_block;
3215 var octetstring data := f_rnd_octstring(10);
3216 var PollFnCtx pollctx;
3217 var uint32_t sched_fn;
3218 var GprsMS ms;
3219
3220 var MultislotCap_GPRS mscap_gprs := {
3221 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3222 gprsextendeddynalloccap := '0'B
3223 };
3224 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3225
3226
3227 /* Initialize NS/BSSGP side */
3228 f_init_bssgp();
3229 /* Initialize GPRS MS side */
3230 f_init_gprs_ms();
3231 ms := g_ms[0]; /* We only use first MS in this test */
3232
3233 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003234 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3235 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003236
3237 /* Initialize the PCU interface abstraction */
3238 f_init_raw(testcasename(), info_ind);
3239
3240 /* Establish BSSGP connection to the PCU */
3241 f_bssgp_establish();
3242 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3243
3244 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3245 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3246
3247 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3248 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
3249
3250 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3251 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
3252 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
3253 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
3254 f_shutdown(__BFILE__, __LINE__);
3255 }
3256 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3257
3258 f_shutdown(__BFILE__, __LINE__, final := true);
3259}
3260
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003261testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
3262 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3263 var RlcmacDlBlock dl_block;
3264 var octetstring data := f_rnd_octstring(10);
3265 var PollFnCtx pollctx;
3266 var uint32_t sched_fn;
3267 var GprsMS ms;
3268
3269 var MultislotCap_GPRS mscap_gprs := {
3270 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3271 gprsextendeddynalloccap := '0'B
3272 };
3273 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3274
3275
3276 /* Initialize NS/BSSGP side */
3277 f_init_bssgp();
3278 /* Initialize GPRS MS side */
3279 f_init_gprs_ms();
3280 ms := g_ms[0]; /* We only use first MS in this test */
3281
3282 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003283 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3284 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003285
3286 /* Initialize the PCU interface abstraction */
3287 f_init_raw(testcasename(), info_ind);
3288
3289 /* Establish BSSGP connection to the PCU */
3290 f_bssgp_establish();
3291 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3292
3293 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3294 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3295
3296 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
3297 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
3298 f_shutdown(__BFILE__, __LINE__);
3299 }
3300
3301 f_shutdown(__BFILE__, __LINE__, final := true);
3302}
3303
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003304/* Test scenario where MS wants to request a new TBF once the current one is
3305 * ending, by means of sending a Packet Resource Request on ul slot provided by
3306 * last Pkt Ul ACK's RRBP.
3307 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3308testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003309 var RlcmacDlBlock dl_block;
3310 var octetstring data := f_rnd_octstring(10);
3311 var uint32_t sched_fn;
3312 var uint32_t dl_fn;
3313 var template RlcmacDlBlock acknack_tmpl;
3314 var GprsMS ms;
3315
3316 /* Initialize NS/BSSGP side */
3317 f_init_bssgp();
3318 /* Initialize GPRS MS side */
3319 f_init_gprs_ms();
3320 ms := g_ms[0]; /* We only use first MS in this test */
3321
3322 /* Initialize the PCU interface abstraction */
3323 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003324 f_statsd_reset();
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003325
3326 /* Establish BSSGP connection to the PCU */
3327 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003328 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003329
3330 /* Establish an Uplink TBF */
3331 f_ms_establish_ul_tbf(ms);
3332
3333 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02003334 contention resolution) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003335 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 +02003336
3337 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003338 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003339
3340 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3341 tr_UlAckNackGprs(ms.tlli,
3342 tr_AckNackDescription(final_ack := '1'B),
3343 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3344 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3345
3346 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3347
3348 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07003349 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 +07003350 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003351 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3352 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3353
3354 /* Send one UL block (without TLLI since we are in Second-Phase Access)
3355 and make sure it is ACKED fine */
3356 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
3357
3358 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003359 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003360
3361 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3362 /* ACK the ACK */
3363 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3364
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003365 var StatsDExpects expect := {
3366 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
3367 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
3368 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
3369 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3370 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
3371 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 1, max := 1 },
3372 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
3373 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
3374 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
3375 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
3376 };
3377 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003378
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003379 f_shutdown(__BFILE__, __LINE__, final := true);
3380}
3381
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003382/* Test scenario where MS wants to request a new TBF once the current one is
3383 * ending, by means of sending a Packet Resource Request on ul slot provided by
3384 * last Pkt Ul ACK's RRBP. new Pkt Ul Ass is never confirmed by the MS in this test.
3385 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02003386testcase TC_ul_tbf_reestablish_with_pkt_resource_req_t3168() runs on RAW_PCU_Test_CT {
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003387 var PCUIF_info_ind info_ind;
3388 var RlcmacDlBlock dl_block;
3389 var octetstring data := f_rnd_octstring(10);
3390 var uint32_t sched_fn;
3391 var uint32_t dl_fn;
3392 var template (value) TsTrxBtsNum nr;
3393 var BTS_PDTCH_Block data_msg;
3394 var template RlcmacDlBlock acknack_tmpl;
3395 var GprsMS ms;
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02003396 var integer cnt_rrbp := 0;
3397 var integer cnt_dummy_after_timeout := 0;
3398 /* Maximum T3168 value = 8 * 500 ms = 4s => * 4 retrans = 16s */
3399 timer T_3168 := 16.0 + 0.5; /* 0.5: extra offset since we cannot match exactly */
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003400
3401 /* Initialize NS/BSSGP side */
3402 f_init_bssgp();
3403 /* Initialize GPRS MS side */
3404 f_init_gprs_ms();
3405 ms := g_ms[0]; /* We only use first MS in this test */
3406
3407 /* Initialize the PCU interface abstraction */
3408 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02003409 /* TODO: Speedup test by sending a PCU_IF_SAPI_BCCH SI13 with T3168=0 (500ms) */
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003410 f_init_raw(testcasename(), info_ind);
3411
3412 /* Establish BSSGP connection to the PCU */
3413 f_bssgp_establish();
3414 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3415
3416 /* Establish an Uplink TBF */
3417 f_ms_establish_ul_tbf(ms);
3418
3419 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02003420 contention resolution) and make sure it is ACKED fine */
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003421 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
3422
3423 /* UL block should be received in SGSN */
3424 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
3425
3426 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3427 tr_UlAckNackGprs(ms.tlli,
3428 tr_AckNackDescription(final_ack := '1'B),
3429 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3430 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3431
3432 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3433
3434 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02003435 T_3168.start;
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003436 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)), sched_fn);
3437
3438 /* Now Keep ignoring the Pkt Ul Ass on PACCH: */
3439 /* Now we go on receiving DL data and not answering RRBP: */
3440 nr := ts_TsTrxBtsNum;
3441 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3442 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3443 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3444 block_nr := nr.blk_nr));
3445 alt {
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02003446 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003447 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3448 tr_RLCMAC_UL_PACKET_ASS)) -> value data_msg {
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02003449 /* We should not be receiving PKT UL ASS anymore after T3168 timeout */
3450 if (not T_3168.running) {
3451 setverdict(fail, log2str("Unexpected PKT UL ASS after T3168 timeout: ", data_msg));
3452 f_shutdown(__BFILE__, __LINE__);
3453 }
3454
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003455 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02003456 log("Ignoring RRBP ", cnt_rrbp);
3457 cnt_rrbp := cnt_rrbp + 1;
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003458 }
3459 nr := ts_TsTrxBtsNum;
3460 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3461 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3462 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3463 block_nr := nr.blk_nr));
3464 repeat;
3465 }
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02003466 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003467 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07003468 tr_RLCMAC_DL_DUMMY_CTRL)) -> value data_msg {
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003469 nr := ts_TsTrxBtsNum;
3470 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3471 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3472 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3473 block_nr := nr.blk_nr));
3474 repeat;
3475 }
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02003476 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003477 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3478 omit)) -> value data_msg {
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02003479
3480 /* T3168 expired and we are not receiving blocks anymore, meaning PCU released the TBF. */
3481 break;
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003482 }
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003483 [] BTS.receive {
3484 setverdict(fail, "Unexpected BTS message");
3485 f_shutdown(__BFILE__, __LINE__);
3486 }
3487 }
3488
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02003489 /* Check that we received at least a few PKT UL ASS before T3168 expiration */
3490 if (cnt_rrbp <= 3) {
3491 setverdict(fail, log2str("Received only ", cnt_rrbp, " before T3168 timeout!"));
3492 f_shutdown(__BFILE__, __LINE__);
3493 }
3494
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003495 f_shutdown(__BFILE__, __LINE__, final := true);
3496}
3497
Pau Espin Pedrol59aa1092021-11-15 18:53:34 +01003498/* Test scenario where MS wants to request a new UL TBF using a DL (EGPRS) ACK/NACK
3499 * transmitted on ul slot provided by its DL TBF.
3500 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3501function f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(boolean use_egprs) runs on RAW_PCU_Test_CT {
3502 var GprsMS ms;
3503 var octetstring data := f_rnd_octstring(10);
3504 var RlcmacDlBlock dl_block;
3505 var template RlcmacDlBlock rej_tmpl;
3506 var uint32_t dl_fn;
3507 var uint32_t sched_fn;
3508 var template (value) MSRadioAccessCapabilityV_BSSGP racap_tmpl;
3509
3510 if (use_egprs == true) {
3511 racap_tmpl := bssgp_ms_racap_egprs_def;
3512 } else {
3513 racap_tmpl := bssgp_ms_racap_gprs_def;
3514 }
3515
3516 /* Initialize NS/BSSGP side */
3517 f_init_bssgp();
3518 /* Initialize GPRS MS side */
3519 f_init_gprs_ms();
3520 ms := g_ms[0]; /* We only use first MS in this test */
3521 /* Initialize the PCU interface abstraction */
3522 f_init_raw(testcasename());
3523
3524 /* Establish BSSGP connection to the PCU */
3525 f_bssgp_establish();
3526 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3527
3528 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3529 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, racap_tmpl));
3530 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3531
3532 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3533 f_sleep(X2002);
3534 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3535
3536 /* ACK the DL block, asking for new UL TBF by including ChanReqDesc */
3537 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
3538 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, use_egprs, ts_ChannelReqDescription()),
3539 f_dl_block_ack_fn(dl_block, dl_fn));
3540
3541 /* We should receive a Pkt Ul ASS */
3542 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
3543 f_shutdown(__BFILE__, __LINE__, final := true);
3544}
3545testcase TC_ul_tbf_reestablish_with_pkt_dl_ack_nack() runs on RAW_PCU_Test_CT {
3546 f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(false);
3547}
3548testcase TC_ul_tbf_reestablish_with_pkt_dl_ack_nack_egprs() runs on RAW_PCU_Test_CT {
3549 f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(true);
3550}
3551
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003552/* Test CS paging over the BTS<->PCU socket.
3553 * 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.
3554 * Paging should be send on the PACCH.
3555 *
3556 * 1. Send a Paging Request over PCU socket.
3557 * 2. Send a Ready-To-Send message over PCU socket
3558 * 3. Expect a Paging Frame
3559 */
3560testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003561 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003562 var MobileIdentityLV mi;
3563 var octetstring mi_enc_lv;
3564 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003565 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003566
3567 /* Initialize NS/BSSGP side */
3568 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003569 /* Initialize GPRS MS side */
3570 f_init_gprs_ms();
3571 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003572
3573 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003574 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003575
3576 /* Establish BSSGP connection to the PCU */
3577 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003578 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003579
3580 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003581 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003582
3583 /* build mobile Identity */
3584 mi := valueof(ts_MI_IMSI_LV(imsi));
3585 mi_enc_lv := enc_MobileIdentityLV(mi);
3586 /* Send paging request */
3587 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
3588 sapi :=PCU_IF_SAPI_PDTCH));
3589
3590 /* Receive it on BTS side towards MS */
3591 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3592
3593 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003594 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3595 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3596 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3597 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003598
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003599 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003600}
3601
3602/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
3603 */
3604private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3605runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003606 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003607 var hexstring imsi := f_gen_imsi(42);
3608 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003609 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003610
3611 /* Initialize NS/BSSGP side */
3612 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003613 /* Initialize GPRS MS side */
3614 f_init_gprs_ms();
3615 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003616
3617 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003618 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003619
3620 /* Establish BSSGP connection to the PCU */
3621 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003622 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003623
3624 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003625 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003626
3627 /* Send paging request with or without TMSI */
3628 if (use_ptmsi) {
3629 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3630 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3631 } else {
3632 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3633 }
3634
Pau Espin Pedrol00fec582022-11-29 16:03:13 +01003635 /* Now receive it on BTS side towards MS.
3636 * Skip any dummy blocks in case the PCUIF req arrives before the BSSP CS_PAGING:
3637 */
3638 f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
3639
3640 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ())) {
3641 setverdict(fail, "Failed to match Packet Paging Request: ",
3642 dl_block, " vs ", tr_RLCMAC_PACKET_PAG_REQ());
3643 f_shutdown(__BFILE__, __LINE__);
3644 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003645
3646 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003647 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003648 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003649 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3650 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3651 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003652 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003653 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3654 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3655 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003656 }
3657
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003658 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003659}
3660
3661testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3662 f_tc_paging_cs_from_sgsn(0, true);
3663}
3664
3665testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3666 f_tc_paging_cs_from_sgsn(0);
3667}
3668
3669testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003670 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003671}
3672
3673/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3674 */
3675private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3676runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003677 var integer imsi_suff_tx := 423;
3678 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003679 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003680
3681 /* Initialize NS/BSSGP side */
3682 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003683 /* Initialize GPRS MS side */
3684 f_init_gprs_ms();
3685 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003686
Oliver Smith61b4e732021-07-22 08:14:29 +02003687 f_statsd_reset();
3688
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003689 /* Establish BSSGP connection to the PCU */
3690 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003691 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003692
3693 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3694 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3695 if (use_ptmsi) {
3696 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3697 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3698 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3699 } else {
3700 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3701 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3702 }
3703
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003704 var StatsDExpects expect := {
3705 { name := "TTCN3.pcu.sgsn.0.rx_paging_ps", mtype := "c", min := 1, max := 1 },
3706 /* After the PCU receives the paging request from SGSN,
3707 * and it doesn't have any errors, PCU sends it to the
3708 * BTS to do paging over PCH. */
3709 { name := "TTCN3.bts.0.pch.requests", mtype := "c", min := 1, max := 1 }
3710 };
3711 f_statsd_expect(expect);
Oliver Smithfbd39312021-07-27 15:23:39 +02003712}
3713
3714testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3715 /* Initialize the PCU interface abstraction */
3716 f_init_raw(testcasename());
3717
3718 f_tc_paging_ps_from_sgsn(0, true);
Oliver Smith61b4e732021-07-22 08:14:29 +02003719
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003720 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003721}
3722
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003723testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003724 /* Initialize the PCU interface abstraction */
3725 f_init_raw(testcasename());
3726
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003727 f_tc_paging_ps_from_sgsn(0);
Oliver Smithfbd39312021-07-27 15:23:39 +02003728
3729 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003730}
3731
3732testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003733 /* Initialize the PCU interface abstraction */
3734 f_init_raw(testcasename());
3735
Harald Welte5339b2e2020-10-04 22:52:56 +02003736 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Oliver Smithfbd39312021-07-27 15:23:39 +02003737
3738 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003739}
3740
Oliver Smithe1a77c42021-07-28 13:36:09 +02003741testcase TC_paging_pch_timeout() runs on RAW_PCU_Test_CT {
3742 /* Initialize the PCU interface abstraction */
3743 f_init_raw(testcasename());
3744
3745 /* Set T3113 to 1s to shorten the test duration */
3746 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 1");
3747
3748 /* Reset stats and send paging PS request */
3749 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
3750
3751 /* Verify that counter increases when T3113 times out (MS did not start
3752 * TBF to respond to paging). */
3753 f_sleep(1.2);
3754 var StatsDExpects expect := {
3755 { name := "TTCN3.bts.0.pch.requests.timeout", mtype := "c", min := 1, max := 1 }
3756 };
3757 f_statsd_expect(expect);
3758
3759 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 default");
3760 f_shutdown(__BFILE__, __LINE__, final := true);
3761}
3762
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003763/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3764testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3765 var RlcmacDlBlock dl_block;
3766 var octetstring data := f_rnd_octstring(10);
3767 var uint32_t sched_fn;
3768 var uint32_t dl_fn;
3769 var GprsMS ms;
3770
3771 /* Initialize NS/BSSGP side */
3772 f_init_bssgp();
3773 /* Initialize GPRS MS side */
3774 f_init_gprs_ms();
3775 ms := g_ms[0]; /* We only use first MS in this test */
3776
3777 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003778 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003779
Daniel Willmann535aea62020-09-21 13:27:08 +02003780 f_statsd_reset();
3781
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003782 /* Establish BSSGP connection to the PCU */
3783 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003784 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003785
3786 /* Establish an Uplink TBF */
3787 f_ms_establish_ul_tbf(ms);
3788
3789 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003790 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 +02003791 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3792 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3793 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3794
3795 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003796 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003797
3798 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3799 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3800 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3801
3802 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3803 f_sleep(X2002);
3804 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3805
3806 /* ACK the DL block */
3807 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3808 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3809 f_dl_block_ack_fn(dl_block, dl_fn));
3810
Daniel Willmann535aea62020-09-21 13:27:08 +02003811 var StatsDExpects expect := {
3812 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3813 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3814 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3815 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003816 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003817 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003818 };
3819 f_statsd_expect(expect);
3820
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003821 f_shutdown(__BFILE__, __LINE__, final := true);
3822}
3823
3824/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3825testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3826 var RlcmacDlBlock dl_block;
3827 var octetstring data := f_rnd_octstring(10);
3828 var uint32_t sched_fn;
3829 var uint32_t dl_fn;
3830 var GprsMS ms;
3831
3832 /* Initialize NS/BSSGP side */
3833 f_init_bssgp();
3834 /* Initialize GPRS MS side */
3835 f_init_gprs_ms();
3836 ms := g_ms[0]; /* We only use first MS in this test */
3837
3838 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003839 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003840
3841 /* Establish BSSGP connection to the PCU */
3842 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003843 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003844
3845 /* Establish an Uplink TBF */
3846 f_ms_establish_ul_tbf(ms);
3847
3848 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003849 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 +02003850 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3851 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3852 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3853
3854 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003855 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003856
3857 /* Now SGSN sends some DL data with an invalid IMSI */
3858 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3859
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003860 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003861
3862 /* TODO: make sure no data is sent over PCU -> MS */
3863
3864 f_shutdown(__BFILE__, __LINE__, final := true);
3865}
3866
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003867private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3868 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3869 var octetstring data := f_rnd_octstring(6);
3870 var RlcmacDlBlock dl_block;
3871 var GprsMS ms;
3872 var uint32_t fn;
3873
3874 /* Initialize NS/BSSGP side */
3875 f_init_bssgp();
3876 /* Initialize GPRS MS side */
3877 f_init_gprs_ms();
3878 ms := g_ms[0]; /* We only use first MS in this test */
3879
3880 /* Initialize the PCU interface abstraction */
3881 f_init_raw(testcasename());
3882
3883 /* Establish BSSGP connection to the PCU */
3884 f_bssgp_establish();
3885 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3886
3887 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3888 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3889 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3890
3891 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3892 f_sleep(X2002);
3893
3894 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3895 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3896
3897 if (ischosen(dl_block.data_egprs)) {
3898 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3899 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3900 f_shutdown(__BFILE__, __LINE__);
3901 }
3902 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3903 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3904 f_shutdown(__BFILE__, __LINE__);
3905 }
3906 if (not match(dl_block.data_egprs.blocks[1].payload,
3907 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3908 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3909 f_shutdown(__BFILE__, __LINE__);
3910 }
3911 } else if (lengthof(dl_block.data.blocks) > 1) {
3912 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3913 f_shutdown(__BFILE__, __LINE__);
3914 }
3915
3916 f_shutdown(__BFILE__, __LINE__, final := true);
3917}
3918
3919/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3920 * containing llc data. See OS#4849 */
3921testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3922 f_tc_dl_data_no_llc_ui_dummy(omit);
3923}
3924
3925/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3926 * containing llc data. See OS#4849 */
3927testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003928 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003929}
3930
Pau Espin Pedrol0b6b0d02022-10-25 21:21:02 +02003931/* Scenario: MS creates one phase access, does contention resolution CV>0 and
3932 * finishes sending data (CV=0), which is forwarded to SGSN by PCU. PCU acks with
3933 * FINAL_ACK=1 (hence UL TBF moves to FINISHED state). Then SGSN answers and PCU
3934 * has to assign a DL TBF (through PCH because of FINISHED state, TS 44.060 9.3.3.3.2).
3935 * Make sure the assignment is not done until we receive the PKT CTRL ACK from the MS
3936 * (at that time we know the MS is listening on PCH again). OS#5700.
3937 */
3938testcase TC_ul_tbf_finished_pkt_dl_ass_pch() runs on RAW_PCU_Test_CT {
3939 var RlcmacDlBlock dl_block;
3940 var octetstring data := f_rnd_octstring(10);
3941 var uint32_t sched_fn;
3942 var uint32_t dl_fn;
3943 var GprsMS ms;
3944 timer T;
3945 var octetstring payload;
3946
3947 /* Initialize NS/BSSGP side */
3948 f_init_bssgp();
3949 /* Initialize GPRS MS side */
3950 f_init_gprs_ms();
3951 ms := g_ms[0]; /* We only use first MS in this test */
3952
3953 /* Initialize the PCU interface abstraction */
3954 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3955
3956 /* Establish BSSGP connection to the PCU */
3957 f_bssgp_establish();
3958 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3959
3960 /* Establish an Uplink TBF */
3961 f_ms_establish_ul_tbf(ms);
3962
3963 /* Send one UL block (with TLLI since we are in One-Phase Access
3964 contention resolution) and make sure it is ACKED fine. */
3965 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
3966 dl_fn := f_rx_rlcmac_dl_block_exp_dummy(dl_block);
3967 f_ms_tx_ul_data_block(ms, payload, cv := 1, with_tlli := true, fn := f_next_pdch_block(dl_fn));
3968
3969 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3970 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, false));
3971 f_ms_tx_ul_data_block(ms, payload, cv := 0);
3972 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3973
3974 /* 1 UL block should be received in SGSN */
3975 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
3976 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3977 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3978
3979 /* UL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3980 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3981 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3982 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3983 f_sleep(X2002);
3984 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3985
3986 f_shutdown(__BFILE__, __LINE__, final := true);
3987}
3988
Pau Espin Pedrol99e00b42022-10-28 13:28:52 +02003989/* Scenario: MS creates a UL TBF and
3990 * finishes sending data (CV=0), which is forwarded to SGSN by PCU. PCU acks with
3991 * FINAL_ACK=1 (hence UL TBF moves to FINISHED state). Then SGSN answers and PCU
3992 * has to assign a DL TBF on PCH. While the network is waiting for the MS to
3993 * move to PDCH before transmitting DL data (timer X2002), the MS finds out it
3994 * needs to send new UL data and hence sends a RACH request to create a new UL
3995 * TBF.
3996 * Make sure the the MS is assigned a DL TBF through PACCH in that case even if
3997 * no new DL data is received from the SGSN. OS#5700.
3998 * This test validates the specific case where the 2nd UL TBF is done through
3999 * 1phase-access.
4000 */
4001testcase TC_ul_tbf_1phase_while_dl_ass_pch() runs on RAW_PCU_Test_CT {
4002 var RlcmacDlBlock dl_block;
4003 var octetstring data := f_rnd_octstring(10);
4004 var uint32_t sched_fn;
4005 var uint32_t poll_fn;
4006 var uint32_t dl_fn;
4007 var GprsMS ms;
4008 timer T;
4009 var octetstring payload;
4010
4011 /* Initialize NS/BSSGP side */
4012 f_init_bssgp();
4013 /* Initialize GPRS MS side */
4014 f_init_gprs_ms();
4015 ms := g_ms[0]; /* We only use first MS in this test */
4016
4017 /* Initialize the PCU interface abstraction */
4018 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
4019
4020 /* Establish BSSGP connection to the PCU */
4021 f_bssgp_establish();
4022 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4023
4024 /* Establish an Uplink TBF */
4025 f_ms_establish_ul_tbf(ms);
4026
4027 /* Send one UL block (with TLLI since we are in One-Phase Access
4028 contention resolution) and make sure it is ACKED fine. */
4029 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
4030 dl_fn := f_rx_rlcmac_dl_block_exp_dummy(dl_block);
4031 f_ms_tx_ul_data_block(ms, payload, cv := 1, with_tlli := true, fn := f_next_pdch_block(dl_fn));
4032
4033 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
4034 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, false));
4035 f_ms_tx_ul_data_block(ms, payload, cv := 0);
4036 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
4037
4038 /* 1 UL block should be received in SGSN */
4039 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
4040 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
4041 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4042
4043 /* UL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4044 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4045 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4046
4047 /* Now the PCU is waiting for the MS to move to PDCH in order to send data to it (timer X2002).
4048 * The MS decides it want to send new Ul TBF so it send RACH req to ask for it: */
4049 f_ms_establish_ul_tbf(ms);
4050
4051 /* Send one UL block (with TLLI since we are in One-Phase Access
4052 * contention resolution) and make sure it is ACKED fine. */
4053 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
4054 dl_fn := f_rx_rlcmac_dl_block_exp_dummy(dl_block);
4055 f_ms_tx_ul_data_block(ms, payload, cv := 1, with_tlli := true, fn := f_next_pdch_block(dl_fn));
4056
4057 /* UL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4058 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
4059
4060 /* The PCU considers the MS to have gone over Contention Resolution
4061 * after having sent the first UL ACK/NACK to it, hence next it will try to
4062 * assign the DL-TBF to send the data it received from the SGSN previously: */
4063 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4064 /* the MS ACKs the PKT_DL_ASS: */
4065 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4066
4067 /* We should finally receive the DL-data that was received previously from the SGSN: */
4068 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
4069
4070 f_shutdown(__BFILE__, __LINE__, final := true);
4071}
4072
4073/* Same as TC_ul_tbf_2phase_while_dl_ass_pch, but this test validates the
4074 * specific case where the 2nd UL TBF is done through 2phase-access. */
4075testcase TC_ul_tbf_2phase_while_dl_ass_pch() runs on RAW_PCU_Test_CT {
4076 var RlcmacDlBlock dl_block;
4077 var octetstring data := f_rnd_octstring(10);
4078 var uint32_t sched_fn;
4079 var uint32_t poll_fn;
4080 var uint32_t dl_fn;
4081 var GprsMS ms;
4082 timer T;
4083 var octetstring payload;
4084 var PollFnCtx pollctx;
4085
4086 /* Initialize NS/BSSGP side */
4087 f_init_bssgp();
4088 /* Initialize GPRS MS side */
4089 f_init_gprs_ms();
4090 ms := g_ms[0]; /* We only use first MS in this test */
4091
4092 /* Initialize the PCU interface abstraction */
4093 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
4094
4095 /* Establish BSSGP connection to the PCU */
4096 f_bssgp_establish();
4097 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4098
4099 /* Establish an Uplink TBF */
4100 f_ms_establish_ul_tbf(ms);
4101
4102 /* Send one UL block (with TLLI since we are in One-Phase Access
4103 contention resolution) and make sure it is ACKED fine. */
4104 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
4105 dl_fn := f_rx_rlcmac_dl_block_exp_dummy(dl_block);
4106 f_ms_tx_ul_data_block(ms, payload, cv := 1, with_tlli := true, fn := f_next_pdch_block(dl_fn));
4107
4108 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
4109 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, false));
4110 f_ms_tx_ul_data_block(ms, payload, cv := 0);
4111 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
4112
4113 /* 1 UL block should be received in SGSN */
4114 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
4115 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
4116 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4117
4118 /* UL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4119 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4120 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4121
4122 /* Now the PCU is waiting for the MS to move to PDCH in order to send data to it (timer X2002).
4123 * The MS decides it want to send new Ul TBF so it send RACH req to ask for it: */
4124 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4125
4126 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4127 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4128
4129 /* Now that MS seized the UL-TBF, PCU sends DL-TBF Assignment on PACCH */
4130 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4131 /* the MS ACKs the PKT_DL_ASS: */
4132 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4133
4134 /* We should finally receive the DL-data that was received previously from the SGSN: */
4135 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
4136
4137 f_shutdown(__BFILE__, __LINE__, final := true);
4138}
4139
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004140private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07004141 template GsmRrMessage t_imm_ass := ?,
4142 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004143runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07004144 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004145 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004146
4147 ra11 := enc_EGPRSPktChRequest2uint(req);
4148 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
4149
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07004150 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07004151 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004152 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004153 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004154 }
4155
4156 setverdict(pass);
4157}
4158
4159testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
4160 var template GsmRrMessage imm_ass;
4161 var template IaRestOctets rest;
4162 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004163 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004164
4165 /* Initialize the PCU interface abstraction */
4166 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004167 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004168
4169 var EGPRSPktChRequest req := {
4170 /* NOTE: other fields are set in the loop */
4171 signalling := { tag := '110011'B }
4172 };
4173
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004174 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004175 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
4176 req.signalling.random_bits := ext_ra;
4177
4178 /* For signalling, do we expect Multiblock UL TBF Assignment? */
4179 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
4180 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
4181 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
4182
4183 f_TC_egprs_pkt_chan_req(req, imm_ass);
4184 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004185
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004186 var StatsDExpects expect := {
4187 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4188 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4189 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4190 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
4191 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
4192 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
4193 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
4194 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4195 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4196 };
4197 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004198
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004199 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004200}
4201
4202testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
4203 var template GsmRrMessage imm_ass;
4204 var template IaRestOctets rest;
4205 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004206 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004207
4208 /* Initialize the PCU interface abstraction */
4209 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004210 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004211
4212 var EGPRSPktChRequest req := {
4213 /* NOTE: other fields are set in the loop */
4214 one_phase := { tag := '0'B }
4215 };
4216
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004217 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004218 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
4219 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
4220 var BIT2 priority := substr(ext_ra, 0, 2);
4221 var BIT3 rand := substr(ext_ra, 2, 3);
4222
4223 req.one_phase.multislot_class := mslot_class;
4224 req.one_phase.priority := priority;
4225 req.one_phase.random_bits := rand;
4226
4227 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
4228 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
4229 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
4230 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
4231
4232 f_TC_egprs_pkt_chan_req(req, imm_ass);
4233 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004234
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004235 var StatsDExpects expect := {
4236 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4237 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4238 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := num_req, max := num_req },
4239 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4240 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
4241 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := num_req, max := num_req },
4242 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4243 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4244 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4245 };
4246 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004247
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004248 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004249}
4250
4251testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
4252 var template GsmRrMessage imm_ass;
4253 var template IaRestOctets rest;
4254 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004255 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004256
4257 /* Initialize the PCU interface abstraction */
4258 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004259 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004260
4261 var EGPRSPktChRequest req := {
4262 /* NOTE: other fields are set in the loop */
4263 two_phase := { tag := '110000'B }
4264 };
4265
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004266 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004267 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
4268 var BIT2 priority := substr(ext_ra, 0, 2);
4269 var BIT3 rand := substr(ext_ra, 2, 3);
4270
4271 req.two_phase.priority := priority;
4272 req.two_phase.random_bits := rand;
4273
4274 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
4275 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
4276 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
4277 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
4278
4279 f_TC_egprs_pkt_chan_req(req, imm_ass);
4280 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004281
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004282 var StatsDExpects expect := {
4283 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4284 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4285 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4286 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
4287 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
4288 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
4289 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
4290 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4291 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4292 };
4293 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004294
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004295 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004296}
4297
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004298private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
4299 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004300 PCUIF_BurstType bt := BURST_TYPE_1,
4301 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004302runs on RAW_PCU_Test_CT {
4303 var template ReqRefWaitInd tr_ref;
4304 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004305
4306 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
4307 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
4308 ra := bit2int(ra11), is_11bit := 1,
4309 burst_type := bt, fn := fn,
4310 arfcn := 871));
4311
4312 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07004313 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004314
4315 /* Just to have a short-name reference to the actual message */
4316 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
4317
4318 /* Make sure that Request Reference list contains at least one entry
4319 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004320 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004321 if (not match(iar.payload, { *, tr_ref, * })) {
4322 setverdict(fail, "Request Reference list does not match");
4323 f_shutdown(__BFILE__, __LINE__);
4324 }
4325
4326 /* Match Feature Indicator (must indicate PS domain) */
4327 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
4328 setverdict(fail, "Feature Indicator does not match");
4329 f_shutdown(__BFILE__, __LINE__);
4330 }
4331
4332 /* Match IAR Rest Octets */
4333 if (not match(iar.rest_octets, rest)) {
4334 setverdict(fail, "IAR Rest Octets does not match: ",
4335 iar.rest_octets, " vs expected ", rest);
4336 f_shutdown(__BFILE__, __LINE__);
4337 }
4338
4339 setverdict(pass);
4340}
4341
4342/* Verify the contents of RR Immediate Assignment Reject message and its
4343 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
4344testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
4345 var template IARRestOctets rest;
4346 var BIT5 ext_ra;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004347 const integer num_req := 6;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004348
4349 /* Initialize the PCU interface abstraction */
4350 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004351 f_statsd_reset();
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004352
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004353 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004354 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
4355 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
4356
4357 /* Intentionally incorrect message (see table 11.2.5a.2) */
4358 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
4359 }
4360
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004361 var StatsDExpects expect := {
4362 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4363 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4364 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4365 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4366 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
4367 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
4368 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
4369 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4370 };
4371 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004372
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004373 f_shutdown(__BFILE__, __LINE__, final := true);
4374}
4375
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004376/* At the moment, the IUT does not support any emergency services. Make sure
4377 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
4378testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
4379 var template IARRestOctets rest;
4380 var BIT5 ext_ra;
4381 var BIT11 ra11;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004382 const integer num_req := 6;
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004383
4384 /* Initialize the PCU interface abstraction */
4385 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004386 f_statsd_reset();
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004387
4388 var EGPRSPktChRequest req := {
4389 /* NOTE: other fields are set in the loop */
4390 emergency := { tag := '110111'B }
4391 };
4392
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004393 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004394 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
4395 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
4396
4397 req.emergency.random_bits := ext_ra;
4398 ra11 := enc_EGPRSPktChRequest2bits(req);
4399
4400 /* Intentionally incorrect message (see table 11.2.5a.2) */
4401 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
4402 }
4403
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004404 var StatsDExpects expect := {
4405 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4406 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4407 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4408 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4409 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
4410 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
4411 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
4412 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4413 };
4414 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004415
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004416 f_shutdown(__BFILE__, __LINE__, final := true);
4417}
4418
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004419/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
4420testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004421 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004422 var template IARRestOctets rest;
4423 var BIT11 ra11;
4424
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004425 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004426 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07004427
4428 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004429 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
4430 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004431
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004432 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004433 f_init_raw(testcasename(), info_ind);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004434 f_statsd_reset();
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004435
4436 var EGPRSPktChRequest req := {
4437 one_phase := {
4438 tag := '0'B,
4439 multislot_class := '10101'B,
4440 priority := '01'B,
4441 random_bits := '101'B
4442 }
4443 };
4444
4445 /* We send 7 requests, the IUT gives us all available USFs (0..6).
4446 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
4447 for (var integer i := 0; i < 7; i := i + 1) {
4448 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
4449 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
4450 }
4451
4452 ra11 := enc_EGPRSPktChRequest2bits(req);
4453 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
4454
4455 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004456 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004457
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004458 var StatsDExpects expect := {
4459 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 8, max := 8 },
4460 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 8, max := 8 },
4461 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 8, max := 8 },
4462 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4463 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := 0, max := 0 },
4464 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 7, max := 7 },
4465 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 7, max := 7 },
4466 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4467 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4468 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := 1, max := 1 },
4469 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4470 };
4471 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004472
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004473 f_shutdown(__BFILE__, __LINE__, final := true);
4474}
4475
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004476/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004477private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004478return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004479 /* Pick a random MA length in range 2 .. max_ma_len */
4480 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
4481
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004482 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
4483 hsn := f_rnd_int(63),
4484 maio := f_rnd_int(63),
4485 ma := f_rnd_bitstring(ma_len));
4486}
4487
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004488private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
4489 in GsmRrMessage rr_msg)
4490{
4491 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004492 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004493
4494 var template PacketChannelDescription tr_pkt_chan_desc := {
4495 channel_Type_spare := ?,
4496 tn := ?,
4497 tsc := ts.tsc,
4498 presence := '1'B,
4499 zero := omit,
4500 one := {
4501 maio := ts.maio,
4502 hsn := ts.hsn
4503 }
4504 };
4505
4506 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
4507 setverdict(fail, "Packet Channel Description does not match: ",
4508 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
4509 }
4510
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004511 /* Mobile Allocation is expected to be octet-aligned */
4512 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
4513 var template MobileAllocationLV tr_ma := {
4514 len := ma_oct_len, /* in bytes */
4515 ma := substr(ts.ma, 0, ma_oct_len * 8)
4516 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004517
4518 if (not match(ia.mobile_allocation, tr_ma)) {
4519 setverdict(fail, "Mobile Allocation does not match: ",
4520 ia.mobile_allocation, " vs ", tr_ma);
4521 }
4522
4523 setverdict(pass);
4524}
4525
4526/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
4527testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004528 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004529 var GprsMS ms := valueof(t_GprsMS_def);
4530
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004531 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004532 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004533
4534 /* Initialize the PCU interface abstraction */
4535 f_init_raw(testcasename(), info_ind);
4536
4537 /* EGPRS Packet Channel Request (cause=Signalling) */
4538 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
4539
4540 /* Establish an Uplink EGPRS TBF */
4541 f_ms_establish_ul_tbf(ms);
4542
4543 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4544 f_shutdown(__BFILE__, __LINE__, final := true);
4545}
4546
4547/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
4548testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004549 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004550 var GprsMS ms := valueof(t_GprsMS_def);
4551
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004552 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004553 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004554
4555 /* Initialize the PCU interface abstraction */
4556 f_init_raw(testcasename(), info_ind);
4557
4558 /* Establish an Uplink TBF */
4559 f_ms_establish_ul_tbf(ms);
4560
4561 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4562 f_shutdown(__BFILE__, __LINE__, final := true);
4563}
4564
4565/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
4566testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004567 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004568 var GprsMS ms := valueof(t_GprsMS_def);
4569
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004570 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004571 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004572
4573 /* Initialize NS/BSSGP side */
4574 f_init_bssgp();
4575
4576 /* Initialize the PCU interface abstraction */
4577 f_init_raw(testcasename(), info_ind);
4578
4579 /* Establish BSSGP connection to the PCU */
4580 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004581 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004582
4583 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
4584 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
4585 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4586
4587 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
4588 f_shutdown(__BFILE__, __LINE__, final := true);
4589}
4590
4591private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
4592 in FrequencyParameters fp)
4593{
4594 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004595 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004596
4597 /* Table 12.8.1: Frequency Parameters information elements */
4598 var template FrequencyParameters tr_fp := {
4599 tsc := ts.tsc,
4600 presence := '10'B, /* Direct encoding 1 */
4601 arfcn := omit,
4602 indirect := omit,
4603 direct1 := {
4604 maio := ts.maio,
4605 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
4606 mobile_allocation := {
4607 hsn := ts.hsn,
4608 rfl_number_list_present := '0'B,
4609 rfl_number_list := omit,
4610 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004611 ma_length := ts.ma_bit_len,
4612 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004613 }
4614 },
4615 direct2 := omit
4616 };
4617
4618 if (not match(fp, tr_fp)) {
4619 setverdict(fail, "Frequency Parameters IE does not match: ",
4620 fp, " vs ", tr_fp);
4621 }
4622
4623 setverdict(pass);
4624}
4625
4626/* Make sure that Packet Uplink Assignment contains hopping parameters */
4627testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004628 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004629 var GprsMS ms := valueof(t_GprsMS_def);
4630 var uint32_t poll_fn;
4631
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004632 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004633 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004634
4635 /* Initialize the PCU interface abstraction */
4636 f_init_raw(testcasename(), info_ind);
4637
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004638 /* Single block (two phase) packet access */
4639 var uint16_t ra := bit2int(chan_req_sb);
4640 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
4641
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004642 /* Establish an Uplink TBF */
4643 f_ms_establish_ul_tbf(ms);
4644
4645 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004646 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
4647 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004648
4649 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004650 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
4651 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004652
4653 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
4654 var template (omit) FrequencyParameters fp;
4655 if (ua.is_egprs == '1'B) {
4656 fp := ua.egprs.freq_par;
4657 } else {
4658 fp := ua.gprs.freq_par;
4659 }
4660
4661 /* This is an optional IE, so it's worth to check its presence */
4662 if (istemplatekind(fp, "omit")) {
4663 setverdict(fail, "Frequency Parameters IE is not present");
4664 f_shutdown(__BFILE__, __LINE__);
4665 }
4666
4667 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
4668 f_shutdown(__BFILE__, __LINE__, final := true);
4669}
4670
4671/* Make sure that Packet Downlink Assignment contains hopping parameters */
4672testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004673 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004674 var octetstring data := f_rnd_octstring(10);
4675 var GprsMS ms := valueof(t_GprsMS_def);
4676 var RlcmacDlBlock dl_block;
4677 var uint32_t poll_fn;
4678
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004679 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004680 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004681
4682 /* Initialize NS/BSSGP side */
4683 f_init_bssgp();
4684
4685 /* Initialize the PCU interface abstraction */
4686 f_init_raw(testcasename(), info_ind);
4687
4688 /* Establish BSSGP connection to the PCU */
4689 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004690 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004691
4692 /* Establish an Uplink TBF */
4693 f_ms_establish_ul_tbf(ms);
4694
4695 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004696 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 +07004697
4698 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4699 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
4700 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4701
4702 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
4703 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4704
4705 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004706 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4707 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004708
4709 /* This is an optional IE, so it's worth to check its presence */
4710 if (not ispresent(da.freq_par)) {
4711 setverdict(fail, "Frequency Parameters IE is not present");
4712 f_shutdown(__BFILE__, __LINE__);
4713 }
4714
4715 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
4716 f_shutdown(__BFILE__, __LINE__, final := true);
4717}
4718
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004719/* Check if the IUT handles subsequent INFO.ind messages */
4720testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004721 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004722 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004723
4724 /* Initialize the PCU interface abstraction */
4725 f_init_raw(testcasename(), info_ind);
4726
4727 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
4728 for (var integer i := 0; i < 16; i := i + 1) {
4729 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004730 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004731 }
4732
4733 f_shutdown(__BFILE__, __LINE__, final := true);
4734}
4735
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004736/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
4737testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
4738 var PCUIF_info_ind info_ind;
4739 var integer i;
4740 const integer num_ms := 8;
4741
4742 /* Initialize NS/BSSGP side */
4743 f_init_bssgp();
4744 /* Initialize GPRS MS side */
4745 f_init_gprs_ms(num_ms);
4746
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01004747 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004748 /* Only the 3 first TRX are enabled. The enabled ones all have same
4749 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004750 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
4751 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
4752 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
4753 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004754
4755 /* Initialize the PCU interface abstraction */
4756 f_init_raw(testcasename(), info_ind);
4757
4758 /* Establish BSSGP connection to the PCU */
4759 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004760 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004761
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004762 /* Establish an Uplink TBF for each GprsMS instance */
4763 f_multi_ms_establish_tbf(do_activate := false);
4764
4765 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004766 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004767 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01004768 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004769 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004770 f_shutdown(__BFILE__, __LINE__);
4771 }
4772 }
4773
4774 f_shutdown(__BFILE__, __LINE__, final := true);
4775}
4776
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004777/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
4778 * downgraded to CS1-4 so that GPRS can read the USF).
4779 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
4780 */
4781testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
4782 var PCUIF_info_ind info_ind;
4783 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
4784 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004785 var uint32_t sched_fn, dl_fn, ack_fn;
4786 var octetstring data := f_rnd_octstring(10);
4787 var RlcmacDlBlock dl_block;
4788 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004789 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004790 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
4791 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
4792
4793 /* Initialize NS/BSSGP side */
4794 f_init_bssgp();
4795 /* Initialize GPRS MS side */
4796 f_init_gprs_ms(num_ms);
4797
4798 info_ind := valueof(ts_PCUIF_INFO_default);
4799 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004800 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
4801 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004802
4803 /* Initialize the PCU interface abstraction */
4804 f_init_raw(testcasename(), info_ind);
4805
4806 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
4807 g_mcs_initial_dl := 5;
4808 g_mcs_max_dl := 5;
4809 f_pcuvty_set_allowed_cs_mcs();
4810
4811 /* Establish BSSGP connection to the PCU */
4812 f_bssgp_establish();
4813 f_multi_ms_bssgp_register();
4814
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004815 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004816 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 +01004817 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
4818 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
4819 f_shutdown(__BFILE__, __LINE__);
4820 }
4821 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4822 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4823
4824 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004825 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 +01004826 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
4827 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
4828 f_shutdown(__BFILE__, __LINE__);
4829 }
4830 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4831 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4832
4833 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
4834 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4835 f_sleep(0.1);
4836 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4837 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4838 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
4839 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4840 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
4841 /* ACK the DL block */
4842 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
4843 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
4844 f_dl_block_ack_fn(dl_block, dl_fn));
4845
4846 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
4847 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4848 f_sleep(0.1);
4849 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4850 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4851 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
4852 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4853 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
4854 /* ACK the DL block */
4855 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
4856 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
4857 f_dl_block_ack_fn(dl_block, dl_fn));
4858
4859 data := f_rnd_octstring(1400);
4860 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4861 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4862
4863 for (var integer i := 0; i < 800; i := i + 1) {
4864 f_rx_rlcmac_dl_block(dl_block, dl_fn);
4865
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07004866 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL)) {
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004867 /* No more data to receive, done */
4868 break;
4869 }
4870
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004871 usf_ms := -1;
4872
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004873 if (ischosen(dl_block.ctrl)) {
4874 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
4875 f_shutdown(__BFILE__, __LINE__);
4876 } else if (ischosen(dl_block.data_egprs)) {
4877 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
4878 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
4879 f_shutdown(__BFILE__, __LINE__);
4880 }
4881 tgt_ms := 1;
4882 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
4883 if (dl_block.data_egprs.mcs > MCS_4) {
4884 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
4885 f_shutdown(__BFILE__, __LINE__);
4886 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004887 usf_ms := 0;
4888 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004889 } else {
4890 if (dl_block.data_egprs.mcs <= MCS_4) {
4891 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
4892 f_shutdown(__BFILE__, __LINE__);
4893 }
4894 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004895 usf_ms := 1;
4896 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004897 }
4898 }
4899 } else {
4900 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
4901 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
4902 f_shutdown(__BFILE__, __LINE__);
4903 }
4904 tgt_ms := 0;
4905 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 +01004906 usf_ms := 0;
4907 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004908 } 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 +01004909 usf_ms := 1;
4910 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004911 }
4912 }
4913
4914 /* Keep Ack/Nack description updated */
4915 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
4916
4917 /* TDMA frame number on which we are supposed to send the ACK */
4918 if (f_dl_block_rrbp_valid(dl_block)) {
4919 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
4920 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);
4921 if (tx_data_remain != 0) {
4922 /* Submit more data from time to time to keep the TBF ongoing */
4923 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4924 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4925 tx_data_remain := tx_data_remain - 1;
4926 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004927 } else if (tx_data_remain != 0) {
4928 /* keep sending UL blocks when requested by USF to avoid
4929 * UL TBF timeout and hence stop receival of USFs */
4930 if (usf_ms != -1) {
4931 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
4932 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004933 }
4934 }
4935
4936 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 +01004937 /* He we check that DL blocks scheduled at GPRS can still request UL
4938 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
4939 * condition also ensures the downgrade to <=MCS4 condition is tested
4940 * above */
4941 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
4942 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004943 f_shutdown(__BFILE__, __LINE__);
4944 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004945 /* Here check for some level of fairness between them (at least ~40%): */
4946 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
4947 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
4948 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
4949 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
4950 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4951 f_shutdown(__BFILE__, __LINE__);
4952 }
4953 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
4954 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4955 f_shutdown(__BFILE__, __LINE__);
4956 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004957
4958 f_shutdown(__BFILE__, __LINE__, final := true);
4959}
4960
4961
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004962private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4963 boolean exp_imsi, boolean exp_tmsi)
4964runs on RAW_PCU_Test_CT {
4965 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4966 var integer pending := lengthof(g_ms);
4967 var RlcmacDlBlock dl_block;
4968 var boolean f1, f2;
4969
4970 while (pending > 0) {
4971 var uint32_t poll_fn;
4972
4973 /* Obtain a Downlink block and make sure it is a paging request */
4974 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4975 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4976 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4977 break;
4978 }
4979
4980 /* This should not happen in general, but who knows... */
4981 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4982 if (not ispresent(req.repeated_pageinfo)) {
4983 setverdict(fail, "Repeated Page Info IE is absent?!?");
4984 break;
4985 }
4986
4987 /* A single message may contain several MIs depending on their type */
4988 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4989 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4990 ps_domain := false);
4991 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4992 ps_domain := false);
4993 if (not f1 and not f2)
4994 { continue; }
4995
4996 /* Detect duplicate MIs */
4997 if (mask[i] == '1'B) {
4998 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4999 continue;
5000 }
5001
5002 mask[i] := '1'B;
5003 }
5004
5005 pending := pending - lengthof(req.repeated_pageinfo);
5006 }
5007
5008 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
5009 if (mask[i] != '1'B) {
5010 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
5011 log("===== mask := ", mask);
5012 }
5013 }
5014
5015 /* All messages must have been received by now, expect a dummy block */
5016 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
5017}
5018
5019private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
5020runs on RAW_PCU_Test_CT {
5021 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5022 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
5023
5024 /* Initialize NS/BSSGP side */
5025 f_init_bssgp();
5026
5027 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01005028 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005029
5030 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
5031 f_init_gprs_ms(7 * 8);
5032
5033 /* Initialize the PCU interface abstraction */
5034 f_init_raw(testcasename(), info_ind);
5035
5036 /* Establish BSSGP connection to the PCU */
5037 f_bssgp_establish();
5038 f_multi_ms_bssgp_register();
5039
5040 /* Establish an Uplink TBF for each GprsMS instance */
5041 f_multi_ms_establish_tbf(do_activate := true);
5042}
5043
5044testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
5045 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
5046
5047 /* Common part: send INFO.ind, establish TBFs... */
5048 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
5049
5050 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
5051 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
5052 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
5053 }
5054
5055 /* FIXME: work around a race condition between PCUIF and BSSGP */
5056 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
5057
5058 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
5059 * The IUT is expected to page on all PDCH slots of all transceivers. */
5060 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
5061 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
5062 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
5063 }
5064
5065 f_shutdown(__BFILE__, __LINE__, final := true);
5066}
5067
5068testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
5069 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
5070
5071 /* Common part: send INFO.ind, establish TBFs... */
5072 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
5073
5074 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
5075 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
5076 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
5077 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
5078 }
5079
5080 /* FIXME: work around a race condition between PCUIF and BSSGP */
5081 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
5082
5083 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
5084 * The IUT is expected to page on all PDCH slots of all transceivers. */
5085 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
5086 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
5087 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
5088 }
5089
5090 f_shutdown(__BFILE__, __LINE__, final := true);
5091}
5092
5093testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
5094 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
5095
5096 /* Common part: send INFO.ind, establish TBFs... */
5097 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
5098
5099 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
5100 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
5101 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
5102 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
5103 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
5104 } else {
5105 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
5106 }
5107 }
5108
5109 /* FIXME: work around a race condition between PCUIF and BSSGP */
5110 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
5111
5112 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
5113 * The IUT is expected to page on all PDCH slots of all transceivers. */
5114 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
5115 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
5116 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
5117 }
5118
5119 f_shutdown(__BFILE__, __LINE__, final := true);
5120}
5121
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005122private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005123runs on RAW_PCU_Test_CT return RlcmacDlBlock {
5124 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005125 var integer i := 0;
5126 while (true) {
5127 f_rx_rlcmac_dl_block(dl_block, sched_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07005128 if (not match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005129 break;
5130 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005131 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005132 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5133 f_shutdown(__BFILE__, __LINE__);
5134 }
5135 i := i + 1;
5136 }
5137 return dl_block;
5138}
5139
Vadim Yanitskiy03f74d42023-02-10 09:22:42 +07005140private const GsmMcc c_BssgpCellMcc := '623'H; /* MCC: Central African Republic */
5141private const GsmMnc c_BssgpCellMnc := '03'H; /* MNC: Celca (Socatel) */
Vadim Yanitskiy72956612023-02-10 08:53:51 +07005142private template (value) BssgpCellId ts_BssgpCellIdDstAddr_default := {
5143 ra_id := {
5144 lai := {
5145 mcc_mnc := f_build_BcdMccMnc(c_BssgpCellMcc, c_BssgpCellMnc),
5146 lac := 423
5147 },
5148 rac := 2
5149 },
5150 cell_id := 5
5151}
5152
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005153private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
5154runs on RAW_PCU_Test_CT {
Vadim Yanitskiy88b87a42023-02-10 08:32:48 +07005155 /* Source Cell Identifier IE is generated by osmo-pcu based on the INFO.ind */
5156 var BcdMccMnc src_mcc_mnc := f_build_BcdMccMnc_int(info_ind.mcc, info_ind.mnc, info_ind.mnc_3_digits == 1);
5157 var BssgpCellId src := valueof(ts_BssgpCellId(ts_RAI(ts_LAI(src_mcc_mnc, info_ind.lac), info_ind.rac),
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005158 info_ind.cell_id));
Vadim Yanitskiy88b87a42023-02-10 08:32:48 +07005159 /* Destination Cell Identifier IE is resolved by the testsuite itself (emulating BSC) */
Vadim Yanitskiy72956612023-02-10 08:53:51 +07005160 var BssgpCellId dst := valueof(ts_BssgpCellIdDstAddr_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005161 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
5162 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
5163 var template (value) RAN_Information_RIM_Container res_cont :=
5164 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5165 ts_RIM_Sequence_Number(2),
5166 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5167 ts_RIM_Protocol_Version_Number(1),
5168 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
5169 omit);
5170 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5171 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5172 res_cont));
5173}
5174
5175altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
5176runs on RAW_PCU_Test_CT {
Vadim Yanitskiy88b87a42023-02-10 08:32:48 +07005177 /* Source Cell Identifier IE is generated by osmo-pcu based on the INFO.ind */
5178 var BcdMccMnc src_mcc_mnc := f_build_BcdMccMnc_int(info_ind.mcc, info_ind.mnc, info_ind.mnc_3_digits == 1);
5179 var BssgpCellId src := valueof(ts_BssgpCellId(ts_RAI(ts_LAI(src_mcc_mnc, info_ind.lac), info_ind.rac),
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005180 info_ind.cell_id));
Vadim Yanitskiy88b87a42023-02-10 08:32:48 +07005181 /* Destination Cell Identifier IE is resolved by the testsuite itself (emulating BSC) */
Vadim Yanitskiy72956612023-02-10 08:53:51 +07005182 var BssgpCellId dst := valueof(ts_BssgpCellIdDstAddr_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005183 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
5184 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
5185 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5186 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5187 tr_RAN_Information_Request_RIM_Container)) {
5188 if (do_answer) {
5189 f_outbound_nacc_rim_tx_resp(info_ind);
5190 }
5191 if (do_repeat) {
5192 repeat;
5193 }
5194 }
5195}
5196
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07005197private function f_ctrl_rx_nacc_rac_ci_req(out CtrlMessage ctrl_req,
5198 PCUIF_info_ind info_ind,
5199 GsmArfcn req_arfcn,
5200 uint6_t req_bsic)
5201runs on RAW_PCU_Test_CT {
5202 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5203 int2str(info_ind.lac) & "." &
5204 int2str(info_ind.cell_id) & "." &
5205 int2str(req_arfcn) & "." &
5206 int2str(req_bsic);
5207 f_ipa_ctrl_wait_link_up();
5208 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value ctrl_req;
5209}
5210
5211private function f_ctrl_tx_nacc_rac_ci_rsp(in CtrlMessage ctrl_req)
5212runs on RAW_PCU_Test_CT {
5213 var BssgpCellId addr := valueof(ts_BssgpCellIdDstAddr_default);
5214 IPA_CTRL.send(ts_CtrlMsgGetRepl(ctrl_req.cmd.id,
5215 ctrl_req.cmd.variable,
5216 hex2str(c_BssgpCellMcc) & "-" &
5217 hex2str(c_BssgpCellMnc) & "-" &
5218 int2str(addr.ra_id.lai.lac) & "-" &
5219 int2str(addr.ra_id.rac) & "-" &
5220 int2str(addr.cell_id)));
5221}
5222
5223private function f_pcuif_rx_nacc_rac_ci_req(out PCUIF_Message addr_req,
5224 PCUIF_info_ind info_ind,
5225 GsmArfcn req_arfcn,
5226 uint6_t req_bsic)
5227runs on RAW_PCU_Test_CT {
5228 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id,
5229 req_arfcn, req_bsic)) -> value addr_req;
5230}
5231
5232private function f_pcuif_tx_nacc_rac_ci_rsp(in PCUIF_Message addr_req)
5233runs on RAW_PCU_Test_CT {
5234 var BssgpCellId addr := valueof(ts_BssgpCellIdDstAddr_default);
5235 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, addr_req.u.container.u.neigh_addr_req, 0,
5236 str2int(hex2str(c_BssgpCellMcc)),
5237 str2int(hex2str(c_BssgpCellMnc)),
5238 lengthof(c_BssgpCellMnc) - 2,
5239 addr.ra_id.lai.lac,
5240 addr.ra_id.rac,
5241 addr.cell_id));
5242}
5243
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005244private function f_handle_nacc_rac_ci_query(PCUIF_info_ind info_ind, GsmArfcn req_arfcn, uint6_t req_bsic,
5245 boolean answer := true, boolean use_old_ctrl_iface := false)
5246runs on RAW_PCU_Test_CT {
5247 if (use_old_ctrl_iface == true) {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07005248 var CtrlMessage ctrl_req;
5249 f_ctrl_rx_nacc_rac_ci_req(ctrl_req, info_ind, req_arfcn, req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005250 if (answer) {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07005251 f_ctrl_tx_nacc_rac_ci_rsp(ctrl_req);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005252 }
5253 } else {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07005254 var PCUIF_Message pcuif_req;
5255 f_pcuif_rx_nacc_rac_ci_req(pcuif_req, info_ind, req_arfcn, req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005256 if (answer) {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07005257 f_pcuif_tx_nacc_rac_ci_rsp(pcuif_req);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005258 }
5259 }
5260}
5261
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005262/* Start NACC from MS side */
5263private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005264 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005265 boolean skip_final_ctrl_ack := false,
5266 boolean use_old_ctrl_iface := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005267runs on RAW_PCU_Test_CT {
Philipp Maier7d187ae2023-06-20 14:38:24 +02005268 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005269 var RlcmacDlBlock dl_block;
5270 var uint32_t sched_fn;
5271 var GsmArfcn req_arfcn := 862;
5272 var uint6_t req_bsic := 43;
5273
5274 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02005275 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5276 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005277
5278 if (exp_rac_ci_query == true) {
5279 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005280 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 +01005281 }
5282
5283 if (exp_si_query == true) {
5284 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005285 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005286 }
5287
5288 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005289 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005290
5291 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5292 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5293 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5294 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5295 f_shutdown(__BFILE__, __LINE__);
5296 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005297 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005298 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005299 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5300 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5301 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005302}
5303
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005304/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
5305testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005306 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005307 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005308 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005309 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005310
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005311 if (use_old_ctrl_iface) {
5312 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5313 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5314 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005315
5316 /* Initialize NS/BSSGP side */
5317 f_init_bssgp();
5318 /* Initialize GPRS MS side */
5319 f_init_gprs_ms();
5320 ms := g_ms[0]; /* We only use first MS in this test */
5321
5322 /* Initialize the PCU interface abstraction */
5323 f_init_raw(testcasename(), info_ind);
5324
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005325 /* Make sure we are not affected by full cache from previous tests */
5326 f_pcuvty_flush_neigh_caches();
5327
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005328 /* Establish BSSGP connection to the PCU */
5329 f_bssgp_establish();
5330 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5331
5332 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005333 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 +01005334 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5335 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5336
5337 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005338 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005339
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005340 f_shutdown(__BFILE__, __LINE__, final := true);
5341}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005342
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005343/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
5344testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
5345 var PollFnCtx pollctx;
5346 var GprsMS ms;
5347 var RlcmacDlBlock dl_block;
5348 var uint32_t sched_fn;
5349 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005350 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005351
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005352 if (use_old_ctrl_iface) {
5353 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5354 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5355 }
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005356
5357 /* Initialize NS/BSSGP side */
5358 f_init_bssgp();
5359 /* Initialize GPRS MS side */
5360 f_init_gprs_ms();
5361 ms := g_ms[0]; /* We only use first MS in this test */
5362
5363 /* Initialize the PCU interface abstraction */
5364 f_init_raw(testcasename(), info_ind);
5365
5366 /* Make sure we are not affected by full cache from previous tests */
5367 f_pcuvty_flush_neigh_caches();
5368
5369 /* Establish BSSGP connection to the PCU */
5370 f_bssgp_establish();
5371 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5372
5373 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005374 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 +01005375 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5376 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5377
5378 /* Start NACC from MS side, avoid sending final CTRL ACK */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005379 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 +01005380
5381 /* Wait until we receive something non-dummy */
5382 dl_block := f_skip_dummy(0, sched_fn);
5383 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
5384 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5385 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5386 }
5387 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5388 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5389 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5390 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5391 }
5392
5393 f_shutdown(__BFILE__, __LINE__, final := true);
5394}
5395
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005396/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
5397testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
5398 var PollFnCtx pollctx;
5399 var GprsMS ms;
5400 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02005401 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005402 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005403
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005404 if (use_old_ctrl_iface) {
5405 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5406 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5407 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005408
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005409 /* Initialize NS/BSSGP side */
5410 f_init_bssgp();
5411 /* Initialize GPRS MS side */
5412 f_init_gprs_ms();
5413 ms := g_ms[0]; /* We only use first MS in this test */
5414
5415 /* Initialize the PCU interface abstraction */
5416 f_init_raw(testcasename(), info_ind);
5417
5418 /* Make sure we are not affected by full cache from previous tests */
5419 f_pcuvty_flush_neigh_caches();
5420 /* Set timeout values for caches so that entries will be in cache during second try */
5421 f_pcuvty_set_neigh_caches(10, 10);
5422
5423 /* Establish BSSGP connection to the PCU */
5424 f_bssgp_establish();
5425 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5426
5427 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005428 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 +01005429 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5430 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5431
5432 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005433 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005434
5435 /* 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 +02005436 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 +01005437
5438 f_shutdown(__BFILE__, __LINE__, final := true);
5439}
5440
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005441/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
5442 * TS 44.060 sec 8.8) twice, the second time after caches timed out
5443 */
5444testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
5445 var PollFnCtx pollctx;
5446 var GprsMS ms;
5447 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02005448 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005449 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005450
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005451 if (use_old_ctrl_iface) {
5452 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5453 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5454 }
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005455
5456 /* Initialize NS/BSSGP side */
5457 f_init_bssgp();
5458 /* Initialize GPRS MS side */
5459 f_init_gprs_ms();
5460 ms := g_ms[0]; /* We only use first MS in this test */
5461
5462 /* Initialize the PCU interface abstraction */
5463 f_init_raw(testcasename(), info_ind);
5464
5465 /* Make sure we are not affected by full cache from previous tests */
5466 f_pcuvty_flush_neigh_caches();
5467 /* Set timeout values for caches so that entries will be erased before the second try */
5468 f_pcuvty_set_neigh_caches(1, 1);
5469
5470 /* Establish BSSGP connection to the PCU */
5471 f_bssgp_establish();
5472 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5473
5474 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005475 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 +01005476 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5477 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5478
5479 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005480 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005481
5482 /* CTRL client should have disconnected from us */
5483 f_ipa_ctrl_wait_link_down();
5484 /* wait for cache entries to time out */
5485 f_sleep(2.0);
5486 /* 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 +02005487 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005488
5489 f_shutdown(__BFILE__, __LINE__, final := true);
5490}
5491
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005492/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005493testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
5494 var RlcmacDlBlock dl_block;
5495 var PollFnCtx pollctx;
5496 var uint32_t sched_fn;
5497 var GprsMS ms;
Philipp Maier7d187ae2023-06-20 14:38:24 +02005498 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005499 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005500 var GsmArfcn req_arfcn := 862;
5501 var uint6_t req_bsic := 43;
5502
5503 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
5504 * resolution CTRL port, to trigger Conn Refused by socket:
5505 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5506 */
5507
5508 /* Initialize NS/BSSGP side */
5509 f_init_bssgp();
5510 /* Initialize GPRS MS side */
5511 f_init_gprs_ms();
5512 ms := g_ms[0]; /* We only use first MS in this test */
5513
5514 /* Initialize the PCU interface abstraction */
5515 f_init_raw(testcasename(), info_ind);
5516
5517 /* Make sure we are not affected by full cache from previous tests */
5518 f_pcuvty_flush_neigh_caches();
5519
5520 /* Establish BSSGP connection to the PCU */
5521 f_bssgp_establish();
5522 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5523
5524 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005525 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 +01005526 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5527 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5528
5529 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02005530 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5531 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005532
5533 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005534 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005535 /* Make sure it is a Pkt Cell Chg Continue */
5536 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5537 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5538 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005539 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5540 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5541 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5542 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5543 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005544
5545 f_shutdown(__BFILE__, __LINE__, final := true);
5546}
5547
5548/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005549testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
5550 var RlcmacDlBlock dl_block;
5551 var PollFnCtx pollctx;
5552 var uint32_t sched_fn;
5553 var GprsMS ms;
Philipp Maier7d187ae2023-06-20 14:38:24 +02005554 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005555 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005556 var GsmArfcn req_arfcn := 862;
5557 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005558 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005559
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005560 if (use_old_ctrl_iface) {
5561 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5562 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5563 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005564
5565 /* Initialize NS/BSSGP side */
5566 f_init_bssgp();
5567 /* Initialize GPRS MS side */
5568 f_init_gprs_ms();
5569 ms := g_ms[0]; /* We only use first MS in this test */
5570
5571 /* Initialize the PCU interface abstraction */
5572 f_init_raw(testcasename(), info_ind);
5573
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005574 /* Make sure we are not affected by full cache from previous tests */
5575 f_pcuvty_flush_neigh_caches();
5576
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005577 /* Establish BSSGP connection to the PCU */
5578 f_bssgp_establish();
5579 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5580
5581 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005582 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 +01005583 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5584 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5585
5586 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02005587 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5588 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005589
5590 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005591 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005592 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 +01005593
5594 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005595 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005596 /* Make sure it is a Pkt Cell Chg Continue */
5597 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5598 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5599 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005600 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5601 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5602 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5603 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5604 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005605
5606 f_shutdown(__BFILE__, __LINE__, final := true);
5607}
5608
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005609/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
5610testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
5611 var RlcmacDlBlock dl_block;
5612 var PollFnCtx pollctx;
5613 var uint32_t sched_fn;
5614 var GprsMS ms;
Philipp Maier7d187ae2023-06-20 14:38:24 +02005615 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005616 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005617 var GsmArfcn req_arfcn := 862;
5618 var uint6_t req_bsic := 43;
5619
5620 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5621 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5622
5623 /* Initialize NS/BSSGP side */
5624 f_init_bssgp();
5625 /* Initialize GPRS MS side */
5626 f_init_gprs_ms();
5627 ms := g_ms[0]; /* We only use first MS in this test */
5628
5629 /* Initialize the PCU interface abstraction */
5630 f_init_raw(testcasename(), info_ind);
5631
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005632 /* Make sure we are not affected by full cache from previous tests */
5633 f_pcuvty_flush_neigh_caches();
5634
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005635 /* Establish BSSGP connection to the PCU */
5636 f_bssgp_establish();
5637 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5638
5639 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005640 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 +01005641 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5642 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5643
5644 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02005645 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5646 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005647
5648 /* osmo-pcu should now ask for resolution: */
5649 f_ipa_ctrl_wait_link_up();
5650 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5651 int2str(info_ind.lac) & "." &
5652 int2str(info_ind.cell_id) & "." &
5653 int2str(req_arfcn) & "." &
5654 int2str(req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005655 /* we receive RAC+CI resolution request and we send incorrectly formated response */
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005656 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
5657
5658 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005659 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005660 /* Make sure it is a Pkt Cell Chg Continue */
5661 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5662 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5663 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005664 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5665 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5666 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5667 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5668 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005669
5670 f_shutdown(__BFILE__, __LINE__, final := true);
5671}
5672
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005673/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
5674testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
5675 var RlcmacDlBlock dl_block;
5676 var PollFnCtx pollctx;
5677 var uint32_t sched_fn;
5678 var GprsMS ms;
Philipp Maier7d187ae2023-06-20 14:38:24 +02005679 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005680 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005681 var GsmArfcn req_arfcn := 862;
5682 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005683 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005684
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005685 if (use_old_ctrl_iface) {
5686 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5687 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5688 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005689
5690 /* Initialize NS/BSSGP side */
5691 f_init_bssgp();
5692 /* Initialize GPRS MS side */
5693 f_init_gprs_ms();
5694 ms := g_ms[0]; /* We only use first MS in this test */
5695
5696 /* Initialize the PCU interface abstraction */
5697 f_init_raw(testcasename(), info_ind);
5698
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005699 /* Make sure we are not affected by full cache from previous tests */
5700 f_pcuvty_flush_neigh_caches();
5701
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005702 /* Establish BSSGP connection to the PCU */
5703 f_bssgp_establish();
5704 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5705
5706 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005707 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 +01005708 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5709 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5710
5711 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02005712 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5713 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005714
5715 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005716 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 +01005717
5718 /* RIM procedure: */
Vadim Yanitskiyd8aa5e82023-02-12 17:11:42 +07005719 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005720 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
5721
5722 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005723 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005724 /* Make sure it is a Pkt Cell Chg Continue */
5725 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5726 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5727 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005728 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5729 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5730 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5731 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5732 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005733
5734 f_shutdown(__BFILE__, __LINE__, final := true);
5735}
5736
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005737/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
5738testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
5739 var PollFnCtx pollctx;
5740 var GprsMS ms;
5741 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02005742 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005743 var RlcmacDlBlock dl_block;
5744 var uint32_t sched_fn;
5745 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005746 var charstring ctrl_var;
5747 var PCUIF_Message pcu_msg;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005748 var GsmArfcn req_arfcn := 862;
5749 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005750 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005751
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005752 if (use_old_ctrl_iface) {
5753 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5754 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5755 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005756
5757 /* Initialize NS/BSSGP side */
5758 f_init_bssgp();
5759 /* Initialize GPRS MS side */
5760 f_init_gprs_ms();
5761 ms := g_ms[0]; /* We only use first MS in this test */
5762
5763 /* Initialize the PCU interface abstraction */
5764 f_init_raw(testcasename(), info_ind);
5765
5766 /* Make sure we are not affected by full cache from previous tests */
5767 f_pcuvty_flush_neigh_caches();
5768
5769 /* Establish BSSGP connection to the PCU */
5770 f_bssgp_establish();
5771 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5772
5773 /* Send PACKET RESOURCE REQUEST */
5774 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5775 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5776 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5777
5778 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02005779 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5780 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005781
5782 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005783 if (use_old_ctrl_iface) {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07005784 f_ctrl_rx_nacc_rac_ci_req(rx_ctrl, info_ind, req_arfcn, req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005785 } else {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07005786 f_pcuif_rx_nacc_rac_ci_req(pcu_msg, info_ind, req_arfcn, req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005787 }
5788
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005789 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
Philipp Maier7d187ae2023-06-20 14:38:24 +02005790 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005791 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005792
5793 if (use_old_ctrl_iface) {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07005794 f_ctrl_tx_nacc_rac_ci_rsp(rx_ctrl);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005795 } else {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07005796 f_pcuif_tx_nacc_rac_ci_rsp(pcu_msg);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005797 }
5798
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005799 timer T := 2.0;
5800 T.start;
5801 alt {
5802 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005803 [use_old_ctrl_iface] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005804 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
5805 f_shutdown(__BFILE__, __LINE__);
5806 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005807 [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 {
5808 setverdict(fail, "Received unexpected PCUIF resolution after duplicate Pkt Cell Change Notification:", pcu_msg);
5809 f_shutdown(__BFILE__, __LINE__);
5810 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005811 [] T.timeout {
5812 setverdict(pass);
5813 }
5814 }
5815
5816 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005817 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005818
5819 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5820 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5821 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5822 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5823 f_shutdown(__BFILE__, __LINE__);
5824 }
5825 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5826 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5827 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5828 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5829 }
5830
5831 f_shutdown(__BFILE__, __LINE__, final := true);
5832}
5833
5834/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
5835testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
5836 var PollFnCtx pollctx;
5837 var GprsMS ms;
5838 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02005839 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005840 var RlcmacDlBlock dl_block;
5841 var uint32_t sched_fn;
5842 var CtrlMessage rx_ctrl;
5843 var GsmArfcn req_arfcn := 862;
5844 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005845 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005846
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005847 if (use_old_ctrl_iface) {
5848 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5849 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5850 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005851
5852 /* Initialize NS/BSSGP side */
5853 f_init_bssgp();
5854 /* Initialize GPRS MS side */
5855 f_init_gprs_ms();
5856 ms := g_ms[0]; /* We only use first MS in this test */
5857
5858 /* Initialize the PCU interface abstraction */
5859 f_init_raw(testcasename(), info_ind);
5860
5861 /* Make sure we are not affected by full cache from previous tests */
5862 f_pcuvty_flush_neigh_caches();
5863
5864 /* Establish BSSGP connection to the PCU */
5865 f_bssgp_establish();
5866 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5867
5868 /* Send PACKET RESOURCE REQUEST */
5869 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5870 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5871 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5872
5873 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02005874 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5875 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005876
5877 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005878 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 +01005879 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5880 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
Philipp Maier7d187ae2023-06-20 14:38:24 +02005881 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005882 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5883 f_outbound_nacc_rim_tx_resp(info_ind);
5884 timer T := 1.0;
5885 T.start;
5886 alt {
5887 [] RIM.receive {
5888 setverdict(fail, "Received unexpected RIM message");
5889 f_shutdown(__BFILE__, __LINE__);
5890 }
5891 [] T.timeout {
5892 setverdict(pass);
5893 }
5894 }
5895
5896 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005897 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005898
5899 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5900 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5901 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5902 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5903 f_shutdown(__BFILE__, __LINE__);
5904 }
5905 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5906 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5907 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5908 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5909 }
5910
5911 f_shutdown(__BFILE__, __LINE__, final := true);
5912}
5913
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005914/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
5915testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
5916 var PollFnCtx pollctx;
5917 var GprsMS ms;
5918 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02005919 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005920 var RlcmacDlBlock dl_block;
5921 var uint32_t sched_fn;
5922 var CtrlMessage rx_ctrl;
5923 var GsmArfcn req_arfcn := 862;
5924 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005925 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005926
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005927 if (use_old_ctrl_iface) {
5928 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5929 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5930 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005931
5932 /* Initialize NS/BSSGP side */
5933 f_init_bssgp();
5934 /* Initialize GPRS MS side */
5935 f_init_gprs_ms();
5936 ms := g_ms[0]; /* We only use first MS in this test */
5937
5938 /* Initialize the PCU interface abstraction */
5939 f_init_raw(testcasename(), info_ind);
5940
5941 /* Make sure we are not affected by full cache from previous tests */
5942 f_pcuvty_flush_neigh_caches();
5943
5944 /* Establish BSSGP connection to the PCU */
5945 f_bssgp_establish();
5946 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5947
5948 /* Send PACKET RESOURCE REQUEST */
5949 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5950 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5951 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5952
5953 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02005954 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5955 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005956
5957 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005958 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 +01005959 /* RIM procedure: */
5960 as_outbound_nacc_rim_resolve(info_ind);
5961
5962 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
5963 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
Philipp Maier7d187ae2023-06-20 14:38:24 +02005964 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005965
5966 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
5967 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5968
5969 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5970 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5971 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5972 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5973 f_shutdown(__BFILE__, __LINE__);
5974 }
5975 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5976 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5977 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5978 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5979 }
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02005980
5981 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005982}
5983
5984/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
5985testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
5986 var PollFnCtx pollctx;
5987 var GprsMS ms;
5988 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02005989 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005990 var RlcmacDlBlock dl_block;
5991 var uint32_t sched_fn;
5992 var CtrlMessage rx_ctrl;
5993 var GsmArfcn req_arfcn := 862;
5994 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005995 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005996
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005997 if (use_old_ctrl_iface) {
5998 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5999 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6000 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006001
6002 /* Initialize NS/BSSGP side */
6003 f_init_bssgp();
6004 /* Initialize GPRS MS side */
6005 f_init_gprs_ms();
6006 ms := g_ms[0]; /* We only use first MS in this test */
6007
6008 /* Initialize the PCU interface abstraction */
6009 f_init_raw(testcasename(), info_ind);
6010
6011 /* Make sure we are not affected by full cache from previous tests */
6012 f_pcuvty_flush_neigh_caches();
6013
6014 /* Establish BSSGP connection to the PCU */
6015 f_bssgp_establish();
6016 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6017
6018 /* Send PACKET RESOURCE REQUEST */
6019 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6020 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6021 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6022
6023 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006024 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6025 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006026
6027 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006028 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 +01006029 /* RIM procedure: */
6030 as_outbound_nacc_rim_resolve(info_ind);
6031
6032 /* Announce SI back to MS, continue NACC procedure */
6033 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6034
6035 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006036 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006037
6038 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6039 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6040 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6041 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6042 f_shutdown(__BFILE__, __LINE__);
6043 }
6044 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6045 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6046 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6047 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6048 }
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02006049
6050 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006051}
6052
6053/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
6054testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
6055 var PollFnCtx pollctx;
6056 var GprsMS ms;
6057 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02006058 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006059 var RlcmacDlBlock dl_block;
6060 var uint32_t sched_fn;
6061 var CtrlMessage rx_ctrl;
6062 var GsmArfcn req_arfcn := 862;
6063 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006064 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006065
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006066 if (use_old_ctrl_iface) {
6067 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6068 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6069 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006070
6071 /* Initialize NS/BSSGP side */
6072 f_init_bssgp();
6073 /* Initialize GPRS MS side */
6074 f_init_gprs_ms();
6075 ms := g_ms[0]; /* We only use first MS in this test */
6076
6077 /* Initialize the PCU interface abstraction */
6078 f_init_raw(testcasename(), info_ind);
6079
6080 /* Make sure we are not affected by full cache from previous tests */
6081 f_pcuvty_flush_neigh_caches();
6082
6083 /* Establish BSSGP connection to the PCU */
6084 f_bssgp_establish();
6085 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6086
6087 /* Send PACKET RESOURCE REQUEST */
6088 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6089 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6090 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6091
6092 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006093 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6094 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006095
6096 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006097 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 +01006098 /* RIM procedure: */
6099 as_outbound_nacc_rim_resolve(info_ind);
6100
6101 /* Announce SI back to MS, continue NACC procedure */
6102 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6103
6104 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6105 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6106 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6107 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6108 f_shutdown(__BFILE__, __LINE__);
6109 }
6110 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006111 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006112
6113 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6114 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6115 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6116 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6117 }
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02006118
6119 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006120}
6121
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006122/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
6123 * while waiting for CTRL resolution */
6124testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
6125 var PollFnCtx pollctx;
6126 var GprsMS ms;
6127 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02006128 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006129 var RlcmacDlBlock dl_block;
6130 var uint32_t sched_fn;
6131 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006132 var charstring ctrl_var;
6133 var PCUIF_Message pcu_msg;
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006134 var GsmArfcn req_arfcn := 862;
6135 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006136 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006137
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006138 if (use_old_ctrl_iface) {
6139 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6140 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6141 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006142
6143 /* Initialize NS/BSSGP side */
6144 f_init_bssgp();
6145 /* Initialize GPRS MS side */
6146 f_init_gprs_ms();
6147 ms := g_ms[0]; /* We only use first MS in this test */
6148
6149 /* Initialize the PCU interface abstraction */
6150 f_init_raw(testcasename(), info_ind);
6151
6152 /* Make sure we are not affected by full cache from previous tests */
6153 f_pcuvty_flush_neigh_caches();
6154
6155 /* Establish BSSGP connection to the PCU */
6156 f_bssgp_establish();
6157 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6158
6159 /* Send PACKET RESOURCE REQUEST */
6160 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6161 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6162 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6163
6164 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006165 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6166 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006167
6168 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006169 if (use_old_ctrl_iface) {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07006170 f_ctrl_rx_nacc_rac_ci_req(rx_ctrl, info_ind, req_arfcn, req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006171 } else {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07006172 f_pcuif_rx_nacc_rac_ci_req(pcu_msg, info_ind, req_arfcn, req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006173 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006174 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006175 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6176 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006177 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006178 if (use_old_ctrl_iface) {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07006179 f_ctrl_tx_nacc_rac_ci_rsp(rx_ctrl);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006180 } else {
Vadim Yanitskiy8a15b452023-02-13 01:39:57 +07006181 f_pcuif_tx_nacc_rac_ci_rsp(pcu_msg);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006182 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006183 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006184 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 +01006185
6186 /* And finally everything continues as usual with RIN procedure */
6187 as_outbound_nacc_rim_resolve(info_ind);
6188
6189 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01006190 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006191
6192 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6193 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6194 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6195 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6196 f_shutdown(__BFILE__, __LINE__);
6197 }
6198 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6199 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6200 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6201 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6202 }
6203
6204 f_shutdown(__BFILE__, __LINE__, final := true);
6205}
6206
6207/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
6208 * while waiting for SI resolution */
6209testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
6210 var PollFnCtx pollctx;
6211 var GprsMS ms;
6212 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02006213 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006214 var RlcmacDlBlock dl_block;
6215 var uint32_t sched_fn;
6216 var CtrlMessage rx_ctrl;
6217 var GsmArfcn req_arfcn := 862;
6218 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006219 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006220
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006221 if (use_old_ctrl_iface) {
6222 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6223 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6224 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006225
6226 /* Initialize NS/BSSGP side */
6227 f_init_bssgp();
6228 /* Initialize GPRS MS side */
6229 f_init_gprs_ms();
6230 ms := g_ms[0]; /* We only use first MS in this test */
6231
6232 /* Initialize the PCU interface abstraction */
6233 f_init_raw(testcasename(), info_ind);
6234
6235 /* Make sure we are not affected by full cache from previous tests */
6236 f_pcuvty_flush_neigh_caches();
6237
6238 /* Establish BSSGP connection to the PCU */
6239 f_bssgp_establish();
6240 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6241
6242 /* Send PACKET RESOURCE REQUEST */
6243 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6244 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6245 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6246
6247 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006248 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6249 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006250
6251 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006252 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 +01006253 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
6254 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006255 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6256 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006257 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
6258 f_outbound_nacc_rim_tx_resp(info_ind);
6259
6260 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006261 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 +01006262
6263 /* And finally everything continues as usual with RIN procedure */
6264 as_outbound_nacc_rim_resolve(info_ind);
6265
6266 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01006267 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006268
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 f_shutdown(__BFILE__, __LINE__, final := true);
6282}
6283
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006284/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
6285 * while sending Pkt Neigh Data Change */
6286testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
6287 var PollFnCtx pollctx;
6288 var GprsMS ms;
6289 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02006290 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006291 var RlcmacDlBlock dl_block;
6292 var uint32_t sched_fn;
6293 var CtrlMessage rx_ctrl;
6294 var GsmArfcn req_arfcn := 862;
6295 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006296 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006297
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006298 if (use_old_ctrl_iface) {
6299 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6300 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6301 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006302
6303 /* Initialize NS/BSSGP side */
6304 f_init_bssgp();
6305 /* Initialize GPRS MS side */
6306 f_init_gprs_ms();
6307 ms := g_ms[0]; /* We only use first MS in this test */
6308
6309 /* Initialize the PCU interface abstraction */
6310 f_init_raw(testcasename(), info_ind);
6311
6312 /* Make sure we are not affected by full cache from previous tests */
6313 f_pcuvty_flush_neigh_caches();
6314
6315 /* Establish BSSGP connection to the PCU */
6316 f_bssgp_establish();
6317 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6318
6319 /* Send PACKET RESOURCE REQUEST */
6320 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6321 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6322 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6323
6324 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006325 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6326 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006327
6328 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006329 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 +01006330 /* RIM procedure: */
6331 as_outbound_nacc_rim_resolve(info_ind);
6332
6333 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
6334 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
Philipp Maier7d187ae2023-06-20 14:38:24 +02006335 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6336 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006337
6338 /* It should trigger RAC_CI resolution to start again: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006339 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 +01006340 /* RIM procedure: */
6341 as_outbound_nacc_rim_resolve(info_ind);
6342 /* Transmit SI back to MS */
6343 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
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 }
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02006356
6357 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006358}
6359
6360/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
6361testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
6362 var PollFnCtx pollctx;
6363 var GprsMS ms;
6364 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02006365 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006366 var RlcmacDlBlock dl_block;
6367 var uint32_t sched_fn;
6368 var CtrlMessage rx_ctrl;
6369 var GsmArfcn req_arfcn := 862;
6370 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006371 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006372
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006373 if (use_old_ctrl_iface) {
6374 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6375 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6376 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006377
6378 /* Initialize NS/BSSGP side */
6379 f_init_bssgp();
6380 /* Initialize GPRS MS side */
6381 f_init_gprs_ms();
6382 ms := g_ms[0]; /* We only use first MS in this test */
6383
6384 /* Initialize the PCU interface abstraction */
6385 f_init_raw(testcasename(), info_ind);
6386
6387 /* Make sure we are not affected by full cache from previous tests */
6388 f_pcuvty_flush_neigh_caches();
6389
6390 /* Establish BSSGP connection to the PCU */
6391 f_bssgp_establish();
6392 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6393
6394 /* Send PACKET RESOURCE REQUEST */
6395 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6396 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6397 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6398
6399 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006400 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6401 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006402
6403 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006404 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 +01006405 /* RIM procedure: */
6406 as_outbound_nacc_rim_resolve(info_ind);
6407
6408 /* Announce SI back to MS, continue NACC procedure */
6409 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6410
6411 /* trigger a Pkt Cell Change Notif with different tgt cell */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006412 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6413 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006414
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006415 /* It should trigger RAC_CI resolution to start again: */
6416 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6417
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006418 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6419 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
6420
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006421 /* RIM procedure: */
6422 as_outbound_nacc_rim_resolve(info_ind);
6423 /* Transmit SI back to MS */
6424 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6425
6426 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6427 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6428 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6429 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6430 f_shutdown(__BFILE__, __LINE__);
6431 }
6432 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6433 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6434 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6435 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6436 }
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02006437
6438 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006439}
6440
6441/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
6442testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
6443 var PollFnCtx pollctx;
6444 var GprsMS ms;
6445 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02006446 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006447 var RlcmacDlBlock dl_block;
6448 var uint32_t sched_fn;
6449 var CtrlMessage rx_ctrl;
6450 var GsmArfcn req_arfcn := 862;
6451 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006452 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006453
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006454 if (use_old_ctrl_iface) {
6455 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6456 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6457 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006458
6459 /* Initialize NS/BSSGP side */
6460 f_init_bssgp();
6461 /* Initialize GPRS MS side */
6462 f_init_gprs_ms();
6463 ms := g_ms[0]; /* We only use first MS in this test */
6464
6465 /* Initialize the PCU interface abstraction */
6466 f_init_raw(testcasename(), info_ind);
6467
6468 /* Make sure we are not affected by full cache from previous tests */
6469 f_pcuvty_flush_neigh_caches();
6470
6471 /* Establish BSSGP connection to the PCU */
6472 f_bssgp_establish();
6473 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6474
6475 /* Send PACKET RESOURCE REQUEST */
6476 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6477 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6478 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6479
6480 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006481 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6482 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006483
6484 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006485 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 +01006486 /* RIM procedure: */
6487 as_outbound_nacc_rim_resolve(info_ind);
6488
6489 /* Announce SI back to MS, continue NACC procedure */
6490 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6491
6492 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6493 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6494 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6495 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6496 f_shutdown(__BFILE__, __LINE__);
6497 }
6498
6499 /* trigger a Pkt Cell Change Notif with different tgt cell */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006500 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6501 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006502
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006503 /* It should trigger RAC_CI resolution to start again: */
6504 /* When using new PCUIF interface for resolution, we must
6505 * PCUIF.receive() here since that's the first message in the PCUIF
6506 * queue that PCU will have sent. Calling other functions doing
6507 * PCUIF.receive() (like f_ms_tx_ul_block() below) will make them fail
6508 * due to unexpected message receive. */
6509 if (not use_old_ctrl_iface) {
6510 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6511 }
6512
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006513 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6514 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6515 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6516 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6517 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006518
6519 /* When using CTRL interface, we must schedule the ACK before (see
6520 * above) blocking here waiting for the resoltion, otherwise we'll be
6521 * too late scheduling by the time the resolution is done. */
6522 if (use_old_ctrl_iface) {
6523 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6524 }
6525
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006526 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6527 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
6528
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006529 /* RIM procedure: */
6530 as_outbound_nacc_rim_resolve(info_ind);
6531 /* Transmit SI back to MS */
6532 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6533
6534 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6535 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6536 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6537 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6538 f_shutdown(__BFILE__, __LINE__);
6539 }
6540 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6541 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6542 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6543 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6544 }
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02006545
6546 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006547}
6548
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006549/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
6550testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
6551 var PollFnCtx pollctx;
6552 var GprsMS ms;
6553 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Philipp Maier7d187ae2023-06-20 14:38:24 +02006554 var template (value) RlcmacUlCtrlMsg cell_chg_notif;
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006555 var RlcmacDlBlock dl_block;
6556 var uint32_t sched_fn, dl_fn;
6557 var CtrlMessage rx_ctrl;
6558 var GsmArfcn req_arfcn := 862;
6559 var uint6_t req_bsic := 43;
6560 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006561 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006562
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006563 if (use_old_ctrl_iface) {
6564 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6565 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6566 }
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006567
6568 /* Initialize NS/BSSGP side */
6569 f_init_bssgp();
6570 /* Initialize GPRS MS side */
6571 f_init_gprs_ms();
6572 ms := g_ms[0]; /* We only use first MS in this test */
6573
6574 /* Initialize the PCU interface abstraction */
6575 f_init_raw(testcasename(), info_ind);
6576
6577 /* Make sure we are not affected by full cache from previous tests */
6578 f_pcuvty_flush_neigh_caches();
6579
6580 /* Establish BSSGP connection to the PCU */
6581 f_bssgp_establish();
6582 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6583
6584 /* Send PACKET RESOURCE REQUEST */
6585 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6586 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6587 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6588
6589 /* Start NACC from MS side */
Philipp Maier7d187ae2023-06-20 14:38:24 +02006590 cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6591 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006592
6593 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006594 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 +01006595 /* RIM procedure: */
6596 as_outbound_nacc_rim_resolve(info_ind);
6597
6598 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
6599 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
6600 f_sleep(0.1);
6601 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
6602 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
6603
6604 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
6605 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
6606 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
6607 * Data with unassigned DL TBF in line above): */
6608 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6609 /* Continue receiving Pkt Cell Neighbor Data */
6610 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
6611
6612 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6613 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6614 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6615 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6616 f_shutdown(__BFILE__, __LINE__);
6617 }
6618 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6619 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6620 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6621 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6622 }
6623
6624 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
6625 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
6626 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
6627 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
6628 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol002658a2023-04-12 18:13:56 +02006629
6630 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006631}
6632
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006633
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006634function f_do_inbound_nacc(template (value) RIM_Routing_Information tx_src_addr, template RIM_Routing_Information rx_dst_addr)
6635runs on RAW_PCU_Test_CT
6636{
6637 var template (value) RAN_Information_Request_RIM_Container req_cont;
6638 var template (value) PDU_BSSGP bssgp_rim_pdu;
6639 var template PDU_BSSGP bssgp_rim_pdu_expect;
6640 var template RAN_Information_RIM_Container rim_cont_expect;
6641 var RIM_Routing_Address bts_addr;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006642
6643 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006644 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 +01006645 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006646 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 +01006647 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02006648 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);
6649 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006650 f_sleep(1.0);
6651
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006652 bts_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006653
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006654 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6655 ts_RIM_Sequence_Number(1),
6656 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6657 ts_RIM_Protocol_Version_Number(1),
6658 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6659 omit);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006660 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
6661 tx_src_addr, req_cont);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006662
6663 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6664 tr_RIM_Sequence_Number(1),
6665 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6666 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006667 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 +01006668 omit);
6669
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006670 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(rx_dst_addr,
6671 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006672 rim_cont_expect);
6673 RIM.send(bssgp_rim_pdu);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006674 timer T := 2.0;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006675 T.start;
6676 alt {
6677 [] RIM.receive(bssgp_rim_pdu_expect) { }
6678 [] RIM.receive {
6679 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6680 }
6681 [] T.timeout {
6682 setverdict(fail, "No BSSGP RIM PDU received");
6683 mtc.stop;
6684 }
6685 }
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006686}
6687/* Send a RIM RAN info request to the PCU and verify the response, we expect
6688 * getting the system information back which we have transfered to the PCU via
6689 * PCUIF on startup. */
6690testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
6691 /* Initialize NS/BSSGP side */
6692 f_init_bssgp();
6693
6694 /* Initialize the PCU interface abstraction */
6695 f_init_raw(testcasename());
6696
6697 /* Establish BSSGP connection to the PCU */
6698 f_bssgp_establish();
6699
6700 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6701 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6702
6703 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6704 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr));
6705
6706 f_shutdown(__BFILE__, __LINE__, final := true);
6707}
6708
6709/* Same as TC_rim_ran_info_req_single_rep, but using an EUTRAN eNodeB ID as
6710 * Routing information, to verify PCU handles that kind of address just fine
6711 */
6712testcase TC_rim_ran_info_req_single_rep_eutran() runs on RAW_PCU_Test_CT {
6713 /* Initialize NS/BSSGP side */
6714 f_init_bssgp();
6715
6716 /* Initialize the PCU interface abstraction */
6717 f_init_raw(testcasename());
6718
6719 /* Establish BSSGP connection to the PCU */
6720 f_bssgp_establish();
6721
6722 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6723 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_enbid(src_cid, tac := 3, gnbid := '12345678123456'O));
6724
6725 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr),
6726 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006727
6728 f_shutdown(__BFILE__, __LINE__, final := true);
6729}
6730
6731/* Same as above, but in this case we simulate the rare case in which the PCU
6732 * has no system information available. We expect getting a response back but
6733 * with no system information inside. */
6734testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006735 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006736 var PCUIF_Message pcu_msg;
6737 timer T := 2.0;
6738
6739 /* Initialize NS/BSSGP side */
6740 f_init_bssgp();
6741
6742 /* Initialize the PCU interface abstraction */
6743 f_init_raw(testcasename(), info_ind);
6744
6745 /* Establish BSSGP connection to the PCU */
6746 f_bssgp_establish();
6747
6748 /* Clear sysinfo from the PCU */
6749 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);
6750 BTS.send(si1_data_ind);
6751 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);
6752 BTS.send(si3_data_ind);
6753 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);
6754 BTS.send(si16_data_ind);
6755 f_sleep(1.0);
6756
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006757 var RIM_Routing_Address dst_addr;
6758 var RIM_Routing_Address src_addr;
6759 var template (value) RAN_Information_Request_RIM_Container req_cont;
6760 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006761 var template PDU_BSSGP bssgp_rim_pdu_expect;
6762 var template RAN_Information_RIM_Container rim_cont_expect;
6763
6764 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 +01006765 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6766 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006767
6768 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6769 ts_RIM_Sequence_Number(1),
6770 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6771 ts_RIM_Protocol_Version_Number(1),
6772 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6773 omit);
6774 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6775 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6776 req_cont);
6777
6778
6779 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6780 tr_RIM_Sequence_Number(1),
6781 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6782 tr_RIM_Protocol_Version_Number(1),
6783 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
6784 omit);
6785
6786 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6787 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6788 rim_cont_expect);
6789 RIM.send(bssgp_rim_pdu);
6790 T.start;
6791 alt {
6792 [] RIM.receive(bssgp_rim_pdu_expect) { }
6793 [] RIM.receive {
6794 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6795 }
6796 [] T.timeout {
6797 setverdict(fail, "No BSSGP RIM PDU received");
6798 mtc.stop;
6799 }
6800 }
6801
6802 f_shutdown(__BFILE__, __LINE__, final := true);
6803}
6804
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006805/* 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 +02006806testcase TC_pdch_energy_saving() runs on RAW_PCU_Test_CT {
6807 var PCUIF_info_ind info_ind;
6808 var template (value) TsTrxBtsNum nr;
6809 var RlcmacDlBlock dl_block;
6810 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006811 var integer ts;
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006812 timer T;
6813
6814 /* Initialize NS/BSSGP side */
6815 f_init_bssgp();
6816
6817 info_ind := valueof(ts_PCUIF_INFO_default);
6818 /* The 2 first TRX are enabled. */
6819 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (2 .. 7));
6820 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6821 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 1);
6822
6823 /* Initialize the PCU interface abstraction */
6824 f_init_raw(testcasename(), info_ind);
6825
6826 /* Establish BSSGP connection to the PCU */
6827 f_bssgp_establish();
6828
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006829 for (ts := 0; ts < 2; ts := ts + 1) {
6830 nr := ts_TsTrxBtsNum(ts_nr := 7, trx_nr := ts, bts_nr := 0, blk_nr := 0);
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006831
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006832 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
6833 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
6834 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), block_nr := nr.blk_nr));
6835 T.start(0.5);
6836 alt {
6837 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
6838 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
6839 omit)) -> value data_msg {
6840 setverdict(pass);
6841 T.stop;
6842 }
6843 [] as_rx_fail_dummy(nr);
6844 [] BTS.receive {
6845 setverdict(fail, "Unexpected block from BTS");
6846 f_shutdown(__BFILE__, __LINE__);
6847 }
6848 [] T.timeout {
6849 setverdict(fail, "Expected IDLE block from BTS");
6850 f_shutdown(__BFILE__, __LINE__);
6851 }
6852 }
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006853 }
6854
6855 f_shutdown(__BFILE__, __LINE__, final := true);
6856}
6857
Oliver Smith3d174882021-09-03 11:38:51 +02006858/* Test stats for available and occupied PDCHs */
6859testcase TC_stat_pdch_avail_occ() runs on RAW_PCU_Test_CT {
6860 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6861 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6862
6863 /* Initialize NS/BSSGP side */
6864 f_init_bssgp();
6865
Oliver Smithedcded22021-09-14 09:26:55 +02006866 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6867 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6868 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6869 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6870 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6871 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
Oliver Smith3d174882021-09-03 11:38:51 +02006872
Oliver Smith72d0c692021-09-08 10:03:52 +02006873 /* Allocate 4 GprsMS instances */
Oliver Smith3d174882021-09-03 11:38:51 +02006874 f_init_gprs_ms(4);
6875
6876 /* Initialize the PCU interface abstraction */
6877 f_init_raw(testcasename(), info_ind);
6878
6879 /* Reset stats */
6880 f_statsd_reset();
6881
6882 /* Establish BSSGP */
6883 f_bssgp_establish();
6884
6885 /* 8 PDCHs available, 0 occupied */
6886 var StatsDExpects expect := {
6887 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006888 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6889 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6890 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
Oliver Smith3d174882021-09-03 11:38:51 +02006891 };
6892 f_statsd_expect(expect);
6893
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006894 /* Establish an Uplink TBF for each GprsMS instance (3x GPRS, 1x EGPRS) */
Oliver Smith3d174882021-09-03 11:38:51 +02006895 f_multi_ms_bssgp_register();
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006896 f_ms_establish_ul_tbf(g_ms[0]);
6897 f_ms_establish_ul_tbf(g_ms[1]);
6898 f_ms_establish_ul_tbf(g_ms[2]);
6899 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 +02006900
6901 /* 4 PDCHs occupied */
6902 expect := {
6903 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006904 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 4, max := 4 },
6905 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 3, max := 3 },
6906 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
Oliver Smith3d174882021-09-03 11:38:51 +02006907 };
6908 f_statsd_expect(expect);
6909
6910 f_shutdown(__BFILE__, __LINE__, final := true);
6911}
6912
Oliver Smithf04762d2021-09-14 17:20:38 +02006913/* Test stats for available and occupied PDCHs, for MS which is not known by
6914 * the PCU (e.g. because it was forgotten due to no interaction, and old DL
6915 * data arrives from SGSN) */
6916function f_tc_stat_pdch_avail_occ_ms_not_known(boolean egprs) runs on RAW_PCU_Test_CT {
6917 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6918 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6919
6920 /* Ensure a deterministic slot allocation of 1 PDCH with MS class 1 */
6921 const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs := {
6922 gprsmultislotclass := '00001'B,
6923 gprsextendeddynalloccap := '0'B
6924 };
6925 const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs := {
6926 egprsmultislotclass := '00001'B,
6927 egprsextendeddynalloccap := '0'B
6928 };
6929 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs := {
6930 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, omit)) };
6931 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs := {
6932 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, bssgp_mscap_egprs)) };
6933
6934 /* Initialize NS/BSSGP side */
6935 f_init_bssgp();
6936
6937 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6938 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6939 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6940 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6941 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6942 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
6943
6944 /* Allocate 1 GprsMS instance */
6945 f_init_gprs_ms(1);
6946
6947 /* Initialize the PCU interface abstraction */
6948 f_init_raw(testcasename(), info_ind);
6949
6950 /* Reset stats */
6951 f_statsd_reset();
6952
6953 /* Establish BSSGP */
6954 f_bssgp_establish();
6955
6956 /* 8 PDCHs available, 0 occupied */
6957 var StatsDExpects expect := {
6958 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6959 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6960 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6961 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6962 };
6963 f_statsd_expect(expect);
6964
6965 var GprsMS ms := g_ms[0]; /* We only use first MS in this test */
6966 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6967
6968 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
6969 var octetstring data := f_rnd_octstring(1400);
6970 if (egprs) {
6971 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs));
6972 } else {
6973 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_gprs));
6974 }
6975 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
6976
6977 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
6978 f_sleep(X2002);
6979
6980 /* 1 PDCH occupied */
6981 if (egprs) {
6982 expect := {
6983 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6984 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6985 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6986 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
6987 };
6988 } else {
6989 expect := {
6990 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6991 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6992 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 1, max := 1 },
6993 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6994 };
6995 }
6996 f_statsd_expect(expect);
6997
6998 /* Clean up */
6999 f_shutdown(__BFILE__, __LINE__, final := true);
7000}
7001testcase TC_stat_pdch_avail_occ_ms_not_known_gprs() runs on RAW_PCU_Test_CT {
7002 f_tc_stat_pdch_avail_occ_ms_not_known(false);
7003}
7004testcase TC_stat_pdch_avail_occ_ms_not_known_egprs() runs on RAW_PCU_Test_CT {
7005 f_tc_stat_pdch_avail_occ_ms_not_known(true);
7006}
7007
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01007008/* Make sure that bts.0.pdch.all_allocated is set when we allocate all resources */
7009testcase TC_ratectr_all_available_allocated() runs on RAW_PCU_Test_CT {
7010 var PCUIF_info_ind info_ind;
7011 var template IARRestOctets rest;
7012 var BIT11 ra11;
7013
7014 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01007015
7016 /* Only the first TRX is enabled. */
7017 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
7018 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
7019
7020 /* Initialize the PCU interface abstraction */
7021 f_init_raw(testcasename(), info_ind);
7022 f_statsd_reset();
7023
7024 var EGPRSPktChRequest req := {
7025 one_phase := {
7026 tag := '0'B,
7027 multislot_class := '10101'B,
7028 priority := '01'B,
7029 random_bits := '101'B
7030 }
7031 };
7032
7033 /* We send 7 requests, the IUT gives us all available USFs (0..6) */
7034 for (var integer i := 0; i < 7; i := i + 1) {
7035 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
7036 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
7037 }
7038
7039 ra11 := enc_EGPRSPktChRequest2bits(req);
7040 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
7041
7042 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrol209dc7d2021-11-15 16:25:08 +01007043 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01007044
7045 /* bts.0.pdch.all_allocated is updated once per second, wait some time to make sure it was updated. */
7046 f_sleep(2.0);
7047 var StatsDExpects expect := {
7048 { name := "TTCN3.bts.0.pdch.all_allocated", mtype := "c", min := 1, max := 1 }
7049 };
7050 f_statsd_expect(expect);
7051
7052 f_shutdown(__BFILE__, __LINE__, final := true);
7053}
7054
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007055control {
7056 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01007057 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007058 execute( TC_ta_ptcch_idle() );
7059 execute( TC_ta_rach_imm_ass() );
Vadim Yanitskiy866f8702021-05-26 14:50:27 +02007060 execute( TC_ta_ul_ack_nack_first_block() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007061 execute( TC_ta_idle_dl_tbf_ass() );
7062 execute( TC_ta_ptcch_ul_multi_tbf() );
7063 execute( TC_cs_lqual_ul_tbf() );
7064 execute( TC_cs_initial_ul() );
7065 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01007066 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01007067 execute( TC_cs_max_dl() );
7068 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01007069 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01007070 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01007071 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01007072 execute( TC_mcs_max_dl() );
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02007073 execute( TC_t3141() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01007074 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02007075 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01007076 execute( TC_x2031_t3191() );
7077 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007078 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01007079 execute( TC_n3105_max_t3195() );
Pau Espin Pedrole8a94442021-11-15 17:05:46 +01007080 execute( TC_t3172_wait_ind_size0() );
7081 execute( TC_t3172_wait_ind_size1() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02007082 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02007083 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02007084 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007085 execute( TC_mo_ping_pong() );
7086 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02007087 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007088 execute( TC_mt_ping_pong() );
7089 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02007090 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007091 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07007092 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02007093 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01007094 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol6844c162022-04-01 15:40:06 +02007095 execute( TC_dl_llc_sapi_priority() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007096 execute( TC_paging_cs_from_bts() );
7097 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
7098 execute( TC_paging_cs_from_sgsn_sign() );
7099 execute( TC_paging_cs_from_sgsn_ptp() );
7100 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
7101 execute( TC_paging_ps_from_sgsn_sign() );
7102 execute( TC_paging_ps_from_sgsn_ptp() );
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01007103 execute( TC_paging_pch_timeout() );
7104
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07007105 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
7106 execute( TC_paging_cs_multi_ms_imsi() );
7107 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02007108 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
7109 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01007110 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
7111 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007112
Pau Espin Pedrol0b6b0d02022-10-25 21:21:02 +02007113 execute( TC_ul_tbf_finished_pkt_dl_ass_pch() );
Pau Espin Pedrol99e00b42022-10-28 13:28:52 +02007114 execute( TC_ul_tbf_1phase_while_dl_ass_pch() );
7115 execute( TC_ul_tbf_2phase_while_dl_ass_pch() );
Pau Espin Pedrol0b6b0d02022-10-25 21:21:02 +02007116
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007117 /* EGPRS specific test cases */
7118 execute( TC_egprs_pkt_chan_req_signalling() );
7119 execute( TC_egprs_pkt_chan_req_one_phase() );
7120 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07007121 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07007122 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07007123 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02007124
7125 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07007126
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01007127 /* Immediate Assignment on AGCH/PCH */
7128 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
7129 execute( TC_pcuif_fh_imm_ass_ul() );
7130 execute( TC_pcuif_fh_imm_ass_dl() );
7131 /* Packet Uplink/Downlink Assignment on PACCH */
7132 execute( TC_pcuif_fh_pkt_ass_ul() );
7133 execute( TC_pcuif_fh_pkt_ass_dl() );
7134 execute( TC_multitrx_multims_alloc() );
7135 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
7136 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
7137 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
Pau Espin Pedrol37604572021-10-15 14:36:16 +02007138 execute( TC_ul_tbf_reestablish_with_pkt_resource_req() );
Pau Espin Pedrol9584ef22023-06-12 14:21:28 +02007139 execute( TC_ul_tbf_reestablish_with_pkt_resource_req_t3168() );
Pau Espin Pedrol59aa1092021-11-15 18:53:34 +01007140 execute( TC_ul_tbf_reestablish_with_pkt_dl_ack_nack() );
7141 execute( TC_ul_tbf_reestablish_with_pkt_dl_ack_nack_egprs() );
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01007142
Pau Espin Pedrole1303052020-11-16 11:13:51 +01007143 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07007144
7145 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01007146 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01007147 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01007148 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01007149 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01007150 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01007151 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01007152 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
7153 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01007154 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
7155 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
7156 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01007157 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
7158 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01007159 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
7160 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
7161 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01007162 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02007163 if (mp_ctrl_neigh_ip != "") { /* PCU using old CTRL neigh addr resolution iface */
7164 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
7165 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
7166 }
Philipp Maierd55fe7e2021-02-01 17:23:40 +01007167
7168 execute( TC_rim_ran_info_req_single_rep() );
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02007169 execute( TC_rim_ran_info_req_single_rep_eutran() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01007170 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02007171
7172 execute (TC_pdch_energy_saving() );
Oliver Smith3d174882021-09-03 11:38:51 +02007173
7174 execute( TC_stat_pdch_avail_occ() );
Oliver Smithf04762d2021-09-14 17:20:38 +02007175 execute( TC_stat_pdch_avail_occ_ms_not_known_gprs() );
7176 execute( TC_stat_pdch_avail_occ_ms_not_known_egprs() );
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01007177 execute( TC_ratectr_all_available_allocated() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007178}
7179
Harald Weltea419df22019-03-21 17:23:04 +01007180}