blob: 6d17d9635e874f05deea4bbadb0fc56ce40b1225 [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 Pedrol8dd59fb2020-04-29 15:08:16 +02003968private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003969 template GsmRrMessage t_imm_ass := ?,
3970 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003971runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003972 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003973 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003974
3975 ra11 := enc_EGPRSPktChRequest2uint(req);
3976 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3977
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003978 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003979 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003980 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003981 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003982 }
3983
3984 setverdict(pass);
3985}
3986
3987testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3988 var template GsmRrMessage imm_ass;
3989 var template IaRestOctets rest;
3990 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003991 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003992
3993 /* Initialize the PCU interface abstraction */
3994 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003995 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003996
3997 var EGPRSPktChRequest req := {
3998 /* NOTE: other fields are set in the loop */
3999 signalling := { tag := '110011'B }
4000 };
4001
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004002 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004003 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
4004 req.signalling.random_bits := ext_ra;
4005
4006 /* For signalling, do we expect Multiblock UL TBF Assignment? */
4007 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
4008 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
4009 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
4010
4011 f_TC_egprs_pkt_chan_req(req, imm_ass);
4012 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004013
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004014 var StatsDExpects expect := {
4015 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4016 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4017 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4018 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
4019 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
4020 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
4021 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
4022 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4023 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4024 };
4025 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004026
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004027 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004028}
4029
4030testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
4031 var template GsmRrMessage imm_ass;
4032 var template IaRestOctets rest;
4033 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004034 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004035
4036 /* Initialize the PCU interface abstraction */
4037 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004038 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004039
4040 var EGPRSPktChRequest req := {
4041 /* NOTE: other fields are set in the loop */
4042 one_phase := { tag := '0'B }
4043 };
4044
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004045 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004046 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
4047 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
4048 var BIT2 priority := substr(ext_ra, 0, 2);
4049 var BIT3 rand := substr(ext_ra, 2, 3);
4050
4051 req.one_phase.multislot_class := mslot_class;
4052 req.one_phase.priority := priority;
4053 req.one_phase.random_bits := rand;
4054
4055 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
4056 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
4057 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
4058 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
4059
4060 f_TC_egprs_pkt_chan_req(req, imm_ass);
4061 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004062
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004063 var StatsDExpects expect := {
4064 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4065 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4066 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := num_req, max := num_req },
4067 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4068 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
4069 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := num_req, max := num_req },
4070 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4071 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4072 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4073 };
4074 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004075
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004076 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004077}
4078
4079testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
4080 var template GsmRrMessage imm_ass;
4081 var template IaRestOctets rest;
4082 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004083 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004084
4085 /* Initialize the PCU interface abstraction */
4086 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004087 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004088
4089 var EGPRSPktChRequest req := {
4090 /* NOTE: other fields are set in the loop */
4091 two_phase := { tag := '110000'B }
4092 };
4093
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004094 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004095 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
4096 var BIT2 priority := substr(ext_ra, 0, 2);
4097 var BIT3 rand := substr(ext_ra, 2, 3);
4098
4099 req.two_phase.priority := priority;
4100 req.two_phase.random_bits := rand;
4101
4102 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
4103 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
4104 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
4105 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
4106
4107 f_TC_egprs_pkt_chan_req(req, imm_ass);
4108 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004109
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004110 var StatsDExpects expect := {
4111 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4112 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4113 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4114 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
4115 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
4116 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
4117 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
4118 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4119 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4120 };
4121 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004122
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07004123 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02004124}
4125
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004126private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
4127 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004128 PCUIF_BurstType bt := BURST_TYPE_1,
4129 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004130runs on RAW_PCU_Test_CT {
4131 var template ReqRefWaitInd tr_ref;
4132 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004133
4134 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
4135 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
4136 ra := bit2int(ra11), is_11bit := 1,
4137 burst_type := bt, fn := fn,
4138 arfcn := 871));
4139
4140 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07004141 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004142
4143 /* Just to have a short-name reference to the actual message */
4144 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
4145
4146 /* Make sure that Request Reference list contains at least one entry
4147 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004148 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004149 if (not match(iar.payload, { *, tr_ref, * })) {
4150 setverdict(fail, "Request Reference list does not match");
4151 f_shutdown(__BFILE__, __LINE__);
4152 }
4153
4154 /* Match Feature Indicator (must indicate PS domain) */
4155 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
4156 setverdict(fail, "Feature Indicator does not match");
4157 f_shutdown(__BFILE__, __LINE__);
4158 }
4159
4160 /* Match IAR Rest Octets */
4161 if (not match(iar.rest_octets, rest)) {
4162 setverdict(fail, "IAR Rest Octets does not match: ",
4163 iar.rest_octets, " vs expected ", rest);
4164 f_shutdown(__BFILE__, __LINE__);
4165 }
4166
4167 setverdict(pass);
4168}
4169
4170/* Verify the contents of RR Immediate Assignment Reject message and its
4171 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
4172testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
4173 var template IARRestOctets rest;
4174 var BIT5 ext_ra;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004175 const integer num_req := 6;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004176
4177 /* Initialize the PCU interface abstraction */
4178 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004179 f_statsd_reset();
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004180
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004181 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004182 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
4183 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
4184
4185 /* Intentionally incorrect message (see table 11.2.5a.2) */
4186 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
4187 }
4188
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004189 var StatsDExpects expect := {
4190 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4191 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4192 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4193 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4194 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
4195 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
4196 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
4197 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4198 };
4199 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004200
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004201 f_shutdown(__BFILE__, __LINE__, final := true);
4202}
4203
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004204/* At the moment, the IUT does not support any emergency services. Make sure
4205 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
4206testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
4207 var template IARRestOctets rest;
4208 var BIT5 ext_ra;
4209 var BIT11 ra11;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004210 const integer num_req := 6;
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004211
4212 /* Initialize the PCU interface abstraction */
4213 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004214 f_statsd_reset();
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004215
4216 var EGPRSPktChRequest req := {
4217 /* NOTE: other fields are set in the loop */
4218 emergency := { tag := '110111'B }
4219 };
4220
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004221 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004222 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
4223 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
4224
4225 req.emergency.random_bits := ext_ra;
4226 ra11 := enc_EGPRSPktChRequest2bits(req);
4227
4228 /* Intentionally incorrect message (see table 11.2.5a.2) */
4229 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
4230 }
4231
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004232 var StatsDExpects expect := {
4233 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4234 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4235 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4236 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4237 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
4238 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
4239 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
4240 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4241 };
4242 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004243
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004244 f_shutdown(__BFILE__, __LINE__, final := true);
4245}
4246
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004247/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
4248testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004249 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004250 var template IARRestOctets rest;
4251 var BIT11 ra11;
4252
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004253 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004254 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07004255
4256 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004257 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
4258 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004259
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004260 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004261 f_init_raw(testcasename(), info_ind);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004262 f_statsd_reset();
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004263
4264 var EGPRSPktChRequest req := {
4265 one_phase := {
4266 tag := '0'B,
4267 multislot_class := '10101'B,
4268 priority := '01'B,
4269 random_bits := '101'B
4270 }
4271 };
4272
4273 /* We send 7 requests, the IUT gives us all available USFs (0..6).
4274 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
4275 for (var integer i := 0; i < 7; i := i + 1) {
4276 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
4277 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
4278 }
4279
4280 ra11 := enc_EGPRSPktChRequest2bits(req);
4281 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
4282
4283 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004284 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004285
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004286 var StatsDExpects expect := {
4287 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 8, max := 8 },
4288 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 8, max := 8 },
4289 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 8, max := 8 },
4290 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4291 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := 0, max := 0 },
4292 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 7, max := 7 },
4293 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 7, max := 7 },
4294 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4295 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4296 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := 1, max := 1 },
4297 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4298 };
4299 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004300
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004301 f_shutdown(__BFILE__, __LINE__, final := true);
4302}
4303
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004304/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004305private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004306return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004307 /* Pick a random MA length in range 2 .. max_ma_len */
4308 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
4309
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004310 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
4311 hsn := f_rnd_int(63),
4312 maio := f_rnd_int(63),
4313 ma := f_rnd_bitstring(ma_len));
4314}
4315
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004316private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
4317 in GsmRrMessage rr_msg)
4318{
4319 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004320 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004321
4322 var template PacketChannelDescription tr_pkt_chan_desc := {
4323 channel_Type_spare := ?,
4324 tn := ?,
4325 tsc := ts.tsc,
4326 presence := '1'B,
4327 zero := omit,
4328 one := {
4329 maio := ts.maio,
4330 hsn := ts.hsn
4331 }
4332 };
4333
4334 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
4335 setverdict(fail, "Packet Channel Description does not match: ",
4336 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
4337 }
4338
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004339 /* Mobile Allocation is expected to be octet-aligned */
4340 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
4341 var template MobileAllocationLV tr_ma := {
4342 len := ma_oct_len, /* in bytes */
4343 ma := substr(ts.ma, 0, ma_oct_len * 8)
4344 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004345
4346 if (not match(ia.mobile_allocation, tr_ma)) {
4347 setverdict(fail, "Mobile Allocation does not match: ",
4348 ia.mobile_allocation, " vs ", tr_ma);
4349 }
4350
4351 setverdict(pass);
4352}
4353
4354/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
4355testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004356 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004357 var GprsMS ms := valueof(t_GprsMS_def);
4358
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004359 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004360 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004361
4362 /* Initialize the PCU interface abstraction */
4363 f_init_raw(testcasename(), info_ind);
4364
4365 /* EGPRS Packet Channel Request (cause=Signalling) */
4366 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
4367
4368 /* Establish an Uplink EGPRS TBF */
4369 f_ms_establish_ul_tbf(ms);
4370
4371 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4372 f_shutdown(__BFILE__, __LINE__, final := true);
4373}
4374
4375/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
4376testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004377 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004378 var GprsMS ms := valueof(t_GprsMS_def);
4379
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004380 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004381 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004382
4383 /* Initialize the PCU interface abstraction */
4384 f_init_raw(testcasename(), info_ind);
4385
4386 /* Establish an Uplink TBF */
4387 f_ms_establish_ul_tbf(ms);
4388
4389 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4390 f_shutdown(__BFILE__, __LINE__, final := true);
4391}
4392
4393/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
4394testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004395 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004396 var GprsMS ms := valueof(t_GprsMS_def);
4397
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004398 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004399 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004400
4401 /* Initialize NS/BSSGP side */
4402 f_init_bssgp();
4403
4404 /* Initialize the PCU interface abstraction */
4405 f_init_raw(testcasename(), info_ind);
4406
4407 /* Establish BSSGP connection to the PCU */
4408 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004409 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004410
4411 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
4412 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
4413 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4414
4415 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
4416 f_shutdown(__BFILE__, __LINE__, final := true);
4417}
4418
4419private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
4420 in FrequencyParameters fp)
4421{
4422 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004423 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004424
4425 /* Table 12.8.1: Frequency Parameters information elements */
4426 var template FrequencyParameters tr_fp := {
4427 tsc := ts.tsc,
4428 presence := '10'B, /* Direct encoding 1 */
4429 arfcn := omit,
4430 indirect := omit,
4431 direct1 := {
4432 maio := ts.maio,
4433 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
4434 mobile_allocation := {
4435 hsn := ts.hsn,
4436 rfl_number_list_present := '0'B,
4437 rfl_number_list := omit,
4438 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004439 ma_length := ts.ma_bit_len,
4440 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004441 }
4442 },
4443 direct2 := omit
4444 };
4445
4446 if (not match(fp, tr_fp)) {
4447 setverdict(fail, "Frequency Parameters IE does not match: ",
4448 fp, " vs ", tr_fp);
4449 }
4450
4451 setverdict(pass);
4452}
4453
4454/* Make sure that Packet Uplink Assignment contains hopping parameters */
4455testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004456 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004457 var GprsMS ms := valueof(t_GprsMS_def);
4458 var uint32_t poll_fn;
4459
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004460 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004461 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004462
4463 /* Initialize the PCU interface abstraction */
4464 f_init_raw(testcasename(), info_ind);
4465
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004466 /* Single block (two phase) packet access */
4467 var uint16_t ra := bit2int(chan_req_sb);
4468 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
4469
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004470 /* Establish an Uplink TBF */
4471 f_ms_establish_ul_tbf(ms);
4472
4473 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004474 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
4475 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004476
4477 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004478 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
4479 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004480
4481 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
4482 var template (omit) FrequencyParameters fp;
4483 if (ua.is_egprs == '1'B) {
4484 fp := ua.egprs.freq_par;
4485 } else {
4486 fp := ua.gprs.freq_par;
4487 }
4488
4489 /* This is an optional IE, so it's worth to check its presence */
4490 if (istemplatekind(fp, "omit")) {
4491 setverdict(fail, "Frequency Parameters IE is not present");
4492 f_shutdown(__BFILE__, __LINE__);
4493 }
4494
4495 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
4496 f_shutdown(__BFILE__, __LINE__, final := true);
4497}
4498
4499/* Make sure that Packet Downlink Assignment contains hopping parameters */
4500testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004501 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004502 var octetstring data := f_rnd_octstring(10);
4503 var GprsMS ms := valueof(t_GprsMS_def);
4504 var RlcmacDlBlock dl_block;
4505 var uint32_t poll_fn;
4506
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004507 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004508 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004509
4510 /* Initialize NS/BSSGP side */
4511 f_init_bssgp();
4512
4513 /* Initialize the PCU interface abstraction */
4514 f_init_raw(testcasename(), info_ind);
4515
4516 /* Establish BSSGP connection to the PCU */
4517 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004518 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004519
4520 /* Establish an Uplink TBF */
4521 f_ms_establish_ul_tbf(ms);
4522
4523 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004524 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 +07004525
4526 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4527 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
4528 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4529
4530 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
4531 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4532
4533 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004534 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4535 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004536
4537 /* This is an optional IE, so it's worth to check its presence */
4538 if (not ispresent(da.freq_par)) {
4539 setverdict(fail, "Frequency Parameters IE is not present");
4540 f_shutdown(__BFILE__, __LINE__);
4541 }
4542
4543 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
4544 f_shutdown(__BFILE__, __LINE__, final := true);
4545}
4546
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004547/* Check if the IUT handles subsequent INFO.ind messages */
4548testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004549 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004550 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004551
4552 /* Initialize the PCU interface abstraction */
4553 f_init_raw(testcasename(), info_ind);
4554
4555 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
4556 for (var integer i := 0; i < 16; i := i + 1) {
4557 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004558 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004559 }
4560
4561 f_shutdown(__BFILE__, __LINE__, final := true);
4562}
4563
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004564/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
4565testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
4566 var PCUIF_info_ind info_ind;
4567 var integer i;
4568 const integer num_ms := 8;
4569
4570 /* Initialize NS/BSSGP side */
4571 f_init_bssgp();
4572 /* Initialize GPRS MS side */
4573 f_init_gprs_ms(num_ms);
4574
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01004575 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004576 /* Only the 3 first TRX are enabled. The enabled ones all have same
4577 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004578 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
4579 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
4580 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
4581 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004582
4583 /* Initialize the PCU interface abstraction */
4584 f_init_raw(testcasename(), info_ind);
4585
4586 /* Establish BSSGP connection to the PCU */
4587 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004588 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004589
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004590 /* Establish an Uplink TBF for each GprsMS instance */
4591 f_multi_ms_establish_tbf(do_activate := false);
4592
4593 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004594 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004595 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01004596 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004597 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004598 f_shutdown(__BFILE__, __LINE__);
4599 }
4600 }
4601
4602 f_shutdown(__BFILE__, __LINE__, final := true);
4603}
4604
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004605/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
4606 * downgraded to CS1-4 so that GPRS can read the USF).
4607 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
4608 */
4609testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
4610 var PCUIF_info_ind info_ind;
4611 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
4612 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004613 var uint32_t sched_fn, dl_fn, ack_fn;
4614 var octetstring data := f_rnd_octstring(10);
4615 var RlcmacDlBlock dl_block;
4616 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004617 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004618 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
4619 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
4620
4621 /* Initialize NS/BSSGP side */
4622 f_init_bssgp();
4623 /* Initialize GPRS MS side */
4624 f_init_gprs_ms(num_ms);
4625
4626 info_ind := valueof(ts_PCUIF_INFO_default);
4627 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004628 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
4629 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004630
4631 /* Initialize the PCU interface abstraction */
4632 f_init_raw(testcasename(), info_ind);
4633
4634 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
4635 g_mcs_initial_dl := 5;
4636 g_mcs_max_dl := 5;
4637 f_pcuvty_set_allowed_cs_mcs();
4638
4639 /* Establish BSSGP connection to the PCU */
4640 f_bssgp_establish();
4641 f_multi_ms_bssgp_register();
4642
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004643 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004644 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 +01004645 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
4646 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
4647 f_shutdown(__BFILE__, __LINE__);
4648 }
4649 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4650 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4651
4652 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004653 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 +01004654 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
4655 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
4656 f_shutdown(__BFILE__, __LINE__);
4657 }
4658 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4659 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4660
4661 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
4662 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4663 f_sleep(0.1);
4664 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4665 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4666 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
4667 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4668 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
4669 /* ACK the DL block */
4670 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
4671 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
4672 f_dl_block_ack_fn(dl_block, dl_fn));
4673
4674 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
4675 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4676 f_sleep(0.1);
4677 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4678 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4679 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
4680 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4681 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
4682 /* ACK the DL block */
4683 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
4684 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
4685 f_dl_block_ack_fn(dl_block, dl_fn));
4686
4687 data := f_rnd_octstring(1400);
4688 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4689 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4690
4691 for (var integer i := 0; i < 800; i := i + 1) {
4692 f_rx_rlcmac_dl_block(dl_block, dl_fn);
4693
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07004694 if (match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL)) {
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004695 /* No more data to receive, done */
4696 break;
4697 }
4698
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004699 usf_ms := -1;
4700
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004701 if (ischosen(dl_block.ctrl)) {
4702 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
4703 f_shutdown(__BFILE__, __LINE__);
4704 } else if (ischosen(dl_block.data_egprs)) {
4705 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
4706 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
4707 f_shutdown(__BFILE__, __LINE__);
4708 }
4709 tgt_ms := 1;
4710 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
4711 if (dl_block.data_egprs.mcs > MCS_4) {
4712 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
4713 f_shutdown(__BFILE__, __LINE__);
4714 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004715 usf_ms := 0;
4716 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004717 } else {
4718 if (dl_block.data_egprs.mcs <= MCS_4) {
4719 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
4720 f_shutdown(__BFILE__, __LINE__);
4721 }
4722 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004723 usf_ms := 1;
4724 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004725 }
4726 }
4727 } else {
4728 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
4729 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
4730 f_shutdown(__BFILE__, __LINE__);
4731 }
4732 tgt_ms := 0;
4733 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 +01004734 usf_ms := 0;
4735 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004736 } 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 +01004737 usf_ms := 1;
4738 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004739 }
4740 }
4741
4742 /* Keep Ack/Nack description updated */
4743 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
4744
4745 /* TDMA frame number on which we are supposed to send the ACK */
4746 if (f_dl_block_rrbp_valid(dl_block)) {
4747 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
4748 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);
4749 if (tx_data_remain != 0) {
4750 /* Submit more data from time to time to keep the TBF ongoing */
4751 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4752 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4753 tx_data_remain := tx_data_remain - 1;
4754 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004755 } else if (tx_data_remain != 0) {
4756 /* keep sending UL blocks when requested by USF to avoid
4757 * UL TBF timeout and hence stop receival of USFs */
4758 if (usf_ms != -1) {
4759 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
4760 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004761 }
4762 }
4763
4764 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 +01004765 /* He we check that DL blocks scheduled at GPRS can still request UL
4766 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
4767 * condition also ensures the downgrade to <=MCS4 condition is tested
4768 * above */
4769 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
4770 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004771 f_shutdown(__BFILE__, __LINE__);
4772 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004773 /* Here check for some level of fairness between them (at least ~40%): */
4774 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
4775 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
4776 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
4777 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
4778 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4779 f_shutdown(__BFILE__, __LINE__);
4780 }
4781 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
4782 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4783 f_shutdown(__BFILE__, __LINE__);
4784 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004785
4786 f_shutdown(__BFILE__, __LINE__, final := true);
4787}
4788
4789
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004790private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4791 boolean exp_imsi, boolean exp_tmsi)
4792runs on RAW_PCU_Test_CT {
4793 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4794 var integer pending := lengthof(g_ms);
4795 var RlcmacDlBlock dl_block;
4796 var boolean f1, f2;
4797
4798 while (pending > 0) {
4799 var uint32_t poll_fn;
4800
4801 /* Obtain a Downlink block and make sure it is a paging request */
4802 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4803 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4804 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4805 break;
4806 }
4807
4808 /* This should not happen in general, but who knows... */
4809 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4810 if (not ispresent(req.repeated_pageinfo)) {
4811 setverdict(fail, "Repeated Page Info IE is absent?!?");
4812 break;
4813 }
4814
4815 /* A single message may contain several MIs depending on their type */
4816 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4817 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4818 ps_domain := false);
4819 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4820 ps_domain := false);
4821 if (not f1 and not f2)
4822 { continue; }
4823
4824 /* Detect duplicate MIs */
4825 if (mask[i] == '1'B) {
4826 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4827 continue;
4828 }
4829
4830 mask[i] := '1'B;
4831 }
4832
4833 pending := pending - lengthof(req.repeated_pageinfo);
4834 }
4835
4836 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4837 if (mask[i] != '1'B) {
4838 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4839 log("===== mask := ", mask);
4840 }
4841 }
4842
4843 /* All messages must have been received by now, expect a dummy block */
4844 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4845}
4846
4847private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4848runs on RAW_PCU_Test_CT {
4849 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4850 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4851
4852 /* Initialize NS/BSSGP side */
4853 f_init_bssgp();
4854
4855 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004856 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004857
4858 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4859 f_init_gprs_ms(7 * 8);
4860
4861 /* Initialize the PCU interface abstraction */
4862 f_init_raw(testcasename(), info_ind);
4863
4864 /* Establish BSSGP connection to the PCU */
4865 f_bssgp_establish();
4866 f_multi_ms_bssgp_register();
4867
4868 /* Establish an Uplink TBF for each GprsMS instance */
4869 f_multi_ms_establish_tbf(do_activate := true);
4870}
4871
4872testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4873 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4874
4875 /* Common part: send INFO.ind, establish TBFs... */
4876 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4877
4878 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4879 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4880 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4881 }
4882
4883 /* FIXME: work around a race condition between PCUIF and BSSGP */
4884 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4885
4886 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4887 * The IUT is expected to page on all PDCH slots of all transceivers. */
4888 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4889 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4890 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4891 }
4892
4893 f_shutdown(__BFILE__, __LINE__, final := true);
4894}
4895
4896testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4897 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4898
4899 /* Common part: send INFO.ind, establish TBFs... */
4900 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4901
4902 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4903 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4904 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4905 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4906 }
4907
4908 /* FIXME: work around a race condition between PCUIF and BSSGP */
4909 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4910
4911 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4912 * The IUT is expected to page on all PDCH slots of all transceivers. */
4913 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4914 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4915 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4916 }
4917
4918 f_shutdown(__BFILE__, __LINE__, final := true);
4919}
4920
4921testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4922 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4923
4924 /* Common part: send INFO.ind, establish TBFs... */
4925 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4926
4927 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4928 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4929 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4930 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4931 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4932 } else {
4933 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4934 }
4935 }
4936
4937 /* FIXME: work around a race condition between PCUIF and BSSGP */
4938 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4939
4940 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4941 * The IUT is expected to page on all PDCH slots of all transceivers. */
4942 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4943 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4944 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4945 }
4946
4947 f_shutdown(__BFILE__, __LINE__, final := true);
4948}
4949
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004950private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004951runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4952 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004953 var integer i := 0;
4954 while (true) {
4955 f_rx_rlcmac_dl_block(dl_block, sched_fn);
Vadim Yanitskiy7179d3e2022-10-04 03:27:29 +07004956 if (not match(dl_block, tr_RLCMAC_DL_DUMMY_CTRL())) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004957 break;
4958 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004959 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004960 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4961 f_shutdown(__BFILE__, __LINE__);
4962 }
4963 i := i + 1;
4964 }
4965 return dl_block;
4966}
4967
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004968private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4969runs on RAW_PCU_Test_CT {
4970 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),
4971 info_ind.lac),
4972 info_ind.rac),
4973 info_ind.cell_id));
4974 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4975 423),
4976 2),
4977 5));
4978 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4979 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4980 var template (value) RAN_Information_RIM_Container res_cont :=
4981 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4982 ts_RIM_Sequence_Number(2),
4983 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4984 ts_RIM_Protocol_Version_Number(1),
4985 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4986 omit);
4987 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4988 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4989 res_cont));
4990}
4991
4992altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4993runs on RAW_PCU_Test_CT {
4994 /* RIM procedure: */
4995 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),
4996 info_ind.lac),
4997 info_ind.rac),
4998 info_ind.cell_id));
4999 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
5000 423),
5001 2),
5002 5));
5003 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
5004 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
5005 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5006 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5007 tr_RAN_Information_Request_RIM_Container)) {
5008 if (do_answer) {
5009 f_outbound_nacc_rim_tx_resp(info_ind);
5010 }
5011 if (do_repeat) {
5012 repeat;
5013 }
5014 }
5015}
5016
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005017private function f_handle_nacc_rac_ci_query(PCUIF_info_ind info_ind, GsmArfcn req_arfcn, uint6_t req_bsic,
5018 boolean answer := true, boolean use_old_ctrl_iface := false)
5019runs on RAW_PCU_Test_CT {
5020 if (use_old_ctrl_iface == true) {
5021 f_ipa_ctrl_wait_link_up();
5022 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5023 int2str(info_ind.lac) & "." &
5024 int2str(info_ind.cell_id) & "." &
5025 int2str(req_arfcn) & "." &
5026 int2str(req_bsic);
5027 if (answer) {
5028 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5029 } else {
5030 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
5031 }
5032 } else {
5033 var PCUIF_Message pcu_msg;
5034 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5035 if (answer) {
5036 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5037 }
5038 }
5039}
5040
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005041/* Start NACC from MS side */
5042private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005043 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005044 boolean skip_final_ctrl_ack := false,
5045 boolean use_old_ctrl_iface := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005046runs on RAW_PCU_Test_CT {
5047 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5048 var RlcmacDlBlock dl_block;
5049 var uint32_t sched_fn;
5050 var GsmArfcn req_arfcn := 862;
5051 var uint6_t req_bsic := 43;
5052
5053 /* Start NACC from MS side */
5054 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5055 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5056
5057 if (exp_rac_ci_query == true) {
5058 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005059 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 +01005060 }
5061
5062 if (exp_si_query == true) {
5063 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005064 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005065 }
5066
5067 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005068 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005069
5070 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5071 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5072 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5073 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5074 f_shutdown(__BFILE__, __LINE__);
5075 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005076 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005077 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005078 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5079 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5080 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005081}
5082
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005083/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
5084testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005085 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005086 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005087 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005088 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005089
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005090 if (use_old_ctrl_iface) {
5091 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5092 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5093 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005094
5095 /* Initialize NS/BSSGP side */
5096 f_init_bssgp();
5097 /* Initialize GPRS MS side */
5098 f_init_gprs_ms();
5099 ms := g_ms[0]; /* We only use first MS in this test */
5100
5101 /* Initialize the PCU interface abstraction */
5102 f_init_raw(testcasename(), info_ind);
5103
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005104 /* Make sure we are not affected by full cache from previous tests */
5105 f_pcuvty_flush_neigh_caches();
5106
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005107 /* Establish BSSGP connection to the PCU */
5108 f_bssgp_establish();
5109 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5110
5111 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005112 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 +01005113 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5114 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5115
5116 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005117 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005118
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005119 f_shutdown(__BFILE__, __LINE__, final := true);
5120}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005121
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005122/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
5123testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
5124 var PollFnCtx pollctx;
5125 var GprsMS ms;
5126 var RlcmacDlBlock dl_block;
5127 var uint32_t sched_fn;
5128 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005129 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005130
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005131 if (use_old_ctrl_iface) {
5132 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5133 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5134 }
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005135
5136 /* Initialize NS/BSSGP side */
5137 f_init_bssgp();
5138 /* Initialize GPRS MS side */
5139 f_init_gprs_ms();
5140 ms := g_ms[0]; /* We only use first MS in this test */
5141
5142 /* Initialize the PCU interface abstraction */
5143 f_init_raw(testcasename(), info_ind);
5144
5145 /* Make sure we are not affected by full cache from previous tests */
5146 f_pcuvty_flush_neigh_caches();
5147
5148 /* Establish BSSGP connection to the PCU */
5149 f_bssgp_establish();
5150 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5151
5152 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005153 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 +01005154 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5155 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5156
5157 /* Start NACC from MS side, avoid sending final CTRL ACK */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005158 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 +01005159
5160 /* Wait until we receive something non-dummy */
5161 dl_block := f_skip_dummy(0, sched_fn);
5162 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
5163 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5164 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5165 }
5166 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5167 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5168 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5169 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5170 }
5171
5172 f_shutdown(__BFILE__, __LINE__, final := true);
5173}
5174
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005175/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
5176testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
5177 var PollFnCtx pollctx;
5178 var GprsMS ms;
5179 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005180 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005181 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005182
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005183 if (use_old_ctrl_iface) {
5184 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5185 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5186 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005187
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005188 /* Initialize NS/BSSGP side */
5189 f_init_bssgp();
5190 /* Initialize GPRS MS side */
5191 f_init_gprs_ms();
5192 ms := g_ms[0]; /* We only use first MS in this test */
5193
5194 /* Initialize the PCU interface abstraction */
5195 f_init_raw(testcasename(), info_ind);
5196
5197 /* Make sure we are not affected by full cache from previous tests */
5198 f_pcuvty_flush_neigh_caches();
5199 /* Set timeout values for caches so that entries will be in cache during second try */
5200 f_pcuvty_set_neigh_caches(10, 10);
5201
5202 /* Establish BSSGP connection to the PCU */
5203 f_bssgp_establish();
5204 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5205
5206 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005207 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 +01005208 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5209 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5210
5211 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005212 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005213
5214 /* 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 +02005215 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 +01005216
5217 f_shutdown(__BFILE__, __LINE__, final := true);
5218}
5219
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005220/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
5221 * TS 44.060 sec 8.8) twice, the second time after caches timed out
5222 */
5223testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
5224 var PollFnCtx pollctx;
5225 var GprsMS ms;
5226 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005227 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005228 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005229
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005230 if (use_old_ctrl_iface) {
5231 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5232 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5233 }
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005234
5235 /* Initialize NS/BSSGP side */
5236 f_init_bssgp();
5237 /* Initialize GPRS MS side */
5238 f_init_gprs_ms();
5239 ms := g_ms[0]; /* We only use first MS in this test */
5240
5241 /* Initialize the PCU interface abstraction */
5242 f_init_raw(testcasename(), info_ind);
5243
5244 /* Make sure we are not affected by full cache from previous tests */
5245 f_pcuvty_flush_neigh_caches();
5246 /* Set timeout values for caches so that entries will be erased before the second try */
5247 f_pcuvty_set_neigh_caches(1, 1);
5248
5249 /* Establish BSSGP connection to the PCU */
5250 f_bssgp_establish();
5251 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5252
5253 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005254 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 +01005255 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5256 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5257
5258 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005259 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005260
5261 /* CTRL client should have disconnected from us */
5262 f_ipa_ctrl_wait_link_down();
5263 /* wait for cache entries to time out */
5264 f_sleep(2.0);
5265 /* 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 +02005266 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005267
5268 f_shutdown(__BFILE__, __LINE__, final := true);
5269}
5270
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005271/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005272testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
5273 var RlcmacDlBlock dl_block;
5274 var PollFnCtx pollctx;
5275 var uint32_t sched_fn;
5276 var GprsMS ms;
5277 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5278 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005279 var GsmArfcn req_arfcn := 862;
5280 var uint6_t req_bsic := 43;
5281
5282 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
5283 * resolution CTRL port, to trigger Conn Refused by socket:
5284 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5285 */
5286
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 Pedrole51c17a2021-01-27 18:29:22 +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 */
5309 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5310 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5311
5312 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005313 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005314 /* Make sure it is a Pkt Cell Chg Continue */
5315 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5316 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5317 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005318 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5319 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5320 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5321 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5322 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005323
5324 f_shutdown(__BFILE__, __LINE__, final := true);
5325}
5326
5327/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005328testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
5329 var RlcmacDlBlock dl_block;
5330 var PollFnCtx pollctx;
5331 var uint32_t sched_fn;
5332 var GprsMS ms;
5333 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5334 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005335 var GsmArfcn req_arfcn := 862;
5336 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005337 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005338
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005339 if (use_old_ctrl_iface) {
5340 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5341 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5342 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005343
5344 /* Initialize NS/BSSGP side */
5345 f_init_bssgp();
5346 /* Initialize GPRS MS side */
5347 f_init_gprs_ms();
5348 ms := g_ms[0]; /* We only use first MS in this test */
5349
5350 /* Initialize the PCU interface abstraction */
5351 f_init_raw(testcasename(), info_ind);
5352
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005353 /* Make sure we are not affected by full cache from previous tests */
5354 f_pcuvty_flush_neigh_caches();
5355
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005356 /* Establish BSSGP connection to the PCU */
5357 f_bssgp_establish();
5358 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5359
5360 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005361 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005362 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5363 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5364
5365 /* Start NACC from MS side */
5366 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5367 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5368
5369 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005370 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005371 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 +01005372
5373 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005374 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005375 /* Make sure it is a Pkt Cell Chg Continue */
5376 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5377 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5378 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005379 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5380 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5381 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5382 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5383 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005384
5385 f_shutdown(__BFILE__, __LINE__, final := true);
5386}
5387
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005388/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
5389testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
5390 var RlcmacDlBlock dl_block;
5391 var PollFnCtx pollctx;
5392 var uint32_t sched_fn;
5393 var GprsMS ms;
5394 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5395 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005396 var GsmArfcn req_arfcn := 862;
5397 var uint6_t req_bsic := 43;
5398
5399 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5400 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5401
5402 /* Initialize NS/BSSGP side */
5403 f_init_bssgp();
5404 /* Initialize GPRS MS side */
5405 f_init_gprs_ms();
5406 ms := g_ms[0]; /* We only use first MS in this test */
5407
5408 /* Initialize the PCU interface abstraction */
5409 f_init_raw(testcasename(), info_ind);
5410
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005411 /* Make sure we are not affected by full cache from previous tests */
5412 f_pcuvty_flush_neigh_caches();
5413
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005414 /* Establish BSSGP connection to the PCU */
5415 f_bssgp_establish();
5416 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5417
5418 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005419 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 +01005420 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5421 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5422
5423 /* Start NACC from MS side */
5424 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5425 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5426
5427 /* osmo-pcu should now ask for resolution: */
5428 f_ipa_ctrl_wait_link_up();
5429 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5430 int2str(info_ind.lac) & "." &
5431 int2str(info_ind.cell_id) & "." &
5432 int2str(req_arfcn) & "." &
5433 int2str(req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005434 /* we receive RAC+CI resolution request and we send incorrectly formated response */
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005435 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
5436
5437 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005438 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005439 /* Make sure it is a Pkt Cell Chg Continue */
5440 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5441 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5442 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005443 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5444 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5445 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5446 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5447 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005448
5449 f_shutdown(__BFILE__, __LINE__, final := true);
5450}
5451
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005452/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
5453testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
5454 var RlcmacDlBlock dl_block;
5455 var PollFnCtx pollctx;
5456 var uint32_t sched_fn;
5457 var GprsMS ms;
5458 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5459 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005460 var GsmArfcn req_arfcn := 862;
5461 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005462 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005463 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 */
5464 info_ind.lac),
5465 info_ind.rac),
5466 info_ind.cell_id));
5467 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
5468 423),
5469 2),
5470 5));
5471 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
5472 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
5473
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005474 if (use_old_ctrl_iface) {
5475 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5476 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5477 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005478
5479 /* Initialize NS/BSSGP side */
5480 f_init_bssgp();
5481 /* Initialize GPRS MS side */
5482 f_init_gprs_ms();
5483 ms := g_ms[0]; /* We only use first MS in this test */
5484
5485 /* Initialize the PCU interface abstraction */
5486 f_init_raw(testcasename(), info_ind);
5487
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005488 /* Make sure we are not affected by full cache from previous tests */
5489 f_pcuvty_flush_neigh_caches();
5490
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005491 /* Establish BSSGP connection to the PCU */
5492 f_bssgp_establish();
5493 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5494
5495 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005496 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 +01005497 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5498 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5499
5500 /* Start NACC from MS side */
5501 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5502 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5503
5504 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005505 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 +01005506
5507 /* RIM procedure: */
5508 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5509 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5510 tr_RAN_Information_Request_RIM_Container));
5511 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
5512
5513 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005514 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005515 /* Make sure it is a Pkt Cell Chg Continue */
5516 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5517 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5518 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005519 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5520 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5521 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5522 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5523 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005524
5525 f_shutdown(__BFILE__, __LINE__, final := true);
5526}
5527
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005528/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
5529testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
5530 var PollFnCtx pollctx;
5531 var GprsMS ms;
5532 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5533 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5534 var RlcmacDlBlock dl_block;
5535 var uint32_t sched_fn;
5536 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005537 var charstring ctrl_var;
5538 var PCUIF_Message pcu_msg;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005539 var GsmArfcn req_arfcn := 862;
5540 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005541 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005542
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005543 if (use_old_ctrl_iface) {
5544 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5545 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5546 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005547
5548 /* Initialize NS/BSSGP side */
5549 f_init_bssgp();
5550 /* Initialize GPRS MS side */
5551 f_init_gprs_ms();
5552 ms := g_ms[0]; /* We only use first MS in this test */
5553
5554 /* Initialize the PCU interface abstraction */
5555 f_init_raw(testcasename(), info_ind);
5556
5557 /* Make sure we are not affected by full cache from previous tests */
5558 f_pcuvty_flush_neigh_caches();
5559
5560 /* Establish BSSGP connection to the PCU */
5561 f_bssgp_establish();
5562 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5563
5564 /* Send PACKET RESOURCE REQUEST */
5565 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5566 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5567 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5568
5569 /* Start NACC from MS side */
5570 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5571 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5572
5573 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005574 if (use_old_ctrl_iface) {
5575 f_ipa_ctrl_wait_link_up();
5576 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5577 int2str(info_ind.lac) & "." &
5578 int2str(info_ind.cell_id) & "." &
5579 int2str(req_arfcn) & "." &
5580 int2str(req_bsic);
5581 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5582 } else {
5583 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5584 }
5585
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005586 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
5587 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5588 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005589
5590 if (use_old_ctrl_iface) {
5591 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5592 } else {
5593 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5594 }
5595
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005596 timer T := 2.0;
5597 T.start;
5598 alt {
5599 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005600 [use_old_ctrl_iface] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005601 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
5602 f_shutdown(__BFILE__, __LINE__);
5603 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005604 [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 {
5605 setverdict(fail, "Received unexpected PCUIF resolution after duplicate Pkt Cell Change Notification:", pcu_msg);
5606 f_shutdown(__BFILE__, __LINE__);
5607 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005608 [] T.timeout {
5609 setverdict(pass);
5610 }
5611 }
5612
5613 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005614 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005615
5616 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5617 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5618 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5619 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5620 f_shutdown(__BFILE__, __LINE__);
5621 }
5622 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5623 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5624 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5625 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5626 }
5627
5628 f_shutdown(__BFILE__, __LINE__, final := true);
5629}
5630
5631/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
5632testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
5633 var PollFnCtx pollctx;
5634 var GprsMS ms;
5635 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5636 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5637 var RlcmacDlBlock dl_block;
5638 var uint32_t sched_fn;
5639 var CtrlMessage rx_ctrl;
5640 var GsmArfcn req_arfcn := 862;
5641 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005642 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005643
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005644 if (use_old_ctrl_iface) {
5645 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5646 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5647 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005648
5649 /* Initialize NS/BSSGP side */
5650 f_init_bssgp();
5651 /* Initialize GPRS MS side */
5652 f_init_gprs_ms();
5653 ms := g_ms[0]; /* We only use first MS in this test */
5654
5655 /* Initialize the PCU interface abstraction */
5656 f_init_raw(testcasename(), info_ind);
5657
5658 /* Make sure we are not affected by full cache from previous tests */
5659 f_pcuvty_flush_neigh_caches();
5660
5661 /* Establish BSSGP connection to the PCU */
5662 f_bssgp_establish();
5663 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5664
5665 /* Send PACKET RESOURCE REQUEST */
5666 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5667 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5668 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5669
5670 /* Start NACC from MS side */
5671 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5672 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5673
5674 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005675 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 +01005676 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5677 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
5678 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5679 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5680 f_outbound_nacc_rim_tx_resp(info_ind);
5681 timer T := 1.0;
5682 T.start;
5683 alt {
5684 [] RIM.receive {
5685 setverdict(fail, "Received unexpected RIM message");
5686 f_shutdown(__BFILE__, __LINE__);
5687 }
5688 [] T.timeout {
5689 setverdict(pass);
5690 }
5691 }
5692
5693 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005694 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005695
5696 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5697 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5698 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5699 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5700 f_shutdown(__BFILE__, __LINE__);
5701 }
5702 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5703 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5704 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5705 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5706 }
5707
5708 f_shutdown(__BFILE__, __LINE__, final := true);
5709}
5710
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005711/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
5712testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
5713 var PollFnCtx pollctx;
5714 var GprsMS ms;
5715 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5716 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5717 var RlcmacDlBlock dl_block;
5718 var uint32_t sched_fn;
5719 var CtrlMessage rx_ctrl;
5720 var GsmArfcn req_arfcn := 862;
5721 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005722 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005723
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005724 if (use_old_ctrl_iface) {
5725 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5726 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5727 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005728
5729 /* Initialize NS/BSSGP side */
5730 f_init_bssgp();
5731 /* Initialize GPRS MS side */
5732 f_init_gprs_ms();
5733 ms := g_ms[0]; /* We only use first MS in this test */
5734
5735 /* Initialize the PCU interface abstraction */
5736 f_init_raw(testcasename(), info_ind);
5737
5738 /* Make sure we are not affected by full cache from previous tests */
5739 f_pcuvty_flush_neigh_caches();
5740
5741 /* Establish BSSGP connection to the PCU */
5742 f_bssgp_establish();
5743 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5744
5745 /* Send PACKET RESOURCE REQUEST */
5746 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5747 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5748 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5749
5750 /* Start NACC from MS side */
5751 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5752 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5753
5754 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005755 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 +01005756 /* RIM procedure: */
5757 as_outbound_nacc_rim_resolve(info_ind);
5758
5759 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
5760 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5761 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5762
5763 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
5764 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5765
5766 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5767 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5768 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5769 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5770 f_shutdown(__BFILE__, __LINE__);
5771 }
5772 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5773 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5774 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5775 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5776 }
5777}
5778
5779/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
5780testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
5781 var PollFnCtx pollctx;
5782 var GprsMS ms;
5783 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5784 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5785 var RlcmacDlBlock dl_block;
5786 var uint32_t sched_fn;
5787 var CtrlMessage rx_ctrl;
5788 var GsmArfcn req_arfcn := 862;
5789 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005790 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005791
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005792 if (use_old_ctrl_iface) {
5793 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5794 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5795 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005796
5797 /* Initialize NS/BSSGP side */
5798 f_init_bssgp();
5799 /* Initialize GPRS MS side */
5800 f_init_gprs_ms();
5801 ms := g_ms[0]; /* We only use first MS in this test */
5802
5803 /* Initialize the PCU interface abstraction */
5804 f_init_raw(testcasename(), info_ind);
5805
5806 /* Make sure we are not affected by full cache from previous tests */
5807 f_pcuvty_flush_neigh_caches();
5808
5809 /* Establish BSSGP connection to the PCU */
5810 f_bssgp_establish();
5811 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5812
5813 /* Send PACKET RESOURCE REQUEST */
5814 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5815 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5816 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5817
5818 /* Start NACC from MS side */
5819 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5820 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5821
5822 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005823 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 +01005824 /* RIM procedure: */
5825 as_outbound_nacc_rim_resolve(info_ind);
5826
5827 /* Announce SI back to MS, continue NACC procedure */
5828 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5829
5830 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5831 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5832
5833 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5834 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5835 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5836 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5837 f_shutdown(__BFILE__, __LINE__);
5838 }
5839 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5840 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5841 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5842 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5843 }
5844}
5845
5846/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5847testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
5848 var PollFnCtx pollctx;
5849 var GprsMS ms;
5850 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5851 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5852 var RlcmacDlBlock dl_block;
5853 var uint32_t sched_fn;
5854 var CtrlMessage rx_ctrl;
5855 var GsmArfcn req_arfcn := 862;
5856 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005857 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005858
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005859 if (use_old_ctrl_iface) {
5860 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5861 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5862 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005863
5864 /* Initialize NS/BSSGP side */
5865 f_init_bssgp();
5866 /* Initialize GPRS MS side */
5867 f_init_gprs_ms();
5868 ms := g_ms[0]; /* We only use first MS in this test */
5869
5870 /* Initialize the PCU interface abstraction */
5871 f_init_raw(testcasename(), info_ind);
5872
5873 /* Make sure we are not affected by full cache from previous tests */
5874 f_pcuvty_flush_neigh_caches();
5875
5876 /* Establish BSSGP connection to the PCU */
5877 f_bssgp_establish();
5878 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5879
5880 /* Send PACKET RESOURCE REQUEST */
5881 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5882 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5883 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5884
5885 /* Start NACC from MS side */
5886 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5887 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5888
5889 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005890 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 +01005891 /* RIM procedure: */
5892 as_outbound_nacc_rim_resolve(info_ind);
5893
5894 /* Announce SI back to MS, continue NACC procedure */
5895 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5896
5897 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5898 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5899 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5900 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5901 f_shutdown(__BFILE__, __LINE__);
5902 }
5903 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5904 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5905
5906 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5907 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5908 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5909 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5910 }
5911}
5912
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005913/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5914 * while waiting for CTRL resolution */
5915testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5916 var PollFnCtx pollctx;
5917 var GprsMS ms;
5918 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5919 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5920 var RlcmacDlBlock dl_block;
5921 var uint32_t sched_fn;
5922 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005923 var charstring ctrl_var;
5924 var PCUIF_Message pcu_msg;
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005925 var GsmArfcn req_arfcn := 862;
5926 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005927 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005928
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005929 if (use_old_ctrl_iface) {
5930 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5931 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5932 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005933
5934 /* Initialize NS/BSSGP side */
5935 f_init_bssgp();
5936 /* Initialize GPRS MS side */
5937 f_init_gprs_ms();
5938 ms := g_ms[0]; /* We only use first MS in this test */
5939
5940 /* Initialize the PCU interface abstraction */
5941 f_init_raw(testcasename(), info_ind);
5942
5943 /* Make sure we are not affected by full cache from previous tests */
5944 f_pcuvty_flush_neigh_caches();
5945
5946 /* Establish BSSGP connection to the PCU */
5947 f_bssgp_establish();
5948 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5949
5950 /* Send PACKET RESOURCE REQUEST */
5951 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5952 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5953 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5954
5955 /* Start NACC from MS side */
5956 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5957 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5958
5959 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005960 if (use_old_ctrl_iface) {
5961 f_ipa_ctrl_wait_link_up();
5962 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5963 int2str(info_ind.lac) & "." &
5964 int2str(info_ind.cell_id) & "." &
5965 int2str(req_arfcn) & "." &
5966 int2str(req_bsic);
5967 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5968 } else {
5969 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5970 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005971 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5972 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5973 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5974 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005975 if (use_old_ctrl_iface) {
5976 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5977 } else {
5978 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5979 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005980 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005981 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 +01005982
5983 /* And finally everything continues as usual with RIN procedure */
5984 as_outbound_nacc_rim_resolve(info_ind);
5985
5986 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005987 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005988
5989 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5990 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5991 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5992 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5993 f_shutdown(__BFILE__, __LINE__);
5994 }
5995 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5996 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5997 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5998 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5999 }
6000
6001 f_shutdown(__BFILE__, __LINE__, final := true);
6002}
6003
6004/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
6005 * while waiting for SI resolution */
6006testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
6007 var PollFnCtx pollctx;
6008 var GprsMS ms;
6009 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6010 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6011 var RlcmacDlBlock dl_block;
6012 var uint32_t sched_fn;
6013 var CtrlMessage rx_ctrl;
6014 var GsmArfcn req_arfcn := 862;
6015 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006016 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006017
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006018 if (use_old_ctrl_iface) {
6019 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6020 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6021 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006022
6023 /* Initialize NS/BSSGP side */
6024 f_init_bssgp();
6025 /* Initialize GPRS MS side */
6026 f_init_gprs_ms();
6027 ms := g_ms[0]; /* We only use first MS in this test */
6028
6029 /* Initialize the PCU interface abstraction */
6030 f_init_raw(testcasename(), info_ind);
6031
6032 /* Make sure we are not affected by full cache from previous tests */
6033 f_pcuvty_flush_neigh_caches();
6034
6035 /* Establish BSSGP connection to the PCU */
6036 f_bssgp_establish();
6037 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6038
6039 /* Send PACKET RESOURCE REQUEST */
6040 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6041 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6042 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6043
6044 /* Start NACC from MS side */
6045 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6046 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6047
6048 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006049 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 +01006050 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
6051 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
6052 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6053 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6054 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
6055 f_outbound_nacc_rim_tx_resp(info_ind);
6056
6057 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006058 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 +01006059
6060 /* And finally everything continues as usual with RIN procedure */
6061 as_outbound_nacc_rim_resolve(info_ind);
6062
6063 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01006064 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006065
6066 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6067 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6068 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6069 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6070 f_shutdown(__BFILE__, __LINE__);
6071 }
6072 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6073 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6074 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6075 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6076 }
6077
6078 f_shutdown(__BFILE__, __LINE__, final := true);
6079}
6080
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006081/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
6082 * while sending Pkt Neigh Data Change */
6083testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
6084 var PollFnCtx pollctx;
6085 var GprsMS ms;
6086 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6087 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6088 var RlcmacDlBlock dl_block;
6089 var uint32_t sched_fn;
6090 var CtrlMessage rx_ctrl;
6091 var GsmArfcn req_arfcn := 862;
6092 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006093 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006094
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006095 if (use_old_ctrl_iface) {
6096 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6097 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6098 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006099
6100 /* Initialize NS/BSSGP side */
6101 f_init_bssgp();
6102 /* Initialize GPRS MS side */
6103 f_init_gprs_ms();
6104 ms := g_ms[0]; /* We only use first MS in this test */
6105
6106 /* Initialize the PCU interface abstraction */
6107 f_init_raw(testcasename(), info_ind);
6108
6109 /* Make sure we are not affected by full cache from previous tests */
6110 f_pcuvty_flush_neigh_caches();
6111
6112 /* Establish BSSGP connection to the PCU */
6113 f_bssgp_establish();
6114 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6115
6116 /* Send PACKET RESOURCE REQUEST */
6117 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6118 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6119 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6120
6121 /* Start NACC from MS side */
6122 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6123 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6124
6125 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006126 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 +01006127 /* RIM procedure: */
6128 as_outbound_nacc_rim_resolve(info_ind);
6129
6130 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
6131 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
6132 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6133 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6134
6135 /* It should trigger RAC_CI resolution to start again: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006136 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 +01006137 /* RIM procedure: */
6138 as_outbound_nacc_rim_resolve(info_ind);
6139 /* Transmit SI back to MS */
6140 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6141
6142 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6143 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6144 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6145 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6146 f_shutdown(__BFILE__, __LINE__);
6147 }
6148 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6149 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6150 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6151 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6152 }
6153}
6154
6155/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
6156testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
6157 var PollFnCtx pollctx;
6158 var GprsMS ms;
6159 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6160 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6161 var RlcmacDlBlock dl_block;
6162 var uint32_t sched_fn;
6163 var CtrlMessage rx_ctrl;
6164 var GsmArfcn req_arfcn := 862;
6165 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006166 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006167
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006168 if (use_old_ctrl_iface) {
6169 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6170 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6171 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006172
6173 /* Initialize NS/BSSGP side */
6174 f_init_bssgp();
6175 /* Initialize GPRS MS side */
6176 f_init_gprs_ms();
6177 ms := g_ms[0]; /* We only use first MS in this test */
6178
6179 /* Initialize the PCU interface abstraction */
6180 f_init_raw(testcasename(), info_ind);
6181
6182 /* Make sure we are not affected by full cache from previous tests */
6183 f_pcuvty_flush_neigh_caches();
6184
6185 /* Establish BSSGP connection to the PCU */
6186 f_bssgp_establish();
6187 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6188
6189 /* Send PACKET RESOURCE REQUEST */
6190 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6191 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6192 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6193
6194 /* Start NACC from MS side */
6195 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6196 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6197
6198 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006199 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 +01006200 /* RIM procedure: */
6201 as_outbound_nacc_rim_resolve(info_ind);
6202
6203 /* Announce SI back to MS, continue NACC procedure */
6204 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6205
6206 /* trigger a Pkt Cell Change Notif with different tgt cell */
6207 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6208 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6209
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006210 /* It should trigger RAC_CI resolution to start again: */
6211 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6212
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006213 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6214 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
6215
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006216 /* RIM procedure: */
6217 as_outbound_nacc_rim_resolve(info_ind);
6218 /* Transmit SI back to MS */
6219 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6220
6221 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6222 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6223 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6224 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6225 f_shutdown(__BFILE__, __LINE__);
6226 }
6227 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6228 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6229 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6230 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6231 }
6232}
6233
6234/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
6235testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
6236 var PollFnCtx pollctx;
6237 var GprsMS ms;
6238 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6239 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6240 var RlcmacDlBlock dl_block;
6241 var uint32_t sched_fn;
6242 var CtrlMessage rx_ctrl;
6243 var GsmArfcn req_arfcn := 862;
6244 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006245 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006246
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006247 if (use_old_ctrl_iface) {
6248 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6249 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6250 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006251
6252 /* Initialize NS/BSSGP side */
6253 f_init_bssgp();
6254 /* Initialize GPRS MS side */
6255 f_init_gprs_ms();
6256 ms := g_ms[0]; /* We only use first MS in this test */
6257
6258 /* Initialize the PCU interface abstraction */
6259 f_init_raw(testcasename(), info_ind);
6260
6261 /* Make sure we are not affected by full cache from previous tests */
6262 f_pcuvty_flush_neigh_caches();
6263
6264 /* Establish BSSGP connection to the PCU */
6265 f_bssgp_establish();
6266 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6267
6268 /* Send PACKET RESOURCE REQUEST */
6269 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6270 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6271 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6272
6273 /* Start NACC from MS side */
6274 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6275 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6276
6277 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006278 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 +01006279 /* RIM procedure: */
6280 as_outbound_nacc_rim_resolve(info_ind);
6281
6282 /* Announce SI back to MS, continue NACC procedure */
6283 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6284
6285 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6286 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6287 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6288 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6289 f_shutdown(__BFILE__, __LINE__);
6290 }
6291
6292 /* trigger a Pkt Cell Change Notif with different tgt cell */
6293 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6294 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6295
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006296 /* It should trigger RAC_CI resolution to start again: */
6297 /* When using new PCUIF interface for resolution, we must
6298 * PCUIF.receive() here since that's the first message in the PCUIF
6299 * queue that PCU will have sent. Calling other functions doing
6300 * PCUIF.receive() (like f_ms_tx_ul_block() below) will make them fail
6301 * due to unexpected message receive. */
6302 if (not use_old_ctrl_iface) {
6303 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6304 }
6305
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006306 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6307 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6308 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6309 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6310 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006311
6312 /* When using CTRL interface, we must schedule the ACK before (see
6313 * above) blocking here waiting for the resoltion, otherwise we'll be
6314 * too late scheduling by the time the resolution is done. */
6315 if (use_old_ctrl_iface) {
6316 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6317 }
6318
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006319 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6320 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
6321
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006322 /* RIM procedure: */
6323 as_outbound_nacc_rim_resolve(info_ind);
6324 /* Transmit SI back to MS */
6325 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6326
6327 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6328 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6329 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6330 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6331 f_shutdown(__BFILE__, __LINE__);
6332 }
6333 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6334 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6335 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6336 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6337 }
6338}
6339
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006340/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
6341testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
6342 var PollFnCtx pollctx;
6343 var GprsMS ms;
6344 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6345 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6346 var RlcmacDlBlock dl_block;
6347 var uint32_t sched_fn, dl_fn;
6348 var CtrlMessage rx_ctrl;
6349 var GsmArfcn req_arfcn := 862;
6350 var uint6_t req_bsic := 43;
6351 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006352 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006353
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006354 if (use_old_ctrl_iface) {
6355 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6356 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6357 }
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006358
6359 /* Initialize NS/BSSGP side */
6360 f_init_bssgp();
6361 /* Initialize GPRS MS side */
6362 f_init_gprs_ms();
6363 ms := g_ms[0]; /* We only use first MS in this test */
6364
6365 /* Initialize the PCU interface abstraction */
6366 f_init_raw(testcasename(), info_ind);
6367
6368 /* Make sure we are not affected by full cache from previous tests */
6369 f_pcuvty_flush_neigh_caches();
6370
6371 /* Establish BSSGP connection to the PCU */
6372 f_bssgp_establish();
6373 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6374
6375 /* Send PACKET RESOURCE REQUEST */
6376 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6377 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6378 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6379
6380 /* Start NACC from MS side */
6381 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6382 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6383
6384 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006385 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 +01006386 /* RIM procedure: */
6387 as_outbound_nacc_rim_resolve(info_ind);
6388
6389 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
6390 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
6391 f_sleep(0.1);
6392 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
6393 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
6394
6395 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
6396 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
6397 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
6398 * Data with unassigned DL TBF in line above): */
6399 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6400 /* Continue receiving Pkt Cell Neighbor Data */
6401 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
6402
6403 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6404 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6405 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6406 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6407 f_shutdown(__BFILE__, __LINE__);
6408 }
6409 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6410 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6411 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6412 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6413 }
6414
6415 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
6416 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
6417 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
6418 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
6419 f_dl_block_ack_fn(dl_block, dl_fn));
6420}
6421
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006422
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006423function f_do_inbound_nacc(template (value) RIM_Routing_Information tx_src_addr, template RIM_Routing_Information rx_dst_addr)
6424runs on RAW_PCU_Test_CT
6425{
6426 var template (value) RAN_Information_Request_RIM_Container req_cont;
6427 var template (value) PDU_BSSGP bssgp_rim_pdu;
6428 var template PDU_BSSGP bssgp_rim_pdu_expect;
6429 var template RAN_Information_RIM_Container rim_cont_expect;
6430 var RIM_Routing_Address bts_addr;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006431
6432 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006433 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 +01006434 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006435 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 +01006436 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02006437 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);
6438 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006439 f_sleep(1.0);
6440
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006441 bts_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006442
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006443 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6444 ts_RIM_Sequence_Number(1),
6445 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6446 ts_RIM_Protocol_Version_Number(1),
6447 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6448 omit);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006449 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
6450 tx_src_addr, req_cont);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006451
6452 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6453 tr_RIM_Sequence_Number(1),
6454 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6455 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006456 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 +01006457 omit);
6458
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006459 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(rx_dst_addr,
6460 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006461 rim_cont_expect);
6462 RIM.send(bssgp_rim_pdu);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006463 timer T := 2.0;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006464 T.start;
6465 alt {
6466 [] RIM.receive(bssgp_rim_pdu_expect) { }
6467 [] RIM.receive {
6468 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6469 }
6470 [] T.timeout {
6471 setverdict(fail, "No BSSGP RIM PDU received");
6472 mtc.stop;
6473 }
6474 }
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006475}
6476/* Send a RIM RAN info request to the PCU and verify the response, we expect
6477 * getting the system information back which we have transfered to the PCU via
6478 * PCUIF on startup. */
6479testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
6480 /* Initialize NS/BSSGP side */
6481 f_init_bssgp();
6482
6483 /* Initialize the PCU interface abstraction */
6484 f_init_raw(testcasename());
6485
6486 /* Establish BSSGP connection to the PCU */
6487 f_bssgp_establish();
6488
6489 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6490 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6491
6492 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6493 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr));
6494
6495 f_shutdown(__BFILE__, __LINE__, final := true);
6496}
6497
6498/* Same as TC_rim_ran_info_req_single_rep, but using an EUTRAN eNodeB ID as
6499 * Routing information, to verify PCU handles that kind of address just fine
6500 */
6501testcase TC_rim_ran_info_req_single_rep_eutran() runs on RAW_PCU_Test_CT {
6502 /* Initialize NS/BSSGP side */
6503 f_init_bssgp();
6504
6505 /* Initialize the PCU interface abstraction */
6506 f_init_raw(testcasename());
6507
6508 /* Establish BSSGP connection to the PCU */
6509 f_bssgp_establish();
6510
6511 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6512 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_enbid(src_cid, tac := 3, gnbid := '12345678123456'O));
6513
6514 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr),
6515 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006516
6517 f_shutdown(__BFILE__, __LINE__, final := true);
6518}
6519
6520/* Same as above, but in this case we simulate the rare case in which the PCU
6521 * has no system information available. We expect getting a response back but
6522 * with no system information inside. */
6523testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006524 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006525 var PCUIF_Message pcu_msg;
6526 timer T := 2.0;
6527
6528 /* Initialize NS/BSSGP side */
6529 f_init_bssgp();
6530
6531 /* Initialize the PCU interface abstraction */
6532 f_init_raw(testcasename(), info_ind);
6533
6534 /* Establish BSSGP connection to the PCU */
6535 f_bssgp_establish();
6536
6537 /* Clear sysinfo from the PCU */
6538 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);
6539 BTS.send(si1_data_ind);
6540 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);
6541 BTS.send(si3_data_ind);
6542 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);
6543 BTS.send(si16_data_ind);
6544 f_sleep(1.0);
6545
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006546 var RIM_Routing_Address dst_addr;
6547 var RIM_Routing_Address src_addr;
6548 var template (value) RAN_Information_Request_RIM_Container req_cont;
6549 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006550 var template PDU_BSSGP bssgp_rim_pdu_expect;
6551 var template RAN_Information_RIM_Container rim_cont_expect;
6552
6553 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 +01006554 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6555 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006556
6557 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6558 ts_RIM_Sequence_Number(1),
6559 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6560 ts_RIM_Protocol_Version_Number(1),
6561 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6562 omit);
6563 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6564 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6565 req_cont);
6566
6567
6568 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6569 tr_RIM_Sequence_Number(1),
6570 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6571 tr_RIM_Protocol_Version_Number(1),
6572 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
6573 omit);
6574
6575 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6576 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6577 rim_cont_expect);
6578 RIM.send(bssgp_rim_pdu);
6579 T.start;
6580 alt {
6581 [] RIM.receive(bssgp_rim_pdu_expect) { }
6582 [] RIM.receive {
6583 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6584 }
6585 [] T.timeout {
6586 setverdict(fail, "No BSSGP RIM PDU received");
6587 mtc.stop;
6588 }
6589 }
6590
6591 f_shutdown(__BFILE__, __LINE__, final := true);
6592}
6593
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006594/* 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 +02006595testcase TC_pdch_energy_saving() runs on RAW_PCU_Test_CT {
6596 var PCUIF_info_ind info_ind;
6597 var template (value) TsTrxBtsNum nr;
6598 var RlcmacDlBlock dl_block;
6599 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006600 var integer ts;
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006601 timer T;
6602
6603 /* Initialize NS/BSSGP side */
6604 f_init_bssgp();
6605
6606 info_ind := valueof(ts_PCUIF_INFO_default);
6607 /* The 2 first TRX are enabled. */
6608 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (2 .. 7));
6609 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6610 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 1);
6611
6612 /* Initialize the PCU interface abstraction */
6613 f_init_raw(testcasename(), info_ind);
6614
6615 /* Establish BSSGP connection to the PCU */
6616 f_bssgp_establish();
6617
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006618 for (ts := 0; ts < 2; ts := ts + 1) {
6619 nr := ts_TsTrxBtsNum(ts_nr := 7, trx_nr := ts, bts_nr := 0, blk_nr := 0);
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006620
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006621 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
6622 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
6623 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), block_nr := nr.blk_nr));
6624 T.start(0.5);
6625 alt {
6626 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
6627 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
6628 omit)) -> value data_msg {
6629 setverdict(pass);
6630 T.stop;
6631 }
6632 [] as_rx_fail_dummy(nr);
6633 [] BTS.receive {
6634 setverdict(fail, "Unexpected block from BTS");
6635 f_shutdown(__BFILE__, __LINE__);
6636 }
6637 [] T.timeout {
6638 setverdict(fail, "Expected IDLE block from BTS");
6639 f_shutdown(__BFILE__, __LINE__);
6640 }
6641 }
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006642 }
6643
6644 f_shutdown(__BFILE__, __LINE__, final := true);
6645}
6646
Oliver Smith3d174882021-09-03 11:38:51 +02006647/* Test stats for available and occupied PDCHs */
6648testcase TC_stat_pdch_avail_occ() runs on RAW_PCU_Test_CT {
6649 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6650 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6651
6652 /* Initialize NS/BSSGP side */
6653 f_init_bssgp();
6654
Oliver Smithedcded22021-09-14 09:26:55 +02006655 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6656 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6657 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6658 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6659 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6660 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
Oliver Smith3d174882021-09-03 11:38:51 +02006661
Oliver Smith72d0c692021-09-08 10:03:52 +02006662 /* Allocate 4 GprsMS instances */
Oliver Smith3d174882021-09-03 11:38:51 +02006663 f_init_gprs_ms(4);
6664
6665 /* Initialize the PCU interface abstraction */
6666 f_init_raw(testcasename(), info_ind);
6667
6668 /* Reset stats */
6669 f_statsd_reset();
6670
6671 /* Establish BSSGP */
6672 f_bssgp_establish();
6673
6674 /* 8 PDCHs available, 0 occupied */
6675 var StatsDExpects expect := {
6676 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006677 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6678 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6679 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
Oliver Smith3d174882021-09-03 11:38:51 +02006680 };
6681 f_statsd_expect(expect);
6682
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006683 /* Establish an Uplink TBF for each GprsMS instance (3x GPRS, 1x EGPRS) */
Oliver Smith3d174882021-09-03 11:38:51 +02006684 f_multi_ms_bssgp_register();
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006685 f_ms_establish_ul_tbf(g_ms[0]);
6686 f_ms_establish_ul_tbf(g_ms[1]);
6687 f_ms_establish_ul_tbf(g_ms[2]);
6688 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 +02006689
6690 /* 4 PDCHs occupied */
6691 expect := {
6692 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006693 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 4, max := 4 },
6694 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 3, max := 3 },
6695 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
Oliver Smith3d174882021-09-03 11:38:51 +02006696 };
6697 f_statsd_expect(expect);
6698
6699 f_shutdown(__BFILE__, __LINE__, final := true);
6700}
6701
Oliver Smithf04762d2021-09-14 17:20:38 +02006702/* Test stats for available and occupied PDCHs, for MS which is not known by
6703 * the PCU (e.g. because it was forgotten due to no interaction, and old DL
6704 * data arrives from SGSN) */
6705function f_tc_stat_pdch_avail_occ_ms_not_known(boolean egprs) runs on RAW_PCU_Test_CT {
6706 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6707 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6708
6709 /* Ensure a deterministic slot allocation of 1 PDCH with MS class 1 */
6710 const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs := {
6711 gprsmultislotclass := '00001'B,
6712 gprsextendeddynalloccap := '0'B
6713 };
6714 const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs := {
6715 egprsmultislotclass := '00001'B,
6716 egprsextendeddynalloccap := '0'B
6717 };
6718 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs := {
6719 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, omit)) };
6720 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs := {
6721 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, bssgp_mscap_egprs)) };
6722
6723 /* Initialize NS/BSSGP side */
6724 f_init_bssgp();
6725
6726 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6727 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6728 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6729 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6730 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6731 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
6732
6733 /* Allocate 1 GprsMS instance */
6734 f_init_gprs_ms(1);
6735
6736 /* Initialize the PCU interface abstraction */
6737 f_init_raw(testcasename(), info_ind);
6738
6739 /* Reset stats */
6740 f_statsd_reset();
6741
6742 /* Establish BSSGP */
6743 f_bssgp_establish();
6744
6745 /* 8 PDCHs available, 0 occupied */
6746 var StatsDExpects expect := {
6747 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6748 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6749 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6750 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6751 };
6752 f_statsd_expect(expect);
6753
6754 var GprsMS ms := g_ms[0]; /* We only use first MS in this test */
6755 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6756
6757 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
6758 var octetstring data := f_rnd_octstring(1400);
6759 if (egprs) {
6760 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs));
6761 } else {
6762 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_gprs));
6763 }
6764 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
6765
6766 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
6767 f_sleep(X2002);
6768
6769 /* 1 PDCH occupied */
6770 if (egprs) {
6771 expect := {
6772 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6773 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6774 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6775 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
6776 };
6777 } else {
6778 expect := {
6779 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6780 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6781 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 1, max := 1 },
6782 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6783 };
6784 }
6785 f_statsd_expect(expect);
6786
6787 /* Clean up */
6788 f_shutdown(__BFILE__, __LINE__, final := true);
6789}
6790testcase TC_stat_pdch_avail_occ_ms_not_known_gprs() runs on RAW_PCU_Test_CT {
6791 f_tc_stat_pdch_avail_occ_ms_not_known(false);
6792}
6793testcase TC_stat_pdch_avail_occ_ms_not_known_egprs() runs on RAW_PCU_Test_CT {
6794 f_tc_stat_pdch_avail_occ_ms_not_known(true);
6795}
6796
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006797/* Make sure that bts.0.pdch.all_allocated is set when we allocate all resources */
6798testcase TC_ratectr_all_available_allocated() runs on RAW_PCU_Test_CT {
6799 var PCUIF_info_ind info_ind;
6800 var template IARRestOctets rest;
6801 var BIT11 ra11;
6802
6803 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006804
6805 /* Only the first TRX is enabled. */
6806 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
6807 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6808
6809 /* Initialize the PCU interface abstraction */
6810 f_init_raw(testcasename(), info_ind);
6811 f_statsd_reset();
6812
6813 var EGPRSPktChRequest req := {
6814 one_phase := {
6815 tag := '0'B,
6816 multislot_class := '10101'B,
6817 priority := '01'B,
6818 random_bits := '101'B
6819 }
6820 };
6821
6822 /* We send 7 requests, the IUT gives us all available USFs (0..6) */
6823 for (var integer i := 0; i < 7; i := i + 1) {
6824 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
6825 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
6826 }
6827
6828 ra11 := enc_EGPRSPktChRequest2bits(req);
6829 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
6830
6831 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrol209dc7d2021-11-15 16:25:08 +01006832 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006833
6834 /* bts.0.pdch.all_allocated is updated once per second, wait some time to make sure it was updated. */
6835 f_sleep(2.0);
6836 var StatsDExpects expect := {
6837 { name := "TTCN3.bts.0.pdch.all_allocated", mtype := "c", min := 1, max := 1 }
6838 };
6839 f_statsd_expect(expect);
6840
6841 f_shutdown(__BFILE__, __LINE__, final := true);
6842}
6843
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006844control {
6845 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01006846 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006847 execute( TC_ta_ptcch_idle() );
6848 execute( TC_ta_rach_imm_ass() );
Vadim Yanitskiy866f8702021-05-26 14:50:27 +02006849 execute( TC_ta_ul_ack_nack_first_block() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006850 execute( TC_ta_idle_dl_tbf_ass() );
6851 execute( TC_ta_ptcch_ul_multi_tbf() );
6852 execute( TC_cs_lqual_ul_tbf() );
6853 execute( TC_cs_initial_ul() );
6854 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01006855 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01006856 execute( TC_cs_max_dl() );
6857 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01006858 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01006859 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01006860 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01006861 execute( TC_mcs_max_dl() );
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02006862 execute( TC_t3141() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01006863 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02006864 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01006865 execute( TC_x2031_t3191() );
6866 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006867 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01006868 execute( TC_n3105_max_t3195() );
Pau Espin Pedrole8a94442021-11-15 17:05:46 +01006869 execute( TC_t3172_wait_ind_size0() );
6870 execute( TC_t3172_wait_ind_size1() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02006871 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02006872 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02006873 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006874 execute( TC_mo_ping_pong() );
6875 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02006876 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006877 execute( TC_mt_ping_pong() );
6878 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006879 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006880 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07006881 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006882 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01006883 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol6844c162022-04-01 15:40:06 +02006884 execute( TC_dl_llc_sapi_priority() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006885 execute( TC_paging_cs_from_bts() );
6886 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
6887 execute( TC_paging_cs_from_sgsn_sign() );
6888 execute( TC_paging_cs_from_sgsn_ptp() );
6889 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
6890 execute( TC_paging_ps_from_sgsn_sign() );
6891 execute( TC_paging_ps_from_sgsn_ptp() );
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01006892 execute( TC_paging_pch_timeout() );
6893
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07006894 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
6895 execute( TC_paging_cs_multi_ms_imsi() );
6896 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02006897 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
6898 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01006899 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
6900 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006901
Pau Espin Pedrol0b6b0d02022-10-25 21:21:02 +02006902 execute( TC_ul_tbf_finished_pkt_dl_ass_pch() );
6903
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006904 /* EGPRS specific test cases */
6905 execute( TC_egprs_pkt_chan_req_signalling() );
6906 execute( TC_egprs_pkt_chan_req_one_phase() );
6907 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07006908 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07006909 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07006910 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02006911
6912 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07006913
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006914 /* Immediate Assignment on AGCH/PCH */
6915 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
6916 execute( TC_pcuif_fh_imm_ass_ul() );
6917 execute( TC_pcuif_fh_imm_ass_dl() );
6918 /* Packet Uplink/Downlink Assignment on PACCH */
6919 execute( TC_pcuif_fh_pkt_ass_ul() );
6920 execute( TC_pcuif_fh_pkt_ass_dl() );
6921 execute( TC_multitrx_multims_alloc() );
6922 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
6923 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
6924 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
Pau Espin Pedrol37604572021-10-15 14:36:16 +02006925 execute( TC_ul_tbf_reestablish_with_pkt_resource_req() );
Pau Espin Pedrold658f342021-10-15 14:52:22 +02006926 execute( TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() );
Pau Espin Pedrol59aa1092021-11-15 18:53:34 +01006927 execute( TC_ul_tbf_reestablish_with_pkt_dl_ack_nack() );
6928 execute( TC_ul_tbf_reestablish_with_pkt_dl_ack_nack_egprs() );
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006929
Pau Espin Pedrole1303052020-11-16 11:13:51 +01006930 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07006931
6932 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01006933 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01006934 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01006935 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01006936 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01006937 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01006938 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01006939 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
6940 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006941 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
6942 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
6943 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006944 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
6945 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006946 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
6947 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
6948 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006949 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006950 if (mp_ctrl_neigh_ip != "") { /* PCU using old CTRL neigh addr resolution iface */
6951 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
6952 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
6953 }
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006954
6955 execute( TC_rim_ran_info_req_single_rep() );
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006956 execute( TC_rim_ran_info_req_single_rep_eutran() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006957 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006958
6959 execute (TC_pdch_energy_saving() );
Oliver Smith3d174882021-09-03 11:38:51 +02006960
6961 execute( TC_stat_pdch_avail_occ() );
Oliver Smithf04762d2021-09-14 17:20:38 +02006962 execute( TC_stat_pdch_avail_occ_ms_not_known_gprs() );
6963 execute( TC_stat_pdch_avail_occ_ms_not_known_egprs() );
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006964 execute( TC_ratectr_all_available_allocated() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006965}
6966
Harald Weltea419df22019-03-21 17:23:04 +01006967}