blob: e946d96718ff94f839b067a8ac4d2260ee1450bf [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
72 charstring mp_ctrl_neigh_ip := "127.0.0.1";
73 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 Pedrol745a48b2020-10-30 15:31:07 +0100247private function f_init_vty(charstring id, boolean egprs_only) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200248 map(self:PCUVTY, system:PCUVTY);
249 f_vty_set_prompts(PCUVTY);
250 f_vty_transceive(PCUVTY, "enable");
251
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100252 /* This will be removed soon, not needed. EGPRS support is controlled through pcu_ind flags */
253 if (egprs_only) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200254 f_vty_config2(PCUVTY, {"pcu"}, "egprs only");
255 } else {
256 f_vty_config2(PCUVTY, {"pcu"}, "no egprs");
257 }
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200258
259 if (g_force_two_phase_access) {
260 f_vty_config2(PCUVTY, {"pcu"}, "two-phase-access");
261 } else {
262 f_vty_config2(PCUVTY, {"pcu"}, "no two-phase-access");
263 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200264}
265
Pau Espin Pedrol2456dad2020-04-30 20:22:38 +0200266function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200267runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200268 /* Start the guard timer */
269 g_T_guard.start;
270 activate(as_Tguard_RAW());
271
272 /* Init PCU interface component */
Harald Welte5339b2e2020-10-04 22:52:56 +0200273 vc_PCUIF := RAW_PCUIF_CT.create("PCUIF");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200274 connect(vc_PCUIF:MTC, self:PCUIF);
275 map(vc_PCUIF:PCU, system:PCU);
276
277 /* Create one BTS component (we may want more some day) */
Harald Welte5339b2e2020-10-04 22:52:56 +0200278 vc_BTS := RAW_PCU_BTS_CT.create("BTS");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200279 connect(vc_BTS:PCUIF, vc_PCUIF:BTS);
280 connect(vc_BTS:TC, self:BTS);
281
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100282 f_init_vty(id, f_pcuif_ind_flags_egprs_enabled(valueof(info_ind.flags)));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200283
Daniel Willmann535aea62020-09-21 13:27:08 +0200284 f_init_statsd(id, vc_STATSD, mp_pcu_statsd_ip, mp_pcu_statsd_port);
285 /* This is normally done in the ConnHdlr component, but here
286 * the Test_CT doubles as ConnHdlr */
287 connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
288
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200289 vc_PCUIF.start(f_PCUIF_CT_handler(mp_pcu_sock_path));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100290 vc_BTS.start(f_BTS_CT_handler(0, valueof(info_ind), true));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200291
292 /* Wait until the BTS is ready (SI13 negotiated) */
293 BTS.receive(tr_RAW_PCU_EV(BTS_EV_SI13_NEGO));
294}
295
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700296/* Register TLLI of each allocated GprsMS instance */
297private function f_multi_ms_bssgp_register()
298runs on RAW_PCU_Test_CT {
299 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
300 f_bssgp_client_llgmm_assign(TLLI_UNUSED, g_ms[i].tlli);
301 }
302}
303
304/* Allocate [and activate] an Uplink TBF for each allocated GprsMS instance */
305private function f_multi_ms_establish_tbf(boolean do_activate := false)
306runs on RAW_PCU_Test_CT {
307 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
308 /* Establish an Uplink TBF */
309 f_ms_establish_ul_tbf(g_ms[i]);
310
311 /* Send a random block, so this TBF becomes "active" */
312 if (do_activate) {
313 /* FIXME: use the new APU by Pau to get correct TRX/TS here */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100314 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, i mod 8);
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700315 var octetstring dummy := f_rnd_octstring(12);
316 var RlcmacDlBlock dl_block;
317 var uint32_t poll_fn;
318
319 f_ms_tx_ul_data_block(g_ms[i], dummy, with_tlli := true, nr := nr);
320 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := nr);
321 }
322 }
323}
324
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100325private function f_ms_establish_ul_tbf_2phase_access(inout GprsMS ms,
326 template (omit) RlcmacUlCtrlMsg pkt_res_req := omit)
327runs on RAW_PCU_Test_CT return PollFnCtx {
328 var PollFnCtx pollctx;
329
330 /* Single block (two phase) packet access */
331 var uint16_t ra := bit2int(chan_req_sb);
332 if (g_force_two_phase_access) {
333 /* If 2phase access is enforced by the network, then let's
334 * request a One phase packet access, we'll receive a single block
335 * anyway
336 */
337 ra := bit2int(chan_req_def);
338 }
339
340 /* Establish an Uplink TBF */
341 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
342 f_ms_establish_ul_tbf(ms);
343
344 /* Make sure we've got an Uplink TBF assignment */
345 if (not match(ms.ul_tbf.ass.ccch, tr_PacketUlSglAssign)) {
346 setverdict(fail, "Wrong Packet Uplink Assignment received: ", ms.ul_tbf.ass.ccch, " vs exp: ", tr_PacketUlSglAssign);
347 f_shutdown(__BFILE__, __LINE__);
348 }
349
350 /* Send PACKET RESOURCE REQUEST
351 * (see 3GPP TS 04.60 "7.1.3.1 Initiation of the Packet resource request procedure")
352 */
353 if (istemplatekind(pkt_res_req, "omit")) {
354 pkt_res_req := ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit);
355 }
356
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100357 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(valueof(pkt_res_req)), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
358 /* Store 1st UlTBF context before receiving next one, will
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100359 * overwrite the TS allocation on MS with info from new UL TBF:
360 */
361 pollctx.tstrxbts := f_ms_tx_TsTrxBtsNum(ms);
362 f_ms_rx_pkt_ass_pacch(ms, pollctx.fn, tr_RLCMAC_UL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
363 return pollctx;
364}
365
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200366testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +0200367 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
Pau Espin Pedrol2889f872021-01-11 14:43:35 +0100368 var GprsTlli tlli := TLLI_UNUSED;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200369 timer T;
370
371 /* Initialize NS/BSSGP side */
372 f_init_bssgp();
373
374 /* Initialize the PCU interface abstraction */
375 f_init_raw(testcasename());
376
377 /* Establish BSSGP connection to the PCU */
378 f_bssgp_establish();
379
380 BTS.send(ts_PCUIF_SUSP_REQ(0, tlli, ra_id, 0));
381
382 T.start(2.0);
383 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100384 [] 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 +0200385 setverdict(pass);
386 }
387 [] T.timeout {
388 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
389 }
390 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700391
392 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200393}
394
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100395/* Make sure TBF is released and no data is sent for in after reciving a Suspend Request from that MS. See OS#4761 */
396testcase TC_pcuif_suspend_active_tbf() runs on RAW_PCU_Test_CT {
397 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
398 var RlcmacDlBlock dl_block;
399 var octetstring data := f_rnd_octstring(10);
400 var uint32_t sched_fn;
401 var uint32_t dl_fn;
402 var GprsMS ms;
403 timer T;
404
405 /* Initialize NS/BSSGP side */
406 f_init_bssgp();
407 /* Initialize GPRS MS side */
408 f_init_gprs_ms();
409 ms := g_ms[0]; /* We only use first MS in this test */
410
411 /* Initialize the PCU interface abstraction */
412 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
413
414 /* Establish BSSGP connection to the PCU */
415 f_bssgp_establish();
416 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
417
418 /* Establish an Uplink TBF */
419 f_ms_establish_ul_tbf(ms);
420
421 /* Send one UL block (with TLLI since we are in One-Phase Access
422 contention resoultion) and make sure it is ACKED fine */
423 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
424 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
425 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
426 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
427
428 /* UL block should be received in SGSN */
429 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
430
431 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
432 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
433 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
434
435 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
436 f_sleep(X2002);
437 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
438
439 /* MS has moved to CS, it sent SUSP REQ to BTS and PCU gets it, TBF is freed: */
440 BTS.send(ts_PCUIF_SUSP_REQ(0, ms.tlli, ra_id, 0));
441
442 T.start(2.0);
443 alt {
444 [] BSSGP_GLOBAL[0].receive(tr_BSSGP_SUSPEND(ms.tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
445 setverdict(pass);
446 }
447 [] T.timeout {
448 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
449 f_shutdown(__BFILE__, __LINE__);
450 }
451 }
452
453 /* Make sure we don't receive data for that TBF since it was released
454 * before. Also check our TBF is not polled for UL. */
455 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
456 if (dl_block.ctrl.mac_hdr.usf != USF_UNUSED) {
457 setverdict(fail, "Unexpected USF ", dl_block.ctrl.mac_hdr.usf);
458 f_shutdown(__BFILE__, __LINE__);
459 }
460
461 /* New data arrives, PCU should page the MS since no TBF active exists: */
462 /* Send some more data, it will never reach the MS */
463 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
464 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
465
466 f_shutdown(__BFILE__, __LINE__, final := true);
467}
468
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200469/* Test of correct Timing Advance at the time of TBF establishment
470 * (derived from timing offset of the Access Burst). */
471testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200472 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200473
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200474 /* Initialize GPRS MS side */
475 f_init_gprs_ms();
476 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200477 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100478 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200479
480 /* We cannot send too many TBF requests in a short time because
481 * at some point the PCU will fail to allocate a new TBF. */
482 for (var TimingAdvance ta := 0; ta < 64; ta := ta + 16) {
483 /* Establish an Uplink TBF (send RACH.ind with current TA) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200484 ms.ta := ta;
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700485 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200486
487 /* Make sure Timing Advance IE matches out expectations */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200488 if (ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance != ta) {
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700489 setverdict(fail, "Timing Advance mismatch: ",
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200490 ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance,
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700491 " vs expected ", ta);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700492 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200493 }
494 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700495
496 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200497}
498
499/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
500 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
501 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
502 * no active TBF exists at the moment of establishment (idle mode). */
503testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100504 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200505
506 /* Initialize NS/BSSGP side */
507 f_init_bssgp();
508
509 /* Initialize the PCU interface abstraction */
510 f_init_raw(testcasename());
511
512 /* Establish BSSGP connection to the PCU */
513 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100514 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200515
516 /* SGSN sends some DL data, PCU will initiate Packet Downlink
517 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100518 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
519 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200520
521 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
522 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
523 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100524 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700525 setverdict(fail, "Timing Advance value doesn't match");
526 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700527
528 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200529}
530
531/* Verify that the PCU generates valid PTCCH/D messages
532 * while neither Uplink nor Downlink TBF is established. */
533testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100534 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200535 timer T;
536
537 /* Initialize the PCU interface abstraction */
538 f_init_raw(testcasename());
539
540 /* Sent an RTS.req for PTCCH/D */
541 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
542 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
543 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100544
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200545 T.start(5.0);
546 alt {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100547 /* Make sure the message is encoded correctly
548 * TODO: do we expect all TA values to be equal '1111111'B? */
549 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg);
550
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200551 [] BTS.receive(PCUIF_Message:?) { repeat; }
552 [] T.timeout {
553 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700554 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200555 }
556 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100557 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700558
559 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200560}
561
562/* Test of correct Timing Advance during an active Uplink TBF.
563 *
564 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
565 * are not continuous and there can be long time gaps between them. This happens
566 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
567 * significantly change between such rare Uplink transmissions, so GPRS introduces
568 * additional mechanisms to control Timing Advance, and thus reduce interference
569 * between neighboring TDMA time-slots.
570 *
571 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
572 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
573 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
574 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
575 * among with the initial Timing Advance value. And here PTCCH comes to play.
576 *
577 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
578 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
579 * continuously. To ensure continuous measurements of the signal propagation
580 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
581 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
582 *
583 * The purpose of this test case is to verify the assignment of Timing Advance
584 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
585 * first establishes several Uplink TBFs, but does not transmit any Uplink
586 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
587 * indications to the PCU, checking the correctness of two received PTCCH/D
588 * messages (period of PTCCH/D is two multi-frames).
589 */
590
591/* List of ToA values for Access Bursts to be sent on PTCCH/U,
592 * each ToA (Timing of Arrival) value is in units of 1/4 of
593 * a symbol (i.e. 1 symbol is 4 QTA units). */
594type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
595const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
596 0, 0, 0, 0,
597 0, 0, 0, 0,
598 0, 0, 0, 0,
599 0, 0, 0, 0
600};
601
602private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
603 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
604runs on RAW_PCU_Test_CT {
605 var RAW_PCU_Event event;
606 var integer ss;
607
608 /* Send Access Bursts on PTCCH/U for every TA Index */
609 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
610 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700611 if (ss < 0) { /* Shall not happen */
612 f_shutdown(__BFILE__, __LINE__);
613 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200614
615 log("Sending an Access Burst on PTCCH/U",
616 ", sub-slot=", ss, " (TAI)",
617 ", fn=", event.data.tdma_fn,
618 ", ToA=", toa_map[ss], " (QTA)");
619 /* TODO: do we care about RA and burst format? */
620 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
621 ra := oct2int('3A'O),
622 is_11bit := 0,
623 burst_type := BURST_TYPE_0,
624 fn := event.data.tdma_fn,
625 arfcn := 871,
626 qta := toa_map[ss],
627 sapi := PCU_IF_SAPI_PTCCH));
628 repeat;
629 }
630}
631
632private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
633 template PTCCHDownlinkMsg t_ta_msg)
634runs on RAW_PCU_Test_CT {
635 var PTCCHDownlinkMsg ta_msg;
636 var PCUIF_Message pcu_msg;
637 timer T;
638
639 /* First, send an RTS.req for the upcoming PTCCH/D block */
640 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
641 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
642 arfcn := 871, block_nr := 0));
643 T.start(2.0);
644 alt {
645 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
646 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
647 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
648 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
649 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
650 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
651 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
652 log("Rx PTCCH/D message: ", ta_msg);
653
654 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700655 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200656 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
657 }
658 }
659 [] BTS.receive { repeat; }
660 [] T.timeout {
661 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200662 }
663 }
664}
665
666testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
667 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200668 var GprsMS ms;
669
670 /* Initialize GPRS MS side */
671 f_init_gprs_ms();
672 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200673
674 /* Initialize the PCU interface abstraction */
675 f_init_raw(testcasename());
676
677 /* Enable forwarding of PTCCH/U TDMA events to us */
678 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
679
680 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
681 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200682 /* Establish an Uplink TBF */
683 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200684
685 /* We expect incremental TFI/USF assignment (dynamic allocation) */
686 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200687 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200688 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700689 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200690 }
691
692 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200693 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200694 setverdict(fail, "Failed to match Timing Advance Index for #", i);
695 /* Keep going, the current OsmoPCU does not assign TA Index */
696 }
697 }
698
699 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
700 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
701 for (var integer i := 0; i < 7; i := i + 1) {
702 /* ToA in units of 1/4 of a symbol */
703 toa_map[i] := (i + 1) * 7 * 4;
704 }
705
706 /* Now we have all 7 TBFs established in one-phase access mode,
707 * however we will not be sending any data on them. Instead, we
708 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
709 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
710 *
711 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
712 * time-slots, so at the moment of scheduling a PTCCH/D block
713 * the PCU has odd number of PTCCH/U Access Bursts received. */
714 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
715 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
716 /* Other values are not known (yet) */
717 tai3_ta := ?));
718 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
719 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
720 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
721 /* Other values are out of our interest */
722 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700723
724 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200725}
726
727/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
728 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
729 *
730 * NOTE: the ranges are intentionally overlapping because OsmoPCU
731 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
732private template integer CS1_lqual_dB_range := (-infinity .. 6);
733private template integer CS2_lqual_dB_range := (5 .. 8);
734private template integer CS3_lqual_dB_range := (7 .. 13);
735private template integer CS4_lqual_dB_range := (12 .. infinity);
736
737testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200738 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200739 var GprsMS ms;
740 var uint32_t unused_fn, sched_fn;
741 var uint4_t cv;
742
743 /* Initialize GPRS MS side */
744 f_init_gprs_ms();
745 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200746
747 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100748 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200749
750 f_pcuvty_set_allowed_cs_mcs();
751 f_pcuvty_set_link_quality_ranges();
752
753 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200754 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200755
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200756
757 /* The actual / old link quality values. We need to keep track of the old
758 * (basically previous) link quality value, because OsmoPCU actually
759 * changes the coding scheme if not only the actual, but also the old
760 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200761 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200762 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200763
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200764 /* Send one UL block (with TLLI since we are in One-Phase Access
765 contention resoultion) and make sure it is ACKED fine. */
766 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
767 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
768 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)
769 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
770 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
771 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200772
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200773 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
774 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200775 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200776 lqual_old := ms.lqual_cb;
777 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200778
779 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200780 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
781 if (i > g_bs_cv_max) {
782 cv := 15;
783 } else {
784 cv := i;
785 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200786
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200787 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
788
789 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
790 f_rx_rlcmac_dl_block(dl_block, unused_fn);
791 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
792 continue;
793 }
794 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
795 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
796 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
797 f_shutdown(__BFILE__, __LINE__);
798 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200799
800 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
801 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
802
803 /* Match the received Channel Coding Command. Since we are increasing
804 * the link quality value on each iteration and not decreasing, there
805 * is no need to check the both old and current link quality values. */
806 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200807 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200808 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
809 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
810 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
811 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
812 }
813
814 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
815 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200816 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200817 }
818 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700819
820 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200821}
822
823/* Test the max UL CS set by VTY works fine */
824testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200825 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200826 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200827 var uint32_t unused_fn, sched_fn;
828 var GprsMS ms;
829
830 /* Initialize GPRS MS side */
831 f_init_gprs_ms();
832 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200833
834 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100835 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200836
837 /* Set initial UL CS to 3 */
838 g_cs_initial_ul := 3;
839 f_pcuvty_set_allowed_cs_mcs();
840 f_pcuvty_set_link_quality_ranges();
841
842 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200843 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200844
845 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200846 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200847
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200848 /* Send one UL block (with TLLI since we are in One-Phase Access
849 contention resoultion) and make sure it is ACKED fine. */
850 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
851 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
852 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)
853 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
854 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
855 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200856
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200857 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
858 while (true) {
859 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
860 f_rx_rlcmac_dl_block(dl_block, unused_fn);
861 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
862 continue;
863 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200864
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200865 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
866 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
867 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
868 f_shutdown(__BFILE__, __LINE__);
869 break;
870 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200871
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200872 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200873 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200874 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200875 if (last_ch_coding != CH_CODING_CS3) {
876 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200877 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200878 }
879
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200880 /* Remaining UL blocks are used to make sure regardless of initial
881 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200882 /* 0 dB, make sure we downgrade CS */
883 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200884 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200885 f_ms_tx_ul_data_block_multi(ms, 5);
886 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
887 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
888 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200889
890 if (last_ch_coding != CH_CODING_CS1) {
891 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200892 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200893 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700894
895 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200896}
897
898/* Test the max UL CS set by VTY works fine */
899testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200900 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200901 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200902 var uint32_t unused_fn, sched_fn;
903 var GprsMS ms;
904
905 /* Initialize GPRS MS side */
906 f_init_gprs_ms();
907 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200908
909 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100910 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200911
912 /* Set maximum allowed UL CS to 3 */
913 g_cs_max_ul := 3;
914 f_pcuvty_set_allowed_cs_mcs();
915 f_pcuvty_set_link_quality_ranges();
916
917 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200918 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200919
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200920 /* Send one UL block (with TLLI since we are in One-Phase Access
921 contention resoultion) and make sure it is ACKED fine. */
922 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
923 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
924 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)
925 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
926 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
927 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200928
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200929 ms.lqual_cb := 40*10; /* 40 dB */
930 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200931
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200932 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
933 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200934
935 if (last_ch_coding != CH_CODING_CS3) {
936 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200937 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200938 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700939
940 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200941}
942
Pau Espin Pedrol75122592020-11-03 15:22:59 +0100943/* Test the initial DL CS set by VTY works fine */
944testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
945 var octetstring data := f_rnd_octstring(10);
946 var CodingScheme exp_dl_cs_mcs;
947 var RlcmacDlBlock dl_block;
948 var uint32_t poll_fn;
949 var GprsMS ms;
950
951 /* Initialize NS/BSSGP side */
952 f_init_bssgp();
953 /* Initialize GPRS MS side */
954 f_init_gprs_ms();
955 ms := g_ms[0]; /* We only use first MS in this test */
956
957 /* Initialize the PCU interface abstraction */
958 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
959
960 /* Set initial allowed DL CS to 3 */
961 g_cs_initial_dl := 3;
962 exp_dl_cs_mcs := CS_3;
963 /* Set maximum allowed UL CS to 4 */
964 g_cs_max_dl := 4;
965 f_pcuvty_set_allowed_cs_mcs();
966 f_pcuvty_set_link_quality_ranges();
967
968 /* Establish BSSGP connection to the PCU */
969 f_bssgp_establish();
970 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
971
972 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
973 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
974 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
975
976 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
977 f_sleep(X2002);
978 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
979
980 /* ACK the DL block */
981 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
982 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
983 f_dl_block_ack_fn(dl_block, poll_fn));
984
985 f_shutdown(__BFILE__, __LINE__, final := true);
986}
987
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100988/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100989function 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 +0100990 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100991 var RlcmacDlBlock prev_dl_block, dl_block;
992 var uint32_t ack_fn;
993 var uint32_t fn;
994 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +0100995 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100996 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +0100997 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
998 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100999 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001000
1001 if (using_egprs) {
1002 exp_tmp_csmcs := mcs_egprs_any;
1003 bsn_mod := 2048;
1004 } else {
1005 exp_tmp_csmcs := cs_gprs_any;
1006 bsn_mod := 128;
1007 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001008
1009 /* Establish BSSGP connection to the PCU */
1010 f_bssgp_establish();
1011
1012 ms := g_ms[0]; /* We only use first MS in this test */
1013 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1014
1015 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001016 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001017 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1018
1019 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1020 f_sleep(X2002);
1021
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001022 for (var integer i := 0; i < 800; i := i + 1) {
1023 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001024 f_rx_rlcmac_dl_block(dl_block, fn);
1025
1026 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
1027 /* No more data to receive, done */
1028 break;
1029 }
1030
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001031 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001032
1033 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001034 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001035
1036 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001037 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001038 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001039 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 +01001040 if (tx_data_remain != 0) {
1041 /* Submit more data from time to time to keep the TBF ongoing */
1042 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1043 tx_data_remain := tx_data_remain - 1;
1044 }
1045 }
1046 prev_dl_block := dl_block;
1047 }
1048
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001049 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1050 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001051
1052
1053 f_shutdown(__BFILE__, __LINE__, final := true);
1054}
1055
1056/* Verify DL CS above "cs max" set by VTY is never used */
1057testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1058 /* Initialize NS/BSSGP side */
1059 f_init_bssgp();
1060 /* Initialize GPRS MS side */
1061 f_init_gprs_ms();
1062
1063 /* Initialize the PCU interface abstraction */
1064 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1065
1066 /* Set maximum allowed DL CS to 3 */
1067 g_cs_initial_dl := 1;
1068 g_cs_max_dl := 3;
1069 f_pcuvty_set_allowed_cs_mcs();
1070 f_pcuvty_set_link_quality_ranges();
1071
1072 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1073}
1074
1075/* Check DL CS4 is used in good link conditions if allowed by config */
1076testcase TC_dl_cs1_to_cs4() runs on RAW_PCU_Test_CT {
1077 /* Initialize NS/BSSGP side */
1078 f_init_bssgp();
1079 /* Initialize GPRS MS side */
1080 f_init_gprs_ms();
1081
1082 /* Initialize the PCU interface abstraction */
1083 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1084
1085 /* Set initial DL CS to 1 & maximum allowed DL CS to 4 */
1086 g_cs_initial_dl := 1;
1087 g_cs_max_dl := 4;
1088 f_pcuvty_set_allowed_cs_mcs();
1089 f_pcuvty_set_link_quality_ranges();
1090
1091 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1092}
1093
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001094/* Test the initial UL MCS set by VTY works fine */
1095testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1096 var RlcmacDlBlock dl_block;
1097 var PollFnCtx pollctx;
1098 var EgprsChCodingCommand last_ch_coding;
1099 var uint32_t unused_fn, sched_fn;
1100 var GprsMS ms;
1101 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001102
1103 /* Initialize GPRS MS side */
1104 f_init_gprs_ms();
1105 ms := g_ms[0]; /* We only use first MS in this test */
1106
1107 /* Initialize the PCU interface abstraction */
1108 f_init_raw(testcasename());
1109
1110 /* Set initial UL MCS to 3 */
1111 g_mcs_initial_ul := 3;
1112 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1113 f_pcuvty_set_allowed_cs_mcs();
1114 f_pcuvty_set_link_quality_ranges();
1115
1116 /* Take lqual (dB->cB) so that we stay in that MCS */
1117 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1118
1119 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001120 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 +01001121
1122 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1123 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1124 f_shutdown(__BFILE__, __LINE__);
1125 }
1126
1127 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1128 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1129
1130 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1131 while (true) {
1132 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1133 f_rx_rlcmac_dl_block(dl_block, unused_fn);
1134 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1135 continue;
1136 }
1137
1138 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1139 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1140 f_shutdown(__BFILE__, __LINE__);
1141 break;
1142 }
1143
1144 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1145 break;
1146 }
1147 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1148 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1149 f_shutdown(__BFILE__, __LINE__);
1150 }
1151
1152 /* Remaining UL blocks are used to make sure regardless of initial
1153 * lqual, we can go lower at any time
1154 * 0 dB, make sure we downgrade MCS */
1155 ms.lqual_cb := 0;
1156 /* 5 UL blocks, check we are in same initial MCS: */
1157 f_ms_tx_ul_data_block_multi(ms, 5);
1158 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1159 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1160 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1161
1162 if (last_ch_coding != CH_CODING_MCS1) {
1163 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1164 f_shutdown(__BFILE__, __LINE__);
1165 }
1166
1167 f_shutdown(__BFILE__, __LINE__, final := true);
1168}
1169
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001170/* Test the maximum UL MCS set by VTY works fine */
1171testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1172 var RlcmacDlBlock dl_block;
1173 var EgprsChCodingCommand last_ch_coding;
1174 var PollFnCtx pollctx;
1175 var uint32_t unused_fn, sched_fn;
1176 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001177
1178 /* Initialize GPRS MS side */
1179 f_init_gprs_ms();
1180 ms := g_ms[0]; /* We only use first MS in this test */
1181
1182 /* Initialize the PCU interface abstraction */
1183 f_init_raw(testcasename());
1184
1185 /* Set maximum allowed UL MCS to 5 */
1186 g_mcs_max_ul := 5;
1187 f_pcuvty_set_allowed_cs_mcs();
1188 f_pcuvty_set_link_quality_ranges();
1189
1190 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001191 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 +01001192 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1193 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1194
1195 ms.lqual_cb := 40*10; /* 40 dB */
1196 f_ms_tx_ul_data_block_multi(ms, 16);
1197
1198 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1199 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1200
1201 if (last_ch_coding != CH_CODING_MCS5) {
1202 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1203 f_shutdown(__BFILE__, __LINE__);
1204 }
1205
1206 f_shutdown(__BFILE__, __LINE__, final := true);
1207}
1208
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001209/* Test the initial DL CS set by VTY works fine */
1210testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1211 var octetstring data := f_rnd_octstring(10);
1212 var CodingScheme exp_dl_cs_mcs;
1213 var RlcmacDlBlock dl_block;
1214 var uint32_t poll_fn;
1215 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001216
1217 /* Initialize NS/BSSGP side */
1218 f_init_bssgp();
1219 /* Initialize GPRS MS side */
1220 f_init_gprs_ms();
1221 ms := g_ms[0]; /* We only use first MS in this test */
1222
1223 /* Initialize the PCU interface abstraction */
1224 f_init_raw(testcasename());
1225
1226 /* Set initial allowed DL MCS to 3 */
1227 g_mcs_initial_dl := 3;
1228 exp_dl_cs_mcs := MCS_3;
1229 /* Set maximum allowed DL MCS to 4 */
1230 g_mcs_max_dl := 4;
1231 f_pcuvty_set_allowed_cs_mcs();
1232 f_pcuvty_set_link_quality_ranges();
1233
1234 /* Establish BSSGP connection to the PCU */
1235 f_bssgp_establish();
1236 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1237
1238 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001239 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001240 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1241
1242 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1243 f_sleep(X2002);
1244 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1245
1246 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001247 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1248 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 +01001249 f_dl_block_ack_fn(dl_block, poll_fn));
1250
1251 f_shutdown(__BFILE__, __LINE__, final := true);
1252}
1253
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001254/* Verify DL MCS above "mcs max" set by VTY is never used */
1255testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1256 /* Initialize NS/BSSGP side */
1257 f_init_bssgp();
1258 /* Initialize GPRS MS side */
1259 f_init_gprs_ms();
1260
1261 /* Initialize the PCU interface abstraction */
1262 f_init_raw(testcasename());
1263
1264 /* Set maximum allowed DL CS to 3 */
1265 g_mcs_initial_dl := 1;
1266 g_mcs_max_dl := 3;
1267 f_pcuvty_set_allowed_cs_mcs();
1268 f_pcuvty_set_link_quality_ranges();
1269
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001270 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 +01001271}
1272
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001273/* Verify PCU drops TBF after some time of inactivity. */
1274testcase TC_t3169() runs on RAW_PCU_Test_CT {
1275 var PCUIF_info_ind info_ind;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001276 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001277 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001278 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001279
1280 /* Initialize NS/BSSGP side */
1281 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001282 /* Initialize GPRS MS side */
1283 f_init_gprs_ms();
1284 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001285
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001286 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001287 /* Set timer to 1 sec (default 5) to speedup test: */
1288 info_ind.t3169 := 1;
1289
1290 /* Initialize the PCU interface abstraction */
1291 f_init_raw(testcasename(), info_ind);
1292
1293 /* Establish BSSGP connection to the PCU */
1294 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001295 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001296
1297 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001298 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001299
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02001300 /* Send one UL block (with TLLI since we are in One-Phase Access
1301 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001302 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 1, with_tlli := true)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001303 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001304 /* UL block should NOT be received in SGSN, since we didn't get CV=0 */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001305
1306 /* Wait until T3169 fires (plus 1 extra sec to make sure) */
1307 f_sleep(int2float(info_ind.t3169) + 1.0);
1308
1309 /* Send an UL block once again, the TBF should be gone by now so no ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001310 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 0)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001311 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001312
1313 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001314}
1315
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001316/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1317 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1318 * T3169. See OS#5033 */
1319testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1320 var PCUIF_info_ind info_ind;
1321 var template (value) TsTrxBtsNum nr;
1322 var BTS_PDTCH_Block data_msg;
1323 var GprsMS ms;
1324 var uint3_t rx_usf;
1325 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1326 var integer n3101 := 0;
1327 timer T_3169 := 1.0;
1328
1329 /* Initialize NS/BSSGP side */
1330 f_init_bssgp();
1331 /* Initialize GPRS MS side */
1332 f_init_gprs_ms();
1333 ms := g_ms[0]; /* We only use first MS in this test */
1334
1335 /* Initialize the PCU interface abstraction */
1336 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1337 info_ind.n3101 := N3101_MAX;
1338 info_ind.t3169 := 1;
1339 f_init_raw(testcasename(), info_ind);
1340
1341 /* Establish BSSGP connection to the PCU */
1342 f_bssgp_establish();
1343 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1344
1345 /* Establish UL TBF */
1346 f_ms_establish_ul_tbf(ms);
1347
1348 /* Now we wait for PCU to transmit our USF */
1349 nr := ts_TsTrxBtsNum;
1350 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1351 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1352 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1353 block_nr := nr.blk_nr));
1354
1355 alt {
1356 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1357 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1358 ?)) -> value data_msg {
1359 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1360 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1361 f_shutdown(__BFILE__, __LINE__);
1362 }
1363
1364 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1365 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1366 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1367 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001368 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1369 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001370 f_shutdown(__BFILE__, __LINE__);
1371 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001372 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001373 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1374 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1375 if (not T_3169.running) {
1376 log("T3169 started");
1377 T_3169.start;
1378 }
1379 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1380 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1381 f_shutdown(__BFILE__, __LINE__);
1382 } else {
1383 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1384 }
1385 nr := ts_TsTrxBtsNum;
1386 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1387 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1388 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1389 block_nr := nr.blk_nr));
1390 repeat;
1391 }
1392 [] T_3169.timeout {
1393 log("T_3169 expired");
1394 /* Done in alt */
1395 }
1396 [] BTS.receive {
1397 setverdict(fail, "Unexpected BTS message");
1398 f_shutdown(__BFILE__, __LINE__);
1399 }
1400 }
1401
1402 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1403 /* USFs as per previous TBF since they were freed at expiration time: */
1404 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1405 var uint5_t old_tfi := ms.ul_tbf.tfi;
1406 f_ms_establish_ul_tbf(ms);
1407 if (old_tfi != ms.ul_tbf.tfi) {
1408 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1409 f_shutdown(__BFILE__, __LINE__);
1410 }
1411 for (var integer i := 0; i < 8; i := i +1) {
1412 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1413 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1414 f_shutdown(__BFILE__, __LINE__);
1415 }
1416 }
1417
1418 f_shutdown(__BFILE__, __LINE__, final := true);
1419}
1420
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001421/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1422 * point the TBF is no longer available. In order to get to start of T3191, we
1423 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1424 * until TBF release procedure starts after draining DL queue. */
1425testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1426 var PCUIF_info_ind info_ind;
1427 var RlcmacDlBlock dl_block;
1428 var octetstring data1 := f_rnd_octstring(200);
1429 var octetstring data2 := f_rnd_octstring(10);
1430 var uint32_t dl_fn;
1431 var template (value) TsTrxBtsNum nr;
1432 var BTS_PDTCH_Block data_msg;
1433 var GprsMS ms;
1434
1435 /* Initialize NS/BSSGP side */
1436 f_init_bssgp();
1437 /* Initialize GPRS MS side */
1438 f_init_gprs_ms();
1439 ms := g_ms[0]; /* We only use first MS in this test */
1440
1441 /* Initialize the PCU interface abstraction */
1442 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1443 /* Set timer to 1 sec (default 5) to speedup test: */
1444 info_ind.t3191 := 1;
1445 f_init_raw(testcasename(), info_ind);
1446
1447 /* Establish BSSGP connection to the PCU */
1448 f_bssgp_establish();
1449 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1450
1451 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1452 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1453 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1454
1455 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1456 f_sleep(X2002);
1457
1458 while (true) {
1459 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1460
1461 /* Keep Ack/Nack description updated (except for last BSN) */
1462 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1463
1464 if (f_dl_block_rrbp_valid(dl_block)) {
1465 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1466 f_dl_block_ack_fn(dl_block, dl_fn));
1467 break;
1468 }
1469 }
1470
1471 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1472 nr := ts_TsTrxBtsNum;
1473 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1474 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1475 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1476 block_nr := nr.blk_nr));
1477 alt {
1478 [] as_ms_rx_ignore_dummy(ms, nr);
1479 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1480 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1481 ?)) -> value data_msg {
1482 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1483 log("Received FINAL_ACK");
1484 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1485 break;
1486 }
1487 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1488 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1489 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1490 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1491 }
1492 nr := ts_TsTrxBtsNum;
1493 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1494 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1495 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1496 block_nr := nr.blk_nr));
1497 repeat;
1498 }
1499 [] BTS.receive {
1500 setverdict(fail, "Unexpected BTS message");
1501 f_shutdown(__BFILE__, __LINE__);
1502 }
1503 }
1504
1505 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1506 to time out. We simply sleep instead of requesting blocks because
1507 otherwise retransmissions would keep restarting the timer. */
1508 f_sleep(int2float(info_ind.t3191));
1509
1510 /* The TBF should be freed now, so new data should trigger an Assignment: */
1511 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1512 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1513
1514 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1515 f_sleep(X2002);
1516 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1517 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1518 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1519 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1520 f_dl_block_ack_fn(dl_block, dl_fn));
1521
1522 f_shutdown(__BFILE__, __LINE__, final := true);
1523}
1524
1525/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1526testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1527 var PCUIF_info_ind info_ind;
1528 var RlcmacDlBlock dl_block;
1529 var octetstring data1 := f_rnd_octstring(1400);
1530 var octetstring data2 := f_rnd_octstring(10);
1531 var uint32_t dl_fn;
1532 var GprsMS ms;
1533
1534 /* Initialize NS/BSSGP side */
1535 f_init_bssgp();
1536 /* Initialize GPRS MS side */
1537 f_init_gprs_ms();
1538 ms := g_ms[0]; /* We only use first MS in this test */
1539
1540 /* Initialize the PCU interface abstraction */
1541 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1542 /* Set timer to 1 sec (default 5) to speedup test: */
1543 info_ind.t3191 := 1;
1544 f_init_raw(testcasename(), info_ind);
1545
1546 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1547
1548 /* Establish BSSGP connection to the PCU */
1549 f_bssgp_establish();
1550 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1551
1552 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1553 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1554 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1555
1556 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1557 f_sleep(X2002);
1558
1559 /* Send enough DL data to at least be able to DL ACK once (excl the
1560 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1561 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1562 while (true) {
1563 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1564
1565 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1566 log("Received FINAL_ACK");
1567 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1568 break;
1569 }
1570
1571 /* Keep Ack/Nack description updated (except for last BSN) */
1572 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1573
1574 if (f_dl_block_rrbp_valid(dl_block)) {
1575 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1576 f_dl_block_ack_fn(dl_block, dl_fn));
1577 }
1578 }
1579
1580 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1581 to time out. We simply sleep instead of requesting blocks because
1582 otherwise retransmissions would keep restarting the timer. */
1583 f_sleep(int2float(info_ind.t3191));
1584
1585 /* The TBF should be freed now, so new data should trigger an Assignment: */
1586 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1587 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1588
1589 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1590 f_sleep(X2002);
1591 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1592 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1593 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1594 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1595 f_dl_block_ack_fn(dl_block, dl_fn));
1596
1597 f_shutdown(__BFILE__, __LINE__, final := true);
1598}
1599
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001600/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1601 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1602 * T3193) after DL TBF release */
1603testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001604 var RlcmacDlBlock dl_block;
1605 var octetstring data := f_rnd_octstring(10);
1606 var boolean ok;
1607 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001608 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001609 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001610 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1611
1612 /* Initialize NS/BSSGP side */
1613 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001614 /* Initialize GPRS MS side */
1615 f_init_gprs_ms();
1616 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001617
1618 /* Initialize the PCU interface abstraction */
1619 f_init_raw(testcasename());
1620
1621 /* Establish BSSGP connection to the PCU */
1622 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001623 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001624
1625 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001626 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1627 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001628
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001629 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1630 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001631 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001632
1633 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001634 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1635 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1636 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001637
1638 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001639 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001640 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001641 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001642 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001643
1644 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001645
1646 /* 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 +07001647 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001648 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1649 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1650 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001651
1652 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001653}
1654
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001655/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1656 freed and no longer available. Trigger it by sending DL blocks and never DL
1657 ACKing the data (which are requested through RRBP) */
1658testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1659 var PCUIF_info_ind info_ind;
1660 var RlcmacDlBlock dl_block;
1661 var octetstring data1 := f_rnd_octstring(1000);
1662 var octetstring data2 := f_rnd_octstring(10);
1663 var uint32_t dl_fn;
1664 var template (value) TsTrxBtsNum nr;
1665 var BTS_PDTCH_Block data_msg;
1666 var GprsMS ms;
1667 const integer N3105_MAX := 2;
1668 var integer N3105 := 0;
1669 timer T_3195 := 1.0;
1670 var integer num_poll_recv := 0;
1671
1672 /* Initialize NS/BSSGP side */
1673 f_init_bssgp();
1674 /* Initialize GPRS MS side */
1675 f_init_gprs_ms();
1676 ms := g_ms[0]; /* We only use first MS in this test */
1677
1678 /* Initialize the PCU interface abstraction */
1679 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1680 /* Speedup test: */
1681 info_ind.n3105 := N3105_MAX;
1682 info_ind.t3195 := 1;
1683 f_init_raw(testcasename(), info_ind);
1684
1685 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1686 * MS and retransmitted after the TBF is released and later on created
1687 * (because the MS is reused) */
1688 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1689
1690 /* Establish BSSGP connection to the PCU */
1691 f_bssgp_establish();
1692 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1693
1694 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1695 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1696 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1697
1698 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1699 f_sleep(X2002);
1700
1701 /* Now we go on receiving DL data and not answering RRBP: */
1702 nr := ts_TsTrxBtsNum;
1703 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1704 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1705 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1706 block_nr := nr.blk_nr));
1707 alt {
1708 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1709 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1710 tr_RLCMAC_DATA)) -> value data_msg {
1711 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1712 if (num_poll_recv == 0) {
1713 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1714 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1715 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1716 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1717 } else {
1718 log("Ignoring RRBP ", num_poll_recv);
1719 N3105 := N3105 + 1;
1720 }
1721 num_poll_recv := num_poll_recv + 1;
1722 }
1723
1724 nr := ts_TsTrxBtsNum;
1725 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1726 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1727 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1728 block_nr := nr.blk_nr));
1729 repeat;
1730 }
1731 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
1732 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
1733 */
1734 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1735 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1736 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1737 if (not T_3195.running) {
1738 T_3195.start;
1739 /* We even send some new data, nothing should be sent to MS */
1740 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1741 }
1742 nr := ts_TsTrxBtsNum;
1743 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1744 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1745 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1746 block_nr := nr.blk_nr));
1747 repeat;
1748 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001749 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001750 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001751 /* Done in alt, wait for pending RTS initiated previously in
1752 * above case before continuing (expect /* Dummy block): */
1753 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1754 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1755 tr_RLCMAC_DUMMY_CTRL));
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001756 }
1757 [] BTS.receive {
1758 setverdict(fail, "Unexpected BTS message");
1759 f_shutdown(__BFILE__, __LINE__);
1760 }
1761 }
1762
1763 /* after T_3195 timeout, TBF is released */
1764 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1765 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1766
1767 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1768 f_sleep(X2002);
1769 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1770
1771 /* ACK the DL block */
1772 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1773 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1774 f_dl_block_ack_fn(dl_block, dl_fn));
1775
1776 f_shutdown(__BFILE__, __LINE__, final := true);
1777}
1778
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001779/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
1780testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001781 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001782 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001783 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001784 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001785
1786 /* Initialize NS/BSSGP side */
1787 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001788 /* Initialize GPRS MS side */
1789 f_init_gprs_ms();
1790 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001791
1792 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001793 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001794
1795 /* Establish BSSGP connection to the PCU */
1796 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001797 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001798
1799 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001800 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001801
1802 /* Send one UL block (with TLLI since we are in One-Phase Access
1803 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001804 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001805 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
1806 f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true)
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001807 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1808 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001809 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001810
1811 /* Send enough blocks to test whole procedure: Until Nth block
1812 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
1813 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001814 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001815 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1816 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001817 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001818
1819 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001820 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 +07001821
1822 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001823}
1824
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001825/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
1826testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
1827 var RlcmacDlBlock dl_block;
1828 var uint32_t dl_fn, sched_fn;
1829 var octetstring payload;
1830 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001831 var template (value) LlcBlockHdr blk_hdr;
1832 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001833 var integer blk_len;
1834 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001835 var GprsMS ms;
1836
1837 /* Initialize NS/BSSGP side */
1838 f_init_bssgp();
1839 /* Initialize GPRS MS side */
1840 f_init_gprs_ms();
1841 ms := g_ms[0]; /* We only use first MS in this test */
1842
1843 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001844 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001845
1846 /* Establish BSSGP connection to the PCU */
1847 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001848 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001849
1850 /* Establish an Uplink TBF */
1851 f_ms_establish_ul_tbf(ms);
1852
1853 /* Send one UL block (with TLLI since we are in One-Phase Access
1854 contention resoultion) and make sure it is ACKED fine. */
1855 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001856 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1857 more := false, e := true);
1858 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001859 /* 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 +01001860 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
1861 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001862 cv := 15,
1863 bsn := ms.ul_tbf.bsn,
1864 blocks := blocks,
1865 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001866 f_ultbf_inc_bsn(ms.ul_tbf);
1867 f_ms_tx_ul_block(ms, ul_data);
1868
1869 /* ACK and check it was received fine */
1870 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1871 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1872 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1873 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001874 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 +02001875
1876 /* Test sending LLC PDUS of incrementing size */
1877 var integer max_size := 49;
1878 for (var integer i := 1; i <= max_size; i := i + 1) {
1879 var integer cv;
1880 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
1881 log("Sending DATA.ind with LLC payload size ", i);
1882 if (i < max_size - g_bs_cv_max) {
1883 cv := 15;
1884 } else {
1885 cv := max_size - i;
1886 }
1887
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001888 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
1889 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001890 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001891 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1892 more := false, e := true);
1893 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001894 /* 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 +01001895 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
1896 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001897 cv := cv,
1898 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001899 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001900 f_ultbf_inc_bsn(ms.ul_tbf);
1901 f_ms_tx_ul_block(ms, ul_data);
1902
1903 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001904 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 +02001905
1906 /* we will receive UL ACK/NACK from time to time, handle it. */
1907 f_rx_rlcmac_dl_block(dl_block, dl_fn);
1908 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1909 continue;
1910 }
1911 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
1912 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1913 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1914 f_shutdown(__BFILE__, __LINE__);
1915 }
1916
1917 log("Rx Packet Uplink ACK / NACK");
1918 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
1919 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1920 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1921 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07001922
1923 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001924}
1925
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001926function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
1927 var octetstring payload;
1928 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001929 var template (value) LlcBlockHdr blk_hdr;
1930 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001931 var integer block_len, max_valid_data_len;
1932 timer T;
1933
1934 block_len := f_rlcmac_cs_mcs2block_len(cs);
1935 /* We need to send with TLLI since we are in One-Phase Access Contenion
1936 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
1937 * indicator, -1 for spare bits octet at the end */
1938 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
1939 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 +07001940 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1941 more := false, e := true);
1942 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001943 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
1944 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001945 cv := cv,
1946 bsn := ms.ul_tbf.bsn,
1947 blocks := blocks,
1948 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001949 f_ultbf_inc_bsn(ms.ul_tbf);
1950 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
1951
1952 T.start(0.5);
1953 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02001954 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001955 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
1956 f_shutdown(__BFILE__, __LINE__);
1957 }
1958 [] T.timeout {
1959 setverdict(pass);
1960 }
1961 }
1962}
1963/* Verify PCU finds out incorrectly formated RLC block and discards it. This
1964 blocks intentionally contain last byte of data placed in last byte of RLC
1965 containing padding/spare bits, which is incorrect. Spare bits exist and are
1966 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
1967 discounting padding in octet" */
1968testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
1969 var GprsMS ms;
1970 var integer block_len, max_valid_data_len;
1971
1972 /* Initialize NS/BSSGP side */
1973 f_init_bssgp();
1974 /* Initialize GPRS MS side */
1975 f_init_gprs_ms();
1976 ms := g_ms[0]; /* We only use first MS in this test */
1977
1978 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001979 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001980
1981 /* Establish BSSGP connection to the PCU */
1982 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001983 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001984
1985 /* Establish an Uplink TBF */
1986 f_ms_establish_ul_tbf(ms);
1987
1988 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
1989 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
1990 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
1991
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07001992 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001993}
1994
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001995/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
1996 * answered, so TBFs for uplink and later for downlink are created.
1997 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001998private 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 +02001999 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002000 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002001 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002002 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002003 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002004
2005 /* Initialize NS/BSSGP side */
2006 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002007 /* Initialize GPRS MS side */
2008 f_init_gprs_ms();
2009 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002010
2011 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002012 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002013
2014 /* Establish BSSGP connection to the PCU */
2015 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002016 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002017
2018 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002019 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002020
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002021 /* Send one UL block (with TLLI since we are in One-Phase Access
2022 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002023 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002024 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2025 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002026 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002027
2028 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002029 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002030
2031 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002032 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2033 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002034
2035 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2036 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002037 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002038
2039 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002040 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2041 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2042 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002043
2044 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002045}
2046
2047/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2048 * answered, so TBFs for uplink and later for downlink are created.
2049 */
2050testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002051 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002052 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002053}
2054
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002055/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2056 * answered, so TBFs for uplink and later for downlink are created.
2057 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002058private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2059 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002060 template (present) CodingScheme exp_ul_cs_mcs := ?,
2061 template (present) CodingScheme exp_dl_cs_mcs := ?)
2062runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002063 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002064 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002065 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002066 var uint32_t sched_fn;
2067 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002068 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002069 var GprsMS ms;
2070
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002071 /* Initialize NS/BSSGP side */
2072 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002073 /* Initialize GPRS MS side */
2074 f_init_gprs_ms();
2075 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002076
2077 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002078 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002079
2080 /* Establish BSSGP connection to the PCU */
2081 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002082 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002083
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002084 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2085 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 +02002086
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002087 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2088 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 +02002089 f_shutdown(__BFILE__, __LINE__);
2090 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002091
2092 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2093 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002094 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002095
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002096 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002097 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 +02002098
2099 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002100 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002101
2102 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002103 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002104 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2105 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002106 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002107 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002108 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002109
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002110 /* PCU acks the UL data after having received CV=0) */
2111 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2112
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002113 /* 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 +02002114 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 +02002115
2116 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002117 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2118 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 +02002119 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002120
2121 f_shutdown(__BFILE__, __LINE__, final := true);
2122}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002123
2124testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002125 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2126 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002127
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002128 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 Pedrol42acafc2020-05-14 15:18:38 +02002129}
2130
2131testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002132 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2133 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002134
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002135 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 Pedrol8dd59fb2020-04-29 15:08:16 +02002136}
2137
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002138testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2139 /* Configure PCU to force two phase access */
2140 g_force_two_phase_access := true;
2141
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002142 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002143 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002144
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002145 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 Pedrol0c0bf872020-05-14 15:50:49 +02002146}
2147
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002148/* Test scenario where SGSN wants to send some data against MS and it is
2149 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2150 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002151private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2152 template (present) CodingScheme exp_cs_mcs := ?)
2153runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002154 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002155 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002156 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002157 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002158 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002159
2160 /* Initialize NS/BSSGP side */
2161 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002162 /* Initialize GPRS MS side */
2163 f_init_gprs_ms();
2164 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002165
2166 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002167 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002168
2169 /* Establish BSSGP connection to the PCU */
2170 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002171 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002172
2173 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002174 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2175 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002176
2177 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2178 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002179 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002180
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002181 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002182 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2183 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 +02002184 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002185
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002186 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002187 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002188
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002189 /* Send one UL block (with TLLI since we are in One-Phase Access
2190 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002191 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002192 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2193 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002194 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002195
2196 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002197 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002198
2199 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002200}
2201
2202testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002203 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002204 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2205}
2206
2207/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2208/* information about the MS */
2209testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002210 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002211 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002212}
2213
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002214/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2215 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2216 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2217 * be transferred).
2218 */
2219testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002220 var RlcmacDlBlock dl_block;
2221 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002222 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002223 var octetstring total_payload;
2224 var octetstring payload;
2225 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002226 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002227 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002228 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002229
2230 /* Initialize NS/BSSGP side */
2231 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002232 /* Initialize GPRS MS side */
2233 f_init_gprs_ms();
2234 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002235
2236 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002237 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002238
2239 /* Establish BSSGP connection to the PCU */
2240 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002241 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002242
2243 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002244 f_ms_establish_ul_tbf(ms);
2245 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002246
2247 /* Send one UL block (with TLLI since we are in One-Phase Access
2248 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002249 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 Pedrol4f7b8fd2020-05-18 18:28:17 +02002250 f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002251
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002252 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2253 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002254 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002255 total_payload := payload;
2256
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002257 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2258
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002259 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002260 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002261 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002262 total_payload := total_payload & payload;
2263
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002264 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002265 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002266 total_payload := total_payload & payload;
2267
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002268 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002269 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 +02002270 total_payload := total_payload & lost_payload;
2271
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002272 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002273 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002274 total_payload := total_payload & payload;
2275
2276 /* 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 +02002277 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002278
2279 /* On CV=0, we'll receive a UL ACK asking about missing block */
2280 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2281 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002282 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2283 tfi := tfi,
2284 cv := 15,
2285 bsn := 3,
2286 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002287 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002288
2289 /* Now final ack is recieved */
2290 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2291 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002292 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002293
2294 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002295 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 +07002296
2297 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002298}
2299
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002300/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2301 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2302 * timeout occurs (specified by sent RRBP on DL block). */
2303testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002304 var RlcmacDlBlock dl_block;
2305 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002306 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002307 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002308
2309 /* Initialize NS/BSSGP side */
2310 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002311 /* Initialize GPRS MS side */
2312 f_init_gprs_ms();
2313 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002314
2315 /* Initialize the PCU interface abstraction */
2316 f_init_raw(testcasename());
2317
2318 /* Establish BSSGP connection to the PCU */
2319 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002320 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002321
2322 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002323 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2324 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002325
2326 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2327 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002328 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002329
2330 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2331 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2332 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002333 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002334
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002335 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2336 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002337 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002338
2339 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002340 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2341 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2342 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002343
2344 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002345}
2346
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002347/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2348testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2349 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2350 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002351 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002352 var RlcmacDlBlock dl_block;
2353 var uint32_t ack_fn;
2354 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002355 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002356 timer T := 5.0;
2357
2358 /* Initialize NS/BSSGP side */
2359 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002360 /* Initialize GPRS MS side */
2361 f_init_gprs_ms();
2362 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002363
2364 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002365 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002366
Daniel Willmann535aea62020-09-21 13:27:08 +02002367 f_statsd_reset();
2368
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002369 /* Establish BSSGP connection to the PCU */
2370 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002371 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002372
2373 /* 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);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002376
2377 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2378 f_sleep(X2002);
2379
2380 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2381 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002382 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002383
2384 /* TDMA frame number on which we are supposed to send the ACK */
2385 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2386
2387 /* SGSN sends more blocks during the indicated RRBP */
2388 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2389 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002390 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002391
2392 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2393
2394 /* Make sure this block has the same TFI as was assigned
2395 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002396 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002397 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2398 dl_block.data.mac_hdr.hdr_ext.tfi);
2399 f_shutdown(__BFILE__, __LINE__);
2400 }
2401
2402 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002403 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002404
2405 /* Break if this is the end of RRBP */
2406 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002407 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002408 break;
2409 }
2410 }
2411
2412 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002413 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 +07002414
2415 /* Make sure that the next block (after the Ack) is dummy */
2416 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2417
Daniel Willmann535aea62020-09-21 13:27:08 +02002418 var StatsDExpects expect := {
2419 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2420 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2421 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2422 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2423 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002424 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002425 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2426 };
2427 f_statsd_expect(expect);
2428
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002429 f_shutdown(__BFILE__, __LINE__, final := true);
2430}
2431
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002432/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2433 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2434 * Check "3GPP TS 44.060" Annex B. */
2435testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2436 var RlcmacDlBlock dl_block;
2437 var octetstring dataA := f_rnd_octstring(20);
2438 var octetstring dataB := f_rnd_octstring(13);
2439 var octetstring dataC := f_rnd_octstring(3);
2440 var octetstring dataD := f_rnd_octstring(12);
2441 var uint32_t sched_fn;
2442 var GprsMS ms;
2443 var template (value) RlcmacUlBlock ul_data;
2444
2445 /* Initialize NS/BSSGP side */
2446 f_init_bssgp();
2447 /* Initialize GPRS MS side */
2448 f_init_gprs_ms();
2449 ms := g_ms[0]; /* We only use first MS in this test */
2450
2451 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002452 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002453
2454 /* Establish BSSGP connection to the PCU */
2455 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002456 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002457
2458 /* Establish an Uplink TBF */
2459 f_ms_establish_ul_tbf(ms);
2460
2461 /* Summary of what's transmitted:
2462 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2463 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2464 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2465 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2466 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2467 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2468 */
2469
2470 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002471 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2472 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002473 cv := 3,
2474 bsn := ms.ul_tbf.bsn,
2475 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2476 tlli := ms.tlli);
2477 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2478 * RLCMAC block being sent. */
2479 ul_data.data.mac_hdr.e := true;
2480 f_ultbf_inc_bsn(ms.ul_tbf);
2481 f_ms_tx_ul_block(ms, ul_data);
2482
2483 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002484 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2485 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002486 cv := 2,
2487 bsn := ms.ul_tbf.bsn,
2488 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2489 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2490 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2491 },
2492 tlli := ms.tlli);
2493 f_ultbf_inc_bsn(ms.ul_tbf);
2494 f_ms_tx_ul_block(ms, ul_data);
2495
2496 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002497 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 +02002498
2499 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002500 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2501 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002502 cv := 1,
2503 bsn := ms.ul_tbf.bsn,
2504 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2505 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2506 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2507 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2508 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2509 },
2510 tlli := ms.tlli);
2511 f_ultbf_inc_bsn(ms.ul_tbf);
2512 f_ms_tx_ul_block(ms, ul_data);
2513
2514 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002515 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2516 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 +02002517
2518 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002519 ul_data := t_RLCMAC_UL_DATA_TLLI(
2520 cs := CS_1,
2521 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002522 cv := 0,
2523 bsn := ms.ul_tbf.bsn,
2524 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2525 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2526 },
2527 tlli := ms.tlli);
2528 f_ultbf_inc_bsn(ms.ul_tbf);
2529 f_ms_tx_ul_block(ms, ul_data);
2530
2531 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002532 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 +02002533
2534 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2535 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2536 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2537
2538 f_shutdown(__BFILE__, __LINE__, final := true);
2539}
2540
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002541/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2542 * ACK/NACK is not answered */
2543testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2544 var RlcmacDlBlock dl_block;
2545 var octetstring data1 := f_rnd_octstring(200);
2546 var octetstring data2 := f_rnd_octstring(10);
2547 var uint32_t dl_fn;
2548 var GprsMS ms;
2549 var template (value) TsTrxBtsNum nr;
2550 var BTS_PDTCH_Block data_msg;
2551
2552 /* Initialize NS/BSSGP side */
2553 f_init_bssgp();
2554 /* Initialize GPRS MS side */
2555 f_init_gprs_ms();
2556 ms := g_ms[0]; /* We only use first MS in this test */
2557
2558 /* Initialize the PCU interface abstraction */
2559 f_init_raw(testcasename())
2560
2561 /* Establish BSSGP connection to the PCU */
2562 f_bssgp_establish();
2563 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2564
2565 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2566 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2567 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2568
2569 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2570 f_sleep(X2002);
2571
2572 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2573 while (true) {
2574 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2575
2576 /* Keep Ack/Nack description updated (except for last BSN) */
2577 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2578
2579 if (f_dl_block_rrbp_valid(dl_block)) {
2580 /* Don't transmit DL ACK here on purpose ignore it */
2581 break;
2582 }
2583 }
2584
2585 /* PCU starts whole process again */
2586 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2587
2588 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2589 f_sleep(X2002);
2590
2591 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2592 /* DL data), after that we receive only DUMMY blocks so we are done */
2593 var boolean data_received := false;
2594 nr := ts_TsTrxBtsNum;
2595 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2596 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2597 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2598 block_nr := nr.blk_nr));
2599 alt {
2600 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2601 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2602 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2603 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2604 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2605 tr_RLCMAC_DATA)) -> value data_msg {
2606 data_received := true;
2607 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2608 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2609 log("Received FINAL_ACK");
2610 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2611 }
2612 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2613 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2614 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2615 }
2616 nr := ts_TsTrxBtsNum;
2617 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2618 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2619 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2620 block_nr := nr.blk_nr));
2621 repeat;
2622 }
2623 [] BTS.receive {
2624 setverdict(fail, "Unexpected BTS message");
2625 f_shutdown(__BFILE__, __LINE__);
2626 }
2627 }
2628
2629 f_shutdown(__BFILE__, __LINE__, final := true);
2630}
2631
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002632/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2633testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002634 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002635 var octetstring data := f_rnd_octstring(10);
2636 var PacketDlAssign dl_tbf_ass;
2637 var RlcmacDlBlock dl_block;
2638 var uint32_t poll_fn;
2639 var uint32_t sched_fn;
2640 var GprsMS ms;
2641 timer T := 5.0;
2642
2643 /* Initialize NS/BSSGP side */
2644 f_init_bssgp();
2645 /* Initialize GPRS MS side */
2646 f_init_gprs_ms();
2647 ms := g_ms[0]; /* We only use first MS in this test */
2648
2649 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002650 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2651 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002652
2653 /* Initialize the PCU interface abstraction */
2654 f_init_raw(testcasename(), info_ind);
2655
2656 /* Establish BSSGP connection to the PCU */
2657 f_bssgp_establish();
2658 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2659
2660 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2661 through PDCH (no multiblock assignment possible through PCH) */
2662 f_ms_establish_ul_tbf(ms);
2663
2664 /* Send one UL block (with TLLI since we are in One-Phase Access
2665 contention resoultion) and make sure it is ACKED fine */
2666 f_ms_tx_ul_data_block(ms, data, with_tlli := true, nr := f_ms_tx_TsTrxBtsNum(ms));
2667 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2668 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2669
2670 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2671 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2672 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2673 gprsextendeddynalloccap := '0'B
2674 };
2675 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2676 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2677 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2678 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2679 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2680 f_shutdown(__BFILE__, __LINE__);
2681 }
2682 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2683
2684 f_shutdown(__BFILE__, __LINE__, final := true);
2685}
2686
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002687testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002688 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002689 var RlcmacDlBlock dl_block;
2690 var octetstring data := f_rnd_octstring(10);
2691 var PollFnCtx pollctx;
2692 var uint32_t sched_fn;
2693 var GprsMS ms;
2694
2695 var MultislotCap_GPRS mscap_gprs := {
2696 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2697 gprsextendeddynalloccap := '0'B
2698 };
2699 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2700
2701
2702 /* Initialize NS/BSSGP side */
2703 f_init_bssgp();
2704 /* Initialize GPRS MS side */
2705 f_init_gprs_ms();
2706 ms := g_ms[0]; /* We only use first MS in this test */
2707
2708 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002709 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2710 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002711
2712 /* Initialize the PCU interface abstraction */
2713 f_init_raw(testcasename(), info_ind);
2714
2715 /* Establish BSSGP connection to the PCU */
2716 f_bssgp_establish();
2717 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2718
2719 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2720 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2721
2722 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
2723 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
2724
2725 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2726 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2727 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2728 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2729 f_shutdown(__BFILE__, __LINE__);
2730 }
2731 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2732
2733 f_shutdown(__BFILE__, __LINE__, final := true);
2734}
2735
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002736testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
2737 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
2738 var RlcmacDlBlock dl_block;
2739 var octetstring data := f_rnd_octstring(10);
2740 var PollFnCtx pollctx;
2741 var uint32_t sched_fn;
2742 var GprsMS ms;
2743
2744 var MultislotCap_GPRS mscap_gprs := {
2745 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2746 gprsextendeddynalloccap := '0'B
2747 };
2748 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2749
2750
2751 /* Initialize NS/BSSGP side */
2752 f_init_bssgp();
2753 /* Initialize GPRS MS side */
2754 f_init_gprs_ms();
2755 ms := g_ms[0]; /* We only use first MS in this test */
2756
2757 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002758 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2759 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002760
2761 /* Initialize the PCU interface abstraction */
2762 f_init_raw(testcasename(), info_ind);
2763
2764 /* Establish BSSGP connection to the PCU */
2765 f_bssgp_establish();
2766 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2767
2768 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2769 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2770
2771 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
2772 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
2773 f_shutdown(__BFILE__, __LINE__);
2774 }
2775
2776 f_shutdown(__BFILE__, __LINE__, final := true);
2777}
2778
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002779/* Test scenario where MS wants to request a new TBF once the current one is
2780 * ending, by means of sending a Packet Resource Request on ul slot provided by
2781 * last Pkt Ul ACK's RRBP.
2782 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
2783testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002784 var RlcmacDlBlock dl_block;
2785 var octetstring data := f_rnd_octstring(10);
2786 var uint32_t sched_fn;
2787 var uint32_t dl_fn;
2788 var template RlcmacDlBlock acknack_tmpl;
2789 var GprsMS ms;
2790
2791 /* Initialize NS/BSSGP side */
2792 f_init_bssgp();
2793 /* Initialize GPRS MS side */
2794 f_init_gprs_ms();
2795 ms := g_ms[0]; /* We only use first MS in this test */
2796
2797 /* Initialize the PCU interface abstraction */
2798 f_init_raw(testcasename());
2799
2800 /* Establish BSSGP connection to the PCU */
2801 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002802 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002803
2804 /* Establish an Uplink TBF */
2805 f_ms_establish_ul_tbf(ms);
2806
2807 /* Send one UL block (with TLLI since we are in One-Phase Access
2808 contention resoultion) and make sure it is ACKED fine */
2809 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
2810
2811 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002812 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002813
2814 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
2815 tr_UlAckNackGprs(ms.tlli,
2816 tr_AckNackDescription(final_ack := '1'B),
2817 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
2818 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2819
2820 /* TODO: verify TBF_EST and FinalACK are both '1' above */
2821
2822 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07002823 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 +07002824 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002825 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2826 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2827
2828 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2829 and make sure it is ACKED fine */
2830 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
2831
2832 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002833 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002834
2835 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2836 /* ACK the ACK */
2837 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2838
2839 f_shutdown(__BFILE__, __LINE__, final := true);
2840}
2841
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002842/* Test CS paging over the BTS<->PCU socket.
2843 * 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.
2844 * Paging should be send on the PACCH.
2845 *
2846 * 1. Send a Paging Request over PCU socket.
2847 * 2. Send a Ready-To-Send message over PCU socket
2848 * 3. Expect a Paging Frame
2849 */
2850testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002851 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002852 var MobileIdentityLV mi;
2853 var octetstring mi_enc_lv;
2854 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002855 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002856
2857 /* Initialize NS/BSSGP side */
2858 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002859 /* Initialize GPRS MS side */
2860 f_init_gprs_ms();
2861 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002862
2863 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002864 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002865
2866 /* Establish BSSGP connection to the PCU */
2867 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002868 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002869
2870 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002871 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002872
2873 /* build mobile Identity */
2874 mi := valueof(ts_MI_IMSI_LV(imsi));
2875 mi_enc_lv := enc_MobileIdentityLV(mi);
2876 /* Send paging request */
2877 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
2878 sapi :=PCU_IF_SAPI_PDTCH));
2879
2880 /* Receive it on BTS side towards MS */
2881 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2882
2883 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002884 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
2885 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2886 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2887 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002888
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002889 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002890}
2891
2892/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
2893 */
2894private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2895runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002896 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002897 var hexstring imsi := f_gen_imsi(42);
2898 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002899 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002900
2901 /* Initialize NS/BSSGP side */
2902 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002903 /* Initialize GPRS MS side */
2904 f_init_gprs_ms();
2905 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002906
2907 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002908 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002909
2910 /* Establish BSSGP connection to the PCU */
2911 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002912 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002913
2914 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002915 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002916
2917 /* Send paging request with or without TMSI */
2918 if (use_ptmsi) {
2919 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
2920 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
2921 } else {
2922 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
2923 }
2924
2925 /* Receive it on BTS side towards MS */
2926 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2927
2928 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002929 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002930 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002931 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
2932 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
2933 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002934 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002935 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2936 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2937 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002938 }
2939
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002940 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002941}
2942
2943testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
2944 f_tc_paging_cs_from_sgsn(0, true);
2945}
2946
2947testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
2948 f_tc_paging_cs_from_sgsn(0);
2949}
2950
2951testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02002952 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002953}
2954
2955/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
2956 */
2957private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2958runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002959 var integer imsi_suff_tx := 423;
2960 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002961 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002962
2963 /* Initialize NS/BSSGP side */
2964 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002965 /* Initialize GPRS MS side */
2966 f_init_gprs_ms();
2967 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002968
2969 /* Initialize the PCU interface abstraction */
2970 f_init_raw(testcasename());
2971
2972 /* Establish BSSGP connection to the PCU */
2973 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002974 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002975
2976 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
2977 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
2978 if (use_ptmsi) {
2979 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
2980 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
2981 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
2982 } else {
2983 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
2984 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
2985 }
2986
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002987 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002988}
2989
2990testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
2991 f_tc_paging_ps_from_sgsn(0, true);
2992}
2993
2994testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
2995 f_tc_paging_ps_from_sgsn(0);
2996}
2997
2998testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02002999 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003000}
3001
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003002/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3003testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3004 var RlcmacDlBlock dl_block;
3005 var octetstring data := f_rnd_octstring(10);
3006 var uint32_t sched_fn;
3007 var uint32_t dl_fn;
3008 var GprsMS ms;
3009
3010 /* Initialize NS/BSSGP side */
3011 f_init_bssgp();
3012 /* Initialize GPRS MS side */
3013 f_init_gprs_ms();
3014 ms := g_ms[0]; /* We only use first MS in this test */
3015
3016 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003017 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003018
Daniel Willmann535aea62020-09-21 13:27:08 +02003019 f_statsd_reset();
3020
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003021 /* Establish BSSGP connection to the PCU */
3022 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003023 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003024
3025 /* Establish an Uplink TBF */
3026 f_ms_establish_ul_tbf(ms);
3027
3028 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
3029 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
3030 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3031 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3032 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3033
3034 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003035 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003036
3037 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3038 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3039 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3040
3041 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3042 f_sleep(X2002);
3043 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3044
3045 /* ACK the DL block */
3046 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3047 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3048 f_dl_block_ack_fn(dl_block, dl_fn));
3049
Daniel Willmann535aea62020-09-21 13:27:08 +02003050 var StatsDExpects expect := {
3051 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3052 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3053 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3054 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003055 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003056 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003057 };
3058 f_statsd_expect(expect);
3059
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003060 f_shutdown(__BFILE__, __LINE__, final := true);
3061}
3062
3063/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3064testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3065 var RlcmacDlBlock dl_block;
3066 var octetstring data := f_rnd_octstring(10);
3067 var uint32_t sched_fn;
3068 var uint32_t dl_fn;
3069 var GprsMS ms;
3070
3071 /* Initialize NS/BSSGP side */
3072 f_init_bssgp();
3073 /* Initialize GPRS MS side */
3074 f_init_gprs_ms();
3075 ms := g_ms[0]; /* We only use first MS in this test */
3076
3077 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003078 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003079
3080 /* Establish BSSGP connection to the PCU */
3081 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003082 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003083
3084 /* Establish an Uplink TBF */
3085 f_ms_establish_ul_tbf(ms);
3086
3087 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
3088 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
3089 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3090 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3091 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3092
3093 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003094 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003095
3096 /* Now SGSN sends some DL data with an invalid IMSI */
3097 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3098
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003099 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003100
3101 /* TODO: make sure no data is sent over PCU -> MS */
3102
3103 f_shutdown(__BFILE__, __LINE__, final := true);
3104}
3105
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003106private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3107 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3108 var octetstring data := f_rnd_octstring(6);
3109 var RlcmacDlBlock dl_block;
3110 var GprsMS ms;
3111 var uint32_t fn;
3112
3113 /* Initialize NS/BSSGP side */
3114 f_init_bssgp();
3115 /* Initialize GPRS MS side */
3116 f_init_gprs_ms();
3117 ms := g_ms[0]; /* We only use first MS in this test */
3118
3119 /* Initialize the PCU interface abstraction */
3120 f_init_raw(testcasename());
3121
3122 /* Establish BSSGP connection to the PCU */
3123 f_bssgp_establish();
3124 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3125
3126 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3127 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3128 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3129
3130 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3131 f_sleep(X2002);
3132
3133 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3134 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3135
3136 if (ischosen(dl_block.data_egprs)) {
3137 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3138 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3139 f_shutdown(__BFILE__, __LINE__);
3140 }
3141 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3142 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3143 f_shutdown(__BFILE__, __LINE__);
3144 }
3145 if (not match(dl_block.data_egprs.blocks[1].payload,
3146 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3147 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3148 f_shutdown(__BFILE__, __LINE__);
3149 }
3150 } else if (lengthof(dl_block.data.blocks) > 1) {
3151 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3152 f_shutdown(__BFILE__, __LINE__);
3153 }
3154
3155 f_shutdown(__BFILE__, __LINE__, final := true);
3156}
3157
3158/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3159 * containing llc data. See OS#4849 */
3160testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3161 f_tc_dl_data_no_llc_ui_dummy(omit);
3162}
3163
3164/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3165 * containing llc data. See OS#4849 */
3166testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003167 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003168}
3169
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003170private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003171 template GsmRrMessage t_imm_ass := ?,
3172 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003173runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003174 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003175 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003176
3177 ra11 := enc_EGPRSPktChRequest2uint(req);
3178 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3179
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003180 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003181 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003182 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003183 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003184 }
3185
3186 setverdict(pass);
3187}
3188
3189testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3190 var template GsmRrMessage imm_ass;
3191 var template IaRestOctets rest;
3192 var template EgprsUlAss ul_ass;
3193
3194 /* Initialize the PCU interface abstraction */
3195 f_init_raw(testcasename());
3196
3197 var EGPRSPktChRequest req := {
3198 /* NOTE: other fields are set in the loop */
3199 signalling := { tag := '110011'B }
3200 };
3201
3202 for (var integer i := 0; i < 6; i := i + 1) {
3203 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3204 req.signalling.random_bits := ext_ra;
3205
3206 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3207 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3208 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3209 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3210
3211 f_TC_egprs_pkt_chan_req(req, imm_ass);
3212 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003213
3214 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003215}
3216
3217testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3218 var template GsmRrMessage imm_ass;
3219 var template IaRestOctets rest;
3220 var template EgprsUlAss ul_ass;
3221
3222 /* Initialize the PCU interface abstraction */
3223 f_init_raw(testcasename());
3224
3225 var EGPRSPktChRequest req := {
3226 /* NOTE: other fields are set in the loop */
3227 one_phase := { tag := '0'B }
3228 };
3229
3230 for (var integer i := 0; i < 6; i := i + 1) {
3231 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3232 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3233 var BIT2 priority := substr(ext_ra, 0, 2);
3234 var BIT3 rand := substr(ext_ra, 2, 3);
3235
3236 req.one_phase.multislot_class := mslot_class;
3237 req.one_phase.priority := priority;
3238 req.one_phase.random_bits := rand;
3239
3240 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3241 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3242 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3243 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3244
3245 f_TC_egprs_pkt_chan_req(req, imm_ass);
3246 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003247
3248 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003249}
3250
3251testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3252 var template GsmRrMessage imm_ass;
3253 var template IaRestOctets rest;
3254 var template EgprsUlAss ul_ass;
3255
3256 /* Initialize the PCU interface abstraction */
3257 f_init_raw(testcasename());
3258
3259 var EGPRSPktChRequest req := {
3260 /* NOTE: other fields are set in the loop */
3261 two_phase := { tag := '110000'B }
3262 };
3263
3264 for (var integer i := 0; i < 6; i := i + 1) {
3265 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3266 var BIT2 priority := substr(ext_ra, 0, 2);
3267 var BIT3 rand := substr(ext_ra, 2, 3);
3268
3269 req.two_phase.priority := priority;
3270 req.two_phase.random_bits := rand;
3271
3272 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3273 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3274 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3275 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3276
3277 f_TC_egprs_pkt_chan_req(req, imm_ass);
3278 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003279
3280 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003281}
3282
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003283private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3284 template IARRestOctets rest := ?,
3285 PCUIF_BurstType bt := BURST_TYPE_1)
3286runs on RAW_PCU_Test_CT {
3287 var template ReqRefWaitInd tr_ref;
3288 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003289
3290 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3291 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3292 ra := bit2int(ra11), is_11bit := 1,
3293 burst_type := bt, fn := fn,
3294 arfcn := 871));
3295
3296 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003297 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003298
3299 /* Just to have a short-name reference to the actual message */
3300 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3301
3302 /* Make sure that Request Reference list contains at least one entry
3303 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
3304 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn));
3305 if (not match(iar.payload, { *, tr_ref, * })) {
3306 setverdict(fail, "Request Reference list does not match");
3307 f_shutdown(__BFILE__, __LINE__);
3308 }
3309
3310 /* Match Feature Indicator (must indicate PS domain) */
3311 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3312 setverdict(fail, "Feature Indicator does not match");
3313 f_shutdown(__BFILE__, __LINE__);
3314 }
3315
3316 /* Match IAR Rest Octets */
3317 if (not match(iar.rest_octets, rest)) {
3318 setverdict(fail, "IAR Rest Octets does not match: ",
3319 iar.rest_octets, " vs expected ", rest);
3320 f_shutdown(__BFILE__, __LINE__);
3321 }
3322
3323 setverdict(pass);
3324}
3325
3326/* Verify the contents of RR Immediate Assignment Reject message and its
3327 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3328testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3329 var template IARRestOctets rest;
3330 var BIT5 ext_ra;
3331
3332 /* Initialize the PCU interface abstraction */
3333 f_init_raw(testcasename());
3334
3335 for (var integer i := 0; i < 6; i := i + 1) {
3336 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3337 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3338
3339 /* Intentionally incorrect message (see table 11.2.5a.2) */
3340 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3341 }
3342
3343 f_shutdown(__BFILE__, __LINE__, final := true);
3344}
3345
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003346/* At the moment, the IUT does not support any emergency services. Make sure
3347 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3348testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3349 var template IARRestOctets rest;
3350 var BIT5 ext_ra;
3351 var BIT11 ra11;
3352
3353 /* Initialize the PCU interface abstraction */
3354 f_init_raw(testcasename());
3355
3356 var EGPRSPktChRequest req := {
3357 /* NOTE: other fields are set in the loop */
3358 emergency := { tag := '110111'B }
3359 };
3360
3361 for (var integer i := 0; i < 6; i := i + 1) {
3362 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3363 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3364
3365 req.emergency.random_bits := ext_ra;
3366 ra11 := enc_EGPRSPktChRequest2bits(req);
3367
3368 /* Intentionally incorrect message (see table 11.2.5a.2) */
3369 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3370 }
3371
3372 f_shutdown(__BFILE__, __LINE__, final := true);
3373}
3374
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003375/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3376testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003377 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003378 var template IARRestOctets rest;
3379 var BIT11 ra11;
3380
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003381 info_ind := valueof(ts_PCUIF_INFO_default);
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003382
3383 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003384 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3385 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003386
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003387 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003388 f_init_raw(testcasename(), info_ind);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003389
3390 var EGPRSPktChRequest req := {
3391 one_phase := {
3392 tag := '0'B,
3393 multislot_class := '10101'B,
3394 priority := '01'B,
3395 random_bits := '101'B
3396 }
3397 };
3398
3399 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3400 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3401 for (var integer i := 0; i < 7; i := i + 1) {
3402 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3403 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3404 }
3405
3406 ra11 := enc_EGPRSPktChRequest2bits(req);
3407 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3408
3409 /* At this point, the IUT should run out of free USFs */
3410 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
3411
3412 f_shutdown(__BFILE__, __LINE__, final := true);
3413}
3414
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003415/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003416private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003417return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003418 /* Pick a random MA length in range 2 .. max_ma_len */
3419 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
3420
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003421 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
3422 hsn := f_rnd_int(63),
3423 maio := f_rnd_int(63),
3424 ma := f_rnd_bitstring(ma_len));
3425}
3426
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003427private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
3428 in GsmRrMessage rr_msg)
3429{
3430 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003431 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003432
3433 var template PacketChannelDescription tr_pkt_chan_desc := {
3434 channel_Type_spare := ?,
3435 tn := ?,
3436 tsc := ts.tsc,
3437 presence := '1'B,
3438 zero := omit,
3439 one := {
3440 maio := ts.maio,
3441 hsn := ts.hsn
3442 }
3443 };
3444
3445 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
3446 setverdict(fail, "Packet Channel Description does not match: ",
3447 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
3448 }
3449
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003450 /* Mobile Allocation is expected to be octet-aligned */
3451 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
3452 var template MobileAllocationLV tr_ma := {
3453 len := ma_oct_len, /* in bytes */
3454 ma := substr(ts.ma, 0, ma_oct_len * 8)
3455 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003456
3457 if (not match(ia.mobile_allocation, tr_ma)) {
3458 setverdict(fail, "Mobile Allocation does not match: ",
3459 ia.mobile_allocation, " vs ", tr_ma);
3460 }
3461
3462 setverdict(pass);
3463}
3464
3465/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
3466testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003467 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003468 var GprsMS ms := valueof(t_GprsMS_def);
3469
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003470 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003471 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003472
3473 /* Initialize the PCU interface abstraction */
3474 f_init_raw(testcasename(), info_ind);
3475
3476 /* EGPRS Packet Channel Request (cause=Signalling) */
3477 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
3478
3479 /* Establish an Uplink EGPRS TBF */
3480 f_ms_establish_ul_tbf(ms);
3481
3482 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3483 f_shutdown(__BFILE__, __LINE__, final := true);
3484}
3485
3486/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
3487testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003488 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003489 var GprsMS ms := valueof(t_GprsMS_def);
3490
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003491 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003492 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003493
3494 /* Initialize the PCU interface abstraction */
3495 f_init_raw(testcasename(), info_ind);
3496
3497 /* Establish an Uplink TBF */
3498 f_ms_establish_ul_tbf(ms);
3499
3500 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3501 f_shutdown(__BFILE__, __LINE__, final := true);
3502}
3503
3504/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
3505testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003506 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003507 var GprsMS ms := valueof(t_GprsMS_def);
3508
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003509 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003510 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003511
3512 /* Initialize NS/BSSGP side */
3513 f_init_bssgp();
3514
3515 /* Initialize the PCU interface abstraction */
3516 f_init_raw(testcasename(), info_ind);
3517
3518 /* Establish BSSGP connection to the PCU */
3519 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003520 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003521
3522 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3523 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
3524 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3525
3526 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
3527 f_shutdown(__BFILE__, __LINE__, final := true);
3528}
3529
3530private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
3531 in FrequencyParameters fp)
3532{
3533 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003534 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003535
3536 /* Table 12.8.1: Frequency Parameters information elements */
3537 var template FrequencyParameters tr_fp := {
3538 tsc := ts.tsc,
3539 presence := '10'B, /* Direct encoding 1 */
3540 arfcn := omit,
3541 indirect := omit,
3542 direct1 := {
3543 maio := ts.maio,
3544 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
3545 mobile_allocation := {
3546 hsn := ts.hsn,
3547 rfl_number_list_present := '0'B,
3548 rfl_number_list := omit,
3549 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003550 ma_length := ts.ma_bit_len,
3551 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003552 }
3553 },
3554 direct2 := omit
3555 };
3556
3557 if (not match(fp, tr_fp)) {
3558 setverdict(fail, "Frequency Parameters IE does not match: ",
3559 fp, " vs ", tr_fp);
3560 }
3561
3562 setverdict(pass);
3563}
3564
3565/* Make sure that Packet Uplink Assignment contains hopping parameters */
3566testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003567 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003568 var GprsMS ms := valueof(t_GprsMS_def);
3569 var uint32_t poll_fn;
3570
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003571 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003572 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003573
3574 /* Initialize the PCU interface abstraction */
3575 f_init_raw(testcasename(), info_ind);
3576
3577 /* Establish an Uplink TBF */
3578 f_ms_establish_ul_tbf(ms);
3579
3580 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
3581 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)));
3582
3583 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003584 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
3585 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003586
3587 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
3588 var template (omit) FrequencyParameters fp;
3589 if (ua.is_egprs == '1'B) {
3590 fp := ua.egprs.freq_par;
3591 } else {
3592 fp := ua.gprs.freq_par;
3593 }
3594
3595 /* This is an optional IE, so it's worth to check its presence */
3596 if (istemplatekind(fp, "omit")) {
3597 setverdict(fail, "Frequency Parameters IE is not present");
3598 f_shutdown(__BFILE__, __LINE__);
3599 }
3600
3601 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
3602 f_shutdown(__BFILE__, __LINE__, final := true);
3603}
3604
3605/* Make sure that Packet Downlink Assignment contains hopping parameters */
3606testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003607 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003608 var octetstring data := f_rnd_octstring(10);
3609 var GprsMS ms := valueof(t_GprsMS_def);
3610 var RlcmacDlBlock dl_block;
3611 var uint32_t poll_fn;
3612
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003613 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003614 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003615
3616 /* Initialize NS/BSSGP side */
3617 f_init_bssgp();
3618
3619 /* Initialize the PCU interface abstraction */
3620 f_init_raw(testcasename(), info_ind);
3621
3622 /* Establish BSSGP connection to the PCU */
3623 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003624 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003625
3626 /* Establish an Uplink TBF */
3627 f_ms_establish_ul_tbf(ms);
3628
3629 /* Send an Uplink block, so this TBF becomes "active" */
3630 f_ms_tx_ul_data_block(ms, data, with_tlli := true);
3631
3632 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3633 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
3634 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
3635
3636 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
3637 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3638
3639 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003640 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
3641 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003642
3643 /* This is an optional IE, so it's worth to check its presence */
3644 if (not ispresent(da.freq_par)) {
3645 setverdict(fail, "Frequency Parameters IE is not present");
3646 f_shutdown(__BFILE__, __LINE__);
3647 }
3648
3649 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
3650 f_shutdown(__BFILE__, __LINE__, final := true);
3651}
3652
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003653/* Check if the IUT handles subsequent INFO.ind messages */
3654testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003655 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003656 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003657
3658 /* Initialize the PCU interface abstraction */
3659 f_init_raw(testcasename(), info_ind);
3660
3661 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
3662 for (var integer i := 0; i < 16; i := i + 1) {
3663 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003664 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003665 }
3666
3667 f_shutdown(__BFILE__, __LINE__, final := true);
3668}
3669
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003670/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
3671testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
3672 var PCUIF_info_ind info_ind;
3673 var integer i;
3674 const integer num_ms := 8;
3675
3676 /* Initialize NS/BSSGP side */
3677 f_init_bssgp();
3678 /* Initialize GPRS MS side */
3679 f_init_gprs_ms(num_ms);
3680
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003681 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003682 /* Only the 3 first TRX are enabled. The enabled ones all have same
3683 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003684 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
3685 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
3686 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
3687 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003688
3689 /* Initialize the PCU interface abstraction */
3690 f_init_raw(testcasename(), info_ind);
3691
3692 /* Establish BSSGP connection to the PCU */
3693 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003694 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003695
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003696 /* Establish an Uplink TBF for each GprsMS instance */
3697 f_multi_ms_establish_tbf(do_activate := false);
3698
3699 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003700 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003701 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01003702 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003703 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003704 f_shutdown(__BFILE__, __LINE__);
3705 }
3706 }
3707
3708 f_shutdown(__BFILE__, __LINE__, final := true);
3709}
3710
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003711/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
3712 * downgraded to CS1-4 so that GPRS can read the USF).
3713 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
3714 */
3715testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
3716 var PCUIF_info_ind info_ind;
3717 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
3718 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003719 var uint32_t sched_fn, dl_fn, ack_fn;
3720 var octetstring data := f_rnd_octstring(10);
3721 var RlcmacDlBlock dl_block;
3722 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003723 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003724 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
3725 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
3726
3727 /* Initialize NS/BSSGP side */
3728 f_init_bssgp();
3729 /* Initialize GPRS MS side */
3730 f_init_gprs_ms(num_ms);
3731
3732 info_ind := valueof(ts_PCUIF_INFO_default);
3733 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003734 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
3735 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003736
3737 /* Initialize the PCU interface abstraction */
3738 f_init_raw(testcasename(), info_ind);
3739
3740 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
3741 g_mcs_initial_dl := 5;
3742 g_mcs_max_dl := 5;
3743 f_pcuvty_set_allowed_cs_mcs();
3744
3745 /* Establish BSSGP connection to the PCU */
3746 f_bssgp_establish();
3747 f_multi_ms_bssgp_register();
3748
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003749 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003750 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 +01003751 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
3752 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
3753 f_shutdown(__BFILE__, __LINE__);
3754 }
3755 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3756 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3757
3758 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003759 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 +01003760 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
3761 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
3762 f_shutdown(__BFILE__, __LINE__);
3763 }
3764 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3765 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3766
3767 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
3768 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3769 f_sleep(0.1);
3770 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3771 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3772 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
3773 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3774 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
3775 /* ACK the DL block */
3776 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
3777 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
3778 f_dl_block_ack_fn(dl_block, dl_fn));
3779
3780 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
3781 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3782 f_sleep(0.1);
3783 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3784 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3785 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
3786 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3787 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
3788 /* ACK the DL block */
3789 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
3790 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
3791 f_dl_block_ack_fn(dl_block, dl_fn));
3792
3793 data := f_rnd_octstring(1400);
3794 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3795 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3796
3797 for (var integer i := 0; i < 800; i := i + 1) {
3798 f_rx_rlcmac_dl_block(dl_block, dl_fn);
3799
3800 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
3801 /* No more data to receive, done */
3802 break;
3803 }
3804
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003805 usf_ms := -1;
3806
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003807 if (ischosen(dl_block.ctrl)) {
3808 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
3809 f_shutdown(__BFILE__, __LINE__);
3810 } else if (ischosen(dl_block.data_egprs)) {
3811 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
3812 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
3813 f_shutdown(__BFILE__, __LINE__);
3814 }
3815 tgt_ms := 1;
3816 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
3817 if (dl_block.data_egprs.mcs > MCS_4) {
3818 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
3819 f_shutdown(__BFILE__, __LINE__);
3820 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003821 usf_ms := 0;
3822 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003823 } else {
3824 if (dl_block.data_egprs.mcs <= MCS_4) {
3825 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
3826 f_shutdown(__BFILE__, __LINE__);
3827 }
3828 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003829 usf_ms := 1;
3830 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003831 }
3832 }
3833 } else {
3834 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
3835 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
3836 f_shutdown(__BFILE__, __LINE__);
3837 }
3838 tgt_ms := 0;
3839 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 +01003840 usf_ms := 0;
3841 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003842 } 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 +01003843 usf_ms := 1;
3844 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003845 }
3846 }
3847
3848 /* Keep Ack/Nack description updated */
3849 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
3850
3851 /* TDMA frame number on which we are supposed to send the ACK */
3852 if (f_dl_block_rrbp_valid(dl_block)) {
3853 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
3854 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);
3855 if (tx_data_remain != 0) {
3856 /* Submit more data from time to time to keep the TBF ongoing */
3857 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3858 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3859 tx_data_remain := tx_data_remain - 1;
3860 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003861 } else if (tx_data_remain != 0) {
3862 /* keep sending UL blocks when requested by USF to avoid
3863 * UL TBF timeout and hence stop receival of USFs */
3864 if (usf_ms != -1) {
3865 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
3866 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003867 }
3868 }
3869
3870 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 +01003871 /* He we check that DL blocks scheduled at GPRS can still request UL
3872 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
3873 * condition also ensures the downgrade to <=MCS4 condition is tested
3874 * above */
3875 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
3876 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003877 f_shutdown(__BFILE__, __LINE__);
3878 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003879 /* Here check for some level of fairness between them (at least ~40%): */
3880 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
3881 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
3882 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
3883 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
3884 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3885 f_shutdown(__BFILE__, __LINE__);
3886 }
3887 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
3888 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3889 f_shutdown(__BFILE__, __LINE__);
3890 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003891
3892 f_shutdown(__BFILE__, __LINE__, final := true);
3893}
3894
3895
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07003896private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
3897 boolean exp_imsi, boolean exp_tmsi)
3898runs on RAW_PCU_Test_CT {
3899 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
3900 var integer pending := lengthof(g_ms);
3901 var RlcmacDlBlock dl_block;
3902 var boolean f1, f2;
3903
3904 while (pending > 0) {
3905 var uint32_t poll_fn;
3906
3907 /* Obtain a Downlink block and make sure it is a paging request */
3908 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
3909 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
3910 setverdict(fail, "Rx unexpected DL block: ", dl_block);
3911 break;
3912 }
3913
3914 /* This should not happen in general, but who knows... */
3915 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3916 if (not ispresent(req.repeated_pageinfo)) {
3917 setverdict(fail, "Repeated Page Info IE is absent?!?");
3918 break;
3919 }
3920
3921 /* A single message may contain several MIs depending on their type */
3922 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3923 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
3924 ps_domain := false);
3925 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
3926 ps_domain := false);
3927 if (not f1 and not f2)
3928 { continue; }
3929
3930 /* Detect duplicate MIs */
3931 if (mask[i] == '1'B) {
3932 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
3933 continue;
3934 }
3935
3936 mask[i] := '1'B;
3937 }
3938
3939 pending := pending - lengthof(req.repeated_pageinfo);
3940 }
3941
3942 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
3943 if (mask[i] != '1'B) {
3944 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
3945 log("===== mask := ", mask);
3946 }
3947 }
3948
3949 /* All messages must have been received by now, expect a dummy block */
3950 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
3951}
3952
3953private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
3954runs on RAW_PCU_Test_CT {
3955 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3956 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3957
3958 /* Initialize NS/BSSGP side */
3959 f_init_bssgp();
3960
3961 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003962 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07003963
3964 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
3965 f_init_gprs_ms(7 * 8);
3966
3967 /* Initialize the PCU interface abstraction */
3968 f_init_raw(testcasename(), info_ind);
3969
3970 /* Establish BSSGP connection to the PCU */
3971 f_bssgp_establish();
3972 f_multi_ms_bssgp_register();
3973
3974 /* Establish an Uplink TBF for each GprsMS instance */
3975 f_multi_ms_establish_tbf(do_activate := true);
3976}
3977
3978testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
3979 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3980
3981 /* Common part: send INFO.ind, establish TBFs... */
3982 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
3983
3984 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
3985 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3986 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
3987 }
3988
3989 /* FIXME: work around a race condition between PCUIF and BSSGP */
3990 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
3991
3992 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
3993 * The IUT is expected to page on all PDCH slots of all transceivers. */
3994 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
3995 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
3996 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
3997 }
3998
3999 f_shutdown(__BFILE__, __LINE__, final := true);
4000}
4001
4002testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4003 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4004
4005 /* Common part: send INFO.ind, establish TBFs... */
4006 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4007
4008 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4009 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4010 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4011 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4012 }
4013
4014 /* FIXME: work around a race condition between PCUIF and BSSGP */
4015 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4016
4017 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4018 * The IUT is expected to page on all PDCH slots of all transceivers. */
4019 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4020 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4021 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4022 }
4023
4024 f_shutdown(__BFILE__, __LINE__, final := true);
4025}
4026
4027testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4028 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4029
4030 /* Common part: send INFO.ind, establish TBFs... */
4031 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4032
4033 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4034 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4035 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4036 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4037 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4038 } else {
4039 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4040 }
4041 }
4042
4043 /* FIXME: work around a race condition between PCUIF and BSSGP */
4044 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4045
4046 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4047 * The IUT is expected to page on all PDCH slots of all transceivers. */
4048 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4049 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4050 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4051 }
4052
4053 f_shutdown(__BFILE__, __LINE__, final := true);
4054}
4055
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004056private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004057runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4058 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004059 var integer i := 0;
4060 while (true) {
4061 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4062 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4063 break;
4064 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004065 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004066 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4067 f_shutdown(__BFILE__, __LINE__);
4068 }
4069 i := i + 1;
4070 }
4071 return dl_block;
4072}
4073
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004074private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4075runs on RAW_PCU_Test_CT {
4076 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),
4077 info_ind.lac),
4078 info_ind.rac),
4079 info_ind.cell_id));
4080 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4081 423),
4082 2),
4083 5));
4084 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4085 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4086 var template (value) RAN_Information_RIM_Container res_cont :=
4087 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4088 ts_RIM_Sequence_Number(2),
4089 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4090 ts_RIM_Protocol_Version_Number(1),
4091 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4092 omit);
4093 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4094 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4095 res_cont));
4096}
4097
4098altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4099runs on RAW_PCU_Test_CT {
4100 /* RIM procedure: */
4101 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),
4102 info_ind.lac),
4103 info_ind.rac),
4104 info_ind.cell_id));
4105 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4106 423),
4107 2),
4108 5));
4109 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4110 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4111 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4112 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4113 tr_RAN_Information_Request_RIM_Container)) {
4114 if (do_answer) {
4115 f_outbound_nacc_rim_tx_resp(info_ind);
4116 }
4117 if (do_repeat) {
4118 repeat;
4119 }
4120 }
4121}
4122
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004123/* Start NACC from MS side */
4124private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004125 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
4126 boolean skip_final_ctrl_ack := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004127runs on RAW_PCU_Test_CT {
4128 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4129 var RlcmacDlBlock dl_block;
4130 var uint32_t sched_fn;
4131 var GsmArfcn req_arfcn := 862;
4132 var uint6_t req_bsic := 43;
4133
4134 /* Start NACC from MS side */
4135 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4136 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4137
4138 if (exp_rac_ci_query == true) {
4139 /* osmo-pcu should now ask for resolution: */
4140 f_ipa_ctrl_wait_link_up();
4141 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4142 int2str(info_ind.lac) & "." &
4143 int2str(info_ind.cell_id) & "." &
4144 int2str(req_arfcn) & "." &
4145 int2str(req_bsic);
4146 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4147 }
4148
4149 if (exp_si_query == true) {
4150 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004151 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004152 }
4153
4154 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004155 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004156
4157 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4158 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4159 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4160 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4161 f_shutdown(__BFILE__, __LINE__);
4162 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004163 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004164 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004165 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4166 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4167 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004168}
4169
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004170/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4171testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004172 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004173 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004174 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004175
4176 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4177 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4178
4179 /* Initialize NS/BSSGP side */
4180 f_init_bssgp();
4181 /* Initialize GPRS MS side */
4182 f_init_gprs_ms();
4183 ms := g_ms[0]; /* We only use first MS in this test */
4184
4185 /* Initialize the PCU interface abstraction */
4186 f_init_raw(testcasename(), info_ind);
4187
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004188 /* Make sure we are not affected by full cache from previous tests */
4189 f_pcuvty_flush_neigh_caches();
4190
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004191 /* Establish BSSGP connection to the PCU */
4192 f_bssgp_establish();
4193 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4194
4195 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004196 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 +01004197 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4198 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4199
4200 /* Start NACC from MS side */
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004201 f_outbound_nacc_success(ms, info_ind);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004202
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004203 f_shutdown(__BFILE__, __LINE__, final := true);
4204}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004205
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004206/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4207testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4208 var PollFnCtx pollctx;
4209 var GprsMS ms;
4210 var RlcmacDlBlock dl_block;
4211 var uint32_t sched_fn;
4212 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004213
4214 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4215 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4216
4217 /* Initialize NS/BSSGP side */
4218 f_init_bssgp();
4219 /* Initialize GPRS MS side */
4220 f_init_gprs_ms();
4221 ms := g_ms[0]; /* We only use first MS in this test */
4222
4223 /* Initialize the PCU interface abstraction */
4224 f_init_raw(testcasename(), info_ind);
4225
4226 /* Make sure we are not affected by full cache from previous tests */
4227 f_pcuvty_flush_neigh_caches();
4228
4229 /* Establish BSSGP connection to the PCU */
4230 f_bssgp_establish();
4231 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4232
4233 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004234 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 +01004235 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4236 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4237
4238 /* Start NACC from MS side, avoid sending final CTRL ACK */
4239 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true);
4240
4241 /* Wait until we receive something non-dummy */
4242 dl_block := f_skip_dummy(0, sched_fn);
4243 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4244 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4245 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4246 }
4247 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4248 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4249 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4250 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4251 }
4252
4253 f_shutdown(__BFILE__, __LINE__, final := true);
4254}
4255
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004256/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4257testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4258 var PollFnCtx pollctx;
4259 var GprsMS ms;
4260 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004261 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004262
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004263 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4264 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004265
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004266 /* Initialize NS/BSSGP side */
4267 f_init_bssgp();
4268 /* Initialize GPRS MS side */
4269 f_init_gprs_ms();
4270 ms := g_ms[0]; /* We only use first MS in this test */
4271
4272 /* Initialize the PCU interface abstraction */
4273 f_init_raw(testcasename(), info_ind);
4274
4275 /* Make sure we are not affected by full cache from previous tests */
4276 f_pcuvty_flush_neigh_caches();
4277 /* Set timeout values for caches so that entries will be in cache during second try */
4278 f_pcuvty_set_neigh_caches(10, 10);
4279
4280 /* Establish BSSGP connection to the PCU */
4281 f_bssgp_establish();
4282 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4283
4284 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004285 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 +01004286 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4287 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4288
4289 /* Start NACC from MS side */
4290 f_outbound_nacc_success(ms, info_ind);
4291
4292 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
4293 f_outbound_nacc_success(ms, info_ind, false, false);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004294
4295 f_shutdown(__BFILE__, __LINE__, final := true);
4296}
4297
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004298/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4299 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4300 */
4301testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4302 var PollFnCtx pollctx;
4303 var GprsMS ms;
4304 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004305 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4306
4307 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4308 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4309
4310 /* Initialize NS/BSSGP side */
4311 f_init_bssgp();
4312 /* Initialize GPRS MS side */
4313 f_init_gprs_ms();
4314 ms := g_ms[0]; /* We only use first MS in this test */
4315
4316 /* Initialize the PCU interface abstraction */
4317 f_init_raw(testcasename(), info_ind);
4318
4319 /* Make sure we are not affected by full cache from previous tests */
4320 f_pcuvty_flush_neigh_caches();
4321 /* Set timeout values for caches so that entries will be erased before the second try */
4322 f_pcuvty_set_neigh_caches(1, 1);
4323
4324 /* Establish BSSGP connection to the PCU */
4325 f_bssgp_establish();
4326 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4327
4328 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004329 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 +01004330 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4331 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4332
4333 /* Start NACC from MS side */
4334 f_outbound_nacc_success(ms, info_ind);
4335
4336 /* CTRL client should have disconnected from us */
4337 f_ipa_ctrl_wait_link_down();
4338 /* wait for cache entries to time out */
4339 f_sleep(2.0);
4340 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
4341 f_outbound_nacc_success(ms, info_ind);
4342
4343 f_shutdown(__BFILE__, __LINE__, final := true);
4344}
4345
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004346/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004347testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4348 var RlcmacDlBlock dl_block;
4349 var PollFnCtx pollctx;
4350 var uint32_t sched_fn;
4351 var GprsMS ms;
4352 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4353 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004354 var GsmArfcn req_arfcn := 862;
4355 var uint6_t req_bsic := 43;
4356
4357 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4358 * resolution CTRL port, to trigger Conn Refused by socket:
4359 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4360 */
4361
4362 /* Initialize NS/BSSGP side */
4363 f_init_bssgp();
4364 /* Initialize GPRS MS side */
4365 f_init_gprs_ms();
4366 ms := g_ms[0]; /* We only use first MS in this test */
4367
4368 /* Initialize the PCU interface abstraction */
4369 f_init_raw(testcasename(), info_ind);
4370
4371 /* Make sure we are not affected by full cache from previous tests */
4372 f_pcuvty_flush_neigh_caches();
4373
4374 /* Establish BSSGP connection to the PCU */
4375 f_bssgp_establish();
4376 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4377
4378 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004379 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 +01004380 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4381 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4382
4383 /* Start NACC from MS side */
4384 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4385 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4386
4387 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004388 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004389 /* Make sure it is a Pkt Cell Chg Continue */
4390 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4391 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4392 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004393 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4394 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4395 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4396 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4397 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004398
4399 f_shutdown(__BFILE__, __LINE__, final := true);
4400}
4401
4402/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004403testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
4404 var RlcmacDlBlock dl_block;
4405 var PollFnCtx pollctx;
4406 var uint32_t sched_fn;
4407 var GprsMS ms;
4408 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4409 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004410 var GsmArfcn req_arfcn := 862;
4411 var uint6_t req_bsic := 43;
4412
4413 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4414 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4415
4416 /* Initialize NS/BSSGP side */
4417 f_init_bssgp();
4418 /* Initialize GPRS MS side */
4419 f_init_gprs_ms();
4420 ms := g_ms[0]; /* We only use first MS in this test */
4421
4422 /* Initialize the PCU interface abstraction */
4423 f_init_raw(testcasename(), info_ind);
4424
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004425 /* Make sure we are not affected by full cache from previous tests */
4426 f_pcuvty_flush_neigh_caches();
4427
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004428 /* Establish BSSGP connection to the PCU */
4429 f_bssgp_establish();
4430 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4431
4432 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004433 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 +01004434 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4435 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4436
4437 /* Start NACC from MS side */
4438 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4439 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4440
4441 /* osmo-pcu should now ask for resolution: */
4442 f_ipa_ctrl_wait_link_up();
4443 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4444 int2str(info_ind.lac) & "." &
4445 int2str(info_ind.cell_id) & "." &
4446 int2str(req_arfcn) & "." &
4447 int2str(req_bsic);
4448 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
4449 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4450
4451 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004452 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004453 /* Make sure it is a Pkt Cell Chg Continue */
4454 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4455 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4456 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004457 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4458 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4459 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4460 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4461 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004462
4463 f_shutdown(__BFILE__, __LINE__, final := true);
4464}
4465
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004466/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
4467testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
4468 var RlcmacDlBlock dl_block;
4469 var PollFnCtx pollctx;
4470 var uint32_t sched_fn;
4471 var GprsMS ms;
4472 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4473 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004474 var GsmArfcn req_arfcn := 862;
4475 var uint6_t req_bsic := 43;
4476
4477 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4478 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4479
4480 /* Initialize NS/BSSGP side */
4481 f_init_bssgp();
4482 /* Initialize GPRS MS side */
4483 f_init_gprs_ms();
4484 ms := g_ms[0]; /* We only use first MS in this test */
4485
4486 /* Initialize the PCU interface abstraction */
4487 f_init_raw(testcasename(), info_ind);
4488
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004489 /* Make sure we are not affected by full cache from previous tests */
4490 f_pcuvty_flush_neigh_caches();
4491
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004492 /* Establish BSSGP connection to the PCU */
4493 f_bssgp_establish();
4494 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4495
4496 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004497 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 +01004498 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4499 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4500
4501 /* Start NACC from MS side */
4502 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4503 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4504
4505 /* osmo-pcu should now ask for resolution: */
4506 f_ipa_ctrl_wait_link_up();
4507 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4508 int2str(info_ind.lac) & "." &
4509 int2str(info_ind.cell_id) & "." &
4510 int2str(req_arfcn) & "." &
4511 int2str(req_bsic);
4512 /* we receive RAC+CI resolution request and we send incorrectlt formated response */
4513 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
4514
4515 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004516 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004517 /* Make sure it is a Pkt Cell Chg Continue */
4518 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4519 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4520 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004521 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4522 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4523 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4524 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4525 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004526
4527 f_shutdown(__BFILE__, __LINE__, final := true);
4528}
4529
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004530/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
4531testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
4532 var RlcmacDlBlock dl_block;
4533 var PollFnCtx pollctx;
4534 var uint32_t sched_fn;
4535 var GprsMS ms;
4536 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4537 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004538 var GsmArfcn req_arfcn := 862;
4539 var uint6_t req_bsic := 43;
4540 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 */
4541 info_ind.lac),
4542 info_ind.rac),
4543 info_ind.cell_id));
4544 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4545 423),
4546 2),
4547 5));
4548 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
4549 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
4550
4551 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4552 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4553
4554 /* Initialize NS/BSSGP side */
4555 f_init_bssgp();
4556 /* Initialize GPRS MS side */
4557 f_init_gprs_ms();
4558 ms := g_ms[0]; /* We only use first MS in this test */
4559
4560 /* Initialize the PCU interface abstraction */
4561 f_init_raw(testcasename(), info_ind);
4562
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004563 /* Make sure we are not affected by full cache from previous tests */
4564 f_pcuvty_flush_neigh_caches();
4565
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004566 /* Establish BSSGP connection to the PCU */
4567 f_bssgp_establish();
4568 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4569
4570 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004571 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 +01004572 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4573 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4574
4575 /* Start NACC from MS side */
4576 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4577 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4578
4579 /* osmo-pcu should now ask for resolution: */
4580 f_ipa_ctrl_wait_link_up();
4581 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4582 int2str(info_ind.lac) & "." &
4583 int2str(info_ind.cell_id) & "." &
4584 int2str(req_arfcn) & "." &
4585 int2str(req_bsic);
4586 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4587
4588 /* RIM procedure: */
4589 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4590 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4591 tr_RAN_Information_Request_RIM_Container));
4592 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
4593
4594 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004595 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004596 /* Make sure it is a Pkt Cell Chg Continue */
4597 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4598 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4599 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004600 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4601 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4602 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4603 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4604 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004605
4606 f_shutdown(__BFILE__, __LINE__, final := true);
4607}
4608
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004609/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
4610testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
4611 var PollFnCtx pollctx;
4612 var GprsMS ms;
4613 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4614 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4615 var RlcmacDlBlock dl_block;
4616 var uint32_t sched_fn;
4617 var CtrlMessage rx_ctrl;
4618 var GsmArfcn req_arfcn := 862;
4619 var uint6_t req_bsic := 43;
4620
4621 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4622 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4623
4624 /* Initialize NS/BSSGP side */
4625 f_init_bssgp();
4626 /* Initialize GPRS MS side */
4627 f_init_gprs_ms();
4628 ms := g_ms[0]; /* We only use first MS in this test */
4629
4630 /* Initialize the PCU interface abstraction */
4631 f_init_raw(testcasename(), info_ind);
4632
4633 /* Make sure we are not affected by full cache from previous tests */
4634 f_pcuvty_flush_neigh_caches();
4635
4636 /* Establish BSSGP connection to the PCU */
4637 f_bssgp_establish();
4638 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4639
4640 /* Send PACKET RESOURCE REQUEST */
4641 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4642 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4643 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4644
4645 /* Start NACC from MS side */
4646 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4647 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4648
4649 /* osmo-pcu should now ask for resolution: */
4650 f_ipa_ctrl_wait_link_up();
4651 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4652 int2str(info_ind.lac) & "." &
4653 int2str(info_ind.cell_id) & "." &
4654 int2str(req_arfcn) & "." &
4655 int2str(req_bsic);
4656 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4657 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
4658 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4659 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4660 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4661 timer T := 2.0;
4662 T.start;
4663 alt {
4664 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
4665 [] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
4666 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
4667 f_shutdown(__BFILE__, __LINE__);
4668 }
4669 [] T.timeout {
4670 setverdict(pass);
4671 }
4672 }
4673
4674 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004675 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004676
4677 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4678 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4679 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4680 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4681 f_shutdown(__BFILE__, __LINE__);
4682 }
4683 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4684 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4685 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4686 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4687 }
4688
4689 f_shutdown(__BFILE__, __LINE__, final := true);
4690}
4691
4692/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
4693testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
4694 var PollFnCtx pollctx;
4695 var GprsMS ms;
4696 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4697 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4698 var RlcmacDlBlock dl_block;
4699 var uint32_t sched_fn;
4700 var CtrlMessage rx_ctrl;
4701 var GsmArfcn req_arfcn := 862;
4702 var uint6_t req_bsic := 43;
4703
4704 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4705 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4706
4707 /* Initialize NS/BSSGP side */
4708 f_init_bssgp();
4709 /* Initialize GPRS MS side */
4710 f_init_gprs_ms();
4711 ms := g_ms[0]; /* We only use first MS in this test */
4712
4713 /* Initialize the PCU interface abstraction */
4714 f_init_raw(testcasename(), info_ind);
4715
4716 /* Make sure we are not affected by full cache from previous tests */
4717 f_pcuvty_flush_neigh_caches();
4718
4719 /* Establish BSSGP connection to the PCU */
4720 f_bssgp_establish();
4721 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4722
4723 /* Send PACKET RESOURCE REQUEST */
4724 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4725 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4726 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4727
4728 /* Start NACC from MS side */
4729 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4730 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4731
4732 /* osmo-pcu should now ask for resolution: */
4733 f_ipa_ctrl_wait_link_up();
4734 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4735 int2str(info_ind.lac) & "." &
4736 int2str(info_ind.cell_id) & "." &
4737 int2str(req_arfcn) & "." &
4738 int2str(req_bsic);
4739 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4740 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4741 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
4742 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4743 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4744 f_outbound_nacc_rim_tx_resp(info_ind);
4745 timer T := 1.0;
4746 T.start;
4747 alt {
4748 [] RIM.receive {
4749 setverdict(fail, "Received unexpected RIM message");
4750 f_shutdown(__BFILE__, __LINE__);
4751 }
4752 [] T.timeout {
4753 setverdict(pass);
4754 }
4755 }
4756
4757 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004758 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004759
4760 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4761 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4762 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4763 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4764 f_shutdown(__BFILE__, __LINE__);
4765 }
4766 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4767 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4768 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4769 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4770 }
4771
4772 f_shutdown(__BFILE__, __LINE__, final := true);
4773}
4774
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01004775/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
4776testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
4777 var PollFnCtx pollctx;
4778 var GprsMS ms;
4779 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4780 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4781 var RlcmacDlBlock dl_block;
4782 var uint32_t sched_fn;
4783 var CtrlMessage rx_ctrl;
4784 var GsmArfcn req_arfcn := 862;
4785 var uint6_t req_bsic := 43;
4786
4787 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4788 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4789
4790 /* Initialize NS/BSSGP side */
4791 f_init_bssgp();
4792 /* Initialize GPRS MS side */
4793 f_init_gprs_ms();
4794 ms := g_ms[0]; /* We only use first MS in this test */
4795
4796 /* Initialize the PCU interface abstraction */
4797 f_init_raw(testcasename(), info_ind);
4798
4799 /* Make sure we are not affected by full cache from previous tests */
4800 f_pcuvty_flush_neigh_caches();
4801
4802 /* Establish BSSGP connection to the PCU */
4803 f_bssgp_establish();
4804 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4805
4806 /* Send PACKET RESOURCE REQUEST */
4807 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4808 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4809 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4810
4811 /* Start NACC from MS side */
4812 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4813 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4814
4815 /* osmo-pcu should now ask for resolution: */
4816 f_ipa_ctrl_wait_link_up();
4817 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4818 int2str(info_ind.lac) & "." &
4819 int2str(info_ind.cell_id) & "." &
4820 int2str(req_arfcn) & "." &
4821 int2str(req_bsic);
4822 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4823 /* RIM procedure: */
4824 as_outbound_nacc_rim_resolve(info_ind);
4825
4826 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
4827 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
4828 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4829
4830 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
4831 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
4832
4833 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4834 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4835 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4836 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4837 f_shutdown(__BFILE__, __LINE__);
4838 }
4839 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4840 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4841 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4842 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4843 }
4844}
4845
4846/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
4847testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
4848 var PollFnCtx pollctx;
4849 var GprsMS ms;
4850 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4851 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4852 var RlcmacDlBlock dl_block;
4853 var uint32_t sched_fn;
4854 var CtrlMessage rx_ctrl;
4855 var GsmArfcn req_arfcn := 862;
4856 var uint6_t req_bsic := 43;
4857
4858 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4859 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4860
4861 /* Initialize NS/BSSGP side */
4862 f_init_bssgp();
4863 /* Initialize GPRS MS side */
4864 f_init_gprs_ms();
4865 ms := g_ms[0]; /* We only use first MS in this test */
4866
4867 /* Initialize the PCU interface abstraction */
4868 f_init_raw(testcasename(), info_ind);
4869
4870 /* Make sure we are not affected by full cache from previous tests */
4871 f_pcuvty_flush_neigh_caches();
4872
4873 /* Establish BSSGP connection to the PCU */
4874 f_bssgp_establish();
4875 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4876
4877 /* Send PACKET RESOURCE REQUEST */
4878 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4879 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4880 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4881
4882 /* Start NACC from MS side */
4883 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4884 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4885
4886 /* osmo-pcu should now ask for resolution: */
4887 f_ipa_ctrl_wait_link_up();
4888 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4889 int2str(info_ind.lac) & "." &
4890 int2str(info_ind.cell_id) & "." &
4891 int2str(req_arfcn) & "." &
4892 int2str(req_bsic);
4893 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4894 /* RIM procedure: */
4895 as_outbound_nacc_rim_resolve(info_ind);
4896
4897 /* Announce SI back to MS, continue NACC procedure */
4898 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
4899
4900 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
4901 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4902
4903 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4904 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4905 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4906 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4907 f_shutdown(__BFILE__, __LINE__);
4908 }
4909 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4910 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4911 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4912 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4913 }
4914}
4915
4916/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
4917testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
4918 var PollFnCtx pollctx;
4919 var GprsMS ms;
4920 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4921 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4922 var RlcmacDlBlock dl_block;
4923 var uint32_t sched_fn;
4924 var CtrlMessage rx_ctrl;
4925 var GsmArfcn req_arfcn := 862;
4926 var uint6_t req_bsic := 43;
4927
4928 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4929 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4930
4931 /* Initialize NS/BSSGP side */
4932 f_init_bssgp();
4933 /* Initialize GPRS MS side */
4934 f_init_gprs_ms();
4935 ms := g_ms[0]; /* We only use first MS in this test */
4936
4937 /* Initialize the PCU interface abstraction */
4938 f_init_raw(testcasename(), info_ind);
4939
4940 /* Make sure we are not affected by full cache from previous tests */
4941 f_pcuvty_flush_neigh_caches();
4942
4943 /* Establish BSSGP connection to the PCU */
4944 f_bssgp_establish();
4945 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4946
4947 /* Send PACKET RESOURCE REQUEST */
4948 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4949 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4950 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4951
4952 /* Start NACC from MS side */
4953 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4954 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4955
4956 /* osmo-pcu should now ask for resolution: */
4957 f_ipa_ctrl_wait_link_up();
4958 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4959 int2str(info_ind.lac) & "." &
4960 int2str(info_ind.cell_id) & "." &
4961 int2str(req_arfcn) & "." &
4962 int2str(req_bsic);
4963 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4964 /* RIM procedure: */
4965 as_outbound_nacc_rim_resolve(info_ind);
4966
4967 /* Announce SI back to MS, continue NACC procedure */
4968 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
4969
4970 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4971 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4972 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4973 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4974 f_shutdown(__BFILE__, __LINE__);
4975 }
4976 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
4977 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4978
4979 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4980 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4981 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4982 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4983 }
4984}
4985
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01004986/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
4987 * while waiting for CTRL resolution */
4988testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
4989 var PollFnCtx pollctx;
4990 var GprsMS ms;
4991 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4992 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4993 var RlcmacDlBlock dl_block;
4994 var uint32_t sched_fn;
4995 var CtrlMessage rx_ctrl;
4996 var GsmArfcn req_arfcn := 862;
4997 var uint6_t req_bsic := 43;
4998
4999 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5000 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5001
5002 /* Initialize NS/BSSGP side */
5003 f_init_bssgp();
5004 /* Initialize GPRS MS side */
5005 f_init_gprs_ms();
5006 ms := g_ms[0]; /* We only use first MS in this test */
5007
5008 /* Initialize the PCU interface abstraction */
5009 f_init_raw(testcasename(), info_ind);
5010
5011 /* Make sure we are not affected by full cache from previous tests */
5012 f_pcuvty_flush_neigh_caches();
5013
5014 /* Establish BSSGP connection to the PCU */
5015 f_bssgp_establish();
5016 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5017
5018 /* Send PACKET RESOURCE REQUEST */
5019 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5020 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5021 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5022
5023 /* Start NACC from MS side */
5024 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5025 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5026
5027 /* osmo-pcu should now ask for resolution: */
5028 f_ipa_ctrl_wait_link_up();
5029 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5030 int2str(info_ind.lac) & "." &
5031 int2str(info_ind.cell_id) & "." &
5032 int2str(req_arfcn) & "." &
5033 int2str(req_bsic);
5034 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5035 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5036 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5037 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5038 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5039 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5040 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
5041 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5042 int2str(info_ind.lac) & "." &
5043 int2str(info_ind.cell_id) & "." &
5044 int2str(req_arfcn + 1) & "." &
5045 int2str(req_bsic + 1);
5046 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5047
5048 /* And finally everything continues as usual with RIN procedure */
5049 as_outbound_nacc_rim_resolve(info_ind);
5050
5051 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005052 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005053
5054 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5055 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5056 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5057 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5058 f_shutdown(__BFILE__, __LINE__);
5059 }
5060 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5061 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5062 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5063 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5064 }
5065
5066 f_shutdown(__BFILE__, __LINE__, final := true);
5067}
5068
5069/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5070 * while waiting for SI resolution */
5071testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5072 var PollFnCtx pollctx;
5073 var GprsMS ms;
5074 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5075 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5076 var RlcmacDlBlock dl_block;
5077 var uint32_t sched_fn;
5078 var CtrlMessage rx_ctrl;
5079 var GsmArfcn req_arfcn := 862;
5080 var uint6_t req_bsic := 43;
5081
5082 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5083 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5084
5085 /* Initialize NS/BSSGP side */
5086 f_init_bssgp();
5087 /* Initialize GPRS MS side */
5088 f_init_gprs_ms();
5089 ms := g_ms[0]; /* We only use first MS in this test */
5090
5091 /* Initialize the PCU interface abstraction */
5092 f_init_raw(testcasename(), info_ind);
5093
5094 /* Make sure we are not affected by full cache from previous tests */
5095 f_pcuvty_flush_neigh_caches();
5096
5097 /* Establish BSSGP connection to the PCU */
5098 f_bssgp_establish();
5099 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5100
5101 /* Send PACKET RESOURCE REQUEST */
5102 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5103 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5104 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5105
5106 /* Start NACC from MS side */
5107 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5108 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5109
5110 /* osmo-pcu should now ask for resolution: */
5111 f_ipa_ctrl_wait_link_up();
5112 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5113 int2str(info_ind.lac) & "." &
5114 int2str(info_ind.cell_id) & "." &
5115 int2str(req_arfcn) & "." &
5116 int2str(req_bsic);
5117 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5118 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5119 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5120 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5121 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5122 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5123 f_outbound_nacc_rim_tx_resp(info_ind);
5124
5125 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
5126 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5127 int2str(info_ind.lac) & "." &
5128 int2str(info_ind.cell_id) & "." &
5129 int2str(req_arfcn + 1) & "." &
5130 int2str(req_bsic + 1);
5131 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5132
5133 /* And finally everything continues as usual with RIN procedure */
5134 as_outbound_nacc_rim_resolve(info_ind);
5135
5136 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005137 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005138
5139 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5140 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5141 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5142 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5143 f_shutdown(__BFILE__, __LINE__);
5144 }
5145 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5146 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5147 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5148 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5149 }
5150
5151 f_shutdown(__BFILE__, __LINE__, final := true);
5152}
5153
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005154/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5155 * while sending Pkt Neigh Data Change */
5156testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5157 var PollFnCtx pollctx;
5158 var GprsMS ms;
5159 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5160 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5161 var RlcmacDlBlock dl_block;
5162 var uint32_t sched_fn;
5163 var CtrlMessage rx_ctrl;
5164 var GsmArfcn req_arfcn := 862;
5165 var uint6_t req_bsic := 43;
5166
5167 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5168 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5169
5170 /* Initialize NS/BSSGP side */
5171 f_init_bssgp();
5172 /* Initialize GPRS MS side */
5173 f_init_gprs_ms();
5174 ms := g_ms[0]; /* We only use first MS in this test */
5175
5176 /* Initialize the PCU interface abstraction */
5177 f_init_raw(testcasename(), info_ind);
5178
5179 /* Make sure we are not affected by full cache from previous tests */
5180 f_pcuvty_flush_neigh_caches();
5181
5182 /* Establish BSSGP connection to the PCU */
5183 f_bssgp_establish();
5184 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5185
5186 /* Send PACKET RESOURCE REQUEST */
5187 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5188 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5189 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5190
5191 /* Start NACC from MS side */
5192 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5193 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5194
5195 /* osmo-pcu should now ask for resolution: */
5196 f_ipa_ctrl_wait_link_up();
5197 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5198 int2str(info_ind.lac) & "." &
5199 int2str(info_ind.cell_id) & "." &
5200 int2str(req_arfcn) & "." &
5201 int2str(req_bsic);
5202 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5203 /* RIM procedure: */
5204 as_outbound_nacc_rim_resolve(info_ind);
5205
5206 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5207 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5208 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5209 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5210
5211 /* It should trigger RAC_CI resolution to start again: */
5212 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5213 int2str(info_ind.lac) & "." &
5214 int2str(info_ind.cell_id) & "." &
5215 int2str(req_arfcn + 1) & "." &
5216 int2str(req_bsic + 1);
5217 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5218 /* RIM procedure: */
5219 as_outbound_nacc_rim_resolve(info_ind);
5220 /* Transmit SI back to MS */
5221 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5222
5223 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5224 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5225 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5226 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5227 f_shutdown(__BFILE__, __LINE__);
5228 }
5229 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5230 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5231 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5232 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5233 }
5234}
5235
5236/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5237testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5238 var PollFnCtx pollctx;
5239 var GprsMS ms;
5240 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5241 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5242 var RlcmacDlBlock dl_block;
5243 var uint32_t sched_fn;
5244 var CtrlMessage rx_ctrl;
5245 var GsmArfcn req_arfcn := 862;
5246 var uint6_t req_bsic := 43;
5247
5248 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5249 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5250
5251 /* Initialize NS/BSSGP side */
5252 f_init_bssgp();
5253 /* Initialize GPRS MS side */
5254 f_init_gprs_ms();
5255 ms := g_ms[0]; /* We only use first MS in this test */
5256
5257 /* Initialize the PCU interface abstraction */
5258 f_init_raw(testcasename(), info_ind);
5259
5260 /* Make sure we are not affected by full cache from previous tests */
5261 f_pcuvty_flush_neigh_caches();
5262
5263 /* Establish BSSGP connection to the PCU */
5264 f_bssgp_establish();
5265 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5266
5267 /* Send PACKET RESOURCE REQUEST */
5268 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5269 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5270 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5271
5272 /* Start NACC from MS side */
5273 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5274 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5275
5276 /* osmo-pcu should now ask for resolution: */
5277 f_ipa_ctrl_wait_link_up();
5278 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5279 int2str(info_ind.lac) & "." &
5280 int2str(info_ind.cell_id) & "." &
5281 int2str(req_arfcn) & "." &
5282 int2str(req_bsic);
5283 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5284 /* RIM procedure: */
5285 as_outbound_nacc_rim_resolve(info_ind);
5286
5287 /* Announce SI back to MS, continue NACC procedure */
5288 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5289
5290 /* trigger a Pkt Cell Change Notif with different tgt cell */
5291 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5292 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5293
5294 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5295 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5296
5297 /* It should trigger RAC_CI resolution to start again: */
5298 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5299 int2str(info_ind.lac) & "." &
5300 int2str(info_ind.cell_id) & "." &
5301 int2str(req_arfcn + 1) & "." &
5302 int2str(req_bsic + 1);
5303 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5304 /* RIM procedure: */
5305 as_outbound_nacc_rim_resolve(info_ind);
5306 /* Transmit SI back to MS */
5307 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5308
5309 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5310 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5311 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5312 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5313 f_shutdown(__BFILE__, __LINE__);
5314 }
5315 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5316 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5317 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5318 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5319 }
5320}
5321
5322/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5323testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5324 var PollFnCtx pollctx;
5325 var GprsMS ms;
5326 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5327 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5328 var RlcmacDlBlock dl_block;
5329 var uint32_t sched_fn;
5330 var CtrlMessage rx_ctrl;
5331 var GsmArfcn req_arfcn := 862;
5332 var uint6_t req_bsic := 43;
5333
5334 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5335 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5336
5337 /* Initialize NS/BSSGP side */
5338 f_init_bssgp();
5339 /* Initialize GPRS MS side */
5340 f_init_gprs_ms();
5341 ms := g_ms[0]; /* We only use first MS in this test */
5342
5343 /* Initialize the PCU interface abstraction */
5344 f_init_raw(testcasename(), info_ind);
5345
5346 /* Make sure we are not affected by full cache from previous tests */
5347 f_pcuvty_flush_neigh_caches();
5348
5349 /* Establish BSSGP connection to the PCU */
5350 f_bssgp_establish();
5351 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5352
5353 /* Send PACKET RESOURCE REQUEST */
5354 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5355 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5356 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5357
5358 /* Start NACC from MS side */
5359 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5360 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5361
5362 /* osmo-pcu should now ask for resolution: */
5363 f_ipa_ctrl_wait_link_up();
5364 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5365 int2str(info_ind.lac) & "." &
5366 int2str(info_ind.cell_id) & "." &
5367 int2str(req_arfcn) & "." &
5368 int2str(req_bsic);
5369 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5370 /* RIM procedure: */
5371 as_outbound_nacc_rim_resolve(info_ind);
5372
5373 /* Announce SI back to MS, continue NACC procedure */
5374 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5375
5376 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5377 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5378 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5379 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5380 f_shutdown(__BFILE__, __LINE__);
5381 }
5382
5383 /* trigger a Pkt Cell Change Notif with different tgt cell */
5384 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5385 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5386
5387 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5388 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5389 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5390 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5391 }
5392 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5393 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
5394
5395 /* It should trigger RAC_CI resolution to start again: */
5396 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5397 int2str(info_ind.lac) & "." &
5398 int2str(info_ind.cell_id) & "." &
5399 int2str(req_arfcn + 1) & "." &
5400 int2str(req_bsic + 1);
5401 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5402 /* RIM procedure: */
5403 as_outbound_nacc_rim_resolve(info_ind);
5404 /* Transmit SI back to MS */
5405 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5406
5407 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5408 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5409 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5410 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5411 f_shutdown(__BFILE__, __LINE__);
5412 }
5413 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5414 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5415 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5416 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5417 }
5418}
5419
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005420/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
5421testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
5422 var PollFnCtx pollctx;
5423 var GprsMS ms;
5424 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5425 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5426 var RlcmacDlBlock dl_block;
5427 var uint32_t sched_fn, dl_fn;
5428 var CtrlMessage rx_ctrl;
5429 var GsmArfcn req_arfcn := 862;
5430 var uint6_t req_bsic := 43;
5431 var octetstring data := f_rnd_octstring(10);
5432
5433 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5434 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5435
5436 /* Initialize NS/BSSGP side */
5437 f_init_bssgp();
5438 /* Initialize GPRS MS side */
5439 f_init_gprs_ms();
5440 ms := g_ms[0]; /* We only use first MS in this test */
5441
5442 /* Initialize the PCU interface abstraction */
5443 f_init_raw(testcasename(), info_ind);
5444
5445 /* Make sure we are not affected by full cache from previous tests */
5446 f_pcuvty_flush_neigh_caches();
5447
5448 /* Establish BSSGP connection to the PCU */
5449 f_bssgp_establish();
5450 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5451
5452 /* Send PACKET RESOURCE REQUEST */
5453 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5454 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5455 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5456
5457 /* Start NACC from MS side */
5458 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5459 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5460
5461 /* osmo-pcu should now ask for resolution: */
5462 f_ipa_ctrl_wait_link_up();
5463 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5464 int2str(info_ind.lac) & "." &
5465 int2str(info_ind.cell_id) & "." &
5466 int2str(req_arfcn) & "." &
5467 int2str(req_bsic);
5468 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5469 /* RIM procedure: */
5470 as_outbound_nacc_rim_resolve(info_ind);
5471
5472 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
5473 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
5474 f_sleep(0.1);
5475 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
5476 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
5477
5478 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
5479 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5480 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
5481 * Data with unassigned DL TBF in line above): */
5482 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5483 /* Continue receiving Pkt Cell Neighbor Data */
5484 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5485
5486 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5487 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5488 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5489 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5490 f_shutdown(__BFILE__, __LINE__);
5491 }
5492 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5493 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5494 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5495 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5496 }
5497
5498 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
5499 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
5500 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
5501 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
5502 f_dl_block_ack_fn(dl_block, dl_fn));
5503}
5504
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005505/* Send a RIM RAN info request to the PCU and verify the response, we expect
5506 * getting the system information back which we have transfered to the PCU via
5507 * PCUIF on startup. */
5508testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
5509 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005510 timer T := 2.0;
5511
5512 /* Initialize NS/BSSGP side */
5513 f_init_bssgp();
5514
5515 /* Initialize the PCU interface abstraction */
5516 f_init_raw(testcasename());
5517
5518 /* Establish BSSGP connection to the PCU */
5519 f_bssgp_establish();
5520
5521 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005522 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 +01005523 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005524 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 +01005525 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02005526 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);
5527 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005528 f_sleep(1.0);
5529
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005530 var RIM_Routing_Address dst_addr;
5531 var RIM_Routing_Address src_addr;
5532 var template (value) RAN_Information_Request_RIM_Container req_cont;
5533 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005534 var template PDU_BSSGP bssgp_rim_pdu_expect;
5535 var template RAN_Information_RIM_Container rim_cont_expect;
5536
5537 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 +01005538 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5539 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005540
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005541 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5542 ts_RIM_Sequence_Number(1),
5543 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5544 ts_RIM_Protocol_Version_Number(1),
5545 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5546 omit);
5547 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5548 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5549 req_cont);
5550
5551 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5552 tr_RIM_Sequence_Number(1),
5553 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5554 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005555 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 +01005556 omit);
5557
5558 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5559 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5560 rim_cont_expect);
5561 RIM.send(bssgp_rim_pdu);
5562 T.start;
5563 alt {
5564 [] RIM.receive(bssgp_rim_pdu_expect) { }
5565 [] RIM.receive {
5566 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5567 }
5568 [] T.timeout {
5569 setverdict(fail, "No BSSGP RIM PDU received");
5570 mtc.stop;
5571 }
5572 }
5573
5574 f_shutdown(__BFILE__, __LINE__, final := true);
5575}
5576
5577/* Same as above, but in this case we simulate the rare case in which the PCU
5578 * has no system information available. We expect getting a response back but
5579 * with no system information inside. */
5580testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005581 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005582 var PCUIF_Message pcu_msg;
5583 timer T := 2.0;
5584
5585 /* Initialize NS/BSSGP side */
5586 f_init_bssgp();
5587
5588 /* Initialize the PCU interface abstraction */
5589 f_init_raw(testcasename(), info_ind);
5590
5591 /* Establish BSSGP connection to the PCU */
5592 f_bssgp_establish();
5593
5594 /* Clear sysinfo from the PCU */
5595 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);
5596 BTS.send(si1_data_ind);
5597 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);
5598 BTS.send(si3_data_ind);
5599 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);
5600 BTS.send(si16_data_ind);
5601 f_sleep(1.0);
5602
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005603 var RIM_Routing_Address dst_addr;
5604 var RIM_Routing_Address src_addr;
5605 var template (value) RAN_Information_Request_RIM_Container req_cont;
5606 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005607 var template PDU_BSSGP bssgp_rim_pdu_expect;
5608 var template RAN_Information_RIM_Container rim_cont_expect;
5609
5610 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 +01005611 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5612 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005613
5614 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5615 ts_RIM_Sequence_Number(1),
5616 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5617 ts_RIM_Protocol_Version_Number(1),
5618 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5619 omit);
5620 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5621 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5622 req_cont);
5623
5624
5625 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5626 tr_RIM_Sequence_Number(1),
5627 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5628 tr_RIM_Protocol_Version_Number(1),
5629 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
5630 omit);
5631
5632 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5633 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5634 rim_cont_expect);
5635 RIM.send(bssgp_rim_pdu);
5636 T.start;
5637 alt {
5638 [] RIM.receive(bssgp_rim_pdu_expect) { }
5639 [] RIM.receive {
5640 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5641 }
5642 [] T.timeout {
5643 setverdict(fail, "No BSSGP RIM PDU received");
5644 mtc.stop;
5645 }
5646 }
5647
5648 f_shutdown(__BFILE__, __LINE__, final := true);
5649}
5650
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005651control {
5652 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01005653 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005654 execute( TC_ta_ptcch_idle() );
5655 execute( TC_ta_rach_imm_ass() );
5656 execute( TC_ta_idle_dl_tbf_ass() );
5657 execute( TC_ta_ptcch_ul_multi_tbf() );
5658 execute( TC_cs_lqual_ul_tbf() );
5659 execute( TC_cs_initial_ul() );
5660 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01005661 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01005662 execute( TC_cs_max_dl() );
5663 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01005664 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01005665 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01005666 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01005667 execute( TC_mcs_max_dl() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005668 execute( TC_t3169() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01005669 execute( TC_n3101_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01005670 execute( TC_x2031_t3191() );
5671 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005672 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01005673 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02005674 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02005675 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02005676 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005677 execute( TC_mo_ping_pong() );
5678 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02005679 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005680 execute( TC_mt_ping_pong() );
5681 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005682 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005683 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07005684 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005685 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01005686 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005687 execute( TC_paging_cs_from_bts() );
5688 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
5689 execute( TC_paging_cs_from_sgsn_sign() );
5690 execute( TC_paging_cs_from_sgsn_ptp() );
5691 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
5692 execute( TC_paging_ps_from_sgsn_sign() );
5693 execute( TC_paging_ps_from_sgsn_ptp() );
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005694 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
5695 execute( TC_paging_cs_multi_ms_imsi() );
5696 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02005697 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
5698 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01005699 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
5700 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005701
5702 /* EGPRS specific test cases */
5703 execute( TC_egprs_pkt_chan_req_signalling() );
5704 execute( TC_egprs_pkt_chan_req_one_phase() );
5705 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07005706 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07005707 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07005708 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02005709
5710 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005711
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01005712 /* Immediate Assignment on AGCH/PCH */
5713 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
5714 execute( TC_pcuif_fh_imm_ass_ul() );
5715 execute( TC_pcuif_fh_imm_ass_dl() );
5716 /* Packet Uplink/Downlink Assignment on PACCH */
5717 execute( TC_pcuif_fh_pkt_ass_ul() );
5718 execute( TC_pcuif_fh_pkt_ass_dl() );
5719 execute( TC_multitrx_multims_alloc() );
5720 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
5721 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
5722 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
5723
Pau Espin Pedrole1303052020-11-16 11:13:51 +01005724 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07005725
5726 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005727 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005728 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005729 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005730 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005731 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005732 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005733 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005734 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005735 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
5736 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005737 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
5738 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
5739 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005740 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
5741 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005742 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
5743 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
5744 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005745 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005746
5747 execute( TC_rim_ran_info_req_single_rep() );
5748 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005749}
5750
Harald Weltea419df22019-03-21 17:23:04 +01005751}