blob: 7fcab4ac38e02883e46e787c2601365a30f5e6fc [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;
25
26import from Osmocom_VTY_Functions all;
27import from TELNETasp_PortType all;
28
29import from MobileL3_GMM_SM_Types all;
30import from RLCMAC_CSN1_Types all;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020031import from RLCMAC_CSN1_Templates all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020032import from RLCMAC_Types all;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020033import from RLCMAC_Templates all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020034
35import from MobileL3_CommonIE_Types all;
36import from L3_Templates all;
37
38import from NS_Types all;
39import from BSSGP_Types all;
40import from Osmocom_Gb_Types all;
41
42import from BSSGP_Emulation all; /* BssgpConfig */
43import from NS_Emulation all; /* NSConfiguration */
44
45import from UD_Types all;
46import from PCUIF_Types all;
47import from PCUIF_CodecPort all;
48import from PCUIF_Components all;
49import from IPL4asp_Types all;
50import from Native_Functions all;
51import from SGSN_Components all;
Pau Espin Pedrolaedc5112020-05-16 17:30:42 +020052import from GPRS_Components all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020053
Daniel Willmann535aea62020-09-21 13:27:08 +020054import from StatsD_Types all;
55import from StatsD_CodecPort all;
56import from StatsD_CodecPort_CtrlFunct all;
57import from StatsD_Checker all;
58
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010059import from IPA_Emulation all;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +010060import from Osmocom_CTRL_Types all;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010061import from Osmocom_CTRL_Adapter all;
62import from Osmocom_CTRL_Functions all;
63
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020064modulepar {
65 charstring mp_pcu_sock_path := PCU_SOCK_DEFAULT;
66
67 float X2002 := 0.2; /* Timer -2002, IMM ASSIGN confirm delay */
Daniel Willmann535aea62020-09-21 13:27:08 +020068
69 charstring mp_pcu_statsd_ip := "127.0.0.1";
70 integer mp_pcu_statsd_port := 8125;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010071
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +020072 charstring mp_ctrl_neigh_ip := ""; /* Use new PCUIF over IPA multiplex for Neigh Addr Resolution */
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010073 integer mp_ctrl_neigh_port := 4248;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020074}
75
76
77/* 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 +010078friend template (value) PCUIF_info_ind ts_PCUIF_INFO_default(template (value) PCUIF_Flags flags := c_PCUIF_Flags_default)
79:= {
Vadim Yanitskiyc1559302020-07-19 16:39:12 +070080 version := PCUIF_Types.mp_pcuif_version,
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +010081 flags := flags,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +010082 trx := ts_PCUIF_InfoTrxs_def(GPRS_Components.mp_base_arfcn),
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020083 bsic := 7,
84 mcc := 262,
85 mnc := 42,
86 mnc_3_digits := 0,
87 lac := 13135,
88 rac := 0,
89 nsei := mp_nsconfig.nsei,
90 nse_timer := { 3, 3, 3, 3, 30, 3, 10 },
91 cell_timer := { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 },
92 cell_id := 20960,
93 repeat_time := 5 * 50,
94 repeat_count := 3,
Harald Welte5339b2e2020-10-04 22:52:56 +020095 bvci := mp_gb_cfg.bvc[0].bvci,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020096 t3142 := 20,
97 t3169 := 5,
98 t3191 := 5,
99 t3193_10ms := 160,
100 t3195 := 5,
Pau Espin Pedrol76de1662021-03-01 17:40:58 +0100101 n3101 := 10,
102 n3103 := 4,
103 n3105 := 8,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200104 cv_countdown := 15,
105 dl_tbf_ext := 250 * 10, /* ms */
106 ul_tbf_ext := 250 * 10, /* ms */
107 initial_cs := 2,
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +0100108 initial_mcs := 1,
Harald Welte90f19742020-11-06 19:34:40 +0100109 nsvci := { mp_nsconfig.nsvc[0].nsvci, 0 },
110 local_port := { mp_nsconfig.nsvc[0].provider.ip.remote_udp_port, 0 },
111 remote_port := { mp_nsconfig.nsvc[0].provider.ip.local_udp_port, 0 },
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100112 remote_addr := f_PCUIF_RemoteAddr(
Harald Welte90f19742020-11-06 19:34:40 +0100113 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 +0200114}
115
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100116/* Passed in RAN-INFO message from emulated neighbor using RIM */
117const octetstring si1_default := '198fb100000000000000000000000000007900002b'O;
118const octetstring si3_default := '1b753000f110236ec9033c2747407900003c0b2b2b'O;
119const octetstring si13_default := '009000185a6fc9e08410ab2b2b2b2b2b2b2b2b2b2b'O;
120const octetstring si_default := si1_default & si3_default & si13_default;
121
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +0100122const MultislotCap_GPRS mscap_gprs_def := {
123 gprsmultislotclass := '00011'B,
124 gprsextendeddynalloccap := '0'B
125};
126const MultislotCap_EGPRS mscap_egprs_def := {
127 egprsmultislotclass := '00011'B,
128 egprsextendeddynalloccap := '0'B
129};
130template (value) MSRadioAccessCapabilityV ms_racap_gprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, omit) };
131template (value) MSRadioAccessCapabilityV ms_racap_egprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, mscap_egprs_def) };
132
133const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs_def := {
134 gprsmultislotclass := '00011'B,
135 gprsextendeddynalloccap := '0'B
136};
137const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs_def := {
138 egprsmultislotclass := '00011'B,
139 egprsextendeddynalloccap := '0'B
140};
141template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, omit)) };
142template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, bssgp_mscap_egprs_def)) };
143
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200144type record lqual_range {
145 /* component reference to the IPA_Client component used for RSL */
146 uint8_t low,
147 uint8_t high
148}
149
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +0100150type component RAW_PCU_Test_CT extends bssgp_CT, MS_BTS_IFACE_CT, StatsD_ConnHdlr, CTRL_Adapter_CT {
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700151 /* PCU interface abstraction component */
152 var RAW_PCUIF_CT vc_PCUIF;
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700153
Daniel Willmann535aea62020-09-21 13:27:08 +0200154 /* StatsD */
155 var StatsD_Checker_CT vc_STATSD;
156
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200157 /* Connection to the PCUIF component */
158 port RAW_PCU_MSG_PT PCUIF;
159 /* VTY connection to the PCU */
160 port TELNETasp_PT PCUVTY;
161
162 /* Uplink CS/MCS thresholds, default from pcu_main.c: */
163 var lqual_range g_cs_lqual_ranges[4] := {{low := 0, high := 6},
164 {low := 5, high := 8},
165 {low := 7, high := 13},
166 {low := 12,high := 35}};
167 var lqual_range g_mcs_lqual_ranges[9] := {{low := 0, high := 6},
168 {low := 5, high := 8},
169 {low := 7, high := 13},
170 {low := 12,high := 15},
171 {low := 14, high := 17},
172 {low := 16, high := 18},
173 {low := 17,high := 20},
174 {low := 19, high := 24},
175 {low := 23,high := 35}};
176 var uint8_t g_cs_initial_dl := 1;
177 var uint8_t g_cs_initial_ul := 1;
178 var uint8_t g_mcs_initial_dl := 1;
179 var uint8_t g_mcs_initial_ul := 1;
180 var uint8_t g_cs_max_dl := 4;
181 var uint8_t g_cs_max_ul := 4;
182 var uint8_t g_mcs_max_dl := 9;
183 var uint8_t g_mcs_max_ul := 9;
184
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200185 var boolean g_force_two_phase_access := false;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200186
187 /* Guard timeout */
188 timer g_T_guard := 60.0;
189};
190
191private altstep as_Tguard_RAW() runs on RAW_PCU_Test_CT {
192 [] g_T_guard.timeout {
193 setverdict(fail, "Timeout of T_guard");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700194 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200195 }
196}
197
198private function f_pcuvty_set_allowed_cs_mcs() runs on RAW_PCU_Test_CT {
199 f_vty_config2(PCUVTY, {"pcu"}, "cs " & int2str(g_cs_initial_dl) & " " & int2str(g_cs_initial_ul));
200 f_vty_config2(PCUVTY, {"pcu"}, "cs max " & int2str(g_cs_max_dl) & " " & int2str(g_cs_max_ul));
201
202 f_vty_config2(PCUVTY, {"pcu"}, "mcs " & int2str(g_mcs_initial_dl) & " " & int2str(g_mcs_initial_ul));
203 f_vty_config2(PCUVTY, {"pcu"}, "mcs max " & int2str(g_mcs_max_dl) & " " & int2str(g_mcs_max_ul));
204}
205
206private function f_pcuvty_set_link_quality_ranges() runs on RAW_PCU_Test_CT {
207 var charstring cmd;
208
209 cmd := "cs link-quality-ranges" &
210 " cs1 " & int2str(g_cs_lqual_ranges[0].high) &
211 " cs2 " & int2str(g_cs_lqual_ranges[1].low) & " " & int2str(g_cs_lqual_ranges[1].high) &
212 " cs3 " & int2str(g_cs_lqual_ranges[2].low) & " " & int2str(g_cs_lqual_ranges[2].high) &
213 " cs4 " & int2str(g_cs_lqual_ranges[3].low);
214 f_vty_config2(PCUVTY, {"pcu"}, cmd);
215
216 cmd := "mcs link-quality-ranges" &
217 " mcs1 " & int2str(g_mcs_lqual_ranges[0].high) &
218 " mcs2 " & int2str(g_mcs_lqual_ranges[1].low) & " " & int2str(g_mcs_lqual_ranges[1].high) &
219 " mcs3 " & int2str(g_mcs_lqual_ranges[2].low) & " " & int2str(g_mcs_lqual_ranges[2].high) &
220 " mcs4 " & int2str(g_mcs_lqual_ranges[3].low) & " " & int2str(g_mcs_lqual_ranges[3].high) &
221 " mcs5 " & int2str(g_mcs_lqual_ranges[4].low) & " " & int2str(g_mcs_lqual_ranges[4].high) &
222 " mcs6 " & int2str(g_mcs_lqual_ranges[5].low) & " " & int2str(g_mcs_lqual_ranges[5].high) &
223 " mcs7 " & int2str(g_mcs_lqual_ranges[6].low) & " " & int2str(g_mcs_lqual_ranges[6].high) &
224 " mcs8 " & int2str(g_mcs_lqual_ranges[7].low) & " " & int2str(g_mcs_lqual_ranges[7].high) &
225 " mcs9 " & int2str(g_mcs_lqual_ranges[8].low);
226 f_vty_config2(PCUVTY, {"pcu"}, cmd);
227}
228
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100229private function f_pcuvty_flush_neigh_caches() runs on RAW_PCU_Test_CT {
230 f_pcuvty_set_neigh_caches(0, 0);
231}
232
233private function f_pcuvty_set_neigh_caches(integer neigh_cache_secs := -1, integer si_cache_secs := -1)
234runs on RAW_PCU_Test_CT {
235 if (neigh_cache_secs == -1) {
236 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 default");
237 } else {
238 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 " & int2str(neigh_cache_secs));
239 }
240 if (si_cache_secs == -1) {
241 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 default");
242 } else {
243 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 " & int2str(si_cache_secs));
244 }
245}
246
Pau Espin Pedrole8a94442021-11-15 17:05:46 +0100247private function f_pcuvty_set_timer(integer t, integer val)
248runs on RAW_PCU_Test_CT {
249 if (t >= 0) {
250 f_vty_config2(PCUVTY, {"pcu"}, "timer T" & int2str(t) & " " & int2str(val));
251 } else {
252 f_vty_config2(PCUVTY, {"pcu"}, "timer X" & int2str(t * -1) & " " & int2str(val));
253 }
254}
255
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100256private function f_init_vty(charstring id, boolean egprs_only) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200257 map(self:PCUVTY, system:PCUVTY);
258 f_vty_set_prompts(PCUVTY);
259 f_vty_transceive(PCUVTY, "enable");
260
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100261 /* This will be removed soon, not needed. EGPRS support is controlled through pcu_ind flags */
262 if (egprs_only) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200263 f_vty_config2(PCUVTY, {"pcu"}, "egprs only");
264 } else {
265 f_vty_config2(PCUVTY, {"pcu"}, "no egprs");
266 }
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200267
268 if (g_force_two_phase_access) {
269 f_vty_config2(PCUVTY, {"pcu"}, "two-phase-access");
270 } else {
271 f_vty_config2(PCUVTY, {"pcu"}, "no two-phase-access");
272 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200273}
274
Pau Espin Pedrol2456dad2020-04-30 20:22:38 +0200275function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200276runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200277 /* Start the guard timer */
278 g_T_guard.start;
279 activate(as_Tguard_RAW());
280
281 /* Init PCU interface component */
Harald Welte5339b2e2020-10-04 22:52:56 +0200282 vc_PCUIF := RAW_PCUIF_CT.create("PCUIF");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200283 connect(vc_PCUIF:MTC, self:PCUIF);
284 map(vc_PCUIF:PCU, system:PCU);
285
286 /* Create one BTS component (we may want more some day) */
Harald Welte5339b2e2020-10-04 22:52:56 +0200287 vc_BTS := RAW_PCU_BTS_CT.create("BTS");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200288 connect(vc_BTS:PCUIF, vc_PCUIF:BTS);
289 connect(vc_BTS:TC, self:BTS);
290
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100291 f_init_vty(id, f_pcuif_ind_flags_egprs_enabled(valueof(info_ind.flags)));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200292
Daniel Willmann535aea62020-09-21 13:27:08 +0200293 f_init_statsd(id, vc_STATSD, mp_pcu_statsd_ip, mp_pcu_statsd_port);
294 /* This is normally done in the ConnHdlr component, but here
295 * the Test_CT doubles as ConnHdlr */
296 connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
297
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200298 vc_PCUIF.start(f_PCUIF_CT_handler(mp_pcu_sock_path));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100299 vc_BTS.start(f_BTS_CT_handler(0, valueof(info_ind), true));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200300
301 /* Wait until the BTS is ready (SI13 negotiated) */
302 BTS.receive(tr_RAW_PCU_EV(BTS_EV_SI13_NEGO));
303}
304
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700305/* Register TLLI of each allocated GprsMS instance */
306private function f_multi_ms_bssgp_register()
307runs on RAW_PCU_Test_CT {
308 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
309 f_bssgp_client_llgmm_assign(TLLI_UNUSED, g_ms[i].tlli);
310 }
311}
312
313/* Allocate [and activate] an Uplink TBF for each allocated GprsMS instance */
314private function f_multi_ms_establish_tbf(boolean do_activate := false)
315runs on RAW_PCU_Test_CT {
316 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
317 /* Establish an Uplink TBF */
318 f_ms_establish_ul_tbf(g_ms[i]);
319
320 /* Send a random block, so this TBF becomes "active" */
321 if (do_activate) {
322 /* FIXME: use the new APU by Pau to get correct TRX/TS here */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100323 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, i mod 8);
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700324 var octetstring dummy := f_rnd_octstring(12);
325 var RlcmacDlBlock dl_block;
326 var uint32_t poll_fn;
327
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200328 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 +0700329 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := nr);
330 }
331 }
332}
333
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100334private function f_ms_establish_ul_tbf_2phase_access(inout GprsMS ms,
335 template (omit) RlcmacUlCtrlMsg pkt_res_req := omit)
336runs on RAW_PCU_Test_CT return PollFnCtx {
337 var PollFnCtx pollctx;
338
339 /* Single block (two phase) packet access */
340 var uint16_t ra := bit2int(chan_req_sb);
341 if (g_force_two_phase_access) {
342 /* If 2phase access is enforced by the network, then let's
343 * request a One phase packet access, we'll receive a single block
344 * anyway
345 */
346 ra := bit2int(chan_req_def);
347 }
348
349 /* Establish an Uplink TBF */
350 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
351 f_ms_establish_ul_tbf(ms);
352
353 /* Make sure we've got an Uplink TBF assignment */
354 if (not match(ms.ul_tbf.ass.ccch, tr_PacketUlSglAssign)) {
355 setverdict(fail, "Wrong Packet Uplink Assignment received: ", ms.ul_tbf.ass.ccch, " vs exp: ", tr_PacketUlSglAssign);
356 f_shutdown(__BFILE__, __LINE__);
357 }
358
359 /* Send PACKET RESOURCE REQUEST
360 * (see 3GPP TS 04.60 "7.1.3.1 Initiation of the Packet resource request procedure")
361 */
362 if (istemplatekind(pkt_res_req, "omit")) {
363 pkt_res_req := ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit);
364 }
365
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200366 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 +0100367 /* Store 1st UlTBF context before receiving next one, will
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100368 * overwrite the TS allocation on MS with info from new UL TBF:
369 */
370 pollctx.tstrxbts := f_ms_tx_TsTrxBtsNum(ms);
371 f_ms_rx_pkt_ass_pacch(ms, pollctx.fn, tr_RLCMAC_UL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
372 return pollctx;
373}
374
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200375testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +0200376 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
Pau Espin Pedrol2889f872021-01-11 14:43:35 +0100377 var GprsTlli tlli := TLLI_UNUSED;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200378 timer T;
379
380 /* Initialize NS/BSSGP side */
381 f_init_bssgp();
382
383 /* Initialize the PCU interface abstraction */
384 f_init_raw(testcasename());
385
386 /* Establish BSSGP connection to the PCU */
387 f_bssgp_establish();
388
389 BTS.send(ts_PCUIF_SUSP_REQ(0, tlli, ra_id, 0));
390
391 T.start(2.0);
392 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100393 [] 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 +0200394 setverdict(pass);
395 }
396 [] T.timeout {
397 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
398 }
399 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700400
401 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200402}
403
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100404/* Make sure TBF is released and no data is sent for in after reciving a Suspend Request from that MS. See OS#4761 */
405testcase TC_pcuif_suspend_active_tbf() runs on RAW_PCU_Test_CT {
406 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200407 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100408 var RlcmacDlBlock dl_block;
409 var octetstring data := f_rnd_octstring(10);
410 var uint32_t sched_fn;
411 var uint32_t dl_fn;
412 var GprsMS ms;
413 timer T;
414
415 /* Initialize NS/BSSGP side */
416 f_init_bssgp();
417 /* Initialize GPRS MS side */
418 f_init_gprs_ms();
419 ms := g_ms[0]; /* We only use first MS in this test */
420
421 /* Initialize the PCU interface abstraction */
422 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
423
424 /* Establish BSSGP connection to the PCU */
425 f_bssgp_establish();
426 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
427
428 /* Establish an Uplink TBF */
429 f_ms_establish_ul_tbf(ms);
430
431 /* Send one UL block (with TLLI since we are in One-Phase Access
432 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200433 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 +0100434 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
435 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
436 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
437
438 /* UL block should be received in SGSN */
439 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
440
441 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
442 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
443 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
444
445 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
446 f_sleep(X2002);
447 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
448
449 /* MS has moved to CS, it sent SUSP REQ to BTS and PCU gets it, TBF is freed: */
450 BTS.send(ts_PCUIF_SUSP_REQ(0, ms.tlli, ra_id, 0));
451
452 T.start(2.0);
453 alt {
454 [] BSSGP_GLOBAL[0].receive(tr_BSSGP_SUSPEND(ms.tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
455 setverdict(pass);
456 }
457 [] T.timeout {
458 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
459 f_shutdown(__BFILE__, __LINE__);
460 }
461 }
462
463 /* Make sure we don't receive data for that TBF since it was released
464 * before. Also check our TBF is not polled for UL. */
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200465 f_pcuif_rx_data_req_pdtch(data_msg);
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +0100466 if (data_msg.dl_block == omit) {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200467 /* IDLE block, expected on new PCU versions */
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200468 } else {
469 setverdict(fail, "Unexpected dl_block", data_msg.dl_block);
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100470 f_shutdown(__BFILE__, __LINE__);
471 }
472
473 /* New data arrives, PCU should page the MS since no TBF active exists: */
474 /* Send some more data, it will never reach the MS */
475 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
476 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
477
478 f_shutdown(__BFILE__, __LINE__, final := true);
479}
480
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200481/* Test of correct Timing Advance at the time of TBF establishment
482 * (derived from timing offset of the Access Burst). */
483testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200484 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200485
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200486 /* Initialize GPRS MS side */
487 f_init_gprs_ms();
488 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200489 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100490 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200491
492 /* We cannot send too many TBF requests in a short time because
493 * at some point the PCU will fail to allocate a new TBF. */
494 for (var TimingAdvance ta := 0; ta < 64; ta := ta + 16) {
495 /* Establish an Uplink TBF (send RACH.ind with current TA) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200496 ms.ta := ta;
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700497 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200498
499 /* Make sure Timing Advance IE matches out expectations */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200500 if (ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance != ta) {
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700501 setverdict(fail, "Timing Advance mismatch: ",
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200502 ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance,
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700503 " vs expected ", ta);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700504 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200505 }
506 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700507
508 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200509}
510
Vadim Yanitskiy866f8702021-05-26 14:50:27 +0200511/* Verify Timing Advance value indicated in Packet Uplink ACK/NACK message
512 * sent in response to the first Uplink block after resource allocation. */
513testcase TC_ta_ul_ack_nack_first_block() runs on RAW_PCU_Test_CT {
514 var GprsMS ms := valueof(t_GprsMS_def);
515 var PacketUlAckNack ul_ack_nack;
516 var PacketTimingAdvance pkt_ta;
517 var RlcmacDlBlock dl_block;
518 var uint32_t sched_fn;
519
520 /* Initialize NS/BSSGP side */
521 f_init_bssgp();
522
523 /* Initialize the PCU interface abstraction */
524 f_init_raw(testcasename());
525
526 /* Establish BSSGP connection to the PCU */
527 f_bssgp_establish();
528 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
529
530 /* Establish an Uplink TBF */
531 f_ms_establish_ul_tbf(ms);
532
533 /* In a busy network, there can be a significant delay between resource
534 * allocation (Packet Uplink Assignment above) and the actual time when
535 * the MS is allowed to transmit the first Uplink data block. */
536
537 /* Simulate a delay > 0 */
538 ms.ta := 2;
539
540 /* We're in One-Phase Access contention resoultion, include TLLI */
541 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
542 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
543
544 ul_ack_nack := dl_block.ctrl.payload.u.ul_ack_nack;
545 if (ispresent(ul_ack_nack.gprs.pkt_ta)) {
546 pkt_ta := ul_ack_nack.gprs.pkt_ta;
547 } else if (ispresent(ul_ack_nack.egprs.pkt_ta)) {
548 pkt_ta := ul_ack_nack.egprs.pkt_ta;
549 } else {
550 setverdict(fail, "PacketTimingAdvance IE is not present");
551 f_shutdown(__BFILE__, __LINE__);
552 }
553
554 if (not ispresent(pkt_ta.val)) {
555 setverdict(fail, "Timing Advance value is not present");
556 f_shutdown(__BFILE__, __LINE__);
557 } else if (pkt_ta.val != ms.ta) {
558 setverdict(fail, "Timing Advance mismatch: expected ",
559 ms.ta, ", but received ", pkt_ta.val);
560 f_shutdown(__BFILE__, __LINE__);
561 }
562}
563
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200564/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
565 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
566 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
567 * no active TBF exists at the moment of establishment (idle mode). */
568testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100569 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200570
571 /* Initialize NS/BSSGP side */
572 f_init_bssgp();
573
574 /* Initialize the PCU interface abstraction */
575 f_init_raw(testcasename());
576
577 /* Establish BSSGP connection to the PCU */
578 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100579 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200580
581 /* SGSN sends some DL data, PCU will initiate Packet Downlink
582 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100583 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
584 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200585
586 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
587 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
588 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100589 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700590 setverdict(fail, "Timing Advance value doesn't match");
591 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700592
593 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200594}
595
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200596/* Verify that the PCU generates idle blocks in PTCCH/D
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200597 * while neither Uplink nor Downlink TBF is established. */
598testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100599 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200600 timer T;
601
602 /* Initialize the PCU interface abstraction */
603 f_init_raw(testcasename());
604
605 /* Sent an RTS.req for PTCCH/D */
606 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
607 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
608 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100609
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200610 T.start(5.0);
611 alt {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200612 [] BTS.receive(tr_PCUIF_DATA_PTCCH(0,
613 tr_PCUIF_DATA(0, 7, sapi := PCU_IF_SAPI_PTCCH),
614 omit)) {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200615 }
616 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg) {
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +0100617 setverdict(fail, "Expected IDLE block instead of PTCCH/D block");
618 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200619 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200620 [] BTS.receive(PCUIF_Message:?) { repeat; }
621 [] T.timeout {
622 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700623 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200624 }
625 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100626 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700627
628 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200629}
630
631/* Test of correct Timing Advance during an active Uplink TBF.
632 *
633 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
634 * are not continuous and there can be long time gaps between them. This happens
635 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
636 * significantly change between such rare Uplink transmissions, so GPRS introduces
637 * additional mechanisms to control Timing Advance, and thus reduce interference
638 * between neighboring TDMA time-slots.
639 *
640 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
641 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
642 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
643 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
644 * among with the initial Timing Advance value. And here PTCCH comes to play.
645 *
646 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
647 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
648 * continuously. To ensure continuous measurements of the signal propagation
649 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
650 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
651 *
652 * The purpose of this test case is to verify the assignment of Timing Advance
653 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
654 * first establishes several Uplink TBFs, but does not transmit any Uplink
655 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
656 * indications to the PCU, checking the correctness of two received PTCCH/D
657 * messages (period of PTCCH/D is two multi-frames).
658 */
659
660/* List of ToA values for Access Bursts to be sent on PTCCH/U,
661 * each ToA (Timing of Arrival) value is in units of 1/4 of
662 * a symbol (i.e. 1 symbol is 4 QTA units). */
663type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
664const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
665 0, 0, 0, 0,
666 0, 0, 0, 0,
667 0, 0, 0, 0,
668 0, 0, 0, 0
669};
670
671private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
672 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
673runs on RAW_PCU_Test_CT {
674 var RAW_PCU_Event event;
675 var integer ss;
676
677 /* Send Access Bursts on PTCCH/U for every TA Index */
678 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
679 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700680 if (ss < 0) { /* Shall not happen */
681 f_shutdown(__BFILE__, __LINE__);
682 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200683
684 log("Sending an Access Burst on PTCCH/U",
685 ", sub-slot=", ss, " (TAI)",
686 ", fn=", event.data.tdma_fn,
687 ", ToA=", toa_map[ss], " (QTA)");
688 /* TODO: do we care about RA and burst format? */
689 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
690 ra := oct2int('3A'O),
691 is_11bit := 0,
692 burst_type := BURST_TYPE_0,
693 fn := event.data.tdma_fn,
694 arfcn := 871,
695 qta := toa_map[ss],
696 sapi := PCU_IF_SAPI_PTCCH));
697 repeat;
698 }
699}
700
701private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
702 template PTCCHDownlinkMsg t_ta_msg)
703runs on RAW_PCU_Test_CT {
704 var PTCCHDownlinkMsg ta_msg;
705 var PCUIF_Message pcu_msg;
706 timer T;
707
708 /* First, send an RTS.req for the upcoming PTCCH/D block */
709 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
710 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
711 arfcn := 871, block_nr := 0));
712 T.start(2.0);
713 alt {
714 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
715 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
716 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
717 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
718 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
719 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
720 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
721 log("Rx PTCCH/D message: ", ta_msg);
722
723 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700724 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200725 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
726 }
727 }
728 [] BTS.receive { repeat; }
729 [] T.timeout {
730 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200731 }
732 }
733}
734
735testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
736 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200737 var GprsMS ms;
738
739 /* Initialize GPRS MS side */
740 f_init_gprs_ms();
741 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200742
743 /* Initialize the PCU interface abstraction */
744 f_init_raw(testcasename());
745
746 /* Enable forwarding of PTCCH/U TDMA events to us */
747 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
748
749 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
750 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200751 /* Establish an Uplink TBF */
752 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200753
754 /* We expect incremental TFI/USF assignment (dynamic allocation) */
755 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200756 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200757 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700758 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200759 }
760
761 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200762 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200763 setverdict(fail, "Failed to match Timing Advance Index for #", i);
764 /* Keep going, the current OsmoPCU does not assign TA Index */
765 }
766 }
767
768 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
769 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
770 for (var integer i := 0; i < 7; i := i + 1) {
771 /* ToA in units of 1/4 of a symbol */
772 toa_map[i] := (i + 1) * 7 * 4;
773 }
774
775 /* Now we have all 7 TBFs established in one-phase access mode,
776 * however we will not be sending any data on them. Instead, we
777 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
778 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
779 *
780 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
781 * time-slots, so at the moment of scheduling a PTCCH/D block
782 * the PCU has odd number of PTCCH/U Access Bursts received. */
783 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
784 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
785 /* Other values are not known (yet) */
786 tai3_ta := ?));
787 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
788 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
789 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
790 /* Other values are out of our interest */
791 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700792
793 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200794}
795
796/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
797 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
798 *
799 * NOTE: the ranges are intentionally overlapping because OsmoPCU
800 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
801private template integer CS1_lqual_dB_range := (-infinity .. 6);
802private template integer CS2_lqual_dB_range := (5 .. 8);
803private template integer CS3_lqual_dB_range := (7 .. 13);
804private template integer CS4_lqual_dB_range := (12 .. infinity);
805
806testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200807 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200808 var GprsMS ms;
809 var uint32_t unused_fn, sched_fn;
810 var uint4_t cv;
811
812 /* Initialize GPRS MS side */
813 f_init_gprs_ms();
814 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200815
816 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100817 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200818
819 f_pcuvty_set_allowed_cs_mcs();
820 f_pcuvty_set_link_quality_ranges();
821
822 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200823 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200824
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200825
826 /* The actual / old link quality values. We need to keep track of the old
827 * (basically previous) link quality value, because OsmoPCU actually
828 * changes the coding scheme if not only the actual, but also the old
829 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200830 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200831 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200832
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200833 /* Send one UL block (with TLLI since we are in One-Phase Access
834 contention resoultion) and make sure it is ACKED fine. */
835 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
836 /* 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 +0200837 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 +0200838 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
839 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
840 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200841
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200842 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
843 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200844 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200845 lqual_old := ms.lqual_cb;
846 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200847
848 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200849 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
850 if (i > g_bs_cv_max) {
851 cv := 15;
852 } else {
853 cv := i;
854 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200855
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200856 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
857
858 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
859 f_rx_rlcmac_dl_block(dl_block, unused_fn);
860 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
861 continue;
862 }
863 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
864 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
865 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
866 f_shutdown(__BFILE__, __LINE__);
867 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200868
869 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
870 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
871
872 /* Match the received Channel Coding Command. Since we are increasing
873 * the link quality value on each iteration and not decreasing, there
874 * is no need to check the both old and current link quality values. */
875 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200876 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200877 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
878 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
879 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
880 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
881 }
882
883 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
884 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200885 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200886 }
887 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700888
889 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200890}
891
892/* Test the max UL CS set by VTY works fine */
893testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200894 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200895 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200896 var uint32_t unused_fn, sched_fn;
897 var GprsMS ms;
898
899 /* Initialize GPRS MS side */
900 f_init_gprs_ms();
901 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200902
903 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100904 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200905
906 /* Set initial UL CS to 3 */
907 g_cs_initial_ul := 3;
908 f_pcuvty_set_allowed_cs_mcs();
909 f_pcuvty_set_link_quality_ranges();
910
911 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200912 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200913
914 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200915 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200916
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200917 /* Send one UL block (with TLLI since we are in One-Phase Access
918 contention resoultion) and make sure it is ACKED fine. */
919 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
920 /* 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 +0200921 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 +0200922 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
923 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
924 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200925
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200926 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
927 while (true) {
928 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
929 f_rx_rlcmac_dl_block(dl_block, unused_fn);
930 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
931 continue;
932 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200933
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200934 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
935 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
936 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
937 f_shutdown(__BFILE__, __LINE__);
938 break;
939 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200940
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200941 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200942 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200943 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200944 if (last_ch_coding != CH_CODING_CS3) {
945 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200946 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200947 }
948
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200949 /* Remaining UL blocks are used to make sure regardless of initial
950 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200951 /* 0 dB, make sure we downgrade CS */
952 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200953 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200954 f_ms_tx_ul_data_block_multi(ms, 5);
955 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
956 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
957 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200958
959 if (last_ch_coding != CH_CODING_CS1) {
960 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200961 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200962 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700963
964 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200965}
966
967/* Test the max UL CS set by VTY works fine */
968testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200969 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200970 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200971 var uint32_t unused_fn, sched_fn;
972 var GprsMS ms;
973
974 /* Initialize GPRS MS side */
975 f_init_gprs_ms();
976 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200977
978 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100979 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200980
981 /* Set maximum allowed UL CS to 3 */
982 g_cs_max_ul := 3;
983 f_pcuvty_set_allowed_cs_mcs();
984 f_pcuvty_set_link_quality_ranges();
985
986 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200987 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200988
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200989 /* Send one UL block (with TLLI since we are in One-Phase Access
990 contention resoultion) and make sure it is ACKED fine. */
991 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
992 /* 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 +0200993 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 +0200994 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
995 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
996 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200997
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200998 ms.lqual_cb := 40*10; /* 40 dB */
999 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001000
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001001 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1002 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001003
1004 if (last_ch_coding != CH_CODING_CS3) {
1005 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +02001006 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001007 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001008
1009 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001010}
1011
Pau Espin Pedrol75122592020-11-03 15:22:59 +01001012/* Test the initial DL CS set by VTY works fine */
1013testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
1014 var octetstring data := f_rnd_octstring(10);
1015 var CodingScheme exp_dl_cs_mcs;
1016 var RlcmacDlBlock dl_block;
1017 var uint32_t poll_fn;
1018 var GprsMS ms;
1019
1020 /* Initialize NS/BSSGP side */
1021 f_init_bssgp();
1022 /* Initialize GPRS MS side */
1023 f_init_gprs_ms();
1024 ms := g_ms[0]; /* We only use first MS in this test */
1025
1026 /* Initialize the PCU interface abstraction */
1027 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1028
1029 /* Set initial allowed DL CS to 3 */
1030 g_cs_initial_dl := 3;
1031 exp_dl_cs_mcs := CS_3;
1032 /* Set maximum allowed UL CS to 4 */
1033 g_cs_max_dl := 4;
1034 f_pcuvty_set_allowed_cs_mcs();
1035 f_pcuvty_set_link_quality_ranges();
1036
1037 /* Establish BSSGP connection to the PCU */
1038 f_bssgp_establish();
1039 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1040
1041 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1042 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1043 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1044
1045 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1046 f_sleep(X2002);
1047 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1048
1049 /* ACK the DL block */
1050 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1051 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1052 f_dl_block_ack_fn(dl_block, poll_fn));
1053
1054 f_shutdown(__BFILE__, __LINE__, final := true);
1055}
1056
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001057/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001058function 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 +01001059 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001060 var RlcmacDlBlock prev_dl_block, dl_block;
1061 var uint32_t ack_fn;
1062 var uint32_t fn;
1063 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001064 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001065 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001066 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
1067 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001068 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001069
1070 if (using_egprs) {
1071 exp_tmp_csmcs := mcs_egprs_any;
1072 bsn_mod := 2048;
1073 } else {
1074 exp_tmp_csmcs := cs_gprs_any;
1075 bsn_mod := 128;
1076 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001077
1078 /* Establish BSSGP connection to the PCU */
1079 f_bssgp_establish();
1080
1081 ms := g_ms[0]; /* We only use first MS in this test */
1082 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1083
1084 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001085 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001086 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1087
1088 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1089 f_sleep(X2002);
1090
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001091 for (var integer i := 0; i < 800; i := i + 1) {
1092 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001093 f_rx_rlcmac_dl_block(dl_block, fn);
1094
1095 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
1096 /* No more data to receive, done */
1097 break;
1098 }
1099
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001100 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001101
1102 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001103 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001104
1105 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001106 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001107 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001108 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 +01001109 if (tx_data_remain != 0) {
1110 /* Submit more data from time to time to keep the TBF ongoing */
1111 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1112 tx_data_remain := tx_data_remain - 1;
1113 }
1114 }
1115 prev_dl_block := dl_block;
1116 }
1117
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001118 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1119 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001120
1121
1122 f_shutdown(__BFILE__, __LINE__, final := true);
1123}
1124
1125/* Verify DL CS above "cs max" set by VTY is never used */
1126testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1127 /* Initialize NS/BSSGP side */
1128 f_init_bssgp();
1129 /* Initialize GPRS MS side */
1130 f_init_gprs_ms();
1131
1132 /* Initialize the PCU interface abstraction */
1133 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1134
1135 /* Set maximum allowed DL CS to 3 */
1136 g_cs_initial_dl := 1;
1137 g_cs_max_dl := 3;
1138 f_pcuvty_set_allowed_cs_mcs();
1139 f_pcuvty_set_link_quality_ranges();
1140
1141 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1142}
1143
1144/* Check DL CS4 is used in good link conditions if allowed by config */
1145testcase TC_dl_cs1_to_cs4() runs on RAW_PCU_Test_CT {
1146 /* Initialize NS/BSSGP side */
1147 f_init_bssgp();
1148 /* Initialize GPRS MS side */
1149 f_init_gprs_ms();
1150
1151 /* Initialize the PCU interface abstraction */
1152 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1153
1154 /* Set initial DL CS to 1 & maximum allowed DL CS to 4 */
1155 g_cs_initial_dl := 1;
1156 g_cs_max_dl := 4;
1157 f_pcuvty_set_allowed_cs_mcs();
1158 f_pcuvty_set_link_quality_ranges();
1159
1160 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1161}
1162
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001163/* Test the initial UL MCS set by VTY works fine */
1164testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1165 var RlcmacDlBlock dl_block;
1166 var PollFnCtx pollctx;
1167 var EgprsChCodingCommand last_ch_coding;
1168 var uint32_t unused_fn, sched_fn;
1169 var GprsMS ms;
1170 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001171
1172 /* Initialize GPRS MS side */
1173 f_init_gprs_ms();
1174 ms := g_ms[0]; /* We only use first MS in this test */
1175
1176 /* Initialize the PCU interface abstraction */
1177 f_init_raw(testcasename());
1178
1179 /* Set initial UL MCS to 3 */
1180 g_mcs_initial_ul := 3;
1181 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1182 f_pcuvty_set_allowed_cs_mcs();
1183 f_pcuvty_set_link_quality_ranges();
1184
1185 /* Take lqual (dB->cB) so that we stay in that MCS */
1186 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1187
1188 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001189 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 +01001190
1191 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1192 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1193 f_shutdown(__BFILE__, __LINE__);
1194 }
1195
1196 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1197 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1198
1199 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1200 while (true) {
1201 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1202 f_rx_rlcmac_dl_block(dl_block, unused_fn);
1203 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1204 continue;
1205 }
1206
1207 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1208 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1209 f_shutdown(__BFILE__, __LINE__);
1210 break;
1211 }
1212
1213 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1214 break;
1215 }
1216 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1217 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1218 f_shutdown(__BFILE__, __LINE__);
1219 }
1220
1221 /* Remaining UL blocks are used to make sure regardless of initial
1222 * lqual, we can go lower at any time
1223 * 0 dB, make sure we downgrade MCS */
1224 ms.lqual_cb := 0;
1225 /* 5 UL blocks, check we are in same initial MCS: */
1226 f_ms_tx_ul_data_block_multi(ms, 5);
1227 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1228 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1229 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1230
1231 if (last_ch_coding != CH_CODING_MCS1) {
1232 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1233 f_shutdown(__BFILE__, __LINE__);
1234 }
1235
1236 f_shutdown(__BFILE__, __LINE__, final := true);
1237}
1238
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001239/* Test the maximum UL MCS set by VTY works fine */
1240testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1241 var RlcmacDlBlock dl_block;
1242 var EgprsChCodingCommand last_ch_coding;
1243 var PollFnCtx pollctx;
1244 var uint32_t unused_fn, sched_fn;
1245 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001246
1247 /* Initialize GPRS MS side */
1248 f_init_gprs_ms();
1249 ms := g_ms[0]; /* We only use first MS in this test */
1250
1251 /* Initialize the PCU interface abstraction */
1252 f_init_raw(testcasename());
1253
1254 /* Set maximum allowed UL MCS to 5 */
1255 g_mcs_max_ul := 5;
1256 f_pcuvty_set_allowed_cs_mcs();
1257 f_pcuvty_set_link_quality_ranges();
1258
1259 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001260 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 +01001261 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1262 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1263
1264 ms.lqual_cb := 40*10; /* 40 dB */
1265 f_ms_tx_ul_data_block_multi(ms, 16);
1266
1267 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1268 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1269
1270 if (last_ch_coding != CH_CODING_MCS5) {
1271 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1272 f_shutdown(__BFILE__, __LINE__);
1273 }
1274
1275 f_shutdown(__BFILE__, __LINE__, final := true);
1276}
1277
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001278/* Test the initial DL CS set by VTY works fine */
1279testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1280 var octetstring data := f_rnd_octstring(10);
1281 var CodingScheme exp_dl_cs_mcs;
1282 var RlcmacDlBlock dl_block;
1283 var uint32_t poll_fn;
1284 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001285
1286 /* Initialize NS/BSSGP side */
1287 f_init_bssgp();
1288 /* Initialize GPRS MS side */
1289 f_init_gprs_ms();
1290 ms := g_ms[0]; /* We only use first MS in this test */
1291
1292 /* Initialize the PCU interface abstraction */
1293 f_init_raw(testcasename());
1294
1295 /* Set initial allowed DL MCS to 3 */
1296 g_mcs_initial_dl := 3;
1297 exp_dl_cs_mcs := MCS_3;
1298 /* Set maximum allowed DL MCS to 4 */
1299 g_mcs_max_dl := 4;
1300 f_pcuvty_set_allowed_cs_mcs();
1301 f_pcuvty_set_link_quality_ranges();
1302
1303 /* Establish BSSGP connection to the PCU */
1304 f_bssgp_establish();
1305 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1306
1307 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001308 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001309 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1310
1311 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1312 f_sleep(X2002);
1313 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1314
1315 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001316 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1317 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 +01001318 f_dl_block_ack_fn(dl_block, poll_fn));
1319
1320 f_shutdown(__BFILE__, __LINE__, final := true);
1321}
1322
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001323/* Verify DL MCS above "mcs max" set by VTY is never used */
1324testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1325 /* Initialize NS/BSSGP side */
1326 f_init_bssgp();
1327 /* Initialize GPRS MS side */
1328 f_init_gprs_ms();
1329
1330 /* Initialize the PCU interface abstraction */
1331 f_init_raw(testcasename());
1332
1333 /* Set maximum allowed DL CS to 3 */
1334 g_mcs_initial_dl := 1;
1335 g_mcs_max_dl := 3;
1336 f_pcuvty_set_allowed_cs_mcs();
1337 f_pcuvty_set_link_quality_ranges();
1338
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001339 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 +01001340}
1341
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02001342/* Verify PCU drops TBF after some time of inactivity. */
1343testcase TC_t3141() runs on RAW_PCU_Test_CT {
1344 var PCUIF_info_ind info_ind;
1345 var template (value) TsTrxBtsNum nr;
1346 var BTS_PDTCH_Block data_msg;
1347 var GprsMS ms;
1348 var uint3_t rx_usf;
1349 timer T_3141 := 1.0;
1350 var boolean ul_tbf_usf_req := false;
1351
1352 /* Initialize NS/BSSGP side */
1353 f_init_bssgp();
1354 /* Initialize GPRS MS side */
1355 f_init_gprs_ms();
1356 ms := g_ms[0]; /* We only use first MS in this test */
1357
1358 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1359 /* Only use 1 PDCH to simplify test: */
1360 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
1361 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
1362 /* Initialize the PCU interface abstraction */
1363 f_init_raw(testcasename(), info_ind);
1364
1365 f_vty_config2(PCUVTY, {"pcu"}, "timer T3141 1");
1366
1367 /* Establish BSSGP connection to the PCU */
1368 f_bssgp_establish();
1369 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1370
1371 /* Establish a one-phase access Uplink TBF */
1372 f_ms_establish_ul_tbf(ms);
1373
1374 T_3141.start;
1375
1376 /* Now we wait for PCU to transmit our USF */
1377 nr := ts_TsTrxBtsNum;
1378 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1379 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1380 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1381 block_nr := nr.blk_nr));
1382
1383 alt {
1384 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1385 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1386 ?)) -> value data_msg {
1387 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1388 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1389 f_shutdown(__BFILE__, __LINE__);
1390 }
1391
1392 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1393 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1394 /* PCU requests our USF, transmit WITHOUT tlli to avoid contention resolution success */
1395 ul_tbf_usf_req := true;
1396 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))
1397 } else if (rx_usf == USF_UNUSED) {
1398 if (data_msg.raw.fn >= ms.ul_tbf.start_time_fn) {
1399 if (ul_tbf_usf_req) {
1400 /* TBF was dropped by T3141, success */
1401 setverdict(pass);
1402 break;
1403 } else {
1404 log("PCU never requested USF, unexpected");
1405 f_shutdown(__BFILE__, __LINE__);
1406 }
1407 } /* else: Keep waiting for TBF to be active by network */
1408 } else {
1409 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1410 f_shutdown(__BFILE__, __LINE__);
1411 }
1412
1413 /* Make sure we don't receive a Ul ACK/NACK with TLLI set: */
1414 if (match(data_msg.dl_block,
1415 tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
1416 tr_UlAckNackGprs(tlli := ?,
1417 acknack_desc := ?,
1418 rel99 := *))))
1419 {
1420 log("Received UL ACK/NACK with TLLI set");
1421 f_shutdown(__BFILE__, __LINE__);
1422 }
1423
1424 nr := ts_TsTrxBtsNum;
1425 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1426 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1427 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1428 block_nr := nr.blk_nr));
1429 repeat;
1430 }
1431 [] T_3141.timeout {
1432 log("T_3141 expired but TBF is still active, unexpected");
1433 f_shutdown(__BFILE__, __LINE__);
1434 }
1435 [] BTS.receive {
1436 /* We should never receive non-dummy messages, aka UL ACK/NACK,
1437 * because we never sent the TLLI to the PCU */
1438 setverdict(fail, "Unexpected BTS message");
1439 f_shutdown(__BFILE__, __LINE__);
1440 }
1441 }
1442
1443 f_shutdown(__BFILE__, __LINE__, final := true);
1444}
1445
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001446/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1447 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1448 * T3169. See OS#5033 */
1449testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1450 var PCUIF_info_ind info_ind;
1451 var template (value) TsTrxBtsNum nr;
1452 var BTS_PDTCH_Block data_msg;
1453 var GprsMS ms;
1454 var uint3_t rx_usf;
1455 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1456 var integer n3101 := 0;
1457 timer T_3169 := 1.0;
1458
1459 /* Initialize NS/BSSGP side */
1460 f_init_bssgp();
1461 /* Initialize GPRS MS side */
1462 f_init_gprs_ms();
1463 ms := g_ms[0]; /* We only use first MS in this test */
1464
1465 /* Initialize the PCU interface abstraction */
1466 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1467 info_ind.n3101 := N3101_MAX;
1468 info_ind.t3169 := 1;
1469 f_init_raw(testcasename(), info_ind);
1470
1471 /* Establish BSSGP connection to the PCU */
1472 f_bssgp_establish();
1473 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1474
1475 /* Establish UL TBF */
1476 f_ms_establish_ul_tbf(ms);
1477
1478 /* Now we wait for PCU to transmit our USF */
1479 nr := ts_TsTrxBtsNum;
1480 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1481 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1482 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1483 block_nr := nr.blk_nr));
1484
1485 alt {
1486 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1487 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1488 ?)) -> value data_msg {
1489 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1490 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1491 f_shutdown(__BFILE__, __LINE__);
1492 }
1493
1494 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1495 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1496 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1497 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001498 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1499 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001500 f_shutdown(__BFILE__, __LINE__);
1501 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001502 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001503 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1504 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1505 if (not T_3169.running) {
1506 log("T3169 started");
1507 T_3169.start;
1508 }
1509 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1510 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1511 f_shutdown(__BFILE__, __LINE__);
1512 } else {
1513 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1514 }
1515 nr := ts_TsTrxBtsNum;
1516 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1517 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1518 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1519 block_nr := nr.blk_nr));
1520 repeat;
1521 }
Pau Espin Pedrol907ba202021-11-12 17:25:24 +01001522 /* We may already receive empty (idle) blocks before our own TTCN3 timer
1523 * triggers due to the TBF being released. Keep going until our T_3169 triggers. */
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01001524 [n3101 == N3101_MAX + 1] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001525 [] T_3169.timeout {
1526 log("T_3169 expired");
1527 /* Done in alt */
1528 }
1529 [] BTS.receive {
1530 setverdict(fail, "Unexpected BTS message");
1531 f_shutdown(__BFILE__, __LINE__);
1532 }
1533 }
1534
1535 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1536 /* USFs as per previous TBF since they were freed at expiration time: */
1537 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1538 var uint5_t old_tfi := ms.ul_tbf.tfi;
1539 f_ms_establish_ul_tbf(ms);
1540 if (old_tfi != ms.ul_tbf.tfi) {
1541 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1542 f_shutdown(__BFILE__, __LINE__);
1543 }
1544 for (var integer i := 0; i < 8; i := i +1) {
1545 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1546 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1547 f_shutdown(__BFILE__, __LINE__);
1548 }
1549 }
1550
1551 f_shutdown(__BFILE__, __LINE__, final := true);
1552}
1553
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001554
1555/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1556 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1557 the final UL ACK sent at us. */
1558testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1559 var PCUIF_info_ind info_ind;
1560 var BTS_PDTCH_Block data_msg;
1561 var RlcmacDlBlock dl_block;
1562 var uint32_t sched_fn;
1563 var template (value) TsTrxBtsNum nr;
1564 var template RlcmacDlBlock exp_ul_ack;
1565 var template UlAckNackGprs exp_ul_ack_sub;
1566 var GprsMS ms;
1567 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1568 var integer N3103 := 0;
1569 timer T_3169 := 1.0;
1570
1571 /* Initialize GPRS MS side */
1572 f_init_gprs_ms();
1573 ms := g_ms[0]; /* We only use first MS in this test */
1574
1575 /* Initialize the PCU interface abstraction */
1576 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1577 info_ind.n3103 := N3103_MAX;
1578 info_ind.t3169 := 1;
1579 f_init_raw(testcasename(), info_ind);
1580
1581 /* Establish an Uplink TBF */
1582 f_ms_establish_ul_tbf(ms);
1583
Pau Espin Pedrol93ae4522021-05-11 15:58:26 +02001584 f_ms_tx_ul_data_block_multi(ms, 5, with_tlli := true);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001585 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1586 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1587
1588 nr := ts_TsTrxBtsNum;
1589 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1590 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1591 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1592 block_nr := nr.blk_nr));
1593 alt {
1594 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1595 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1596 exp_ul_ack)) -> value data_msg {
1597 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1598 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1599 f_shutdown(__BFILE__, __LINE__);
1600 }
1601
1602 nr := ts_TsTrxBtsNum;
1603 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1604 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1605 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1606 block_nr := nr.blk_nr));
1607 N3103 := N3103 + 1;
1608 if (N3103 == N3103_MAX) {
1609 /* At this point in time (N3103_MAX reached), PCU is
1610 * moving the TBF to RELEASE state so no data/ctrl for
1611 * it is tx'ed, hence the dummy blocks: */
1612 T_3169.start;
1613 }
1614 repeat;
1615 }
1616 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1617 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1618 exp_ul_ack)) -> value data_msg {
1619 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1620 f_shutdown(__BFILE__, __LINE__);
1621 }
1622 [] as_ms_rx_ignore_dummy(ms, nr);
Pau Espin Pedrol907ba202021-11-12 17:25:24 +01001623 [] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001624 [T_3169.running] T_3169.timeout {
1625 log("T_3169 timeout");
1626 /* Done in alt, wait for pending RTS initiated previously in
1627 * above case before continuing (expect /* Dummy block): */
1628 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1629 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1630 tr_RLCMAC_DUMMY_CTRL));
1631 }
1632 [] BTS.receive {
1633 setverdict(fail, "Unexpected BTS message");
1634 f_shutdown(__BFILE__, __LINE__);
1635 }
1636 }
1637
1638 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1639 * USFs as per previous TBF since they were freed at expiration time: */
1640 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1641 var uint5_t old_tfi := ms.ul_tbf.tfi;
1642 f_ms_establish_ul_tbf(ms);
1643 if (old_tfi != ms.ul_tbf.tfi) {
1644 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1645 f_shutdown(__BFILE__, __LINE__);
1646 }
1647 for (var integer i := 0; i < 8; i := i +1) {
1648 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1649 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1650 f_shutdown(__BFILE__, __LINE__);
1651 }
1652 }
1653
1654 f_shutdown(__BFILE__, __LINE__, final := true);
1655}
1656
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001657/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1658 * point the TBF is no longer available. In order to get to start of T3191, we
1659 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1660 * until TBF release procedure starts after draining DL queue. */
1661testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1662 var PCUIF_info_ind info_ind;
1663 var RlcmacDlBlock dl_block;
1664 var octetstring data1 := f_rnd_octstring(200);
1665 var octetstring data2 := f_rnd_octstring(10);
1666 var uint32_t dl_fn;
1667 var template (value) TsTrxBtsNum nr;
1668 var BTS_PDTCH_Block data_msg;
1669 var GprsMS ms;
1670
1671 /* Initialize NS/BSSGP side */
1672 f_init_bssgp();
1673 /* Initialize GPRS MS side */
1674 f_init_gprs_ms();
1675 ms := g_ms[0]; /* We only use first MS in this test */
1676
1677 /* Initialize the PCU interface abstraction */
1678 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1679 /* Set timer to 1 sec (default 5) to speedup test: */
1680 info_ind.t3191 := 1;
1681 f_init_raw(testcasename(), info_ind);
1682
1683 /* Establish BSSGP connection to the PCU */
1684 f_bssgp_establish();
1685 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1686
1687 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1688 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1689 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1690
1691 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1692 f_sleep(X2002);
1693
1694 while (true) {
1695 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1696
1697 /* Keep Ack/Nack description updated (except for last BSN) */
1698 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1699
1700 if (f_dl_block_rrbp_valid(dl_block)) {
1701 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1702 f_dl_block_ack_fn(dl_block, dl_fn));
1703 break;
1704 }
1705 }
1706
1707 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1708 nr := ts_TsTrxBtsNum;
1709 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1710 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1711 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1712 block_nr := nr.blk_nr));
1713 alt {
1714 [] as_ms_rx_ignore_dummy(ms, nr);
1715 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1716 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1717 ?)) -> value data_msg {
1718 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1719 log("Received FINAL_ACK");
1720 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1721 break;
1722 }
1723 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1724 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1725 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1726 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1727 }
1728 nr := ts_TsTrxBtsNum;
1729 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1730 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1731 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1732 block_nr := nr.blk_nr));
1733 repeat;
1734 }
1735 [] BTS.receive {
1736 setverdict(fail, "Unexpected BTS message");
1737 f_shutdown(__BFILE__, __LINE__);
1738 }
1739 }
1740
1741 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1742 to time out. We simply sleep instead of requesting blocks because
1743 otherwise retransmissions would keep restarting the timer. */
1744 f_sleep(int2float(info_ind.t3191));
1745
1746 /* The TBF should be freed now, so new data should trigger an Assignment: */
1747 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1748 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1749
1750 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1751 f_sleep(X2002);
1752 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1753 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1754 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1755 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1756 f_dl_block_ack_fn(dl_block, dl_fn));
1757
1758 f_shutdown(__BFILE__, __LINE__, final := true);
1759}
1760
1761/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1762testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1763 var PCUIF_info_ind info_ind;
1764 var RlcmacDlBlock dl_block;
1765 var octetstring data1 := f_rnd_octstring(1400);
1766 var octetstring data2 := f_rnd_octstring(10);
1767 var uint32_t dl_fn;
1768 var GprsMS ms;
1769
1770 /* Initialize NS/BSSGP side */
1771 f_init_bssgp();
1772 /* Initialize GPRS MS side */
1773 f_init_gprs_ms();
1774 ms := g_ms[0]; /* We only use first MS in this test */
1775
1776 /* Initialize the PCU interface abstraction */
1777 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1778 /* Set timer to 1 sec (default 5) to speedup test: */
1779 info_ind.t3191 := 1;
1780 f_init_raw(testcasename(), info_ind);
1781
1782 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1783
1784 /* Establish BSSGP connection to the PCU */
1785 f_bssgp_establish();
1786 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1787
1788 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1789 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1790 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1791
1792 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1793 f_sleep(X2002);
1794
1795 /* Send enough DL data to at least be able to DL ACK once (excl the
1796 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1797 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1798 while (true) {
1799 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1800
1801 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1802 log("Received FINAL_ACK");
1803 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1804 break;
1805 }
1806
1807 /* Keep Ack/Nack description updated (except for last BSN) */
1808 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1809
1810 if (f_dl_block_rrbp_valid(dl_block)) {
1811 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1812 f_dl_block_ack_fn(dl_block, dl_fn));
1813 }
1814 }
1815
1816 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1817 to time out. We simply sleep instead of requesting blocks because
1818 otherwise retransmissions would keep restarting the timer. */
1819 f_sleep(int2float(info_ind.t3191));
1820
1821 /* The TBF should be freed now, so new data should trigger an Assignment: */
1822 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1823 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1824
1825 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1826 f_sleep(X2002);
1827 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1828 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1829 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1830 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1831 f_dl_block_ack_fn(dl_block, dl_fn));
1832
1833 f_shutdown(__BFILE__, __LINE__, final := true);
1834}
1835
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001836/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1837 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1838 * T3193) after DL TBF release */
1839testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001840 var RlcmacDlBlock dl_block;
1841 var octetstring data := f_rnd_octstring(10);
1842 var boolean ok;
1843 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001844 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001845 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001846 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1847
1848 /* Initialize NS/BSSGP side */
1849 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001850 /* Initialize GPRS MS side */
1851 f_init_gprs_ms();
1852 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001853
1854 /* Initialize the PCU interface abstraction */
1855 f_init_raw(testcasename());
1856
1857 /* Establish BSSGP connection to the PCU */
1858 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001859 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001860
1861 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001862 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1863 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001864
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001865 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1866 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001867 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001868
1869 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001870 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1871 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1872 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001873
1874 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001875 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001876 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001877 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001878 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001879
1880 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001881
1882 /* 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 +07001883 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001884 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1885 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1886 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001887
1888 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001889}
1890
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001891/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1892 freed and no longer available. Trigger it by sending DL blocks and never DL
1893 ACKing the data (which are requested through RRBP) */
1894testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1895 var PCUIF_info_ind info_ind;
1896 var RlcmacDlBlock dl_block;
1897 var octetstring data1 := f_rnd_octstring(1000);
1898 var octetstring data2 := f_rnd_octstring(10);
1899 var uint32_t dl_fn;
1900 var template (value) TsTrxBtsNum nr;
1901 var BTS_PDTCH_Block data_msg;
1902 var GprsMS ms;
1903 const integer N3105_MAX := 2;
1904 var integer N3105 := 0;
1905 timer T_3195 := 1.0;
1906 var integer num_poll_recv := 0;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001907 var template RlcmacDlBlock dl_block_exp;
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001908
1909 /* Initialize NS/BSSGP side */
1910 f_init_bssgp();
1911 /* Initialize GPRS MS side */
1912 f_init_gprs_ms();
1913 ms := g_ms[0]; /* We only use first MS in this test */
1914
1915 /* Initialize the PCU interface abstraction */
1916 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1917 /* Speedup test: */
1918 info_ind.n3105 := N3105_MAX;
1919 info_ind.t3195 := 1;
1920 f_init_raw(testcasename(), info_ind);
1921
1922 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1923 * MS and retransmitted after the TBF is released and later on created
1924 * (because the MS is reused) */
1925 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1926
1927 /* Establish BSSGP connection to the PCU */
1928 f_bssgp_establish();
1929 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1930
1931 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1932 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1933 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1934
1935 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1936 f_sleep(X2002);
1937
1938 /* Now we go on receiving DL data and not answering RRBP: */
1939 nr := ts_TsTrxBtsNum;
1940 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1941 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1942 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1943 block_nr := nr.blk_nr));
1944 alt {
1945 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1946 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1947 tr_RLCMAC_DATA)) -> value data_msg {
1948 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1949 if (num_poll_recv == 0) {
1950 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1951 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1952 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1953 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1954 } else {
1955 log("Ignoring RRBP ", num_poll_recv);
1956 N3105 := N3105 + 1;
1957 }
1958 num_poll_recv := num_poll_recv + 1;
1959 }
1960
1961 nr := ts_TsTrxBtsNum;
1962 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1963 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1964 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1965 block_nr := nr.blk_nr));
1966 repeat;
1967 }
1968 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001969 * RELEASE state so no data for it is tx'ed, hence the dummy/idle blocks:
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001970 */
1971 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1972 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1973 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1974 if (not T_3195.running) {
1975 T_3195.start;
1976 /* We even send some new data, nothing should be sent to MS */
1977 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1978 }
1979 nr := ts_TsTrxBtsNum;
1980 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1981 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1982 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1983 block_nr := nr.blk_nr));
1984 repeat;
1985 }
Pau Espin Pedrol518e82f2021-11-12 17:24:33 +01001986 /* We may already receive idle blocks before our own TTCN3 timer
1987 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01001988 [N3105 == N3105_MAX] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001989 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001990 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001991 /* Done in alt, wait for pending RTS initiated previously in
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01001992 * above case before continuing (expect empty block): */
1993 dl_block_exp := omit;
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001994 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1995 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001996 dl_block_exp));
1997 }
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001998 [] BTS.receive {
1999 setverdict(fail, "Unexpected BTS message");
2000 f_shutdown(__BFILE__, __LINE__);
2001 }
2002 }
2003
2004 /* after T_3195 timeout, TBF is released */
2005 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
2006 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2007
2008 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2009 f_sleep(X2002);
2010 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
2011
2012 /* ACK the DL block */
2013 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2014 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2015 f_dl_block_ack_fn(dl_block, dl_fn));
2016
2017 f_shutdown(__BFILE__, __LINE__, final := true);
2018}
2019
Pau Espin Pedrole8a94442021-11-15 17:05:46 +01002020/* Verify configured T3172 is properly transmitted as WAIT_INDICATION in Pkt Access Reject in PACCH. */
2021function f_TC_t3172(integer t3172_ms, BIT1 wait_ind_size) runs on RAW_PCU_Test_CT {
2022 var PCUIF_info_ind info_ind;
2023 var template IARRestOctets rest;
2024 var BIT11 ra11;
2025 var GprsMS ms;
2026 var octetstring data := f_rnd_octstring(10);
2027 var RlcmacDlBlock dl_block;
2028 var template RlcmacDlBlock rej_tmpl;
2029 var uint32_t dl_fn;
2030 var uint32_t sched_fn;
2031 var uint8_t wait_ind_val;
2032
2033 /* Initialize NS/BSSGP side */
2034 f_init_bssgp();
2035 /* Initialize GPRS MS side */
2036 f_init_gprs_ms();
2037 ms := g_ms[0]; /* We only use first MS in this test */
2038
2039 info_ind := valueof(ts_PCUIF_INFO_default);
2040
2041 /* Only the first TRX is enabled. */
2042 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
2043 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
2044
2045 /* Initialize the PCU interface abstraction */
2046 f_init_raw(testcasename(), info_ind);
2047
2048 f_pcuvty_set_timer(3172, t3172_ms);
2049
2050 /* Establish BSSGP connection to the PCU */
2051 f_bssgp_establish();
2052 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2053
2054 var EGPRSPktChRequest req := {
2055 one_phase := {
2056 tag := '0'B,
2057 multislot_class := '10101'B,
2058 priority := '01'B,
2059 random_bits := '101'B
2060 }
2061 };
2062
2063 /* We send 7 requests, the IUT gives us all available USFs (0..6) */
2064 for (var integer i := 0; i < 7; i := i + 1) {
2065 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
2066 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
2067 }
2068
2069 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2070 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2071 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2072
2073 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2074 f_sleep(X2002);
2075 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
2076
2077 /* ACK the DL block */
2078 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2079 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc, false, ts_ChannelReqDescription()),
2080 f_dl_block_ack_fn(dl_block, dl_fn));
2081
2082 /* Since all USF are taken, we should receive a Reject: */
2083
2084 if (wait_ind_size == '0'B) {
2085 wait_ind_val := t3172_ms / 1000;
2086 } else {
2087 wait_ind_val := t3172_ms / 20;
2088 }
2089 rej_tmpl := tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_ACC_REJ(
2090 tr_PacketAccessRejectStruct_TLLI(ms.tlli,
2091 wait_ind_val,
2092 wait_ind_size)));
2093 template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum;
2094 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2095 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2096 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2097 block_nr := nr.blk_nr));
2098 alt {
2099 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2100 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2101 rej_tmpl));
2102 [] BTS.receive {
2103 setverdict(fail, "Unexpected BTS message");
2104 f_shutdown(__BFILE__, __LINE__);
2105 }
2106 }
2107 f_shutdown(__BFILE__, __LINE__, final := true);
2108}
2109testcase TC_t3172_wait_ind_size0() runs on RAW_PCU_Test_CT {
2110 /* size=0 means value is provided in seconds. Due to value being 8
2111 * bit, in the 20ms step case (size=1) the maximum value possible is 20 * 255
2112 * = 5100. Hence, values above it should use size=0 to be able to
2113 * provide values in range. Let's use 6 seconds, 6000ms
2114 */
2115 f_TC_t3172(6000, '0'B);
2116}
2117testcase TC_t3172_wait_ind_size1() runs on RAW_PCU_Test_CT {
2118 f_TC_t3172(3000, '1'B);
2119}
2120
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002121/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
2122testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002123 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002124 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002125 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002126 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002127
2128 /* Initialize NS/BSSGP side */
2129 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002130 /* Initialize GPRS MS side */
2131 f_init_gprs_ms();
2132 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002133
2134 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002135 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002136
2137 /* Establish BSSGP connection to the PCU */
2138 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002139 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002140
2141 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002142 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002143
2144 /* Send one UL block (with TLLI since we are in One-Phase Access
2145 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002146 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002147 /* 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 +02002148 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 +02002149 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2150 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002151 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002152
2153 /* Send enough blocks to test whole procedure: Until Nth block
2154 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
2155 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002156 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002157 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2158 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002159 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002160
2161 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002162 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 +07002163
2164 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002165}
2166
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002167/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
2168testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
2169 var RlcmacDlBlock dl_block;
2170 var uint32_t dl_fn, sched_fn;
2171 var octetstring payload;
2172 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002173 var template (value) LlcBlockHdr blk_hdr;
2174 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002175 var integer blk_len;
2176 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002177 var GprsMS ms;
2178
2179 /* Initialize NS/BSSGP side */
2180 f_init_bssgp();
2181 /* Initialize GPRS MS side */
2182 f_init_gprs_ms();
2183 ms := g_ms[0]; /* We only use first MS in this test */
2184
2185 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002186 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002187
2188 /* Establish BSSGP connection to the PCU */
2189 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002190 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002191
2192 /* Establish an Uplink TBF */
2193 f_ms_establish_ul_tbf(ms);
2194
2195 /* Send one UL block (with TLLI since we are in One-Phase Access
2196 contention resoultion) and make sure it is ACKED fine. */
2197 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002198 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2199 more := false, e := true);
2200 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002201 /* 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 +01002202 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
2203 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002204 cv := 15,
2205 bsn := ms.ul_tbf.bsn,
2206 blocks := blocks,
2207 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002208 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002209 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002210
2211 /* ACK and check it was received fine */
2212 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2213 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2214 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2215 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002216 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 +02002217
2218 /* Test sending LLC PDUS of incrementing size */
2219 var integer max_size := 49;
2220 for (var integer i := 1; i <= max_size; i := i + 1) {
2221 var integer cv;
2222 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
2223 log("Sending DATA.ind with LLC payload size ", i);
2224 if (i < max_size - g_bs_cv_max) {
2225 cv := 15;
2226 } else {
2227 cv := max_size - i;
2228 }
2229
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002230 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
2231 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002232 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002233 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2234 more := false, e := true);
2235 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002236 /* 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 +01002237 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
2238 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002239 cv := cv,
2240 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002241 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002242 f_ultbf_inc_bsn(ms.ul_tbf);
2243 f_ms_tx_ul_block(ms, ul_data);
2244
2245 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002246 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 +02002247
2248 /* we will receive UL ACK/NACK from time to time, handle it. */
2249 f_rx_rlcmac_dl_block(dl_block, dl_fn);
2250 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
2251 continue;
2252 }
2253 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2254 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2255 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2256 f_shutdown(__BFILE__, __LINE__);
2257 }
2258
2259 log("Rx Packet Uplink ACK / NACK");
2260 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2261 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2262 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2263 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002264
2265 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002266}
2267
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002268function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2269 var octetstring payload;
2270 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002271 var template (value) LlcBlockHdr blk_hdr;
2272 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002273 var integer block_len, max_valid_data_len;
2274 timer T;
2275
2276 block_len := f_rlcmac_cs_mcs2block_len(cs);
2277 /* We need to send with TLLI since we are in One-Phase Access Contenion
2278 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
2279 * indicator, -1 for spare bits octet at the end */
2280 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2281 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 +07002282 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2283 more := false, e := true);
2284 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002285 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2286 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002287 cv := cv,
2288 bsn := ms.ul_tbf.bsn,
2289 blocks := blocks,
2290 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002291 f_ultbf_inc_bsn(ms.ul_tbf);
2292 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2293
2294 T.start(0.5);
2295 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002296 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002297 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2298 f_shutdown(__BFILE__, __LINE__);
2299 }
2300 [] T.timeout {
2301 setverdict(pass);
2302 }
2303 }
2304}
2305/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2306 blocks intentionally contain last byte of data placed in last byte of RLC
2307 containing padding/spare bits, which is incorrect. Spare bits exist and are
2308 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2309 discounting padding in octet" */
2310testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2311 var GprsMS ms;
2312 var integer block_len, max_valid_data_len;
2313
2314 /* Initialize NS/BSSGP side */
2315 f_init_bssgp();
2316 /* Initialize GPRS MS side */
2317 f_init_gprs_ms();
2318 ms := g_ms[0]; /* We only use first MS in this test */
2319
2320 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002321 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002322
2323 /* Establish BSSGP connection to the PCU */
2324 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002325 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002326
2327 /* Establish an Uplink TBF */
2328 f_ms_establish_ul_tbf(ms);
2329
2330 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2331 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2332 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2333
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002334 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002335}
2336
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002337/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2338 * answered, so TBFs for uplink and later for downlink are created.
2339 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002340private 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 +02002341 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002342 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002343 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002344 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002345 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002346
2347 /* Initialize NS/BSSGP side */
2348 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002349 /* Initialize GPRS MS side */
2350 f_init_gprs_ms();
2351 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002352
2353 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002354 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002355
2356 /* Establish BSSGP connection to the PCU */
2357 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002358 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002359
2360 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002361 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002362
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002363 /* Send one UL block (with TLLI since we are in One-Phase Access
2364 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002365 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 +02002366 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2367 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002368 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002369
2370 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002371 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002372
2373 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002374 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2375 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002376
2377 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2378 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002379 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002380
2381 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002382 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2383 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2384 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002385
2386 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002387}
2388
2389/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2390 * answered, so TBFs for uplink and later for downlink are created.
2391 */
2392testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002393 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002394 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002395}
2396
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002397/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2398 * answered, so TBFs for uplink and later for downlink are created.
2399 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002400private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2401 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002402 template (present) CodingScheme exp_ul_cs_mcs := ?,
2403 template (present) CodingScheme exp_dl_cs_mcs := ?)
2404runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002405 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002406 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002407 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002408 var uint32_t sched_fn;
2409 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002410 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002411 var GprsMS ms;
2412
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002413 /* Initialize NS/BSSGP side */
2414 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002415 /* Initialize GPRS MS side */
2416 f_init_gprs_ms();
2417 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002418
2419 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002420 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002421
2422 /* Establish BSSGP connection to the PCU */
2423 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002424 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002425
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002426 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2427 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 +02002428
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002429 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2430 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 +02002431 f_shutdown(__BFILE__, __LINE__);
2432 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002433
2434 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2435 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002436 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002437
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002438 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002439 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 +02002440
2441 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002442 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002443
2444 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002445 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002446 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2447 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002448 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002449 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002450 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002451
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002452 /* PCU acks the UL data after having received CV=0) */
2453 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2454
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002455 /* 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 +02002456 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 +02002457
2458 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002459 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2460 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 +02002461 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002462
2463 f_shutdown(__BFILE__, __LINE__, final := true);
2464}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002465
2466testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002467 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2468 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002469
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002470 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 +01002471
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002472 var StatsDExpects expect := {
2473 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2474 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2475 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2476 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2477 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2478 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2479 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2480 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2481 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2482 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2483 };
2484 f_statsd_expect(expect);
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002485}
2486
2487testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002488 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2489 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002490
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002491 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 +01002492
2493 var StatsDExpects expect := {
2494 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2495 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2496 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2497 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2498 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2499 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2500 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2501 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2502 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2503 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2504 };
2505 f_statsd_expect(expect);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002506}
2507
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002508testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2509 /* Configure PCU to force two phase access */
2510 g_force_two_phase_access := true;
2511
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002512 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002513 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002514
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002515 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 +01002516
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01002517 var StatsDExpects expect := {
2518 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2519 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2520 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
2521 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
2522 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2523 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2524 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2525 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2526 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2527 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2528 };
2529 f_statsd_expect(expect);
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002530}
2531
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002532/* Test scenario where SGSN wants to send some data against MS and it is
2533 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2534 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002535private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2536 template (present) CodingScheme exp_cs_mcs := ?)
2537runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002538 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002539 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002540 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002541 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002542 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002543
2544 /* Initialize NS/BSSGP side */
2545 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002546 /* Initialize GPRS MS side */
2547 f_init_gprs_ms();
2548 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002549
2550 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002551 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002552
2553 /* Establish BSSGP connection to the PCU */
2554 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002555 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002556
2557 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002558 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2559 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002560
2561 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2562 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002563 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002564
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002565 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002566 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2567 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 +02002568 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002569
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002570 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002571 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002572
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002573 /* Send one UL block (with TLLI since we are in One-Phase Access
2574 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002575 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002576 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2577 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002578 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002579
2580 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002581 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002582
2583 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002584}
2585
2586testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002587 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002588 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2589}
2590
2591/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2592/* information about the MS */
2593testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002594 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002595 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002596}
2597
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002598/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2599 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2600 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2601 * be transferred).
2602 */
2603testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002604 var RlcmacDlBlock dl_block;
2605 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002606 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002607 var octetstring total_payload;
2608 var octetstring payload;
2609 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002610 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002611 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002612 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002613
2614 /* Initialize NS/BSSGP side */
2615 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002616 /* Initialize GPRS MS side */
2617 f_init_gprs_ms();
2618 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002619
2620 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002621 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002622
2623 /* Establish BSSGP connection to the PCU */
2624 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002625 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002626
2627 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002628 f_ms_establish_ul_tbf(ms);
2629 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002630
2631 /* Send one UL block (with TLLI since we are in One-Phase Access
2632 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002633 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 +02002634 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 +02002635
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002636 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2637 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002638 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002639 total_payload := payload;
2640
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002641 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2642
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002643 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002644 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002645 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002646 total_payload := total_payload & payload;
2647
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002648 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002649 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002650 total_payload := total_payload & payload;
2651
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002652 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002653 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 +02002654 total_payload := total_payload & lost_payload;
2655
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002656 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002657 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002658 total_payload := total_payload & payload;
2659
2660 /* 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 +02002661 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002662
2663 /* On CV=0, we'll receive a UL ACK asking about missing block */
2664 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2665 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002666 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2667 tfi := tfi,
2668 cv := 15,
2669 bsn := 3,
2670 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002671 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002672
2673 /* Now final ack is recieved */
2674 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2675 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002676 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002677
2678 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002679 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 +07002680
2681 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002682}
2683
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002684/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2685 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2686 * timeout occurs (specified by sent RRBP on DL block). */
2687testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002688 var RlcmacDlBlock dl_block;
2689 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002690 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002691 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002692
2693 /* Initialize NS/BSSGP side */
2694 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002695 /* Initialize GPRS MS side */
2696 f_init_gprs_ms();
2697 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002698
2699 /* Initialize the PCU interface abstraction */
2700 f_init_raw(testcasename());
2701
2702 /* Establish BSSGP connection to the PCU */
2703 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002704 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002705
2706 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002707 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2708 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002709
2710 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2711 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002712 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002713
2714 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2715 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2716 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002717 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002718
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002719 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2720 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002721 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002722
2723 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002724 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2725 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2726 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002727
2728 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002729}
2730
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002731/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2732testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2733 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2734 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002735 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002736 var RlcmacDlBlock dl_block;
2737 var uint32_t ack_fn;
2738 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002739 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002740 timer T := 5.0;
2741
2742 /* Initialize NS/BSSGP side */
2743 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002744 /* Initialize GPRS MS side */
2745 f_init_gprs_ms();
2746 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002747
2748 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002749 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002750
Daniel Willmann535aea62020-09-21 13:27:08 +02002751 f_statsd_reset();
2752
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002753 /* Establish BSSGP connection to the PCU */
2754 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002755 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002756
2757 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002758 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2759 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002760
2761 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2762 f_sleep(X2002);
2763
2764 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2765 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002766 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002767
2768 /* TDMA frame number on which we are supposed to send the ACK */
2769 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2770
2771 /* SGSN sends more blocks during the indicated RRBP */
2772 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2773 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002774 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002775
2776 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2777
2778 /* Make sure this block has the same TFI as was assigned
2779 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002780 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002781 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2782 dl_block.data.mac_hdr.hdr_ext.tfi);
2783 f_shutdown(__BFILE__, __LINE__);
2784 }
2785
2786 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002787 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002788
2789 /* Break if this is the end of RRBP */
2790 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002791 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002792 break;
2793 }
2794 }
2795
2796 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002797 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 +07002798
2799 /* Make sure that the next block (after the Ack) is dummy */
2800 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2801
Daniel Willmann535aea62020-09-21 13:27:08 +02002802 var StatsDExpects expect := {
2803 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2804 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2805 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2806 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2807 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002808 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002809 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2810 };
2811 f_statsd_expect(expect);
2812
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002813 f_shutdown(__BFILE__, __LINE__, final := true);
2814}
2815
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002816/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2817 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2818 * Check "3GPP TS 44.060" Annex B. */
2819testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2820 var RlcmacDlBlock dl_block;
2821 var octetstring dataA := f_rnd_octstring(20);
2822 var octetstring dataB := f_rnd_octstring(13);
2823 var octetstring dataC := f_rnd_octstring(3);
2824 var octetstring dataD := f_rnd_octstring(12);
2825 var uint32_t sched_fn;
2826 var GprsMS ms;
2827 var template (value) RlcmacUlBlock ul_data;
2828
2829 /* Initialize NS/BSSGP side */
2830 f_init_bssgp();
2831 /* Initialize GPRS MS side */
2832 f_init_gprs_ms();
2833 ms := g_ms[0]; /* We only use first MS in this test */
2834
2835 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002836 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002837
2838 /* Establish BSSGP connection to the PCU */
2839 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002840 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002841
2842 /* Establish an Uplink TBF */
2843 f_ms_establish_ul_tbf(ms);
2844
2845 /* Summary of what's transmitted:
2846 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2847 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2848 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2849 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2850 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2851 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2852 */
2853
2854 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002855 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2856 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002857 cv := 3,
2858 bsn := ms.ul_tbf.bsn,
2859 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2860 tlli := ms.tlli);
2861 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2862 * RLCMAC block being sent. */
2863 ul_data.data.mac_hdr.e := true;
2864 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002865 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002866
2867 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002868 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2869 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002870 cv := 2,
2871 bsn := ms.ul_tbf.bsn,
2872 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2873 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2874 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2875 },
2876 tlli := ms.tlli);
2877 f_ultbf_inc_bsn(ms.ul_tbf);
2878 f_ms_tx_ul_block(ms, ul_data);
2879
2880 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002881 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 +02002882
2883 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002884 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2885 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002886 cv := 1,
2887 bsn := ms.ul_tbf.bsn,
2888 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2889 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2890 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2891 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2892 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2893 },
2894 tlli := ms.tlli);
2895 f_ultbf_inc_bsn(ms.ul_tbf);
2896 f_ms_tx_ul_block(ms, ul_data);
2897
2898 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002899 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2900 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 +02002901
2902 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002903 ul_data := t_RLCMAC_UL_DATA_TLLI(
2904 cs := CS_1,
2905 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002906 cv := 0,
2907 bsn := ms.ul_tbf.bsn,
2908 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2909 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2910 },
2911 tlli := ms.tlli);
2912 f_ultbf_inc_bsn(ms.ul_tbf);
2913 f_ms_tx_ul_block(ms, ul_data);
2914
2915 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002916 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 +02002917
2918 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2919 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2920 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2921
2922 f_shutdown(__BFILE__, __LINE__, final := true);
2923}
2924
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002925/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2926 * ACK/NACK is not answered */
2927testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2928 var RlcmacDlBlock dl_block;
2929 var octetstring data1 := f_rnd_octstring(200);
2930 var octetstring data2 := f_rnd_octstring(10);
2931 var uint32_t dl_fn;
2932 var GprsMS ms;
2933 var template (value) TsTrxBtsNum nr;
2934 var BTS_PDTCH_Block data_msg;
2935
2936 /* Initialize NS/BSSGP side */
2937 f_init_bssgp();
2938 /* Initialize GPRS MS side */
2939 f_init_gprs_ms();
2940 ms := g_ms[0]; /* We only use first MS in this test */
2941
2942 /* Initialize the PCU interface abstraction */
2943 f_init_raw(testcasename())
2944
2945 /* Establish BSSGP connection to the PCU */
2946 f_bssgp_establish();
2947 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2948
2949 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2950 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2951 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2952
2953 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2954 f_sleep(X2002);
2955
2956 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2957 while (true) {
2958 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2959
2960 /* Keep Ack/Nack description updated (except for last BSN) */
2961 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2962
2963 if (f_dl_block_rrbp_valid(dl_block)) {
2964 /* Don't transmit DL ACK here on purpose ignore it */
2965 break;
2966 }
2967 }
2968
2969 /* PCU starts whole process again */
2970 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2971
2972 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2973 f_sleep(X2002);
2974
2975 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2976 /* DL data), after that we receive only DUMMY blocks so we are done */
2977 var boolean data_received := false;
2978 nr := ts_TsTrxBtsNum;
2979 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2980 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2981 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2982 block_nr := nr.blk_nr));
2983 alt {
2984 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2985 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2986 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2987 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2988 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2989 tr_RLCMAC_DATA)) -> value data_msg {
2990 data_received := true;
2991 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2992 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2993 log("Received FINAL_ACK");
2994 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2995 }
2996 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2997 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2998 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2999 }
3000 nr := ts_TsTrxBtsNum;
3001 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3002 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3003 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3004 block_nr := nr.blk_nr));
3005 repeat;
3006 }
3007 [] BTS.receive {
3008 setverdict(fail, "Unexpected BTS message");
3009 f_shutdown(__BFILE__, __LINE__);
3010 }
3011 }
3012
3013 f_shutdown(__BFILE__, __LINE__, final := true);
3014}
3015
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003016/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
3017testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003018 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003019 var octetstring data := f_rnd_octstring(10);
3020 var PacketDlAssign dl_tbf_ass;
3021 var RlcmacDlBlock dl_block;
3022 var uint32_t poll_fn;
3023 var uint32_t sched_fn;
3024 var GprsMS ms;
3025 timer T := 5.0;
3026
3027 /* Initialize NS/BSSGP side */
3028 f_init_bssgp();
3029 /* Initialize GPRS MS side */
3030 f_init_gprs_ms();
3031 ms := g_ms[0]; /* We only use first MS in this test */
3032
3033 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003034 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3035 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003036
3037 /* Initialize the PCU interface abstraction */
3038 f_init_raw(testcasename(), info_ind);
3039
3040 /* Establish BSSGP connection to the PCU */
3041 f_bssgp_establish();
3042 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3043
3044 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
3045 through PDCH (no multiblock assignment possible through PCH) */
3046 f_ms_establish_ul_tbf(ms);
3047
3048 /* Send one UL block (with TLLI since we are in One-Phase Access
3049 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003050 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
3051 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01003052 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3053 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3054
3055 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
3056 var MultislotCap_GPRS_BSSGP mscap_gprs := {
3057 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3058 gprsextendeddynalloccap := '0'B
3059 };
3060 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
3061 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3062 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
3063 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
3064 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
3065 f_shutdown(__BFILE__, __LINE__);
3066 }
3067 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3068
3069 f_shutdown(__BFILE__, __LINE__, final := true);
3070}
3071
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003072testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003073 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003074 var RlcmacDlBlock dl_block;
3075 var octetstring data := f_rnd_octstring(10);
3076 var PollFnCtx pollctx;
3077 var uint32_t sched_fn;
3078 var GprsMS ms;
3079
3080 var MultislotCap_GPRS mscap_gprs := {
3081 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3082 gprsextendeddynalloccap := '0'B
3083 };
3084 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3085
3086
3087 /* Initialize NS/BSSGP side */
3088 f_init_bssgp();
3089 /* Initialize GPRS MS side */
3090 f_init_gprs_ms();
3091 ms := g_ms[0]; /* We only use first MS in this test */
3092
3093 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003094 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3095 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003096
3097 /* Initialize the PCU interface abstraction */
3098 f_init_raw(testcasename(), info_ind);
3099
3100 /* Establish BSSGP connection to the PCU */
3101 f_bssgp_establish();
3102 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3103
3104 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3105 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3106
3107 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3108 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
3109
3110 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3111 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
3112 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
3113 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
3114 f_shutdown(__BFILE__, __LINE__);
3115 }
3116 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3117
3118 f_shutdown(__BFILE__, __LINE__, final := true);
3119}
3120
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003121testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
3122 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3123 var RlcmacDlBlock dl_block;
3124 var octetstring data := f_rnd_octstring(10);
3125 var PollFnCtx pollctx;
3126 var uint32_t sched_fn;
3127 var GprsMS ms;
3128
3129 var MultislotCap_GPRS mscap_gprs := {
3130 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3131 gprsextendeddynalloccap := '0'B
3132 };
3133 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3134
3135
3136 /* Initialize NS/BSSGP side */
3137 f_init_bssgp();
3138 /* Initialize GPRS MS side */
3139 f_init_gprs_ms();
3140 ms := g_ms[0]; /* We only use first MS in this test */
3141
3142 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003143 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3144 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003145
3146 /* Initialize the PCU interface abstraction */
3147 f_init_raw(testcasename(), info_ind);
3148
3149 /* Establish BSSGP connection to the PCU */
3150 f_bssgp_establish();
3151 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3152
3153 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3154 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3155
3156 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
3157 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
3158 f_shutdown(__BFILE__, __LINE__);
3159 }
3160
3161 f_shutdown(__BFILE__, __LINE__, final := true);
3162}
3163
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003164/* Test scenario where MS wants to request a new TBF once the current one is
3165 * ending, by means of sending a Packet Resource Request on ul slot provided by
3166 * last Pkt Ul ACK's RRBP.
3167 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3168testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003169 var RlcmacDlBlock dl_block;
3170 var octetstring data := f_rnd_octstring(10);
3171 var uint32_t sched_fn;
3172 var uint32_t dl_fn;
3173 var template RlcmacDlBlock acknack_tmpl;
3174 var GprsMS ms;
3175
3176 /* Initialize NS/BSSGP side */
3177 f_init_bssgp();
3178 /* Initialize GPRS MS side */
3179 f_init_gprs_ms();
3180 ms := g_ms[0]; /* We only use first MS in this test */
3181
3182 /* Initialize the PCU interface abstraction */
3183 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003184 f_statsd_reset();
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003185
3186 /* Establish BSSGP connection to the PCU */
3187 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003188 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003189
3190 /* Establish an Uplink TBF */
3191 f_ms_establish_ul_tbf(ms);
3192
3193 /* Send one UL block (with TLLI since we are in One-Phase Access
3194 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003195 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 +02003196
3197 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003198 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003199
3200 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3201 tr_UlAckNackGprs(ms.tlli,
3202 tr_AckNackDescription(final_ack := '1'B),
3203 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3204 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3205
3206 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3207
3208 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07003209 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 +07003210 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003211 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3212 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3213
3214 /* Send one UL block (without TLLI since we are in Second-Phase Access)
3215 and make sure it is ACKED fine */
3216 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
3217
3218 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003219 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003220
3221 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3222 /* ACK the ACK */
3223 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3224
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003225 var StatsDExpects expect := {
3226 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
3227 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
3228 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
3229 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3230 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
3231 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 1, max := 1 },
3232 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
3233 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
3234 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
3235 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
3236 };
3237 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003238
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003239 f_shutdown(__BFILE__, __LINE__, final := true);
3240}
3241
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003242/* Test scenario where MS wants to request a new TBF once the current one is
3243 * ending, by means of sending a Packet Resource Request on ul slot provided by
3244 * last Pkt Ul ACK's RRBP. new Pkt Ul Ass is never confirmed by the MS in this test.
3245 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3246testcase TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() runs on RAW_PCU_Test_CT {
3247 var PCUIF_info_ind info_ind;
3248 var RlcmacDlBlock dl_block;
3249 var octetstring data := f_rnd_octstring(10);
3250 var uint32_t sched_fn;
3251 var uint32_t dl_fn;
3252 var template (value) TsTrxBtsNum nr;
3253 var BTS_PDTCH_Block data_msg;
3254 var template RlcmacDlBlock acknack_tmpl;
3255 var GprsMS ms;
3256 const integer N3105_MAX := 2;
3257 var integer N3105 := 0;
3258 timer T_3195 := 1.0 + 0.5; /* 0.5: extra offset since we cannot match exactly */
3259
3260 /* Initialize NS/BSSGP side */
3261 f_init_bssgp();
3262 /* Initialize GPRS MS side */
3263 f_init_gprs_ms();
3264 ms := g_ms[0]; /* We only use first MS in this test */
3265
3266 /* Initialize the PCU interface abstraction */
3267 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3268 /* Speedup test: */
3269 info_ind.n3105 := N3105_MAX;
3270 info_ind.t3195 := 1;
3271 f_init_raw(testcasename(), info_ind);
3272
3273 /* Establish BSSGP connection to the PCU */
3274 f_bssgp_establish();
3275 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3276
3277 /* Establish an Uplink TBF */
3278 f_ms_establish_ul_tbf(ms);
3279
3280 /* Send one UL block (with TLLI since we are in One-Phase Access
3281 contention resoultion) and make sure it is ACKED fine */
3282 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
3283
3284 /* UL block should be received in SGSN */
3285 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
3286
3287 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3288 tr_UlAckNackGprs(ms.tlli,
3289 tr_AckNackDescription(final_ack := '1'B),
3290 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3291 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3292
3293 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3294
3295 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
3296 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)), sched_fn);
3297
3298 /* Now Keep ignoring the Pkt Ul Ass on PACCH: */
3299 /* Now we go on receiving DL data and not answering RRBP: */
3300 nr := ts_TsTrxBtsNum;
3301 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3302 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3303 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3304 block_nr := nr.blk_nr));
3305 alt {
3306 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3307 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3308 tr_RLCMAC_UL_PACKET_ASS)) -> value data_msg {
3309 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
3310 log("Ignoring RRBP N3105 ", N3105);
3311 N3105 := N3105 + 1;
3312 }
3313 nr := ts_TsTrxBtsNum;
3314 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3315 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3316 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3317 block_nr := nr.blk_nr));
3318 repeat;
3319 }
3320 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
3321 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
3322 */
3323 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3324 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3325 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
3326 if (not T_3195.running) {
3327 T_3195.start;
3328 }
3329 nr := ts_TsTrxBtsNum;
3330 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3331 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3332 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3333 block_nr := nr.blk_nr));
3334 repeat;
3335 }
3336 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3337 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3338 omit)) -> value data_msg {
3339 /* We may already receive idle blocks before our own TTCN3 timer
3340 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
3341 nr := ts_TsTrxBtsNum;
3342 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3343 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3344 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3345 block_nr := nr.blk_nr));
3346 repeat;
3347 }
3348 /* We receive Dummy blocks in between Pkt Ul Ass while PCU waits for us to ack it */
3349 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3350 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3351 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
3352 log("Ignoring Dummy block FN ", data_msg.raw.fn);
3353 nr := ts_TsTrxBtsNum;
3354 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3355 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3356 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3357 block_nr := nr.blk_nr));
3358 repeat;
3359 }
3360 [T_3195.running] T_3195.timeout {
3361 log("T_3195 timeout");
3362 /* Done in alt, wait for pending RTS initiated previously in
3363 * above case before continuing (expect nothing to be sent since there's no active TBF): */
3364 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3365 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3366 omit));
3367 }
3368 [] BTS.receive {
3369 setverdict(fail, "Unexpected BTS message");
3370 f_shutdown(__BFILE__, __LINE__);
3371 }
3372 }
3373
3374 f_shutdown(__BFILE__, __LINE__, final := true);
3375}
3376
Pau Espin Pedrol59aa1092021-11-15 18:53:34 +01003377/* Test scenario where MS wants to request a new UL TBF using a DL (EGPRS) ACK/NACK
3378 * transmitted on ul slot provided by its DL TBF.
3379 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3380function f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(boolean use_egprs) runs on RAW_PCU_Test_CT {
3381 var GprsMS ms;
3382 var octetstring data := f_rnd_octstring(10);
3383 var RlcmacDlBlock dl_block;
3384 var template RlcmacDlBlock rej_tmpl;
3385 var uint32_t dl_fn;
3386 var uint32_t sched_fn;
3387 var template (value) MSRadioAccessCapabilityV_BSSGP racap_tmpl;
3388
3389 if (use_egprs == true) {
3390 racap_tmpl := bssgp_ms_racap_egprs_def;
3391 } else {
3392 racap_tmpl := bssgp_ms_racap_gprs_def;
3393 }
3394
3395 /* Initialize NS/BSSGP side */
3396 f_init_bssgp();
3397 /* Initialize GPRS MS side */
3398 f_init_gprs_ms();
3399 ms := g_ms[0]; /* We only use first MS in this test */
3400 /* Initialize the PCU interface abstraction */
3401 f_init_raw(testcasename());
3402
3403 /* Establish BSSGP connection to the PCU */
3404 f_bssgp_establish();
3405 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3406
3407 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3408 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, racap_tmpl));
3409 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3410
3411 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3412 f_sleep(X2002);
3413 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3414
3415 /* ACK the DL block, asking for new UL TBF by including ChanReqDesc */
3416 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
3417 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, use_egprs, ts_ChannelReqDescription()),
3418 f_dl_block_ack_fn(dl_block, dl_fn));
3419
3420 /* We should receive a Pkt Ul ASS */
3421 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
3422 f_shutdown(__BFILE__, __LINE__, final := true);
3423}
3424testcase TC_ul_tbf_reestablish_with_pkt_dl_ack_nack() runs on RAW_PCU_Test_CT {
3425 f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(false);
3426}
3427testcase TC_ul_tbf_reestablish_with_pkt_dl_ack_nack_egprs() runs on RAW_PCU_Test_CT {
3428 f_TC_ul_tbf_reestablish_with_pkt_dl_ack_nack(true);
3429}
3430
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003431/* Test CS paging over the BTS<->PCU socket.
3432 * 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.
3433 * Paging should be send on the PACCH.
3434 *
3435 * 1. Send a Paging Request over PCU socket.
3436 * 2. Send a Ready-To-Send message over PCU socket
3437 * 3. Expect a Paging Frame
3438 */
3439testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003440 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003441 var MobileIdentityLV mi;
3442 var octetstring mi_enc_lv;
3443 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003444 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003445
3446 /* Initialize NS/BSSGP side */
3447 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003448 /* Initialize GPRS MS side */
3449 f_init_gprs_ms();
3450 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003451
3452 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003453 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003454
3455 /* Establish BSSGP connection to the PCU */
3456 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003457 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003458
3459 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003460 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003461
3462 /* build mobile Identity */
3463 mi := valueof(ts_MI_IMSI_LV(imsi));
3464 mi_enc_lv := enc_MobileIdentityLV(mi);
3465 /* Send paging request */
3466 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
3467 sapi :=PCU_IF_SAPI_PDTCH));
3468
3469 /* Receive it on BTS side towards MS */
3470 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3471
3472 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003473 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3474 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3475 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3476 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003477
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003478 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003479}
3480
3481/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
3482 */
3483private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3484runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003485 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003486 var hexstring imsi := f_gen_imsi(42);
3487 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003488 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003489
3490 /* Initialize NS/BSSGP side */
3491 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003492 /* Initialize GPRS MS side */
3493 f_init_gprs_ms();
3494 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003495
3496 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003497 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003498
3499 /* Establish BSSGP connection to the PCU */
3500 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003501 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003502
3503 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003504 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003505
3506 /* Send paging request with or without TMSI */
3507 if (use_ptmsi) {
3508 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3509 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3510 } else {
3511 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3512 }
3513
3514 /* Receive it on BTS side towards MS */
3515 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3516
3517 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003518 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003519 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003520 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3521 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3522 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003523 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003524 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3525 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3526 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003527 }
3528
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003529 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003530}
3531
3532testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3533 f_tc_paging_cs_from_sgsn(0, true);
3534}
3535
3536testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3537 f_tc_paging_cs_from_sgsn(0);
3538}
3539
3540testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003541 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003542}
3543
3544/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3545 */
3546private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3547runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003548 var integer imsi_suff_tx := 423;
3549 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003550 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003551
3552 /* Initialize NS/BSSGP side */
3553 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003554 /* Initialize GPRS MS side */
3555 f_init_gprs_ms();
3556 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003557
Oliver Smith61b4e732021-07-22 08:14:29 +02003558 f_statsd_reset();
3559
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003560 /* Establish BSSGP connection to the PCU */
3561 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003562 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003563
3564 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3565 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3566 if (use_ptmsi) {
3567 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3568 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3569 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3570 } else {
3571 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3572 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3573 }
3574
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003575 var StatsDExpects expect := {
3576 { name := "TTCN3.pcu.sgsn.0.rx_paging_ps", mtype := "c", min := 1, max := 1 },
3577 /* After the PCU receives the paging request from SGSN,
3578 * and it doesn't have any errors, PCU sends it to the
3579 * BTS to do paging over PCH. */
3580 { name := "TTCN3.bts.0.pch.requests", mtype := "c", min := 1, max := 1 }
3581 };
3582 f_statsd_expect(expect);
Oliver Smithfbd39312021-07-27 15:23:39 +02003583}
3584
3585testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3586 /* Initialize the PCU interface abstraction */
3587 f_init_raw(testcasename());
3588
3589 f_tc_paging_ps_from_sgsn(0, true);
Oliver Smith61b4e732021-07-22 08:14:29 +02003590
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003591 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003592}
3593
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003594testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003595 /* Initialize the PCU interface abstraction */
3596 f_init_raw(testcasename());
3597
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003598 f_tc_paging_ps_from_sgsn(0);
Oliver Smithfbd39312021-07-27 15:23:39 +02003599
3600 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003601}
3602
3603testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003604 /* Initialize the PCU interface abstraction */
3605 f_init_raw(testcasename());
3606
Harald Welte5339b2e2020-10-04 22:52:56 +02003607 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Oliver Smithfbd39312021-07-27 15:23:39 +02003608
3609 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003610}
3611
Oliver Smithe1a77c42021-07-28 13:36:09 +02003612testcase TC_paging_pch_timeout() runs on RAW_PCU_Test_CT {
3613 /* Initialize the PCU interface abstraction */
3614 f_init_raw(testcasename());
3615
3616 /* Set T3113 to 1s to shorten the test duration */
3617 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 1");
3618
3619 /* Reset stats and send paging PS request */
3620 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
3621
3622 /* Verify that counter increases when T3113 times out (MS did not start
3623 * TBF to respond to paging). */
3624 f_sleep(1.2);
3625 var StatsDExpects expect := {
3626 { name := "TTCN3.bts.0.pch.requests.timeout", mtype := "c", min := 1, max := 1 }
3627 };
3628 f_statsd_expect(expect);
3629
3630 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 default");
3631 f_shutdown(__BFILE__, __LINE__, final := true);
3632}
3633
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003634/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3635testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3636 var RlcmacDlBlock dl_block;
3637 var octetstring data := f_rnd_octstring(10);
3638 var uint32_t sched_fn;
3639 var uint32_t dl_fn;
3640 var GprsMS ms;
3641
3642 /* Initialize NS/BSSGP side */
3643 f_init_bssgp();
3644 /* Initialize GPRS MS side */
3645 f_init_gprs_ms();
3646 ms := g_ms[0]; /* We only use first MS in this test */
3647
3648 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003649 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003650
Daniel Willmann535aea62020-09-21 13:27:08 +02003651 f_statsd_reset();
3652
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003653 /* Establish BSSGP connection to the PCU */
3654 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003655 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003656
3657 /* Establish an Uplink TBF */
3658 f_ms_establish_ul_tbf(ms);
3659
3660 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003661 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 +02003662 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3663 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3664 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3665
3666 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003667 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003668
3669 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3670 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3671 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3672
3673 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3674 f_sleep(X2002);
3675 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3676
3677 /* ACK the DL block */
3678 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3679 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3680 f_dl_block_ack_fn(dl_block, dl_fn));
3681
Daniel Willmann535aea62020-09-21 13:27:08 +02003682 var StatsDExpects expect := {
3683 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3684 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3685 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3686 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003687 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003688 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003689 };
3690 f_statsd_expect(expect);
3691
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003692 f_shutdown(__BFILE__, __LINE__, final := true);
3693}
3694
3695/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3696testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3697 var RlcmacDlBlock dl_block;
3698 var octetstring data := f_rnd_octstring(10);
3699 var uint32_t sched_fn;
3700 var uint32_t dl_fn;
3701 var GprsMS ms;
3702
3703 /* Initialize NS/BSSGP side */
3704 f_init_bssgp();
3705 /* Initialize GPRS MS side */
3706 f_init_gprs_ms();
3707 ms := g_ms[0]; /* We only use first MS in this test */
3708
3709 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003710 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003711
3712 /* Establish BSSGP connection to the PCU */
3713 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003714 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003715
3716 /* Establish an Uplink TBF */
3717 f_ms_establish_ul_tbf(ms);
3718
3719 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003720 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 +02003721 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3722 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3723 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3724
3725 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003726 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003727
3728 /* Now SGSN sends some DL data with an invalid IMSI */
3729 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3730
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003731 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003732
3733 /* TODO: make sure no data is sent over PCU -> MS */
3734
3735 f_shutdown(__BFILE__, __LINE__, final := true);
3736}
3737
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003738private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3739 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3740 var octetstring data := f_rnd_octstring(6);
3741 var RlcmacDlBlock dl_block;
3742 var GprsMS ms;
3743 var uint32_t fn;
3744
3745 /* Initialize NS/BSSGP side */
3746 f_init_bssgp();
3747 /* Initialize GPRS MS side */
3748 f_init_gprs_ms();
3749 ms := g_ms[0]; /* We only use first MS in this test */
3750
3751 /* Initialize the PCU interface abstraction */
3752 f_init_raw(testcasename());
3753
3754 /* Establish BSSGP connection to the PCU */
3755 f_bssgp_establish();
3756 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3757
3758 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3759 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3760 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3761
3762 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3763 f_sleep(X2002);
3764
3765 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3766 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3767
3768 if (ischosen(dl_block.data_egprs)) {
3769 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3770 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3771 f_shutdown(__BFILE__, __LINE__);
3772 }
3773 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3774 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3775 f_shutdown(__BFILE__, __LINE__);
3776 }
3777 if (not match(dl_block.data_egprs.blocks[1].payload,
3778 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3779 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3780 f_shutdown(__BFILE__, __LINE__);
3781 }
3782 } else if (lengthof(dl_block.data.blocks) > 1) {
3783 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3784 f_shutdown(__BFILE__, __LINE__);
3785 }
3786
3787 f_shutdown(__BFILE__, __LINE__, final := true);
3788}
3789
3790/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3791 * containing llc data. See OS#4849 */
3792testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3793 f_tc_dl_data_no_llc_ui_dummy(omit);
3794}
3795
3796/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3797 * containing llc data. See OS#4849 */
3798testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003799 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003800}
3801
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003802private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003803 template GsmRrMessage t_imm_ass := ?,
3804 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003805runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003806 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003807 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003808
3809 ra11 := enc_EGPRSPktChRequest2uint(req);
3810 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3811
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003812 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003813 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003814 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003815 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003816 }
3817
3818 setverdict(pass);
3819}
3820
3821testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3822 var template GsmRrMessage imm_ass;
3823 var template IaRestOctets rest;
3824 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003825 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003826
3827 /* Initialize the PCU interface abstraction */
3828 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003829 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003830
3831 var EGPRSPktChRequest req := {
3832 /* NOTE: other fields are set in the loop */
3833 signalling := { tag := '110011'B }
3834 };
3835
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003836 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003837 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3838 req.signalling.random_bits := ext_ra;
3839
3840 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3841 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3842 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3843 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3844
3845 f_TC_egprs_pkt_chan_req(req, imm_ass);
3846 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003847
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003848 var StatsDExpects expect := {
3849 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3850 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3851 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3852 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
3853 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3854 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
3855 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
3856 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3857 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3858 };
3859 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003860
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003861 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003862}
3863
3864testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3865 var template GsmRrMessage imm_ass;
3866 var template IaRestOctets rest;
3867 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003868 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003869
3870 /* Initialize the PCU interface abstraction */
3871 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003872 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003873
3874 var EGPRSPktChRequest req := {
3875 /* NOTE: other fields are set in the loop */
3876 one_phase := { tag := '0'B }
3877 };
3878
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003879 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003880 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3881 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3882 var BIT2 priority := substr(ext_ra, 0, 2);
3883 var BIT3 rand := substr(ext_ra, 2, 3);
3884
3885 req.one_phase.multislot_class := mslot_class;
3886 req.one_phase.priority := priority;
3887 req.one_phase.random_bits := rand;
3888
3889 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3890 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3891 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3892 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3893
3894 f_TC_egprs_pkt_chan_req(req, imm_ass);
3895 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003896
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003897 var StatsDExpects expect := {
3898 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3899 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3900 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := num_req, max := num_req },
3901 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3902 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3903 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := num_req, max := num_req },
3904 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
3905 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3906 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3907 };
3908 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003909
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003910 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003911}
3912
3913testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3914 var template GsmRrMessage imm_ass;
3915 var template IaRestOctets rest;
3916 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003917 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003918
3919 /* Initialize the PCU interface abstraction */
3920 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003921 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003922
3923 var EGPRSPktChRequest req := {
3924 /* NOTE: other fields are set in the loop */
3925 two_phase := { tag := '110000'B }
3926 };
3927
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003928 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003929 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3930 var BIT2 priority := substr(ext_ra, 0, 2);
3931 var BIT3 rand := substr(ext_ra, 2, 3);
3932
3933 req.two_phase.priority := priority;
3934 req.two_phase.random_bits := rand;
3935
3936 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3937 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3938 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3939 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3940
3941 f_TC_egprs_pkt_chan_req(req, imm_ass);
3942 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003943
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01003944 var StatsDExpects expect := {
3945 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3946 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3947 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3948 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
3949 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3950 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
3951 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
3952 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3953 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3954 };
3955 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003956
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003957 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003958}
3959
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003960private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3961 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003962 PCUIF_BurstType bt := BURST_TYPE_1,
3963 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003964runs on RAW_PCU_Test_CT {
3965 var template ReqRefWaitInd tr_ref;
3966 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003967
3968 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3969 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3970 ra := bit2int(ra11), is_11bit := 1,
3971 burst_type := bt, fn := fn,
3972 arfcn := 871));
3973
3974 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003975 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003976
3977 /* Just to have a short-name reference to the actual message */
3978 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3979
3980 /* Make sure that Request Reference list contains at least one entry
3981 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003982 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003983 if (not match(iar.payload, { *, tr_ref, * })) {
3984 setverdict(fail, "Request Reference list does not match");
3985 f_shutdown(__BFILE__, __LINE__);
3986 }
3987
3988 /* Match Feature Indicator (must indicate PS domain) */
3989 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3990 setverdict(fail, "Feature Indicator does not match");
3991 f_shutdown(__BFILE__, __LINE__);
3992 }
3993
3994 /* Match IAR Rest Octets */
3995 if (not match(iar.rest_octets, rest)) {
3996 setverdict(fail, "IAR Rest Octets does not match: ",
3997 iar.rest_octets, " vs expected ", rest);
3998 f_shutdown(__BFILE__, __LINE__);
3999 }
4000
4001 setverdict(pass);
4002}
4003
4004/* Verify the contents of RR Immediate Assignment Reject message and its
4005 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
4006testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
4007 var template IARRestOctets rest;
4008 var BIT5 ext_ra;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004009 const integer num_req := 6;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004010
4011 /* Initialize the PCU interface abstraction */
4012 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004013 f_statsd_reset();
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004014
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004015 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004016 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
4017 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
4018
4019 /* Intentionally incorrect message (see table 11.2.5a.2) */
4020 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
4021 }
4022
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004023 var StatsDExpects expect := {
4024 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4025 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4026 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4027 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4028 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
4029 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
4030 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
4031 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4032 };
4033 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004034
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07004035 f_shutdown(__BFILE__, __LINE__, final := true);
4036}
4037
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004038/* At the moment, the IUT does not support any emergency services. Make sure
4039 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
4040testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
4041 var template IARRestOctets rest;
4042 var BIT5 ext_ra;
4043 var BIT11 ra11;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004044 const integer num_req := 6;
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004045
4046 /* Initialize the PCU interface abstraction */
4047 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004048 f_statsd_reset();
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004049
4050 var EGPRSPktChRequest req := {
4051 /* NOTE: other fields are set in the loop */
4052 emergency := { tag := '110111'B }
4053 };
4054
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004055 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004056 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
4057 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
4058
4059 req.emergency.random_bits := ext_ra;
4060 ra11 := enc_EGPRSPktChRequest2bits(req);
4061
4062 /* Intentionally incorrect message (see table 11.2.5a.2) */
4063 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
4064 }
4065
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004066 var StatsDExpects expect := {
4067 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
4068 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
4069 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
4070 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4071 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
4072 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
4073 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
4074 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4075 };
4076 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004077
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07004078 f_shutdown(__BFILE__, __LINE__, final := true);
4079}
4080
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004081/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
4082testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004083 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004084 var template IARRestOctets rest;
4085 var BIT11 ra11;
4086
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004087 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004088 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07004089
4090 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004091 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
4092 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004093
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004094 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01004095 f_init_raw(testcasename(), info_ind);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004096 f_statsd_reset();
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004097
4098 var EGPRSPktChRequest req := {
4099 one_phase := {
4100 tag := '0'B,
4101 multislot_class := '10101'B,
4102 priority := '01'B,
4103 random_bits := '101'B
4104 }
4105 };
4106
4107 /* We send 7 requests, the IUT gives us all available USFs (0..6).
4108 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
4109 for (var integer i := 0; i < 7; i := i + 1) {
4110 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
4111 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
4112 }
4113
4114 ra11 := enc_EGPRSPktChRequest2bits(req);
4115 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
4116
4117 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02004118 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004119
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01004120 var StatsDExpects expect := {
4121 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 8, max := 8 },
4122 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 8, max := 8 },
4123 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 8, max := 8 },
4124 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4125 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := 0, max := 0 },
4126 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 7, max := 7 },
4127 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 7, max := 7 },
4128 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4129 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4130 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := 1, max := 1 },
4131 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4132 };
4133 f_statsd_expect(expect);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004134
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004135 f_shutdown(__BFILE__, __LINE__, final := true);
4136}
4137
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004138/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004139private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004140return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004141 /* Pick a random MA length in range 2 .. max_ma_len */
4142 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
4143
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004144 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
4145 hsn := f_rnd_int(63),
4146 maio := f_rnd_int(63),
4147 ma := f_rnd_bitstring(ma_len));
4148}
4149
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004150private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
4151 in GsmRrMessage rr_msg)
4152{
4153 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004154 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004155
4156 var template PacketChannelDescription tr_pkt_chan_desc := {
4157 channel_Type_spare := ?,
4158 tn := ?,
4159 tsc := ts.tsc,
4160 presence := '1'B,
4161 zero := omit,
4162 one := {
4163 maio := ts.maio,
4164 hsn := ts.hsn
4165 }
4166 };
4167
4168 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
4169 setverdict(fail, "Packet Channel Description does not match: ",
4170 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
4171 }
4172
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004173 /* Mobile Allocation is expected to be octet-aligned */
4174 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
4175 var template MobileAllocationLV tr_ma := {
4176 len := ma_oct_len, /* in bytes */
4177 ma := substr(ts.ma, 0, ma_oct_len * 8)
4178 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004179
4180 if (not match(ia.mobile_allocation, tr_ma)) {
4181 setverdict(fail, "Mobile Allocation does not match: ",
4182 ia.mobile_allocation, " vs ", tr_ma);
4183 }
4184
4185 setverdict(pass);
4186}
4187
4188/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
4189testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004190 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004191 var GprsMS ms := valueof(t_GprsMS_def);
4192
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004193 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004194 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004195
4196 /* Initialize the PCU interface abstraction */
4197 f_init_raw(testcasename(), info_ind);
4198
4199 /* EGPRS Packet Channel Request (cause=Signalling) */
4200 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
4201
4202 /* Establish an Uplink EGPRS TBF */
4203 f_ms_establish_ul_tbf(ms);
4204
4205 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4206 f_shutdown(__BFILE__, __LINE__, final := true);
4207}
4208
4209/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
4210testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004211 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004212 var GprsMS ms := valueof(t_GprsMS_def);
4213
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004214 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004215 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004216
4217 /* Initialize the PCU interface abstraction */
4218 f_init_raw(testcasename(), info_ind);
4219
4220 /* Establish an Uplink TBF */
4221 f_ms_establish_ul_tbf(ms);
4222
4223 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4224 f_shutdown(__BFILE__, __LINE__, final := true);
4225}
4226
4227/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
4228testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004229 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004230 var GprsMS ms := valueof(t_GprsMS_def);
4231
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004232 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004233 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004234
4235 /* Initialize NS/BSSGP side */
4236 f_init_bssgp();
4237
4238 /* Initialize the PCU interface abstraction */
4239 f_init_raw(testcasename(), info_ind);
4240
4241 /* Establish BSSGP connection to the PCU */
4242 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004243 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004244
4245 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
4246 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
4247 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4248
4249 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
4250 f_shutdown(__BFILE__, __LINE__, final := true);
4251}
4252
4253private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
4254 in FrequencyParameters fp)
4255{
4256 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004257 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004258
4259 /* Table 12.8.1: Frequency Parameters information elements */
4260 var template FrequencyParameters tr_fp := {
4261 tsc := ts.tsc,
4262 presence := '10'B, /* Direct encoding 1 */
4263 arfcn := omit,
4264 indirect := omit,
4265 direct1 := {
4266 maio := ts.maio,
4267 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
4268 mobile_allocation := {
4269 hsn := ts.hsn,
4270 rfl_number_list_present := '0'B,
4271 rfl_number_list := omit,
4272 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004273 ma_length := ts.ma_bit_len,
4274 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004275 }
4276 },
4277 direct2 := omit
4278 };
4279
4280 if (not match(fp, tr_fp)) {
4281 setverdict(fail, "Frequency Parameters IE does not match: ",
4282 fp, " vs ", tr_fp);
4283 }
4284
4285 setverdict(pass);
4286}
4287
4288/* Make sure that Packet Uplink Assignment contains hopping parameters */
4289testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004290 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004291 var GprsMS ms := valueof(t_GprsMS_def);
4292 var uint32_t poll_fn;
4293
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004294 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004295 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004296
4297 /* Initialize the PCU interface abstraction */
4298 f_init_raw(testcasename(), info_ind);
4299
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004300 /* Single block (two phase) packet access */
4301 var uint16_t ra := bit2int(chan_req_sb);
4302 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
4303
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004304 /* Establish an Uplink TBF */
4305 f_ms_establish_ul_tbf(ms);
4306
4307 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004308 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
4309 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004310
4311 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004312 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
4313 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004314
4315 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
4316 var template (omit) FrequencyParameters fp;
4317 if (ua.is_egprs == '1'B) {
4318 fp := ua.egprs.freq_par;
4319 } else {
4320 fp := ua.gprs.freq_par;
4321 }
4322
4323 /* This is an optional IE, so it's worth to check its presence */
4324 if (istemplatekind(fp, "omit")) {
4325 setverdict(fail, "Frequency Parameters IE is not present");
4326 f_shutdown(__BFILE__, __LINE__);
4327 }
4328
4329 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
4330 f_shutdown(__BFILE__, __LINE__, final := true);
4331}
4332
4333/* Make sure that Packet Downlink Assignment contains hopping parameters */
4334testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004335 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004336 var octetstring data := f_rnd_octstring(10);
4337 var GprsMS ms := valueof(t_GprsMS_def);
4338 var RlcmacDlBlock dl_block;
4339 var uint32_t poll_fn;
4340
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004341 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004342 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004343
4344 /* Initialize NS/BSSGP side */
4345 f_init_bssgp();
4346
4347 /* Initialize the PCU interface abstraction */
4348 f_init_raw(testcasename(), info_ind);
4349
4350 /* Establish BSSGP connection to the PCU */
4351 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004352 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004353
4354 /* Establish an Uplink TBF */
4355 f_ms_establish_ul_tbf(ms);
4356
4357 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004358 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 +07004359
4360 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4361 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
4362 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4363
4364 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
4365 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4366
4367 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004368 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4369 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004370
4371 /* This is an optional IE, so it's worth to check its presence */
4372 if (not ispresent(da.freq_par)) {
4373 setverdict(fail, "Frequency Parameters IE is not present");
4374 f_shutdown(__BFILE__, __LINE__);
4375 }
4376
4377 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
4378 f_shutdown(__BFILE__, __LINE__, final := true);
4379}
4380
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004381/* Check if the IUT handles subsequent INFO.ind messages */
4382testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004383 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004384 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004385
4386 /* Initialize the PCU interface abstraction */
4387 f_init_raw(testcasename(), info_ind);
4388
4389 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
4390 for (var integer i := 0; i < 16; i := i + 1) {
4391 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004392 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004393 }
4394
4395 f_shutdown(__BFILE__, __LINE__, final := true);
4396}
4397
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004398/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
4399testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
4400 var PCUIF_info_ind info_ind;
4401 var integer i;
4402 const integer num_ms := 8;
4403
4404 /* Initialize NS/BSSGP side */
4405 f_init_bssgp();
4406 /* Initialize GPRS MS side */
4407 f_init_gprs_ms(num_ms);
4408
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01004409 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004410 /* Only the 3 first TRX are enabled. The enabled ones all have same
4411 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004412 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
4413 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
4414 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
4415 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004416
4417 /* Initialize the PCU interface abstraction */
4418 f_init_raw(testcasename(), info_ind);
4419
4420 /* Establish BSSGP connection to the PCU */
4421 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004422 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004423
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004424 /* Establish an Uplink TBF for each GprsMS instance */
4425 f_multi_ms_establish_tbf(do_activate := false);
4426
4427 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004428 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004429 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01004430 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004431 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004432 f_shutdown(__BFILE__, __LINE__);
4433 }
4434 }
4435
4436 f_shutdown(__BFILE__, __LINE__, final := true);
4437}
4438
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004439/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
4440 * downgraded to CS1-4 so that GPRS can read the USF).
4441 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
4442 */
4443testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
4444 var PCUIF_info_ind info_ind;
4445 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
4446 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004447 var uint32_t sched_fn, dl_fn, ack_fn;
4448 var octetstring data := f_rnd_octstring(10);
4449 var RlcmacDlBlock dl_block;
4450 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004451 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004452 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
4453 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
4454
4455 /* Initialize NS/BSSGP side */
4456 f_init_bssgp();
4457 /* Initialize GPRS MS side */
4458 f_init_gprs_ms(num_ms);
4459
4460 info_ind := valueof(ts_PCUIF_INFO_default);
4461 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004462 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
4463 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004464
4465 /* Initialize the PCU interface abstraction */
4466 f_init_raw(testcasename(), info_ind);
4467
4468 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
4469 g_mcs_initial_dl := 5;
4470 g_mcs_max_dl := 5;
4471 f_pcuvty_set_allowed_cs_mcs();
4472
4473 /* Establish BSSGP connection to the PCU */
4474 f_bssgp_establish();
4475 f_multi_ms_bssgp_register();
4476
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004477 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004478 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 +01004479 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
4480 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
4481 f_shutdown(__BFILE__, __LINE__);
4482 }
4483 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4484 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4485
4486 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004487 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 +01004488 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
4489 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
4490 f_shutdown(__BFILE__, __LINE__);
4491 }
4492 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4493 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4494
4495 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
4496 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4497 f_sleep(0.1);
4498 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4499 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4500 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
4501 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4502 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
4503 /* ACK the DL block */
4504 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
4505 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
4506 f_dl_block_ack_fn(dl_block, dl_fn));
4507
4508 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
4509 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4510 f_sleep(0.1);
4511 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4512 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4513 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
4514 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4515 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
4516 /* ACK the DL block */
4517 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
4518 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
4519 f_dl_block_ack_fn(dl_block, dl_fn));
4520
4521 data := f_rnd_octstring(1400);
4522 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4523 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4524
4525 for (var integer i := 0; i < 800; i := i + 1) {
4526 f_rx_rlcmac_dl_block(dl_block, dl_fn);
4527
4528 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
4529 /* No more data to receive, done */
4530 break;
4531 }
4532
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004533 usf_ms := -1;
4534
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004535 if (ischosen(dl_block.ctrl)) {
4536 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
4537 f_shutdown(__BFILE__, __LINE__);
4538 } else if (ischosen(dl_block.data_egprs)) {
4539 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
4540 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
4541 f_shutdown(__BFILE__, __LINE__);
4542 }
4543 tgt_ms := 1;
4544 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
4545 if (dl_block.data_egprs.mcs > MCS_4) {
4546 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
4547 f_shutdown(__BFILE__, __LINE__);
4548 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004549 usf_ms := 0;
4550 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004551 } else {
4552 if (dl_block.data_egprs.mcs <= MCS_4) {
4553 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
4554 f_shutdown(__BFILE__, __LINE__);
4555 }
4556 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004557 usf_ms := 1;
4558 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004559 }
4560 }
4561 } else {
4562 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
4563 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
4564 f_shutdown(__BFILE__, __LINE__);
4565 }
4566 tgt_ms := 0;
4567 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 +01004568 usf_ms := 0;
4569 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004570 } 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 +01004571 usf_ms := 1;
4572 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004573 }
4574 }
4575
4576 /* Keep Ack/Nack description updated */
4577 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
4578
4579 /* TDMA frame number on which we are supposed to send the ACK */
4580 if (f_dl_block_rrbp_valid(dl_block)) {
4581 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
4582 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);
4583 if (tx_data_remain != 0) {
4584 /* Submit more data from time to time to keep the TBF ongoing */
4585 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4586 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4587 tx_data_remain := tx_data_remain - 1;
4588 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004589 } else if (tx_data_remain != 0) {
4590 /* keep sending UL blocks when requested by USF to avoid
4591 * UL TBF timeout and hence stop receival of USFs */
4592 if (usf_ms != -1) {
4593 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
4594 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004595 }
4596 }
4597
4598 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 +01004599 /* He we check that DL blocks scheduled at GPRS can still request UL
4600 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
4601 * condition also ensures the downgrade to <=MCS4 condition is tested
4602 * above */
4603 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
4604 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004605 f_shutdown(__BFILE__, __LINE__);
4606 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004607 /* Here check for some level of fairness between them (at least ~40%): */
4608 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
4609 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
4610 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
4611 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
4612 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4613 f_shutdown(__BFILE__, __LINE__);
4614 }
4615 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
4616 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4617 f_shutdown(__BFILE__, __LINE__);
4618 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004619
4620 f_shutdown(__BFILE__, __LINE__, final := true);
4621}
4622
4623
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004624private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4625 boolean exp_imsi, boolean exp_tmsi)
4626runs on RAW_PCU_Test_CT {
4627 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4628 var integer pending := lengthof(g_ms);
4629 var RlcmacDlBlock dl_block;
4630 var boolean f1, f2;
4631
4632 while (pending > 0) {
4633 var uint32_t poll_fn;
4634
4635 /* Obtain a Downlink block and make sure it is a paging request */
4636 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4637 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4638 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4639 break;
4640 }
4641
4642 /* This should not happen in general, but who knows... */
4643 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4644 if (not ispresent(req.repeated_pageinfo)) {
4645 setverdict(fail, "Repeated Page Info IE is absent?!?");
4646 break;
4647 }
4648
4649 /* A single message may contain several MIs depending on their type */
4650 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4651 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4652 ps_domain := false);
4653 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4654 ps_domain := false);
4655 if (not f1 and not f2)
4656 { continue; }
4657
4658 /* Detect duplicate MIs */
4659 if (mask[i] == '1'B) {
4660 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4661 continue;
4662 }
4663
4664 mask[i] := '1'B;
4665 }
4666
4667 pending := pending - lengthof(req.repeated_pageinfo);
4668 }
4669
4670 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4671 if (mask[i] != '1'B) {
4672 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4673 log("===== mask := ", mask);
4674 }
4675 }
4676
4677 /* All messages must have been received by now, expect a dummy block */
4678 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4679}
4680
4681private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4682runs on RAW_PCU_Test_CT {
4683 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4684 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4685
4686 /* Initialize NS/BSSGP side */
4687 f_init_bssgp();
4688
4689 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004690 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004691
4692 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4693 f_init_gprs_ms(7 * 8);
4694
4695 /* Initialize the PCU interface abstraction */
4696 f_init_raw(testcasename(), info_ind);
4697
4698 /* Establish BSSGP connection to the PCU */
4699 f_bssgp_establish();
4700 f_multi_ms_bssgp_register();
4701
4702 /* Establish an Uplink TBF for each GprsMS instance */
4703 f_multi_ms_establish_tbf(do_activate := true);
4704}
4705
4706testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4707 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4708
4709 /* Common part: send INFO.ind, establish TBFs... */
4710 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4711
4712 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4713 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4714 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4715 }
4716
4717 /* FIXME: work around a race condition between PCUIF and BSSGP */
4718 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4719
4720 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4721 * The IUT is expected to page on all PDCH slots of all transceivers. */
4722 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4723 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4724 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4725 }
4726
4727 f_shutdown(__BFILE__, __LINE__, final := true);
4728}
4729
4730testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4731 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4732
4733 /* Common part: send INFO.ind, establish TBFs... */
4734 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4735
4736 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4737 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4738 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4739 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4740 }
4741
4742 /* FIXME: work around a race condition between PCUIF and BSSGP */
4743 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4744
4745 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4746 * The IUT is expected to page on all PDCH slots of all transceivers. */
4747 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4748 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4749 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4750 }
4751
4752 f_shutdown(__BFILE__, __LINE__, final := true);
4753}
4754
4755testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4756 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4757
4758 /* Common part: send INFO.ind, establish TBFs... */
4759 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4760
4761 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4762 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4763 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4764 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4765 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4766 } else {
4767 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4768 }
4769 }
4770
4771 /* FIXME: work around a race condition between PCUIF and BSSGP */
4772 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4773
4774 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4775 * The IUT is expected to page on all PDCH slots of all transceivers. */
4776 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4777 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4778 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4779 }
4780
4781 f_shutdown(__BFILE__, __LINE__, final := true);
4782}
4783
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004784private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004785runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4786 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004787 var integer i := 0;
4788 while (true) {
4789 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4790 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4791 break;
4792 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004793 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004794 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4795 f_shutdown(__BFILE__, __LINE__);
4796 }
4797 i := i + 1;
4798 }
4799 return dl_block;
4800}
4801
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004802private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4803runs on RAW_PCU_Test_CT {
4804 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),
4805 info_ind.lac),
4806 info_ind.rac),
4807 info_ind.cell_id));
4808 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4809 423),
4810 2),
4811 5));
4812 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4813 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4814 var template (value) RAN_Information_RIM_Container res_cont :=
4815 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4816 ts_RIM_Sequence_Number(2),
4817 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4818 ts_RIM_Protocol_Version_Number(1),
4819 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4820 omit);
4821 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4822 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4823 res_cont));
4824}
4825
4826altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4827runs on RAW_PCU_Test_CT {
4828 /* RIM procedure: */
4829 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),
4830 info_ind.lac),
4831 info_ind.rac),
4832 info_ind.cell_id));
4833 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4834 423),
4835 2),
4836 5));
4837 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4838 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4839 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4840 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4841 tr_RAN_Information_Request_RIM_Container)) {
4842 if (do_answer) {
4843 f_outbound_nacc_rim_tx_resp(info_ind);
4844 }
4845 if (do_repeat) {
4846 repeat;
4847 }
4848 }
4849}
4850
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004851private function f_handle_nacc_rac_ci_query(PCUIF_info_ind info_ind, GsmArfcn req_arfcn, uint6_t req_bsic,
4852 boolean answer := true, boolean use_old_ctrl_iface := false)
4853runs on RAW_PCU_Test_CT {
4854 if (use_old_ctrl_iface == true) {
4855 f_ipa_ctrl_wait_link_up();
4856 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4857 int2str(info_ind.lac) & "." &
4858 int2str(info_ind.cell_id) & "." &
4859 int2str(req_arfcn) & "." &
4860 int2str(req_bsic);
4861 if (answer) {
4862 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4863 } else {
4864 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4865 }
4866 } else {
4867 var PCUIF_Message pcu_msg;
4868 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
4869 if (answer) {
4870 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
4871 }
4872 }
4873}
4874
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004875/* Start NACC from MS side */
4876private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004877 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004878 boolean skip_final_ctrl_ack := false,
4879 boolean use_old_ctrl_iface := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004880runs on RAW_PCU_Test_CT {
4881 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4882 var RlcmacDlBlock dl_block;
4883 var uint32_t sched_fn;
4884 var GsmArfcn req_arfcn := 862;
4885 var uint6_t req_bsic := 43;
4886
4887 /* Start NACC from MS side */
4888 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4889 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4890
4891 if (exp_rac_ci_query == true) {
4892 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004893 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 +01004894 }
4895
4896 if (exp_si_query == true) {
4897 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004898 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004899 }
4900
4901 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004902 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004903
4904 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4905 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4906 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4907 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4908 f_shutdown(__BFILE__, __LINE__);
4909 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004910 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004911 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004912 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4913 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4914 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004915}
4916
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004917/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4918testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004919 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004920 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004921 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004922 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004923
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004924 if (use_old_ctrl_iface) {
4925 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4926 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4927 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004928
4929 /* Initialize NS/BSSGP side */
4930 f_init_bssgp();
4931 /* Initialize GPRS MS side */
4932 f_init_gprs_ms();
4933 ms := g_ms[0]; /* We only use first MS in this test */
4934
4935 /* Initialize the PCU interface abstraction */
4936 f_init_raw(testcasename(), info_ind);
4937
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004938 /* Make sure we are not affected by full cache from previous tests */
4939 f_pcuvty_flush_neigh_caches();
4940
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004941 /* Establish BSSGP connection to the PCU */
4942 f_bssgp_establish();
4943 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4944
4945 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004946 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 +01004947 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4948 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4949
4950 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004951 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004952
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004953 f_shutdown(__BFILE__, __LINE__, final := true);
4954}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004955
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004956/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4957testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4958 var PollFnCtx pollctx;
4959 var GprsMS ms;
4960 var RlcmacDlBlock dl_block;
4961 var uint32_t sched_fn;
4962 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004963 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004964
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004965 if (use_old_ctrl_iface) {
4966 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4967 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4968 }
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004969
4970 /* Initialize NS/BSSGP side */
4971 f_init_bssgp();
4972 /* Initialize GPRS MS side */
4973 f_init_gprs_ms();
4974 ms := g_ms[0]; /* We only use first MS in this test */
4975
4976 /* Initialize the PCU interface abstraction */
4977 f_init_raw(testcasename(), info_ind);
4978
4979 /* Make sure we are not affected by full cache from previous tests */
4980 f_pcuvty_flush_neigh_caches();
4981
4982 /* Establish BSSGP connection to the PCU */
4983 f_bssgp_establish();
4984 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4985
4986 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004987 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 +01004988 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4989 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4990
4991 /* Start NACC from MS side, avoid sending final CTRL ACK */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004992 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 +01004993
4994 /* Wait until we receive something non-dummy */
4995 dl_block := f_skip_dummy(0, sched_fn);
4996 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4997 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4998 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4999 }
5000 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5001 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5002 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5003 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5004 }
5005
5006 f_shutdown(__BFILE__, __LINE__, final := true);
5007}
5008
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005009/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
5010testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
5011 var PollFnCtx pollctx;
5012 var GprsMS ms;
5013 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005014 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005015 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005016
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005017 if (use_old_ctrl_iface) {
5018 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5019 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5020 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005021
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005022 /* Initialize NS/BSSGP side */
5023 f_init_bssgp();
5024 /* Initialize GPRS MS side */
5025 f_init_gprs_ms();
5026 ms := g_ms[0]; /* We only use first MS in this test */
5027
5028 /* Initialize the PCU interface abstraction */
5029 f_init_raw(testcasename(), info_ind);
5030
5031 /* Make sure we are not affected by full cache from previous tests */
5032 f_pcuvty_flush_neigh_caches();
5033 /* Set timeout values for caches so that entries will be in cache during second try */
5034 f_pcuvty_set_neigh_caches(10, 10);
5035
5036 /* Establish BSSGP connection to the PCU */
5037 f_bssgp_establish();
5038 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5039
5040 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005041 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 +01005042 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5043 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5044
5045 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005046 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005047
5048 /* 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 +02005049 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 +01005050
5051 f_shutdown(__BFILE__, __LINE__, final := true);
5052}
5053
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005054/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
5055 * TS 44.060 sec 8.8) twice, the second time after caches timed out
5056 */
5057testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
5058 var PollFnCtx pollctx;
5059 var GprsMS ms;
5060 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005061 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005062 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005063
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005064 if (use_old_ctrl_iface) {
5065 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5066 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5067 }
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005068
5069 /* Initialize NS/BSSGP side */
5070 f_init_bssgp();
5071 /* Initialize GPRS MS side */
5072 f_init_gprs_ms();
5073 ms := g_ms[0]; /* We only use first MS in this test */
5074
5075 /* Initialize the PCU interface abstraction */
5076 f_init_raw(testcasename(), info_ind);
5077
5078 /* Make sure we are not affected by full cache from previous tests */
5079 f_pcuvty_flush_neigh_caches();
5080 /* Set timeout values for caches so that entries will be erased before the second try */
5081 f_pcuvty_set_neigh_caches(1, 1);
5082
5083 /* Establish BSSGP connection to the PCU */
5084 f_bssgp_establish();
5085 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5086
5087 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005088 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 +01005089 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5090 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5091
5092 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005093 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005094
5095 /* CTRL client should have disconnected from us */
5096 f_ipa_ctrl_wait_link_down();
5097 /* wait for cache entries to time out */
5098 f_sleep(2.0);
5099 /* 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 +02005100 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005101
5102 f_shutdown(__BFILE__, __LINE__, final := true);
5103}
5104
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005105/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005106testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
5107 var RlcmacDlBlock dl_block;
5108 var PollFnCtx pollctx;
5109 var uint32_t sched_fn;
5110 var GprsMS ms;
5111 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5112 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005113 var GsmArfcn req_arfcn := 862;
5114 var uint6_t req_bsic := 43;
5115
5116 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
5117 * resolution CTRL port, to trigger Conn Refused by socket:
5118 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5119 */
5120
5121 /* Initialize NS/BSSGP side */
5122 f_init_bssgp();
5123 /* Initialize GPRS MS side */
5124 f_init_gprs_ms();
5125 ms := g_ms[0]; /* We only use first MS in this test */
5126
5127 /* Initialize the PCU interface abstraction */
5128 f_init_raw(testcasename(), info_ind);
5129
5130 /* Make sure we are not affected by full cache from previous tests */
5131 f_pcuvty_flush_neigh_caches();
5132
5133 /* Establish BSSGP connection to the PCU */
5134 f_bssgp_establish();
5135 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5136
5137 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005138 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 +01005139 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5140 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5141
5142 /* Start NACC from MS side */
5143 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5144 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5145
5146 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005147 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005148 /* Make sure it is a Pkt Cell Chg Continue */
5149 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5150 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5151 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005152 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5153 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5154 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5155 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5156 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005157
5158 f_shutdown(__BFILE__, __LINE__, final := true);
5159}
5160
5161/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005162testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
5163 var RlcmacDlBlock dl_block;
5164 var PollFnCtx pollctx;
5165 var uint32_t sched_fn;
5166 var GprsMS ms;
5167 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5168 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005169 var GsmArfcn req_arfcn := 862;
5170 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005171 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005172
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005173 if (use_old_ctrl_iface) {
5174 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5175 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5176 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005177
5178 /* Initialize NS/BSSGP side */
5179 f_init_bssgp();
5180 /* Initialize GPRS MS side */
5181 f_init_gprs_ms();
5182 ms := g_ms[0]; /* We only use first MS in this test */
5183
5184 /* Initialize the PCU interface abstraction */
5185 f_init_raw(testcasename(), info_ind);
5186
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005187 /* Make sure we are not affected by full cache from previous tests */
5188 f_pcuvty_flush_neigh_caches();
5189
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005190 /* Establish BSSGP connection to the PCU */
5191 f_bssgp_establish();
5192 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5193
5194 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005195 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 +01005196 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5197 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5198
5199 /* Start NACC from MS side */
5200 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5201 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5202
5203 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005204 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005205 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 +01005206
5207 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005208 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005209 /* Make sure it is a Pkt Cell Chg Continue */
5210 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5211 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5212 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005213 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5214 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5215 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5216 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5217 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005218
5219 f_shutdown(__BFILE__, __LINE__, final := true);
5220}
5221
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005222/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
5223testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
5224 var RlcmacDlBlock dl_block;
5225 var PollFnCtx pollctx;
5226 var uint32_t sched_fn;
5227 var GprsMS ms;
5228 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5229 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005230 var GsmArfcn req_arfcn := 862;
5231 var uint6_t req_bsic := 43;
5232
5233 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5234 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5235
5236 /* Initialize NS/BSSGP side */
5237 f_init_bssgp();
5238 /* Initialize GPRS MS side */
5239 f_init_gprs_ms();
5240 ms := g_ms[0]; /* We only use first MS in this test */
5241
5242 /* Initialize the PCU interface abstraction */
5243 f_init_raw(testcasename(), info_ind);
5244
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005245 /* Make sure we are not affected by full cache from previous tests */
5246 f_pcuvty_flush_neigh_caches();
5247
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005248 /* Establish BSSGP connection to the PCU */
5249 f_bssgp_establish();
5250 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5251
5252 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005253 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 +01005254 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5255 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5256
5257 /* Start NACC from MS side */
5258 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5259 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5260
5261 /* osmo-pcu should now ask for resolution: */
5262 f_ipa_ctrl_wait_link_up();
5263 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5264 int2str(info_ind.lac) & "." &
5265 int2str(info_ind.cell_id) & "." &
5266 int2str(req_arfcn) & "." &
5267 int2str(req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005268 /* we receive RAC+CI resolution request and we send incorrectly formated response */
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005269 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
5270
5271 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005272 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005273 /* Make sure it is a Pkt Cell Chg Continue */
5274 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5275 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5276 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005277 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5278 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5279 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5280 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5281 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005282
5283 f_shutdown(__BFILE__, __LINE__, final := true);
5284}
5285
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005286/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
5287testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
5288 var RlcmacDlBlock dl_block;
5289 var PollFnCtx pollctx;
5290 var uint32_t sched_fn;
5291 var GprsMS ms;
5292 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5293 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005294 var GsmArfcn req_arfcn := 862;
5295 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005296 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005297 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 */
5298 info_ind.lac),
5299 info_ind.rac),
5300 info_ind.cell_id));
5301 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
5302 423),
5303 2),
5304 5));
5305 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
5306 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
5307
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005308 if (use_old_ctrl_iface) {
5309 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5310 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5311 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005312
5313 /* Initialize NS/BSSGP side */
5314 f_init_bssgp();
5315 /* Initialize GPRS MS side */
5316 f_init_gprs_ms();
5317 ms := g_ms[0]; /* We only use first MS in this test */
5318
5319 /* Initialize the PCU interface abstraction */
5320 f_init_raw(testcasename(), info_ind);
5321
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005322 /* Make sure we are not affected by full cache from previous tests */
5323 f_pcuvty_flush_neigh_caches();
5324
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005325 /* Establish BSSGP connection to the PCU */
5326 f_bssgp_establish();
5327 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5328
5329 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005330 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 +01005331 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5332 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5333
5334 /* Start NACC from MS side */
5335 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5336 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5337
5338 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005339 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 +01005340
5341 /* RIM procedure: */
5342 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5343 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5344 tr_RAN_Information_Request_RIM_Container));
5345 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
5346
5347 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005348 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005349 /* Make sure it is a Pkt Cell Chg Continue */
5350 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5351 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5352 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005353 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5354 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5355 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5356 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5357 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005358
5359 f_shutdown(__BFILE__, __LINE__, final := true);
5360}
5361
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005362/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
5363testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
5364 var PollFnCtx pollctx;
5365 var GprsMS ms;
5366 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5367 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5368 var RlcmacDlBlock dl_block;
5369 var uint32_t sched_fn;
5370 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005371 var charstring ctrl_var;
5372 var PCUIF_Message pcu_msg;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005373 var GsmArfcn req_arfcn := 862;
5374 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005375 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005376
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005377 if (use_old_ctrl_iface) {
5378 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5379 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5380 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005381
5382 /* Initialize NS/BSSGP side */
5383 f_init_bssgp();
5384 /* Initialize GPRS MS side */
5385 f_init_gprs_ms();
5386 ms := g_ms[0]; /* We only use first MS in this test */
5387
5388 /* Initialize the PCU interface abstraction */
5389 f_init_raw(testcasename(), info_ind);
5390
5391 /* Make sure we are not affected by full cache from previous tests */
5392 f_pcuvty_flush_neigh_caches();
5393
5394 /* Establish BSSGP connection to the PCU */
5395 f_bssgp_establish();
5396 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5397
5398 /* Send PACKET RESOURCE REQUEST */
5399 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5400 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5401 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5402
5403 /* Start NACC from MS side */
5404 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5405 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5406
5407 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005408 if (use_old_ctrl_iface) {
5409 f_ipa_ctrl_wait_link_up();
5410 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5411 int2str(info_ind.lac) & "." &
5412 int2str(info_ind.cell_id) & "." &
5413 int2str(req_arfcn) & "." &
5414 int2str(req_bsic);
5415 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5416 } else {
5417 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5418 }
5419
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005420 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
5421 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5422 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005423
5424 if (use_old_ctrl_iface) {
5425 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5426 } else {
5427 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5428 }
5429
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005430 timer T := 2.0;
5431 T.start;
5432 alt {
5433 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005434 [use_old_ctrl_iface] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005435 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
5436 f_shutdown(__BFILE__, __LINE__);
5437 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005438 [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 {
5439 setverdict(fail, "Received unexpected PCUIF resolution after duplicate Pkt Cell Change Notification:", pcu_msg);
5440 f_shutdown(__BFILE__, __LINE__);
5441 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005442 [] T.timeout {
5443 setverdict(pass);
5444 }
5445 }
5446
5447 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005448 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005449
5450 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5451 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5452 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5453 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5454 f_shutdown(__BFILE__, __LINE__);
5455 }
5456 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5457 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5458 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5459 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5460 }
5461
5462 f_shutdown(__BFILE__, __LINE__, final := true);
5463}
5464
5465/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
5466testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
5467 var PollFnCtx pollctx;
5468 var GprsMS ms;
5469 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5470 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5471 var RlcmacDlBlock dl_block;
5472 var uint32_t sched_fn;
5473 var CtrlMessage rx_ctrl;
5474 var GsmArfcn req_arfcn := 862;
5475 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005476 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005477
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005478 if (use_old_ctrl_iface) {
5479 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5480 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5481 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005482
5483 /* Initialize NS/BSSGP side */
5484 f_init_bssgp();
5485 /* Initialize GPRS MS side */
5486 f_init_gprs_ms();
5487 ms := g_ms[0]; /* We only use first MS in this test */
5488
5489 /* Initialize the PCU interface abstraction */
5490 f_init_raw(testcasename(), info_ind);
5491
5492 /* Make sure we are not affected by full cache from previous tests */
5493 f_pcuvty_flush_neigh_caches();
5494
5495 /* Establish BSSGP connection to the PCU */
5496 f_bssgp_establish();
5497 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5498
5499 /* Send PACKET RESOURCE REQUEST */
5500 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5501 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5502 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5503
5504 /* Start NACC from MS side */
5505 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5506 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5507
5508 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005509 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 +01005510 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5511 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
5512 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5513 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5514 f_outbound_nacc_rim_tx_resp(info_ind);
5515 timer T := 1.0;
5516 T.start;
5517 alt {
5518 [] RIM.receive {
5519 setverdict(fail, "Received unexpected RIM message");
5520 f_shutdown(__BFILE__, __LINE__);
5521 }
5522 [] T.timeout {
5523 setverdict(pass);
5524 }
5525 }
5526
5527 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005528 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005529
5530 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5531 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5532 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5533 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5534 f_shutdown(__BFILE__, __LINE__);
5535 }
5536 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5537 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5538 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5539 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5540 }
5541
5542 f_shutdown(__BFILE__, __LINE__, final := true);
5543}
5544
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005545/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
5546testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
5547 var PollFnCtx pollctx;
5548 var GprsMS ms;
5549 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5550 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5551 var RlcmacDlBlock dl_block;
5552 var uint32_t sched_fn;
5553 var CtrlMessage rx_ctrl;
5554 var GsmArfcn req_arfcn := 862;
5555 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005556 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005557
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005558 if (use_old_ctrl_iface) {
5559 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5560 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5561 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005562
5563 /* Initialize NS/BSSGP side */
5564 f_init_bssgp();
5565 /* Initialize GPRS MS side */
5566 f_init_gprs_ms();
5567 ms := g_ms[0]; /* We only use first MS in this test */
5568
5569 /* Initialize the PCU interface abstraction */
5570 f_init_raw(testcasename(), info_ind);
5571
5572 /* Make sure we are not affected by full cache from previous tests */
5573 f_pcuvty_flush_neigh_caches();
5574
5575 /* Establish BSSGP connection to the PCU */
5576 f_bssgp_establish();
5577 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5578
5579 /* Send PACKET RESOURCE REQUEST */
5580 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5581 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5582 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5583
5584 /* Start NACC from MS side */
5585 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5586 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5587
5588 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005589 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 +01005590 /* RIM procedure: */
5591 as_outbound_nacc_rim_resolve(info_ind);
5592
5593 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
5594 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5595 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5596
5597 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
5598 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5599
5600 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5601 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5602 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5603 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5604 f_shutdown(__BFILE__, __LINE__);
5605 }
5606 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5607 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5608 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5609 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5610 }
5611}
5612
5613/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
5614testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
5615 var PollFnCtx pollctx;
5616 var GprsMS ms;
5617 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5618 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5619 var RlcmacDlBlock dl_block;
5620 var uint32_t sched_fn;
5621 var CtrlMessage rx_ctrl;
5622 var GsmArfcn req_arfcn := 862;
5623 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005624 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005625
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005626 if (use_old_ctrl_iface) {
5627 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5628 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5629 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005630
5631 /* Initialize NS/BSSGP side */
5632 f_init_bssgp();
5633 /* Initialize GPRS MS side */
5634 f_init_gprs_ms();
5635 ms := g_ms[0]; /* We only use first MS in this test */
5636
5637 /* Initialize the PCU interface abstraction */
5638 f_init_raw(testcasename(), info_ind);
5639
5640 /* Make sure we are not affected by full cache from previous tests */
5641 f_pcuvty_flush_neigh_caches();
5642
5643 /* Establish BSSGP connection to the PCU */
5644 f_bssgp_establish();
5645 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5646
5647 /* Send PACKET RESOURCE REQUEST */
5648 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5649 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5650 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5651
5652 /* Start NACC from MS side */
5653 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5654 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5655
5656 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005657 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 +01005658 /* RIM procedure: */
5659 as_outbound_nacc_rim_resolve(info_ind);
5660
5661 /* Announce SI back to MS, continue NACC procedure */
5662 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5663
5664 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5665 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5666
5667 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5668 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5669 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5670 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5671 f_shutdown(__BFILE__, __LINE__);
5672 }
5673 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5674 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5675 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5676 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5677 }
5678}
5679
5680/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5681testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
5682 var PollFnCtx pollctx;
5683 var GprsMS ms;
5684 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5685 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5686 var RlcmacDlBlock dl_block;
5687 var uint32_t sched_fn;
5688 var CtrlMessage rx_ctrl;
5689 var GsmArfcn req_arfcn := 862;
5690 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005691 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005692
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005693 if (use_old_ctrl_iface) {
5694 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5695 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5696 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005697
5698 /* Initialize NS/BSSGP side */
5699 f_init_bssgp();
5700 /* Initialize GPRS MS side */
5701 f_init_gprs_ms();
5702 ms := g_ms[0]; /* We only use first MS in this test */
5703
5704 /* Initialize the PCU interface abstraction */
5705 f_init_raw(testcasename(), info_ind);
5706
5707 /* Make sure we are not affected by full cache from previous tests */
5708 f_pcuvty_flush_neigh_caches();
5709
5710 /* Establish BSSGP connection to the PCU */
5711 f_bssgp_establish();
5712 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5713
5714 /* Send PACKET RESOURCE REQUEST */
5715 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5716 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5717 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5718
5719 /* Start NACC from MS side */
5720 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5721 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5722
5723 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005724 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 +01005725 /* RIM procedure: */
5726 as_outbound_nacc_rim_resolve(info_ind);
5727
5728 /* Announce SI back to MS, continue NACC procedure */
5729 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5730
5731 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5732 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5733 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5734 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5735 f_shutdown(__BFILE__, __LINE__);
5736 }
5737 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5738 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5739
5740 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5741 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5742 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5743 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5744 }
5745}
5746
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005747/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5748 * while waiting for CTRL resolution */
5749testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5750 var PollFnCtx pollctx;
5751 var GprsMS ms;
5752 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5753 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5754 var RlcmacDlBlock dl_block;
5755 var uint32_t sched_fn;
5756 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005757 var charstring ctrl_var;
5758 var PCUIF_Message pcu_msg;
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005759 var GsmArfcn req_arfcn := 862;
5760 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005761 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005762
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005763 if (use_old_ctrl_iface) {
5764 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5765 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5766 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005767
5768 /* Initialize NS/BSSGP side */
5769 f_init_bssgp();
5770 /* Initialize GPRS MS side */
5771 f_init_gprs_ms();
5772 ms := g_ms[0]; /* We only use first MS in this test */
5773
5774 /* Initialize the PCU interface abstraction */
5775 f_init_raw(testcasename(), info_ind);
5776
5777 /* Make sure we are not affected by full cache from previous tests */
5778 f_pcuvty_flush_neigh_caches();
5779
5780 /* Establish BSSGP connection to the PCU */
5781 f_bssgp_establish();
5782 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5783
5784 /* Send PACKET RESOURCE REQUEST */
5785 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5786 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5787 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5788
5789 /* Start NACC from MS side */
5790 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5791 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5792
5793 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005794 if (use_old_ctrl_iface) {
5795 f_ipa_ctrl_wait_link_up();
5796 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5797 int2str(info_ind.lac) & "." &
5798 int2str(info_ind.cell_id) & "." &
5799 int2str(req_arfcn) & "." &
5800 int2str(req_bsic);
5801 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5802 } else {
5803 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5804 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005805 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5806 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5807 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5808 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005809 if (use_old_ctrl_iface) {
5810 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5811 } else {
5812 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5813 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005814 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005815 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 +01005816
5817 /* And finally everything continues as usual with RIN procedure */
5818 as_outbound_nacc_rim_resolve(info_ind);
5819
5820 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005821 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005822
5823 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5824 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5825 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5826 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5827 f_shutdown(__BFILE__, __LINE__);
5828 }
5829 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5830 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5831 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5832 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5833 }
5834
5835 f_shutdown(__BFILE__, __LINE__, final := true);
5836}
5837
5838/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5839 * while waiting for SI resolution */
5840testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5841 var PollFnCtx pollctx;
5842 var GprsMS ms;
5843 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5844 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5845 var RlcmacDlBlock dl_block;
5846 var uint32_t sched_fn;
5847 var CtrlMessage rx_ctrl;
5848 var GsmArfcn req_arfcn := 862;
5849 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005850 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005851
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005852 if (use_old_ctrl_iface) {
5853 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5854 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5855 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005856
5857 /* Initialize NS/BSSGP side */
5858 f_init_bssgp();
5859 /* Initialize GPRS MS side */
5860 f_init_gprs_ms();
5861 ms := g_ms[0]; /* We only use first MS in this test */
5862
5863 /* Initialize the PCU interface abstraction */
5864 f_init_raw(testcasename(), info_ind);
5865
5866 /* Make sure we are not affected by full cache from previous tests */
5867 f_pcuvty_flush_neigh_caches();
5868
5869 /* Establish BSSGP connection to the PCU */
5870 f_bssgp_establish();
5871 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5872
5873 /* Send PACKET RESOURCE REQUEST */
5874 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5875 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5876 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5877
5878 /* Start NACC from MS side */
5879 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5880 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5881
5882 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005883 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 +01005884 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5885 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5886 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5887 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5888 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5889 f_outbound_nacc_rim_tx_resp(info_ind);
5890
5891 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005892 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 +01005893
5894 /* And finally everything continues as usual with RIN procedure */
5895 as_outbound_nacc_rim_resolve(info_ind);
5896
5897 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005898 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005899
5900 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5901 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5902 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5903 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5904 f_shutdown(__BFILE__, __LINE__);
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 f_shutdown(__BFILE__, __LINE__, final := true);
5913}
5914
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005915/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5916 * while sending Pkt Neigh Data Change */
5917testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5918 var PollFnCtx pollctx;
5919 var GprsMS ms;
5920 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5921 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5922 var RlcmacDlBlock dl_block;
5923 var uint32_t sched_fn;
5924 var CtrlMessage rx_ctrl;
5925 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 Pedrol179ddef2021-02-11 16:03:46 +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 Pedrol179ddef2021-02-11 16:03:46 +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 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 +01005961 /* RIM procedure: */
5962 as_outbound_nacc_rim_resolve(info_ind);
5963
5964 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5965 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5966 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5967 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5968
5969 /* It should trigger RAC_CI resolution to start again: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005970 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 +01005971 /* RIM procedure: */
5972 as_outbound_nacc_rim_resolve(info_ind);
5973 /* Transmit SI back to MS */
5974 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5975
5976 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5977 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5978 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5979 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5980 f_shutdown(__BFILE__, __LINE__);
5981 }
5982 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5983 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5984 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5985 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5986 }
5987}
5988
5989/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5990testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5991 var PollFnCtx pollctx;
5992 var GprsMS ms;
5993 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5994 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5995 var RlcmacDlBlock dl_block;
5996 var uint32_t sched_fn;
5997 var CtrlMessage rx_ctrl;
5998 var GsmArfcn req_arfcn := 862;
5999 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006000 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006001
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006002 if (use_old_ctrl_iface) {
6003 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6004 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6005 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006006
6007 /* Initialize NS/BSSGP side */
6008 f_init_bssgp();
6009 /* Initialize GPRS MS side */
6010 f_init_gprs_ms();
6011 ms := g_ms[0]; /* We only use first MS in this test */
6012
6013 /* Initialize the PCU interface abstraction */
6014 f_init_raw(testcasename(), info_ind);
6015
6016 /* Make sure we are not affected by full cache from previous tests */
6017 f_pcuvty_flush_neigh_caches();
6018
6019 /* Establish BSSGP connection to the PCU */
6020 f_bssgp_establish();
6021 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6022
6023 /* Send PACKET RESOURCE REQUEST */
6024 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6025 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6026 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6027
6028 /* Start NACC from MS side */
6029 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6030 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6031
6032 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006033 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 +01006034 /* RIM procedure: */
6035 as_outbound_nacc_rim_resolve(info_ind);
6036
6037 /* Announce SI back to MS, continue NACC procedure */
6038 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6039
6040 /* trigger a Pkt Cell Change Notif with different tgt cell */
6041 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6042 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6043
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006044 /* It should trigger RAC_CI resolution to start again: */
6045 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6046
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006047 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6048 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
6049
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006050 /* RIM procedure: */
6051 as_outbound_nacc_rim_resolve(info_ind);
6052 /* Transmit SI back to MS */
6053 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6054
6055 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6056 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6057 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6058 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6059 f_shutdown(__BFILE__, __LINE__);
6060 }
6061 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6062 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6063 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6064 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6065 }
6066}
6067
6068/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
6069testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
6070 var PollFnCtx pollctx;
6071 var GprsMS ms;
6072 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6073 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6074 var RlcmacDlBlock dl_block;
6075 var uint32_t sched_fn;
6076 var CtrlMessage rx_ctrl;
6077 var GsmArfcn req_arfcn := 862;
6078 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006079 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006080
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006081 if (use_old_ctrl_iface) {
6082 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6083 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6084 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006085
6086 /* Initialize NS/BSSGP side */
6087 f_init_bssgp();
6088 /* Initialize GPRS MS side */
6089 f_init_gprs_ms();
6090 ms := g_ms[0]; /* We only use first MS in this test */
6091
6092 /* Initialize the PCU interface abstraction */
6093 f_init_raw(testcasename(), info_ind);
6094
6095 /* Make sure we are not affected by full cache from previous tests */
6096 f_pcuvty_flush_neigh_caches();
6097
6098 /* Establish BSSGP connection to the PCU */
6099 f_bssgp_establish();
6100 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6101
6102 /* Send PACKET RESOURCE REQUEST */
6103 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6104 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6105 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6106
6107 /* Start NACC from MS side */
6108 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6109 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6110
6111 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006112 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 +01006113 /* RIM procedure: */
6114 as_outbound_nacc_rim_resolve(info_ind);
6115
6116 /* Announce SI back to MS, continue NACC procedure */
6117 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6118
6119 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6120 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6121 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6122 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6123 f_shutdown(__BFILE__, __LINE__);
6124 }
6125
6126 /* trigger a Pkt Cell Change Notif with different tgt cell */
6127 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6128 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6129
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006130 /* It should trigger RAC_CI resolution to start again: */
6131 /* When using new PCUIF interface for resolution, we must
6132 * PCUIF.receive() here since that's the first message in the PCUIF
6133 * queue that PCU will have sent. Calling other functions doing
6134 * PCUIF.receive() (like f_ms_tx_ul_block() below) will make them fail
6135 * due to unexpected message receive. */
6136 if (not use_old_ctrl_iface) {
6137 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6138 }
6139
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006140 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6141 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6142 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6143 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6144 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006145
6146 /* When using CTRL interface, we must schedule the ACK before (see
6147 * above) blocking here waiting for the resoltion, otherwise we'll be
6148 * too late scheduling by the time the resolution is done. */
6149 if (use_old_ctrl_iface) {
6150 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6151 }
6152
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006153 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6154 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
6155
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006156 /* RIM procedure: */
6157 as_outbound_nacc_rim_resolve(info_ind);
6158 /* Transmit SI back to MS */
6159 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6160
6161 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6162 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6163 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6164 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6165 f_shutdown(__BFILE__, __LINE__);
6166 }
6167 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6168 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6169 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6170 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6171 }
6172}
6173
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006174/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
6175testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
6176 var PollFnCtx pollctx;
6177 var GprsMS ms;
6178 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6179 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6180 var RlcmacDlBlock dl_block;
6181 var uint32_t sched_fn, dl_fn;
6182 var CtrlMessage rx_ctrl;
6183 var GsmArfcn req_arfcn := 862;
6184 var uint6_t req_bsic := 43;
6185 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006186 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006187
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006188 if (use_old_ctrl_iface) {
6189 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6190 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6191 }
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006192
6193 /* Initialize NS/BSSGP side */
6194 f_init_bssgp();
6195 /* Initialize GPRS MS side */
6196 f_init_gprs_ms();
6197 ms := g_ms[0]; /* We only use first MS in this test */
6198
6199 /* Initialize the PCU interface abstraction */
6200 f_init_raw(testcasename(), info_ind);
6201
6202 /* Make sure we are not affected by full cache from previous tests */
6203 f_pcuvty_flush_neigh_caches();
6204
6205 /* Establish BSSGP connection to the PCU */
6206 f_bssgp_establish();
6207 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6208
6209 /* Send PACKET RESOURCE REQUEST */
6210 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6211 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6212 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6213
6214 /* Start NACC from MS side */
6215 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6216 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6217
6218 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006219 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 +01006220 /* RIM procedure: */
6221 as_outbound_nacc_rim_resolve(info_ind);
6222
6223 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
6224 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
6225 f_sleep(0.1);
6226 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
6227 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
6228
6229 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
6230 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
6231 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
6232 * Data with unassigned DL TBF in line above): */
6233 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6234 /* Continue receiving Pkt Cell Neighbor Data */
6235 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
6236
6237 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6238 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6239 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6240 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6241 f_shutdown(__BFILE__, __LINE__);
6242 }
6243 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6244 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6245 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6246 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6247 }
6248
6249 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
6250 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
6251 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
6252 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
6253 f_dl_block_ack_fn(dl_block, dl_fn));
6254}
6255
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006256
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006257function f_do_inbound_nacc(template (value) RIM_Routing_Information tx_src_addr, template RIM_Routing_Information rx_dst_addr)
6258runs on RAW_PCU_Test_CT
6259{
6260 var template (value) RAN_Information_Request_RIM_Container req_cont;
6261 var template (value) PDU_BSSGP bssgp_rim_pdu;
6262 var template PDU_BSSGP bssgp_rim_pdu_expect;
6263 var template RAN_Information_RIM_Container rim_cont_expect;
6264 var RIM_Routing_Address bts_addr;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006265
6266 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006267 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 +01006268 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006269 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 +01006270 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02006271 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);
6272 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006273 f_sleep(1.0);
6274
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006275 bts_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006276
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006277 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6278 ts_RIM_Sequence_Number(1),
6279 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6280 ts_RIM_Protocol_Version_Number(1),
6281 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6282 omit);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006283 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
6284 tx_src_addr, req_cont);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006285
6286 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6287 tr_RIM_Sequence_Number(1),
6288 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6289 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006290 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 +01006291 omit);
6292
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006293 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(rx_dst_addr,
6294 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006295 rim_cont_expect);
6296 RIM.send(bssgp_rim_pdu);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006297 timer T := 2.0;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006298 T.start;
6299 alt {
6300 [] RIM.receive(bssgp_rim_pdu_expect) { }
6301 [] RIM.receive {
6302 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6303 }
6304 [] T.timeout {
6305 setverdict(fail, "No BSSGP RIM PDU received");
6306 mtc.stop;
6307 }
6308 }
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006309}
6310/* Send a RIM RAN info request to the PCU and verify the response, we expect
6311 * getting the system information back which we have transfered to the PCU via
6312 * PCUIF on startup. */
6313testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
6314 /* Initialize NS/BSSGP side */
6315 f_init_bssgp();
6316
6317 /* Initialize the PCU interface abstraction */
6318 f_init_raw(testcasename());
6319
6320 /* Establish BSSGP connection to the PCU */
6321 f_bssgp_establish();
6322
6323 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6324 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6325
6326 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6327 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr));
6328
6329 f_shutdown(__BFILE__, __LINE__, final := true);
6330}
6331
6332/* Same as TC_rim_ran_info_req_single_rep, but using an EUTRAN eNodeB ID as
6333 * Routing information, to verify PCU handles that kind of address just fine
6334 */
6335testcase TC_rim_ran_info_req_single_rep_eutran() runs on RAW_PCU_Test_CT {
6336 /* Initialize NS/BSSGP side */
6337 f_init_bssgp();
6338
6339 /* Initialize the PCU interface abstraction */
6340 f_init_raw(testcasename());
6341
6342 /* Establish BSSGP connection to the PCU */
6343 f_bssgp_establish();
6344
6345 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6346 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_enbid(src_cid, tac := 3, gnbid := '12345678123456'O));
6347
6348 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr),
6349 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006350
6351 f_shutdown(__BFILE__, __LINE__, final := true);
6352}
6353
6354/* Same as above, but in this case we simulate the rare case in which the PCU
6355 * has no system information available. We expect getting a response back but
6356 * with no system information inside. */
6357testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006358 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006359 var PCUIF_Message pcu_msg;
6360 timer T := 2.0;
6361
6362 /* Initialize NS/BSSGP side */
6363 f_init_bssgp();
6364
6365 /* Initialize the PCU interface abstraction */
6366 f_init_raw(testcasename(), info_ind);
6367
6368 /* Establish BSSGP connection to the PCU */
6369 f_bssgp_establish();
6370
6371 /* Clear sysinfo from the PCU */
6372 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);
6373 BTS.send(si1_data_ind);
6374 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);
6375 BTS.send(si3_data_ind);
6376 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);
6377 BTS.send(si16_data_ind);
6378 f_sleep(1.0);
6379
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006380 var RIM_Routing_Address dst_addr;
6381 var RIM_Routing_Address src_addr;
6382 var template (value) RAN_Information_Request_RIM_Container req_cont;
6383 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006384 var template PDU_BSSGP bssgp_rim_pdu_expect;
6385 var template RAN_Information_RIM_Container rim_cont_expect;
6386
6387 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 +01006388 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6389 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006390
6391 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6392 ts_RIM_Sequence_Number(1),
6393 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6394 ts_RIM_Protocol_Version_Number(1),
6395 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6396 omit);
6397 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6398 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6399 req_cont);
6400
6401
6402 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6403 tr_RIM_Sequence_Number(1),
6404 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6405 tr_RIM_Protocol_Version_Number(1),
6406 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
6407 omit);
6408
6409 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6410 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6411 rim_cont_expect);
6412 RIM.send(bssgp_rim_pdu);
6413 T.start;
6414 alt {
6415 [] RIM.receive(bssgp_rim_pdu_expect) { }
6416 [] RIM.receive {
6417 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6418 }
6419 [] T.timeout {
6420 setverdict(fail, "No BSSGP RIM PDU received");
6421 mtc.stop;
6422 }
6423 }
6424
6425 f_shutdown(__BFILE__, __LINE__, final := true);
6426}
6427
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006428/* 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 +02006429testcase TC_pdch_energy_saving() runs on RAW_PCU_Test_CT {
6430 var PCUIF_info_ind info_ind;
6431 var template (value) TsTrxBtsNum nr;
6432 var RlcmacDlBlock dl_block;
6433 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006434 var integer ts;
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006435 timer T;
6436
6437 /* Initialize NS/BSSGP side */
6438 f_init_bssgp();
6439
6440 info_ind := valueof(ts_PCUIF_INFO_default);
6441 /* The 2 first TRX are enabled. */
6442 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (2 .. 7));
6443 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6444 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 1);
6445
6446 /* Initialize the PCU interface abstraction */
6447 f_init_raw(testcasename(), info_ind);
6448
6449 /* Establish BSSGP connection to the PCU */
6450 f_bssgp_establish();
6451
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006452 for (ts := 0; ts < 2; ts := ts + 1) {
6453 nr := ts_TsTrxBtsNum(ts_nr := 7, trx_nr := ts, bts_nr := 0, blk_nr := 0);
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006454
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006455 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
6456 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
6457 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), block_nr := nr.blk_nr));
6458 T.start(0.5);
6459 alt {
6460 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
6461 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
6462 omit)) -> value data_msg {
6463 setverdict(pass);
6464 T.stop;
6465 }
6466 [] as_rx_fail_dummy(nr);
6467 [] BTS.receive {
6468 setverdict(fail, "Unexpected block from BTS");
6469 f_shutdown(__BFILE__, __LINE__);
6470 }
6471 [] T.timeout {
6472 setverdict(fail, "Expected IDLE block from BTS");
6473 f_shutdown(__BFILE__, __LINE__);
6474 }
6475 }
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006476 }
6477
6478 f_shutdown(__BFILE__, __LINE__, final := true);
6479}
6480
Oliver Smith3d174882021-09-03 11:38:51 +02006481/* Test stats for available and occupied PDCHs */
6482testcase TC_stat_pdch_avail_occ() runs on RAW_PCU_Test_CT {
6483 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6484 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6485
6486 /* Initialize NS/BSSGP side */
6487 f_init_bssgp();
6488
Oliver Smithedcded22021-09-14 09:26:55 +02006489 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6490 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6491 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6492 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6493 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6494 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
Oliver Smith3d174882021-09-03 11:38:51 +02006495
Oliver Smith72d0c692021-09-08 10:03:52 +02006496 /* Allocate 4 GprsMS instances */
Oliver Smith3d174882021-09-03 11:38:51 +02006497 f_init_gprs_ms(4);
6498
6499 /* Initialize the PCU interface abstraction */
6500 f_init_raw(testcasename(), info_ind);
6501
6502 /* Reset stats */
6503 f_statsd_reset();
6504
6505 /* Establish BSSGP */
6506 f_bssgp_establish();
6507
6508 /* 8 PDCHs available, 0 occupied */
6509 var StatsDExpects expect := {
6510 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006511 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6512 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6513 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
Oliver Smith3d174882021-09-03 11:38:51 +02006514 };
6515 f_statsd_expect(expect);
6516
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006517 /* Establish an Uplink TBF for each GprsMS instance (3x GPRS, 1x EGPRS) */
Oliver Smith3d174882021-09-03 11:38:51 +02006518 f_multi_ms_bssgp_register();
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006519 f_ms_establish_ul_tbf(g_ms[0]);
6520 f_ms_establish_ul_tbf(g_ms[1]);
6521 f_ms_establish_ul_tbf(g_ms[2]);
6522 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 +02006523
6524 /* 4 PDCHs occupied */
6525 expect := {
6526 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006527 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 4, max := 4 },
6528 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 3, max := 3 },
6529 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
Oliver Smith3d174882021-09-03 11:38:51 +02006530 };
6531 f_statsd_expect(expect);
6532
6533 f_shutdown(__BFILE__, __LINE__, final := true);
6534}
6535
Oliver Smithf04762d2021-09-14 17:20:38 +02006536/* Test stats for available and occupied PDCHs, for MS which is not known by
6537 * the PCU (e.g. because it was forgotten due to no interaction, and old DL
6538 * data arrives from SGSN) */
6539function f_tc_stat_pdch_avail_occ_ms_not_known(boolean egprs) runs on RAW_PCU_Test_CT {
6540 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6541 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6542
6543 /* Ensure a deterministic slot allocation of 1 PDCH with MS class 1 */
6544 const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs := {
6545 gprsmultislotclass := '00001'B,
6546 gprsextendeddynalloccap := '0'B
6547 };
6548 const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs := {
6549 egprsmultislotclass := '00001'B,
6550 egprsextendeddynalloccap := '0'B
6551 };
6552 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs := {
6553 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, omit)) };
6554 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs := {
6555 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, bssgp_mscap_egprs)) };
6556
6557 /* Initialize NS/BSSGP side */
6558 f_init_bssgp();
6559
6560 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6561 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6562 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6563 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6564 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6565 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
6566
6567 /* Allocate 1 GprsMS instance */
6568 f_init_gprs_ms(1);
6569
6570 /* Initialize the PCU interface abstraction */
6571 f_init_raw(testcasename(), info_ind);
6572
6573 /* Reset stats */
6574 f_statsd_reset();
6575
6576 /* Establish BSSGP */
6577 f_bssgp_establish();
6578
6579 /* 8 PDCHs available, 0 occupied */
6580 var StatsDExpects expect := {
6581 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6582 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6583 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6584 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6585 };
6586 f_statsd_expect(expect);
6587
6588 var GprsMS ms := g_ms[0]; /* We only use first MS in this test */
6589 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6590
6591 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
6592 var octetstring data := f_rnd_octstring(1400);
6593 if (egprs) {
6594 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs));
6595 } else {
6596 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_gprs));
6597 }
6598 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
6599
6600 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
6601 f_sleep(X2002);
6602
6603 /* 1 PDCH occupied */
6604 if (egprs) {
6605 expect := {
6606 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6607 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6608 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6609 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
6610 };
6611 } else {
6612 expect := {
6613 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6614 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6615 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 1, max := 1 },
6616 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6617 };
6618 }
6619 f_statsd_expect(expect);
6620
6621 /* Clean up */
6622 f_shutdown(__BFILE__, __LINE__, final := true);
6623}
6624testcase TC_stat_pdch_avail_occ_ms_not_known_gprs() runs on RAW_PCU_Test_CT {
6625 f_tc_stat_pdch_avail_occ_ms_not_known(false);
6626}
6627testcase TC_stat_pdch_avail_occ_ms_not_known_egprs() runs on RAW_PCU_Test_CT {
6628 f_tc_stat_pdch_avail_occ_ms_not_known(true);
6629}
6630
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006631/* Make sure that bts.0.pdch.all_allocated is set when we allocate all resources */
6632testcase TC_ratectr_all_available_allocated() runs on RAW_PCU_Test_CT {
6633 var PCUIF_info_ind info_ind;
6634 var template IARRestOctets rest;
6635 var BIT11 ra11;
6636
6637 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006638
6639 /* Only the first TRX is enabled. */
6640 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
6641 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6642
6643 /* Initialize the PCU interface abstraction */
6644 f_init_raw(testcasename(), info_ind);
6645 f_statsd_reset();
6646
6647 var EGPRSPktChRequest req := {
6648 one_phase := {
6649 tag := '0'B,
6650 multislot_class := '10101'B,
6651 priority := '01'B,
6652 random_bits := '101'B
6653 }
6654 };
6655
6656 /* We send 7 requests, the IUT gives us all available USFs (0..6) */
6657 for (var integer i := 0; i < 7; i := i + 1) {
6658 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
6659 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
6660 }
6661
6662 ra11 := enc_EGPRSPktChRequest2bits(req);
6663 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
6664
6665 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrol209dc7d2021-11-15 16:25:08 +01006666 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006667
6668 /* bts.0.pdch.all_allocated is updated once per second, wait some time to make sure it was updated. */
6669 f_sleep(2.0);
6670 var StatsDExpects expect := {
6671 { name := "TTCN3.bts.0.pdch.all_allocated", mtype := "c", min := 1, max := 1 }
6672 };
6673 f_statsd_expect(expect);
6674
6675 f_shutdown(__BFILE__, __LINE__, final := true);
6676}
6677
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006678control {
6679 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01006680 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006681 execute( TC_ta_ptcch_idle() );
6682 execute( TC_ta_rach_imm_ass() );
Vadim Yanitskiy866f8702021-05-26 14:50:27 +02006683 execute( TC_ta_ul_ack_nack_first_block() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006684 execute( TC_ta_idle_dl_tbf_ass() );
6685 execute( TC_ta_ptcch_ul_multi_tbf() );
6686 execute( TC_cs_lqual_ul_tbf() );
6687 execute( TC_cs_initial_ul() );
6688 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01006689 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01006690 execute( TC_cs_max_dl() );
6691 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01006692 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01006693 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01006694 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01006695 execute( TC_mcs_max_dl() );
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02006696 execute( TC_t3141() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01006697 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02006698 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01006699 execute( TC_x2031_t3191() );
6700 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006701 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01006702 execute( TC_n3105_max_t3195() );
Pau Espin Pedrole8a94442021-11-15 17:05:46 +01006703 execute( TC_t3172_wait_ind_size0() );
6704 execute( TC_t3172_wait_ind_size1() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02006705 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02006706 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02006707 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006708 execute( TC_mo_ping_pong() );
6709 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02006710 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006711 execute( TC_mt_ping_pong() );
6712 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006713 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006714 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07006715 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006716 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01006717 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006718 execute( TC_paging_cs_from_bts() );
6719 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
6720 execute( TC_paging_cs_from_sgsn_sign() );
6721 execute( TC_paging_cs_from_sgsn_ptp() );
6722 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
6723 execute( TC_paging_ps_from_sgsn_sign() );
6724 execute( TC_paging_ps_from_sgsn_ptp() );
Pau Espin Pedrol1538c3b2021-11-16 19:19:07 +01006725 execute( TC_paging_pch_timeout() );
6726
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07006727 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
6728 execute( TC_paging_cs_multi_ms_imsi() );
6729 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02006730 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
6731 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01006732 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
6733 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006734
6735 /* EGPRS specific test cases */
6736 execute( TC_egprs_pkt_chan_req_signalling() );
6737 execute( TC_egprs_pkt_chan_req_one_phase() );
6738 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07006739 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07006740 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07006741 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02006742
6743 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07006744
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006745 /* Immediate Assignment on AGCH/PCH */
6746 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
6747 execute( TC_pcuif_fh_imm_ass_ul() );
6748 execute( TC_pcuif_fh_imm_ass_dl() );
6749 /* Packet Uplink/Downlink Assignment on PACCH */
6750 execute( TC_pcuif_fh_pkt_ass_ul() );
6751 execute( TC_pcuif_fh_pkt_ass_dl() );
6752 execute( TC_multitrx_multims_alloc() );
6753 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
6754 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
6755 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
Pau Espin Pedrol37604572021-10-15 14:36:16 +02006756 execute( TC_ul_tbf_reestablish_with_pkt_resource_req() );
Pau Espin Pedrold658f342021-10-15 14:52:22 +02006757 execute( TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() );
Pau Espin Pedrol59aa1092021-11-15 18:53:34 +01006758 execute( TC_ul_tbf_reestablish_with_pkt_dl_ack_nack() );
6759 execute( TC_ul_tbf_reestablish_with_pkt_dl_ack_nack_egprs() );
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006760
Pau Espin Pedrole1303052020-11-16 11:13:51 +01006761 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07006762
6763 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01006764 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01006765 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01006766 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01006767 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01006768 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01006769 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01006770 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
6771 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006772 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
6773 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
6774 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006775 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
6776 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006777 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
6778 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
6779 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006780 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006781 if (mp_ctrl_neigh_ip != "") { /* PCU using old CTRL neigh addr resolution iface */
6782 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
6783 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
6784 }
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006785
6786 execute( TC_rim_ran_info_req_single_rep() );
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006787 execute( TC_rim_ran_info_req_single_rep_eutran() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006788 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006789
6790 execute (TC_pdch_energy_saving() );
Oliver Smith3d174882021-09-03 11:38:51 +02006791
6792 execute( TC_stat_pdch_avail_occ() );
Oliver Smithf04762d2021-09-14 17:20:38 +02006793 execute( TC_stat_pdch_avail_occ_ms_not_known_gprs() );
6794 execute( TC_stat_pdch_avail_occ_ms_not_known_egprs() );
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006795 execute( TC_ratectr_all_available_allocated() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006796}
6797
Harald Weltea419df22019-03-21 17:23:04 +01006798}