blob: af84821d17d7c2af36f3228655519718ddb4157b [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 }
563}
564
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200565/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
566 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
567 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
568 * no active TBF exists at the moment of establishment (idle mode). */
569testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100570 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200571
572 /* Initialize NS/BSSGP side */
573 f_init_bssgp();
574
575 /* Initialize the PCU interface abstraction */
576 f_init_raw(testcasename());
577
578 /* Establish BSSGP connection to the PCU */
579 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100580 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200581
582 /* SGSN sends some DL data, PCU will initiate Packet Downlink
583 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100584 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
585 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200586
587 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
588 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
589 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100590 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700591 setverdict(fail, "Timing Advance value doesn't match");
592 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700593
594 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200595}
596
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200597/* Verify that the PCU generates idle blocks in PTCCH/D
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200598 * while neither Uplink nor Downlink TBF is established. */
599testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100600 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200601 timer T;
602
603 /* Initialize the PCU interface abstraction */
604 f_init_raw(testcasename());
605
606 /* Sent an RTS.req for PTCCH/D */
607 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
608 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
609 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100610
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200611 T.start(5.0);
612 alt {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200613 [] BTS.receive(tr_PCUIF_DATA_PTCCH(0,
614 tr_PCUIF_DATA(0, 7, sapi := PCU_IF_SAPI_PTCCH),
615 omit)) {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200616 }
617 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg) {
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +0100618 setverdict(fail, "Expected IDLE block instead of PTCCH/D block");
619 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200620 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200621 [] BTS.receive(PCUIF_Message:?) { repeat; }
622 [] T.timeout {
623 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700624 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200625 }
626 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100627 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700628
629 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200630}
631
632/* Test of correct Timing Advance during an active Uplink TBF.
633 *
634 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
635 * are not continuous and there can be long time gaps between them. This happens
636 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
637 * significantly change between such rare Uplink transmissions, so GPRS introduces
638 * additional mechanisms to control Timing Advance, and thus reduce interference
639 * between neighboring TDMA time-slots.
640 *
641 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
642 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
643 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
644 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
645 * among with the initial Timing Advance value. And here PTCCH comes to play.
646 *
647 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
648 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
649 * continuously. To ensure continuous measurements of the signal propagation
650 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
651 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
652 *
653 * The purpose of this test case is to verify the assignment of Timing Advance
654 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
655 * first establishes several Uplink TBFs, but does not transmit any Uplink
656 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
657 * indications to the PCU, checking the correctness of two received PTCCH/D
658 * messages (period of PTCCH/D is two multi-frames).
659 */
660
661/* List of ToA values for Access Bursts to be sent on PTCCH/U,
662 * each ToA (Timing of Arrival) value is in units of 1/4 of
663 * a symbol (i.e. 1 symbol is 4 QTA units). */
664type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
665const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
666 0, 0, 0, 0,
667 0, 0, 0, 0,
668 0, 0, 0, 0,
669 0, 0, 0, 0
670};
671
672private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
673 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
674runs on RAW_PCU_Test_CT {
675 var RAW_PCU_Event event;
676 var integer ss;
677
678 /* Send Access Bursts on PTCCH/U for every TA Index */
679 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
680 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700681 if (ss < 0) { /* Shall not happen */
682 f_shutdown(__BFILE__, __LINE__);
683 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200684
685 log("Sending an Access Burst on PTCCH/U",
686 ", sub-slot=", ss, " (TAI)",
687 ", fn=", event.data.tdma_fn,
688 ", ToA=", toa_map[ss], " (QTA)");
689 /* TODO: do we care about RA and burst format? */
690 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
691 ra := oct2int('3A'O),
692 is_11bit := 0,
693 burst_type := BURST_TYPE_0,
694 fn := event.data.tdma_fn,
695 arfcn := 871,
696 qta := toa_map[ss],
697 sapi := PCU_IF_SAPI_PTCCH));
698 repeat;
699 }
700}
701
702private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
703 template PTCCHDownlinkMsg t_ta_msg)
704runs on RAW_PCU_Test_CT {
705 var PTCCHDownlinkMsg ta_msg;
706 var PCUIF_Message pcu_msg;
707 timer T;
708
709 /* First, send an RTS.req for the upcoming PTCCH/D block */
710 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
711 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
712 arfcn := 871, block_nr := 0));
713 T.start(2.0);
714 alt {
715 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
716 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
717 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
718 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
719 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
720 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
721 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
722 log("Rx PTCCH/D message: ", ta_msg);
723
724 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700725 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200726 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
727 }
728 }
729 [] BTS.receive { repeat; }
730 [] T.timeout {
731 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200732 }
733 }
734}
735
736testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
737 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200738 var GprsMS ms;
739
740 /* Initialize GPRS MS side */
741 f_init_gprs_ms();
742 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200743
744 /* Initialize the PCU interface abstraction */
745 f_init_raw(testcasename());
746
747 /* Enable forwarding of PTCCH/U TDMA events to us */
748 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
749
750 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
751 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200752 /* Establish an Uplink TBF */
753 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200754
755 /* We expect incremental TFI/USF assignment (dynamic allocation) */
756 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200757 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200758 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700759 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200760 }
761
762 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200763 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200764 setverdict(fail, "Failed to match Timing Advance Index for #", i);
765 /* Keep going, the current OsmoPCU does not assign TA Index */
766 }
767 }
768
769 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
770 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
771 for (var integer i := 0; i < 7; i := i + 1) {
772 /* ToA in units of 1/4 of a symbol */
773 toa_map[i] := (i + 1) * 7 * 4;
774 }
775
776 /* Now we have all 7 TBFs established in one-phase access mode,
777 * however we will not be sending any data on them. Instead, we
778 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
779 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
780 *
781 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
782 * time-slots, so at the moment of scheduling a PTCCH/D block
783 * the PCU has odd number of PTCCH/U Access Bursts received. */
784 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
785 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
786 /* Other values are not known (yet) */
787 tai3_ta := ?));
788 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
789 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
790 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
791 /* Other values are out of our interest */
792 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700793
794 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200795}
796
797/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
798 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
799 *
800 * NOTE: the ranges are intentionally overlapping because OsmoPCU
801 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
802private template integer CS1_lqual_dB_range := (-infinity .. 6);
803private template integer CS2_lqual_dB_range := (5 .. 8);
804private template integer CS3_lqual_dB_range := (7 .. 13);
805private template integer CS4_lqual_dB_range := (12 .. infinity);
806
807testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200808 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200809 var GprsMS ms;
810 var uint32_t unused_fn, sched_fn;
811 var uint4_t cv;
812
813 /* Initialize GPRS MS side */
814 f_init_gprs_ms();
815 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200816
817 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100818 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200819
820 f_pcuvty_set_allowed_cs_mcs();
821 f_pcuvty_set_link_quality_ranges();
822
823 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200824 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200825
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200826
827 /* The actual / old link quality values. We need to keep track of the old
828 * (basically previous) link quality value, because OsmoPCU actually
829 * changes the coding scheme if not only the actual, but also the old
830 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200831 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200832 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200833
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200834 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +0200835 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200836 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
837 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200838 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200839 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
840 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
841 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200842
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200843 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
844 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200845 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200846 lqual_old := ms.lqual_cb;
847 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200848
849 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200850 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
851 if (i > g_bs_cv_max) {
852 cv := 15;
853 } else {
854 cv := i;
855 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200856
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200857 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
858
859 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
860 f_rx_rlcmac_dl_block(dl_block, unused_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +0700861 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200862 continue;
863 }
864 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
865 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
866 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
867 f_shutdown(__BFILE__, __LINE__);
868 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200869
870 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
871 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
872
873 /* Match the received Channel Coding Command. Since we are increasing
874 * the link quality value on each iteration and not decreasing, there
875 * is no need to check the both old and current link quality values. */
876 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200877 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200878 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
879 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
880 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
881 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
882 }
883
884 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
885 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200886 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200887 }
888 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700889
890 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200891}
892
893/* Test the max UL CS set by VTY works fine */
894testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200895 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200896 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200897 var uint32_t unused_fn, sched_fn;
898 var GprsMS ms;
899
900 /* Initialize GPRS MS side */
901 f_init_gprs_ms();
902 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200903
904 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100905 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200906
907 /* Set initial UL CS to 3 */
908 g_cs_initial_ul := 3;
909 f_pcuvty_set_allowed_cs_mcs();
910 f_pcuvty_set_link_quality_ranges();
911
912 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200913 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200914
915 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200916 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200917
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200918 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +0200919 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200920 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
921 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200922 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200923 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
924 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
925 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200926
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200927 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
928 while (true) {
929 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
930 f_rx_rlcmac_dl_block(dl_block, unused_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +0700931 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200932 continue;
933 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200934
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200935 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
936 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
937 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
938 f_shutdown(__BFILE__, __LINE__);
939 break;
940 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200941
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200942 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200943 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200944 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200945 if (last_ch_coding != CH_CODING_CS3) {
946 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200947 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200948 }
949
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200950 /* Remaining UL blocks are used to make sure regardless of initial
951 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200952 /* 0 dB, make sure we downgrade CS */
953 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200954 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200955 f_ms_tx_ul_data_block_multi(ms, 5);
956 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
957 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
958 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200959
960 if (last_ch_coding != CH_CODING_CS1) {
961 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200962 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200963 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700964
965 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200966}
967
968/* Test the max UL CS set by VTY works fine */
969testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200970 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200971 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200972 var uint32_t unused_fn, sched_fn;
973 var GprsMS ms;
974
975 /* Initialize GPRS MS side */
976 f_init_gprs_ms();
977 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200978
979 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100980 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200981
982 /* Set maximum allowed UL CS to 3 */
983 g_cs_max_ul := 3;
984 f_pcuvty_set_allowed_cs_mcs();
985 f_pcuvty_set_link_quality_ranges();
986
987 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200988 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200989
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200990 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +0200991 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200992 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
993 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200994 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200995 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
996 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
997 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200998
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200999 ms.lqual_cb := 40*10; /* 40 dB */
1000 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001001
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001002 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1003 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001004
1005 if (last_ch_coding != CH_CODING_CS3) {
1006 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +02001007 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001008 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001009
1010 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001011}
1012
Pau Espin Pedrol75122592020-11-03 15:22:59 +01001013/* Test the initial DL CS set by VTY works fine */
1014testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
1015 var octetstring data := f_rnd_octstring(10);
1016 var CodingScheme exp_dl_cs_mcs;
1017 var RlcmacDlBlock dl_block;
1018 var uint32_t poll_fn;
1019 var GprsMS ms;
1020
1021 /* Initialize NS/BSSGP side */
1022 f_init_bssgp();
1023 /* Initialize GPRS MS side */
1024 f_init_gprs_ms();
1025 ms := g_ms[0]; /* We only use first MS in this test */
1026
1027 /* Initialize the PCU interface abstraction */
1028 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1029
1030 /* Set initial allowed DL CS to 3 */
1031 g_cs_initial_dl := 3;
1032 exp_dl_cs_mcs := CS_3;
1033 /* Set maximum allowed UL CS to 4 */
1034 g_cs_max_dl := 4;
1035 f_pcuvty_set_allowed_cs_mcs();
1036 f_pcuvty_set_link_quality_ranges();
1037
1038 /* Establish BSSGP connection to the PCU */
1039 f_bssgp_establish();
1040 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1041
1042 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1043 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1044 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1045
1046 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1047 f_sleep(X2002);
1048 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1049
1050 /* ACK the DL block */
1051 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1052 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1053 f_dl_block_ack_fn(dl_block, poll_fn));
1054
1055 f_shutdown(__BFILE__, __LINE__, final := true);
1056}
1057
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001058/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001059function f_dl_data_exp_cs(template (present) CodingScheme exp_final_cs := ?, template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001060 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001061 var RlcmacDlBlock prev_dl_block, dl_block;
1062 var uint32_t ack_fn;
1063 var uint32_t fn;
1064 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001065 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001066 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001067 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
1068 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001069 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001070
1071 if (using_egprs) {
1072 exp_tmp_csmcs := mcs_egprs_any;
1073 bsn_mod := 2048;
1074 } else {
1075 exp_tmp_csmcs := cs_gprs_any;
1076 bsn_mod := 128;
1077 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001078
1079 /* Establish BSSGP connection to the PCU */
1080 f_bssgp_establish();
1081
1082 ms := g_ms[0]; /* We only use first MS in this test */
1083 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1084
1085 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001086 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001087 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1088
1089 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1090 f_sleep(X2002);
1091
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001092 for (var integer i := 0; i < 800; i := i + 1) {
1093 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001094 f_rx_rlcmac_dl_block(dl_block, fn);
1095
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07001096 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001097 /* No more data to receive, done */
1098 break;
1099 }
1100
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001101 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001102
1103 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001104 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001105
1106 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001107 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001108 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001109 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, using_egprs), ack_fn);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001110 if (tx_data_remain != 0) {
1111 /* Submit more data from time to time to keep the TBF ongoing */
1112 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1113 tx_data_remain := tx_data_remain - 1;
1114 }
1115 }
1116 prev_dl_block := dl_block;
1117 }
1118
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001119 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1120 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001121
1122
1123 f_shutdown(__BFILE__, __LINE__, final := true);
1124}
1125
1126/* Verify DL CS above "cs max" set by VTY is never used */
1127testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1128 /* Initialize NS/BSSGP side */
1129 f_init_bssgp();
1130 /* Initialize GPRS MS side */
1131 f_init_gprs_ms();
1132
1133 /* Initialize the PCU interface abstraction */
1134 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1135
1136 /* Set maximum allowed DL CS to 3 */
1137 g_cs_initial_dl := 1;
1138 g_cs_max_dl := 3;
1139 f_pcuvty_set_allowed_cs_mcs();
1140 f_pcuvty_set_link_quality_ranges();
1141
1142 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1143}
1144
1145/* Check DL CS4 is used in good link conditions if allowed by config */
1146testcase TC_dl_cs1_to_cs4() runs on RAW_PCU_Test_CT {
1147 /* Initialize NS/BSSGP side */
1148 f_init_bssgp();
1149 /* Initialize GPRS MS side */
1150 f_init_gprs_ms();
1151
1152 /* Initialize the PCU interface abstraction */
1153 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1154
1155 /* Set initial DL CS to 1 & maximum allowed DL CS to 4 */
1156 g_cs_initial_dl := 1;
1157 g_cs_max_dl := 4;
1158 f_pcuvty_set_allowed_cs_mcs();
1159 f_pcuvty_set_link_quality_ranges();
1160
1161 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1162}
1163
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001164/* Test the initial UL MCS set by VTY works fine */
1165testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1166 var RlcmacDlBlock dl_block;
1167 var PollFnCtx pollctx;
1168 var EgprsChCodingCommand last_ch_coding;
1169 var uint32_t unused_fn, sched_fn;
1170 var GprsMS ms;
1171 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001172
1173 /* Initialize GPRS MS side */
1174 f_init_gprs_ms();
1175 ms := g_ms[0]; /* We only use first MS in this test */
1176
1177 /* Initialize the PCU interface abstraction */
1178 f_init_raw(testcasename());
1179
1180 /* Set initial UL MCS to 3 */
1181 g_mcs_initial_ul := 3;
1182 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1183 f_pcuvty_set_allowed_cs_mcs();
1184 f_pcuvty_set_link_quality_ranges();
1185
1186 /* Take lqual (dB->cB) so that we stay in that MCS */
1187 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1188
1189 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001190 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_egprs_def));
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001191
1192 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1193 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1194 f_shutdown(__BFILE__, __LINE__);
1195 }
1196
1197 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1198 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1199
1200 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1201 while (true) {
1202 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1203 f_rx_rlcmac_dl_block(dl_block, unused_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07001204 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001205 continue;
1206 }
1207
1208 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1209 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1210 f_shutdown(__BFILE__, __LINE__);
1211 break;
1212 }
1213
1214 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1215 break;
1216 }
1217 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1218 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1219 f_shutdown(__BFILE__, __LINE__);
1220 }
1221
1222 /* Remaining UL blocks are used to make sure regardless of initial
1223 * lqual, we can go lower at any time
1224 * 0 dB, make sure we downgrade MCS */
1225 ms.lqual_cb := 0;
1226 /* 5 UL blocks, check we are in same initial MCS: */
1227 f_ms_tx_ul_data_block_multi(ms, 5);
1228 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1229 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1230 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1231
1232 if (last_ch_coding != CH_CODING_MCS1) {
1233 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1234 f_shutdown(__BFILE__, __LINE__);
1235 }
1236
1237 f_shutdown(__BFILE__, __LINE__, final := true);
1238}
1239
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001240/* Test the maximum UL MCS set by VTY works fine */
1241testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1242 var RlcmacDlBlock dl_block;
1243 var EgprsChCodingCommand last_ch_coding;
1244 var PollFnCtx pollctx;
1245 var uint32_t unused_fn, sched_fn;
1246 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001247
1248 /* Initialize GPRS MS side */
1249 f_init_gprs_ms();
1250 ms := g_ms[0]; /* We only use first MS in this test */
1251
1252 /* Initialize the PCU interface abstraction */
1253 f_init_raw(testcasename());
1254
1255 /* Set maximum allowed UL MCS to 5 */
1256 g_mcs_max_ul := 5;
1257 f_pcuvty_set_allowed_cs_mcs();
1258 f_pcuvty_set_link_quality_ranges();
1259
1260 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001261 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_egprs_def));
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001262 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1263 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1264
1265 ms.lqual_cb := 40*10; /* 40 dB */
1266 f_ms_tx_ul_data_block_multi(ms, 16);
1267
1268 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1269 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1270
1271 if (last_ch_coding != CH_CODING_MCS5) {
1272 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1273 f_shutdown(__BFILE__, __LINE__);
1274 }
1275
1276 f_shutdown(__BFILE__, __LINE__, final := true);
1277}
1278
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001279/* Test the initial DL CS set by VTY works fine */
1280testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1281 var octetstring data := f_rnd_octstring(10);
1282 var CodingScheme exp_dl_cs_mcs;
1283 var RlcmacDlBlock dl_block;
1284 var uint32_t poll_fn;
1285 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001286
1287 /* Initialize NS/BSSGP side */
1288 f_init_bssgp();
1289 /* Initialize GPRS MS side */
1290 f_init_gprs_ms();
1291 ms := g_ms[0]; /* We only use first MS in this test */
1292
1293 /* Initialize the PCU interface abstraction */
1294 f_init_raw(testcasename());
1295
1296 /* Set initial allowed DL MCS to 3 */
1297 g_mcs_initial_dl := 3;
1298 exp_dl_cs_mcs := MCS_3;
1299 /* Set maximum allowed DL MCS to 4 */
1300 g_mcs_max_dl := 4;
1301 f_pcuvty_set_allowed_cs_mcs();
1302 f_pcuvty_set_link_quality_ranges();
1303
1304 /* Establish BSSGP connection to the PCU */
1305 f_bssgp_establish();
1306 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1307
1308 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001309 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001310 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1311
1312 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1313 f_sleep(X2002);
1314 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1315
1316 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001317 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1318 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, ischosen(dl_block.data_egprs)),
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001319 f_dl_block_ack_fn(dl_block, poll_fn));
1320
1321 f_shutdown(__BFILE__, __LINE__, final := true);
1322}
1323
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001324/* Verify DL MCS above "mcs max" set by VTY is never used */
1325testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1326 /* Initialize NS/BSSGP side */
1327 f_init_bssgp();
1328 /* Initialize GPRS MS side */
1329 f_init_gprs_ms();
1330
1331 /* Initialize the PCU interface abstraction */
1332 f_init_raw(testcasename());
1333
1334 /* Set maximum allowed DL CS to 3 */
1335 g_mcs_initial_dl := 1;
1336 g_mcs_max_dl := 3;
1337 f_pcuvty_set_allowed_cs_mcs();
1338 f_pcuvty_set_link_quality_ranges();
1339
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001340 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_mcs_max_dl, true), bssgp_ms_racap_egprs_def);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001341}
1342
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02001343/* Verify PCU drops TBF after some time of inactivity. */
1344testcase TC_t3141() runs on RAW_PCU_Test_CT {
1345 var PCUIF_info_ind info_ind;
1346 var template (value) TsTrxBtsNum nr;
1347 var BTS_PDTCH_Block data_msg;
1348 var GprsMS ms;
1349 var uint3_t rx_usf;
1350 timer T_3141 := 1.0;
1351 var boolean ul_tbf_usf_req := false;
1352
1353 /* Initialize NS/BSSGP side */
1354 f_init_bssgp();
1355 /* Initialize GPRS MS side */
1356 f_init_gprs_ms();
1357 ms := g_ms[0]; /* We only use first MS in this test */
1358
1359 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1360 /* Only use 1 PDCH to simplify test: */
1361 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
1362 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
1363 /* Initialize the PCU interface abstraction */
1364 f_init_raw(testcasename(), info_ind);
1365
1366 f_vty_config2(PCUVTY, {"pcu"}, "timer T3141 1");
1367
1368 /* Establish BSSGP connection to the PCU */
1369 f_bssgp_establish();
1370 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1371
1372 /* Establish a one-phase access Uplink TBF */
1373 f_ms_establish_ul_tbf(ms);
1374
1375 T_3141.start;
1376
1377 /* Now we wait for PCU to transmit our USF */
1378 nr := ts_TsTrxBtsNum;
1379 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1380 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1381 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1382 block_nr := nr.blk_nr));
1383
1384 alt {
1385 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1386 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1387 ?)) -> value data_msg {
1388 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1389 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1390 f_shutdown(__BFILE__, __LINE__);
1391 }
1392
1393 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1394 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1395 /* PCU requests our USF, transmit WITHOUT tlli to avoid contention resolution success */
1396 ul_tbf_usf_req := true;
1397 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15, with_tlli := false, fn := f_next_pdch_block(data_msg.raw.fn))
1398 } else if (rx_usf == USF_UNUSED) {
1399 if (data_msg.raw.fn >= ms.ul_tbf.start_time_fn) {
1400 if (ul_tbf_usf_req) {
1401 /* TBF was dropped by T3141, success */
1402 setverdict(pass);
1403 break;
1404 } else {
1405 log("PCU never requested USF, unexpected");
1406 f_shutdown(__BFILE__, __LINE__);
1407 }
1408 } /* else: Keep waiting for TBF to be active by network */
1409 } else {
1410 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1411 f_shutdown(__BFILE__, __LINE__);
1412 }
1413
1414 /* Make sure we don't receive a Ul ACK/NACK with TLLI set: */
1415 if (match(data_msg.dl_block,
1416 tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
1417 tr_UlAckNackGprs(tlli := ?,
1418 acknack_desc := ?,
1419 rel99 := *))))
1420 {
1421 log("Received UL ACK/NACK with TLLI set");
1422 f_shutdown(__BFILE__, __LINE__);
1423 }
1424
1425 nr := ts_TsTrxBtsNum;
1426 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1427 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1428 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1429 block_nr := nr.blk_nr));
1430 repeat;
1431 }
Pau Espin Pedrole5fe6e72022-02-22 15:15:00 +01001432 [ul_tbf_usf_req] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1433 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1434 omit)) {
1435 /* TBF was dropped by T3141, and PCU answered with an IDLE block to
1436 our last RTS.req because there's no longer any MS listening on
1437 the TS. */
1438 setverdict(pass);
1439 break;
1440 }
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02001441 [] T_3141.timeout {
1442 log("T_3141 expired but TBF is still active, unexpected");
1443 f_shutdown(__BFILE__, __LINE__);
1444 }
1445 [] BTS.receive {
1446 /* We should never receive non-dummy messages, aka UL ACK/NACK,
1447 * because we never sent the TLLI to the PCU */
1448 setverdict(fail, "Unexpected BTS message");
1449 f_shutdown(__BFILE__, __LINE__);
1450 }
1451 }
1452
1453 f_shutdown(__BFILE__, __LINE__, final := true);
1454}
1455
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001456/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1457 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1458 * T3169. See OS#5033 */
1459testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1460 var PCUIF_info_ind info_ind;
1461 var template (value) TsTrxBtsNum nr;
1462 var BTS_PDTCH_Block data_msg;
1463 var GprsMS ms;
1464 var uint3_t rx_usf;
1465 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1466 var integer n3101 := 0;
1467 timer T_3169 := 1.0;
1468
1469 /* Initialize NS/BSSGP side */
1470 f_init_bssgp();
1471 /* Initialize GPRS MS side */
1472 f_init_gprs_ms();
1473 ms := g_ms[0]; /* We only use first MS in this test */
1474
1475 /* Initialize the PCU interface abstraction */
1476 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1477 info_ind.n3101 := N3101_MAX;
1478 info_ind.t3169 := 1;
1479 f_init_raw(testcasename(), info_ind);
1480
1481 /* Establish BSSGP connection to the PCU */
1482 f_bssgp_establish();
1483 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1484
1485 /* Establish UL TBF */
1486 f_ms_establish_ul_tbf(ms);
1487
1488 /* Now we wait for PCU to transmit our USF */
1489 nr := ts_TsTrxBtsNum;
1490 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1491 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1492 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1493 block_nr := nr.blk_nr));
1494
1495 alt {
1496 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1497 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1498 ?)) -> value data_msg {
1499 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1500 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1501 f_shutdown(__BFILE__, __LINE__);
1502 }
1503
1504 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1505 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1506 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1507 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001508 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1509 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001510 f_shutdown(__BFILE__, __LINE__);
1511 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001512 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001513 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1514 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1515 if (not T_3169.running) {
1516 log("T3169 started");
1517 T_3169.start;
1518 }
1519 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1520 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1521 f_shutdown(__BFILE__, __LINE__);
1522 } else {
1523 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1524 }
1525 nr := ts_TsTrxBtsNum;
1526 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1527 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1528 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1529 block_nr := nr.blk_nr));
1530 repeat;
1531 }
Pau Espin Pedrol907ba202021-11-12 17:25:24 +01001532 /* We may already receive empty (idle) blocks before our own TTCN3 timer
1533 * triggers due to the TBF being released. Keep going until our T_3169 triggers. */
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01001534 [n3101 == N3101_MAX + 1] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001535 [] T_3169.timeout {
1536 log("T_3169 expired");
1537 /* Done in alt */
1538 }
1539 [] BTS.receive {
1540 setverdict(fail, "Unexpected BTS message");
1541 f_shutdown(__BFILE__, __LINE__);
1542 }
1543 }
1544
1545 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1546 /* USFs as per previous TBF since they were freed at expiration time: */
1547 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1548 var uint5_t old_tfi := ms.ul_tbf.tfi;
1549 f_ms_establish_ul_tbf(ms);
1550 if (old_tfi != ms.ul_tbf.tfi) {
1551 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1552 f_shutdown(__BFILE__, __LINE__);
1553 }
1554 for (var integer i := 0; i < 8; i := i +1) {
1555 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1556 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1557 f_shutdown(__BFILE__, __LINE__);
1558 }
1559 }
1560
1561 f_shutdown(__BFILE__, __LINE__, final := true);
1562}
1563
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001564
1565/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1566 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1567 the final UL ACK sent at us. */
1568testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1569 var PCUIF_info_ind info_ind;
1570 var BTS_PDTCH_Block data_msg;
1571 var RlcmacDlBlock dl_block;
1572 var uint32_t sched_fn;
1573 var template (value) TsTrxBtsNum nr;
1574 var template RlcmacDlBlock exp_ul_ack;
1575 var template UlAckNackGprs exp_ul_ack_sub;
1576 var GprsMS ms;
1577 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1578 var integer N3103 := 0;
1579 timer T_3169 := 1.0;
1580
1581 /* Initialize GPRS MS side */
1582 f_init_gprs_ms();
1583 ms := g_ms[0]; /* We only use first MS in this test */
1584
1585 /* Initialize the PCU interface abstraction */
1586 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1587 info_ind.n3103 := N3103_MAX;
1588 info_ind.t3169 := 1;
1589 f_init_raw(testcasename(), info_ind);
1590
1591 /* Establish an Uplink TBF */
1592 f_ms_establish_ul_tbf(ms);
1593
Pau Espin Pedrol93ae4522021-05-11 15:58:26 +02001594 f_ms_tx_ul_data_block_multi(ms, 5, with_tlli := true);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001595 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1596 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1597
1598 nr := ts_TsTrxBtsNum;
1599 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1600 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1601 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1602 block_nr := nr.blk_nr));
1603 alt {
1604 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1605 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1606 exp_ul_ack)) -> value data_msg {
1607 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1608 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1609 f_shutdown(__BFILE__, __LINE__);
1610 }
1611
1612 nr := ts_TsTrxBtsNum;
1613 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1614 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1615 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1616 block_nr := nr.blk_nr));
1617 N3103 := N3103 + 1;
1618 if (N3103 == N3103_MAX) {
1619 /* At this point in time (N3103_MAX reached), PCU is
1620 * moving the TBF to RELEASE state so no data/ctrl for
1621 * it is tx'ed, hence the dummy blocks: */
1622 T_3169.start;
1623 }
1624 repeat;
1625 }
1626 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1627 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1628 exp_ul_ack)) -> value data_msg {
1629 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1630 f_shutdown(__BFILE__, __LINE__);
1631 }
1632 [] as_ms_rx_ignore_dummy(ms, nr);
Pau Espin Pedrol907ba202021-11-12 17:25:24 +01001633 [] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001634 [T_3169.running] T_3169.timeout {
1635 log("T_3169 timeout");
1636 /* Done in alt, wait for pending RTS initiated previously in
1637 * above case before continuing (expect /* Dummy block): */
1638 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1639 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07001640 tr_RLCMAC_DL_DUMMY_CTRL));
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001641 }
1642 [] BTS.receive {
1643 setverdict(fail, "Unexpected BTS message");
1644 f_shutdown(__BFILE__, __LINE__);
1645 }
1646 }
1647
1648 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1649 * USFs as per previous TBF since they were freed at expiration time: */
1650 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1651 var uint5_t old_tfi := ms.ul_tbf.tfi;
1652 f_ms_establish_ul_tbf(ms);
1653 if (old_tfi != ms.ul_tbf.tfi) {
1654 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1655 f_shutdown(__BFILE__, __LINE__);
1656 }
1657 for (var integer i := 0; i < 8; i := i +1) {
1658 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1659 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1660 f_shutdown(__BFILE__, __LINE__);
1661 }
1662 }
1663
1664 f_shutdown(__BFILE__, __LINE__, final := true);
1665}
1666
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001667/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1668 * point the TBF is no longer available. In order to get to start of T3191, we
1669 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1670 * until TBF release procedure starts after draining DL queue. */
1671testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1672 var PCUIF_info_ind info_ind;
1673 var RlcmacDlBlock dl_block;
1674 var octetstring data1 := f_rnd_octstring(200);
1675 var octetstring data2 := f_rnd_octstring(10);
1676 var uint32_t dl_fn;
1677 var template (value) TsTrxBtsNum nr;
1678 var BTS_PDTCH_Block data_msg;
1679 var GprsMS ms;
1680
1681 /* Initialize NS/BSSGP side */
1682 f_init_bssgp();
1683 /* Initialize GPRS MS side */
1684 f_init_gprs_ms();
1685 ms := g_ms[0]; /* We only use first MS in this test */
1686
1687 /* Initialize the PCU interface abstraction */
1688 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1689 /* Set timer to 1 sec (default 5) to speedup test: */
1690 info_ind.t3191 := 1;
1691 f_init_raw(testcasename(), info_ind);
1692
1693 /* Establish BSSGP connection to the PCU */
1694 f_bssgp_establish();
1695 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1696
1697 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1698 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1699 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1700
1701 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1702 f_sleep(X2002);
1703
1704 while (true) {
1705 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1706
1707 /* Keep Ack/Nack description updated (except for last BSN) */
1708 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1709
1710 if (f_dl_block_rrbp_valid(dl_block)) {
1711 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1712 f_dl_block_ack_fn(dl_block, dl_fn));
1713 break;
1714 }
1715 }
1716
1717 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1718 nr := ts_TsTrxBtsNum;
1719 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1720 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1721 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1722 block_nr := nr.blk_nr));
1723 alt {
1724 [] as_ms_rx_ignore_dummy(ms, nr);
1725 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1726 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1727 ?)) -> value data_msg {
1728 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1729 log("Received FINAL_ACK");
1730 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1731 break;
1732 }
1733 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1734 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1735 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1736 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1737 }
1738 nr := ts_TsTrxBtsNum;
1739 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1740 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1741 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1742 block_nr := nr.blk_nr));
1743 repeat;
1744 }
1745 [] BTS.receive {
1746 setverdict(fail, "Unexpected BTS message");
1747 f_shutdown(__BFILE__, __LINE__);
1748 }
1749 }
1750
1751 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1752 to time out. We simply sleep instead of requesting blocks because
1753 otherwise retransmissions would keep restarting the timer. */
1754 f_sleep(int2float(info_ind.t3191));
1755
1756 /* The TBF should be freed now, so new data should trigger an Assignment: */
1757 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1758 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1759
1760 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1761 f_sleep(X2002);
1762 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1763 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1764 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1765 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1766 f_dl_block_ack_fn(dl_block, dl_fn));
1767
1768 f_shutdown(__BFILE__, __LINE__, final := true);
1769}
1770
1771/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1772testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1773 var PCUIF_info_ind info_ind;
1774 var RlcmacDlBlock dl_block;
1775 var octetstring data1 := f_rnd_octstring(1400);
1776 var octetstring data2 := f_rnd_octstring(10);
1777 var uint32_t dl_fn;
1778 var GprsMS ms;
1779
1780 /* Initialize NS/BSSGP side */
1781 f_init_bssgp();
1782 /* Initialize GPRS MS side */
1783 f_init_gprs_ms();
1784 ms := g_ms[0]; /* We only use first MS in this test */
1785
1786 /* Initialize the PCU interface abstraction */
1787 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1788 /* Set timer to 1 sec (default 5) to speedup test: */
1789 info_ind.t3191 := 1;
1790 f_init_raw(testcasename(), info_ind);
1791
1792 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1793
1794 /* Establish BSSGP connection to the PCU */
1795 f_bssgp_establish();
1796 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1797
1798 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1799 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1800 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1801
1802 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1803 f_sleep(X2002);
1804
1805 /* Send enough DL data to at least be able to DL ACK once (excl the
1806 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1807 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1808 while (true) {
1809 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1810
1811 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1812 log("Received FINAL_ACK");
1813 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1814 break;
1815 }
1816
1817 /* Keep Ack/Nack description updated (except for last BSN) */
1818 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1819
1820 if (f_dl_block_rrbp_valid(dl_block)) {
1821 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1822 f_dl_block_ack_fn(dl_block, dl_fn));
1823 }
1824 }
1825
1826 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1827 to time out. We simply sleep instead of requesting blocks because
1828 otherwise retransmissions would keep restarting the timer. */
1829 f_sleep(int2float(info_ind.t3191));
1830
1831 /* The TBF should be freed now, so new data should trigger an Assignment: */
1832 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1833 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1834
1835 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1836 f_sleep(X2002);
1837 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1838 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1839 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1840 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1841 f_dl_block_ack_fn(dl_block, dl_fn));
1842
1843 f_shutdown(__BFILE__, __LINE__, final := true);
1844}
1845
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001846/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1847 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1848 * T3193) after DL TBF release */
1849testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001850 var RlcmacDlBlock dl_block;
1851 var octetstring data := f_rnd_octstring(10);
1852 var boolean ok;
1853 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001854 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001855 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001856 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1857
1858 /* Initialize NS/BSSGP side */
1859 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001860 /* Initialize GPRS MS side */
1861 f_init_gprs_ms();
1862 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001863
1864 /* Initialize the PCU interface abstraction */
1865 f_init_raw(testcasename());
1866
1867 /* Establish BSSGP connection to the PCU */
1868 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001869 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001870
1871 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001872 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1873 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001874
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001875 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1876 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001877 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001878
1879 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001880 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1881 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1882 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001883
1884 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001885 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001886 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001887 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001888 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001889
1890 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001891
1892 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001893 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001894 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1895 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1896 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001897
1898 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001899}
1900
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001901/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1902 freed and no longer available. Trigger it by sending DL blocks and never DL
1903 ACKing the data (which are requested through RRBP) */
1904testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1905 var PCUIF_info_ind info_ind;
1906 var RlcmacDlBlock dl_block;
1907 var octetstring data1 := f_rnd_octstring(1000);
1908 var octetstring data2 := f_rnd_octstring(10);
1909 var uint32_t dl_fn;
1910 var template (value) TsTrxBtsNum nr;
1911 var BTS_PDTCH_Block data_msg;
1912 var GprsMS ms;
1913 const integer N3105_MAX := 2;
1914 var integer N3105 := 0;
1915 timer T_3195 := 1.0;
1916 var integer num_poll_recv := 0;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001917 var template RlcmacDlBlock dl_block_exp;
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001918
1919 /* Initialize NS/BSSGP side */
1920 f_init_bssgp();
1921 /* Initialize GPRS MS side */
1922 f_init_gprs_ms();
1923 ms := g_ms[0]; /* We only use first MS in this test */
1924
1925 /* Initialize the PCU interface abstraction */
1926 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1927 /* Speedup test: */
1928 info_ind.n3105 := N3105_MAX;
1929 info_ind.t3195 := 1;
1930 f_init_raw(testcasename(), info_ind);
1931
1932 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1933 * MS and retransmitted after the TBF is released and later on created
1934 * (because the MS is reused) */
1935 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1936
1937 /* Establish BSSGP connection to the PCU */
1938 f_bssgp_establish();
1939 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1940
1941 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1942 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1943 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1944
1945 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1946 f_sleep(X2002);
1947
1948 /* Now we go on receiving DL data and not answering RRBP: */
1949 nr := ts_TsTrxBtsNum;
1950 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1951 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1952 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1953 block_nr := nr.blk_nr));
1954 alt {
1955 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1956 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1957 tr_RLCMAC_DATA)) -> value data_msg {
1958 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1959 if (num_poll_recv == 0) {
1960 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1961 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1962 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1963 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1964 } else {
1965 log("Ignoring RRBP ", num_poll_recv);
1966 N3105 := N3105 + 1;
1967 }
1968 num_poll_recv := num_poll_recv + 1;
1969 }
1970
1971 nr := ts_TsTrxBtsNum;
1972 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1973 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1974 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1975 block_nr := nr.blk_nr));
1976 repeat;
1977 }
1978 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001979 * RELEASE state so no data for it is tx'ed, hence the dummy/idle blocks:
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001980 */
1981 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1982 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07001983 tr_RLCMAC_DL_DUMMY_CTRL)) -> value data_msg {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001984 if (not T_3195.running) {
1985 T_3195.start;
1986 /* We even send some new data, nothing should be sent to MS */
1987 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1988 }
1989 nr := ts_TsTrxBtsNum;
1990 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1991 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1992 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1993 block_nr := nr.blk_nr));
1994 repeat;
1995 }
Pau Espin Pedrol518e82f2021-11-12 17:24:33 +01001996 /* We may already receive idle blocks before our own TTCN3 timer
1997 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01001998 [N3105 == N3105_MAX] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001999 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002000 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002001 /* Done in alt, wait for pending RTS initiated previously in
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002002 * above case before continuing (expect empty block): */
2003 dl_block_exp := omit;
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002004 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2005 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02002006 dl_block_exp));
2007 }
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002008 [] BTS.receive {
2009 setverdict(fail, "Unexpected BTS message");
2010 f_shutdown(__BFILE__, __LINE__);
2011 }
2012 }
2013
2014 /* after T_3195 timeout, TBF is released */
2015 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
2016 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2017
2018 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2019 f_sleep(X2002);
2020 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
2021
2022 /* ACK the DL block */
2023 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2024 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2025 f_dl_block_ack_fn(dl_block, dl_fn));
2026
2027 f_shutdown(__BFILE__, __LINE__, final := true);
2028}
2029
Pau Espin Pedrole8a94442021-11-15 17:05:46 +01002030/* Verify configured T3172 is properly transmitted as WAIT_INDICATION in Pkt Access Reject in PACCH. */
2031function f_TC_t3172(integer t3172_ms, BIT1 wait_ind_size) runs on RAW_PCU_Test_CT {
2032 var PCUIF_info_ind info_ind;
2033 var template IARRestOctets rest;
2034 var BIT11 ra11;
2035 var GprsMS ms;
2036 var octetstring data := f_rnd_octstring(10);
2037 var RlcmacDlBlock dl_block;
2038 var template RlcmacDlBlock rej_tmpl;
2039 var uint32_t dl_fn;
2040 var uint32_t sched_fn;
2041 var uint8_t wait_ind_val;
2042
2043 /* Initialize NS/BSSGP side */
2044 f_init_bssgp();
2045 /* Initialize GPRS MS side */
2046 f_init_gprs_ms();
2047 ms := g_ms[0]; /* We only use first MS in this test */
2048
2049 info_ind := valueof(ts_PCUIF_INFO_default);
2050
2051 /* Only the first TRX is enabled. */
2052 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
2053 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
2054
2055 /* Initialize the PCU interface abstraction */
2056 f_init_raw(testcasename(), info_ind);
2057
2058 f_pcuvty_set_timer(3172, t3172_ms);
2059
2060 /* Establish BSSGP connection to the PCU */
2061 f_bssgp_establish();
2062 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2063
2064 var EGPRSPktChRequest req := {
2065 one_phase := {
2066 tag := '0'B,
2067 multislot_class := '10101'B,
2068 priority := '01'B,
2069 random_bits := '101'B
2070 }
2071 };
2072
2073 /* We send 7 requests, the IUT gives us all available USFs (0..6) */
2074 for (var integer i := 0; i < 7; i := i + 1) {
2075 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
2076 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
2077 }
2078
2079 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2080 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2081 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2082
2083 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2084 f_sleep(X2002);
2085 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
2086
2087 /* ACK the DL block */
2088 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2089 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc, false, ts_ChannelReqDescription()),
2090 f_dl_block_ack_fn(dl_block, dl_fn));
2091
2092 /* Since all USF are taken, we should receive a Reject: */
2093
2094 if (wait_ind_size == '0'B) {
2095 wait_ind_val := t3172_ms / 1000;
2096 } else {
2097 wait_ind_val := t3172_ms / 20;
2098 }
2099 rej_tmpl := tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_ACC_REJ(
2100 tr_PacketAccessRejectStruct_TLLI(ms.tlli,
2101 wait_ind_val,
2102 wait_ind_size)));
2103 template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum;
2104 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2105 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2106 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2107 block_nr := nr.blk_nr));
2108 alt {
2109 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2110 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2111 rej_tmpl));
2112 [] BTS.receive {
2113 setverdict(fail, "Unexpected BTS message");
2114 f_shutdown(__BFILE__, __LINE__);
2115 }
2116 }
2117 f_shutdown(__BFILE__, __LINE__, final := true);
2118}
2119testcase TC_t3172_wait_ind_size0() runs on RAW_PCU_Test_CT {
2120 /* size=0 means value is provided in seconds. Due to value being 8
2121 * bit, in the 20ms step case (size=1) the maximum value possible is 20 * 255
2122 * = 5100. Hence, values above it should use size=0 to be able to
2123 * provide values in range. Let's use 6 seconds, 6000ms
2124 */
2125 f_TC_t3172(6000, '0'B);
2126}
2127testcase TC_t3172_wait_ind_size1() runs on RAW_PCU_Test_CT {
2128 f_TC_t3172(3000, '1'B);
2129}
2130
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002131/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
2132testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002133 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002134 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002135 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002136 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002137
2138 /* Initialize NS/BSSGP side */
2139 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002140 /* Initialize GPRS MS side */
2141 f_init_gprs_ms();
2142 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002143
2144 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002145 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002146
2147 /* Establish BSSGP connection to the PCU */
2148 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002149 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002150
2151 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002152 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002153
2154 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002155 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002156 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002157 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002158 f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002159 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2160 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002161 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002162
2163 /* Send enough blocks to test whole procedure: Until Nth block
2164 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
2165 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002166 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002167 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2168 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002169 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002170
2171 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002172 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, total_payload));
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002173
2174 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002175}
2176
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002177/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
2178testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
2179 var RlcmacDlBlock dl_block;
2180 var uint32_t dl_fn, sched_fn;
2181 var octetstring payload;
2182 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002183 var template (value) LlcBlockHdr blk_hdr;
2184 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002185 var integer blk_len;
2186 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002187 var GprsMS ms;
2188
2189 /* Initialize NS/BSSGP side */
2190 f_init_bssgp();
2191 /* Initialize GPRS MS side */
2192 f_init_gprs_ms();
2193 ms := g_ms[0]; /* We only use first MS in this test */
2194
2195 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002196 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002197
2198 /* Establish BSSGP connection to the PCU */
2199 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002200 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002201
2202 /* Establish an Uplink TBF */
2203 f_ms_establish_ul_tbf(ms);
2204
2205 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002206 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002207 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002208 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2209 more := false, e := true);
2210 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002211 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002212 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
2213 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002214 cv := 15,
2215 bsn := ms.ul_tbf.bsn,
2216 blocks := blocks,
2217 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002218 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002219 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002220
2221 /* ACK and check it was received fine */
2222 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2223 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2224 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2225 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002226 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, payload));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002227
2228 /* Test sending LLC PDUS of incrementing size */
2229 var integer max_size := 49;
2230 for (var integer i := 1; i <= max_size; i := i + 1) {
2231 var integer cv;
2232 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
2233 log("Sending DATA.ind with LLC payload size ", i);
2234 if (i < max_size - g_bs_cv_max) {
2235 cv := 15;
2236 } else {
2237 cv := max_size - i;
2238 }
2239
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002240 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
2241 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002242 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002243 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2244 more := false, e := true);
2245 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002246 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002247 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
2248 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002249 cv := cv,
2250 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002251 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002252 f_ultbf_inc_bsn(ms.ul_tbf);
2253 f_ms_tx_ul_block(ms, ul_data);
2254
2255 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002256 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, payload));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002257
2258 /* we will receive UL ACK/NACK from time to time, handle it. */
2259 f_rx_rlcmac_dl_block(dl_block, dl_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07002260 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002261 continue;
2262 }
2263 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2264 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2265 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2266 f_shutdown(__BFILE__, __LINE__);
2267 }
2268
2269 log("Rx Packet Uplink ACK / NACK");
2270 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2271 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2272 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2273 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002274
2275 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002276}
2277
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002278function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2279 var octetstring payload;
2280 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002281 var template (value) LlcBlockHdr blk_hdr;
2282 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002283 var integer block_len, max_valid_data_len;
2284 timer T;
2285
2286 block_len := f_rlcmac_cs_mcs2block_len(cs);
2287 /* We need to send with TLLI since we are in One-Phase Access Contenion
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002288 * resolution), so that's -4 bytes of data, -3 for headers, -1 for LI
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002289 * indicator, -1 for spare bits octet at the end */
2290 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2291 payload := f_rnd_octstring(max_valid_data_len + 1); /* +1 to write LLC data on last padding octet */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002292 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2293 more := false, e := true);
2294 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002295 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2296 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002297 cv := cv,
2298 bsn := ms.ul_tbf.bsn,
2299 blocks := blocks,
2300 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002301 f_ultbf_inc_bsn(ms.ul_tbf);
2302 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2303
2304 T.start(0.5);
2305 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002306 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002307 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2308 f_shutdown(__BFILE__, __LINE__);
2309 }
2310 [] T.timeout {
2311 setverdict(pass);
2312 }
2313 }
2314}
2315/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2316 blocks intentionally contain last byte of data placed in last byte of RLC
2317 containing padding/spare bits, which is incorrect. Spare bits exist and are
2318 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2319 discounting padding in octet" */
2320testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2321 var GprsMS ms;
2322 var integer block_len, max_valid_data_len;
2323
2324 /* Initialize NS/BSSGP side */
2325 f_init_bssgp();
2326 /* Initialize GPRS MS side */
2327 f_init_gprs_ms();
2328 ms := g_ms[0]; /* We only use first MS in this test */
2329
2330 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002331 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002332
2333 /* Establish BSSGP connection to the PCU */
2334 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002335 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002336
2337 /* Establish an Uplink TBF */
2338 f_ms_establish_ul_tbf(ms);
2339
2340 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2341 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2342 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2343
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002344 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002345}
2346
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002347/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2348 * answered, so TBFs for uplink and later for downlink are created.
2349 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002350private function f_TC_mo_ping_pong_1phase_access(template (present) CodingScheme exp_cs_mcs := ?) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002351 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002352 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002353 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002354 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002355 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002356
2357 /* Initialize NS/BSSGP side */
2358 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002359 /* Initialize GPRS MS side */
2360 f_init_gprs_ms();
2361 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002362
2363 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002364 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002365
2366 /* Establish BSSGP connection to the PCU */
2367 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002368 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002369
2370 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002371 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002372
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002373 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002374 contention resolution) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002375 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002376 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2377 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002378 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002379
2380 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002381 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002382
2383 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002384 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2385 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002386
2387 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2388 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002389 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002390
2391 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002392 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2393 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2394 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002395
2396 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002397}
2398
2399/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2400 * answered, so TBFs for uplink and later for downlink are created.
2401 */
2402testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002403 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002404 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002405}
2406
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002407/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2408 * answered, so TBFs for uplink and later for downlink are created.
2409 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002410private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2411 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002412 template (present) CodingScheme exp_ul_cs_mcs := ?,
2413 template (present) CodingScheme exp_dl_cs_mcs := ?)
2414runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002415 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002416 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002417 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002418 var uint32_t sched_fn;
2419 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002420 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002421 var GprsMS ms;
2422
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002423 /* Initialize NS/BSSGP side */
2424 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002425 /* Initialize GPRS MS side */
2426 f_init_gprs_ms();
2427 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002428
2429 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002430 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002431
2432 /* Establish BSSGP connection to the PCU */
2433 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002434 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002435
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002436 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2437 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002438
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002439 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2440 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_cs_mcs);
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002441 f_shutdown(__BFILE__, __LINE__);
2442 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002443
2444 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2445 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002446 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002447
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002448 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002449 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002450
2451 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002452 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002453
2454 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002455 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002456 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2457 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002458 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002459 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002460 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002461
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002462 /* PCU acks the UL data after having received CV=0) */
2463 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2464
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002465 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002466 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_dl_cs_mcs);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002467
2468 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002469 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2470 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, ischosen(dl_block.data_egprs)),
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002471 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002472
2473 f_shutdown(__BFILE__, __LINE__, final := true);
2474}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002475
2476testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002477 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2478 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002479
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002480 f_TC_mo_ping_pong_2phase_access(c_PCUIF_Flags_noMCS, ms_racap_gprs_def, exp_ul_cs_mcs, exp_dl_cs_mcs);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01002481
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002482 var StatsDExpects expect := {
2483 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2484 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2485 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2486 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2487 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2488 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2489 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2490 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2491 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2492 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2493 };
2494 f_statsd_expect(expect);
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002495}
2496
2497testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002498 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2499 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002500
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002501 f_TC_mo_ping_pong_2phase_access(c_PCUIF_Flags_default, ms_racap_egprs_def, exp_ul_cs_mcs, exp_dl_cs_mcs);
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002502
2503 var StatsDExpects expect := {
2504 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2505 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2506 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2507 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2508 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2509 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2510 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2511 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2512 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2513 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2514 };
2515 f_statsd_expect(expect);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002516}
2517
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002518testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2519 /* Configure PCU to force two phase access */
2520 g_force_two_phase_access := true;
2521
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002522 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002523 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002524
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002525 f_TC_mo_ping_pong_2phase_access(c_PCUIF_Flags_noMCS, ms_racap_gprs_def, exp_ul_cs_mcs, exp_dl_cs_mcs);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01002526
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002527 var StatsDExpects expect := {
2528 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2529 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2530 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
2531 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
2532 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2533 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2534 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2535 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2536 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2537 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2538 };
2539 f_statsd_expect(expect);
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002540}
2541
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002542/* Test scenario where SGSN wants to send some data against MS and it is
2543 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2544 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002545private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2546 template (present) CodingScheme exp_cs_mcs := ?)
2547runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002548 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002549 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002550 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002551 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002552 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002553
2554 /* Initialize NS/BSSGP side */
2555 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002556 /* Initialize GPRS MS side */
2557 f_init_gprs_ms();
2558 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002559
2560 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002561 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002562
2563 /* Establish BSSGP connection to the PCU */
2564 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002565 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002566
2567 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002568 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2569 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002570
2571 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2572 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002573 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002574
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002575 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002576 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2577 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, ischosen(dl_block.data_egprs), c_ChReqDesc_default),
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002578 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002579
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002580 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002581 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002582
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002583 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002584 contention resolution) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002585 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002586 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2587 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002588 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002589
2590 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002591 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002592
2593 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002594}
2595
2596testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002597 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002598 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2599}
2600
2601/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2602/* information about the MS */
2603testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002604 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002605 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002606}
2607
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002608/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2609 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2610 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2611 * be transferred).
2612 */
2613testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002614 var RlcmacDlBlock dl_block;
2615 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002616 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002617 var octetstring total_payload;
2618 var octetstring payload;
2619 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002620 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002621 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002622 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002623
2624 /* Initialize NS/BSSGP side */
2625 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002626 /* Initialize GPRS MS side */
2627 f_init_gprs_ms();
2628 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002629
2630 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002631 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002632
2633 /* Establish BSSGP connection to the PCU */
2634 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002635 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002636
2637 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002638 f_ms_establish_ul_tbf(ms);
2639 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002640
2641 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02002642 contention resolution) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002643 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002644 f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002645
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002646 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2647 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002648 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002649 total_payload := payload;
2650
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002651 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2652
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002653 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002654 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002655 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002656 total_payload := total_payload & payload;
2657
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002658 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002659 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002660 total_payload := total_payload & payload;
2661
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002662 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002663 ms.ul_tbf.bsn := ms.ul_tbf.bsn + 1; /* LOST PAYLOAD bsn=3, will be retransmitted, next bsn is increased +2 */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002664 total_payload := total_payload & lost_payload;
2665
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002666 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002667 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002668 total_payload := total_payload & payload;
2669
2670 /* Send enough blocks to finish the transmission (since we were sending BSN=15, send BS_CV_MAX packets) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002671 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002672
2673 /* On CV=0, we'll receive a UL ACK asking about missing block */
2674 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2675 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002676 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2677 tfi := tfi,
2678 cv := 15,
2679 bsn := 3,
2680 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002681 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002682
2683 /* Now final ack is recieved */
2684 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2685 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002686 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002687
2688 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002689 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, total_payload));
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002690
2691 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002692}
2693
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002694/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2695 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2696 * timeout occurs (specified by sent RRBP on DL block). */
2697testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002698 var RlcmacDlBlock dl_block;
2699 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002700 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002701 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002702
2703 /* Initialize NS/BSSGP side */
2704 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002705 /* Initialize GPRS MS side */
2706 f_init_gprs_ms();
2707 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002708
2709 /* Initialize the PCU interface abstraction */
2710 f_init_raw(testcasename());
2711
2712 /* Establish BSSGP connection to the PCU */
2713 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002714 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002715
2716 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002717 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2718 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002719
2720 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2721 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002722 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002723
2724 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2725 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2726 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002727 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002728
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002729 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2730 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002731 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002732
2733 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002734 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2735 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2736 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002737
2738 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002739}
2740
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002741/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2742testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2743 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2744 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002745 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002746 var RlcmacDlBlock dl_block;
2747 var uint32_t ack_fn;
2748 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002749 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002750 timer T := 5.0;
2751
2752 /* Initialize NS/BSSGP side */
2753 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002754 /* Initialize GPRS MS side */
2755 f_init_gprs_ms();
2756 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002757
2758 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002759 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002760
Daniel Willmann535aea62020-09-21 13:27:08 +02002761 f_statsd_reset();
2762
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002763 /* Establish BSSGP connection to the PCU */
2764 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002765 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002766
2767 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002768 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2769 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002770
2771 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2772 f_sleep(X2002);
2773
2774 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2775 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002776 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002777
2778 /* TDMA frame number on which we are supposed to send the ACK */
2779 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2780
2781 /* SGSN sends more blocks during the indicated RRBP */
2782 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2783 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002784 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002785
2786 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2787
2788 /* Make sure this block has the same TFI as was assigned
2789 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002790 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002791 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2792 dl_block.data.mac_hdr.hdr_ext.tfi);
2793 f_shutdown(__BFILE__, __LINE__);
2794 }
2795
2796 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002797 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002798
2799 /* Break if this is the end of RRBP */
2800 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002801 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002802 break;
2803 }
2804 }
2805
2806 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002807 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc), fn := fn);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002808
2809 /* Make sure that the next block (after the Ack) is dummy */
2810 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2811
Daniel Willmann535aea62020-09-21 13:27:08 +02002812 var StatsDExpects expect := {
2813 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2814 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2815 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2816 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2817 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002818 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002819 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2820 };
2821 f_statsd_expect(expect);
2822
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002823 f_shutdown(__BFILE__, __LINE__, final := true);
2824}
2825
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002826/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2827 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2828 * Check "3GPP TS 44.060" Annex B. */
2829testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2830 var RlcmacDlBlock dl_block;
2831 var octetstring dataA := f_rnd_octstring(20);
2832 var octetstring dataB := f_rnd_octstring(13);
2833 var octetstring dataC := f_rnd_octstring(3);
2834 var octetstring dataD := f_rnd_octstring(12);
2835 var uint32_t sched_fn;
2836 var GprsMS ms;
2837 var template (value) RlcmacUlBlock ul_data;
2838
2839 /* Initialize NS/BSSGP side */
2840 f_init_bssgp();
2841 /* Initialize GPRS MS side */
2842 f_init_gprs_ms();
2843 ms := g_ms[0]; /* We only use first MS in this test */
2844
2845 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002846 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002847
2848 /* Establish BSSGP connection to the PCU */
2849 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002850 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002851
2852 /* Establish an Uplink TBF */
2853 f_ms_establish_ul_tbf(ms);
2854
2855 /* Summary of what's transmitted:
2856 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2857 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2858 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2859 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2860 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2861 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2862 */
2863
2864 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002865 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2866 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002867 cv := 3,
2868 bsn := ms.ul_tbf.bsn,
2869 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2870 tlli := ms.tlli);
2871 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2872 * RLCMAC block being sent. */
2873 ul_data.data.mac_hdr.e := true;
2874 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002875 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002876
2877 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002878 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2879 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002880 cv := 2,
2881 bsn := ms.ul_tbf.bsn,
2882 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2883 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2884 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2885 },
2886 tlli := ms.tlli);
2887 f_ultbf_inc_bsn(ms.ul_tbf);
2888 f_ms_tx_ul_block(ms, ul_data);
2889
2890 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002891 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataA));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002892
2893 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002894 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2895 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002896 cv := 1,
2897 bsn := ms.ul_tbf.bsn,
2898 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2899 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2900 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2901 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2902 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2903 },
2904 tlli := ms.tlli);
2905 f_ultbf_inc_bsn(ms.ul_tbf);
2906 f_ms_tx_ul_block(ms, ul_data);
2907
2908 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002909 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2910 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataC));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002911
2912 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002913 ul_data := t_RLCMAC_UL_DATA_TLLI(
2914 cs := CS_1,
2915 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002916 cv := 0,
2917 bsn := ms.ul_tbf.bsn,
2918 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2919 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2920 },
2921 tlli := ms.tlli);
2922 f_ultbf_inc_bsn(ms.ul_tbf);
2923 f_ms_tx_ul_block(ms, ul_data);
2924
2925 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002926 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataD));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002927
2928 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2929 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2930 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2931
2932 f_shutdown(__BFILE__, __LINE__, final := true);
2933}
2934
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002935/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2936 * ACK/NACK is not answered */
2937testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2938 var RlcmacDlBlock dl_block;
2939 var octetstring data1 := f_rnd_octstring(200);
2940 var octetstring data2 := f_rnd_octstring(10);
2941 var uint32_t dl_fn;
2942 var GprsMS ms;
2943 var template (value) TsTrxBtsNum nr;
2944 var BTS_PDTCH_Block data_msg;
2945
2946 /* Initialize NS/BSSGP side */
2947 f_init_bssgp();
2948 /* Initialize GPRS MS side */
2949 f_init_gprs_ms();
2950 ms := g_ms[0]; /* We only use first MS in this test */
2951
2952 /* Initialize the PCU interface abstraction */
2953 f_init_raw(testcasename())
2954
2955 /* Establish BSSGP connection to the PCU */
2956 f_bssgp_establish();
2957 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2958
2959 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2960 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2961 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2962
2963 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2964 f_sleep(X2002);
2965
2966 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2967 while (true) {
2968 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2969
2970 /* Keep Ack/Nack description updated (except for last BSN) */
2971 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2972
2973 if (f_dl_block_rrbp_valid(dl_block)) {
2974 /* Don't transmit DL ACK here on purpose ignore it */
2975 break;
2976 }
2977 }
2978
2979 /* PCU starts whole process again */
2980 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2981
2982 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2983 f_sleep(X2002);
2984
2985 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2986 /* DL data), after that we receive only DUMMY blocks so we are done */
2987 var boolean data_received := false;
2988 nr := ts_TsTrxBtsNum;
2989 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2990 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2991 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2992 block_nr := nr.blk_nr));
2993 alt {
2994 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2995 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07002996 tr_RLCMAC_DL_DUMMY_CTRL)) { /* done */ }
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002997 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2998 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2999 tr_RLCMAC_DATA)) -> value data_msg {
3000 data_received := true;
3001 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
3002 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
3003 log("Received FINAL_ACK");
3004 ms.dl_tbf.acknack_desc.final_ack := '1'B;
3005 }
3006 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
3007 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3008 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
3009 }
3010 nr := ts_TsTrxBtsNum;
3011 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3012 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3013 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3014 block_nr := nr.blk_nr));
3015 repeat;
3016 }
3017 [] BTS.receive {
3018 setverdict(fail, "Unexpected BTS message");
3019 f_shutdown(__BFILE__, __LINE__);
3020 }
3021 }
3022
3023 f_shutdown(__BFILE__, __LINE__, final := true);
3024}
3025
Pau Espin Pedrol6844c162022-04-01 15:40:06 +02003026/* OS#5508: Verify scheduling of LLC frames with SAPI=1 (GMM) takes precedence
3027 * over SAPI2/7/8 which in turn take prececende over others */
3028testcase TC_dl_llc_sapi_priority() runs on RAW_PCU_Test_CT {
3029 var octetstring data_sapi1 := f_pad_oct('01'O, 19, 'ff'O);
3030 var octetstring data_sapi2 := f_pad_oct('02'O, 19, 'ff'O);
3031 var octetstring data_sapi7 := f_pad_oct('07'O, 19, 'ff'O);
3032 var octetstring data_sapi8 := f_pad_oct('08'O, 19, 'ff'O);
3033 var octetstring data_sapi_other := f_pad_oct('03'O, 19, 'ff'O);
3034 var RlcmacDlBlock dl_block;
3035 var uint32_t dl_fn;
3036 var GprsMS ms;
3037 var integer state := 1;
3038
3039 /* Initialize NS/BSSGP side */
3040 f_init_bssgp();
3041 /* Initialize GPRS MS side */
3042 f_init_gprs_ms();
3043 ms := g_ms[0]; /* We only use first MS in this test */
3044
3045 /* Initialize the PCU interface abstraction */
3046 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3047
3048 /* Lock to CS1 to keep same DL RLCMAC data block size: */
3049 g_cs_initial_dl := 1;
3050 g_mcs_max_dl := 1;
3051 f_pcuvty_set_allowed_cs_mcs();
3052
3053 /* Establish BSSGP connection to the PCU */
3054 f_bssgp_establish();
3055 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3056
3057 /* SGSN sends some low prio DL data, PCU will page on CCCH (PCH) */
3058 for (var integer i := 0; i < 10; i := i + 1) {
3059 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi_other));
3060 }
3061 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi2));
3062 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi7));
3063 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi8));
3064 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data_sapi1));
3065 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3066
3067 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3068 f_sleep(X2002);
3069
3070 while (state != 0) {
3071 var OCT1 rx_sapi;
3072 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
3073 rx_sapi := dl_block.data.blocks[0].payload[0];
3074
3075 select (state) {
3076 case(1) { /* We expect the first GMM LLC frame here (SAPI=1, highest prio) */
3077 if (rx_sapi != '01'O) {
3078 setverdict(fail, "Wrong prio: Expected LLC SAPI 1 (GMM) but got ", rx_sapi);
3079 f_shutdown(__BFILE__, __LINE__);
3080 }
3081 state := 2;
3082 }
3083 case(2) { /* We expect the second LLC frame here (SAPI=2, middle prio) */
3084 if (rx_sapi != '02'O) {
3085 setverdict(fail, "Wrong prio: Expected LLC SAPI 2 but got ", rx_sapi);
3086 f_shutdown(__BFILE__, __LINE__);
3087 }
3088 state := 7;
3089 }
3090 case(7) { /* We expect the third LLC frame here (SAPI=7, middle prio) */
3091 if (rx_sapi != '07'O) {
3092 setverdict(fail, "Wrong prio: Expected LLC SAPI 7 but got ", rx_sapi);
3093 f_shutdown(__BFILE__, __LINE__);
3094 }
3095 state := 8;
3096 }
3097 case(8) { /* We expect the fourth LLC frame here (SAPI=8, middle prio) */
3098 if (rx_sapi != '08'O) {
3099 setverdict(fail, "Wrong prio: Expected LLC SAPI 8 but got ", rx_sapi);
3100 f_shutdown(__BFILE__, __LINE__);
3101 }
3102 state := 3;
3103 }
3104 case(3) { /* We expect the other LLC frame here (SAPI=3, lower prio) */
3105 if (rx_sapi != '03'O) {
3106 setverdict(fail, "Wrong prio: Expected LLC SAPI 3 but got ", rx_sapi);
3107 f_shutdown(__BFILE__, __LINE__);
3108 }
3109 state := 0; /* Done, break */
3110 }
3111 }
3112 /* Keep Ack/Nack description updated (except for last BSN) */
3113 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
3114
3115 if (f_dl_block_rrbp_valid(dl_block)) {
3116 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3117 f_dl_block_ack_fn(dl_block, dl_fn));
3118 }
3119 }
3120
3121 f_shutdown(__BFILE__, __LINE__, final := true);
3122}
3123
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003124/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
3125testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003126 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003127 var octetstring data := f_rnd_octstring(10);
3128 var PacketDlAssign dl_tbf_ass;
3129 var RlcmacDlBlock dl_block;
3130 var uint32_t poll_fn;
3131 var uint32_t sched_fn;
3132 var GprsMS ms;
3133 timer T := 5.0;
3134
3135 /* Initialize NS/BSSGP side */
3136 f_init_bssgp();
3137 /* Initialize GPRS MS side */
3138 f_init_gprs_ms();
3139 ms := g_ms[0]; /* We only use first MS in this test */
3140
3141 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003142 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3143 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003144
3145 /* Initialize the PCU interface abstraction */
3146 f_init_raw(testcasename(), info_ind);
3147
3148 /* Establish BSSGP connection to the PCU */
3149 f_bssgp_establish();
3150 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3151
3152 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
3153 through PDCH (no multiblock assignment possible through PCH) */
3154 f_ms_establish_ul_tbf(ms);
3155
3156 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02003157 contention resolution) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003158 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
3159 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003160 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3161 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3162
3163 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
3164 var MultislotCap_GPRS_BSSGP mscap_gprs := {
3165 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3166 gprsextendeddynalloccap := '0'B
3167 };
3168 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
3169 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3170 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
3171 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
3172 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
3173 f_shutdown(__BFILE__, __LINE__);
3174 }
3175 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3176
3177 f_shutdown(__BFILE__, __LINE__, final := true);
3178}
3179
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003180testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003181 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003182 var RlcmacDlBlock dl_block;
3183 var octetstring data := f_rnd_octstring(10);
3184 var PollFnCtx pollctx;
3185 var uint32_t sched_fn;
3186 var GprsMS ms;
3187
3188 var MultislotCap_GPRS mscap_gprs := {
3189 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3190 gprsextendeddynalloccap := '0'B
3191 };
3192 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3193
3194
3195 /* Initialize NS/BSSGP side */
3196 f_init_bssgp();
3197 /* Initialize GPRS MS side */
3198 f_init_gprs_ms();
3199 ms := g_ms[0]; /* We only use first MS in this test */
3200
3201 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003202 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3203 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003204
3205 /* Initialize the PCU interface abstraction */
3206 f_init_raw(testcasename(), info_ind);
3207
3208 /* Establish BSSGP connection to the PCU */
3209 f_bssgp_establish();
3210 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3211
3212 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3213 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3214
3215 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3216 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
3217
3218 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3219 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
3220 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
3221 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
3222 f_shutdown(__BFILE__, __LINE__);
3223 }
3224 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3225
3226 f_shutdown(__BFILE__, __LINE__, final := true);
3227}
3228
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003229testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
3230 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3231 var RlcmacDlBlock dl_block;
3232 var octetstring data := f_rnd_octstring(10);
3233 var PollFnCtx pollctx;
3234 var uint32_t sched_fn;
3235 var GprsMS ms;
3236
3237 var MultislotCap_GPRS mscap_gprs := {
3238 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3239 gprsextendeddynalloccap := '0'B
3240 };
3241 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3242
3243
3244 /* Initialize NS/BSSGP side */
3245 f_init_bssgp();
3246 /* Initialize GPRS MS side */
3247 f_init_gprs_ms();
3248 ms := g_ms[0]; /* We only use first MS in this test */
3249
3250 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003251 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3252 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003253
3254 /* Initialize the PCU interface abstraction */
3255 f_init_raw(testcasename(), info_ind);
3256
3257 /* Establish BSSGP connection to the PCU */
3258 f_bssgp_establish();
3259 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3260
3261 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3262 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3263
3264 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
3265 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
3266 f_shutdown(__BFILE__, __LINE__);
3267 }
3268
3269 f_shutdown(__BFILE__, __LINE__, final := true);
3270}
3271
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003272/* Test scenario where MS wants to request a new TBF once the current one is
3273 * ending, by means of sending a Packet Resource Request on ul slot provided by
3274 * last Pkt Ul ACK's RRBP.
3275 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3276testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003277 var RlcmacDlBlock dl_block;
3278 var octetstring data := f_rnd_octstring(10);
3279 var uint32_t sched_fn;
3280 var uint32_t dl_fn;
3281 var template RlcmacDlBlock acknack_tmpl;
3282 var GprsMS ms;
3283
3284 /* Initialize NS/BSSGP side */
3285 f_init_bssgp();
3286 /* Initialize GPRS MS side */
3287 f_init_gprs_ms();
3288 ms := g_ms[0]; /* We only use first MS in this test */
3289
3290 /* Initialize the PCU interface abstraction */
3291 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003292 f_statsd_reset();
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003293
3294 /* Establish BSSGP connection to the PCU */
3295 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003296 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003297
3298 /* Establish an Uplink TBF */
3299 f_ms_establish_ul_tbf(ms);
3300
3301 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02003302 contention resolution) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003303 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003304
3305 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003306 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003307
3308 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3309 tr_UlAckNackGprs(ms.tlli,
3310 tr_AckNackDescription(final_ack := '1'B),
3311 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3312 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3313
3314 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3315
3316 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07003317 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)), sched_fn);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07003318 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003319 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3320 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3321
3322 /* Send one UL block (without TLLI since we are in Second-Phase Access)
3323 and make sure it is ACKED fine */
3324 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
3325
3326 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003327 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003328
3329 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3330 /* ACK the ACK */
3331 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3332
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003333 var StatsDExpects expect := {
3334 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
3335 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
3336 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
3337 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3338 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
3339 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 1, max := 1 },
3340 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
3341 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
3342 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
3343 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
3344 };
3345 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003346
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003347 f_shutdown(__BFILE__, __LINE__, final := true);
3348}
3349
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003350/* Test scenario where MS wants to request a new TBF once the current one is
3351 * ending, by means of sending a Packet Resource Request on ul slot provided by
3352 * last Pkt Ul ACK's RRBP. new Pkt Ul Ass is never confirmed by the MS in this test.
3353 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3354testcase TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() runs on RAW_PCU_Test_CT {
3355 var PCUIF_info_ind info_ind;
3356 var RlcmacDlBlock dl_block;
3357 var octetstring data := f_rnd_octstring(10);
3358 var uint32_t sched_fn;
3359 var uint32_t dl_fn;
3360 var template (value) TsTrxBtsNum nr;
3361 var BTS_PDTCH_Block data_msg;
3362 var template RlcmacDlBlock acknack_tmpl;
3363 var GprsMS ms;
3364 const integer N3105_MAX := 2;
3365 var integer N3105 := 0;
3366 timer T_3195 := 1.0 + 0.5; /* 0.5: extra offset since we cannot match exactly */
3367
3368 /* Initialize NS/BSSGP side */
3369 f_init_bssgp();
3370 /* Initialize GPRS MS side */
3371 f_init_gprs_ms();
3372 ms := g_ms[0]; /* We only use first MS in this test */
3373
3374 /* Initialize the PCU interface abstraction */
3375 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3376 /* Speedup test: */
3377 info_ind.n3105 := N3105_MAX;
3378 info_ind.t3195 := 1;
3379 f_init_raw(testcasename(), info_ind);
3380
3381 /* Establish BSSGP connection to the PCU */
3382 f_bssgp_establish();
3383 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3384
3385 /* Establish an Uplink TBF */
3386 f_ms_establish_ul_tbf(ms);
3387
3388 /* Send one UL block (with TLLI since we are in One-Phase Access
Pau Espin Pedrol15b2b942022-10-28 15:08:44 +02003389 contention resolution) and make sure it is ACKED fine */
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003390 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
3391
3392 /* UL block should be received in SGSN */
3393 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
3394
3395 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3396 tr_UlAckNackGprs(ms.tlli,
3397 tr_AckNackDescription(final_ack := '1'B),
3398 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3399 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3400
3401 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3402
3403 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
3404 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)), sched_fn);
3405
3406 /* Now Keep ignoring the Pkt Ul Ass on PACCH: */
3407 /* Now we go on receiving DL data and not answering RRBP: */
3408 nr := ts_TsTrxBtsNum;
3409 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3410 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3411 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3412 block_nr := nr.blk_nr));
3413 alt {
3414 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3415 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3416 tr_RLCMAC_UL_PACKET_ASS)) -> value data_msg {
3417 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
3418 log("Ignoring RRBP N3105 ", N3105);
3419 N3105 := N3105 + 1;
3420 }
3421 nr := ts_TsTrxBtsNum;
3422 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3423 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3424 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3425 block_nr := nr.blk_nr));
3426 repeat;
3427 }
3428 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
3429 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
3430 */
3431 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3432 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07003433 tr_RLCMAC_DL_DUMMY_CTRL)) -> value data_msg {
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003434 if (not T_3195.running) {
3435 T_3195.start;
3436 }
3437 nr := ts_TsTrxBtsNum;
3438 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3439 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3440 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3441 block_nr := nr.blk_nr));
3442 repeat;
3443 }
3444 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3445 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3446 omit)) -> value data_msg {
3447 /* We may already receive idle blocks before our own TTCN3 timer
3448 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
3449 nr := ts_TsTrxBtsNum;
3450 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3451 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3452 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3453 block_nr := nr.blk_nr));
3454 repeat;
3455 }
3456 /* We receive Dummy blocks in between Pkt Ul Ass while PCU waits for us to ack it */
3457 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3458 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07003459 tr_RLCMAC_DL_DUMMY_CTRL)) -> value data_msg {
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003460 log("Ignoring Dummy block FN ", data_msg.raw.fn);
3461 nr := ts_TsTrxBtsNum;
3462 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3463 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3464 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3465 block_nr := nr.blk_nr));
3466 repeat;
3467 }
3468 [T_3195.running] T_3195.timeout {
3469 log("T_3195 timeout");
3470 /* Done in alt, wait for pending RTS initiated previously in
3471 * above case before continuing (expect nothing to be sent since there's no active TBF): */
3472 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3473 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3474 omit));
3475 }
3476 [] BTS.receive {
3477 setverdict(fail, "Unexpected BTS message");
3478 f_shutdown(__BFILE__, __LINE__);
3479 }
3480 }
3481
3482 f_shutdown(__BFILE__, __LINE__, final := true);
3483}
3484
Pau Espin Pedrol59aa1092021-11-15 18:53:34 +01003485/* Test scenario where MS wants to request a new UL TBF using a DL (EGPRS) ACK/NACK
3486 * transmitted on ul slot provided by its DL TBF.
3487 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3488function f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(boolean use_egprs) runs on RAW_PCU_Test_CT {
3489 var GprsMS ms;
3490 var octetstring data := f_rnd_octstring(10);
3491 var RlcmacDlBlock dl_block;
3492 var template RlcmacDlBlock rej_tmpl;
3493 var uint32_t dl_fn;
3494 var uint32_t sched_fn;
3495 var template (value) MSRadioAccessCapabilityV_BSSGP racap_tmpl;
3496
3497 if (use_egprs == true) {
3498 racap_tmpl := bssgp_ms_racap_egprs_def;
3499 } else {
3500 racap_tmpl := bssgp_ms_racap_gprs_def;
3501 }
3502
3503 /* Initialize NS/BSSGP side */
3504 f_init_bssgp();
3505 /* Initialize GPRS MS side */
3506 f_init_gprs_ms();
3507 ms := g_ms[0]; /* We only use first MS in this test */
3508 /* Initialize the PCU interface abstraction */
3509 f_init_raw(testcasename());
3510
3511 /* Establish BSSGP connection to the PCU */
3512 f_bssgp_establish();
3513 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3514
3515 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3516 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, racap_tmpl));
3517 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3518
3519 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3520 f_sleep(X2002);
3521 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3522
3523 /* ACK the DL block, asking for new UL TBF by including ChanReqDesc */
3524 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
3525 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, use_egprs, ts_ChannelReqDescription()),
3526 f_dl_block_ack_fn(dl_block, dl_fn));
3527
3528 /* We should receive a Pkt Ul ASS */
3529 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
3530 f_shutdown(__BFILE__, __LINE__, final := true);
3531}
3532testcase TC_ul_tbf_reestablish_with_pkt_dl_ack_nack() runs on RAW_PCU_Test_CT {
3533 f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(false);
3534}
3535testcase TC_ul_tbf_reestablish_with_pkt_dl_ack_nack_egprs() runs on RAW_PCU_Test_CT {
3536 f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(true);
3537}
3538
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003539/* Test CS paging over the BTS<->PCU socket.
3540 * When a (class B or C, not A) MS has an active TBF (or is on the PDCH), the MS can not react on CS paging over CCCH.
3541 * Paging should be send on the PACCH.
3542 *
3543 * 1. Send a Paging Request over PCU socket.
3544 * 2. Send a Ready-To-Send message over PCU socket
3545 * 3. Expect a Paging Frame
3546 */
3547testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003548 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003549 var MobileIdentityLV mi;
3550 var octetstring mi_enc_lv;
3551 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003552 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003553
3554 /* Initialize NS/BSSGP side */
3555 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003556 /* Initialize GPRS MS side */
3557 f_init_gprs_ms();
3558 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003559
3560 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003561 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003562
3563 /* Establish BSSGP connection to the PCU */
3564 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003565 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003566
3567 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003568 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003569
3570 /* build mobile Identity */
3571 mi := valueof(ts_MI_IMSI_LV(imsi));
3572 mi_enc_lv := enc_MobileIdentityLV(mi);
3573 /* Send paging request */
3574 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
3575 sapi :=PCU_IF_SAPI_PDTCH));
3576
3577 /* Receive it on BTS side towards MS */
3578 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3579
3580 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003581 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3582 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3583 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3584 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003585
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003586 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003587}
3588
3589/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
3590 */
3591private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3592runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003593 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003594 var hexstring imsi := f_gen_imsi(42);
3595 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003596 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003597
3598 /* Initialize NS/BSSGP side */
3599 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003600 /* Initialize GPRS MS side */
3601 f_init_gprs_ms();
3602 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003603
3604 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003605 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003606
3607 /* Establish BSSGP connection to the PCU */
3608 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003609 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003610
3611 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003612 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003613
3614 /* Send paging request with or without TMSI */
3615 if (use_ptmsi) {
3616 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3617 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3618 } else {
3619 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3620 }
3621
3622 /* Receive it on BTS side towards MS */
3623 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3624
3625 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003626 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003627 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003628 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3629 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3630 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003631 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003632 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3633 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3634 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003635 }
3636
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003637 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003638}
3639
3640testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3641 f_tc_paging_cs_from_sgsn(0, true);
3642}
3643
3644testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3645 f_tc_paging_cs_from_sgsn(0);
3646}
3647
3648testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003649 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003650}
3651
3652/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3653 */
3654private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3655runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003656 var integer imsi_suff_tx := 423;
3657 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003658 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003659
3660 /* Initialize NS/BSSGP side */
3661 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003662 /* Initialize GPRS MS side */
3663 f_init_gprs_ms();
3664 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003665
Oliver Smith61b4e732021-07-22 08:14:29 +02003666 f_statsd_reset();
3667
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003668 /* Establish BSSGP connection to the PCU */
3669 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003670 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003671
3672 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3673 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3674 if (use_ptmsi) {
3675 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3676 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3677 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3678 } else {
3679 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3680 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3681 }
3682
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003683 var StatsDExpects expect := {
3684 { name := "TTCN3.pcu.sgsn.0.rx_paging_ps", mtype := "c", min := 1, max := 1 },
3685 /* After the PCU receives the paging request from SGSN,
3686 * and it doesn't have any errors, PCU sends it to the
3687 * BTS to do paging over PCH. */
3688 { name := "TTCN3.bts.0.pch.requests", mtype := "c", min := 1, max := 1 }
3689 };
3690 f_statsd_expect(expect);
Oliver Smithfbd39312021-07-27 15:23:39 +02003691}
3692
3693testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3694 /* Initialize the PCU interface abstraction */
3695 f_init_raw(testcasename());
3696
3697 f_tc_paging_ps_from_sgsn(0, true);
Oliver Smith61b4e732021-07-22 08:14:29 +02003698
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003699 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003700}
3701
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003702testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003703 /* Initialize the PCU interface abstraction */
3704 f_init_raw(testcasename());
3705
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003706 f_tc_paging_ps_from_sgsn(0);
Oliver Smithfbd39312021-07-27 15:23:39 +02003707
3708 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003709}
3710
3711testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003712 /* Initialize the PCU interface abstraction */
3713 f_init_raw(testcasename());
3714
Harald Welte5339b2e2020-10-04 22:52:56 +02003715 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Oliver Smithfbd39312021-07-27 15:23:39 +02003716
3717 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003718}
3719
Oliver Smithe1a77c42021-07-28 13:36:09 +02003720testcase TC_paging_pch_timeout() runs on RAW_PCU_Test_CT {
3721 /* Initialize the PCU interface abstraction */
3722 f_init_raw(testcasename());
3723
3724 /* Set T3113 to 1s to shorten the test duration */
3725 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 1");
3726
3727 /* Reset stats and send paging PS request */
3728 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
3729
3730 /* Verify that counter increases when T3113 times out (MS did not start
3731 * TBF to respond to paging). */
3732 f_sleep(1.2);
3733 var StatsDExpects expect := {
3734 { name := "TTCN3.bts.0.pch.requests.timeout", mtype := "c", min := 1, max := 1 }
3735 };
3736 f_statsd_expect(expect);
3737
3738 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 default");
3739 f_shutdown(__BFILE__, __LINE__, final := true);
3740}
3741
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003742/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3743testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3744 var RlcmacDlBlock dl_block;
3745 var octetstring data := f_rnd_octstring(10);
3746 var uint32_t sched_fn;
3747 var uint32_t dl_fn;
3748 var GprsMS ms;
3749
3750 /* Initialize NS/BSSGP side */
3751 f_init_bssgp();
3752 /* Initialize GPRS MS side */
3753 f_init_gprs_ms();
3754 ms := g_ms[0]; /* We only use first MS in this test */
3755
3756 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003757 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003758
Daniel Willmann535aea62020-09-21 13:27:08 +02003759 f_statsd_reset();
3760
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003761 /* Establish BSSGP connection to the PCU */
3762 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003763 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003764
3765 /* Establish an Uplink TBF */
3766 f_ms_establish_ul_tbf(ms);
3767
3768 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003769 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003770 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3771 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3772 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3773
3774 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003775 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003776
3777 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3778 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3779 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3780
3781 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3782 f_sleep(X2002);
3783 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3784
3785 /* ACK the DL block */
3786 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3787 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3788 f_dl_block_ack_fn(dl_block, dl_fn));
3789
Daniel Willmann535aea62020-09-21 13:27:08 +02003790 var StatsDExpects expect := {
3791 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3792 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3793 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3794 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003795 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003796 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003797 };
3798 f_statsd_expect(expect);
3799
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003800 f_shutdown(__BFILE__, __LINE__, final := true);
3801}
3802
3803/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3804testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3805 var RlcmacDlBlock dl_block;
3806 var octetstring data := f_rnd_octstring(10);
3807 var uint32_t sched_fn;
3808 var uint32_t dl_fn;
3809 var GprsMS ms;
3810
3811 /* Initialize NS/BSSGP side */
3812 f_init_bssgp();
3813 /* Initialize GPRS MS side */
3814 f_init_gprs_ms();
3815 ms := g_ms[0]; /* We only use first MS in this test */
3816
3817 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003818 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003819
3820 /* Establish BSSGP connection to the PCU */
3821 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003822 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003823
3824 /* Establish an Uplink TBF */
3825 f_ms_establish_ul_tbf(ms);
3826
3827 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003828 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003829 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3830 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3831 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3832
3833 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003834 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003835
3836 /* Now SGSN sends some DL data with an invalid IMSI */
3837 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3838
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003839 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003840
3841 /* TODO: make sure no data is sent over PCU -> MS */
3842
3843 f_shutdown(__BFILE__, __LINE__, final := true);
3844}
3845
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003846private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3847 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3848 var octetstring data := f_rnd_octstring(6);
3849 var RlcmacDlBlock dl_block;
3850 var GprsMS ms;
3851 var uint32_t fn;
3852
3853 /* Initialize NS/BSSGP side */
3854 f_init_bssgp();
3855 /* Initialize GPRS MS side */
3856 f_init_gprs_ms();
3857 ms := g_ms[0]; /* We only use first MS in this test */
3858
3859 /* Initialize the PCU interface abstraction */
3860 f_init_raw(testcasename());
3861
3862 /* Establish BSSGP connection to the PCU */
3863 f_bssgp_establish();
3864 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3865
3866 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3867 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3868 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3869
3870 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3871 f_sleep(X2002);
3872
3873 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3874 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3875
3876 if (ischosen(dl_block.data_egprs)) {
3877 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3878 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3879 f_shutdown(__BFILE__, __LINE__);
3880 }
3881 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3882 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3883 f_shutdown(__BFILE__, __LINE__);
3884 }
3885 if (not match(dl_block.data_egprs.blocks[1].payload,
3886 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3887 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3888 f_shutdown(__BFILE__, __LINE__);
3889 }
3890 } else if (lengthof(dl_block.data.blocks) > 1) {
3891 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3892 f_shutdown(__BFILE__, __LINE__);
3893 }
3894
3895 f_shutdown(__BFILE__, __LINE__, final := true);
3896}
3897
3898/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3899 * containing llc data. See OS#4849 */
3900testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3901 f_tc_dl_data_no_llc_ui_dummy(omit);
3902}
3903
3904/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3905 * containing llc data. See OS#4849 */
3906testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003907 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003908}
3909
Pau Espin Pedrol0b6b0d02022-10-25 21:21:02 +02003910/* Scenario: MS creates one phase access, does contention resolution CV>0 and
3911 * finishes sending data (CV=0), which is forwarded to SGSN by PCU. PCU acks with
3912 * FINAL_ACK=1 (hence UL TBF moves to FINISHED state). Then SGSN answers and PCU
3913 * has to assign a DL TBF (through PCH because of FINISHED state, TS 44.060 9.3.3.3.2).
3914 * Make sure the assignment is not done until we receive the PKT CTRL ACK from the MS
3915 * (at that time we know the MS is listening on PCH again). OS#5700.
3916 */
3917testcase TC_ul_tbf_finished_pkt_dl_ass_pch() runs on RAW_PCU_Test_CT {
3918 var RlcmacDlBlock dl_block;
3919 var octetstring data := f_rnd_octstring(10);
3920 var uint32_t sched_fn;
3921 var uint32_t dl_fn;
3922 var GprsMS ms;
3923 timer T;
3924 var octetstring payload;
3925
3926 /* Initialize NS/BSSGP side */
3927 f_init_bssgp();
3928 /* Initialize GPRS MS side */
3929 f_init_gprs_ms();
3930 ms := g_ms[0]; /* We only use first MS in this test */
3931
3932 /* Initialize the PCU interface abstraction */
3933 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3934
3935 /* Establish BSSGP connection to the PCU */
3936 f_bssgp_establish();
3937 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3938
3939 /* Establish an Uplink TBF */
3940 f_ms_establish_ul_tbf(ms);
3941
3942 /* Send one UL block (with TLLI since we are in One-Phase Access
3943 contention resolution) and make sure it is ACKED fine. */
3944 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
3945 dl_fn := f_rx_rlcmac_dl_block_exp_dummy(dl_block);
3946 f_ms_tx_ul_data_block(ms, payload, cv := 1, with_tlli := true, fn := f_next_pdch_block(dl_fn));
3947
3948 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3949 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, false));
3950 f_ms_tx_ul_data_block(ms, payload, cv := 0);
3951 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3952
3953 /* 1 UL block should be received in SGSN */
3954 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
3955 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3956 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3957
3958 /* UL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3959 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3960 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3961 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3962 f_sleep(X2002);
3963 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3964
3965 f_shutdown(__BFILE__, __LINE__, final := true);
3966}
3967
Pau Espin Pedrol99e00b42022-10-28 13:28:52 +02003968/* Scenario: MS creates a UL TBF and
3969 * finishes sending data (CV=0), which is forwarded to SGSN by PCU. PCU acks with
3970 * FINAL_ACK=1 (hence UL TBF moves to FINISHED state). Then SGSN answers and PCU
3971 * has to assign a DL TBF on PCH. While the network is waiting for the MS to
3972 * move to PDCH before transmitting DL data (timer X2002), the MS finds out it
3973 * needs to send new UL data and hence sends a RACH request to create a new UL
3974 * TBF.
3975 * Make sure the the MS is assigned a DL TBF through PACCH in that case even if
3976 * no new DL data is received from the SGSN. OS#5700.
3977 * This test validates the specific case where the 2nd UL TBF is done through
3978 * 1phase-access.
3979 */
3980testcase TC_ul_tbf_1phase_while_dl_ass_pch() runs on RAW_PCU_Test_CT {
3981 var RlcmacDlBlock dl_block;
3982 var octetstring data := f_rnd_octstring(10);
3983 var uint32_t sched_fn;
3984 var uint32_t poll_fn;
3985 var uint32_t dl_fn;
3986 var GprsMS ms;
3987 timer T;
3988 var octetstring payload;
3989
3990 /* Initialize NS/BSSGP side */
3991 f_init_bssgp();
3992 /* Initialize GPRS MS side */
3993 f_init_gprs_ms();
3994 ms := g_ms[0]; /* We only use first MS in this test */
3995
3996 /* Initialize the PCU interface abstraction */
3997 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3998
3999 /* Establish BSSGP connection to the PCU */
4000 f_bssgp_establish();
4001 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4002
4003 /* Establish an Uplink TBF */
4004 f_ms_establish_ul_tbf(ms);
4005
4006 /* Send one UL block (with TLLI since we are in One-Phase Access
4007 contention resolution) and make sure it is ACKED fine. */
4008 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
4009 dl_fn := f_rx_rlcmac_dl_block_exp_dummy(dl_block);
4010 f_ms_tx_ul_data_block(ms, payload, cv := 1, with_tlli := true, fn := f_next_pdch_block(dl_fn));
4011
4012 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
4013 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, false));
4014 f_ms_tx_ul_data_block(ms, payload, cv := 0);
4015 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
4016
4017 /* 1 UL block should be received in SGSN */
4018 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
4019 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
4020 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4021
4022 /* UL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4023 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4024 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4025
4026 /* Now the PCU is waiting for the MS to move to PDCH in order to send data to it (timer X2002).
4027 * The MS decides it want to send new Ul TBF so it send RACH req to ask for it: */
4028 f_ms_establish_ul_tbf(ms);
4029
4030 /* Send one UL block (with TLLI since we are in One-Phase Access
4031 * contention resolution) and make sure it is ACKED fine. */
4032 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
4033 dl_fn := f_rx_rlcmac_dl_block_exp_dummy(dl_block);
4034 f_ms_tx_ul_data_block(ms, payload, cv := 1, with_tlli := true, fn := f_next_pdch_block(dl_fn));
4035
4036 /* UL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4037 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
4038
4039 /* The PCU considers the MS to have gone over Contention Resolution
4040 * after having sent the first UL ACK/NACK to it, hence next it will try to
4041 * assign the DL-TBF to send the data it received from the SGSN previously: */
4042 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4043 /* the MS ACKs the PKT_DL_ASS: */
4044 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4045
4046 /* We should finally receive the DL-data that was received previously from the SGSN: */
4047 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
4048
4049 f_shutdown(__BFILE__, __LINE__, final := true);
4050}
4051
4052/* Same as TC_ul_tbf_2phase_while_dl_ass_pch, but this test validates the
4053 * specific case where the 2nd UL TBF is done through 2phase-access. */
4054testcase TC_ul_tbf_2phase_while_dl_ass_pch() runs on RAW_PCU_Test_CT {
4055 var RlcmacDlBlock dl_block;
4056 var octetstring data := f_rnd_octstring(10);
4057 var uint32_t sched_fn;
4058 var uint32_t poll_fn;
4059 var uint32_t dl_fn;
4060 var GprsMS ms;
4061 timer T;
4062 var octetstring payload;
4063 var PollFnCtx pollctx;
4064
4065 /* Initialize NS/BSSGP side */
4066 f_init_bssgp();
4067 /* Initialize GPRS MS side */
4068 f_init_gprs_ms();
4069 ms := g_ms[0]; /* We only use first MS in this test */
4070
4071 /* Initialize the PCU interface abstraction */
4072 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
4073
4074 /* Establish BSSGP connection to the PCU */
4075 f_bssgp_establish();
4076 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4077
4078 /* Establish an Uplink TBF */
4079 f_ms_establish_ul_tbf(ms);
4080
4081 /* Send one UL block (with TLLI since we are in One-Phase Access
4082 contention resolution) and make sure it is ACKED fine. */
4083 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
4084 dl_fn := f_rx_rlcmac_dl_block_exp_dummy(dl_block);
4085 f_ms_tx_ul_data_block(ms, payload, cv := 1, with_tlli := true, fn := f_next_pdch_block(dl_fn));
4086
4087 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
4088 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, false));
4089 f_ms_tx_ul_data_block(ms, payload, cv := 0);
4090 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
4091
4092 /* 1 UL block should be received in SGSN */
4093 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
4094 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
4095 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4096
4097 /* UL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4098 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4099 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4100
4101 /* Now the PCU is waiting for the MS to move to PDCH in order to send data to it (timer X2002).
4102 * The MS decides it want to send new Ul TBF so it send RACH req to ask for it: */
4103 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4104
4105 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4106 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4107
4108 /* Now that MS seized the UL-TBF, PCU sends DL-TBF Assignment on PACCH */
4109 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4110 /* the MS ACKs the PKT_DL_ASS: */
4111 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4112
4113 /* We should finally receive the DL-data that was received previously from the SGSN: */
4114 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
4115
4116 f_shutdown(__BFILE__, __LINE__, final := true);
4117}
4118
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004119private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07004120 template GsmRrMessage t_imm_ass := ?,
4121 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004122runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07004123 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004124 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004125
4126 ra11 := enc_EGPRSPktChRequest2uint(req);
4127 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
4128
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07004129 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07004130 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004131 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004132 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004133 }
4134
4135 setverdict(pass);
4136}
4137
4138testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
4139 var template GsmRrMessage imm_ass;
4140 var template IaRestOctets rest;
4141 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004142 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004143
4144 /* Initialize the PCU interface abstraction */
4145 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004146 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004147
4148 var EGPRSPktChRequest req := {
4149 /* NOTE: other fields are set in the loop */
4150 signalling := { tag := '110011'B }
4151 };
4152
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004153 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004154 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
4155 req.signalling.random_bits := ext_ra;
4156
4157 /* For signalling, do we expect Multiblock UL TBF Assignment? */
4158 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
4159 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
4160 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
4161
4162 f_TC_egprs_pkt_chan_req(req, imm_ass);
4163 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004164
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004165 var StatsDExpects expect := {
4166 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4167 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4168 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4169 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
4170 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
4171 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
4172 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
4173 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4174 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4175 };
4176 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004177
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004178 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004179}
4180
4181testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
4182 var template GsmRrMessage imm_ass;
4183 var template IaRestOctets rest;
4184 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004185 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004186
4187 /* Initialize the PCU interface abstraction */
4188 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004189 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004190
4191 var EGPRSPktChRequest req := {
4192 /* NOTE: other fields are set in the loop */
4193 one_phase := { tag := '0'B }
4194 };
4195
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004196 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004197 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
4198 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
4199 var BIT2 priority := substr(ext_ra, 0, 2);
4200 var BIT3 rand := substr(ext_ra, 2, 3);
4201
4202 req.one_phase.multislot_class := mslot_class;
4203 req.one_phase.priority := priority;
4204 req.one_phase.random_bits := rand;
4205
4206 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
4207 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
4208 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
4209 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
4210
4211 f_TC_egprs_pkt_chan_req(req, imm_ass);
4212 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004213
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004214 var StatsDExpects expect := {
4215 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4216 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4217 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := num_req, max := num_req },
4218 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4219 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
4220 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := num_req, max := num_req },
4221 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4222 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4223 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4224 };
4225 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004226
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004227 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004228}
4229
4230testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
4231 var template GsmRrMessage imm_ass;
4232 var template IaRestOctets rest;
4233 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004234 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004235
4236 /* Initialize the PCU interface abstraction */
4237 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004238 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004239
4240 var EGPRSPktChRequest req := {
4241 /* NOTE: other fields are set in the loop */
4242 two_phase := { tag := '110000'B }
4243 };
4244
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004245 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004246 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
4247 var BIT2 priority := substr(ext_ra, 0, 2);
4248 var BIT3 rand := substr(ext_ra, 2, 3);
4249
4250 req.two_phase.priority := priority;
4251 req.two_phase.random_bits := rand;
4252
4253 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
4254 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
4255 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
4256 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
4257
4258 f_TC_egprs_pkt_chan_req(req, imm_ass);
4259 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004260
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004261 var StatsDExpects expect := {
4262 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4263 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4264 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4265 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
4266 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
4267 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
4268 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
4269 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4270 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4271 };
4272 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004273
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004274 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004275}
4276
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004277private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
4278 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004279 PCUIF_BurstType bt := BURST_TYPE_1,
4280 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004281runs on RAW_PCU_Test_CT {
4282 var template ReqRefWaitInd tr_ref;
4283 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004284
4285 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
4286 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
4287 ra := bit2int(ra11), is_11bit := 1,
4288 burst_type := bt, fn := fn,
4289 arfcn := 871));
4290
4291 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07004292 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004293
4294 /* Just to have a short-name reference to the actual message */
4295 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
4296
4297 /* Make sure that Request Reference list contains at least one entry
4298 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004299 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004300 if (not match(iar.payload, { *, tr_ref, * })) {
4301 setverdict(fail, "Request Reference list does not match");
4302 f_shutdown(__BFILE__, __LINE__);
4303 }
4304
4305 /* Match Feature Indicator (must indicate PS domain) */
4306 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
4307 setverdict(fail, "Feature Indicator does not match");
4308 f_shutdown(__BFILE__, __LINE__);
4309 }
4310
4311 /* Match IAR Rest Octets */
4312 if (not match(iar.rest_octets, rest)) {
4313 setverdict(fail, "IAR Rest Octets does not match: ",
4314 iar.rest_octets, " vs expected ", rest);
4315 f_shutdown(__BFILE__, __LINE__);
4316 }
4317
4318 setverdict(pass);
4319}
4320
4321/* Verify the contents of RR Immediate Assignment Reject message and its
4322 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
4323testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
4324 var template IARRestOctets rest;
4325 var BIT5 ext_ra;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004326 const integer num_req := 6;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004327
4328 /* Initialize the PCU interface abstraction */
4329 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004330 f_statsd_reset();
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004331
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004332 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004333 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
4334 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
4335
4336 /* Intentionally incorrect message (see table 11.2.5a.2) */
4337 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
4338 }
4339
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004340 var StatsDExpects expect := {
4341 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4342 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4343 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4344 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4345 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
4346 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
4347 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
4348 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4349 };
4350 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004351
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004352 f_shutdown(__BFILE__, __LINE__, final := true);
4353}
4354
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004355/* At the moment, the IUT does not support any emergency services. Make sure
4356 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
4357testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
4358 var template IARRestOctets rest;
4359 var BIT5 ext_ra;
4360 var BIT11 ra11;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004361 const integer num_req := 6;
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004362
4363 /* Initialize the PCU interface abstraction */
4364 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004365 f_statsd_reset();
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004366
4367 var EGPRSPktChRequest req := {
4368 /* NOTE: other fields are set in the loop */
4369 emergency := { tag := '110111'B }
4370 };
4371
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004372 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004373 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
4374 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
4375
4376 req.emergency.random_bits := ext_ra;
4377 ra11 := enc_EGPRSPktChRequest2bits(req);
4378
4379 /* Intentionally incorrect message (see table 11.2.5a.2) */
4380 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
4381 }
4382
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004383 var StatsDExpects expect := {
4384 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4385 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4386 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4387 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4388 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
4389 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
4390 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
4391 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4392 };
4393 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004394
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004395 f_shutdown(__BFILE__, __LINE__, final := true);
4396}
4397
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004398/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
4399testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004400 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004401 var template IARRestOctets rest;
4402 var BIT11 ra11;
4403
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004404 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004405 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07004406
4407 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004408 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
4409 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004410
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004411 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004412 f_init_raw(testcasename(), info_ind);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004413 f_statsd_reset();
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004414
4415 var EGPRSPktChRequest req := {
4416 one_phase := {
4417 tag := '0'B,
4418 multislot_class := '10101'B,
4419 priority := '01'B,
4420 random_bits := '101'B
4421 }
4422 };
4423
4424 /* We send 7 requests, the IUT gives us all available USFs (0..6).
4425 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
4426 for (var integer i := 0; i < 7; i := i + 1) {
4427 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
4428 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
4429 }
4430
4431 ra11 := enc_EGPRSPktChRequest2bits(req);
4432 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
4433
4434 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004435 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004436
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004437 var StatsDExpects expect := {
4438 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 8, max := 8 },
4439 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 8, max := 8 },
4440 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 8, max := 8 },
4441 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4442 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := 0, max := 0 },
4443 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 7, max := 7 },
4444 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 7, max := 7 },
4445 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4446 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4447 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := 1, max := 1 },
4448 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4449 };
4450 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004451
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004452 f_shutdown(__BFILE__, __LINE__, final := true);
4453}
4454
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004455/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004456private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004457return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004458 /* Pick a random MA length in range 2 .. max_ma_len */
4459 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
4460
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004461 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
4462 hsn := f_rnd_int(63),
4463 maio := f_rnd_int(63),
4464 ma := f_rnd_bitstring(ma_len));
4465}
4466
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004467private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
4468 in GsmRrMessage rr_msg)
4469{
4470 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004471 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004472
4473 var template PacketChannelDescription tr_pkt_chan_desc := {
4474 channel_Type_spare := ?,
4475 tn := ?,
4476 tsc := ts.tsc,
4477 presence := '1'B,
4478 zero := omit,
4479 one := {
4480 maio := ts.maio,
4481 hsn := ts.hsn
4482 }
4483 };
4484
4485 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
4486 setverdict(fail, "Packet Channel Description does not match: ",
4487 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
4488 }
4489
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004490 /* Mobile Allocation is expected to be octet-aligned */
4491 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
4492 var template MobileAllocationLV tr_ma := {
4493 len := ma_oct_len, /* in bytes */
4494 ma := substr(ts.ma, 0, ma_oct_len * 8)
4495 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004496
4497 if (not match(ia.mobile_allocation, tr_ma)) {
4498 setverdict(fail, "Mobile Allocation does not match: ",
4499 ia.mobile_allocation, " vs ", tr_ma);
4500 }
4501
4502 setverdict(pass);
4503}
4504
4505/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
4506testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004507 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004508 var GprsMS ms := valueof(t_GprsMS_def);
4509
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004510 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004511 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004512
4513 /* Initialize the PCU interface abstraction */
4514 f_init_raw(testcasename(), info_ind);
4515
4516 /* EGPRS Packet Channel Request (cause=Signalling) */
4517 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
4518
4519 /* Establish an Uplink EGPRS TBF */
4520 f_ms_establish_ul_tbf(ms);
4521
4522 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4523 f_shutdown(__BFILE__, __LINE__, final := true);
4524}
4525
4526/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
4527testcase TC_pcuif_fh_imm_ass_ul() 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(c_PCUIF_Flags_noMCS);
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 /* Establish an Uplink TBF */
4538 f_ms_establish_ul_tbf(ms);
4539
4540 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4541 f_shutdown(__BFILE__, __LINE__, final := true);
4542}
4543
4544/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
4545testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004546 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004547 var GprsMS ms := valueof(t_GprsMS_def);
4548
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004549 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004550 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004551
4552 /* Initialize NS/BSSGP side */
4553 f_init_bssgp();
4554
4555 /* Initialize the PCU interface abstraction */
4556 f_init_raw(testcasename(), info_ind);
4557
4558 /* Establish BSSGP connection to the PCU */
4559 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004560 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004561
4562 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
4563 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
4564 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4565
4566 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
4567 f_shutdown(__BFILE__, __LINE__, final := true);
4568}
4569
4570private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
4571 in FrequencyParameters fp)
4572{
4573 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004574 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004575
4576 /* Table 12.8.1: Frequency Parameters information elements */
4577 var template FrequencyParameters tr_fp := {
4578 tsc := ts.tsc,
4579 presence := '10'B, /* Direct encoding 1 */
4580 arfcn := omit,
4581 indirect := omit,
4582 direct1 := {
4583 maio := ts.maio,
4584 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
4585 mobile_allocation := {
4586 hsn := ts.hsn,
4587 rfl_number_list_present := '0'B,
4588 rfl_number_list := omit,
4589 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004590 ma_length := ts.ma_bit_len,
4591 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004592 }
4593 },
4594 direct2 := omit
4595 };
4596
4597 if (not match(fp, tr_fp)) {
4598 setverdict(fail, "Frequency Parameters IE does not match: ",
4599 fp, " vs ", tr_fp);
4600 }
4601
4602 setverdict(pass);
4603}
4604
4605/* Make sure that Packet Uplink Assignment contains hopping parameters */
4606testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004607 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004608 var GprsMS ms := valueof(t_GprsMS_def);
4609 var uint32_t poll_fn;
4610
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004611 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004612 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004613
4614 /* Initialize the PCU interface abstraction */
4615 f_init_raw(testcasename(), info_ind);
4616
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004617 /* Single block (two phase) packet access */
4618 var uint16_t ra := bit2int(chan_req_sb);
4619 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
4620
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004621 /* Establish an Uplink TBF */
4622 f_ms_establish_ul_tbf(ms);
4623
4624 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004625 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
4626 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004627
4628 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004629 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
4630 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004631
4632 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
4633 var template (omit) FrequencyParameters fp;
4634 if (ua.is_egprs == '1'B) {
4635 fp := ua.egprs.freq_par;
4636 } else {
4637 fp := ua.gprs.freq_par;
4638 }
4639
4640 /* This is an optional IE, so it's worth to check its presence */
4641 if (istemplatekind(fp, "omit")) {
4642 setverdict(fail, "Frequency Parameters IE is not present");
4643 f_shutdown(__BFILE__, __LINE__);
4644 }
4645
4646 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
4647 f_shutdown(__BFILE__, __LINE__, final := true);
4648}
4649
4650/* Make sure that Packet Downlink Assignment contains hopping parameters */
4651testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004652 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004653 var octetstring data := f_rnd_octstring(10);
4654 var GprsMS ms := valueof(t_GprsMS_def);
4655 var RlcmacDlBlock dl_block;
4656 var uint32_t poll_fn;
4657
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004658 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004659 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004660
4661 /* Initialize NS/BSSGP side */
4662 f_init_bssgp();
4663
4664 /* Initialize the PCU interface abstraction */
4665 f_init_raw(testcasename(), info_ind);
4666
4667 /* Establish BSSGP connection to the PCU */
4668 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004669 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004670
4671 /* Establish an Uplink TBF */
4672 f_ms_establish_ul_tbf(ms);
4673
4674 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004675 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 +07004676
4677 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4678 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
4679 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4680
4681 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
4682 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4683
4684 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004685 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4686 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004687
4688 /* This is an optional IE, so it's worth to check its presence */
4689 if (not ispresent(da.freq_par)) {
4690 setverdict(fail, "Frequency Parameters IE is not present");
4691 f_shutdown(__BFILE__, __LINE__);
4692 }
4693
4694 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
4695 f_shutdown(__BFILE__, __LINE__, final := true);
4696}
4697
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004698/* Check if the IUT handles subsequent INFO.ind messages */
4699testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004700 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004701 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004702
4703 /* Initialize the PCU interface abstraction */
4704 f_init_raw(testcasename(), info_ind);
4705
4706 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
4707 for (var integer i := 0; i < 16; i := i + 1) {
4708 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004709 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004710 }
4711
4712 f_shutdown(__BFILE__, __LINE__, final := true);
4713}
4714
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004715/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
4716testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
4717 var PCUIF_info_ind info_ind;
4718 var integer i;
4719 const integer num_ms := 8;
4720
4721 /* Initialize NS/BSSGP side */
4722 f_init_bssgp();
4723 /* Initialize GPRS MS side */
4724 f_init_gprs_ms(num_ms);
4725
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01004726 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004727 /* Only the 3 first TRX are enabled. The enabled ones all have same
4728 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004729 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
4730 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
4731 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
4732 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004733
4734 /* Initialize the PCU interface abstraction */
4735 f_init_raw(testcasename(), info_ind);
4736
4737 /* Establish BSSGP connection to the PCU */
4738 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004739 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004740
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004741 /* Establish an Uplink TBF for each GprsMS instance */
4742 f_multi_ms_establish_tbf(do_activate := false);
4743
4744 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004745 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004746 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01004747 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004748 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004749 f_shutdown(__BFILE__, __LINE__);
4750 }
4751 }
4752
4753 f_shutdown(__BFILE__, __LINE__, final := true);
4754}
4755
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004756/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
4757 * downgraded to CS1-4 so that GPRS can read the USF).
4758 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
4759 */
4760testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
4761 var PCUIF_info_ind info_ind;
4762 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
4763 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004764 var uint32_t sched_fn, dl_fn, ack_fn;
4765 var octetstring data := f_rnd_octstring(10);
4766 var RlcmacDlBlock dl_block;
4767 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004768 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004769 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
4770 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
4771
4772 /* Initialize NS/BSSGP side */
4773 f_init_bssgp();
4774 /* Initialize GPRS MS side */
4775 f_init_gprs_ms(num_ms);
4776
4777 info_ind := valueof(ts_PCUIF_INFO_default);
4778 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004779 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
4780 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004781
4782 /* Initialize the PCU interface abstraction */
4783 f_init_raw(testcasename(), info_ind);
4784
4785 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
4786 g_mcs_initial_dl := 5;
4787 g_mcs_max_dl := 5;
4788 f_pcuvty_set_allowed_cs_mcs();
4789
4790 /* Establish BSSGP connection to the PCU */
4791 f_bssgp_establish();
4792 f_multi_ms_bssgp_register();
4793
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004794 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004795 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 +01004796 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
4797 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
4798 f_shutdown(__BFILE__, __LINE__);
4799 }
4800 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4801 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4802
4803 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004804 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 +01004805 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
4806 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
4807 f_shutdown(__BFILE__, __LINE__);
4808 }
4809 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4810 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4811
4812 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
4813 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4814 f_sleep(0.1);
4815 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4816 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4817 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
4818 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4819 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
4820 /* ACK the DL block */
4821 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
4822 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
4823 f_dl_block_ack_fn(dl_block, dl_fn));
4824
4825 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
4826 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4827 f_sleep(0.1);
4828 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4829 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4830 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
4831 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4832 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
4833 /* ACK the DL block */
4834 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
4835 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
4836 f_dl_block_ack_fn(dl_block, dl_fn));
4837
4838 data := f_rnd_octstring(1400);
4839 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4840 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4841
4842 for (var integer i := 0; i < 800; i := i + 1) {
4843 f_rx_rlcmac_dl_block(dl_block, dl_fn);
4844
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07004845 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL)) {
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004846 /* No more data to receive, done */
4847 break;
4848 }
4849
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004850 usf_ms := -1;
4851
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004852 if (ischosen(dl_block.ctrl)) {
4853 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
4854 f_shutdown(__BFILE__, __LINE__);
4855 } else if (ischosen(dl_block.data_egprs)) {
4856 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
4857 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
4858 f_shutdown(__BFILE__, __LINE__);
4859 }
4860 tgt_ms := 1;
4861 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
4862 if (dl_block.data_egprs.mcs > MCS_4) {
4863 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
4864 f_shutdown(__BFILE__, __LINE__);
4865 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004866 usf_ms := 0;
4867 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004868 } else {
4869 if (dl_block.data_egprs.mcs <= MCS_4) {
4870 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
4871 f_shutdown(__BFILE__, __LINE__);
4872 }
4873 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004874 usf_ms := 1;
4875 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004876 }
4877 }
4878 } else {
4879 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
4880 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
4881 f_shutdown(__BFILE__, __LINE__);
4882 }
4883 tgt_ms := 0;
4884 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 +01004885 usf_ms := 0;
4886 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004887 } 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 +01004888 usf_ms := 1;
4889 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004890 }
4891 }
4892
4893 /* Keep Ack/Nack description updated */
4894 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
4895
4896 /* TDMA frame number on which we are supposed to send the ACK */
4897 if (f_dl_block_rrbp_valid(dl_block)) {
4898 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
4899 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);
4900 if (tx_data_remain != 0) {
4901 /* Submit more data from time to time to keep the TBF ongoing */
4902 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4903 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4904 tx_data_remain := tx_data_remain - 1;
4905 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004906 } else if (tx_data_remain != 0) {
4907 /* keep sending UL blocks when requested by USF to avoid
4908 * UL TBF timeout and hence stop receival of USFs */
4909 if (usf_ms != -1) {
4910 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
4911 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004912 }
4913 }
4914
4915 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 +01004916 /* He we check that DL blocks scheduled at GPRS can still request UL
4917 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
4918 * condition also ensures the downgrade to <=MCS4 condition is tested
4919 * above */
4920 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
4921 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004922 f_shutdown(__BFILE__, __LINE__);
4923 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004924 /* Here check for some level of fairness between them (at least ~40%): */
4925 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
4926 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
4927 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
4928 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
4929 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4930 f_shutdown(__BFILE__, __LINE__);
4931 }
4932 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
4933 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4934 f_shutdown(__BFILE__, __LINE__);
4935 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004936
4937 f_shutdown(__BFILE__, __LINE__, final := true);
4938}
4939
4940
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004941private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4942 boolean exp_imsi, boolean exp_tmsi)
4943runs on RAW_PCU_Test_CT {
4944 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4945 var integer pending := lengthof(g_ms);
4946 var RlcmacDlBlock dl_block;
4947 var boolean f1, f2;
4948
4949 while (pending > 0) {
4950 var uint32_t poll_fn;
4951
4952 /* Obtain a Downlink block and make sure it is a paging request */
4953 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4954 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4955 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4956 break;
4957 }
4958
4959 /* This should not happen in general, but who knows... */
4960 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4961 if (not ispresent(req.repeated_pageinfo)) {
4962 setverdict(fail, "Repeated Page Info IE is absent?!?");
4963 break;
4964 }
4965
4966 /* A single message may contain several MIs depending on their type */
4967 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4968 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4969 ps_domain := false);
4970 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4971 ps_domain := false);
4972 if (not f1 and not f2)
4973 { continue; }
4974
4975 /* Detect duplicate MIs */
4976 if (mask[i] == '1'B) {
4977 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4978 continue;
4979 }
4980
4981 mask[i] := '1'B;
4982 }
4983
4984 pending := pending - lengthof(req.repeated_pageinfo);
4985 }
4986
4987 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4988 if (mask[i] != '1'B) {
4989 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4990 log("===== mask := ", mask);
4991 }
4992 }
4993
4994 /* All messages must have been received by now, expect a dummy block */
4995 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4996}
4997
4998private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4999runs on RAW_PCU_Test_CT {
5000 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5001 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
5002
5003 /* Initialize NS/BSSGP side */
5004 f_init_bssgp();
5005
5006 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01005007 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005008
5009 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
5010 f_init_gprs_ms(7 * 8);
5011
5012 /* Initialize the PCU interface abstraction */
5013 f_init_raw(testcasename(), info_ind);
5014
5015 /* Establish BSSGP connection to the PCU */
5016 f_bssgp_establish();
5017 f_multi_ms_bssgp_register();
5018
5019 /* Establish an Uplink TBF for each GprsMS instance */
5020 f_multi_ms_establish_tbf(do_activate := true);
5021}
5022
5023testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
5024 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
5025
5026 /* Common part: send INFO.ind, establish TBFs... */
5027 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
5028
5029 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
5030 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
5031 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
5032 }
5033
5034 /* FIXME: work around a race condition between PCUIF and BSSGP */
5035 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
5036
5037 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
5038 * The IUT is expected to page on all PDCH slots of all transceivers. */
5039 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
5040 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
5041 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
5042 }
5043
5044 f_shutdown(__BFILE__, __LINE__, final := true);
5045}
5046
5047testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
5048 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
5049
5050 /* Common part: send INFO.ind, establish TBFs... */
5051 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
5052
5053 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
5054 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
5055 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
5056 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
5057 }
5058
5059 /* FIXME: work around a race condition between PCUIF and BSSGP */
5060 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
5061
5062 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
5063 * The IUT is expected to page on all PDCH slots of all transceivers. */
5064 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
5065 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
5066 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
5067 }
5068
5069 f_shutdown(__BFILE__, __LINE__, final := true);
5070}
5071
5072testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
5073 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
5074
5075 /* Common part: send INFO.ind, establish TBFs... */
5076 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
5077
5078 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
5079 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
5080 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
5081 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
5082 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
5083 } else {
5084 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
5085 }
5086 }
5087
5088 /* FIXME: work around a race condition between PCUIF and BSSGP */
5089 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
5090
5091 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
5092 * The IUT is expected to page on all PDCH slots of all transceivers. */
5093 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
5094 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
5095 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
5096 }
5097
5098 f_shutdown(__BFILE__, __LINE__, final := true);
5099}
5100
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005101private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005102runs on RAW_PCU_Test_CT return RlcmacDlBlock {
5103 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005104 var integer i := 0;
5105 while (true) {
5106 f_rx_rlcmac_dl_block(dl_block, sched_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07005107 if (not match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005108 break;
5109 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005110 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005111 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5112 f_shutdown(__BFILE__, __LINE__);
5113 }
5114 i := i + 1;
5115 }
5116 return dl_block;
5117}
5118
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005119private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
5120runs on RAW_PCU_Test_CT {
5121 var BssgpCellId src := valueof(ts_BssgpCellId(ts_RAI(ts_LAI(f_enc_BcdMccMnc(info_ind.mcc, info_ind.mnc, info_ind.mnc_3_digits == 1),
5122 info_ind.lac),
5123 info_ind.rac),
5124 info_ind.cell_id));
5125 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
5126 423),
5127 2),
5128 5));
5129 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
5130 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
5131 var template (value) RAN_Information_RIM_Container res_cont :=
5132 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5133 ts_RIM_Sequence_Number(2),
5134 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5135 ts_RIM_Protocol_Version_Number(1),
5136 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
5137 omit);
5138 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5139 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5140 res_cont));
5141}
5142
5143altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
5144runs on RAW_PCU_Test_CT {
5145 /* RIM procedure: */
5146 var BssgpCellId src := valueof(ts_BssgpCellId(ts_RAI(ts_LAI(f_enc_BcdMccMnc(info_ind.mcc, info_ind.mnc, info_ind.mnc_3_digits == 1),
5147 info_ind.lac),
5148 info_ind.rac),
5149 info_ind.cell_id));
5150 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
5151 423),
5152 2),
5153 5));
5154 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
5155 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
5156 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5157 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5158 tr_RAN_Information_Request_RIM_Container)) {
5159 if (do_answer) {
5160 f_outbound_nacc_rim_tx_resp(info_ind);
5161 }
5162 if (do_repeat) {
5163 repeat;
5164 }
5165 }
5166}
5167
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005168private function f_handle_nacc_rac_ci_query(PCUIF_info_ind info_ind, GsmArfcn req_arfcn, uint6_t req_bsic,
5169 boolean answer := true, boolean use_old_ctrl_iface := false)
5170runs on RAW_PCU_Test_CT {
5171 if (use_old_ctrl_iface == true) {
5172 f_ipa_ctrl_wait_link_up();
5173 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5174 int2str(info_ind.lac) & "." &
5175 int2str(info_ind.cell_id) & "." &
5176 int2str(req_arfcn) & "." &
5177 int2str(req_bsic);
5178 if (answer) {
5179 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5180 } else {
5181 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
5182 }
5183 } else {
5184 var PCUIF_Message pcu_msg;
5185 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5186 if (answer) {
5187 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5188 }
5189 }
5190}
5191
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005192/* Start NACC from MS side */
5193private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005194 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005195 boolean skip_final_ctrl_ack := false,
5196 boolean use_old_ctrl_iface := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005197runs on RAW_PCU_Test_CT {
5198 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5199 var RlcmacDlBlock dl_block;
5200 var uint32_t sched_fn;
5201 var GsmArfcn req_arfcn := 862;
5202 var uint6_t req_bsic := 43;
5203
5204 /* Start NACC from MS side */
5205 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5206 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5207
5208 if (exp_rac_ci_query == true) {
5209 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005210 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 +01005211 }
5212
5213 if (exp_si_query == true) {
5214 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005215 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005216 }
5217
5218 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005219 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005220
5221 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5222 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5223 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5224 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5225 f_shutdown(__BFILE__, __LINE__);
5226 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005227 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005228 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005229 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5230 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5231 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005232}
5233
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005234/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
5235testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005236 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005237 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005238 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005239 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005240
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005241 if (use_old_ctrl_iface) {
5242 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5243 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5244 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005245
5246 /* Initialize NS/BSSGP side */
5247 f_init_bssgp();
5248 /* Initialize GPRS MS side */
5249 f_init_gprs_ms();
5250 ms := g_ms[0]; /* We only use first MS in this test */
5251
5252 /* Initialize the PCU interface abstraction */
5253 f_init_raw(testcasename(), info_ind);
5254
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005255 /* Make sure we are not affected by full cache from previous tests */
5256 f_pcuvty_flush_neigh_caches();
5257
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005258 /* Establish BSSGP connection to the PCU */
5259 f_bssgp_establish();
5260 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5261
5262 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005263 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 +01005264 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5265 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5266
5267 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005268 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005269
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005270 f_shutdown(__BFILE__, __LINE__, final := true);
5271}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005272
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005273/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
5274testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
5275 var PollFnCtx pollctx;
5276 var GprsMS ms;
5277 var RlcmacDlBlock dl_block;
5278 var uint32_t sched_fn;
5279 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005280 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005281
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005282 if (use_old_ctrl_iface) {
5283 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5284 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5285 }
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005286
5287 /* Initialize NS/BSSGP side */
5288 f_init_bssgp();
5289 /* Initialize GPRS MS side */
5290 f_init_gprs_ms();
5291 ms := g_ms[0]; /* We only use first MS in this test */
5292
5293 /* Initialize the PCU interface abstraction */
5294 f_init_raw(testcasename(), info_ind);
5295
5296 /* Make sure we are not affected by full cache from previous tests */
5297 f_pcuvty_flush_neigh_caches();
5298
5299 /* Establish BSSGP connection to the PCU */
5300 f_bssgp_establish();
5301 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5302
5303 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005304 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 +01005305 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5306 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5307
5308 /* Start NACC from MS side, avoid sending final CTRL ACK */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005309 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 +01005310
5311 /* Wait until we receive something non-dummy */
5312 dl_block := f_skip_dummy(0, sched_fn);
5313 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
5314 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5315 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5316 }
5317 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5318 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5319 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5320 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5321 }
5322
5323 f_shutdown(__BFILE__, __LINE__, final := true);
5324}
5325
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005326/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
5327testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
5328 var PollFnCtx pollctx;
5329 var GprsMS ms;
5330 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005331 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005332 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005333
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005334 if (use_old_ctrl_iface) {
5335 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5336 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5337 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005338
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005339 /* Initialize NS/BSSGP side */
5340 f_init_bssgp();
5341 /* Initialize GPRS MS side */
5342 f_init_gprs_ms();
5343 ms := g_ms[0]; /* We only use first MS in this test */
5344
5345 /* Initialize the PCU interface abstraction */
5346 f_init_raw(testcasename(), info_ind);
5347
5348 /* Make sure we are not affected by full cache from previous tests */
5349 f_pcuvty_flush_neigh_caches();
5350 /* Set timeout values for caches so that entries will be in cache during second try */
5351 f_pcuvty_set_neigh_caches(10, 10);
5352
5353 /* Establish BSSGP connection to the PCU */
5354 f_bssgp_establish();
5355 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5356
5357 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005358 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 +01005359 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5360 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5361
5362 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005363 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005364
5365 /* 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 +02005366 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 +01005367
5368 f_shutdown(__BFILE__, __LINE__, final := true);
5369}
5370
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005371/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
5372 * TS 44.060 sec 8.8) twice, the second time after caches timed out
5373 */
5374testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
5375 var PollFnCtx pollctx;
5376 var GprsMS ms;
5377 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005378 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005379 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005380
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005381 if (use_old_ctrl_iface) {
5382 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5383 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5384 }
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005385
5386 /* Initialize NS/BSSGP side */
5387 f_init_bssgp();
5388 /* Initialize GPRS MS side */
5389 f_init_gprs_ms();
5390 ms := g_ms[0]; /* We only use first MS in this test */
5391
5392 /* Initialize the PCU interface abstraction */
5393 f_init_raw(testcasename(), info_ind);
5394
5395 /* Make sure we are not affected by full cache from previous tests */
5396 f_pcuvty_flush_neigh_caches();
5397 /* Set timeout values for caches so that entries will be erased before the second try */
5398 f_pcuvty_set_neigh_caches(1, 1);
5399
5400 /* Establish BSSGP connection to the PCU */
5401 f_bssgp_establish();
5402 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5403
5404 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005405 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 +01005406 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5407 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5408
5409 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005410 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005411
5412 /* CTRL client should have disconnected from us */
5413 f_ipa_ctrl_wait_link_down();
5414 /* wait for cache entries to time out */
5415 f_sleep(2.0);
5416 /* 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 +02005417 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005418
5419 f_shutdown(__BFILE__, __LINE__, final := true);
5420}
5421
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005422/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005423testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
5424 var RlcmacDlBlock dl_block;
5425 var PollFnCtx pollctx;
5426 var uint32_t sched_fn;
5427 var GprsMS ms;
5428 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5429 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005430 var GsmArfcn req_arfcn := 862;
5431 var uint6_t req_bsic := 43;
5432
5433 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
5434 * resolution CTRL port, to trigger Conn Refused by socket:
5435 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5436 */
5437
5438 /* Initialize NS/BSSGP side */
5439 f_init_bssgp();
5440 /* Initialize GPRS MS side */
5441 f_init_gprs_ms();
5442 ms := g_ms[0]; /* We only use first MS in this test */
5443
5444 /* Initialize the PCU interface abstraction */
5445 f_init_raw(testcasename(), info_ind);
5446
5447 /* Make sure we are not affected by full cache from previous tests */
5448 f_pcuvty_flush_neigh_caches();
5449
5450 /* Establish BSSGP connection to the PCU */
5451 f_bssgp_establish();
5452 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5453
5454 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005455 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 +01005456 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5457 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5458
5459 /* Start NACC from MS side */
5460 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5461 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5462
5463 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005464 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005465 /* Make sure it is a Pkt Cell Chg Continue */
5466 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5467 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5468 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005469 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5470 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5471 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5472 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5473 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005474
5475 f_shutdown(__BFILE__, __LINE__, final := true);
5476}
5477
5478/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005479testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
5480 var RlcmacDlBlock dl_block;
5481 var PollFnCtx pollctx;
5482 var uint32_t sched_fn;
5483 var GprsMS ms;
5484 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5485 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005486 var GsmArfcn req_arfcn := 862;
5487 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005488 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005489
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005490 if (use_old_ctrl_iface) {
5491 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5492 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5493 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005494
5495 /* Initialize NS/BSSGP side */
5496 f_init_bssgp();
5497 /* Initialize GPRS MS side */
5498 f_init_gprs_ms();
5499 ms := g_ms[0]; /* We only use first MS in this test */
5500
5501 /* Initialize the PCU interface abstraction */
5502 f_init_raw(testcasename(), info_ind);
5503
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005504 /* Make sure we are not affected by full cache from previous tests */
5505 f_pcuvty_flush_neigh_caches();
5506
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005507 /* Establish BSSGP connection to the PCU */
5508 f_bssgp_establish();
5509 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5510
5511 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005512 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 +01005513 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5514 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5515
5516 /* Start NACC from MS side */
5517 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5518 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5519
5520 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005521 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005522 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 +01005523
5524 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005525 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005526 /* Make sure it is a Pkt Cell Chg Continue */
5527 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5528 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5529 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005530 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5531 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5532 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5533 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5534 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005535
5536 f_shutdown(__BFILE__, __LINE__, final := true);
5537}
5538
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005539/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
5540testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
5541 var RlcmacDlBlock dl_block;
5542 var PollFnCtx pollctx;
5543 var uint32_t sched_fn;
5544 var GprsMS ms;
5545 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5546 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005547 var GsmArfcn req_arfcn := 862;
5548 var uint6_t req_bsic := 43;
5549
5550 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5551 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5552
5553 /* Initialize NS/BSSGP side */
5554 f_init_bssgp();
5555 /* Initialize GPRS MS side */
5556 f_init_gprs_ms();
5557 ms := g_ms[0]; /* We only use first MS in this test */
5558
5559 /* Initialize the PCU interface abstraction */
5560 f_init_raw(testcasename(), info_ind);
5561
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005562 /* Make sure we are not affected by full cache from previous tests */
5563 f_pcuvty_flush_neigh_caches();
5564
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005565 /* Establish BSSGP connection to the PCU */
5566 f_bssgp_establish();
5567 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5568
5569 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005570 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 +01005571 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5572 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5573
5574 /* Start NACC from MS side */
5575 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5576 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5577
5578 /* osmo-pcu should now ask for resolution: */
5579 f_ipa_ctrl_wait_link_up();
5580 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5581 int2str(info_ind.lac) & "." &
5582 int2str(info_ind.cell_id) & "." &
5583 int2str(req_arfcn) & "." &
5584 int2str(req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005585 /* we receive RAC+CI resolution request and we send incorrectly formated response */
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005586 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
5587
5588 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005589 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005590 /* Make sure it is a Pkt Cell Chg Continue */
5591 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5592 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5593 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005594 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5595 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5596 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5597 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5598 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005599
5600 f_shutdown(__BFILE__, __LINE__, final := true);
5601}
5602
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005603/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
5604testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
5605 var RlcmacDlBlock dl_block;
5606 var PollFnCtx pollctx;
5607 var uint32_t sched_fn;
5608 var GprsMS ms;
5609 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5610 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005611 var GsmArfcn req_arfcn := 862;
5612 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005613 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005614 var BssgpCellId src := valueof(ts_BssgpCellId(ts_RAI(ts_LAI(f_enc_BcdMccMnc(info_ind.mcc, info_ind.mnc, info_ind.mnc_3_digits == 1), /* '262F42'H */
5615 info_ind.lac),
5616 info_ind.rac),
5617 info_ind.cell_id));
5618 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
5619 423),
5620 2),
5621 5));
5622 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
5623 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
5624
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005625 if (use_old_ctrl_iface) {
5626 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5627 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5628 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005629
5630 /* Initialize NS/BSSGP side */
5631 f_init_bssgp();
5632 /* Initialize GPRS MS side */
5633 f_init_gprs_ms();
5634 ms := g_ms[0]; /* We only use first MS in this test */
5635
5636 /* Initialize the PCU interface abstraction */
5637 f_init_raw(testcasename(), info_ind);
5638
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005639 /* Make sure we are not affected by full cache from previous tests */
5640 f_pcuvty_flush_neigh_caches();
5641
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005642 /* Establish BSSGP connection to the PCU */
5643 f_bssgp_establish();
5644 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5645
5646 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005647 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 +01005648 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5649 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5650
5651 /* Start NACC from MS side */
5652 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5653 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5654
5655 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005656 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 +01005657
5658 /* RIM procedure: */
5659 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5660 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5661 tr_RAN_Information_Request_RIM_Container));
5662 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
5663
5664 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005665 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005666 /* Make sure it is a Pkt Cell Chg Continue */
5667 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5668 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5669 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005670 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5671 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5672 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5673 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5674 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005675
5676 f_shutdown(__BFILE__, __LINE__, final := true);
5677}
5678
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005679/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
5680testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
5681 var PollFnCtx pollctx;
5682 var GprsMS ms;
5683 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5684 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5685 var RlcmacDlBlock dl_block;
5686 var uint32_t sched_fn;
5687 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005688 var charstring ctrl_var;
5689 var PCUIF_Message pcu_msg;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005690 var GsmArfcn req_arfcn := 862;
5691 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005692 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005693
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005694 if (use_old_ctrl_iface) {
5695 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5696 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5697 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005698
5699 /* Initialize NS/BSSGP side */
5700 f_init_bssgp();
5701 /* Initialize GPRS MS side */
5702 f_init_gprs_ms();
5703 ms := g_ms[0]; /* We only use first MS in this test */
5704
5705 /* Initialize the PCU interface abstraction */
5706 f_init_raw(testcasename(), info_ind);
5707
5708 /* Make sure we are not affected by full cache from previous tests */
5709 f_pcuvty_flush_neigh_caches();
5710
5711 /* Establish BSSGP connection to the PCU */
5712 f_bssgp_establish();
5713 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5714
5715 /* Send PACKET RESOURCE REQUEST */
5716 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5717 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5718 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5719
5720 /* Start NACC from MS side */
5721 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5722 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5723
5724 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005725 if (use_old_ctrl_iface) {
5726 f_ipa_ctrl_wait_link_up();
5727 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5728 int2str(info_ind.lac) & "." &
5729 int2str(info_ind.cell_id) & "." &
5730 int2str(req_arfcn) & "." &
5731 int2str(req_bsic);
5732 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5733 } else {
5734 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5735 }
5736
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005737 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
5738 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5739 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005740
5741 if (use_old_ctrl_iface) {
5742 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5743 } else {
5744 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5745 }
5746
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005747 timer T := 2.0;
5748 T.start;
5749 alt {
5750 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005751 [use_old_ctrl_iface] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005752 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
5753 f_shutdown(__BFILE__, __LINE__);
5754 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005755 [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 {
5756 setverdict(fail, "Received unexpected PCUIF resolution after duplicate Pkt Cell Change Notification:", pcu_msg);
5757 f_shutdown(__BFILE__, __LINE__);
5758 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005759 [] T.timeout {
5760 setverdict(pass);
5761 }
5762 }
5763
5764 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005765 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005766
5767 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5768 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5769 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5770 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5771 f_shutdown(__BFILE__, __LINE__);
5772 }
5773 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5774 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5775 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5776 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5777 }
5778
5779 f_shutdown(__BFILE__, __LINE__, final := true);
5780}
5781
5782/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
5783testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
5784 var PollFnCtx pollctx;
5785 var GprsMS ms;
5786 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5787 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5788 var RlcmacDlBlock dl_block;
5789 var uint32_t sched_fn;
5790 var CtrlMessage rx_ctrl;
5791 var GsmArfcn req_arfcn := 862;
5792 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005793 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005794
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005795 if (use_old_ctrl_iface) {
5796 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5797 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5798 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005799
5800 /* Initialize NS/BSSGP side */
5801 f_init_bssgp();
5802 /* Initialize GPRS MS side */
5803 f_init_gprs_ms();
5804 ms := g_ms[0]; /* We only use first MS in this test */
5805
5806 /* Initialize the PCU interface abstraction */
5807 f_init_raw(testcasename(), info_ind);
5808
5809 /* Make sure we are not affected by full cache from previous tests */
5810 f_pcuvty_flush_neigh_caches();
5811
5812 /* Establish BSSGP connection to the PCU */
5813 f_bssgp_establish();
5814 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5815
5816 /* Send PACKET RESOURCE REQUEST */
5817 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5818 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5819 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5820
5821 /* Start NACC from MS side */
5822 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5823 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5824
5825 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005826 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 +01005827 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5828 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
5829 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5830 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5831 f_outbound_nacc_rim_tx_resp(info_ind);
5832 timer T := 1.0;
5833 T.start;
5834 alt {
5835 [] RIM.receive {
5836 setverdict(fail, "Received unexpected RIM message");
5837 f_shutdown(__BFILE__, __LINE__);
5838 }
5839 [] T.timeout {
5840 setverdict(pass);
5841 }
5842 }
5843
5844 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005845 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005846
5847 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5848 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5849 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5850 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5851 f_shutdown(__BFILE__, __LINE__);
5852 }
5853 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5854 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5855 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5856 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5857 }
5858
5859 f_shutdown(__BFILE__, __LINE__, final := true);
5860}
5861
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005862/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
5863testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
5864 var PollFnCtx pollctx;
5865 var GprsMS ms;
5866 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5867 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5868 var RlcmacDlBlock dl_block;
5869 var uint32_t sched_fn;
5870 var CtrlMessage rx_ctrl;
5871 var GsmArfcn req_arfcn := 862;
5872 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005873 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005874
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005875 if (use_old_ctrl_iface) {
5876 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5877 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5878 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005879
5880 /* Initialize NS/BSSGP side */
5881 f_init_bssgp();
5882 /* Initialize GPRS MS side */
5883 f_init_gprs_ms();
5884 ms := g_ms[0]; /* We only use first MS in this test */
5885
5886 /* Initialize the PCU interface abstraction */
5887 f_init_raw(testcasename(), info_ind);
5888
5889 /* Make sure we are not affected by full cache from previous tests */
5890 f_pcuvty_flush_neigh_caches();
5891
5892 /* Establish BSSGP connection to the PCU */
5893 f_bssgp_establish();
5894 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5895
5896 /* Send PACKET RESOURCE REQUEST */
5897 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5898 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5899 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5900
5901 /* Start NACC from MS side */
5902 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5903 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5904
5905 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005906 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 +01005907 /* RIM procedure: */
5908 as_outbound_nacc_rim_resolve(info_ind);
5909
5910 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
5911 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5912 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5913
5914 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
5915 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5916
5917 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5918 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5919 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5920 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5921 f_shutdown(__BFILE__, __LINE__);
5922 }
5923 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5924 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5925 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5926 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5927 }
5928}
5929
5930/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
5931testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
5932 var PollFnCtx pollctx;
5933 var GprsMS ms;
5934 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5935 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5936 var RlcmacDlBlock dl_block;
5937 var uint32_t sched_fn;
5938 var CtrlMessage rx_ctrl;
5939 var GsmArfcn req_arfcn := 862;
5940 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005941 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005942
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005943 if (use_old_ctrl_iface) {
5944 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5945 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5946 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005947
5948 /* Initialize NS/BSSGP side */
5949 f_init_bssgp();
5950 /* Initialize GPRS MS side */
5951 f_init_gprs_ms();
5952 ms := g_ms[0]; /* We only use first MS in this test */
5953
5954 /* Initialize the PCU interface abstraction */
5955 f_init_raw(testcasename(), info_ind);
5956
5957 /* Make sure we are not affected by full cache from previous tests */
5958 f_pcuvty_flush_neigh_caches();
5959
5960 /* Establish BSSGP connection to the PCU */
5961 f_bssgp_establish();
5962 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5963
5964 /* Send PACKET RESOURCE REQUEST */
5965 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5966 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5967 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5968
5969 /* Start NACC from MS side */
5970 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5971 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5972
5973 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005974 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 +01005975 /* RIM procedure: */
5976 as_outbound_nacc_rim_resolve(info_ind);
5977
5978 /* Announce SI back to MS, continue NACC procedure */
5979 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5980
5981 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5982 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5983
5984 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5985 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5986 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5987 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5988 f_shutdown(__BFILE__, __LINE__);
5989 }
5990 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5991 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5992 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5993 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5994 }
5995}
5996
5997/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5998testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
5999 var PollFnCtx pollctx;
6000 var GprsMS ms;
6001 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6002 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6003 var RlcmacDlBlock dl_block;
6004 var uint32_t sched_fn;
6005 var CtrlMessage rx_ctrl;
6006 var GsmArfcn req_arfcn := 862;
6007 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006008 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006009
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006010 if (use_old_ctrl_iface) {
6011 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6012 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6013 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006014
6015 /* Initialize NS/BSSGP side */
6016 f_init_bssgp();
6017 /* Initialize GPRS MS side */
6018 f_init_gprs_ms();
6019 ms := g_ms[0]; /* We only use first MS in this test */
6020
6021 /* Initialize the PCU interface abstraction */
6022 f_init_raw(testcasename(), info_ind);
6023
6024 /* Make sure we are not affected by full cache from previous tests */
6025 f_pcuvty_flush_neigh_caches();
6026
6027 /* Establish BSSGP connection to the PCU */
6028 f_bssgp_establish();
6029 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6030
6031 /* Send PACKET RESOURCE REQUEST */
6032 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6033 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6034 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6035
6036 /* Start NACC from MS side */
6037 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6038 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6039
6040 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006041 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 +01006042 /* RIM procedure: */
6043 as_outbound_nacc_rim_resolve(info_ind);
6044
6045 /* Announce SI back to MS, continue NACC procedure */
6046 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6047
6048 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6049 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6050 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6051 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6052 f_shutdown(__BFILE__, __LINE__);
6053 }
6054 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
6055 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6056
6057 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6058 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6059 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6060 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6061 }
6062}
6063
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006064/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
6065 * while waiting for CTRL resolution */
6066testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
6067 var PollFnCtx pollctx;
6068 var GprsMS ms;
6069 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6070 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6071 var RlcmacDlBlock dl_block;
6072 var uint32_t sched_fn;
6073 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006074 var charstring ctrl_var;
6075 var PCUIF_Message pcu_msg;
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006076 var GsmArfcn req_arfcn := 862;
6077 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006078 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006079
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006080 if (use_old_ctrl_iface) {
6081 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6082 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6083 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006084
6085 /* Initialize NS/BSSGP side */
6086 f_init_bssgp();
6087 /* Initialize GPRS MS side */
6088 f_init_gprs_ms();
6089 ms := g_ms[0]; /* We only use first MS in this test */
6090
6091 /* Initialize the PCU interface abstraction */
6092 f_init_raw(testcasename(), info_ind);
6093
6094 /* Make sure we are not affected by full cache from previous tests */
6095 f_pcuvty_flush_neigh_caches();
6096
6097 /* Establish BSSGP connection to the PCU */
6098 f_bssgp_establish();
6099 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6100
6101 /* Send PACKET RESOURCE REQUEST */
6102 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6103 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6104 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6105
6106 /* Start NACC from MS side */
6107 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6108 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6109
6110 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006111 if (use_old_ctrl_iface) {
6112 f_ipa_ctrl_wait_link_up();
6113 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
6114 int2str(info_ind.lac) & "." &
6115 int2str(info_ind.cell_id) & "." &
6116 int2str(req_arfcn) & "." &
6117 int2str(req_bsic);
6118 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
6119 } else {
6120 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
6121 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006122 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
6123 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6124 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6125 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006126 if (use_old_ctrl_iface) {
6127 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
6128 } else {
6129 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
6130 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006131 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006132 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 +01006133
6134 /* And finally everything continues as usual with RIN procedure */
6135 as_outbound_nacc_rim_resolve(info_ind);
6136
6137 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01006138 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006139
6140 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6141 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6142 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6143 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6144 f_shutdown(__BFILE__, __LINE__);
6145 }
6146 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6147 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6148 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6149 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6150 }
6151
6152 f_shutdown(__BFILE__, __LINE__, final := true);
6153}
6154
6155/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
6156 * while waiting for SI resolution */
6157testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
6158 var PollFnCtx pollctx;
6159 var GprsMS ms;
6160 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6161 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6162 var RlcmacDlBlock dl_block;
6163 var uint32_t sched_fn;
6164 var CtrlMessage rx_ctrl;
6165 var GsmArfcn req_arfcn := 862;
6166 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006167 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006168
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006169 if (use_old_ctrl_iface) {
6170 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6171 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6172 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006173
6174 /* Initialize NS/BSSGP side */
6175 f_init_bssgp();
6176 /* Initialize GPRS MS side */
6177 f_init_gprs_ms();
6178 ms := g_ms[0]; /* We only use first MS in this test */
6179
6180 /* Initialize the PCU interface abstraction */
6181 f_init_raw(testcasename(), info_ind);
6182
6183 /* Make sure we are not affected by full cache from previous tests */
6184 f_pcuvty_flush_neigh_caches();
6185
6186 /* Establish BSSGP connection to the PCU */
6187 f_bssgp_establish();
6188 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6189
6190 /* Send PACKET RESOURCE REQUEST */
6191 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6192 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6193 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6194
6195 /* Start NACC from MS side */
6196 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6197 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6198
6199 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006200 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 +01006201 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
6202 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
6203 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6204 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6205 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
6206 f_outbound_nacc_rim_tx_resp(info_ind);
6207
6208 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006209 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 +01006210
6211 /* And finally everything continues as usual with RIN procedure */
6212 as_outbound_nacc_rim_resolve(info_ind);
6213
6214 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01006215 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006216
6217 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6218 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6219 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6220 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6221 f_shutdown(__BFILE__, __LINE__);
6222 }
6223 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6224 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6225 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6226 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6227 }
6228
6229 f_shutdown(__BFILE__, __LINE__, final := true);
6230}
6231
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006232/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
6233 * while sending Pkt Neigh Data Change */
6234testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
6235 var PollFnCtx pollctx;
6236 var GprsMS ms;
6237 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6238 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6239 var RlcmacDlBlock dl_block;
6240 var uint32_t sched_fn;
6241 var CtrlMessage rx_ctrl;
6242 var GsmArfcn req_arfcn := 862;
6243 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006244 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006245
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006246 if (use_old_ctrl_iface) {
6247 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6248 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6249 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006250
6251 /* Initialize NS/BSSGP side */
6252 f_init_bssgp();
6253 /* Initialize GPRS MS side */
6254 f_init_gprs_ms();
6255 ms := g_ms[0]; /* We only use first MS in this test */
6256
6257 /* Initialize the PCU interface abstraction */
6258 f_init_raw(testcasename(), info_ind);
6259
6260 /* Make sure we are not affected by full cache from previous tests */
6261 f_pcuvty_flush_neigh_caches();
6262
6263 /* Establish BSSGP connection to the PCU */
6264 f_bssgp_establish();
6265 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6266
6267 /* Send PACKET RESOURCE REQUEST */
6268 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6269 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6270 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6271
6272 /* Start NACC from MS side */
6273 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6274 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6275
6276 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006277 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 +01006278 /* RIM procedure: */
6279 as_outbound_nacc_rim_resolve(info_ind);
6280
6281 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
6282 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
6283 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6284 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6285
6286 /* It should trigger RAC_CI resolution to start again: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006287 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 +01006288 /* RIM procedure: */
6289 as_outbound_nacc_rim_resolve(info_ind);
6290 /* Transmit SI back to MS */
6291 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6292
6293 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6294 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6295 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6296 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6297 f_shutdown(__BFILE__, __LINE__);
6298 }
6299 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6300 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6301 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6302 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6303 }
6304}
6305
6306/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
6307testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
6308 var PollFnCtx pollctx;
6309 var GprsMS ms;
6310 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6311 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6312 var RlcmacDlBlock dl_block;
6313 var uint32_t sched_fn;
6314 var CtrlMessage rx_ctrl;
6315 var GsmArfcn req_arfcn := 862;
6316 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006317 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006318
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006319 if (use_old_ctrl_iface) {
6320 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6321 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6322 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006323
6324 /* Initialize NS/BSSGP side */
6325 f_init_bssgp();
6326 /* Initialize GPRS MS side */
6327 f_init_gprs_ms();
6328 ms := g_ms[0]; /* We only use first MS in this test */
6329
6330 /* Initialize the PCU interface abstraction */
6331 f_init_raw(testcasename(), info_ind);
6332
6333 /* Make sure we are not affected by full cache from previous tests */
6334 f_pcuvty_flush_neigh_caches();
6335
6336 /* Establish BSSGP connection to the PCU */
6337 f_bssgp_establish();
6338 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6339
6340 /* Send PACKET RESOURCE REQUEST */
6341 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6342 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6343 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6344
6345 /* Start NACC from MS side */
6346 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6347 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6348
6349 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006350 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 +01006351 /* RIM procedure: */
6352 as_outbound_nacc_rim_resolve(info_ind);
6353
6354 /* Announce SI back to MS, continue NACC procedure */
6355 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6356
6357 /* trigger a Pkt Cell Change Notif with different tgt cell */
6358 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6359 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6360
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006361 /* It should trigger RAC_CI resolution to start again: */
6362 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6363
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006364 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6365 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
6366
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006367 /* RIM procedure: */
6368 as_outbound_nacc_rim_resolve(info_ind);
6369 /* Transmit SI back to MS */
6370 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6371
6372 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6373 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6374 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6375 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6376 f_shutdown(__BFILE__, __LINE__);
6377 }
6378 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6379 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6380 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6381 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6382 }
6383}
6384
6385/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
6386testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
6387 var PollFnCtx pollctx;
6388 var GprsMS ms;
6389 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6390 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6391 var RlcmacDlBlock dl_block;
6392 var uint32_t sched_fn;
6393 var CtrlMessage rx_ctrl;
6394 var GsmArfcn req_arfcn := 862;
6395 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006396 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006397
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006398 if (use_old_ctrl_iface) {
6399 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6400 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6401 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006402
6403 /* Initialize NS/BSSGP side */
6404 f_init_bssgp();
6405 /* Initialize GPRS MS side */
6406 f_init_gprs_ms();
6407 ms := g_ms[0]; /* We only use first MS in this test */
6408
6409 /* Initialize the PCU interface abstraction */
6410 f_init_raw(testcasename(), info_ind);
6411
6412 /* Make sure we are not affected by full cache from previous tests */
6413 f_pcuvty_flush_neigh_caches();
6414
6415 /* Establish BSSGP connection to the PCU */
6416 f_bssgp_establish();
6417 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6418
6419 /* Send PACKET RESOURCE REQUEST */
6420 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6421 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6422 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6423
6424 /* Start NACC from MS side */
6425 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6426 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6427
6428 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006429 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 +01006430 /* RIM procedure: */
6431 as_outbound_nacc_rim_resolve(info_ind);
6432
6433 /* Announce SI back to MS, continue NACC procedure */
6434 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6435
6436 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6437 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6438 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6439 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6440 f_shutdown(__BFILE__, __LINE__);
6441 }
6442
6443 /* trigger a Pkt Cell Change Notif with different tgt cell */
6444 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6445 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6446
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006447 /* It should trigger RAC_CI resolution to start again: */
6448 /* When using new PCUIF interface for resolution, we must
6449 * PCUIF.receive() here since that's the first message in the PCUIF
6450 * queue that PCU will have sent. Calling other functions doing
6451 * PCUIF.receive() (like f_ms_tx_ul_block() below) will make them fail
6452 * due to unexpected message receive. */
6453 if (not use_old_ctrl_iface) {
6454 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6455 }
6456
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006457 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6458 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6459 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6460 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6461 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006462
6463 /* When using CTRL interface, we must schedule the ACK before (see
6464 * above) blocking here waiting for the resoltion, otherwise we'll be
6465 * too late scheduling by the time the resolution is done. */
6466 if (use_old_ctrl_iface) {
6467 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6468 }
6469
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006470 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6471 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
6472
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006473 /* RIM procedure: */
6474 as_outbound_nacc_rim_resolve(info_ind);
6475 /* Transmit SI back to MS */
6476 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6477
6478 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6479 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6480 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6481 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6482 f_shutdown(__BFILE__, __LINE__);
6483 }
6484 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6485 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6486 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6487 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6488 }
6489}
6490
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006491/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
6492testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
6493 var PollFnCtx pollctx;
6494 var GprsMS ms;
6495 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6496 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6497 var RlcmacDlBlock dl_block;
6498 var uint32_t sched_fn, dl_fn;
6499 var CtrlMessage rx_ctrl;
6500 var GsmArfcn req_arfcn := 862;
6501 var uint6_t req_bsic := 43;
6502 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006503 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006504
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006505 if (use_old_ctrl_iface) {
6506 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6507 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6508 }
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006509
6510 /* Initialize NS/BSSGP side */
6511 f_init_bssgp();
6512 /* Initialize GPRS MS side */
6513 f_init_gprs_ms();
6514 ms := g_ms[0]; /* We only use first MS in this test */
6515
6516 /* Initialize the PCU interface abstraction */
6517 f_init_raw(testcasename(), info_ind);
6518
6519 /* Make sure we are not affected by full cache from previous tests */
6520 f_pcuvty_flush_neigh_caches();
6521
6522 /* Establish BSSGP connection to the PCU */
6523 f_bssgp_establish();
6524 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6525
6526 /* Send PACKET RESOURCE REQUEST */
6527 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6528 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6529 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6530
6531 /* Start NACC from MS side */
6532 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6533 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6534
6535 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006536 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 +01006537 /* RIM procedure: */
6538 as_outbound_nacc_rim_resolve(info_ind);
6539
6540 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
6541 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
6542 f_sleep(0.1);
6543 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
6544 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
6545
6546 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
6547 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
6548 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
6549 * Data with unassigned DL TBF in line above): */
6550 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6551 /* Continue receiving Pkt Cell Neighbor Data */
6552 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
6553
6554 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6555 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6556 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6557 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6558 f_shutdown(__BFILE__, __LINE__);
6559 }
6560 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6561 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6562 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6563 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6564 }
6565
6566 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
6567 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
6568 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
6569 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
6570 f_dl_block_ack_fn(dl_block, dl_fn));
6571}
6572
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006573
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006574function f_do_inbound_nacc(template (value) RIM_Routing_Information tx_src_addr, template RIM_Routing_Information rx_dst_addr)
6575runs on RAW_PCU_Test_CT
6576{
6577 var template (value) RAN_Information_Request_RIM_Container req_cont;
6578 var template (value) PDU_BSSGP bssgp_rim_pdu;
6579 var template PDU_BSSGP bssgp_rim_pdu_expect;
6580 var template RAN_Information_RIM_Container rim_cont_expect;
6581 var RIM_Routing_Address bts_addr;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006582
6583 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006584 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 +01006585 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006586 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 +01006587 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02006588 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);
6589 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006590 f_sleep(1.0);
6591
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006592 bts_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006593
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006594 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6595 ts_RIM_Sequence_Number(1),
6596 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6597 ts_RIM_Protocol_Version_Number(1),
6598 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6599 omit);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006600 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
6601 tx_src_addr, req_cont);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006602
6603 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6604 tr_RIM_Sequence_Number(1),
6605 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6606 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006607 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 +01006608 omit);
6609
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006610 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(rx_dst_addr,
6611 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006612 rim_cont_expect);
6613 RIM.send(bssgp_rim_pdu);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006614 timer T := 2.0;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006615 T.start;
6616 alt {
6617 [] RIM.receive(bssgp_rim_pdu_expect) { }
6618 [] RIM.receive {
6619 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6620 }
6621 [] T.timeout {
6622 setverdict(fail, "No BSSGP RIM PDU received");
6623 mtc.stop;
6624 }
6625 }
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006626}
6627/* Send a RIM RAN info request to the PCU and verify the response, we expect
6628 * getting the system information back which we have transfered to the PCU via
6629 * PCUIF on startup. */
6630testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
6631 /* Initialize NS/BSSGP side */
6632 f_init_bssgp();
6633
6634 /* Initialize the PCU interface abstraction */
6635 f_init_raw(testcasename());
6636
6637 /* Establish BSSGP connection to the PCU */
6638 f_bssgp_establish();
6639
6640 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6641 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6642
6643 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6644 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr));
6645
6646 f_shutdown(__BFILE__, __LINE__, final := true);
6647}
6648
6649/* Same as TC_rim_ran_info_req_single_rep, but using an EUTRAN eNodeB ID as
6650 * Routing information, to verify PCU handles that kind of address just fine
6651 */
6652testcase TC_rim_ran_info_req_single_rep_eutran() runs on RAW_PCU_Test_CT {
6653 /* Initialize NS/BSSGP side */
6654 f_init_bssgp();
6655
6656 /* Initialize the PCU interface abstraction */
6657 f_init_raw(testcasename());
6658
6659 /* Establish BSSGP connection to the PCU */
6660 f_bssgp_establish();
6661
6662 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6663 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_enbid(src_cid, tac := 3, gnbid := '12345678123456'O));
6664
6665 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr),
6666 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006667
6668 f_shutdown(__BFILE__, __LINE__, final := true);
6669}
6670
6671/* Same as above, but in this case we simulate the rare case in which the PCU
6672 * has no system information available. We expect getting a response back but
6673 * with no system information inside. */
6674testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006675 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006676 var PCUIF_Message pcu_msg;
6677 timer T := 2.0;
6678
6679 /* Initialize NS/BSSGP side */
6680 f_init_bssgp();
6681
6682 /* Initialize the PCU interface abstraction */
6683 f_init_raw(testcasename(), info_ind);
6684
6685 /* Establish BSSGP connection to the PCU */
6686 f_bssgp_establish();
6687
6688 /* Clear sysinfo from the PCU */
6689 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);
6690 BTS.send(si1_data_ind);
6691 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);
6692 BTS.send(si3_data_ind);
6693 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);
6694 BTS.send(si16_data_ind);
6695 f_sleep(1.0);
6696
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006697 var RIM_Routing_Address dst_addr;
6698 var RIM_Routing_Address src_addr;
6699 var template (value) RAN_Information_Request_RIM_Container req_cont;
6700 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006701 var template PDU_BSSGP bssgp_rim_pdu_expect;
6702 var template RAN_Information_RIM_Container rim_cont_expect;
6703
6704 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 +01006705 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6706 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006707
6708 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6709 ts_RIM_Sequence_Number(1),
6710 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6711 ts_RIM_Protocol_Version_Number(1),
6712 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6713 omit);
6714 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6715 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6716 req_cont);
6717
6718
6719 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6720 tr_RIM_Sequence_Number(1),
6721 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6722 tr_RIM_Protocol_Version_Number(1),
6723 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
6724 omit);
6725
6726 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6727 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6728 rim_cont_expect);
6729 RIM.send(bssgp_rim_pdu);
6730 T.start;
6731 alt {
6732 [] RIM.receive(bssgp_rim_pdu_expect) { }
6733 [] RIM.receive {
6734 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6735 }
6736 [] T.timeout {
6737 setverdict(fail, "No BSSGP RIM PDU received");
6738 mtc.stop;
6739 }
6740 }
6741
6742 f_shutdown(__BFILE__, __LINE__, final := true);
6743}
6744
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006745/* 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 +02006746testcase TC_pdch_energy_saving() runs on RAW_PCU_Test_CT {
6747 var PCUIF_info_ind info_ind;
6748 var template (value) TsTrxBtsNum nr;
6749 var RlcmacDlBlock dl_block;
6750 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006751 var integer ts;
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006752 timer T;
6753
6754 /* Initialize NS/BSSGP side */
6755 f_init_bssgp();
6756
6757 info_ind := valueof(ts_PCUIF_INFO_default);
6758 /* The 2 first TRX are enabled. */
6759 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (2 .. 7));
6760 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6761 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 1);
6762
6763 /* Initialize the PCU interface abstraction */
6764 f_init_raw(testcasename(), info_ind);
6765
6766 /* Establish BSSGP connection to the PCU */
6767 f_bssgp_establish();
6768
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006769 for (ts := 0; ts < 2; ts := ts + 1) {
6770 nr := ts_TsTrxBtsNum(ts_nr := 7, trx_nr := ts, bts_nr := 0, blk_nr := 0);
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006771
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006772 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
6773 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
6774 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), block_nr := nr.blk_nr));
6775 T.start(0.5);
6776 alt {
6777 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
6778 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
6779 omit)) -> value data_msg {
6780 setverdict(pass);
6781 T.stop;
6782 }
6783 [] as_rx_fail_dummy(nr);
6784 [] BTS.receive {
6785 setverdict(fail, "Unexpected block from BTS");
6786 f_shutdown(__BFILE__, __LINE__);
6787 }
6788 [] T.timeout {
6789 setverdict(fail, "Expected IDLE block from BTS");
6790 f_shutdown(__BFILE__, __LINE__);
6791 }
6792 }
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006793 }
6794
6795 f_shutdown(__BFILE__, __LINE__, final := true);
6796}
6797
Oliver Smith3d174882021-09-03 11:38:51 +02006798/* Test stats for available and occupied PDCHs */
6799testcase TC_stat_pdch_avail_occ() runs on RAW_PCU_Test_CT {
6800 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6801 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6802
6803 /* Initialize NS/BSSGP side */
6804 f_init_bssgp();
6805
Oliver Smithedcded22021-09-14 09:26:55 +02006806 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6807 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6808 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6809 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6810 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6811 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
Oliver Smith3d174882021-09-03 11:38:51 +02006812
Oliver Smith72d0c692021-09-08 10:03:52 +02006813 /* Allocate 4 GprsMS instances */
Oliver Smith3d174882021-09-03 11:38:51 +02006814 f_init_gprs_ms(4);
6815
6816 /* Initialize the PCU interface abstraction */
6817 f_init_raw(testcasename(), info_ind);
6818
6819 /* Reset stats */
6820 f_statsd_reset();
6821
6822 /* Establish BSSGP */
6823 f_bssgp_establish();
6824
6825 /* 8 PDCHs available, 0 occupied */
6826 var StatsDExpects expect := {
6827 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006828 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6829 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6830 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
Oliver Smith3d174882021-09-03 11:38:51 +02006831 };
6832 f_statsd_expect(expect);
6833
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006834 /* Establish an Uplink TBF for each GprsMS instance (3x GPRS, 1x EGPRS) */
Oliver Smith3d174882021-09-03 11:38:51 +02006835 f_multi_ms_bssgp_register();
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006836 f_ms_establish_ul_tbf(g_ms[0]);
6837 f_ms_establish_ul_tbf(g_ms[1]);
6838 f_ms_establish_ul_tbf(g_ms[2]);
6839 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 +02006840
6841 /* 4 PDCHs occupied */
6842 expect := {
6843 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006844 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 4, max := 4 },
6845 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 3, max := 3 },
6846 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
Oliver Smith3d174882021-09-03 11:38:51 +02006847 };
6848 f_statsd_expect(expect);
6849
6850 f_shutdown(__BFILE__, __LINE__, final := true);
6851}
6852
Oliver Smithf04762d2021-09-14 17:20:38 +02006853/* Test stats for available and occupied PDCHs, for MS which is not known by
6854 * the PCU (e.g. because it was forgotten due to no interaction, and old DL
6855 * data arrives from SGSN) */
6856function f_tc_stat_pdch_avail_occ_ms_not_known(boolean egprs) runs on RAW_PCU_Test_CT {
6857 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6858 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6859
6860 /* Ensure a deterministic slot allocation of 1 PDCH with MS class 1 */
6861 const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs := {
6862 gprsmultislotclass := '00001'B,
6863 gprsextendeddynalloccap := '0'B
6864 };
6865 const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs := {
6866 egprsmultislotclass := '00001'B,
6867 egprsextendeddynalloccap := '0'B
6868 };
6869 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs := {
6870 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, omit)) };
6871 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs := {
6872 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, bssgp_mscap_egprs)) };
6873
6874 /* Initialize NS/BSSGP side */
6875 f_init_bssgp();
6876
6877 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6878 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6879 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6880 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6881 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6882 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
6883
6884 /* Allocate 1 GprsMS instance */
6885 f_init_gprs_ms(1);
6886
6887 /* Initialize the PCU interface abstraction */
6888 f_init_raw(testcasename(), info_ind);
6889
6890 /* Reset stats */
6891 f_statsd_reset();
6892
6893 /* Establish BSSGP */
6894 f_bssgp_establish();
6895
6896 /* 8 PDCHs available, 0 occupied */
6897 var StatsDExpects expect := {
6898 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6899 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6900 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6901 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6902 };
6903 f_statsd_expect(expect);
6904
6905 var GprsMS ms := g_ms[0]; /* We only use first MS in this test */
6906 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6907
6908 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
6909 var octetstring data := f_rnd_octstring(1400);
6910 if (egprs) {
6911 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs));
6912 } else {
6913 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_gprs));
6914 }
6915 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
6916
6917 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
6918 f_sleep(X2002);
6919
6920 /* 1 PDCH occupied */
6921 if (egprs) {
6922 expect := {
6923 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6924 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6925 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6926 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
6927 };
6928 } else {
6929 expect := {
6930 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6931 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6932 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 1, max := 1 },
6933 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6934 };
6935 }
6936 f_statsd_expect(expect);
6937
6938 /* Clean up */
6939 f_shutdown(__BFILE__, __LINE__, final := true);
6940}
6941testcase TC_stat_pdch_avail_occ_ms_not_known_gprs() runs on RAW_PCU_Test_CT {
6942 f_tc_stat_pdch_avail_occ_ms_not_known(false);
6943}
6944testcase TC_stat_pdch_avail_occ_ms_not_known_egprs() runs on RAW_PCU_Test_CT {
6945 f_tc_stat_pdch_avail_occ_ms_not_known(true);
6946}
6947
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006948/* Make sure that bts.0.pdch.all_allocated is set when we allocate all resources */
6949testcase TC_ratectr_all_available_allocated() runs on RAW_PCU_Test_CT {
6950 var PCUIF_info_ind info_ind;
6951 var template IARRestOctets rest;
6952 var BIT11 ra11;
6953
6954 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006955
6956 /* Only the first TRX is enabled. */
6957 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
6958 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6959
6960 /* Initialize the PCU interface abstraction */
6961 f_init_raw(testcasename(), info_ind);
6962 f_statsd_reset();
6963
6964 var EGPRSPktChRequest req := {
6965 one_phase := {
6966 tag := '0'B,
6967 multislot_class := '10101'B,
6968 priority := '01'B,
6969 random_bits := '101'B
6970 }
6971 };
6972
6973 /* We send 7 requests, the IUT gives us all available USFs (0..6) */
6974 for (var integer i := 0; i < 7; i := i + 1) {
6975 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
6976 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
6977 }
6978
6979 ra11 := enc_EGPRSPktChRequest2bits(req);
6980 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
6981
6982 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrol209dc7d2021-11-15 16:25:08 +01006983 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006984
6985 /* bts.0.pdch.all_allocated is updated once per second, wait some time to make sure it was updated. */
6986 f_sleep(2.0);
6987 var StatsDExpects expect := {
6988 { name := "TTCN3.bts.0.pdch.all_allocated", mtype := "c", min := 1, max := 1 }
6989 };
6990 f_statsd_expect(expect);
6991
6992 f_shutdown(__BFILE__, __LINE__, final := true);
6993}
6994
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006995control {
6996 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01006997 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006998 execute( TC_ta_ptcch_idle() );
6999 execute( TC_ta_rach_imm_ass() );
Vadim Yanitskiy866f8702021-05-26 14:50:27 +02007000 execute( TC_ta_ul_ack_nack_first_block() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007001 execute( TC_ta_idle_dl_tbf_ass() );
7002 execute( TC_ta_ptcch_ul_multi_tbf() );
7003 execute( TC_cs_lqual_ul_tbf() );
7004 execute( TC_cs_initial_ul() );
7005 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01007006 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01007007 execute( TC_cs_max_dl() );
7008 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01007009 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01007010 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01007011 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01007012 execute( TC_mcs_max_dl() );
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02007013 execute( TC_t3141() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01007014 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02007015 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01007016 execute( TC_x2031_t3191() );
7017 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007018 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01007019 execute( TC_n3105_max_t3195() );
Pau Espin Pedrole8a94442021-11-15 17:05:46 +01007020 execute( TC_t3172_wait_ind_size0() );
7021 execute( TC_t3172_wait_ind_size1() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02007022 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02007023 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02007024 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007025 execute( TC_mo_ping_pong() );
7026 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02007027 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007028 execute( TC_mt_ping_pong() );
7029 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02007030 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007031 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07007032 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02007033 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01007034 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol6844c162022-04-01 15:40:06 +02007035 execute( TC_dl_llc_sapi_priority() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007036 execute( TC_paging_cs_from_bts() );
7037 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
7038 execute( TC_paging_cs_from_sgsn_sign() );
7039 execute( TC_paging_cs_from_sgsn_ptp() );
7040 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
7041 execute( TC_paging_ps_from_sgsn_sign() );
7042 execute( TC_paging_ps_from_sgsn_ptp() );
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01007043 execute( TC_paging_pch_timeout() );
7044
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07007045 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
7046 execute( TC_paging_cs_multi_ms_imsi() );
7047 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02007048 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
7049 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01007050 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
7051 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007052
Pau Espin Pedrol0b6b0d02022-10-25 21:21:02 +02007053 execute( TC_ul_tbf_finished_pkt_dl_ass_pch() );
Pau Espin Pedrol99e00b42022-10-28 13:28:52 +02007054 execute( TC_ul_tbf_1phase_while_dl_ass_pch() );
7055 execute( TC_ul_tbf_2phase_while_dl_ass_pch() );
Pau Espin Pedrol0b6b0d02022-10-25 21:21:02 +02007056
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007057 /* EGPRS specific test cases */
7058 execute( TC_egprs_pkt_chan_req_signalling() );
7059 execute( TC_egprs_pkt_chan_req_one_phase() );
7060 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07007061 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07007062 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07007063 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02007064
7065 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07007066
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01007067 /* Immediate Assignment on AGCH/PCH */
7068 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
7069 execute( TC_pcuif_fh_imm_ass_ul() );
7070 execute( TC_pcuif_fh_imm_ass_dl() );
7071 /* Packet Uplink/Downlink Assignment on PACCH */
7072 execute( TC_pcuif_fh_pkt_ass_ul() );
7073 execute( TC_pcuif_fh_pkt_ass_dl() );
7074 execute( TC_multitrx_multims_alloc() );
7075 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
7076 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
7077 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
Pau Espin Pedrol37604572021-10-15 14:36:16 +02007078 execute( TC_ul_tbf_reestablish_with_pkt_resource_req() );
Pau Espin Pedrold658f342021-10-15 14:52:22 +02007079 execute( TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() );
Pau Espin Pedrol59aa1092021-11-15 18:53:34 +01007080 execute( TC_ul_tbf_reestablish_with_pkt_dl_ack_nack() );
7081 execute( TC_ul_tbf_reestablish_with_pkt_dl_ack_nack_egprs() );
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01007082
Pau Espin Pedrole1303052020-11-16 11:13:51 +01007083 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07007084
7085 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01007086 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01007087 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01007088 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01007089 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01007090 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01007091 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01007092 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
7093 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01007094 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
7095 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
7096 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01007097 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
7098 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01007099 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
7100 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
7101 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01007102 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02007103 if (mp_ctrl_neigh_ip != "") { /* PCU using old CTRL neigh addr resolution iface */
7104 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
7105 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
7106 }
Philipp Maierd55fe7e2021-02-01 17:23:40 +01007107
7108 execute( TC_rim_ran_info_req_single_rep() );
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02007109 execute( TC_rim_ran_info_req_single_rep_eutran() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01007110 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02007111
7112 execute (TC_pdch_energy_saving() );
Oliver Smith3d174882021-09-03 11:38:51 +02007113
7114 execute( TC_stat_pdch_avail_occ() );
Oliver Smithf04762d2021-09-14 17:20:38 +02007115 execute( TC_stat_pdch_avail_occ_ms_not_known_gprs() );
7116 execute( TC_stat_pdch_avail_occ_ms_not_known_egprs() );
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01007117 execute( TC_ratectr_all_available_allocated() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02007118}
7119
Harald Weltea419df22019-03-21 17:23:04 +01007120}