blob: 187e2f1f180b73e2130bb69d1920ea37e375a81b [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 }
1749 [] T_3195.timeout {
1750 log("T_3195 timeout");
1751 /* Done in alt */
1752 }
1753 [] BTS.receive {
1754 setverdict(fail, "Unexpected BTS message");
1755 f_shutdown(__BFILE__, __LINE__);
1756 }
1757 }
1758
1759 /* after T_3195 timeout, TBF is released */
1760 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1761 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1762
1763 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1764 f_sleep(X2002);
1765 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1766
1767 /* ACK the DL block */
1768 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1769 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1770 f_dl_block_ack_fn(dl_block, dl_fn));
1771
1772 f_shutdown(__BFILE__, __LINE__, final := true);
1773}
1774
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001775/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
1776testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001777 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001778 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001779 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001780 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001781
1782 /* Initialize NS/BSSGP side */
1783 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001784 /* Initialize GPRS MS side */
1785 f_init_gprs_ms();
1786 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001787
1788 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001789 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001790
1791 /* Establish BSSGP connection to the PCU */
1792 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001793 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001794
1795 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001796 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001797
1798 /* Send one UL block (with TLLI since we are in One-Phase Access
1799 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001800 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001801 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
1802 f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true)
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001803 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1804 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001805 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001806
1807 /* Send enough blocks to test whole procedure: Until Nth block
1808 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
1809 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001810 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001811 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1812 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001813 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001814
1815 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001816 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 +07001817
1818 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001819}
1820
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001821/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
1822testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
1823 var RlcmacDlBlock dl_block;
1824 var uint32_t dl_fn, sched_fn;
1825 var octetstring payload;
1826 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001827 var template (value) LlcBlockHdr blk_hdr;
1828 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001829 var integer blk_len;
1830 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001831 var GprsMS ms;
1832
1833 /* Initialize NS/BSSGP side */
1834 f_init_bssgp();
1835 /* Initialize GPRS MS side */
1836 f_init_gprs_ms();
1837 ms := g_ms[0]; /* We only use first MS in this test */
1838
1839 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001840 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001841
1842 /* Establish BSSGP connection to the PCU */
1843 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001844 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001845
1846 /* Establish an Uplink TBF */
1847 f_ms_establish_ul_tbf(ms);
1848
1849 /* Send one UL block (with TLLI since we are in One-Phase Access
1850 contention resoultion) and make sure it is ACKED fine. */
1851 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001852 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1853 more := false, e := true);
1854 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001855 /* 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 +01001856 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
1857 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001858 cv := 15,
1859 bsn := ms.ul_tbf.bsn,
1860 blocks := blocks,
1861 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001862 f_ultbf_inc_bsn(ms.ul_tbf);
1863 f_ms_tx_ul_block(ms, ul_data);
1864
1865 /* ACK and check it was received fine */
1866 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1867 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1868 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1869 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001870 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 +02001871
1872 /* Test sending LLC PDUS of incrementing size */
1873 var integer max_size := 49;
1874 for (var integer i := 1; i <= max_size; i := i + 1) {
1875 var integer cv;
1876 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
1877 log("Sending DATA.ind with LLC payload size ", i);
1878 if (i < max_size - g_bs_cv_max) {
1879 cv := 15;
1880 } else {
1881 cv := max_size - i;
1882 }
1883
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001884 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
1885 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001886 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001887 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1888 more := false, e := true);
1889 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001890 /* 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 +01001891 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
1892 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001893 cv := cv,
1894 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001895 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001896 f_ultbf_inc_bsn(ms.ul_tbf);
1897 f_ms_tx_ul_block(ms, ul_data);
1898
1899 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001900 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 +02001901
1902 /* we will receive UL ACK/NACK from time to time, handle it. */
1903 f_rx_rlcmac_dl_block(dl_block, dl_fn);
1904 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1905 continue;
1906 }
1907 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
1908 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1909 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1910 f_shutdown(__BFILE__, __LINE__);
1911 }
1912
1913 log("Rx Packet Uplink ACK / NACK");
1914 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
1915 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1916 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1917 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07001918
1919 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001920}
1921
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001922function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
1923 var octetstring payload;
1924 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001925 var template (value) LlcBlockHdr blk_hdr;
1926 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001927 var integer block_len, max_valid_data_len;
1928 timer T;
1929
1930 block_len := f_rlcmac_cs_mcs2block_len(cs);
1931 /* We need to send with TLLI since we are in One-Phase Access Contenion
1932 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
1933 * indicator, -1 for spare bits octet at the end */
1934 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
1935 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 +07001936 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1937 more := false, e := true);
1938 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001939 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
1940 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001941 cv := cv,
1942 bsn := ms.ul_tbf.bsn,
1943 blocks := blocks,
1944 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001945 f_ultbf_inc_bsn(ms.ul_tbf);
1946 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
1947
1948 T.start(0.5);
1949 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02001950 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001951 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
1952 f_shutdown(__BFILE__, __LINE__);
1953 }
1954 [] T.timeout {
1955 setverdict(pass);
1956 }
1957 }
1958}
1959/* Verify PCU finds out incorrectly formated RLC block and discards it. This
1960 blocks intentionally contain last byte of data placed in last byte of RLC
1961 containing padding/spare bits, which is incorrect. Spare bits exist and are
1962 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
1963 discounting padding in octet" */
1964testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
1965 var GprsMS ms;
1966 var integer block_len, max_valid_data_len;
1967
1968 /* Initialize NS/BSSGP side */
1969 f_init_bssgp();
1970 /* Initialize GPRS MS side */
1971 f_init_gprs_ms();
1972 ms := g_ms[0]; /* We only use first MS in this test */
1973
1974 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001975 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001976
1977 /* Establish BSSGP connection to the PCU */
1978 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001979 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001980
1981 /* Establish an Uplink TBF */
1982 f_ms_establish_ul_tbf(ms);
1983
1984 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
1985 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
1986 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
1987
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07001988 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001989}
1990
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001991/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
1992 * answered, so TBFs for uplink and later for downlink are created.
1993 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001994private 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 +02001995 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001996 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001997 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001998 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001999 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002000
2001 /* Initialize NS/BSSGP side */
2002 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002003 /* Initialize GPRS MS side */
2004 f_init_gprs_ms();
2005 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002006
2007 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002008 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002009
2010 /* Establish BSSGP connection to the PCU */
2011 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002012 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002013
2014 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002015 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002016
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002017 /* Send one UL block (with TLLI since we are in One-Phase Access
2018 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002019 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002020 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2021 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002022 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002023
2024 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002025 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002026
2027 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002028 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2029 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002030
2031 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2032 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002033 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002034
2035 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002036 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2037 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2038 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002039
2040 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002041}
2042
2043/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2044 * answered, so TBFs for uplink and later for downlink are created.
2045 */
2046testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002047 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002048 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002049}
2050
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002051/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2052 * answered, so TBFs for uplink and later for downlink are created.
2053 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002054private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2055 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002056 template (present) CodingScheme exp_ul_cs_mcs := ?,
2057 template (present) CodingScheme exp_dl_cs_mcs := ?)
2058runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002059 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002060 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002061 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002062 var uint32_t sched_fn;
2063 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002064 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002065 var GprsMS ms;
2066
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002067 /* Initialize NS/BSSGP side */
2068 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002069 /* Initialize GPRS MS side */
2070 f_init_gprs_ms();
2071 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002072
2073 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002074 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002075
2076 /* Establish BSSGP connection to the PCU */
2077 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002078 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002079
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002080 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2081 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 +02002082
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002083 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2084 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 +02002085 f_shutdown(__BFILE__, __LINE__);
2086 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002087
2088 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2089 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002090 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002091
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002092 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002093 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 +02002094
2095 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002096 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002097
2098 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002099 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002100 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2101 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002102 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002103 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002104 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002105
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002106 /* PCU acks the UL data after having received CV=0) */
2107 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2108
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002109 /* 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 +02002110 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 +02002111
2112 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002113 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2114 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 +02002115 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002116
2117 f_shutdown(__BFILE__, __LINE__, final := true);
2118}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002119
2120testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002121 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2122 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002123
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002124 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 +02002125}
2126
2127testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002128 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2129 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002130
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002131 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 +02002132}
2133
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002134testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2135 /* Configure PCU to force two phase access */
2136 g_force_two_phase_access := true;
2137
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002138 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002139 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002140
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002141 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 +02002142}
2143
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002144/* Test scenario where SGSN wants to send some data against MS and it is
2145 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2146 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002147private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2148 template (present) CodingScheme exp_cs_mcs := ?)
2149runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002150 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002151 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002152 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002153 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002154 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002155
2156 /* Initialize NS/BSSGP side */
2157 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002158 /* Initialize GPRS MS side */
2159 f_init_gprs_ms();
2160 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002161
2162 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002163 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002164
2165 /* Establish BSSGP connection to the PCU */
2166 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002167 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002168
2169 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002170 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2171 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002172
2173 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2174 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002175 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002176
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002177 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002178 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2179 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 +02002180 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002181
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002182 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002183 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002184
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002185 /* Send one UL block (with TLLI since we are in One-Phase Access
2186 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002187 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002188 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2189 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002190 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002191
2192 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002193 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002194
2195 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002196}
2197
2198testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002199 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002200 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2201}
2202
2203/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2204/* information about the MS */
2205testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002206 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002207 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002208}
2209
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002210/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2211 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2212 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2213 * be transferred).
2214 */
2215testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002216 var RlcmacDlBlock dl_block;
2217 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002218 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002219 var octetstring total_payload;
2220 var octetstring payload;
2221 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002222 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002223 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002224 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002225
2226 /* Initialize NS/BSSGP side */
2227 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002228 /* Initialize GPRS MS side */
2229 f_init_gprs_ms();
2230 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002231
2232 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002233 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002234
2235 /* Establish BSSGP connection to the PCU */
2236 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002237 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002238
2239 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002240 f_ms_establish_ul_tbf(ms);
2241 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002242
2243 /* Send one UL block (with TLLI since we are in One-Phase Access
2244 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002245 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 +02002246 f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002247
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002248 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2249 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002250 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002251 total_payload := payload;
2252
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002253 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2254
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002255 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002256 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002257 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002258 total_payload := total_payload & payload;
2259
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 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002265 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 +02002266 total_payload := total_payload & lost_payload;
2267
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002268 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002269 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002270 total_payload := total_payload & payload;
2271
2272 /* 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 +02002273 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002274
2275 /* On CV=0, we'll receive a UL ACK asking about missing block */
2276 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2277 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002278 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2279 tfi := tfi,
2280 cv := 15,
2281 bsn := 3,
2282 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002283 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002284
2285 /* Now final ack is recieved */
2286 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2287 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002288 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002289
2290 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002291 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 +07002292
2293 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002294}
2295
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002296/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2297 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2298 * timeout occurs (specified by sent RRBP on DL block). */
2299testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002300 var RlcmacDlBlock dl_block;
2301 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002302 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002303 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002304
2305 /* Initialize NS/BSSGP side */
2306 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002307 /* Initialize GPRS MS side */
2308 f_init_gprs_ms();
2309 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002310
2311 /* Initialize the PCU interface abstraction */
2312 f_init_raw(testcasename());
2313
2314 /* Establish BSSGP connection to the PCU */
2315 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002316 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002317
2318 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002319 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2320 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002321
2322 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2323 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002324 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002325
2326 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2327 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2328 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002329 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002330
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002331 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2332 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002333 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002334
2335 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002336 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2337 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2338 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002339
2340 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002341}
2342
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002343/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2344testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2345 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2346 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002347 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002348 var RlcmacDlBlock dl_block;
2349 var uint32_t ack_fn;
2350 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002351 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002352 timer T := 5.0;
2353
2354 /* Initialize NS/BSSGP side */
2355 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002356 /* Initialize GPRS MS side */
2357 f_init_gprs_ms();
2358 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002359
2360 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002361 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002362
Daniel Willmann535aea62020-09-21 13:27:08 +02002363 f_statsd_reset();
2364
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002365 /* Establish BSSGP connection to the PCU */
2366 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002367 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002368
2369 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002370 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2371 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002372
2373 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2374 f_sleep(X2002);
2375
2376 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2377 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002378 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002379
2380 /* TDMA frame number on which we are supposed to send the ACK */
2381 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2382
2383 /* SGSN sends more blocks during the indicated RRBP */
2384 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2385 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002386 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002387
2388 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2389
2390 /* Make sure this block has the same TFI as was assigned
2391 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002392 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002393 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2394 dl_block.data.mac_hdr.hdr_ext.tfi);
2395 f_shutdown(__BFILE__, __LINE__);
2396 }
2397
2398 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002399 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002400
2401 /* Break if this is the end of RRBP */
2402 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002403 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002404 break;
2405 }
2406 }
2407
2408 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002409 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 +07002410
2411 /* Make sure that the next block (after the Ack) is dummy */
2412 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2413
Daniel Willmann535aea62020-09-21 13:27:08 +02002414 var StatsDExpects expect := {
2415 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2416 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2417 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2418 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2419 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002420 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002421 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2422 };
2423 f_statsd_expect(expect);
2424
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002425 f_shutdown(__BFILE__, __LINE__, final := true);
2426}
2427
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002428/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2429 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2430 * Check "3GPP TS 44.060" Annex B. */
2431testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2432 var RlcmacDlBlock dl_block;
2433 var octetstring dataA := f_rnd_octstring(20);
2434 var octetstring dataB := f_rnd_octstring(13);
2435 var octetstring dataC := f_rnd_octstring(3);
2436 var octetstring dataD := f_rnd_octstring(12);
2437 var uint32_t sched_fn;
2438 var GprsMS ms;
2439 var template (value) RlcmacUlBlock ul_data;
2440
2441 /* Initialize NS/BSSGP side */
2442 f_init_bssgp();
2443 /* Initialize GPRS MS side */
2444 f_init_gprs_ms();
2445 ms := g_ms[0]; /* We only use first MS in this test */
2446
2447 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002448 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002449
2450 /* Establish BSSGP connection to the PCU */
2451 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002452 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002453
2454 /* Establish an Uplink TBF */
2455 f_ms_establish_ul_tbf(ms);
2456
2457 /* Summary of what's transmitted:
2458 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2459 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2460 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2461 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2462 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2463 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2464 */
2465
2466 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002467 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2468 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002469 cv := 3,
2470 bsn := ms.ul_tbf.bsn,
2471 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2472 tlli := ms.tlli);
2473 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2474 * RLCMAC block being sent. */
2475 ul_data.data.mac_hdr.e := true;
2476 f_ultbf_inc_bsn(ms.ul_tbf);
2477 f_ms_tx_ul_block(ms, ul_data);
2478
2479 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002480 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2481 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002482 cv := 2,
2483 bsn := ms.ul_tbf.bsn,
2484 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2485 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2486 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2487 },
2488 tlli := ms.tlli);
2489 f_ultbf_inc_bsn(ms.ul_tbf);
2490 f_ms_tx_ul_block(ms, ul_data);
2491
2492 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002493 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 +02002494
2495 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002496 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2497 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002498 cv := 1,
2499 bsn := ms.ul_tbf.bsn,
2500 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2501 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2502 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2503 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2504 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2505 },
2506 tlli := ms.tlli);
2507 f_ultbf_inc_bsn(ms.ul_tbf);
2508 f_ms_tx_ul_block(ms, ul_data);
2509
2510 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002511 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2512 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 +02002513
2514 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002515 ul_data := t_RLCMAC_UL_DATA_TLLI(
2516 cs := CS_1,
2517 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002518 cv := 0,
2519 bsn := ms.ul_tbf.bsn,
2520 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2521 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2522 },
2523 tlli := ms.tlli);
2524 f_ultbf_inc_bsn(ms.ul_tbf);
2525 f_ms_tx_ul_block(ms, ul_data);
2526
2527 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002528 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 +02002529
2530 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2531 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2532 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2533
2534 f_shutdown(__BFILE__, __LINE__, final := true);
2535}
2536
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002537/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2538 * ACK/NACK is not answered */
2539testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2540 var RlcmacDlBlock dl_block;
2541 var octetstring data1 := f_rnd_octstring(200);
2542 var octetstring data2 := f_rnd_octstring(10);
2543 var uint32_t dl_fn;
2544 var GprsMS ms;
2545 var template (value) TsTrxBtsNum nr;
2546 var BTS_PDTCH_Block data_msg;
2547
2548 /* Initialize NS/BSSGP side */
2549 f_init_bssgp();
2550 /* Initialize GPRS MS side */
2551 f_init_gprs_ms();
2552 ms := g_ms[0]; /* We only use first MS in this test */
2553
2554 /* Initialize the PCU interface abstraction */
2555 f_init_raw(testcasename())
2556
2557 /* Establish BSSGP connection to the PCU */
2558 f_bssgp_establish();
2559 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2560
2561 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2562 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2563 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2564
2565 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2566 f_sleep(X2002);
2567
2568 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2569 while (true) {
2570 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2571
2572 /* Keep Ack/Nack description updated (except for last BSN) */
2573 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2574
2575 if (f_dl_block_rrbp_valid(dl_block)) {
2576 /* Don't transmit DL ACK here on purpose ignore it */
2577 break;
2578 }
2579 }
2580
2581 /* PCU starts whole process again */
2582 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2583
2584 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2585 f_sleep(X2002);
2586
2587 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2588 /* DL data), after that we receive only DUMMY blocks so we are done */
2589 var boolean data_received := false;
2590 nr := ts_TsTrxBtsNum;
2591 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2592 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2593 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2594 block_nr := nr.blk_nr));
2595 alt {
2596 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2597 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2598 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2599 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2600 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2601 tr_RLCMAC_DATA)) -> value data_msg {
2602 data_received := true;
2603 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2604 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2605 log("Received FINAL_ACK");
2606 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2607 }
2608 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2609 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2610 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2611 }
2612 nr := ts_TsTrxBtsNum;
2613 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2614 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2615 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2616 block_nr := nr.blk_nr));
2617 repeat;
2618 }
2619 [] BTS.receive {
2620 setverdict(fail, "Unexpected BTS message");
2621 f_shutdown(__BFILE__, __LINE__);
2622 }
2623 }
2624
2625 f_shutdown(__BFILE__, __LINE__, final := true);
2626}
2627
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002628/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2629testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002630 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002631 var octetstring data := f_rnd_octstring(10);
2632 var PacketDlAssign dl_tbf_ass;
2633 var RlcmacDlBlock dl_block;
2634 var uint32_t poll_fn;
2635 var uint32_t sched_fn;
2636 var GprsMS ms;
2637 timer T := 5.0;
2638
2639 /* Initialize NS/BSSGP side */
2640 f_init_bssgp();
2641 /* Initialize GPRS MS side */
2642 f_init_gprs_ms();
2643 ms := g_ms[0]; /* We only use first MS in this test */
2644
2645 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002646 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2647 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002648
2649 /* Initialize the PCU interface abstraction */
2650 f_init_raw(testcasename(), info_ind);
2651
2652 /* Establish BSSGP connection to the PCU */
2653 f_bssgp_establish();
2654 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2655
2656 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2657 through PDCH (no multiblock assignment possible through PCH) */
2658 f_ms_establish_ul_tbf(ms);
2659
2660 /* Send one UL block (with TLLI since we are in One-Phase Access
2661 contention resoultion) and make sure it is ACKED fine */
2662 f_ms_tx_ul_data_block(ms, data, with_tlli := true, nr := f_ms_tx_TsTrxBtsNum(ms));
2663 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2664 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2665
2666 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2667 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2668 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2669 gprsextendeddynalloccap := '0'B
2670 };
2671 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2672 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2673 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2674 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2675 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2676 f_shutdown(__BFILE__, __LINE__);
2677 }
2678 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2679
2680 f_shutdown(__BFILE__, __LINE__, final := true);
2681}
2682
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002683testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002684 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002685 var RlcmacDlBlock dl_block;
2686 var octetstring data := f_rnd_octstring(10);
2687 var PollFnCtx pollctx;
2688 var uint32_t sched_fn;
2689 var GprsMS ms;
2690
2691 var MultislotCap_GPRS mscap_gprs := {
2692 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2693 gprsextendeddynalloccap := '0'B
2694 };
2695 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2696
2697
2698 /* Initialize NS/BSSGP side */
2699 f_init_bssgp();
2700 /* Initialize GPRS MS side */
2701 f_init_gprs_ms();
2702 ms := g_ms[0]; /* We only use first MS in this test */
2703
2704 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002705 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2706 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002707
2708 /* Initialize the PCU interface abstraction */
2709 f_init_raw(testcasename(), info_ind);
2710
2711 /* Establish BSSGP connection to the PCU */
2712 f_bssgp_establish();
2713 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2714
2715 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2716 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2717
2718 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
2719 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
2720
2721 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2722 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2723 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2724 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2725 f_shutdown(__BFILE__, __LINE__);
2726 }
2727 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2728
2729 f_shutdown(__BFILE__, __LINE__, final := true);
2730}
2731
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002732testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
2733 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
2734 var RlcmacDlBlock dl_block;
2735 var octetstring data := f_rnd_octstring(10);
2736 var PollFnCtx pollctx;
2737 var uint32_t sched_fn;
2738 var GprsMS ms;
2739
2740 var MultislotCap_GPRS mscap_gprs := {
2741 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2742 gprsextendeddynalloccap := '0'B
2743 };
2744 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2745
2746
2747 /* Initialize NS/BSSGP side */
2748 f_init_bssgp();
2749 /* Initialize GPRS MS side */
2750 f_init_gprs_ms();
2751 ms := g_ms[0]; /* We only use first MS in this test */
2752
2753 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002754 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2755 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002756
2757 /* Initialize the PCU interface abstraction */
2758 f_init_raw(testcasename(), info_ind);
2759
2760 /* Establish BSSGP connection to the PCU */
2761 f_bssgp_establish();
2762 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2763
2764 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2765 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2766
2767 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
2768 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
2769 f_shutdown(__BFILE__, __LINE__);
2770 }
2771
2772 f_shutdown(__BFILE__, __LINE__, final := true);
2773}
2774
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002775/* Test scenario where MS wants to request a new TBF once the current one is
2776 * ending, by means of sending a Packet Resource Request on ul slot provided by
2777 * last Pkt Ul ACK's RRBP.
2778 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
2779testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002780 var RlcmacDlBlock dl_block;
2781 var octetstring data := f_rnd_octstring(10);
2782 var uint32_t sched_fn;
2783 var uint32_t dl_fn;
2784 var template RlcmacDlBlock acknack_tmpl;
2785 var GprsMS ms;
2786
2787 /* Initialize NS/BSSGP side */
2788 f_init_bssgp();
2789 /* Initialize GPRS MS side */
2790 f_init_gprs_ms();
2791 ms := g_ms[0]; /* We only use first MS in this test */
2792
2793 /* Initialize the PCU interface abstraction */
2794 f_init_raw(testcasename());
2795
2796 /* Establish BSSGP connection to the PCU */
2797 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002798 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002799
2800 /* Establish an Uplink TBF */
2801 f_ms_establish_ul_tbf(ms);
2802
2803 /* Send one UL block (with TLLI since we are in One-Phase Access
2804 contention resoultion) and make sure it is ACKED fine */
2805 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
2806
2807 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002808 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002809
2810 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
2811 tr_UlAckNackGprs(ms.tlli,
2812 tr_AckNackDescription(final_ack := '1'B),
2813 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
2814 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2815
2816 /* TODO: verify TBF_EST and FinalACK are both '1' above */
2817
2818 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07002819 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 +07002820 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002821 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2822 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2823
2824 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2825 and make sure it is ACKED fine */
2826 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
2827
2828 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002829 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002830
2831 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2832 /* ACK the ACK */
2833 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2834
2835 f_shutdown(__BFILE__, __LINE__, final := true);
2836}
2837
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002838/* Test CS paging over the BTS<->PCU socket.
2839 * 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.
2840 * Paging should be send on the PACCH.
2841 *
2842 * 1. Send a Paging Request over PCU socket.
2843 * 2. Send a Ready-To-Send message over PCU socket
2844 * 3. Expect a Paging Frame
2845 */
2846testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002847 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002848 var MobileIdentityLV mi;
2849 var octetstring mi_enc_lv;
2850 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002851 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002852
2853 /* Initialize NS/BSSGP side */
2854 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002855 /* Initialize GPRS MS side */
2856 f_init_gprs_ms();
2857 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002858
2859 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002860 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002861
2862 /* Establish BSSGP connection to the PCU */
2863 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002864 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002865
2866 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002867 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002868
2869 /* build mobile Identity */
2870 mi := valueof(ts_MI_IMSI_LV(imsi));
2871 mi_enc_lv := enc_MobileIdentityLV(mi);
2872 /* Send paging request */
2873 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
2874 sapi :=PCU_IF_SAPI_PDTCH));
2875
2876 /* Receive it on BTS side towards MS */
2877 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2878
2879 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002880 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
2881 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2882 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2883 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002884
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002885 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002886}
2887
2888/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
2889 */
2890private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2891runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002892 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002893 var hexstring imsi := f_gen_imsi(42);
2894 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002895 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002896
2897 /* Initialize NS/BSSGP side */
2898 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002899 /* Initialize GPRS MS side */
2900 f_init_gprs_ms();
2901 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002902
2903 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002904 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002905
2906 /* Establish BSSGP connection to the PCU */
2907 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002908 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002909
2910 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002911 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002912
2913 /* Send paging request with or without TMSI */
2914 if (use_ptmsi) {
2915 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
2916 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
2917 } else {
2918 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
2919 }
2920
2921 /* Receive it on BTS side towards MS */
2922 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2923
2924 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002925 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002926 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002927 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
2928 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
2929 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002930 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002931 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2932 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2933 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002934 }
2935
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002936 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002937}
2938
2939testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
2940 f_tc_paging_cs_from_sgsn(0, true);
2941}
2942
2943testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
2944 f_tc_paging_cs_from_sgsn(0);
2945}
2946
2947testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02002948 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002949}
2950
2951/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
2952 */
2953private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2954runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002955 var integer imsi_suff_tx := 423;
2956 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002957 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002958
2959 /* Initialize NS/BSSGP side */
2960 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002961 /* Initialize GPRS MS side */
2962 f_init_gprs_ms();
2963 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002964
2965 /* Initialize the PCU interface abstraction */
2966 f_init_raw(testcasename());
2967
2968 /* Establish BSSGP connection to the PCU */
2969 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002970 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002971
2972 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
2973 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
2974 if (use_ptmsi) {
2975 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
2976 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
2977 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
2978 } else {
2979 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
2980 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
2981 }
2982
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002983 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002984}
2985
2986testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
2987 f_tc_paging_ps_from_sgsn(0, true);
2988}
2989
2990testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
2991 f_tc_paging_ps_from_sgsn(0);
2992}
2993
2994testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02002995 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002996}
2997
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002998/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
2999testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3000 var RlcmacDlBlock dl_block;
3001 var octetstring data := f_rnd_octstring(10);
3002 var uint32_t sched_fn;
3003 var uint32_t dl_fn;
3004 var GprsMS ms;
3005
3006 /* Initialize NS/BSSGP side */
3007 f_init_bssgp();
3008 /* Initialize GPRS MS side */
3009 f_init_gprs_ms();
3010 ms := g_ms[0]; /* We only use first MS in this test */
3011
3012 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003013 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003014
Daniel Willmann535aea62020-09-21 13:27:08 +02003015 f_statsd_reset();
3016
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003017 /* Establish BSSGP connection to the PCU */
3018 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003019 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003020
3021 /* Establish an Uplink TBF */
3022 f_ms_establish_ul_tbf(ms);
3023
3024 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
3025 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
3026 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3027 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3028 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3029
3030 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003031 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003032
3033 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3034 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3035 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3036
3037 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3038 f_sleep(X2002);
3039 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3040
3041 /* ACK the DL block */
3042 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3043 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3044 f_dl_block_ack_fn(dl_block, dl_fn));
3045
Daniel Willmann535aea62020-09-21 13:27:08 +02003046 var StatsDExpects expect := {
3047 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3048 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3049 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3050 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003051 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003052 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003053 };
3054 f_statsd_expect(expect);
3055
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003056 f_shutdown(__BFILE__, __LINE__, final := true);
3057}
3058
3059/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3060testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3061 var RlcmacDlBlock dl_block;
3062 var octetstring data := f_rnd_octstring(10);
3063 var uint32_t sched_fn;
3064 var uint32_t dl_fn;
3065 var GprsMS ms;
3066
3067 /* Initialize NS/BSSGP side */
3068 f_init_bssgp();
3069 /* Initialize GPRS MS side */
3070 f_init_gprs_ms();
3071 ms := g_ms[0]; /* We only use first MS in this test */
3072
3073 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003074 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003075
3076 /* Establish BSSGP connection to the PCU */
3077 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003078 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003079
3080 /* Establish an Uplink TBF */
3081 f_ms_establish_ul_tbf(ms);
3082
3083 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
3084 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
3085 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3086 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3087 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3088
3089 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003090 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003091
3092 /* Now SGSN sends some DL data with an invalid IMSI */
3093 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3094
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003095 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003096
3097 /* TODO: make sure no data is sent over PCU -> MS */
3098
3099 f_shutdown(__BFILE__, __LINE__, final := true);
3100}
3101
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003102private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3103 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3104 var octetstring data := f_rnd_octstring(6);
3105 var RlcmacDlBlock dl_block;
3106 var GprsMS ms;
3107 var uint32_t fn;
3108
3109 /* Initialize NS/BSSGP side */
3110 f_init_bssgp();
3111 /* Initialize GPRS MS side */
3112 f_init_gprs_ms();
3113 ms := g_ms[0]; /* We only use first MS in this test */
3114
3115 /* Initialize the PCU interface abstraction */
3116 f_init_raw(testcasename());
3117
3118 /* Establish BSSGP connection to the PCU */
3119 f_bssgp_establish();
3120 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3121
3122 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3123 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3124 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3125
3126 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3127 f_sleep(X2002);
3128
3129 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3130 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3131
3132 if (ischosen(dl_block.data_egprs)) {
3133 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3134 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3135 f_shutdown(__BFILE__, __LINE__);
3136 }
3137 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3138 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3139 f_shutdown(__BFILE__, __LINE__);
3140 }
3141 if (not match(dl_block.data_egprs.blocks[1].payload,
3142 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3143 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3144 f_shutdown(__BFILE__, __LINE__);
3145 }
3146 } else if (lengthof(dl_block.data.blocks) > 1) {
3147 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3148 f_shutdown(__BFILE__, __LINE__);
3149 }
3150
3151 f_shutdown(__BFILE__, __LINE__, final := true);
3152}
3153
3154/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3155 * containing llc data. See OS#4849 */
3156testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3157 f_tc_dl_data_no_llc_ui_dummy(omit);
3158}
3159
3160/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3161 * containing llc data. See OS#4849 */
3162testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003163 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003164}
3165
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003166private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003167 template GsmRrMessage t_imm_ass := ?,
3168 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003169runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003170 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003171 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003172
3173 ra11 := enc_EGPRSPktChRequest2uint(req);
3174 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3175
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003176 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003177 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003178 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003179 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003180 }
3181
3182 setverdict(pass);
3183}
3184
3185testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3186 var template GsmRrMessage imm_ass;
3187 var template IaRestOctets rest;
3188 var template EgprsUlAss ul_ass;
3189
3190 /* Initialize the PCU interface abstraction */
3191 f_init_raw(testcasename());
3192
3193 var EGPRSPktChRequest req := {
3194 /* NOTE: other fields are set in the loop */
3195 signalling := { tag := '110011'B }
3196 };
3197
3198 for (var integer i := 0; i < 6; i := i + 1) {
3199 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3200 req.signalling.random_bits := ext_ra;
3201
3202 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3203 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3204 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3205 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3206
3207 f_TC_egprs_pkt_chan_req(req, imm_ass);
3208 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003209
3210 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003211}
3212
3213testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3214 var template GsmRrMessage imm_ass;
3215 var template IaRestOctets rest;
3216 var template EgprsUlAss ul_ass;
3217
3218 /* Initialize the PCU interface abstraction */
3219 f_init_raw(testcasename());
3220
3221 var EGPRSPktChRequest req := {
3222 /* NOTE: other fields are set in the loop */
3223 one_phase := { tag := '0'B }
3224 };
3225
3226 for (var integer i := 0; i < 6; i := i + 1) {
3227 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3228 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3229 var BIT2 priority := substr(ext_ra, 0, 2);
3230 var BIT3 rand := substr(ext_ra, 2, 3);
3231
3232 req.one_phase.multislot_class := mslot_class;
3233 req.one_phase.priority := priority;
3234 req.one_phase.random_bits := rand;
3235
3236 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3237 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3238 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3239 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3240
3241 f_TC_egprs_pkt_chan_req(req, imm_ass);
3242 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003243
3244 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003245}
3246
3247testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3248 var template GsmRrMessage imm_ass;
3249 var template IaRestOctets rest;
3250 var template EgprsUlAss ul_ass;
3251
3252 /* Initialize the PCU interface abstraction */
3253 f_init_raw(testcasename());
3254
3255 var EGPRSPktChRequest req := {
3256 /* NOTE: other fields are set in the loop */
3257 two_phase := { tag := '110000'B }
3258 };
3259
3260 for (var integer i := 0; i < 6; i := i + 1) {
3261 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3262 var BIT2 priority := substr(ext_ra, 0, 2);
3263 var BIT3 rand := substr(ext_ra, 2, 3);
3264
3265 req.two_phase.priority := priority;
3266 req.two_phase.random_bits := rand;
3267
3268 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3269 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3270 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3271 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3272
3273 f_TC_egprs_pkt_chan_req(req, imm_ass);
3274 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003275
3276 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003277}
3278
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003279private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3280 template IARRestOctets rest := ?,
3281 PCUIF_BurstType bt := BURST_TYPE_1)
3282runs on RAW_PCU_Test_CT {
3283 var template ReqRefWaitInd tr_ref;
3284 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003285
3286 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3287 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3288 ra := bit2int(ra11), is_11bit := 1,
3289 burst_type := bt, fn := fn,
3290 arfcn := 871));
3291
3292 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003293 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003294
3295 /* Just to have a short-name reference to the actual message */
3296 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3297
3298 /* Make sure that Request Reference list contains at least one entry
3299 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
3300 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn));
3301 if (not match(iar.payload, { *, tr_ref, * })) {
3302 setverdict(fail, "Request Reference list does not match");
3303 f_shutdown(__BFILE__, __LINE__);
3304 }
3305
3306 /* Match Feature Indicator (must indicate PS domain) */
3307 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3308 setverdict(fail, "Feature Indicator does not match");
3309 f_shutdown(__BFILE__, __LINE__);
3310 }
3311
3312 /* Match IAR Rest Octets */
3313 if (not match(iar.rest_octets, rest)) {
3314 setverdict(fail, "IAR Rest Octets does not match: ",
3315 iar.rest_octets, " vs expected ", rest);
3316 f_shutdown(__BFILE__, __LINE__);
3317 }
3318
3319 setverdict(pass);
3320}
3321
3322/* Verify the contents of RR Immediate Assignment Reject message and its
3323 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3324testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3325 var template IARRestOctets rest;
3326 var BIT5 ext_ra;
3327
3328 /* Initialize the PCU interface abstraction */
3329 f_init_raw(testcasename());
3330
3331 for (var integer i := 0; i < 6; i := i + 1) {
3332 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3333 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3334
3335 /* Intentionally incorrect message (see table 11.2.5a.2) */
3336 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3337 }
3338
3339 f_shutdown(__BFILE__, __LINE__, final := true);
3340}
3341
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003342/* At the moment, the IUT does not support any emergency services. Make sure
3343 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3344testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3345 var template IARRestOctets rest;
3346 var BIT5 ext_ra;
3347 var BIT11 ra11;
3348
3349 /* Initialize the PCU interface abstraction */
3350 f_init_raw(testcasename());
3351
3352 var EGPRSPktChRequest req := {
3353 /* NOTE: other fields are set in the loop */
3354 emergency := { tag := '110111'B }
3355 };
3356
3357 for (var integer i := 0; i < 6; i := i + 1) {
3358 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3359 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3360
3361 req.emergency.random_bits := ext_ra;
3362 ra11 := enc_EGPRSPktChRequest2bits(req);
3363
3364 /* Intentionally incorrect message (see table 11.2.5a.2) */
3365 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3366 }
3367
3368 f_shutdown(__BFILE__, __LINE__, final := true);
3369}
3370
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003371/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3372testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003373 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003374 var template IARRestOctets rest;
3375 var BIT11 ra11;
3376
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003377 info_ind := valueof(ts_PCUIF_INFO_default);
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003378
3379 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003380 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3381 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003382
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003383 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003384 f_init_raw(testcasename(), info_ind);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003385
3386 var EGPRSPktChRequest req := {
3387 one_phase := {
3388 tag := '0'B,
3389 multislot_class := '10101'B,
3390 priority := '01'B,
3391 random_bits := '101'B
3392 }
3393 };
3394
3395 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3396 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3397 for (var integer i := 0; i < 7; i := i + 1) {
3398 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3399 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3400 }
3401
3402 ra11 := enc_EGPRSPktChRequest2bits(req);
3403 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3404
3405 /* At this point, the IUT should run out of free USFs */
3406 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
3407
3408 f_shutdown(__BFILE__, __LINE__, final := true);
3409}
3410
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003411/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003412private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003413return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003414 /* Pick a random MA length in range 2 .. max_ma_len */
3415 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
3416
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003417 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
3418 hsn := f_rnd_int(63),
3419 maio := f_rnd_int(63),
3420 ma := f_rnd_bitstring(ma_len));
3421}
3422
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003423private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
3424 in GsmRrMessage rr_msg)
3425{
3426 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003427 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003428
3429 var template PacketChannelDescription tr_pkt_chan_desc := {
3430 channel_Type_spare := ?,
3431 tn := ?,
3432 tsc := ts.tsc,
3433 presence := '1'B,
3434 zero := omit,
3435 one := {
3436 maio := ts.maio,
3437 hsn := ts.hsn
3438 }
3439 };
3440
3441 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
3442 setverdict(fail, "Packet Channel Description does not match: ",
3443 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
3444 }
3445
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003446 /* Mobile Allocation is expected to be octet-aligned */
3447 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
3448 var template MobileAllocationLV tr_ma := {
3449 len := ma_oct_len, /* in bytes */
3450 ma := substr(ts.ma, 0, ma_oct_len * 8)
3451 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003452
3453 if (not match(ia.mobile_allocation, tr_ma)) {
3454 setverdict(fail, "Mobile Allocation does not match: ",
3455 ia.mobile_allocation, " vs ", tr_ma);
3456 }
3457
3458 setverdict(pass);
3459}
3460
3461/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
3462testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003463 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003464 var GprsMS ms := valueof(t_GprsMS_def);
3465
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003466 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003467 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003468
3469 /* Initialize the PCU interface abstraction */
3470 f_init_raw(testcasename(), info_ind);
3471
3472 /* EGPRS Packet Channel Request (cause=Signalling) */
3473 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
3474
3475 /* Establish an Uplink EGPRS TBF */
3476 f_ms_establish_ul_tbf(ms);
3477
3478 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3479 f_shutdown(__BFILE__, __LINE__, final := true);
3480}
3481
3482/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
3483testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003484 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003485 var GprsMS ms := valueof(t_GprsMS_def);
3486
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003487 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003488 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003489
3490 /* Initialize the PCU interface abstraction */
3491 f_init_raw(testcasename(), info_ind);
3492
3493 /* Establish an Uplink TBF */
3494 f_ms_establish_ul_tbf(ms);
3495
3496 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3497 f_shutdown(__BFILE__, __LINE__, final := true);
3498}
3499
3500/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
3501testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003502 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003503 var GprsMS ms := valueof(t_GprsMS_def);
3504
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003505 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003506 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003507
3508 /* Initialize NS/BSSGP side */
3509 f_init_bssgp();
3510
3511 /* Initialize the PCU interface abstraction */
3512 f_init_raw(testcasename(), info_ind);
3513
3514 /* Establish BSSGP connection to the PCU */
3515 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003516 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003517
3518 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3519 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
3520 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3521
3522 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
3523 f_shutdown(__BFILE__, __LINE__, final := true);
3524}
3525
3526private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
3527 in FrequencyParameters fp)
3528{
3529 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003530 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003531
3532 /* Table 12.8.1: Frequency Parameters information elements */
3533 var template FrequencyParameters tr_fp := {
3534 tsc := ts.tsc,
3535 presence := '10'B, /* Direct encoding 1 */
3536 arfcn := omit,
3537 indirect := omit,
3538 direct1 := {
3539 maio := ts.maio,
3540 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
3541 mobile_allocation := {
3542 hsn := ts.hsn,
3543 rfl_number_list_present := '0'B,
3544 rfl_number_list := omit,
3545 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003546 ma_length := ts.ma_bit_len,
3547 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003548 }
3549 },
3550 direct2 := omit
3551 };
3552
3553 if (not match(fp, tr_fp)) {
3554 setverdict(fail, "Frequency Parameters IE does not match: ",
3555 fp, " vs ", tr_fp);
3556 }
3557
3558 setverdict(pass);
3559}
3560
3561/* Make sure that Packet Uplink Assignment contains hopping parameters */
3562testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003563 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003564 var GprsMS ms := valueof(t_GprsMS_def);
3565 var uint32_t poll_fn;
3566
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003567 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003568 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003569
3570 /* Initialize the PCU interface abstraction */
3571 f_init_raw(testcasename(), info_ind);
3572
3573 /* Establish an Uplink TBF */
3574 f_ms_establish_ul_tbf(ms);
3575
3576 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
3577 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)));
3578
3579 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003580 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
3581 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003582
3583 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
3584 var template (omit) FrequencyParameters fp;
3585 if (ua.is_egprs == '1'B) {
3586 fp := ua.egprs.freq_par;
3587 } else {
3588 fp := ua.gprs.freq_par;
3589 }
3590
3591 /* This is an optional IE, so it's worth to check its presence */
3592 if (istemplatekind(fp, "omit")) {
3593 setverdict(fail, "Frequency Parameters IE is not present");
3594 f_shutdown(__BFILE__, __LINE__);
3595 }
3596
3597 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
3598 f_shutdown(__BFILE__, __LINE__, final := true);
3599}
3600
3601/* Make sure that Packet Downlink Assignment contains hopping parameters */
3602testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003603 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003604 var octetstring data := f_rnd_octstring(10);
3605 var GprsMS ms := valueof(t_GprsMS_def);
3606 var RlcmacDlBlock dl_block;
3607 var uint32_t poll_fn;
3608
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003609 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003610 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003611
3612 /* Initialize NS/BSSGP side */
3613 f_init_bssgp();
3614
3615 /* Initialize the PCU interface abstraction */
3616 f_init_raw(testcasename(), info_ind);
3617
3618 /* Establish BSSGP connection to the PCU */
3619 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003620 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003621
3622 /* Establish an Uplink TBF */
3623 f_ms_establish_ul_tbf(ms);
3624
3625 /* Send an Uplink block, so this TBF becomes "active" */
3626 f_ms_tx_ul_data_block(ms, data, with_tlli := true);
3627
3628 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3629 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
3630 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
3631
3632 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
3633 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3634
3635 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003636 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
3637 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003638
3639 /* This is an optional IE, so it's worth to check its presence */
3640 if (not ispresent(da.freq_par)) {
3641 setverdict(fail, "Frequency Parameters IE is not present");
3642 f_shutdown(__BFILE__, __LINE__);
3643 }
3644
3645 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
3646 f_shutdown(__BFILE__, __LINE__, final := true);
3647}
3648
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003649/* Check if the IUT handles subsequent INFO.ind messages */
3650testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003651 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003652 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003653
3654 /* Initialize the PCU interface abstraction */
3655 f_init_raw(testcasename(), info_ind);
3656
3657 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
3658 for (var integer i := 0; i < 16; i := i + 1) {
3659 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003660 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003661 }
3662
3663 f_shutdown(__BFILE__, __LINE__, final := true);
3664}
3665
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003666/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
3667testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
3668 var PCUIF_info_ind info_ind;
3669 var integer i;
3670 const integer num_ms := 8;
3671
3672 /* Initialize NS/BSSGP side */
3673 f_init_bssgp();
3674 /* Initialize GPRS MS side */
3675 f_init_gprs_ms(num_ms);
3676
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003677 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003678 /* Only the 3 first TRX are enabled. The enabled ones all have same
3679 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003680 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
3681 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
3682 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
3683 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003684
3685 /* Initialize the PCU interface abstraction */
3686 f_init_raw(testcasename(), info_ind);
3687
3688 /* Establish BSSGP connection to the PCU */
3689 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003690 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003691
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003692 /* Establish an Uplink TBF for each GprsMS instance */
3693 f_multi_ms_establish_tbf(do_activate := false);
3694
3695 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003696 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003697 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01003698 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003699 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003700 f_shutdown(__BFILE__, __LINE__);
3701 }
3702 }
3703
3704 f_shutdown(__BFILE__, __LINE__, final := true);
3705}
3706
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003707/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
3708 * downgraded to CS1-4 so that GPRS can read the USF).
3709 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
3710 */
3711testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
3712 var PCUIF_info_ind info_ind;
3713 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
3714 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003715 var uint32_t sched_fn, dl_fn, ack_fn;
3716 var octetstring data := f_rnd_octstring(10);
3717 var RlcmacDlBlock dl_block;
3718 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003719 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003720 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
3721 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
3722
3723 /* Initialize NS/BSSGP side */
3724 f_init_bssgp();
3725 /* Initialize GPRS MS side */
3726 f_init_gprs_ms(num_ms);
3727
3728 info_ind := valueof(ts_PCUIF_INFO_default);
3729 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003730 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
3731 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003732
3733 /* Initialize the PCU interface abstraction */
3734 f_init_raw(testcasename(), info_ind);
3735
3736 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
3737 g_mcs_initial_dl := 5;
3738 g_mcs_max_dl := 5;
3739 f_pcuvty_set_allowed_cs_mcs();
3740
3741 /* Establish BSSGP connection to the PCU */
3742 f_bssgp_establish();
3743 f_multi_ms_bssgp_register();
3744
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003745 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003746 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 +01003747 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
3748 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
3749 f_shutdown(__BFILE__, __LINE__);
3750 }
3751 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3752 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3753
3754 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003755 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 +01003756 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
3757 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
3758 f_shutdown(__BFILE__, __LINE__);
3759 }
3760 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3761 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3762
3763 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
3764 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3765 f_sleep(0.1);
3766 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3767 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3768 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
3769 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3770 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
3771 /* ACK the DL block */
3772 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
3773 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
3774 f_dl_block_ack_fn(dl_block, dl_fn));
3775
3776 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
3777 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3778 f_sleep(0.1);
3779 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3780 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3781 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
3782 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3783 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
3784 /* ACK the DL block */
3785 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
3786 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
3787 f_dl_block_ack_fn(dl_block, dl_fn));
3788
3789 data := f_rnd_octstring(1400);
3790 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3791 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3792
3793 for (var integer i := 0; i < 800; i := i + 1) {
3794 f_rx_rlcmac_dl_block(dl_block, dl_fn);
3795
3796 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
3797 /* No more data to receive, done */
3798 break;
3799 }
3800
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003801 usf_ms := -1;
3802
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003803 if (ischosen(dl_block.ctrl)) {
3804 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
3805 f_shutdown(__BFILE__, __LINE__);
3806 } else if (ischosen(dl_block.data_egprs)) {
3807 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
3808 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
3809 f_shutdown(__BFILE__, __LINE__);
3810 }
3811 tgt_ms := 1;
3812 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
3813 if (dl_block.data_egprs.mcs > MCS_4) {
3814 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
3815 f_shutdown(__BFILE__, __LINE__);
3816 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003817 usf_ms := 0;
3818 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003819 } else {
3820 if (dl_block.data_egprs.mcs <= MCS_4) {
3821 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
3822 f_shutdown(__BFILE__, __LINE__);
3823 }
3824 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003825 usf_ms := 1;
3826 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003827 }
3828 }
3829 } else {
3830 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
3831 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
3832 f_shutdown(__BFILE__, __LINE__);
3833 }
3834 tgt_ms := 0;
3835 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 +01003836 usf_ms := 0;
3837 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003838 } 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 +01003839 usf_ms := 1;
3840 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003841 }
3842 }
3843
3844 /* Keep Ack/Nack description updated */
3845 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
3846
3847 /* TDMA frame number on which we are supposed to send the ACK */
3848 if (f_dl_block_rrbp_valid(dl_block)) {
3849 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
3850 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);
3851 if (tx_data_remain != 0) {
3852 /* Submit more data from time to time to keep the TBF ongoing */
3853 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3854 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3855 tx_data_remain := tx_data_remain - 1;
3856 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003857 } else if (tx_data_remain != 0) {
3858 /* keep sending UL blocks when requested by USF to avoid
3859 * UL TBF timeout and hence stop receival of USFs */
3860 if (usf_ms != -1) {
3861 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
3862 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003863 }
3864 }
3865
3866 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 +01003867 /* He we check that DL blocks scheduled at GPRS can still request UL
3868 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
3869 * condition also ensures the downgrade to <=MCS4 condition is tested
3870 * above */
3871 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
3872 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003873 f_shutdown(__BFILE__, __LINE__);
3874 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003875 /* Here check for some level of fairness between them (at least ~40%): */
3876 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
3877 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
3878 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
3879 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
3880 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3881 f_shutdown(__BFILE__, __LINE__);
3882 }
3883 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
3884 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3885 f_shutdown(__BFILE__, __LINE__);
3886 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003887
3888 f_shutdown(__BFILE__, __LINE__, final := true);
3889}
3890
3891
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07003892private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
3893 boolean exp_imsi, boolean exp_tmsi)
3894runs on RAW_PCU_Test_CT {
3895 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
3896 var integer pending := lengthof(g_ms);
3897 var RlcmacDlBlock dl_block;
3898 var boolean f1, f2;
3899
3900 while (pending > 0) {
3901 var uint32_t poll_fn;
3902
3903 /* Obtain a Downlink block and make sure it is a paging request */
3904 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
3905 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
3906 setverdict(fail, "Rx unexpected DL block: ", dl_block);
3907 break;
3908 }
3909
3910 /* This should not happen in general, but who knows... */
3911 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3912 if (not ispresent(req.repeated_pageinfo)) {
3913 setverdict(fail, "Repeated Page Info IE is absent?!?");
3914 break;
3915 }
3916
3917 /* A single message may contain several MIs depending on their type */
3918 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3919 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
3920 ps_domain := false);
3921 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
3922 ps_domain := false);
3923 if (not f1 and not f2)
3924 { continue; }
3925
3926 /* Detect duplicate MIs */
3927 if (mask[i] == '1'B) {
3928 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
3929 continue;
3930 }
3931
3932 mask[i] := '1'B;
3933 }
3934
3935 pending := pending - lengthof(req.repeated_pageinfo);
3936 }
3937
3938 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
3939 if (mask[i] != '1'B) {
3940 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
3941 log("===== mask := ", mask);
3942 }
3943 }
3944
3945 /* All messages must have been received by now, expect a dummy block */
3946 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
3947}
3948
3949private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
3950runs on RAW_PCU_Test_CT {
3951 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3952 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3953
3954 /* Initialize NS/BSSGP side */
3955 f_init_bssgp();
3956
3957 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003958 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07003959
3960 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
3961 f_init_gprs_ms(7 * 8);
3962
3963 /* Initialize the PCU interface abstraction */
3964 f_init_raw(testcasename(), info_ind);
3965
3966 /* Establish BSSGP connection to the PCU */
3967 f_bssgp_establish();
3968 f_multi_ms_bssgp_register();
3969
3970 /* Establish an Uplink TBF for each GprsMS instance */
3971 f_multi_ms_establish_tbf(do_activate := true);
3972}
3973
3974testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
3975 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3976
3977 /* Common part: send INFO.ind, establish TBFs... */
3978 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
3979
3980 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
3981 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3982 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
3983 }
3984
3985 /* FIXME: work around a race condition between PCUIF and BSSGP */
3986 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
3987
3988 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
3989 * The IUT is expected to page on all PDCH slots of all transceivers. */
3990 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
3991 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
3992 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
3993 }
3994
3995 f_shutdown(__BFILE__, __LINE__, final := true);
3996}
3997
3998testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
3999 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4000
4001 /* Common part: send INFO.ind, establish TBFs... */
4002 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4003
4004 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4005 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4006 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4007 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4008 }
4009
4010 /* FIXME: work around a race condition between PCUIF and BSSGP */
4011 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4012
4013 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4014 * The IUT is expected to page on all PDCH slots of all transceivers. */
4015 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4016 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4017 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4018 }
4019
4020 f_shutdown(__BFILE__, __LINE__, final := true);
4021}
4022
4023testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4024 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4025
4026 /* Common part: send INFO.ind, establish TBFs... */
4027 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4028
4029 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4030 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4031 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4032 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4033 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4034 } else {
4035 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4036 }
4037 }
4038
4039 /* FIXME: work around a race condition between PCUIF and BSSGP */
4040 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4041
4042 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4043 * The IUT is expected to page on all PDCH slots of all transceivers. */
4044 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4045 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4046 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4047 }
4048
4049 f_shutdown(__BFILE__, __LINE__, final := true);
4050}
4051
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004052private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004053runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4054 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004055 var integer i := 0;
4056 while (true) {
4057 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4058 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4059 break;
4060 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004061 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004062 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4063 f_shutdown(__BFILE__, __LINE__);
4064 }
4065 i := i + 1;
4066 }
4067 return dl_block;
4068}
4069
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004070private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4071runs on RAW_PCU_Test_CT {
4072 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),
4073 info_ind.lac),
4074 info_ind.rac),
4075 info_ind.cell_id));
4076 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4077 423),
4078 2),
4079 5));
4080 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4081 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4082 var template (value) RAN_Information_RIM_Container res_cont :=
4083 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4084 ts_RIM_Sequence_Number(2),
4085 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4086 ts_RIM_Protocol_Version_Number(1),
4087 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4088 omit);
4089 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4090 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4091 res_cont));
4092}
4093
4094altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4095runs on RAW_PCU_Test_CT {
4096 /* RIM procedure: */
4097 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),
4098 info_ind.lac),
4099 info_ind.rac),
4100 info_ind.cell_id));
4101 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4102 423),
4103 2),
4104 5));
4105 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4106 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4107 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4108 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4109 tr_RAN_Information_Request_RIM_Container)) {
4110 if (do_answer) {
4111 f_outbound_nacc_rim_tx_resp(info_ind);
4112 }
4113 if (do_repeat) {
4114 repeat;
4115 }
4116 }
4117}
4118
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004119/* Start NACC from MS side */
4120private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004121 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
4122 boolean skip_final_ctrl_ack := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004123runs on RAW_PCU_Test_CT {
4124 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4125 var RlcmacDlBlock dl_block;
4126 var uint32_t sched_fn;
4127 var GsmArfcn req_arfcn := 862;
4128 var uint6_t req_bsic := 43;
4129
4130 /* Start NACC from MS side */
4131 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4132 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4133
4134 if (exp_rac_ci_query == true) {
4135 /* osmo-pcu should now ask for resolution: */
4136 f_ipa_ctrl_wait_link_up();
4137 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4138 int2str(info_ind.lac) & "." &
4139 int2str(info_ind.cell_id) & "." &
4140 int2str(req_arfcn) & "." &
4141 int2str(req_bsic);
4142 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4143 }
4144
4145 if (exp_si_query == true) {
4146 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004147 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004148 }
4149
4150 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004151 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004152
4153 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4154 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4155 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4156 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4157 f_shutdown(__BFILE__, __LINE__);
4158 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004159 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004160 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004161 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4162 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4163 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004164}
4165
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004166/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4167testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004168 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004169 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004170 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004171
4172 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4173 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4174
4175 /* Initialize NS/BSSGP side */
4176 f_init_bssgp();
4177 /* Initialize GPRS MS side */
4178 f_init_gprs_ms();
4179 ms := g_ms[0]; /* We only use first MS in this test */
4180
4181 /* Initialize the PCU interface abstraction */
4182 f_init_raw(testcasename(), info_ind);
4183
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004184 /* Make sure we are not affected by full cache from previous tests */
4185 f_pcuvty_flush_neigh_caches();
4186
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004187 /* Establish BSSGP connection to the PCU */
4188 f_bssgp_establish();
4189 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4190
4191 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004192 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 +01004193 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4194 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4195
4196 /* Start NACC from MS side */
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004197 f_outbound_nacc_success(ms, info_ind);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004198
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004199 f_shutdown(__BFILE__, __LINE__, final := true);
4200}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004201
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004202/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4203testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4204 var PollFnCtx pollctx;
4205 var GprsMS ms;
4206 var RlcmacDlBlock dl_block;
4207 var uint32_t sched_fn;
4208 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004209
4210 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4211 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4212
4213 /* Initialize NS/BSSGP side */
4214 f_init_bssgp();
4215 /* Initialize GPRS MS side */
4216 f_init_gprs_ms();
4217 ms := g_ms[0]; /* We only use first MS in this test */
4218
4219 /* Initialize the PCU interface abstraction */
4220 f_init_raw(testcasename(), info_ind);
4221
4222 /* Make sure we are not affected by full cache from previous tests */
4223 f_pcuvty_flush_neigh_caches();
4224
4225 /* Establish BSSGP connection to the PCU */
4226 f_bssgp_establish();
4227 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4228
4229 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004230 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 +01004231 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4232 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4233
4234 /* Start NACC from MS side, avoid sending final CTRL ACK */
4235 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true);
4236
4237 /* Wait until we receive something non-dummy */
4238 dl_block := f_skip_dummy(0, sched_fn);
4239 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4240 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4241 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4242 }
4243 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4244 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4245 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4246 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4247 }
4248
4249 f_shutdown(__BFILE__, __LINE__, final := true);
4250}
4251
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004252/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4253testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4254 var PollFnCtx pollctx;
4255 var GprsMS ms;
4256 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004257 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004258
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004259 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4260 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004261
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004262 /* Initialize NS/BSSGP side */
4263 f_init_bssgp();
4264 /* Initialize GPRS MS side */
4265 f_init_gprs_ms();
4266 ms := g_ms[0]; /* We only use first MS in this test */
4267
4268 /* Initialize the PCU interface abstraction */
4269 f_init_raw(testcasename(), info_ind);
4270
4271 /* Make sure we are not affected by full cache from previous tests */
4272 f_pcuvty_flush_neigh_caches();
4273 /* Set timeout values for caches so that entries will be in cache during second try */
4274 f_pcuvty_set_neigh_caches(10, 10);
4275
4276 /* Establish BSSGP connection to the PCU */
4277 f_bssgp_establish();
4278 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4279
4280 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004281 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 +01004282 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4283 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4284
4285 /* Start NACC from MS side */
4286 f_outbound_nacc_success(ms, info_ind);
4287
4288 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
4289 f_outbound_nacc_success(ms, info_ind, false, false);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004290
4291 f_shutdown(__BFILE__, __LINE__, final := true);
4292}
4293
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004294/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4295 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4296 */
4297testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4298 var PollFnCtx pollctx;
4299 var GprsMS ms;
4300 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004301 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4302
4303 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4304 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4305
4306 /* Initialize NS/BSSGP side */
4307 f_init_bssgp();
4308 /* Initialize GPRS MS side */
4309 f_init_gprs_ms();
4310 ms := g_ms[0]; /* We only use first MS in this test */
4311
4312 /* Initialize the PCU interface abstraction */
4313 f_init_raw(testcasename(), info_ind);
4314
4315 /* Make sure we are not affected by full cache from previous tests */
4316 f_pcuvty_flush_neigh_caches();
4317 /* Set timeout values for caches so that entries will be erased before the second try */
4318 f_pcuvty_set_neigh_caches(1, 1);
4319
4320 /* Establish BSSGP connection to the PCU */
4321 f_bssgp_establish();
4322 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4323
4324 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004325 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 +01004326 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4327 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4328
4329 /* Start NACC from MS side */
4330 f_outbound_nacc_success(ms, info_ind);
4331
4332 /* CTRL client should have disconnected from us */
4333 f_ipa_ctrl_wait_link_down();
4334 /* wait for cache entries to time out */
4335 f_sleep(2.0);
4336 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
4337 f_outbound_nacc_success(ms, info_ind);
4338
4339 f_shutdown(__BFILE__, __LINE__, final := true);
4340}
4341
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004342/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004343testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4344 var RlcmacDlBlock dl_block;
4345 var PollFnCtx pollctx;
4346 var uint32_t sched_fn;
4347 var GprsMS ms;
4348 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4349 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004350 var GsmArfcn req_arfcn := 862;
4351 var uint6_t req_bsic := 43;
4352
4353 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4354 * resolution CTRL port, to trigger Conn Refused by socket:
4355 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4356 */
4357
4358 /* Initialize NS/BSSGP side */
4359 f_init_bssgp();
4360 /* Initialize GPRS MS side */
4361 f_init_gprs_ms();
4362 ms := g_ms[0]; /* We only use first MS in this test */
4363
4364 /* Initialize the PCU interface abstraction */
4365 f_init_raw(testcasename(), info_ind);
4366
4367 /* Make sure we are not affected by full cache from previous tests */
4368 f_pcuvty_flush_neigh_caches();
4369
4370 /* Establish BSSGP connection to the PCU */
4371 f_bssgp_establish();
4372 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4373
4374 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004375 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 +01004376 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4377 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4378
4379 /* Start NACC from MS side */
4380 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4381 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4382
4383 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004384 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004385 /* Make sure it is a Pkt Cell Chg Continue */
4386 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4387 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4388 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004389 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4390 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4391 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4392 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4393 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004394
4395 f_shutdown(__BFILE__, __LINE__, final := true);
4396}
4397
4398/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004399testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
4400 var RlcmacDlBlock dl_block;
4401 var PollFnCtx pollctx;
4402 var uint32_t sched_fn;
4403 var GprsMS ms;
4404 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4405 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004406 var GsmArfcn req_arfcn := 862;
4407 var uint6_t req_bsic := 43;
4408
4409 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4410 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4411
4412 /* Initialize NS/BSSGP side */
4413 f_init_bssgp();
4414 /* Initialize GPRS MS side */
4415 f_init_gprs_ms();
4416 ms := g_ms[0]; /* We only use first MS in this test */
4417
4418 /* Initialize the PCU interface abstraction */
4419 f_init_raw(testcasename(), info_ind);
4420
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004421 /* Make sure we are not affected by full cache from previous tests */
4422 f_pcuvty_flush_neigh_caches();
4423
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004424 /* Establish BSSGP connection to the PCU */
4425 f_bssgp_establish();
4426 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4427
4428 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004429 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 +01004430 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4431 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4432
4433 /* Start NACC from MS side */
4434 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4435 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4436
4437 /* osmo-pcu should now ask for resolution: */
4438 f_ipa_ctrl_wait_link_up();
4439 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4440 int2str(info_ind.lac) & "." &
4441 int2str(info_ind.cell_id) & "." &
4442 int2str(req_arfcn) & "." &
4443 int2str(req_bsic);
4444 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
4445 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4446
4447 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004448 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004449 /* Make sure it is a Pkt Cell Chg Continue */
4450 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4451 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4452 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004453 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4454 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4455 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4456 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4457 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004458
4459 f_shutdown(__BFILE__, __LINE__, final := true);
4460}
4461
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004462/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
4463testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
4464 var RlcmacDlBlock dl_block;
4465 var PollFnCtx pollctx;
4466 var uint32_t sched_fn;
4467 var GprsMS ms;
4468 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4469 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004470 var GsmArfcn req_arfcn := 862;
4471 var uint6_t req_bsic := 43;
4472
4473 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4474 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4475
4476 /* Initialize NS/BSSGP side */
4477 f_init_bssgp();
4478 /* Initialize GPRS MS side */
4479 f_init_gprs_ms();
4480 ms := g_ms[0]; /* We only use first MS in this test */
4481
4482 /* Initialize the PCU interface abstraction */
4483 f_init_raw(testcasename(), info_ind);
4484
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004485 /* Make sure we are not affected by full cache from previous tests */
4486 f_pcuvty_flush_neigh_caches();
4487
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004488 /* Establish BSSGP connection to the PCU */
4489 f_bssgp_establish();
4490 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4491
4492 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004493 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 +01004494 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4495 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4496
4497 /* Start NACC from MS side */
4498 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4499 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4500
4501 /* osmo-pcu should now ask for resolution: */
4502 f_ipa_ctrl_wait_link_up();
4503 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4504 int2str(info_ind.lac) & "." &
4505 int2str(info_ind.cell_id) & "." &
4506 int2str(req_arfcn) & "." &
4507 int2str(req_bsic);
4508 /* we receive RAC+CI resolution request and we send incorrectlt formated response */
4509 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
4510
4511 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004512 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004513 /* Make sure it is a Pkt Cell Chg Continue */
4514 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4515 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4516 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004517 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4518 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4519 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4520 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4521 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004522
4523 f_shutdown(__BFILE__, __LINE__, final := true);
4524}
4525
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004526/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
4527testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
4528 var RlcmacDlBlock dl_block;
4529 var PollFnCtx pollctx;
4530 var uint32_t sched_fn;
4531 var GprsMS ms;
4532 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4533 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004534 var GsmArfcn req_arfcn := 862;
4535 var uint6_t req_bsic := 43;
4536 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 */
4537 info_ind.lac),
4538 info_ind.rac),
4539 info_ind.cell_id));
4540 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4541 423),
4542 2),
4543 5));
4544 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
4545 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
4546
4547 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4548 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4549
4550 /* Initialize NS/BSSGP side */
4551 f_init_bssgp();
4552 /* Initialize GPRS MS side */
4553 f_init_gprs_ms();
4554 ms := g_ms[0]; /* We only use first MS in this test */
4555
4556 /* Initialize the PCU interface abstraction */
4557 f_init_raw(testcasename(), info_ind);
4558
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004559 /* Make sure we are not affected by full cache from previous tests */
4560 f_pcuvty_flush_neigh_caches();
4561
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004562 /* Establish BSSGP connection to the PCU */
4563 f_bssgp_establish();
4564 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4565
4566 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004567 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 +01004568 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4569 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4570
4571 /* Start NACC from MS side */
4572 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4573 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4574
4575 /* osmo-pcu should now ask for resolution: */
4576 f_ipa_ctrl_wait_link_up();
4577 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4578 int2str(info_ind.lac) & "." &
4579 int2str(info_ind.cell_id) & "." &
4580 int2str(req_arfcn) & "." &
4581 int2str(req_bsic);
4582 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4583
4584 /* RIM procedure: */
4585 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4586 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4587 tr_RAN_Information_Request_RIM_Container));
4588 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
4589
4590 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004591 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004592 /* Make sure it is a Pkt Cell Chg Continue */
4593 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4594 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4595 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004596 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4597 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4598 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4599 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4600 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004601
4602 f_shutdown(__BFILE__, __LINE__, final := true);
4603}
4604
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004605/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
4606testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
4607 var PollFnCtx pollctx;
4608 var GprsMS ms;
4609 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4610 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4611 var RlcmacDlBlock dl_block;
4612 var uint32_t sched_fn;
4613 var CtrlMessage rx_ctrl;
4614 var GsmArfcn req_arfcn := 862;
4615 var uint6_t req_bsic := 43;
4616
4617 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4618 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4619
4620 /* Initialize NS/BSSGP side */
4621 f_init_bssgp();
4622 /* Initialize GPRS MS side */
4623 f_init_gprs_ms();
4624 ms := g_ms[0]; /* We only use first MS in this test */
4625
4626 /* Initialize the PCU interface abstraction */
4627 f_init_raw(testcasename(), info_ind);
4628
4629 /* Make sure we are not affected by full cache from previous tests */
4630 f_pcuvty_flush_neigh_caches();
4631
4632 /* Establish BSSGP connection to the PCU */
4633 f_bssgp_establish();
4634 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4635
4636 /* Send PACKET RESOURCE REQUEST */
4637 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4638 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4639 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4640
4641 /* Start NACC from MS side */
4642 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4643 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4644
4645 /* osmo-pcu should now ask for resolution: */
4646 f_ipa_ctrl_wait_link_up();
4647 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4648 int2str(info_ind.lac) & "." &
4649 int2str(info_ind.cell_id) & "." &
4650 int2str(req_arfcn) & "." &
4651 int2str(req_bsic);
4652 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4653 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
4654 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4655 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4656 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4657 timer T := 2.0;
4658 T.start;
4659 alt {
4660 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
4661 [] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
4662 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
4663 f_shutdown(__BFILE__, __LINE__);
4664 }
4665 [] T.timeout {
4666 setverdict(pass);
4667 }
4668 }
4669
4670 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004671 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004672
4673 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4674 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4675 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4676 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4677 f_shutdown(__BFILE__, __LINE__);
4678 }
4679 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4680 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4681 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4682 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4683 }
4684
4685 f_shutdown(__BFILE__, __LINE__, final := true);
4686}
4687
4688/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
4689testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
4690 var PollFnCtx pollctx;
4691 var GprsMS ms;
4692 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4693 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4694 var RlcmacDlBlock dl_block;
4695 var uint32_t sched_fn;
4696 var CtrlMessage rx_ctrl;
4697 var GsmArfcn req_arfcn := 862;
4698 var uint6_t req_bsic := 43;
4699
4700 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4701 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4702
4703 /* Initialize NS/BSSGP side */
4704 f_init_bssgp();
4705 /* Initialize GPRS MS side */
4706 f_init_gprs_ms();
4707 ms := g_ms[0]; /* We only use first MS in this test */
4708
4709 /* Initialize the PCU interface abstraction */
4710 f_init_raw(testcasename(), info_ind);
4711
4712 /* Make sure we are not affected by full cache from previous tests */
4713 f_pcuvty_flush_neigh_caches();
4714
4715 /* Establish BSSGP connection to the PCU */
4716 f_bssgp_establish();
4717 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4718
4719 /* Send PACKET RESOURCE REQUEST */
4720 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4721 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4722 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4723
4724 /* Start NACC from MS side */
4725 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4726 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4727
4728 /* osmo-pcu should now ask for resolution: */
4729 f_ipa_ctrl_wait_link_up();
4730 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4731 int2str(info_ind.lac) & "." &
4732 int2str(info_ind.cell_id) & "." &
4733 int2str(req_arfcn) & "." &
4734 int2str(req_bsic);
4735 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4736 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4737 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
4738 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4739 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4740 f_outbound_nacc_rim_tx_resp(info_ind);
4741 timer T := 1.0;
4742 T.start;
4743 alt {
4744 [] RIM.receive {
4745 setverdict(fail, "Received unexpected RIM message");
4746 f_shutdown(__BFILE__, __LINE__);
4747 }
4748 [] T.timeout {
4749 setverdict(pass);
4750 }
4751 }
4752
4753 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004754 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004755
4756 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4757 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4758 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4759 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4760 f_shutdown(__BFILE__, __LINE__);
4761 }
4762 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4763 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4764 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4765 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4766 }
4767
4768 f_shutdown(__BFILE__, __LINE__, final := true);
4769}
4770
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01004771/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
4772testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
4773 var PollFnCtx pollctx;
4774 var GprsMS ms;
4775 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4776 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4777 var RlcmacDlBlock dl_block;
4778 var uint32_t sched_fn;
4779 var CtrlMessage rx_ctrl;
4780 var GsmArfcn req_arfcn := 862;
4781 var uint6_t req_bsic := 43;
4782
4783 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4784 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4785
4786 /* Initialize NS/BSSGP side */
4787 f_init_bssgp();
4788 /* Initialize GPRS MS side */
4789 f_init_gprs_ms();
4790 ms := g_ms[0]; /* We only use first MS in this test */
4791
4792 /* Initialize the PCU interface abstraction */
4793 f_init_raw(testcasename(), info_ind);
4794
4795 /* Make sure we are not affected by full cache from previous tests */
4796 f_pcuvty_flush_neigh_caches();
4797
4798 /* Establish BSSGP connection to the PCU */
4799 f_bssgp_establish();
4800 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4801
4802 /* Send PACKET RESOURCE REQUEST */
4803 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4804 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4805 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4806
4807 /* Start NACC from MS side */
4808 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4809 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4810
4811 /* osmo-pcu should now ask for resolution: */
4812 f_ipa_ctrl_wait_link_up();
4813 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4814 int2str(info_ind.lac) & "." &
4815 int2str(info_ind.cell_id) & "." &
4816 int2str(req_arfcn) & "." &
4817 int2str(req_bsic);
4818 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4819 /* RIM procedure: */
4820 as_outbound_nacc_rim_resolve(info_ind);
4821
4822 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
4823 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
4824 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4825
4826 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
4827 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
4828
4829 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4830 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4831 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4832 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4833 f_shutdown(__BFILE__, __LINE__);
4834 }
4835 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4836 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4837 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4838 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4839 }
4840}
4841
4842/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
4843testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
4844 var PollFnCtx pollctx;
4845 var GprsMS ms;
4846 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4847 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4848 var RlcmacDlBlock dl_block;
4849 var uint32_t sched_fn;
4850 var CtrlMessage rx_ctrl;
4851 var GsmArfcn req_arfcn := 862;
4852 var uint6_t req_bsic := 43;
4853
4854 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4855 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4856
4857 /* Initialize NS/BSSGP side */
4858 f_init_bssgp();
4859 /* Initialize GPRS MS side */
4860 f_init_gprs_ms();
4861 ms := g_ms[0]; /* We only use first MS in this test */
4862
4863 /* Initialize the PCU interface abstraction */
4864 f_init_raw(testcasename(), info_ind);
4865
4866 /* Make sure we are not affected by full cache from previous tests */
4867 f_pcuvty_flush_neigh_caches();
4868
4869 /* Establish BSSGP connection to the PCU */
4870 f_bssgp_establish();
4871 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4872
4873 /* Send PACKET RESOURCE REQUEST */
4874 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4875 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4876 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4877
4878 /* Start NACC from MS side */
4879 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4880 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4881
4882 /* osmo-pcu should now ask for resolution: */
4883 f_ipa_ctrl_wait_link_up();
4884 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4885 int2str(info_ind.lac) & "." &
4886 int2str(info_ind.cell_id) & "." &
4887 int2str(req_arfcn) & "." &
4888 int2str(req_bsic);
4889 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4890 /* RIM procedure: */
4891 as_outbound_nacc_rim_resolve(info_ind);
4892
4893 /* Announce SI back to MS, continue NACC procedure */
4894 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
4895
4896 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
4897 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4898
4899 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4900 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4901 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4902 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4903 f_shutdown(__BFILE__, __LINE__);
4904 }
4905 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4906 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4907 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4908 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4909 }
4910}
4911
4912/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
4913testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
4914 var PollFnCtx pollctx;
4915 var GprsMS ms;
4916 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4917 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4918 var RlcmacDlBlock dl_block;
4919 var uint32_t sched_fn;
4920 var CtrlMessage rx_ctrl;
4921 var GsmArfcn req_arfcn := 862;
4922 var uint6_t req_bsic := 43;
4923
4924 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4925 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4926
4927 /* Initialize NS/BSSGP side */
4928 f_init_bssgp();
4929 /* Initialize GPRS MS side */
4930 f_init_gprs_ms();
4931 ms := g_ms[0]; /* We only use first MS in this test */
4932
4933 /* Initialize the PCU interface abstraction */
4934 f_init_raw(testcasename(), info_ind);
4935
4936 /* Make sure we are not affected by full cache from previous tests */
4937 f_pcuvty_flush_neigh_caches();
4938
4939 /* Establish BSSGP connection to the PCU */
4940 f_bssgp_establish();
4941 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4942
4943 /* Send PACKET RESOURCE REQUEST */
4944 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4945 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4946 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4947
4948 /* Start NACC from MS side */
4949 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4950 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4951
4952 /* osmo-pcu should now ask for resolution: */
4953 f_ipa_ctrl_wait_link_up();
4954 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4955 int2str(info_ind.lac) & "." &
4956 int2str(info_ind.cell_id) & "." &
4957 int2str(req_arfcn) & "." &
4958 int2str(req_bsic);
4959 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4960 /* RIM procedure: */
4961 as_outbound_nacc_rim_resolve(info_ind);
4962
4963 /* Announce SI back to MS, continue NACC procedure */
4964 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
4965
4966 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4967 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4968 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4969 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4970 f_shutdown(__BFILE__, __LINE__);
4971 }
4972 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
4973 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4974
4975 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4976 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4977 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4978 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4979 }
4980}
4981
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01004982/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
4983 * while waiting for CTRL resolution */
4984testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
4985 var PollFnCtx pollctx;
4986 var GprsMS ms;
4987 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4988 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4989 var RlcmacDlBlock dl_block;
4990 var uint32_t sched_fn;
4991 var CtrlMessage rx_ctrl;
4992 var GsmArfcn req_arfcn := 862;
4993 var uint6_t req_bsic := 43;
4994
4995 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4996 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4997
4998 /* Initialize NS/BSSGP side */
4999 f_init_bssgp();
5000 /* Initialize GPRS MS side */
5001 f_init_gprs_ms();
5002 ms := g_ms[0]; /* We only use first MS in this test */
5003
5004 /* Initialize the PCU interface abstraction */
5005 f_init_raw(testcasename(), info_ind);
5006
5007 /* Make sure we are not affected by full cache from previous tests */
5008 f_pcuvty_flush_neigh_caches();
5009
5010 /* Establish BSSGP connection to the PCU */
5011 f_bssgp_establish();
5012 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5013
5014 /* Send PACKET RESOURCE REQUEST */
5015 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5016 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5017 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5018
5019 /* Start NACC from MS side */
5020 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5021 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5022
5023 /* osmo-pcu should now ask for resolution: */
5024 f_ipa_ctrl_wait_link_up();
5025 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5026 int2str(info_ind.lac) & "." &
5027 int2str(info_ind.cell_id) & "." &
5028 int2str(req_arfcn) & "." &
5029 int2str(req_bsic);
5030 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5031 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5032 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5033 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5034 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5035 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5036 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
5037 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5038 int2str(info_ind.lac) & "." &
5039 int2str(info_ind.cell_id) & "." &
5040 int2str(req_arfcn + 1) & "." &
5041 int2str(req_bsic + 1);
5042 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5043
5044 /* And finally everything continues as usual with RIN procedure */
5045 as_outbound_nacc_rim_resolve(info_ind);
5046
5047 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005048 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005049
5050 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5051 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5052 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5053 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5054 f_shutdown(__BFILE__, __LINE__);
5055 }
5056 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5057 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5058 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5059 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5060 }
5061
5062 f_shutdown(__BFILE__, __LINE__, final := true);
5063}
5064
5065/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5066 * while waiting for SI resolution */
5067testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5068 var PollFnCtx pollctx;
5069 var GprsMS ms;
5070 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5071 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5072 var RlcmacDlBlock dl_block;
5073 var uint32_t sched_fn;
5074 var CtrlMessage rx_ctrl;
5075 var GsmArfcn req_arfcn := 862;
5076 var uint6_t req_bsic := 43;
5077
5078 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5079 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5080
5081 /* Initialize NS/BSSGP side */
5082 f_init_bssgp();
5083 /* Initialize GPRS MS side */
5084 f_init_gprs_ms();
5085 ms := g_ms[0]; /* We only use first MS in this test */
5086
5087 /* Initialize the PCU interface abstraction */
5088 f_init_raw(testcasename(), info_ind);
5089
5090 /* Make sure we are not affected by full cache from previous tests */
5091 f_pcuvty_flush_neigh_caches();
5092
5093 /* Establish BSSGP connection to the PCU */
5094 f_bssgp_establish();
5095 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5096
5097 /* Send PACKET RESOURCE REQUEST */
5098 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5099 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5100 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5101
5102 /* Start NACC from MS side */
5103 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5104 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5105
5106 /* osmo-pcu should now ask for resolution: */
5107 f_ipa_ctrl_wait_link_up();
5108 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5109 int2str(info_ind.lac) & "." &
5110 int2str(info_ind.cell_id) & "." &
5111 int2str(req_arfcn) & "." &
5112 int2str(req_bsic);
5113 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5114 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5115 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5116 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5117 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5118 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5119 f_outbound_nacc_rim_tx_resp(info_ind);
5120
5121 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
5122 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5123 int2str(info_ind.lac) & "." &
5124 int2str(info_ind.cell_id) & "." &
5125 int2str(req_arfcn + 1) & "." &
5126 int2str(req_bsic + 1);
5127 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5128
5129 /* And finally everything continues as usual with RIN procedure */
5130 as_outbound_nacc_rim_resolve(info_ind);
5131
5132 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005133 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005134
5135 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5136 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5137 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5138 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5139 f_shutdown(__BFILE__, __LINE__);
5140 }
5141 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5142 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5143 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5144 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5145 }
5146
5147 f_shutdown(__BFILE__, __LINE__, final := true);
5148}
5149
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005150/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5151 * while sending Pkt Neigh Data Change */
5152testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5153 var PollFnCtx pollctx;
5154 var GprsMS ms;
5155 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5156 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5157 var RlcmacDlBlock dl_block;
5158 var uint32_t sched_fn;
5159 var CtrlMessage rx_ctrl;
5160 var GsmArfcn req_arfcn := 862;
5161 var uint6_t req_bsic := 43;
5162
5163 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5164 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5165
5166 /* Initialize NS/BSSGP side */
5167 f_init_bssgp();
5168 /* Initialize GPRS MS side */
5169 f_init_gprs_ms();
5170 ms := g_ms[0]; /* We only use first MS in this test */
5171
5172 /* Initialize the PCU interface abstraction */
5173 f_init_raw(testcasename(), info_ind);
5174
5175 /* Make sure we are not affected by full cache from previous tests */
5176 f_pcuvty_flush_neigh_caches();
5177
5178 /* Establish BSSGP connection to the PCU */
5179 f_bssgp_establish();
5180 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5181
5182 /* Send PACKET RESOURCE REQUEST */
5183 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5184 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5185 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5186
5187 /* Start NACC from MS side */
5188 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5189 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5190
5191 /* osmo-pcu should now ask for resolution: */
5192 f_ipa_ctrl_wait_link_up();
5193 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5194 int2str(info_ind.lac) & "." &
5195 int2str(info_ind.cell_id) & "." &
5196 int2str(req_arfcn) & "." &
5197 int2str(req_bsic);
5198 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5199 /* RIM procedure: */
5200 as_outbound_nacc_rim_resolve(info_ind);
5201
5202 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5203 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5204 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5205 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5206
5207 /* It should trigger RAC_CI resolution to start again: */
5208 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5209 int2str(info_ind.lac) & "." &
5210 int2str(info_ind.cell_id) & "." &
5211 int2str(req_arfcn + 1) & "." &
5212 int2str(req_bsic + 1);
5213 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5214 /* RIM procedure: */
5215 as_outbound_nacc_rim_resolve(info_ind);
5216 /* Transmit SI back to MS */
5217 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5218
5219 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5220 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5221 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5222 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5223 f_shutdown(__BFILE__, __LINE__);
5224 }
5225 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5226 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5227 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5228 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5229 }
5230}
5231
5232/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5233testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5234 var PollFnCtx pollctx;
5235 var GprsMS ms;
5236 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5237 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5238 var RlcmacDlBlock dl_block;
5239 var uint32_t sched_fn;
5240 var CtrlMessage rx_ctrl;
5241 var GsmArfcn req_arfcn := 862;
5242 var uint6_t req_bsic := 43;
5243
5244 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5245 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5246
5247 /* Initialize NS/BSSGP side */
5248 f_init_bssgp();
5249 /* Initialize GPRS MS side */
5250 f_init_gprs_ms();
5251 ms := g_ms[0]; /* We only use first MS in this test */
5252
5253 /* Initialize the PCU interface abstraction */
5254 f_init_raw(testcasename(), info_ind);
5255
5256 /* Make sure we are not affected by full cache from previous tests */
5257 f_pcuvty_flush_neigh_caches();
5258
5259 /* Establish BSSGP connection to the PCU */
5260 f_bssgp_establish();
5261 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5262
5263 /* Send PACKET RESOURCE REQUEST */
5264 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5265 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5266 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5267
5268 /* Start NACC from MS side */
5269 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5270 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5271
5272 /* osmo-pcu should now ask for resolution: */
5273 f_ipa_ctrl_wait_link_up();
5274 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5275 int2str(info_ind.lac) & "." &
5276 int2str(info_ind.cell_id) & "." &
5277 int2str(req_arfcn) & "." &
5278 int2str(req_bsic);
5279 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5280 /* RIM procedure: */
5281 as_outbound_nacc_rim_resolve(info_ind);
5282
5283 /* Announce SI back to MS, continue NACC procedure */
5284 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5285
5286 /* trigger a Pkt Cell Change Notif with different tgt cell */
5287 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5288 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5289
5290 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5291 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5292
5293 /* It should trigger RAC_CI resolution to start again: */
5294 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5295 int2str(info_ind.lac) & "." &
5296 int2str(info_ind.cell_id) & "." &
5297 int2str(req_arfcn + 1) & "." &
5298 int2str(req_bsic + 1);
5299 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5300 /* RIM procedure: */
5301 as_outbound_nacc_rim_resolve(info_ind);
5302 /* Transmit SI back to MS */
5303 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5304
5305 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5306 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5307 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5308 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5309 f_shutdown(__BFILE__, __LINE__);
5310 }
5311 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5312 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5313 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5314 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5315 }
5316}
5317
5318/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5319testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5320 var PollFnCtx pollctx;
5321 var GprsMS ms;
5322 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5323 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5324 var RlcmacDlBlock dl_block;
5325 var uint32_t sched_fn;
5326 var CtrlMessage rx_ctrl;
5327 var GsmArfcn req_arfcn := 862;
5328 var uint6_t req_bsic := 43;
5329
5330 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5331 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5332
5333 /* Initialize NS/BSSGP side */
5334 f_init_bssgp();
5335 /* Initialize GPRS MS side */
5336 f_init_gprs_ms();
5337 ms := g_ms[0]; /* We only use first MS in this test */
5338
5339 /* Initialize the PCU interface abstraction */
5340 f_init_raw(testcasename(), info_ind);
5341
5342 /* Make sure we are not affected by full cache from previous tests */
5343 f_pcuvty_flush_neigh_caches();
5344
5345 /* Establish BSSGP connection to the PCU */
5346 f_bssgp_establish();
5347 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5348
5349 /* Send PACKET RESOURCE REQUEST */
5350 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5351 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5352 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5353
5354 /* Start NACC from MS side */
5355 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5356 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5357
5358 /* osmo-pcu should now ask for resolution: */
5359 f_ipa_ctrl_wait_link_up();
5360 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5361 int2str(info_ind.lac) & "." &
5362 int2str(info_ind.cell_id) & "." &
5363 int2str(req_arfcn) & "." &
5364 int2str(req_bsic);
5365 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5366 /* RIM procedure: */
5367 as_outbound_nacc_rim_resolve(info_ind);
5368
5369 /* Announce SI back to MS, continue NACC procedure */
5370 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5371
5372 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5373 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5374 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5375 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5376 f_shutdown(__BFILE__, __LINE__);
5377 }
5378
5379 /* trigger a Pkt Cell Change Notif with different tgt cell */
5380 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5381 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5382
5383 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5384 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5385 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5386 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5387 }
5388 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5389 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
5390
5391 /* It should trigger RAC_CI resolution to start again: */
5392 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5393 int2str(info_ind.lac) & "." &
5394 int2str(info_ind.cell_id) & "." &
5395 int2str(req_arfcn + 1) & "." &
5396 int2str(req_bsic + 1);
5397 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5398 /* RIM procedure: */
5399 as_outbound_nacc_rim_resolve(info_ind);
5400 /* Transmit SI back to MS */
5401 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5402
5403 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5404 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5405 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5406 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5407 f_shutdown(__BFILE__, __LINE__);
5408 }
5409 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5410 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5411 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5412 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5413 }
5414}
5415
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005416/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
5417testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
5418 var PollFnCtx pollctx;
5419 var GprsMS ms;
5420 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5421 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5422 var RlcmacDlBlock dl_block;
5423 var uint32_t sched_fn, dl_fn;
5424 var CtrlMessage rx_ctrl;
5425 var GsmArfcn req_arfcn := 862;
5426 var uint6_t req_bsic := 43;
5427 var octetstring data := f_rnd_octstring(10);
5428
5429 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5430 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5431
5432 /* Initialize NS/BSSGP side */
5433 f_init_bssgp();
5434 /* Initialize GPRS MS side */
5435 f_init_gprs_ms();
5436 ms := g_ms[0]; /* We only use first MS in this test */
5437
5438 /* Initialize the PCU interface abstraction */
5439 f_init_raw(testcasename(), info_ind);
5440
5441 /* Make sure we are not affected by full cache from previous tests */
5442 f_pcuvty_flush_neigh_caches();
5443
5444 /* Establish BSSGP connection to the PCU */
5445 f_bssgp_establish();
5446 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5447
5448 /* Send PACKET RESOURCE REQUEST */
5449 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5450 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5451 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5452
5453 /* Start NACC from MS side */
5454 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5455 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5456
5457 /* osmo-pcu should now ask for resolution: */
5458 f_ipa_ctrl_wait_link_up();
5459 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5460 int2str(info_ind.lac) & "." &
5461 int2str(info_ind.cell_id) & "." &
5462 int2str(req_arfcn) & "." &
5463 int2str(req_bsic);
5464 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5465 /* RIM procedure: */
5466 as_outbound_nacc_rim_resolve(info_ind);
5467
5468 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
5469 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
5470 f_sleep(0.1);
5471 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
5472 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
5473
5474 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
5475 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5476 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
5477 * Data with unassigned DL TBF in line above): */
5478 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5479 /* Continue receiving Pkt Cell Neighbor Data */
5480 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5481
5482 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5483 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5484 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5485 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5486 f_shutdown(__BFILE__, __LINE__);
5487 }
5488 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5489 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5490 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5491 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5492 }
5493
5494 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
5495 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
5496 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
5497 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
5498 f_dl_block_ack_fn(dl_block, dl_fn));
5499}
5500
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005501/* Send a RIM RAN info request to the PCU and verify the response, we expect
5502 * getting the system information back which we have transfered to the PCU via
5503 * PCUIF on startup. */
5504testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
5505 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005506 timer T := 2.0;
5507
5508 /* Initialize NS/BSSGP side */
5509 f_init_bssgp();
5510
5511 /* Initialize the PCU interface abstraction */
5512 f_init_raw(testcasename());
5513
5514 /* Establish BSSGP connection to the PCU */
5515 f_bssgp_establish();
5516
5517 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005518 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 +01005519 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005520 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 +01005521 BTS.send(si3_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005522 var template PCUIF_Message si16_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, '0106'O & si13_default, 0, 0, 0, 0, 32767);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005523 BTS.send(si16_data_ind);
5524 f_sleep(1.0);
5525
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005526 var RIM_Routing_Address dst_addr;
5527 var RIM_Routing_Address src_addr;
5528 var template (value) RAN_Information_Request_RIM_Container req_cont;
5529 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005530 var template PDU_BSSGP bssgp_rim_pdu_expect;
5531 var template RAN_Information_RIM_Container rim_cont_expect;
5532
5533 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 +01005534 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5535 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005536
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005537 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5538 ts_RIM_Sequence_Number(1),
5539 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5540 ts_RIM_Protocol_Version_Number(1),
5541 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5542 omit);
5543 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5544 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5545 req_cont);
5546
5547 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5548 tr_RIM_Sequence_Number(1),
5549 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5550 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005551 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 +01005552 omit);
5553
5554 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5555 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5556 rim_cont_expect);
5557 RIM.send(bssgp_rim_pdu);
5558 T.start;
5559 alt {
5560 [] RIM.receive(bssgp_rim_pdu_expect) { }
5561 [] RIM.receive {
5562 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5563 }
5564 [] T.timeout {
5565 setverdict(fail, "No BSSGP RIM PDU received");
5566 mtc.stop;
5567 }
5568 }
5569
5570 f_shutdown(__BFILE__, __LINE__, final := true);
5571}
5572
5573/* Same as above, but in this case we simulate the rare case in which the PCU
5574 * has no system information available. We expect getting a response back but
5575 * with no system information inside. */
5576testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005577 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005578 var PCUIF_Message pcu_msg;
5579 timer T := 2.0;
5580
5581 /* Initialize NS/BSSGP side */
5582 f_init_bssgp();
5583
5584 /* Initialize the PCU interface abstraction */
5585 f_init_raw(testcasename(), info_ind);
5586
5587 /* Establish BSSGP connection to the PCU */
5588 f_bssgp_establish();
5589
5590 /* Clear sysinfo from the PCU */
5591 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);
5592 BTS.send(si1_data_ind);
5593 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);
5594 BTS.send(si3_data_ind);
5595 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);
5596 BTS.send(si16_data_ind);
5597 f_sleep(1.0);
5598
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005599 var RIM_Routing_Address dst_addr;
5600 var RIM_Routing_Address src_addr;
5601 var template (value) RAN_Information_Request_RIM_Container req_cont;
5602 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005603 var template PDU_BSSGP bssgp_rim_pdu_expect;
5604 var template RAN_Information_RIM_Container rim_cont_expect;
5605
5606 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 +01005607 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5608 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005609
5610 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5611 ts_RIM_Sequence_Number(1),
5612 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5613 ts_RIM_Protocol_Version_Number(1),
5614 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5615 omit);
5616 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5617 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5618 req_cont);
5619
5620
5621 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5622 tr_RIM_Sequence_Number(1),
5623 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5624 tr_RIM_Protocol_Version_Number(1),
5625 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
5626 omit);
5627
5628 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5629 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5630 rim_cont_expect);
5631 RIM.send(bssgp_rim_pdu);
5632 T.start;
5633 alt {
5634 [] RIM.receive(bssgp_rim_pdu_expect) { }
5635 [] RIM.receive {
5636 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5637 }
5638 [] T.timeout {
5639 setverdict(fail, "No BSSGP RIM PDU received");
5640 mtc.stop;
5641 }
5642 }
5643
5644 f_shutdown(__BFILE__, __LINE__, final := true);
5645}
5646
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005647control {
5648 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01005649 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005650 execute( TC_ta_ptcch_idle() );
5651 execute( TC_ta_rach_imm_ass() );
5652 execute( TC_ta_idle_dl_tbf_ass() );
5653 execute( TC_ta_ptcch_ul_multi_tbf() );
5654 execute( TC_cs_lqual_ul_tbf() );
5655 execute( TC_cs_initial_ul() );
5656 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01005657 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01005658 execute( TC_cs_max_dl() );
5659 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01005660 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01005661 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01005662 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01005663 execute( TC_mcs_max_dl() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005664 execute( TC_t3169() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01005665 execute( TC_n3101_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01005666 execute( TC_x2031_t3191() );
5667 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005668 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01005669 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02005670 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02005671 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02005672 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005673 execute( TC_mo_ping_pong() );
5674 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02005675 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005676 execute( TC_mt_ping_pong() );
5677 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005678 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005679 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07005680 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005681 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01005682 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005683 execute( TC_paging_cs_from_bts() );
5684 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
5685 execute( TC_paging_cs_from_sgsn_sign() );
5686 execute( TC_paging_cs_from_sgsn_ptp() );
5687 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
5688 execute( TC_paging_ps_from_sgsn_sign() );
5689 execute( TC_paging_ps_from_sgsn_ptp() );
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005690 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
5691 execute( TC_paging_cs_multi_ms_imsi() );
5692 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02005693 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
5694 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01005695 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
5696 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005697
5698 /* EGPRS specific test cases */
5699 execute( TC_egprs_pkt_chan_req_signalling() );
5700 execute( TC_egprs_pkt_chan_req_one_phase() );
5701 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07005702 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07005703 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07005704 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02005705
5706 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005707
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01005708 /* Immediate Assignment on AGCH/PCH */
5709 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
5710 execute( TC_pcuif_fh_imm_ass_ul() );
5711 execute( TC_pcuif_fh_imm_ass_dl() );
5712 /* Packet Uplink/Downlink Assignment on PACCH */
5713 execute( TC_pcuif_fh_pkt_ass_ul() );
5714 execute( TC_pcuif_fh_pkt_ass_dl() );
5715 execute( TC_multitrx_multims_alloc() );
5716 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
5717 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
5718 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
5719
Pau Espin Pedrole1303052020-11-16 11:13:51 +01005720 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07005721
5722 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005723 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005724 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005725 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005726 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005727 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005728 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005729 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005730 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005731 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
5732 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005733 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
5734 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
5735 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005736 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
5737 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005738 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
5739 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
5740 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005741 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005742
5743 execute( TC_rim_ran_info_req_single_rep() );
5744 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005745}
5746
Harald Weltea419df22019-03-21 17:23:04 +01005747}