blob: 8e8fba9beb72c32506afa1bbc1d1a48ab1a866e0 [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
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200319 f_ms_tx_ul_data_block(g_ms[i], dummy, with_tlli := true, fn := g_ms[i].ul_tbf.start_time_fn, nr := nr);
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700320 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 Pedroldee55702021-04-23 21:08:22 +0200357 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(valueof(pkt_res_req)), ms.ul_tbf.start_time_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100358 /* 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 */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200423 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100424 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
Vadim Yanitskiy866f8702021-05-26 14:50:27 +0200499/* Verify Timing Advance value indicated in Packet Uplink ACK/NACK message
500 * sent in response to the first Uplink block after resource allocation. */
501testcase TC_ta_ul_ack_nack_first_block() runs on RAW_PCU_Test_CT {
502 var GprsMS ms := valueof(t_GprsMS_def);
503 var PacketUlAckNack ul_ack_nack;
504 var PacketTimingAdvance pkt_ta;
505 var RlcmacDlBlock dl_block;
506 var uint32_t sched_fn;
507
508 /* Initialize NS/BSSGP side */
509 f_init_bssgp();
510
511 /* Initialize the PCU interface abstraction */
512 f_init_raw(testcasename());
513
514 /* Establish BSSGP connection to the PCU */
515 f_bssgp_establish();
516 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
517
518 /* Establish an Uplink TBF */
519 f_ms_establish_ul_tbf(ms);
520
521 /* In a busy network, there can be a significant delay between resource
522 * allocation (Packet Uplink Assignment above) and the actual time when
523 * the MS is allowed to transmit the first Uplink data block. */
524
525 /* Simulate a delay > 0 */
526 ms.ta := 2;
527
528 /* We're in One-Phase Access contention resoultion, include TLLI */
529 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
530 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
531
532 ul_ack_nack := dl_block.ctrl.payload.u.ul_ack_nack;
533 if (ispresent(ul_ack_nack.gprs.pkt_ta)) {
534 pkt_ta := ul_ack_nack.gprs.pkt_ta;
535 } else if (ispresent(ul_ack_nack.egprs.pkt_ta)) {
536 pkt_ta := ul_ack_nack.egprs.pkt_ta;
537 } else {
538 setverdict(fail, "PacketTimingAdvance IE is not present");
539 f_shutdown(__BFILE__, __LINE__);
540 }
541
542 if (not ispresent(pkt_ta.val)) {
543 setverdict(fail, "Timing Advance value is not present");
544 f_shutdown(__BFILE__, __LINE__);
545 } else if (pkt_ta.val != ms.ta) {
546 setverdict(fail, "Timing Advance mismatch: expected ",
547 ms.ta, ", but received ", pkt_ta.val);
548 f_shutdown(__BFILE__, __LINE__);
549 }
550}
551
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200552/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
553 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
554 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
555 * no active TBF exists at the moment of establishment (idle mode). */
556testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100557 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200558
559 /* Initialize NS/BSSGP side */
560 f_init_bssgp();
561
562 /* Initialize the PCU interface abstraction */
563 f_init_raw(testcasename());
564
565 /* Establish BSSGP connection to the PCU */
566 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100567 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200568
569 /* SGSN sends some DL data, PCU will initiate Packet Downlink
570 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100571 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
572 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200573
574 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
575 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
576 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100577 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700578 setverdict(fail, "Timing Advance value doesn't match");
579 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700580
581 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200582}
583
584/* Verify that the PCU generates valid PTCCH/D messages
585 * while neither Uplink nor Downlink TBF is established. */
586testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100587 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200588 timer T;
589
590 /* Initialize the PCU interface abstraction */
591 f_init_raw(testcasename());
592
593 /* Sent an RTS.req for PTCCH/D */
594 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
595 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
596 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100597
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200598 T.start(5.0);
599 alt {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100600 /* Make sure the message is encoded correctly
601 * TODO: do we expect all TA values to be equal '1111111'B? */
602 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg);
603
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200604 [] BTS.receive(PCUIF_Message:?) { repeat; }
605 [] T.timeout {
606 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700607 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200608 }
609 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100610 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700611
612 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200613}
614
615/* Test of correct Timing Advance during an active Uplink TBF.
616 *
617 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
618 * are not continuous and there can be long time gaps between them. This happens
619 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
620 * significantly change between such rare Uplink transmissions, so GPRS introduces
621 * additional mechanisms to control Timing Advance, and thus reduce interference
622 * between neighboring TDMA time-slots.
623 *
624 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
625 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
626 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
627 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
628 * among with the initial Timing Advance value. And here PTCCH comes to play.
629 *
630 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
631 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
632 * continuously. To ensure continuous measurements of the signal propagation
633 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
634 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
635 *
636 * The purpose of this test case is to verify the assignment of Timing Advance
637 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
638 * first establishes several Uplink TBFs, but does not transmit any Uplink
639 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
640 * indications to the PCU, checking the correctness of two received PTCCH/D
641 * messages (period of PTCCH/D is two multi-frames).
642 */
643
644/* List of ToA values for Access Bursts to be sent on PTCCH/U,
645 * each ToA (Timing of Arrival) value is in units of 1/4 of
646 * a symbol (i.e. 1 symbol is 4 QTA units). */
647type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
648const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
649 0, 0, 0, 0,
650 0, 0, 0, 0,
651 0, 0, 0, 0,
652 0, 0, 0, 0
653};
654
655private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
656 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
657runs on RAW_PCU_Test_CT {
658 var RAW_PCU_Event event;
659 var integer ss;
660
661 /* Send Access Bursts on PTCCH/U for every TA Index */
662 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
663 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700664 if (ss < 0) { /* Shall not happen */
665 f_shutdown(__BFILE__, __LINE__);
666 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200667
668 log("Sending an Access Burst on PTCCH/U",
669 ", sub-slot=", ss, " (TAI)",
670 ", fn=", event.data.tdma_fn,
671 ", ToA=", toa_map[ss], " (QTA)");
672 /* TODO: do we care about RA and burst format? */
673 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
674 ra := oct2int('3A'O),
675 is_11bit := 0,
676 burst_type := BURST_TYPE_0,
677 fn := event.data.tdma_fn,
678 arfcn := 871,
679 qta := toa_map[ss],
680 sapi := PCU_IF_SAPI_PTCCH));
681 repeat;
682 }
683}
684
685private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
686 template PTCCHDownlinkMsg t_ta_msg)
687runs on RAW_PCU_Test_CT {
688 var PTCCHDownlinkMsg ta_msg;
689 var PCUIF_Message pcu_msg;
690 timer T;
691
692 /* First, send an RTS.req for the upcoming PTCCH/D block */
693 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
694 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
695 arfcn := 871, block_nr := 0));
696 T.start(2.0);
697 alt {
698 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
699 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
700 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
701 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
702 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
703 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
704 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
705 log("Rx PTCCH/D message: ", ta_msg);
706
707 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700708 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200709 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
710 }
711 }
712 [] BTS.receive { repeat; }
713 [] T.timeout {
714 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200715 }
716 }
717}
718
719testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
720 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200721 var GprsMS ms;
722
723 /* Initialize GPRS MS side */
724 f_init_gprs_ms();
725 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200726
727 /* Initialize the PCU interface abstraction */
728 f_init_raw(testcasename());
729
730 /* Enable forwarding of PTCCH/U TDMA events to us */
731 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
732
733 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
734 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200735 /* Establish an Uplink TBF */
736 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200737
738 /* We expect incremental TFI/USF assignment (dynamic allocation) */
739 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200740 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200741 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700742 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200743 }
744
745 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200746 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200747 setverdict(fail, "Failed to match Timing Advance Index for #", i);
748 /* Keep going, the current OsmoPCU does not assign TA Index */
749 }
750 }
751
752 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
753 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
754 for (var integer i := 0; i < 7; i := i + 1) {
755 /* ToA in units of 1/4 of a symbol */
756 toa_map[i] := (i + 1) * 7 * 4;
757 }
758
759 /* Now we have all 7 TBFs established in one-phase access mode,
760 * however we will not be sending any data on them. Instead, we
761 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
762 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
763 *
764 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
765 * time-slots, so at the moment of scheduling a PTCCH/D block
766 * the PCU has odd number of PTCCH/U Access Bursts received. */
767 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
768 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
769 /* Other values are not known (yet) */
770 tai3_ta := ?));
771 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
772 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
773 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
774 /* Other values are out of our interest */
775 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700776
777 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200778}
779
780/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
781 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
782 *
783 * NOTE: the ranges are intentionally overlapping because OsmoPCU
784 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
785private template integer CS1_lqual_dB_range := (-infinity .. 6);
786private template integer CS2_lqual_dB_range := (5 .. 8);
787private template integer CS3_lqual_dB_range := (7 .. 13);
788private template integer CS4_lqual_dB_range := (12 .. infinity);
789
790testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200791 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200792 var GprsMS ms;
793 var uint32_t unused_fn, sched_fn;
794 var uint4_t cv;
795
796 /* Initialize GPRS MS side */
797 f_init_gprs_ms();
798 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200799
800 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100801 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200802
803 f_pcuvty_set_allowed_cs_mcs();
804 f_pcuvty_set_link_quality_ranges();
805
806 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200807 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200808
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200809
810 /* The actual / old link quality values. We need to keep track of the old
811 * (basically previous) link quality value, because OsmoPCU actually
812 * changes the coding scheme if not only the actual, but also the old
813 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200814 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200815 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200816
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200817 /* Send one UL block (with TLLI since we are in One-Phase Access
818 contention resoultion) and make sure it is ACKED fine. */
819 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
820 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200821 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200822 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
823 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
824 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200825
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200826 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
827 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200828 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200829 lqual_old := ms.lqual_cb;
830 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200831
832 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200833 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
834 if (i > g_bs_cv_max) {
835 cv := 15;
836 } else {
837 cv := i;
838 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200839
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200840 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
841
842 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
843 f_rx_rlcmac_dl_block(dl_block, unused_fn);
844 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
845 continue;
846 }
847 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
848 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
849 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
850 f_shutdown(__BFILE__, __LINE__);
851 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200852
853 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
854 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
855
856 /* Match the received Channel Coding Command. Since we are increasing
857 * the link quality value on each iteration and not decreasing, there
858 * is no need to check the both old and current link quality values. */
859 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200860 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200861 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
862 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
863 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
864 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
865 }
866
867 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
868 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200869 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200870 }
871 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700872
873 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200874}
875
876/* Test the max UL CS set by VTY works fine */
877testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200878 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200879 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200880 var uint32_t unused_fn, sched_fn;
881 var GprsMS ms;
882
883 /* Initialize GPRS MS side */
884 f_init_gprs_ms();
885 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200886
887 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100888 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200889
890 /* Set initial UL CS to 3 */
891 g_cs_initial_ul := 3;
892 f_pcuvty_set_allowed_cs_mcs();
893 f_pcuvty_set_link_quality_ranges();
894
895 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200896 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200897
898 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200899 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200900
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200901 /* Send one UL block (with TLLI since we are in One-Phase Access
902 contention resoultion) and make sure it is ACKED fine. */
903 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
904 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200905 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200906 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
907 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
908 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200909
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200910 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
911 while (true) {
912 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
913 f_rx_rlcmac_dl_block(dl_block, unused_fn);
914 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
915 continue;
916 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200917
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200918 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
919 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
920 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
921 f_shutdown(__BFILE__, __LINE__);
922 break;
923 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200924
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200925 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200926 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200927 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200928 if (last_ch_coding != CH_CODING_CS3) {
929 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200930 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200931 }
932
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200933 /* Remaining UL blocks are used to make sure regardless of initial
934 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200935 /* 0 dB, make sure we downgrade CS */
936 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200937 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200938 f_ms_tx_ul_data_block_multi(ms, 5);
939 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
940 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
941 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200942
943 if (last_ch_coding != CH_CODING_CS1) {
944 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200945 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200946 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700947
948 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200949}
950
951/* Test the max UL CS set by VTY works fine */
952testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200953 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200954 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200955 var uint32_t unused_fn, sched_fn;
956 var GprsMS ms;
957
958 /* Initialize GPRS MS side */
959 f_init_gprs_ms();
960 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200961
962 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100963 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200964
965 /* Set maximum allowed UL CS to 3 */
966 g_cs_max_ul := 3;
967 f_pcuvty_set_allowed_cs_mcs();
968 f_pcuvty_set_link_quality_ranges();
969
970 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200971 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200972
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200973 /* Send one UL block (with TLLI since we are in One-Phase Access
974 contention resoultion) and make sure it is ACKED fine. */
975 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
976 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200977 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200978 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
979 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
980 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200981
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200982 ms.lqual_cb := 40*10; /* 40 dB */
983 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200984
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200985 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
986 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200987
988 if (last_ch_coding != CH_CODING_CS3) {
989 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200990 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200991 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700992
993 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200994}
995
Pau Espin Pedrol75122592020-11-03 15:22:59 +0100996/* Test the initial DL CS set by VTY works fine */
997testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
998 var octetstring data := f_rnd_octstring(10);
999 var CodingScheme exp_dl_cs_mcs;
1000 var RlcmacDlBlock dl_block;
1001 var uint32_t poll_fn;
1002 var GprsMS ms;
1003
1004 /* Initialize NS/BSSGP side */
1005 f_init_bssgp();
1006 /* Initialize GPRS MS side */
1007 f_init_gprs_ms();
1008 ms := g_ms[0]; /* We only use first MS in this test */
1009
1010 /* Initialize the PCU interface abstraction */
1011 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1012
1013 /* Set initial allowed DL CS to 3 */
1014 g_cs_initial_dl := 3;
1015 exp_dl_cs_mcs := CS_3;
1016 /* Set maximum allowed UL CS to 4 */
1017 g_cs_max_dl := 4;
1018 f_pcuvty_set_allowed_cs_mcs();
1019 f_pcuvty_set_link_quality_ranges();
1020
1021 /* Establish BSSGP connection to the PCU */
1022 f_bssgp_establish();
1023 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1024
1025 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1026 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1027 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1028
1029 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1030 f_sleep(X2002);
1031 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1032
1033 /* ACK the DL block */
1034 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1035 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1036 f_dl_block_ack_fn(dl_block, poll_fn));
1037
1038 f_shutdown(__BFILE__, __LINE__, final := true);
1039}
1040
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001041/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001042function 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 +01001043 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001044 var RlcmacDlBlock prev_dl_block, dl_block;
1045 var uint32_t ack_fn;
1046 var uint32_t fn;
1047 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001048 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001049 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001050 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
1051 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001052 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001053
1054 if (using_egprs) {
1055 exp_tmp_csmcs := mcs_egprs_any;
1056 bsn_mod := 2048;
1057 } else {
1058 exp_tmp_csmcs := cs_gprs_any;
1059 bsn_mod := 128;
1060 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001061
1062 /* Establish BSSGP connection to the PCU */
1063 f_bssgp_establish();
1064
1065 ms := g_ms[0]; /* We only use first MS in this test */
1066 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1067
1068 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001069 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001070 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1071
1072 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1073 f_sleep(X2002);
1074
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001075 for (var integer i := 0; i < 800; i := i + 1) {
1076 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001077 f_rx_rlcmac_dl_block(dl_block, fn);
1078
1079 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
1080 /* No more data to receive, done */
1081 break;
1082 }
1083
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001084 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001085
1086 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001087 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001088
1089 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001090 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001091 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001092 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 +01001093 if (tx_data_remain != 0) {
1094 /* Submit more data from time to time to keep the TBF ongoing */
1095 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1096 tx_data_remain := tx_data_remain - 1;
1097 }
1098 }
1099 prev_dl_block := dl_block;
1100 }
1101
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001102 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1103 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001104
1105
1106 f_shutdown(__BFILE__, __LINE__, final := true);
1107}
1108
1109/* Verify DL CS above "cs max" set by VTY is never used */
1110testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1111 /* Initialize NS/BSSGP side */
1112 f_init_bssgp();
1113 /* Initialize GPRS MS side */
1114 f_init_gprs_ms();
1115
1116 /* Initialize the PCU interface abstraction */
1117 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1118
1119 /* Set maximum allowed DL CS to 3 */
1120 g_cs_initial_dl := 1;
1121 g_cs_max_dl := 3;
1122 f_pcuvty_set_allowed_cs_mcs();
1123 f_pcuvty_set_link_quality_ranges();
1124
1125 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1126}
1127
1128/* Check DL CS4 is used in good link conditions if allowed by config */
1129testcase TC_dl_cs1_to_cs4() runs on RAW_PCU_Test_CT {
1130 /* Initialize NS/BSSGP side */
1131 f_init_bssgp();
1132 /* Initialize GPRS MS side */
1133 f_init_gprs_ms();
1134
1135 /* Initialize the PCU interface abstraction */
1136 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1137
1138 /* Set initial DL CS to 1 & maximum allowed DL CS to 4 */
1139 g_cs_initial_dl := 1;
1140 g_cs_max_dl := 4;
1141 f_pcuvty_set_allowed_cs_mcs();
1142 f_pcuvty_set_link_quality_ranges();
1143
1144 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1145}
1146
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001147/* Test the initial UL MCS set by VTY works fine */
1148testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1149 var RlcmacDlBlock dl_block;
1150 var PollFnCtx pollctx;
1151 var EgprsChCodingCommand last_ch_coding;
1152 var uint32_t unused_fn, sched_fn;
1153 var GprsMS ms;
1154 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001155
1156 /* Initialize GPRS MS side */
1157 f_init_gprs_ms();
1158 ms := g_ms[0]; /* We only use first MS in this test */
1159
1160 /* Initialize the PCU interface abstraction */
1161 f_init_raw(testcasename());
1162
1163 /* Set initial UL MCS to 3 */
1164 g_mcs_initial_ul := 3;
1165 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1166 f_pcuvty_set_allowed_cs_mcs();
1167 f_pcuvty_set_link_quality_ranges();
1168
1169 /* Take lqual (dB->cB) so that we stay in that MCS */
1170 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1171
1172 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001173 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 +01001174
1175 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1176 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1177 f_shutdown(__BFILE__, __LINE__);
1178 }
1179
1180 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1181 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1182
1183 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1184 while (true) {
1185 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1186 f_rx_rlcmac_dl_block(dl_block, unused_fn);
1187 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1188 continue;
1189 }
1190
1191 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1192 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1193 f_shutdown(__BFILE__, __LINE__);
1194 break;
1195 }
1196
1197 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1198 break;
1199 }
1200 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1201 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1202 f_shutdown(__BFILE__, __LINE__);
1203 }
1204
1205 /* Remaining UL blocks are used to make sure regardless of initial
1206 * lqual, we can go lower at any time
1207 * 0 dB, make sure we downgrade MCS */
1208 ms.lqual_cb := 0;
1209 /* 5 UL blocks, check we are in same initial MCS: */
1210 f_ms_tx_ul_data_block_multi(ms, 5);
1211 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1212 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1213 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1214
1215 if (last_ch_coding != CH_CODING_MCS1) {
1216 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1217 f_shutdown(__BFILE__, __LINE__);
1218 }
1219
1220 f_shutdown(__BFILE__, __LINE__, final := true);
1221}
1222
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001223/* Test the maximum UL MCS set by VTY works fine */
1224testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1225 var RlcmacDlBlock dl_block;
1226 var EgprsChCodingCommand last_ch_coding;
1227 var PollFnCtx pollctx;
1228 var uint32_t unused_fn, sched_fn;
1229 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001230
1231 /* Initialize GPRS MS side */
1232 f_init_gprs_ms();
1233 ms := g_ms[0]; /* We only use first MS in this test */
1234
1235 /* Initialize the PCU interface abstraction */
1236 f_init_raw(testcasename());
1237
1238 /* Set maximum allowed UL MCS to 5 */
1239 g_mcs_max_ul := 5;
1240 f_pcuvty_set_allowed_cs_mcs();
1241 f_pcuvty_set_link_quality_ranges();
1242
1243 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001244 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 +01001245 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1246 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1247
1248 ms.lqual_cb := 40*10; /* 40 dB */
1249 f_ms_tx_ul_data_block_multi(ms, 16);
1250
1251 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1252 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1253
1254 if (last_ch_coding != CH_CODING_MCS5) {
1255 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1256 f_shutdown(__BFILE__, __LINE__);
1257 }
1258
1259 f_shutdown(__BFILE__, __LINE__, final := true);
1260}
1261
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001262/* Test the initial DL CS set by VTY works fine */
1263testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1264 var octetstring data := f_rnd_octstring(10);
1265 var CodingScheme exp_dl_cs_mcs;
1266 var RlcmacDlBlock dl_block;
1267 var uint32_t poll_fn;
1268 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001269
1270 /* Initialize NS/BSSGP side */
1271 f_init_bssgp();
1272 /* Initialize GPRS MS side */
1273 f_init_gprs_ms();
1274 ms := g_ms[0]; /* We only use first MS in this test */
1275
1276 /* Initialize the PCU interface abstraction */
1277 f_init_raw(testcasename());
1278
1279 /* Set initial allowed DL MCS to 3 */
1280 g_mcs_initial_dl := 3;
1281 exp_dl_cs_mcs := MCS_3;
1282 /* Set maximum allowed DL MCS to 4 */
1283 g_mcs_max_dl := 4;
1284 f_pcuvty_set_allowed_cs_mcs();
1285 f_pcuvty_set_link_quality_ranges();
1286
1287 /* Establish BSSGP connection to the PCU */
1288 f_bssgp_establish();
1289 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1290
1291 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001292 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001293 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1294
1295 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1296 f_sleep(X2002);
1297 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1298
1299 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001300 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1301 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 +01001302 f_dl_block_ack_fn(dl_block, poll_fn));
1303
1304 f_shutdown(__BFILE__, __LINE__, final := true);
1305}
1306
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001307/* Verify DL MCS above "mcs max" set by VTY is never used */
1308testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1309 /* Initialize NS/BSSGP side */
1310 f_init_bssgp();
1311 /* Initialize GPRS MS side */
1312 f_init_gprs_ms();
1313
1314 /* Initialize the PCU interface abstraction */
1315 f_init_raw(testcasename());
1316
1317 /* Set maximum allowed DL CS to 3 */
1318 g_mcs_initial_dl := 1;
1319 g_mcs_max_dl := 3;
1320 f_pcuvty_set_allowed_cs_mcs();
1321 f_pcuvty_set_link_quality_ranges();
1322
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001323 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 +01001324}
1325
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02001326/* Verify PCU drops TBF after some time of inactivity. */
1327testcase TC_t3141() runs on RAW_PCU_Test_CT {
1328 var PCUIF_info_ind info_ind;
1329 var template (value) TsTrxBtsNum nr;
1330 var BTS_PDTCH_Block data_msg;
1331 var GprsMS ms;
1332 var uint3_t rx_usf;
1333 timer T_3141 := 1.0;
1334 var boolean ul_tbf_usf_req := false;
1335
1336 /* Initialize NS/BSSGP side */
1337 f_init_bssgp();
1338 /* Initialize GPRS MS side */
1339 f_init_gprs_ms();
1340 ms := g_ms[0]; /* We only use first MS in this test */
1341
1342 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1343 /* Only use 1 PDCH to simplify test: */
1344 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
1345 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
1346 /* Initialize the PCU interface abstraction */
1347 f_init_raw(testcasename(), info_ind);
1348
1349 f_vty_config2(PCUVTY, {"pcu"}, "timer T3141 1");
1350
1351 /* Establish BSSGP connection to the PCU */
1352 f_bssgp_establish();
1353 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1354
1355 /* Establish a one-phase access Uplink TBF */
1356 f_ms_establish_ul_tbf(ms);
1357
1358 T_3141.start;
1359
1360 /* Now we wait for PCU to transmit our USF */
1361 nr := ts_TsTrxBtsNum;
1362 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1363 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1364 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1365 block_nr := nr.blk_nr));
1366
1367 alt {
1368 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1369 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1370 ?)) -> value data_msg {
1371 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1372 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1373 f_shutdown(__BFILE__, __LINE__);
1374 }
1375
1376 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1377 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1378 /* PCU requests our USF, transmit WITHOUT tlli to avoid contention resolution success */
1379 ul_tbf_usf_req := true;
1380 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15, with_tlli := false, fn := f_next_pdch_block(data_msg.raw.fn))
1381 } else if (rx_usf == USF_UNUSED) {
1382 if (data_msg.raw.fn >= ms.ul_tbf.start_time_fn) {
1383 if (ul_tbf_usf_req) {
1384 /* TBF was dropped by T3141, success */
1385 setverdict(pass);
1386 break;
1387 } else {
1388 log("PCU never requested USF, unexpected");
1389 f_shutdown(__BFILE__, __LINE__);
1390 }
1391 } /* else: Keep waiting for TBF to be active by network */
1392 } else {
1393 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1394 f_shutdown(__BFILE__, __LINE__);
1395 }
1396
1397 /* Make sure we don't receive a Ul ACK/NACK with TLLI set: */
1398 if (match(data_msg.dl_block,
1399 tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
1400 tr_UlAckNackGprs(tlli := ?,
1401 acknack_desc := ?,
1402 rel99 := *))))
1403 {
1404 log("Received UL ACK/NACK with TLLI set");
1405 f_shutdown(__BFILE__, __LINE__);
1406 }
1407
1408 nr := ts_TsTrxBtsNum;
1409 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1410 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1411 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1412 block_nr := nr.blk_nr));
1413 repeat;
1414 }
1415 [] T_3141.timeout {
1416 log("T_3141 expired but TBF is still active, unexpected");
1417 f_shutdown(__BFILE__, __LINE__);
1418 }
1419 [] BTS.receive {
1420 /* We should never receive non-dummy messages, aka UL ACK/NACK,
1421 * because we never sent the TLLI to the PCU */
1422 setverdict(fail, "Unexpected BTS message");
1423 f_shutdown(__BFILE__, __LINE__);
1424 }
1425 }
1426
1427 f_shutdown(__BFILE__, __LINE__, final := true);
1428}
1429
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001430/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1431 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1432 * T3169. See OS#5033 */
1433testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1434 var PCUIF_info_ind info_ind;
1435 var template (value) TsTrxBtsNum nr;
1436 var BTS_PDTCH_Block data_msg;
1437 var GprsMS ms;
1438 var uint3_t rx_usf;
1439 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1440 var integer n3101 := 0;
1441 timer T_3169 := 1.0;
1442
1443 /* Initialize NS/BSSGP side */
1444 f_init_bssgp();
1445 /* Initialize GPRS MS side */
1446 f_init_gprs_ms();
1447 ms := g_ms[0]; /* We only use first MS in this test */
1448
1449 /* Initialize the PCU interface abstraction */
1450 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1451 info_ind.n3101 := N3101_MAX;
1452 info_ind.t3169 := 1;
1453 f_init_raw(testcasename(), info_ind);
1454
1455 /* Establish BSSGP connection to the PCU */
1456 f_bssgp_establish();
1457 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1458
1459 /* Establish UL TBF */
1460 f_ms_establish_ul_tbf(ms);
1461
1462 /* Now we wait for PCU to transmit our USF */
1463 nr := ts_TsTrxBtsNum;
1464 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1465 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1466 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1467 block_nr := nr.blk_nr));
1468
1469 alt {
1470 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1471 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1472 ?)) -> value data_msg {
1473 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1474 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1475 f_shutdown(__BFILE__, __LINE__);
1476 }
1477
1478 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1479 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1480 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1481 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001482 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1483 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001484 f_shutdown(__BFILE__, __LINE__);
1485 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001486 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001487 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1488 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1489 if (not T_3169.running) {
1490 log("T3169 started");
1491 T_3169.start;
1492 }
1493 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1494 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1495 f_shutdown(__BFILE__, __LINE__);
1496 } else {
1497 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1498 }
1499 nr := ts_TsTrxBtsNum;
1500 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1501 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1502 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1503 block_nr := nr.blk_nr));
1504 repeat;
1505 }
1506 [] T_3169.timeout {
1507 log("T_3169 expired");
1508 /* Done in alt */
1509 }
1510 [] BTS.receive {
1511 setverdict(fail, "Unexpected BTS message");
1512 f_shutdown(__BFILE__, __LINE__);
1513 }
1514 }
1515
1516 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1517 /* USFs as per previous TBF since they were freed at expiration time: */
1518 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1519 var uint5_t old_tfi := ms.ul_tbf.tfi;
1520 f_ms_establish_ul_tbf(ms);
1521 if (old_tfi != ms.ul_tbf.tfi) {
1522 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1523 f_shutdown(__BFILE__, __LINE__);
1524 }
1525 for (var integer i := 0; i < 8; i := i +1) {
1526 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1527 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1528 f_shutdown(__BFILE__, __LINE__);
1529 }
1530 }
1531
1532 f_shutdown(__BFILE__, __LINE__, final := true);
1533}
1534
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001535
1536/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1537 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1538 the final UL ACK sent at us. */
1539testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1540 var PCUIF_info_ind info_ind;
1541 var BTS_PDTCH_Block data_msg;
1542 var RlcmacDlBlock dl_block;
1543 var uint32_t sched_fn;
1544 var template (value) TsTrxBtsNum nr;
1545 var template RlcmacDlBlock exp_ul_ack;
1546 var template UlAckNackGprs exp_ul_ack_sub;
1547 var GprsMS ms;
1548 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1549 var integer N3103 := 0;
1550 timer T_3169 := 1.0;
1551
1552 /* Initialize GPRS MS side */
1553 f_init_gprs_ms();
1554 ms := g_ms[0]; /* We only use first MS in this test */
1555
1556 /* Initialize the PCU interface abstraction */
1557 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1558 info_ind.n3103 := N3103_MAX;
1559 info_ind.t3169 := 1;
1560 f_init_raw(testcasename(), info_ind);
1561
1562 /* Establish an Uplink TBF */
1563 f_ms_establish_ul_tbf(ms);
1564
Pau Espin Pedrol93ae4522021-05-11 15:58:26 +02001565 f_ms_tx_ul_data_block_multi(ms, 5, with_tlli := true);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001566 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1567 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1568
1569 nr := ts_TsTrxBtsNum;
1570 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1571 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1572 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1573 block_nr := nr.blk_nr));
1574 alt {
1575 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1576 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1577 exp_ul_ack)) -> value data_msg {
1578 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1579 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1580 f_shutdown(__BFILE__, __LINE__);
1581 }
1582
1583 nr := ts_TsTrxBtsNum;
1584 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1585 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1586 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1587 block_nr := nr.blk_nr));
1588 N3103 := N3103 + 1;
1589 if (N3103 == N3103_MAX) {
1590 /* At this point in time (N3103_MAX reached), PCU is
1591 * moving the TBF to RELEASE state so no data/ctrl for
1592 * it is tx'ed, hence the dummy blocks: */
1593 T_3169.start;
1594 }
1595 repeat;
1596 }
1597 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1598 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1599 exp_ul_ack)) -> value data_msg {
1600 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1601 f_shutdown(__BFILE__, __LINE__);
1602 }
1603 [] as_ms_rx_ignore_dummy(ms, nr);
1604 [T_3169.running] T_3169.timeout {
1605 log("T_3169 timeout");
1606 /* Done in alt, wait for pending RTS initiated previously in
1607 * above case before continuing (expect /* Dummy block): */
1608 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1609 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1610 tr_RLCMAC_DUMMY_CTRL));
1611 }
1612 [] BTS.receive {
1613 setverdict(fail, "Unexpected BTS message");
1614 f_shutdown(__BFILE__, __LINE__);
1615 }
1616 }
1617
1618 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1619 * USFs as per previous TBF since they were freed at expiration time: */
1620 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1621 var uint5_t old_tfi := ms.ul_tbf.tfi;
1622 f_ms_establish_ul_tbf(ms);
1623 if (old_tfi != ms.ul_tbf.tfi) {
1624 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1625 f_shutdown(__BFILE__, __LINE__);
1626 }
1627 for (var integer i := 0; i < 8; i := i +1) {
1628 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1629 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1630 f_shutdown(__BFILE__, __LINE__);
1631 }
1632 }
1633
1634 f_shutdown(__BFILE__, __LINE__, final := true);
1635}
1636
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001637/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1638 * point the TBF is no longer available. In order to get to start of T3191, we
1639 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1640 * until TBF release procedure starts after draining DL queue. */
1641testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1642 var PCUIF_info_ind info_ind;
1643 var RlcmacDlBlock dl_block;
1644 var octetstring data1 := f_rnd_octstring(200);
1645 var octetstring data2 := f_rnd_octstring(10);
1646 var uint32_t dl_fn;
1647 var template (value) TsTrxBtsNum nr;
1648 var BTS_PDTCH_Block data_msg;
1649 var GprsMS ms;
1650
1651 /* Initialize NS/BSSGP side */
1652 f_init_bssgp();
1653 /* Initialize GPRS MS side */
1654 f_init_gprs_ms();
1655 ms := g_ms[0]; /* We only use first MS in this test */
1656
1657 /* Initialize the PCU interface abstraction */
1658 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1659 /* Set timer to 1 sec (default 5) to speedup test: */
1660 info_ind.t3191 := 1;
1661 f_init_raw(testcasename(), info_ind);
1662
1663 /* Establish BSSGP connection to the PCU */
1664 f_bssgp_establish();
1665 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1666
1667 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1668 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1669 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1670
1671 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1672 f_sleep(X2002);
1673
1674 while (true) {
1675 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1676
1677 /* Keep Ack/Nack description updated (except for last BSN) */
1678 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1679
1680 if (f_dl_block_rrbp_valid(dl_block)) {
1681 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1682 f_dl_block_ack_fn(dl_block, dl_fn));
1683 break;
1684 }
1685 }
1686
1687 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1688 nr := ts_TsTrxBtsNum;
1689 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1690 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1691 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1692 block_nr := nr.blk_nr));
1693 alt {
1694 [] as_ms_rx_ignore_dummy(ms, nr);
1695 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1696 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1697 ?)) -> value data_msg {
1698 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1699 log("Received FINAL_ACK");
1700 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1701 break;
1702 }
1703 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1704 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1705 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1706 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1707 }
1708 nr := ts_TsTrxBtsNum;
1709 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1710 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1711 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1712 block_nr := nr.blk_nr));
1713 repeat;
1714 }
1715 [] BTS.receive {
1716 setverdict(fail, "Unexpected BTS message");
1717 f_shutdown(__BFILE__, __LINE__);
1718 }
1719 }
1720
1721 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1722 to time out. We simply sleep instead of requesting blocks because
1723 otherwise retransmissions would keep restarting the timer. */
1724 f_sleep(int2float(info_ind.t3191));
1725
1726 /* The TBF should be freed now, so new data should trigger an Assignment: */
1727 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1728 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1729
1730 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1731 f_sleep(X2002);
1732 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1733 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1734 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1735 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1736 f_dl_block_ack_fn(dl_block, dl_fn));
1737
1738 f_shutdown(__BFILE__, __LINE__, final := true);
1739}
1740
1741/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1742testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1743 var PCUIF_info_ind info_ind;
1744 var RlcmacDlBlock dl_block;
1745 var octetstring data1 := f_rnd_octstring(1400);
1746 var octetstring data2 := f_rnd_octstring(10);
1747 var uint32_t dl_fn;
1748 var GprsMS ms;
1749
1750 /* Initialize NS/BSSGP side */
1751 f_init_bssgp();
1752 /* Initialize GPRS MS side */
1753 f_init_gprs_ms();
1754 ms := g_ms[0]; /* We only use first MS in this test */
1755
1756 /* Initialize the PCU interface abstraction */
1757 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1758 /* Set timer to 1 sec (default 5) to speedup test: */
1759 info_ind.t3191 := 1;
1760 f_init_raw(testcasename(), info_ind);
1761
1762 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1763
1764 /* Establish BSSGP connection to the PCU */
1765 f_bssgp_establish();
1766 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1767
1768 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1769 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1770 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1771
1772 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1773 f_sleep(X2002);
1774
1775 /* Send enough DL data to at least be able to DL ACK once (excl the
1776 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1777 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1778 while (true) {
1779 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1780
1781 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1782 log("Received FINAL_ACK");
1783 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1784 break;
1785 }
1786
1787 /* Keep Ack/Nack description updated (except for last BSN) */
1788 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1789
1790 if (f_dl_block_rrbp_valid(dl_block)) {
1791 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1792 f_dl_block_ack_fn(dl_block, dl_fn));
1793 }
1794 }
1795
1796 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1797 to time out. We simply sleep instead of requesting blocks because
1798 otherwise retransmissions would keep restarting the timer. */
1799 f_sleep(int2float(info_ind.t3191));
1800
1801 /* The TBF should be freed now, so new data should trigger an Assignment: */
1802 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1803 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1804
1805 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1806 f_sleep(X2002);
1807 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1808 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1809 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1810 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1811 f_dl_block_ack_fn(dl_block, dl_fn));
1812
1813 f_shutdown(__BFILE__, __LINE__, final := true);
1814}
1815
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001816/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1817 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1818 * T3193) after DL TBF release */
1819testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001820 var RlcmacDlBlock dl_block;
1821 var octetstring data := f_rnd_octstring(10);
1822 var boolean ok;
1823 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001824 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001825 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001826 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1827
1828 /* Initialize NS/BSSGP side */
1829 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001830 /* Initialize GPRS MS side */
1831 f_init_gprs_ms();
1832 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001833
1834 /* Initialize the PCU interface abstraction */
1835 f_init_raw(testcasename());
1836
1837 /* Establish BSSGP connection to the PCU */
1838 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001839 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001840
1841 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001842 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1843 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001844
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001845 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1846 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001847 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001848
1849 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001850 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1851 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1852 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001853
1854 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001855 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001856 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001857 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001858 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001859
1860 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001861
1862 /* 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 +07001863 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001864 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1865 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1866 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001867
1868 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001869}
1870
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001871/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1872 freed and no longer available. Trigger it by sending DL blocks and never DL
1873 ACKing the data (which are requested through RRBP) */
1874testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1875 var PCUIF_info_ind info_ind;
1876 var RlcmacDlBlock dl_block;
1877 var octetstring data1 := f_rnd_octstring(1000);
1878 var octetstring data2 := f_rnd_octstring(10);
1879 var uint32_t dl_fn;
1880 var template (value) TsTrxBtsNum nr;
1881 var BTS_PDTCH_Block data_msg;
1882 var GprsMS ms;
1883 const integer N3105_MAX := 2;
1884 var integer N3105 := 0;
1885 timer T_3195 := 1.0;
1886 var integer num_poll_recv := 0;
1887
1888 /* Initialize NS/BSSGP side */
1889 f_init_bssgp();
1890 /* Initialize GPRS MS side */
1891 f_init_gprs_ms();
1892 ms := g_ms[0]; /* We only use first MS in this test */
1893
1894 /* Initialize the PCU interface abstraction */
1895 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1896 /* Speedup test: */
1897 info_ind.n3105 := N3105_MAX;
1898 info_ind.t3195 := 1;
1899 f_init_raw(testcasename(), info_ind);
1900
1901 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1902 * MS and retransmitted after the TBF is released and later on created
1903 * (because the MS is reused) */
1904 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1905
1906 /* Establish BSSGP connection to the PCU */
1907 f_bssgp_establish();
1908 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1909
1910 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1911 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1912 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1913
1914 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1915 f_sleep(X2002);
1916
1917 /* Now we go on receiving DL data and not answering RRBP: */
1918 nr := ts_TsTrxBtsNum;
1919 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1920 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1921 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1922 block_nr := nr.blk_nr));
1923 alt {
1924 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1925 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1926 tr_RLCMAC_DATA)) -> value data_msg {
1927 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1928 if (num_poll_recv == 0) {
1929 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1930 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1931 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1932 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1933 } else {
1934 log("Ignoring RRBP ", num_poll_recv);
1935 N3105 := N3105 + 1;
1936 }
1937 num_poll_recv := num_poll_recv + 1;
1938 }
1939
1940 nr := ts_TsTrxBtsNum;
1941 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1942 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1943 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1944 block_nr := nr.blk_nr));
1945 repeat;
1946 }
1947 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
1948 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
1949 */
1950 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1951 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1952 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1953 if (not T_3195.running) {
1954 T_3195.start;
1955 /* We even send some new data, nothing should be sent to MS */
1956 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1957 }
1958 nr := ts_TsTrxBtsNum;
1959 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1960 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1961 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1962 block_nr := nr.blk_nr));
1963 repeat;
1964 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001965 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001966 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001967 /* Done in alt, wait for pending RTS initiated previously in
1968 * above case before continuing (expect /* Dummy block): */
1969 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1970 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1971 tr_RLCMAC_DUMMY_CTRL));
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001972 }
1973 [] BTS.receive {
1974 setverdict(fail, "Unexpected BTS message");
1975 f_shutdown(__BFILE__, __LINE__);
1976 }
1977 }
1978
1979 /* after T_3195 timeout, TBF is released */
1980 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1981 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1982
1983 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1984 f_sleep(X2002);
1985 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1986
1987 /* ACK the DL block */
1988 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1989 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1990 f_dl_block_ack_fn(dl_block, dl_fn));
1991
1992 f_shutdown(__BFILE__, __LINE__, final := true);
1993}
1994
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001995/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
1996testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001997 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001998 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001999 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002000 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002001
2002 /* Initialize NS/BSSGP side */
2003 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002004 /* Initialize GPRS MS side */
2005 f_init_gprs_ms();
2006 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002007
2008 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002009 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002010
2011 /* Establish BSSGP connection to the PCU */
2012 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002013 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002014
2015 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002016 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002017
2018 /* Send one UL block (with TLLI since we are in One-Phase Access
2019 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002020 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002021 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002022 f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002023 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2024 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002025 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002026
2027 /* Send enough blocks to test whole procedure: Until Nth block
2028 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
2029 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002030 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002031 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2032 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002033 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002034
2035 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002036 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 +07002037
2038 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002039}
2040
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002041/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
2042testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
2043 var RlcmacDlBlock dl_block;
2044 var uint32_t dl_fn, sched_fn;
2045 var octetstring payload;
2046 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002047 var template (value) LlcBlockHdr blk_hdr;
2048 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002049 var integer blk_len;
2050 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002051 var GprsMS ms;
2052
2053 /* Initialize NS/BSSGP side */
2054 f_init_bssgp();
2055 /* Initialize GPRS MS side */
2056 f_init_gprs_ms();
2057 ms := g_ms[0]; /* We only use first MS in this test */
2058
2059 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002060 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002061
2062 /* Establish BSSGP connection to the PCU */
2063 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002064 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002065
2066 /* Establish an Uplink TBF */
2067 f_ms_establish_ul_tbf(ms);
2068
2069 /* Send one UL block (with TLLI since we are in One-Phase Access
2070 contention resoultion) and make sure it is ACKED fine. */
2071 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002072 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2073 more := false, e := true);
2074 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002075 /* 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 +01002076 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
2077 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002078 cv := 15,
2079 bsn := ms.ul_tbf.bsn,
2080 blocks := blocks,
2081 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002082 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002083 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002084
2085 /* ACK and check it was received fine */
2086 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2087 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2088 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2089 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002090 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 +02002091
2092 /* Test sending LLC PDUS of incrementing size */
2093 var integer max_size := 49;
2094 for (var integer i := 1; i <= max_size; i := i + 1) {
2095 var integer cv;
2096 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
2097 log("Sending DATA.ind with LLC payload size ", i);
2098 if (i < max_size - g_bs_cv_max) {
2099 cv := 15;
2100 } else {
2101 cv := max_size - i;
2102 }
2103
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002104 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
2105 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002106 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002107 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2108 more := false, e := true);
2109 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002110 /* 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 +01002111 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
2112 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002113 cv := cv,
2114 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002115 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002116 f_ultbf_inc_bsn(ms.ul_tbf);
2117 f_ms_tx_ul_block(ms, ul_data);
2118
2119 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002120 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 +02002121
2122 /* we will receive UL ACK/NACK from time to time, handle it. */
2123 f_rx_rlcmac_dl_block(dl_block, dl_fn);
2124 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
2125 continue;
2126 }
2127 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2128 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2129 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2130 f_shutdown(__BFILE__, __LINE__);
2131 }
2132
2133 log("Rx Packet Uplink ACK / NACK");
2134 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2135 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2136 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2137 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002138
2139 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002140}
2141
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002142function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2143 var octetstring payload;
2144 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002145 var template (value) LlcBlockHdr blk_hdr;
2146 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002147 var integer block_len, max_valid_data_len;
2148 timer T;
2149
2150 block_len := f_rlcmac_cs_mcs2block_len(cs);
2151 /* We need to send with TLLI since we are in One-Phase Access Contenion
2152 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
2153 * indicator, -1 for spare bits octet at the end */
2154 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2155 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 +07002156 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2157 more := false, e := true);
2158 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002159 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2160 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002161 cv := cv,
2162 bsn := ms.ul_tbf.bsn,
2163 blocks := blocks,
2164 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002165 f_ultbf_inc_bsn(ms.ul_tbf);
2166 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2167
2168 T.start(0.5);
2169 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002170 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002171 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2172 f_shutdown(__BFILE__, __LINE__);
2173 }
2174 [] T.timeout {
2175 setverdict(pass);
2176 }
2177 }
2178}
2179/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2180 blocks intentionally contain last byte of data placed in last byte of RLC
2181 containing padding/spare bits, which is incorrect. Spare bits exist and are
2182 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2183 discounting padding in octet" */
2184testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2185 var GprsMS ms;
2186 var integer block_len, max_valid_data_len;
2187
2188 /* Initialize NS/BSSGP side */
2189 f_init_bssgp();
2190 /* Initialize GPRS MS side */
2191 f_init_gprs_ms();
2192 ms := g_ms[0]; /* We only use first MS in this test */
2193
2194 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002195 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002196
2197 /* Establish BSSGP connection to the PCU */
2198 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002199 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002200
2201 /* Establish an Uplink TBF */
2202 f_ms_establish_ul_tbf(ms);
2203
2204 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2205 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2206 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2207
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002208 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002209}
2210
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002211/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2212 * answered, so TBFs for uplink and later for downlink are created.
2213 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002214private 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 +02002215 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002216 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002217 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002218 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002219 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002220
2221 /* Initialize NS/BSSGP side */
2222 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002223 /* Initialize GPRS MS side */
2224 f_init_gprs_ms();
2225 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002226
2227 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002228 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002229
2230 /* Establish BSSGP connection to the PCU */
2231 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002232 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002233
2234 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002235 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002236
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002237 /* Send one UL block (with TLLI since we are in One-Phase Access
2238 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002239 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002240 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2241 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002242 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002243
2244 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002245 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002246
2247 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002248 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2249 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002250
2251 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2252 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002253 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002254
2255 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002256 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2257 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2258 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002259
2260 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002261}
2262
2263/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2264 * answered, so TBFs for uplink and later for downlink are created.
2265 */
2266testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002267 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002268 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002269}
2270
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002271/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2272 * answered, so TBFs for uplink and later for downlink are created.
2273 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002274private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2275 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002276 template (present) CodingScheme exp_ul_cs_mcs := ?,
2277 template (present) CodingScheme exp_dl_cs_mcs := ?)
2278runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002279 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002280 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002281 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002282 var uint32_t sched_fn;
2283 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002284 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002285 var GprsMS ms;
2286
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002287 /* Initialize NS/BSSGP side */
2288 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002289 /* Initialize GPRS MS side */
2290 f_init_gprs_ms();
2291 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002292
2293 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002294 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002295
2296 /* Establish BSSGP connection to the PCU */
2297 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002298 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002299
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002300 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2301 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 +02002302
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002303 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2304 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 +02002305 f_shutdown(__BFILE__, __LINE__);
2306 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002307
2308 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2309 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002310 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002311
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002312 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002313 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 +02002314
2315 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002316 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002317
2318 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002319 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002320 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2321 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002322 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002323 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002324 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002325
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002326 /* PCU acks the UL data after having received CV=0) */
2327 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2328
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002329 /* 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 +02002330 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 +02002331
2332 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002333 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2334 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 +02002335 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002336
2337 f_shutdown(__BFILE__, __LINE__, final := true);
2338}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002339
2340testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002341 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2342 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002343
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002344 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 +02002345}
2346
2347testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002348 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2349 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002350
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002351 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 +02002352}
2353
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002354testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2355 /* Configure PCU to force two phase access */
2356 g_force_two_phase_access := true;
2357
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002358 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002359 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002360
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002361 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 +02002362}
2363
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002364/* Test scenario where SGSN wants to send some data against MS and it is
2365 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2366 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002367private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2368 template (present) CodingScheme exp_cs_mcs := ?)
2369runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002370 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002371 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002372 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002373 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002374 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002375
2376 /* Initialize NS/BSSGP side */
2377 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002378 /* Initialize GPRS MS side */
2379 f_init_gprs_ms();
2380 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002381
2382 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002383 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002384
2385 /* Establish BSSGP connection to the PCU */
2386 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002387 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002388
2389 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002390 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2391 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002392
2393 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2394 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002395 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002396
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002397 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002398 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2399 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 +02002400 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002401
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002402 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002403 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002404
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002405 /* Send one UL block (with TLLI since we are in One-Phase Access
2406 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002407 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002408 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2409 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002410 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002411
2412 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002413 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002414
2415 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002416}
2417
2418testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002419 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002420 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2421}
2422
2423/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2424/* information about the MS */
2425testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002426 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002427 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002428}
2429
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002430/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2431 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2432 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2433 * be transferred).
2434 */
2435testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002436 var RlcmacDlBlock dl_block;
2437 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002438 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002439 var octetstring total_payload;
2440 var octetstring payload;
2441 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002442 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002443 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002444 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002445
2446 /* Initialize NS/BSSGP side */
2447 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002448 /* Initialize GPRS MS side */
2449 f_init_gprs_ms();
2450 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002451
2452 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002453 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002454
2455 /* Establish BSSGP connection to the PCU */
2456 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002457 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002458
2459 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002460 f_ms_establish_ul_tbf(ms);
2461 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002462
2463 /* Send one UL block (with TLLI since we are in One-Phase Access
2464 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002465 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002466 f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002467
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002468 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2469 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002470 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002471 total_payload := payload;
2472
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002473 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2474
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002475 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002476 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002477 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002478 total_payload := total_payload & payload;
2479
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002480 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002481 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002482 total_payload := total_payload & payload;
2483
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002484 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002485 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 +02002486 total_payload := total_payload & lost_payload;
2487
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002488 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002489 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002490 total_payload := total_payload & payload;
2491
2492 /* 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 +02002493 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002494
2495 /* On CV=0, we'll receive a UL ACK asking about missing block */
2496 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2497 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002498 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2499 tfi := tfi,
2500 cv := 15,
2501 bsn := 3,
2502 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002503 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002504
2505 /* Now final ack is recieved */
2506 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2507 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002508 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002509
2510 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002511 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 +07002512
2513 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002514}
2515
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002516/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2517 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2518 * timeout occurs (specified by sent RRBP on DL block). */
2519testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002520 var RlcmacDlBlock dl_block;
2521 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002522 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002523 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002524
2525 /* Initialize NS/BSSGP side */
2526 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002527 /* Initialize GPRS MS side */
2528 f_init_gprs_ms();
2529 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002530
2531 /* Initialize the PCU interface abstraction */
2532 f_init_raw(testcasename());
2533
2534 /* Establish BSSGP connection to the PCU */
2535 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002536 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002537
2538 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002539 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2540 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002541
2542 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2543 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002544 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002545
2546 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2547 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2548 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002549 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002550
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002551 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2552 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002553 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002554
2555 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002556 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2557 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2558 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002559
2560 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002561}
2562
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002563/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2564testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2565 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2566 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002567 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002568 var RlcmacDlBlock dl_block;
2569 var uint32_t ack_fn;
2570 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002571 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002572 timer T := 5.0;
2573
2574 /* Initialize NS/BSSGP side */
2575 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002576 /* Initialize GPRS MS side */
2577 f_init_gprs_ms();
2578 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002579
2580 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002581 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002582
Daniel Willmann535aea62020-09-21 13:27:08 +02002583 f_statsd_reset();
2584
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002585 /* Establish BSSGP connection to the PCU */
2586 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002587 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002588
2589 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002590 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2591 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002592
2593 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2594 f_sleep(X2002);
2595
2596 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2597 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002598 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002599
2600 /* TDMA frame number on which we are supposed to send the ACK */
2601 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2602
2603 /* SGSN sends more blocks during the indicated RRBP */
2604 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2605 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002606 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002607
2608 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2609
2610 /* Make sure this block has the same TFI as was assigned
2611 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002612 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002613 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2614 dl_block.data.mac_hdr.hdr_ext.tfi);
2615 f_shutdown(__BFILE__, __LINE__);
2616 }
2617
2618 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002619 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002620
2621 /* Break if this is the end of RRBP */
2622 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002623 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002624 break;
2625 }
2626 }
2627
2628 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002629 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 +07002630
2631 /* Make sure that the next block (after the Ack) is dummy */
2632 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2633
Daniel Willmann535aea62020-09-21 13:27:08 +02002634 var StatsDExpects expect := {
2635 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2636 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2637 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2638 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2639 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002640 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002641 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2642 };
2643 f_statsd_expect(expect);
2644
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002645 f_shutdown(__BFILE__, __LINE__, final := true);
2646}
2647
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002648/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2649 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2650 * Check "3GPP TS 44.060" Annex B. */
2651testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2652 var RlcmacDlBlock dl_block;
2653 var octetstring dataA := f_rnd_octstring(20);
2654 var octetstring dataB := f_rnd_octstring(13);
2655 var octetstring dataC := f_rnd_octstring(3);
2656 var octetstring dataD := f_rnd_octstring(12);
2657 var uint32_t sched_fn;
2658 var GprsMS ms;
2659 var template (value) RlcmacUlBlock ul_data;
2660
2661 /* Initialize NS/BSSGP side */
2662 f_init_bssgp();
2663 /* Initialize GPRS MS side */
2664 f_init_gprs_ms();
2665 ms := g_ms[0]; /* We only use first MS in this test */
2666
2667 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002668 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002669
2670 /* Establish BSSGP connection to the PCU */
2671 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002672 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002673
2674 /* Establish an Uplink TBF */
2675 f_ms_establish_ul_tbf(ms);
2676
2677 /* Summary of what's transmitted:
2678 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2679 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2680 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2681 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2682 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2683 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2684 */
2685
2686 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002687 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2688 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002689 cv := 3,
2690 bsn := ms.ul_tbf.bsn,
2691 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2692 tlli := ms.tlli);
2693 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2694 * RLCMAC block being sent. */
2695 ul_data.data.mac_hdr.e := true;
2696 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002697 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002698
2699 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002700 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2701 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002702 cv := 2,
2703 bsn := ms.ul_tbf.bsn,
2704 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2705 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2706 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2707 },
2708 tlli := ms.tlli);
2709 f_ultbf_inc_bsn(ms.ul_tbf);
2710 f_ms_tx_ul_block(ms, ul_data);
2711
2712 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002713 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 +02002714
2715 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002716 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2717 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002718 cv := 1,
2719 bsn := ms.ul_tbf.bsn,
2720 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2721 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2722 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2723 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2724 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2725 },
2726 tlli := ms.tlli);
2727 f_ultbf_inc_bsn(ms.ul_tbf);
2728 f_ms_tx_ul_block(ms, ul_data);
2729
2730 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002731 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2732 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 +02002733
2734 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002735 ul_data := t_RLCMAC_UL_DATA_TLLI(
2736 cs := CS_1,
2737 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002738 cv := 0,
2739 bsn := ms.ul_tbf.bsn,
2740 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2741 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2742 },
2743 tlli := ms.tlli);
2744 f_ultbf_inc_bsn(ms.ul_tbf);
2745 f_ms_tx_ul_block(ms, ul_data);
2746
2747 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002748 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 +02002749
2750 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2751 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2752 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2753
2754 f_shutdown(__BFILE__, __LINE__, final := true);
2755}
2756
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002757/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2758 * ACK/NACK is not answered */
2759testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2760 var RlcmacDlBlock dl_block;
2761 var octetstring data1 := f_rnd_octstring(200);
2762 var octetstring data2 := f_rnd_octstring(10);
2763 var uint32_t dl_fn;
2764 var GprsMS ms;
2765 var template (value) TsTrxBtsNum nr;
2766 var BTS_PDTCH_Block data_msg;
2767
2768 /* Initialize NS/BSSGP side */
2769 f_init_bssgp();
2770 /* Initialize GPRS MS side */
2771 f_init_gprs_ms();
2772 ms := g_ms[0]; /* We only use first MS in this test */
2773
2774 /* Initialize the PCU interface abstraction */
2775 f_init_raw(testcasename())
2776
2777 /* Establish BSSGP connection to the PCU */
2778 f_bssgp_establish();
2779 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2780
2781 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2782 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2783 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2784
2785 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2786 f_sleep(X2002);
2787
2788 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2789 while (true) {
2790 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2791
2792 /* Keep Ack/Nack description updated (except for last BSN) */
2793 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2794
2795 if (f_dl_block_rrbp_valid(dl_block)) {
2796 /* Don't transmit DL ACK here on purpose ignore it */
2797 break;
2798 }
2799 }
2800
2801 /* PCU starts whole process again */
2802 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2803
2804 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2805 f_sleep(X2002);
2806
2807 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2808 /* DL data), after that we receive only DUMMY blocks so we are done */
2809 var boolean data_received := false;
2810 nr := ts_TsTrxBtsNum;
2811 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2812 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2813 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2814 block_nr := nr.blk_nr));
2815 alt {
2816 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2817 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2818 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2819 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2820 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2821 tr_RLCMAC_DATA)) -> value data_msg {
2822 data_received := true;
2823 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2824 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2825 log("Received FINAL_ACK");
2826 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2827 }
2828 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2829 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2830 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2831 }
2832 nr := ts_TsTrxBtsNum;
2833 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2834 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2835 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2836 block_nr := nr.blk_nr));
2837 repeat;
2838 }
2839 [] BTS.receive {
2840 setverdict(fail, "Unexpected BTS message");
2841 f_shutdown(__BFILE__, __LINE__);
2842 }
2843 }
2844
2845 f_shutdown(__BFILE__, __LINE__, final := true);
2846}
2847
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002848/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2849testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002850 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002851 var octetstring data := f_rnd_octstring(10);
2852 var PacketDlAssign dl_tbf_ass;
2853 var RlcmacDlBlock dl_block;
2854 var uint32_t poll_fn;
2855 var uint32_t sched_fn;
2856 var GprsMS ms;
2857 timer T := 5.0;
2858
2859 /* Initialize NS/BSSGP side */
2860 f_init_bssgp();
2861 /* Initialize GPRS MS side */
2862 f_init_gprs_ms();
2863 ms := g_ms[0]; /* We only use first MS in this test */
2864
2865 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002866 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2867 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002868
2869 /* Initialize the PCU interface abstraction */
2870 f_init_raw(testcasename(), info_ind);
2871
2872 /* Establish BSSGP connection to the PCU */
2873 f_bssgp_establish();
2874 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2875
2876 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2877 through PDCH (no multiblock assignment possible through PCH) */
2878 f_ms_establish_ul_tbf(ms);
2879
2880 /* Send one UL block (with TLLI since we are in One-Phase Access
2881 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002882 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
2883 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002884 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2885 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2886
2887 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2888 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2889 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2890 gprsextendeddynalloccap := '0'B
2891 };
2892 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2893 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2894 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2895 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2896 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2897 f_shutdown(__BFILE__, __LINE__);
2898 }
2899 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2900
2901 f_shutdown(__BFILE__, __LINE__, final := true);
2902}
2903
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002904testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002905 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002906 var RlcmacDlBlock dl_block;
2907 var octetstring data := f_rnd_octstring(10);
2908 var PollFnCtx pollctx;
2909 var uint32_t sched_fn;
2910 var GprsMS ms;
2911
2912 var MultislotCap_GPRS mscap_gprs := {
2913 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2914 gprsextendeddynalloccap := '0'B
2915 };
2916 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2917
2918
2919 /* Initialize NS/BSSGP side */
2920 f_init_bssgp();
2921 /* Initialize GPRS MS side */
2922 f_init_gprs_ms();
2923 ms := g_ms[0]; /* We only use first MS in this test */
2924
2925 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002926 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2927 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002928
2929 /* Initialize the PCU interface abstraction */
2930 f_init_raw(testcasename(), info_ind);
2931
2932 /* Establish BSSGP connection to the PCU */
2933 f_bssgp_establish();
2934 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2935
2936 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2937 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2938
2939 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
2940 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
2941
2942 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2943 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2944 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2945 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2946 f_shutdown(__BFILE__, __LINE__);
2947 }
2948 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2949
2950 f_shutdown(__BFILE__, __LINE__, final := true);
2951}
2952
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002953testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
2954 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
2955 var RlcmacDlBlock dl_block;
2956 var octetstring data := f_rnd_octstring(10);
2957 var PollFnCtx pollctx;
2958 var uint32_t sched_fn;
2959 var GprsMS ms;
2960
2961 var MultislotCap_GPRS mscap_gprs := {
2962 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2963 gprsextendeddynalloccap := '0'B
2964 };
2965 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2966
2967
2968 /* Initialize NS/BSSGP side */
2969 f_init_bssgp();
2970 /* Initialize GPRS MS side */
2971 f_init_gprs_ms();
2972 ms := g_ms[0]; /* We only use first MS in this test */
2973
2974 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002975 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2976 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002977
2978 /* Initialize the PCU interface abstraction */
2979 f_init_raw(testcasename(), info_ind);
2980
2981 /* Establish BSSGP connection to the PCU */
2982 f_bssgp_establish();
2983 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2984
2985 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2986 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2987
2988 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
2989 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
2990 f_shutdown(__BFILE__, __LINE__);
2991 }
2992
2993 f_shutdown(__BFILE__, __LINE__, final := true);
2994}
2995
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002996/* Test scenario where MS wants to request a new TBF once the current one is
2997 * ending, by means of sending a Packet Resource Request on ul slot provided by
2998 * last Pkt Ul ACK's RRBP.
2999 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3000testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003001 var RlcmacDlBlock dl_block;
3002 var octetstring data := f_rnd_octstring(10);
3003 var uint32_t sched_fn;
3004 var uint32_t dl_fn;
3005 var template RlcmacDlBlock acknack_tmpl;
3006 var GprsMS ms;
3007
3008 /* Initialize NS/BSSGP side */
3009 f_init_bssgp();
3010 /* Initialize GPRS MS side */
3011 f_init_gprs_ms();
3012 ms := g_ms[0]; /* We only use first MS in this test */
3013
3014 /* Initialize the PCU interface abstraction */
3015 f_init_raw(testcasename());
3016
3017 /* 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 Pedrolcdbe9032020-07-07 20:20:42 +02003020
3021 /* Establish an Uplink TBF */
3022 f_ms_establish_ul_tbf(ms);
3023
3024 /* Send one UL block (with TLLI since we are in One-Phase Access
3025 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003026 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003027
3028 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003029 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003030
3031 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3032 tr_UlAckNackGprs(ms.tlli,
3033 tr_AckNackDescription(final_ack := '1'B),
3034 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3035 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3036
3037 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3038
3039 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07003040 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 +07003041 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003042 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3043 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3044
3045 /* Send one UL block (without TLLI since we are in Second-Phase Access)
3046 and make sure it is ACKED fine */
3047 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
3048
3049 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003050 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003051
3052 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3053 /* ACK the ACK */
3054 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3055
3056 f_shutdown(__BFILE__, __LINE__, final := true);
3057}
3058
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003059/* Test CS paging over the BTS<->PCU socket.
3060 * 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.
3061 * Paging should be send on the PACCH.
3062 *
3063 * 1. Send a Paging Request over PCU socket.
3064 * 2. Send a Ready-To-Send message over PCU socket
3065 * 3. Expect a Paging Frame
3066 */
3067testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003068 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003069 var MobileIdentityLV mi;
3070 var octetstring mi_enc_lv;
3071 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003072 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003073
3074 /* Initialize NS/BSSGP side */
3075 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003076 /* Initialize GPRS MS side */
3077 f_init_gprs_ms();
3078 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003079
3080 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003081 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003082
3083 /* Establish BSSGP connection to the PCU */
3084 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003085 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003086
3087 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003088 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003089
3090 /* build mobile Identity */
3091 mi := valueof(ts_MI_IMSI_LV(imsi));
3092 mi_enc_lv := enc_MobileIdentityLV(mi);
3093 /* Send paging request */
3094 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
3095 sapi :=PCU_IF_SAPI_PDTCH));
3096
3097 /* Receive it on BTS side towards MS */
3098 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3099
3100 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003101 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3102 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3103 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3104 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003105
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003106 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003107}
3108
3109/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
3110 */
3111private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3112runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003113 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003114 var hexstring imsi := f_gen_imsi(42);
3115 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003116 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003117
3118 /* Initialize NS/BSSGP side */
3119 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003120 /* Initialize GPRS MS side */
3121 f_init_gprs_ms();
3122 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003123
3124 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003125 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003126
3127 /* Establish BSSGP connection to the PCU */
3128 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003129 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003130
3131 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003132 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003133
3134 /* Send paging request with or without TMSI */
3135 if (use_ptmsi) {
3136 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3137 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3138 } else {
3139 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3140 }
3141
3142 /* Receive it on BTS side towards MS */
3143 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3144
3145 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003146 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003147 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003148 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3149 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3150 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003151 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003152 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3153 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3154 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003155 }
3156
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003157 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003158}
3159
3160testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3161 f_tc_paging_cs_from_sgsn(0, true);
3162}
3163
3164testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3165 f_tc_paging_cs_from_sgsn(0);
3166}
3167
3168testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003169 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003170}
3171
3172/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3173 */
3174private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3175runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003176 var integer imsi_suff_tx := 423;
3177 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003178 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003179
3180 /* Initialize NS/BSSGP side */
3181 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003182 /* Initialize GPRS MS side */
3183 f_init_gprs_ms();
3184 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003185
3186 /* Initialize the PCU interface abstraction */
3187 f_init_raw(testcasename());
3188
3189 /* Establish BSSGP connection to the PCU */
3190 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003191 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003192
3193 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3194 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3195 if (use_ptmsi) {
3196 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3197 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3198 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3199 } else {
3200 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3201 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3202 }
3203
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003204 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003205}
3206
3207testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3208 f_tc_paging_ps_from_sgsn(0, true);
3209}
3210
3211testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3212 f_tc_paging_ps_from_sgsn(0);
3213}
3214
3215testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003216 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003217}
3218
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003219/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3220testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3221 var RlcmacDlBlock dl_block;
3222 var octetstring data := f_rnd_octstring(10);
3223 var uint32_t sched_fn;
3224 var uint32_t dl_fn;
3225 var GprsMS ms;
3226
3227 /* Initialize NS/BSSGP side */
3228 f_init_bssgp();
3229 /* Initialize GPRS MS side */
3230 f_init_gprs_ms();
3231 ms := g_ms[0]; /* We only use first MS in this test */
3232
3233 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003234 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003235
Daniel Willmann535aea62020-09-21 13:27:08 +02003236 f_statsd_reset();
3237
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003238 /* Establish BSSGP connection to the PCU */
3239 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003240 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003241
3242 /* Establish an Uplink TBF */
3243 f_ms_establish_ul_tbf(ms);
3244
3245 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003246 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003247 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3248 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3249 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3250
3251 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003252 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003253
3254 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3255 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3256 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3257
3258 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3259 f_sleep(X2002);
3260 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3261
3262 /* ACK the DL block */
3263 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3264 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3265 f_dl_block_ack_fn(dl_block, dl_fn));
3266
Daniel Willmann535aea62020-09-21 13:27:08 +02003267 var StatsDExpects expect := {
3268 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3269 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3270 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3271 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003272 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003273 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003274 };
3275 f_statsd_expect(expect);
3276
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003277 f_shutdown(__BFILE__, __LINE__, final := true);
3278}
3279
3280/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3281testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3282 var RlcmacDlBlock dl_block;
3283 var octetstring data := f_rnd_octstring(10);
3284 var uint32_t sched_fn;
3285 var uint32_t dl_fn;
3286 var GprsMS ms;
3287
3288 /* Initialize NS/BSSGP side */
3289 f_init_bssgp();
3290 /* Initialize GPRS MS side */
3291 f_init_gprs_ms();
3292 ms := g_ms[0]; /* We only use first MS in this test */
3293
3294 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003295 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003296
3297 /* Establish BSSGP connection to the PCU */
3298 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003299 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003300
3301 /* Establish an Uplink TBF */
3302 f_ms_establish_ul_tbf(ms);
3303
3304 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003305 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003306 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3307 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3308 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3309
3310 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003311 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003312
3313 /* Now SGSN sends some DL data with an invalid IMSI */
3314 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3315
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003316 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003317
3318 /* TODO: make sure no data is sent over PCU -> MS */
3319
3320 f_shutdown(__BFILE__, __LINE__, final := true);
3321}
3322
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003323private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3324 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3325 var octetstring data := f_rnd_octstring(6);
3326 var RlcmacDlBlock dl_block;
3327 var GprsMS ms;
3328 var uint32_t fn;
3329
3330 /* Initialize NS/BSSGP side */
3331 f_init_bssgp();
3332 /* Initialize GPRS MS side */
3333 f_init_gprs_ms();
3334 ms := g_ms[0]; /* We only use first MS in this test */
3335
3336 /* Initialize the PCU interface abstraction */
3337 f_init_raw(testcasename());
3338
3339 /* Establish BSSGP connection to the PCU */
3340 f_bssgp_establish();
3341 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3342
3343 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3344 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3345 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3346
3347 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3348 f_sleep(X2002);
3349
3350 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3351 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3352
3353 if (ischosen(dl_block.data_egprs)) {
3354 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3355 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3356 f_shutdown(__BFILE__, __LINE__);
3357 }
3358 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3359 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3360 f_shutdown(__BFILE__, __LINE__);
3361 }
3362 if (not match(dl_block.data_egprs.blocks[1].payload,
3363 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3364 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3365 f_shutdown(__BFILE__, __LINE__);
3366 }
3367 } else if (lengthof(dl_block.data.blocks) > 1) {
3368 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3369 f_shutdown(__BFILE__, __LINE__);
3370 }
3371
3372 f_shutdown(__BFILE__, __LINE__, final := true);
3373}
3374
3375/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3376 * containing llc data. See OS#4849 */
3377testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3378 f_tc_dl_data_no_llc_ui_dummy(omit);
3379}
3380
3381/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3382 * containing llc data. See OS#4849 */
3383testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003384 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003385}
3386
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003387private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003388 template GsmRrMessage t_imm_ass := ?,
3389 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003390runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003391 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003392 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003393
3394 ra11 := enc_EGPRSPktChRequest2uint(req);
3395 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3396
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003397 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003398 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003399 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003400 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003401 }
3402
3403 setverdict(pass);
3404}
3405
3406testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3407 var template GsmRrMessage imm_ass;
3408 var template IaRestOctets rest;
3409 var template EgprsUlAss ul_ass;
3410
3411 /* Initialize the PCU interface abstraction */
3412 f_init_raw(testcasename());
3413
3414 var EGPRSPktChRequest req := {
3415 /* NOTE: other fields are set in the loop */
3416 signalling := { tag := '110011'B }
3417 };
3418
3419 for (var integer i := 0; i < 6; i := i + 1) {
3420 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3421 req.signalling.random_bits := ext_ra;
3422
3423 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3424 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3425 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3426 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3427
3428 f_TC_egprs_pkt_chan_req(req, imm_ass);
3429 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003430
3431 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003432}
3433
3434testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3435 var template GsmRrMessage imm_ass;
3436 var template IaRestOctets rest;
3437 var template EgprsUlAss ul_ass;
3438
3439 /* Initialize the PCU interface abstraction */
3440 f_init_raw(testcasename());
3441
3442 var EGPRSPktChRequest req := {
3443 /* NOTE: other fields are set in the loop */
3444 one_phase := { tag := '0'B }
3445 };
3446
3447 for (var integer i := 0; i < 6; i := i + 1) {
3448 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3449 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3450 var BIT2 priority := substr(ext_ra, 0, 2);
3451 var BIT3 rand := substr(ext_ra, 2, 3);
3452
3453 req.one_phase.multislot_class := mslot_class;
3454 req.one_phase.priority := priority;
3455 req.one_phase.random_bits := rand;
3456
3457 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3458 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3459 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3460 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3461
3462 f_TC_egprs_pkt_chan_req(req, imm_ass);
3463 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003464
3465 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003466}
3467
3468testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3469 var template GsmRrMessage imm_ass;
3470 var template IaRestOctets rest;
3471 var template EgprsUlAss ul_ass;
3472
3473 /* Initialize the PCU interface abstraction */
3474 f_init_raw(testcasename());
3475
3476 var EGPRSPktChRequest req := {
3477 /* NOTE: other fields are set in the loop */
3478 two_phase := { tag := '110000'B }
3479 };
3480
3481 for (var integer i := 0; i < 6; i := i + 1) {
3482 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3483 var BIT2 priority := substr(ext_ra, 0, 2);
3484 var BIT3 rand := substr(ext_ra, 2, 3);
3485
3486 req.two_phase.priority := priority;
3487 req.two_phase.random_bits := rand;
3488
3489 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3490 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3491 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3492 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3493
3494 f_TC_egprs_pkt_chan_req(req, imm_ass);
3495 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003496
3497 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003498}
3499
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003500private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3501 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003502 PCUIF_BurstType bt := BURST_TYPE_1,
3503 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003504runs on RAW_PCU_Test_CT {
3505 var template ReqRefWaitInd tr_ref;
3506 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003507
3508 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3509 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3510 ra := bit2int(ra11), is_11bit := 1,
3511 burst_type := bt, fn := fn,
3512 arfcn := 871));
3513
3514 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003515 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003516
3517 /* Just to have a short-name reference to the actual message */
3518 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3519
3520 /* Make sure that Request Reference list contains at least one entry
3521 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003522 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003523 if (not match(iar.payload, { *, tr_ref, * })) {
3524 setverdict(fail, "Request Reference list does not match");
3525 f_shutdown(__BFILE__, __LINE__);
3526 }
3527
3528 /* Match Feature Indicator (must indicate PS domain) */
3529 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3530 setverdict(fail, "Feature Indicator does not match");
3531 f_shutdown(__BFILE__, __LINE__);
3532 }
3533
3534 /* Match IAR Rest Octets */
3535 if (not match(iar.rest_octets, rest)) {
3536 setverdict(fail, "IAR Rest Octets does not match: ",
3537 iar.rest_octets, " vs expected ", rest);
3538 f_shutdown(__BFILE__, __LINE__);
3539 }
3540
3541 setverdict(pass);
3542}
3543
3544/* Verify the contents of RR Immediate Assignment Reject message and its
3545 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3546testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3547 var template IARRestOctets rest;
3548 var BIT5 ext_ra;
3549
3550 /* Initialize the PCU interface abstraction */
3551 f_init_raw(testcasename());
3552
3553 for (var integer i := 0; i < 6; i := i + 1) {
3554 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3555 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3556
3557 /* Intentionally incorrect message (see table 11.2.5a.2) */
3558 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3559 }
3560
3561 f_shutdown(__BFILE__, __LINE__, final := true);
3562}
3563
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003564/* At the moment, the IUT does not support any emergency services. Make sure
3565 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3566testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3567 var template IARRestOctets rest;
3568 var BIT5 ext_ra;
3569 var BIT11 ra11;
3570
3571 /* Initialize the PCU interface abstraction */
3572 f_init_raw(testcasename());
3573
3574 var EGPRSPktChRequest req := {
3575 /* NOTE: other fields are set in the loop */
3576 emergency := { tag := '110111'B }
3577 };
3578
3579 for (var integer i := 0; i < 6; i := i + 1) {
3580 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3581 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3582
3583 req.emergency.random_bits := ext_ra;
3584 ra11 := enc_EGPRSPktChRequest2bits(req);
3585
3586 /* Intentionally incorrect message (see table 11.2.5a.2) */
3587 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3588 }
3589
3590 f_shutdown(__BFILE__, __LINE__, final := true);
3591}
3592
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003593/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3594testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003595 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003596 var template IARRestOctets rest;
3597 var BIT11 ra11;
3598
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003599 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003600 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003601
3602 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003603 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3604 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003605
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003606 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003607 f_init_raw(testcasename(), info_ind);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003608
3609 var EGPRSPktChRequest req := {
3610 one_phase := {
3611 tag := '0'B,
3612 multislot_class := '10101'B,
3613 priority := '01'B,
3614 random_bits := '101'B
3615 }
3616 };
3617
3618 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3619 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3620 for (var integer i := 0; i < 7; i := i + 1) {
3621 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3622 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3623 }
3624
3625 ra11 := enc_EGPRSPktChRequest2bits(req);
3626 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3627
3628 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003629 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003630
3631 f_shutdown(__BFILE__, __LINE__, final := true);
3632}
3633
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003634/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003635private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003636return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003637 /* Pick a random MA length in range 2 .. max_ma_len */
3638 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
3639
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003640 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
3641 hsn := f_rnd_int(63),
3642 maio := f_rnd_int(63),
3643 ma := f_rnd_bitstring(ma_len));
3644}
3645
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003646private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
3647 in GsmRrMessage rr_msg)
3648{
3649 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003650 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003651
3652 var template PacketChannelDescription tr_pkt_chan_desc := {
3653 channel_Type_spare := ?,
3654 tn := ?,
3655 tsc := ts.tsc,
3656 presence := '1'B,
3657 zero := omit,
3658 one := {
3659 maio := ts.maio,
3660 hsn := ts.hsn
3661 }
3662 };
3663
3664 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
3665 setverdict(fail, "Packet Channel Description does not match: ",
3666 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
3667 }
3668
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003669 /* Mobile Allocation is expected to be octet-aligned */
3670 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
3671 var template MobileAllocationLV tr_ma := {
3672 len := ma_oct_len, /* in bytes */
3673 ma := substr(ts.ma, 0, ma_oct_len * 8)
3674 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003675
3676 if (not match(ia.mobile_allocation, tr_ma)) {
3677 setverdict(fail, "Mobile Allocation does not match: ",
3678 ia.mobile_allocation, " vs ", tr_ma);
3679 }
3680
3681 setverdict(pass);
3682}
3683
3684/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
3685testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003686 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003687 var GprsMS ms := valueof(t_GprsMS_def);
3688
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003689 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003690 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003691
3692 /* Initialize the PCU interface abstraction */
3693 f_init_raw(testcasename(), info_ind);
3694
3695 /* EGPRS Packet Channel Request (cause=Signalling) */
3696 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
3697
3698 /* Establish an Uplink EGPRS TBF */
3699 f_ms_establish_ul_tbf(ms);
3700
3701 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3702 f_shutdown(__BFILE__, __LINE__, final := true);
3703}
3704
3705/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
3706testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003707 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003708 var GprsMS ms := valueof(t_GprsMS_def);
3709
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003710 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003711 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003712
3713 /* Initialize the PCU interface abstraction */
3714 f_init_raw(testcasename(), info_ind);
3715
3716 /* Establish an Uplink TBF */
3717 f_ms_establish_ul_tbf(ms);
3718
3719 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3720 f_shutdown(__BFILE__, __LINE__, final := true);
3721}
3722
3723/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
3724testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003725 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003726 var GprsMS ms := valueof(t_GprsMS_def);
3727
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003728 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003729 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003730
3731 /* Initialize NS/BSSGP side */
3732 f_init_bssgp();
3733
3734 /* Initialize the PCU interface abstraction */
3735 f_init_raw(testcasename(), info_ind);
3736
3737 /* Establish BSSGP connection to the PCU */
3738 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003739 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003740
3741 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3742 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
3743 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3744
3745 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
3746 f_shutdown(__BFILE__, __LINE__, final := true);
3747}
3748
3749private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
3750 in FrequencyParameters fp)
3751{
3752 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003753 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003754
3755 /* Table 12.8.1: Frequency Parameters information elements */
3756 var template FrequencyParameters tr_fp := {
3757 tsc := ts.tsc,
3758 presence := '10'B, /* Direct encoding 1 */
3759 arfcn := omit,
3760 indirect := omit,
3761 direct1 := {
3762 maio := ts.maio,
3763 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
3764 mobile_allocation := {
3765 hsn := ts.hsn,
3766 rfl_number_list_present := '0'B,
3767 rfl_number_list := omit,
3768 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003769 ma_length := ts.ma_bit_len,
3770 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003771 }
3772 },
3773 direct2 := omit
3774 };
3775
3776 if (not match(fp, tr_fp)) {
3777 setverdict(fail, "Frequency Parameters IE does not match: ",
3778 fp, " vs ", tr_fp);
3779 }
3780
3781 setverdict(pass);
3782}
3783
3784/* Make sure that Packet Uplink Assignment contains hopping parameters */
3785testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003786 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003787 var GprsMS ms := valueof(t_GprsMS_def);
3788 var uint32_t poll_fn;
3789
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003790 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003791 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003792
3793 /* Initialize the PCU interface abstraction */
3794 f_init_raw(testcasename(), info_ind);
3795
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003796 /* Single block (two phase) packet access */
3797 var uint16_t ra := bit2int(chan_req_sb);
3798 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
3799
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003800 /* Establish an Uplink TBF */
3801 f_ms_establish_ul_tbf(ms);
3802
3803 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003804 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
3805 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003806
3807 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003808 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
3809 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003810
3811 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
3812 var template (omit) FrequencyParameters fp;
3813 if (ua.is_egprs == '1'B) {
3814 fp := ua.egprs.freq_par;
3815 } else {
3816 fp := ua.gprs.freq_par;
3817 }
3818
3819 /* This is an optional IE, so it's worth to check its presence */
3820 if (istemplatekind(fp, "omit")) {
3821 setverdict(fail, "Frequency Parameters IE is not present");
3822 f_shutdown(__BFILE__, __LINE__);
3823 }
3824
3825 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
3826 f_shutdown(__BFILE__, __LINE__, final := true);
3827}
3828
3829/* Make sure that Packet Downlink Assignment contains hopping parameters */
3830testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003831 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003832 var octetstring data := f_rnd_octstring(10);
3833 var GprsMS ms := valueof(t_GprsMS_def);
3834 var RlcmacDlBlock dl_block;
3835 var uint32_t poll_fn;
3836
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003837 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003838 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003839
3840 /* Initialize NS/BSSGP side */
3841 f_init_bssgp();
3842
3843 /* Initialize the PCU interface abstraction */
3844 f_init_raw(testcasename(), info_ind);
3845
3846 /* Establish BSSGP connection to the PCU */
3847 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003848 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003849
3850 /* Establish an Uplink TBF */
3851 f_ms_establish_ul_tbf(ms);
3852
3853 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003854 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003855
3856 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3857 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
3858 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
3859
3860 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
3861 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3862
3863 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003864 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
3865 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003866
3867 /* This is an optional IE, so it's worth to check its presence */
3868 if (not ispresent(da.freq_par)) {
3869 setverdict(fail, "Frequency Parameters IE is not present");
3870 f_shutdown(__BFILE__, __LINE__);
3871 }
3872
3873 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
3874 f_shutdown(__BFILE__, __LINE__, final := true);
3875}
3876
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003877/* Check if the IUT handles subsequent INFO.ind messages */
3878testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003879 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003880 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003881
3882 /* Initialize the PCU interface abstraction */
3883 f_init_raw(testcasename(), info_ind);
3884
3885 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
3886 for (var integer i := 0; i < 16; i := i + 1) {
3887 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003888 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003889 }
3890
3891 f_shutdown(__BFILE__, __LINE__, final := true);
3892}
3893
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003894/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
3895testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
3896 var PCUIF_info_ind info_ind;
3897 var integer i;
3898 const integer num_ms := 8;
3899
3900 /* Initialize NS/BSSGP side */
3901 f_init_bssgp();
3902 /* Initialize GPRS MS side */
3903 f_init_gprs_ms(num_ms);
3904
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003905 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003906 /* Only the 3 first TRX are enabled. The enabled ones all have same
3907 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003908 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
3909 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
3910 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
3911 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003912
3913 /* Initialize the PCU interface abstraction */
3914 f_init_raw(testcasename(), info_ind);
3915
3916 /* Establish BSSGP connection to the PCU */
3917 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003918 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003919
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003920 /* Establish an Uplink TBF for each GprsMS instance */
3921 f_multi_ms_establish_tbf(do_activate := false);
3922
3923 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003924 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003925 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01003926 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003927 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003928 f_shutdown(__BFILE__, __LINE__);
3929 }
3930 }
3931
3932 f_shutdown(__BFILE__, __LINE__, final := true);
3933}
3934
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003935/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
3936 * downgraded to CS1-4 so that GPRS can read the USF).
3937 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
3938 */
3939testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
3940 var PCUIF_info_ind info_ind;
3941 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
3942 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003943 var uint32_t sched_fn, dl_fn, ack_fn;
3944 var octetstring data := f_rnd_octstring(10);
3945 var RlcmacDlBlock dl_block;
3946 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003947 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003948 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
3949 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
3950
3951 /* Initialize NS/BSSGP side */
3952 f_init_bssgp();
3953 /* Initialize GPRS MS side */
3954 f_init_gprs_ms(num_ms);
3955
3956 info_ind := valueof(ts_PCUIF_INFO_default);
3957 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003958 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
3959 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003960
3961 /* Initialize the PCU interface abstraction */
3962 f_init_raw(testcasename(), info_ind);
3963
3964 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
3965 g_mcs_initial_dl := 5;
3966 g_mcs_max_dl := 5;
3967 f_pcuvty_set_allowed_cs_mcs();
3968
3969 /* Establish BSSGP connection to the PCU */
3970 f_bssgp_establish();
3971 f_multi_ms_bssgp_register();
3972
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003973 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003974 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 +01003975 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
3976 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
3977 f_shutdown(__BFILE__, __LINE__);
3978 }
3979 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3980 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3981
3982 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003983 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 +01003984 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
3985 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
3986 f_shutdown(__BFILE__, __LINE__);
3987 }
3988 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3989 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3990
3991 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
3992 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3993 f_sleep(0.1);
3994 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3995 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3996 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
3997 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3998 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
3999 /* ACK the DL block */
4000 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
4001 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
4002 f_dl_block_ack_fn(dl_block, dl_fn));
4003
4004 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
4005 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4006 f_sleep(0.1);
4007 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4008 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4009 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
4010 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4011 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
4012 /* ACK the DL block */
4013 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
4014 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
4015 f_dl_block_ack_fn(dl_block, dl_fn));
4016
4017 data := f_rnd_octstring(1400);
4018 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4019 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4020
4021 for (var integer i := 0; i < 800; i := i + 1) {
4022 f_rx_rlcmac_dl_block(dl_block, dl_fn);
4023
4024 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
4025 /* No more data to receive, done */
4026 break;
4027 }
4028
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004029 usf_ms := -1;
4030
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004031 if (ischosen(dl_block.ctrl)) {
4032 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
4033 f_shutdown(__BFILE__, __LINE__);
4034 } else if (ischosen(dl_block.data_egprs)) {
4035 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
4036 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
4037 f_shutdown(__BFILE__, __LINE__);
4038 }
4039 tgt_ms := 1;
4040 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
4041 if (dl_block.data_egprs.mcs > MCS_4) {
4042 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
4043 f_shutdown(__BFILE__, __LINE__);
4044 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004045 usf_ms := 0;
4046 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004047 } else {
4048 if (dl_block.data_egprs.mcs <= MCS_4) {
4049 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
4050 f_shutdown(__BFILE__, __LINE__);
4051 }
4052 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004053 usf_ms := 1;
4054 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004055 }
4056 }
4057 } else {
4058 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
4059 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
4060 f_shutdown(__BFILE__, __LINE__);
4061 }
4062 tgt_ms := 0;
4063 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 +01004064 usf_ms := 0;
4065 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004066 } 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 +01004067 usf_ms := 1;
4068 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004069 }
4070 }
4071
4072 /* Keep Ack/Nack description updated */
4073 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
4074
4075 /* TDMA frame number on which we are supposed to send the ACK */
4076 if (f_dl_block_rrbp_valid(dl_block)) {
4077 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
4078 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);
4079 if (tx_data_remain != 0) {
4080 /* Submit more data from time to time to keep the TBF ongoing */
4081 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4082 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4083 tx_data_remain := tx_data_remain - 1;
4084 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004085 } else if (tx_data_remain != 0) {
4086 /* keep sending UL blocks when requested by USF to avoid
4087 * UL TBF timeout and hence stop receival of USFs */
4088 if (usf_ms != -1) {
4089 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
4090 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004091 }
4092 }
4093
4094 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 +01004095 /* He we check that DL blocks scheduled at GPRS can still request UL
4096 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
4097 * condition also ensures the downgrade to <=MCS4 condition is tested
4098 * above */
4099 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
4100 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004101 f_shutdown(__BFILE__, __LINE__);
4102 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004103 /* Here check for some level of fairness between them (at least ~40%): */
4104 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
4105 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
4106 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
4107 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
4108 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4109 f_shutdown(__BFILE__, __LINE__);
4110 }
4111 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
4112 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4113 f_shutdown(__BFILE__, __LINE__);
4114 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004115
4116 f_shutdown(__BFILE__, __LINE__, final := true);
4117}
4118
4119
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004120private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4121 boolean exp_imsi, boolean exp_tmsi)
4122runs on RAW_PCU_Test_CT {
4123 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4124 var integer pending := lengthof(g_ms);
4125 var RlcmacDlBlock dl_block;
4126 var boolean f1, f2;
4127
4128 while (pending > 0) {
4129 var uint32_t poll_fn;
4130
4131 /* Obtain a Downlink block and make sure it is a paging request */
4132 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4133 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4134 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4135 break;
4136 }
4137
4138 /* This should not happen in general, but who knows... */
4139 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4140 if (not ispresent(req.repeated_pageinfo)) {
4141 setverdict(fail, "Repeated Page Info IE is absent?!?");
4142 break;
4143 }
4144
4145 /* A single message may contain several MIs depending on their type */
4146 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4147 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4148 ps_domain := false);
4149 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4150 ps_domain := false);
4151 if (not f1 and not f2)
4152 { continue; }
4153
4154 /* Detect duplicate MIs */
4155 if (mask[i] == '1'B) {
4156 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4157 continue;
4158 }
4159
4160 mask[i] := '1'B;
4161 }
4162
4163 pending := pending - lengthof(req.repeated_pageinfo);
4164 }
4165
4166 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4167 if (mask[i] != '1'B) {
4168 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4169 log("===== mask := ", mask);
4170 }
4171 }
4172
4173 /* All messages must have been received by now, expect a dummy block */
4174 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4175}
4176
4177private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4178runs on RAW_PCU_Test_CT {
4179 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4180 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4181
4182 /* Initialize NS/BSSGP side */
4183 f_init_bssgp();
4184
4185 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004186 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004187
4188 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4189 f_init_gprs_ms(7 * 8);
4190
4191 /* Initialize the PCU interface abstraction */
4192 f_init_raw(testcasename(), info_ind);
4193
4194 /* Establish BSSGP connection to the PCU */
4195 f_bssgp_establish();
4196 f_multi_ms_bssgp_register();
4197
4198 /* Establish an Uplink TBF for each GprsMS instance */
4199 f_multi_ms_establish_tbf(do_activate := true);
4200}
4201
4202testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4203 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4204
4205 /* Common part: send INFO.ind, establish TBFs... */
4206 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4207
4208 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4209 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4210 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4211 }
4212
4213 /* FIXME: work around a race condition between PCUIF and BSSGP */
4214 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4215
4216 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4217 * The IUT is expected to page on all PDCH slots of all transceivers. */
4218 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4219 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4220 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4221 }
4222
4223 f_shutdown(__BFILE__, __LINE__, final := true);
4224}
4225
4226testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4227 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4228
4229 /* Common part: send INFO.ind, establish TBFs... */
4230 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4231
4232 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4233 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4234 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4235 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4236 }
4237
4238 /* FIXME: work around a race condition between PCUIF and BSSGP */
4239 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4240
4241 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4242 * The IUT is expected to page on all PDCH slots of all transceivers. */
4243 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4244 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4245 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4246 }
4247
4248 f_shutdown(__BFILE__, __LINE__, final := true);
4249}
4250
4251testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4252 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4253
4254 /* Common part: send INFO.ind, establish TBFs... */
4255 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4256
4257 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4258 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4259 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4260 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4261 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4262 } else {
4263 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4264 }
4265 }
4266
4267 /* FIXME: work around a race condition between PCUIF and BSSGP */
4268 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4269
4270 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4271 * The IUT is expected to page on all PDCH slots of all transceivers. */
4272 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4273 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4274 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4275 }
4276
4277 f_shutdown(__BFILE__, __LINE__, final := true);
4278}
4279
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004280private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004281runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4282 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004283 var integer i := 0;
4284 while (true) {
4285 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4286 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4287 break;
4288 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004289 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004290 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4291 f_shutdown(__BFILE__, __LINE__);
4292 }
4293 i := i + 1;
4294 }
4295 return dl_block;
4296}
4297
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004298private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4299runs on RAW_PCU_Test_CT {
4300 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),
4301 info_ind.lac),
4302 info_ind.rac),
4303 info_ind.cell_id));
4304 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4305 423),
4306 2),
4307 5));
4308 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4309 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4310 var template (value) RAN_Information_RIM_Container res_cont :=
4311 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4312 ts_RIM_Sequence_Number(2),
4313 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4314 ts_RIM_Protocol_Version_Number(1),
4315 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4316 omit);
4317 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4318 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4319 res_cont));
4320}
4321
4322altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4323runs on RAW_PCU_Test_CT {
4324 /* RIM procedure: */
4325 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),
4326 info_ind.lac),
4327 info_ind.rac),
4328 info_ind.cell_id));
4329 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4330 423),
4331 2),
4332 5));
4333 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4334 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4335 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4336 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4337 tr_RAN_Information_Request_RIM_Container)) {
4338 if (do_answer) {
4339 f_outbound_nacc_rim_tx_resp(info_ind);
4340 }
4341 if (do_repeat) {
4342 repeat;
4343 }
4344 }
4345}
4346
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004347/* Start NACC from MS side */
4348private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004349 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
4350 boolean skip_final_ctrl_ack := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004351runs on RAW_PCU_Test_CT {
4352 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4353 var RlcmacDlBlock dl_block;
4354 var uint32_t sched_fn;
4355 var GsmArfcn req_arfcn := 862;
4356 var uint6_t req_bsic := 43;
4357
4358 /* Start NACC from MS side */
4359 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4360 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4361
4362 if (exp_rac_ci_query == true) {
4363 /* osmo-pcu should now ask for resolution: */
4364 f_ipa_ctrl_wait_link_up();
4365 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4366 int2str(info_ind.lac) & "." &
4367 int2str(info_ind.cell_id) & "." &
4368 int2str(req_arfcn) & "." &
4369 int2str(req_bsic);
4370 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4371 }
4372
4373 if (exp_si_query == true) {
4374 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004375 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004376 }
4377
4378 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004379 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004380
4381 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4382 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4383 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4384 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4385 f_shutdown(__BFILE__, __LINE__);
4386 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004387 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004388 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004389 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4390 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4391 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004392}
4393
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004394/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4395testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004396 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004397 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004398 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004399
4400 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4401 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4402
4403 /* Initialize NS/BSSGP side */
4404 f_init_bssgp();
4405 /* Initialize GPRS MS side */
4406 f_init_gprs_ms();
4407 ms := g_ms[0]; /* We only use first MS in this test */
4408
4409 /* Initialize the PCU interface abstraction */
4410 f_init_raw(testcasename(), info_ind);
4411
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004412 /* Make sure we are not affected by full cache from previous tests */
4413 f_pcuvty_flush_neigh_caches();
4414
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004415 /* Establish BSSGP connection to the PCU */
4416 f_bssgp_establish();
4417 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4418
4419 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004420 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 +01004421 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4422 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4423
4424 /* Start NACC from MS side */
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004425 f_outbound_nacc_success(ms, info_ind);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004426
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004427 f_shutdown(__BFILE__, __LINE__, final := true);
4428}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004429
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004430/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4431testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4432 var PollFnCtx pollctx;
4433 var GprsMS ms;
4434 var RlcmacDlBlock dl_block;
4435 var uint32_t sched_fn;
4436 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004437
4438 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4439 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4440
4441 /* Initialize NS/BSSGP side */
4442 f_init_bssgp();
4443 /* Initialize GPRS MS side */
4444 f_init_gprs_ms();
4445 ms := g_ms[0]; /* We only use first MS in this test */
4446
4447 /* Initialize the PCU interface abstraction */
4448 f_init_raw(testcasename(), info_ind);
4449
4450 /* Make sure we are not affected by full cache from previous tests */
4451 f_pcuvty_flush_neigh_caches();
4452
4453 /* Establish BSSGP connection to the PCU */
4454 f_bssgp_establish();
4455 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4456
4457 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004458 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 +01004459 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4460 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4461
4462 /* Start NACC from MS side, avoid sending final CTRL ACK */
4463 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true);
4464
4465 /* Wait until we receive something non-dummy */
4466 dl_block := f_skip_dummy(0, sched_fn);
4467 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4468 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4469 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4470 }
4471 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4472 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4473 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4474 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4475 }
4476
4477 f_shutdown(__BFILE__, __LINE__, final := true);
4478}
4479
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004480/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4481testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4482 var PollFnCtx pollctx;
4483 var GprsMS ms;
4484 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004485 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004486
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004487 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4488 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004489
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004490 /* Initialize NS/BSSGP side */
4491 f_init_bssgp();
4492 /* Initialize GPRS MS side */
4493 f_init_gprs_ms();
4494 ms := g_ms[0]; /* We only use first MS in this test */
4495
4496 /* Initialize the PCU interface abstraction */
4497 f_init_raw(testcasename(), info_ind);
4498
4499 /* Make sure we are not affected by full cache from previous tests */
4500 f_pcuvty_flush_neigh_caches();
4501 /* Set timeout values for caches so that entries will be in cache during second try */
4502 f_pcuvty_set_neigh_caches(10, 10);
4503
4504 /* Establish BSSGP connection to the PCU */
4505 f_bssgp_establish();
4506 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4507
4508 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004509 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 +01004510 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4511 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4512
4513 /* Start NACC from MS side */
4514 f_outbound_nacc_success(ms, info_ind);
4515
4516 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
4517 f_outbound_nacc_success(ms, info_ind, false, false);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004518
4519 f_shutdown(__BFILE__, __LINE__, final := true);
4520}
4521
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004522/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4523 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4524 */
4525testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4526 var PollFnCtx pollctx;
4527 var GprsMS ms;
4528 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004529 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4530
4531 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4532 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4533
4534 /* Initialize NS/BSSGP side */
4535 f_init_bssgp();
4536 /* Initialize GPRS MS side */
4537 f_init_gprs_ms();
4538 ms := g_ms[0]; /* We only use first MS in this test */
4539
4540 /* Initialize the PCU interface abstraction */
4541 f_init_raw(testcasename(), info_ind);
4542
4543 /* Make sure we are not affected by full cache from previous tests */
4544 f_pcuvty_flush_neigh_caches();
4545 /* Set timeout values for caches so that entries will be erased before the second try */
4546 f_pcuvty_set_neigh_caches(1, 1);
4547
4548 /* Establish BSSGP connection to the PCU */
4549 f_bssgp_establish();
4550 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4551
4552 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004553 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 +01004554 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4555 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4556
4557 /* Start NACC from MS side */
4558 f_outbound_nacc_success(ms, info_ind);
4559
4560 /* CTRL client should have disconnected from us */
4561 f_ipa_ctrl_wait_link_down();
4562 /* wait for cache entries to time out */
4563 f_sleep(2.0);
4564 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
4565 f_outbound_nacc_success(ms, info_ind);
4566
4567 f_shutdown(__BFILE__, __LINE__, final := true);
4568}
4569
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004570/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004571testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4572 var RlcmacDlBlock dl_block;
4573 var PollFnCtx pollctx;
4574 var uint32_t sched_fn;
4575 var GprsMS ms;
4576 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4577 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004578 var GsmArfcn req_arfcn := 862;
4579 var uint6_t req_bsic := 43;
4580
4581 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4582 * resolution CTRL port, to trigger Conn Refused by socket:
4583 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4584 */
4585
4586 /* Initialize NS/BSSGP side */
4587 f_init_bssgp();
4588 /* Initialize GPRS MS side */
4589 f_init_gprs_ms();
4590 ms := g_ms[0]; /* We only use first MS in this test */
4591
4592 /* Initialize the PCU interface abstraction */
4593 f_init_raw(testcasename(), info_ind);
4594
4595 /* Make sure we are not affected by full cache from previous tests */
4596 f_pcuvty_flush_neigh_caches();
4597
4598 /* Establish BSSGP connection to the PCU */
4599 f_bssgp_establish();
4600 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4601
4602 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004603 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 +01004604 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4605 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4606
4607 /* Start NACC from MS side */
4608 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4609 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4610
4611 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004612 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004613 /* Make sure it is a Pkt Cell Chg Continue */
4614 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4615 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4616 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004617 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4618 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4619 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4620 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4621 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004622
4623 f_shutdown(__BFILE__, __LINE__, final := true);
4624}
4625
4626/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004627testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
4628 var RlcmacDlBlock dl_block;
4629 var PollFnCtx pollctx;
4630 var uint32_t sched_fn;
4631 var GprsMS ms;
4632 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4633 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004634 var GsmArfcn req_arfcn := 862;
4635 var uint6_t req_bsic := 43;
4636
4637 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4638 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4639
4640 /* Initialize NS/BSSGP side */
4641 f_init_bssgp();
4642 /* Initialize GPRS MS side */
4643 f_init_gprs_ms();
4644 ms := g_ms[0]; /* We only use first MS in this test */
4645
4646 /* Initialize the PCU interface abstraction */
4647 f_init_raw(testcasename(), info_ind);
4648
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004649 /* Make sure we are not affected by full cache from previous tests */
4650 f_pcuvty_flush_neigh_caches();
4651
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004652 /* Establish BSSGP connection to the PCU */
4653 f_bssgp_establish();
4654 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4655
4656 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004657 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 +01004658 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4659 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4660
4661 /* Start NACC from MS side */
4662 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4663 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4664
4665 /* osmo-pcu should now ask for resolution: */
4666 f_ipa_ctrl_wait_link_up();
4667 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4668 int2str(info_ind.lac) & "." &
4669 int2str(info_ind.cell_id) & "." &
4670 int2str(req_arfcn) & "." &
4671 int2str(req_bsic);
4672 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
4673 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4674
4675 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004676 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004677 /* Make sure it is a Pkt Cell Chg Continue */
4678 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4679 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4680 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004681 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4682 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4683 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4684 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4685 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004686
4687 f_shutdown(__BFILE__, __LINE__, final := true);
4688}
4689
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004690/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
4691testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
4692 var RlcmacDlBlock dl_block;
4693 var PollFnCtx pollctx;
4694 var uint32_t sched_fn;
4695 var GprsMS ms;
4696 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4697 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004698 var GsmArfcn req_arfcn := 862;
4699 var uint6_t req_bsic := 43;
4700
4701 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4702 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4703
4704 /* Initialize NS/BSSGP side */
4705 f_init_bssgp();
4706 /* Initialize GPRS MS side */
4707 f_init_gprs_ms();
4708 ms := g_ms[0]; /* We only use first MS in this test */
4709
4710 /* Initialize the PCU interface abstraction */
4711 f_init_raw(testcasename(), info_ind);
4712
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004713 /* Make sure we are not affected by full cache from previous tests */
4714 f_pcuvty_flush_neigh_caches();
4715
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004716 /* Establish BSSGP connection to the PCU */
4717 f_bssgp_establish();
4718 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4719
4720 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004721 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 +01004722 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4723 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4724
4725 /* Start NACC from MS side */
4726 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4727 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4728
4729 /* osmo-pcu should now ask for resolution: */
4730 f_ipa_ctrl_wait_link_up();
4731 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4732 int2str(info_ind.lac) & "." &
4733 int2str(info_ind.cell_id) & "." &
4734 int2str(req_arfcn) & "." &
4735 int2str(req_bsic);
4736 /* we receive RAC+CI resolution request and we send incorrectlt formated response */
4737 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
4738
4739 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004740 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004741 /* Make sure it is a Pkt Cell Chg Continue */
4742 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4743 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4744 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004745 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4746 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4747 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4748 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4749 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004750
4751 f_shutdown(__BFILE__, __LINE__, final := true);
4752}
4753
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004754/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
4755testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
4756 var RlcmacDlBlock dl_block;
4757 var PollFnCtx pollctx;
4758 var uint32_t sched_fn;
4759 var GprsMS ms;
4760 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4761 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004762 var GsmArfcn req_arfcn := 862;
4763 var uint6_t req_bsic := 43;
4764 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 */
4765 info_ind.lac),
4766 info_ind.rac),
4767 info_ind.cell_id));
4768 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4769 423),
4770 2),
4771 5));
4772 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
4773 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
4774
4775 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4776 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4777
4778 /* Initialize NS/BSSGP side */
4779 f_init_bssgp();
4780 /* Initialize GPRS MS side */
4781 f_init_gprs_ms();
4782 ms := g_ms[0]; /* We only use first MS in this test */
4783
4784 /* Initialize the PCU interface abstraction */
4785 f_init_raw(testcasename(), info_ind);
4786
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004787 /* Make sure we are not affected by full cache from previous tests */
4788 f_pcuvty_flush_neigh_caches();
4789
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004790 /* Establish BSSGP connection to the PCU */
4791 f_bssgp_establish();
4792 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4793
4794 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004795 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 +01004796 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4797 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4798
4799 /* Start NACC from MS side */
4800 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4801 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4802
4803 /* osmo-pcu should now ask for resolution: */
4804 f_ipa_ctrl_wait_link_up();
4805 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4806 int2str(info_ind.lac) & "." &
4807 int2str(info_ind.cell_id) & "." &
4808 int2str(req_arfcn) & "." &
4809 int2str(req_bsic);
4810 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4811
4812 /* RIM procedure: */
4813 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4814 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4815 tr_RAN_Information_Request_RIM_Container));
4816 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
4817
4818 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004819 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004820 /* Make sure it is a Pkt Cell Chg Continue */
4821 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4822 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4823 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004824 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4825 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4826 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4827 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4828 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004829
4830 f_shutdown(__BFILE__, __LINE__, final := true);
4831}
4832
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004833/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
4834testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
4835 var PollFnCtx pollctx;
4836 var GprsMS ms;
4837 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4838 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4839 var RlcmacDlBlock dl_block;
4840 var uint32_t sched_fn;
4841 var CtrlMessage rx_ctrl;
4842 var GsmArfcn req_arfcn := 862;
4843 var uint6_t req_bsic := 43;
4844
4845 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4846 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4847
4848 /* Initialize NS/BSSGP side */
4849 f_init_bssgp();
4850 /* Initialize GPRS MS side */
4851 f_init_gprs_ms();
4852 ms := g_ms[0]; /* We only use first MS in this test */
4853
4854 /* Initialize the PCU interface abstraction */
4855 f_init_raw(testcasename(), info_ind);
4856
4857 /* Make sure we are not affected by full cache from previous tests */
4858 f_pcuvty_flush_neigh_caches();
4859
4860 /* Establish BSSGP connection to the PCU */
4861 f_bssgp_establish();
4862 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4863
4864 /* Send PACKET RESOURCE REQUEST */
4865 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4866 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4867 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4868
4869 /* Start NACC from MS side */
4870 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4871 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4872
4873 /* osmo-pcu should now ask for resolution: */
4874 f_ipa_ctrl_wait_link_up();
4875 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4876 int2str(info_ind.lac) & "." &
4877 int2str(info_ind.cell_id) & "." &
4878 int2str(req_arfcn) & "." &
4879 int2str(req_bsic);
4880 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4881 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
4882 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4883 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4884 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4885 timer T := 2.0;
4886 T.start;
4887 alt {
4888 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
4889 [] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
4890 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
4891 f_shutdown(__BFILE__, __LINE__);
4892 }
4893 [] T.timeout {
4894 setverdict(pass);
4895 }
4896 }
4897
4898 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004899 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004900
4901 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4902 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4903 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4904 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4905 f_shutdown(__BFILE__, __LINE__);
4906 }
4907 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4908 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4909 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4910 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4911 }
4912
4913 f_shutdown(__BFILE__, __LINE__, final := true);
4914}
4915
4916/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
4917testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
4918 var PollFnCtx pollctx;
4919 var GprsMS ms;
4920 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4921 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4922 var RlcmacDlBlock dl_block;
4923 var uint32_t sched_fn;
4924 var CtrlMessage rx_ctrl;
4925 var GsmArfcn req_arfcn := 862;
4926 var uint6_t req_bsic := 43;
4927
4928 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4929 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4930
4931 /* Initialize NS/BSSGP side */
4932 f_init_bssgp();
4933 /* Initialize GPRS MS side */
4934 f_init_gprs_ms();
4935 ms := g_ms[0]; /* We only use first MS in this test */
4936
4937 /* Initialize the PCU interface abstraction */
4938 f_init_raw(testcasename(), info_ind);
4939
4940 /* Make sure we are not affected by full cache from previous tests */
4941 f_pcuvty_flush_neigh_caches();
4942
4943 /* Establish BSSGP connection to the PCU */
4944 f_bssgp_establish();
4945 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4946
4947 /* Send PACKET RESOURCE REQUEST */
4948 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4949 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4950 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4951
4952 /* Start NACC from MS side */
4953 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4954 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4955
4956 /* osmo-pcu should now ask for resolution: */
4957 f_ipa_ctrl_wait_link_up();
4958 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4959 int2str(info_ind.lac) & "." &
4960 int2str(info_ind.cell_id) & "." &
4961 int2str(req_arfcn) & "." &
4962 int2str(req_bsic);
4963 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4964 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4965 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
4966 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4967 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4968 f_outbound_nacc_rim_tx_resp(info_ind);
4969 timer T := 1.0;
4970 T.start;
4971 alt {
4972 [] RIM.receive {
4973 setverdict(fail, "Received unexpected RIM message");
4974 f_shutdown(__BFILE__, __LINE__);
4975 }
4976 [] T.timeout {
4977 setverdict(pass);
4978 }
4979 }
4980
4981 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004982 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004983
4984 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4985 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4986 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4987 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4988 f_shutdown(__BFILE__, __LINE__);
4989 }
4990 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4991 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4992 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4993 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4994 }
4995
4996 f_shutdown(__BFILE__, __LINE__, final := true);
4997}
4998
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01004999/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
5000testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
5001 var PollFnCtx pollctx;
5002 var GprsMS ms;
5003 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5004 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5005 var RlcmacDlBlock dl_block;
5006 var uint32_t sched_fn;
5007 var CtrlMessage rx_ctrl;
5008 var GsmArfcn req_arfcn := 862;
5009 var uint6_t req_bsic := 43;
5010
5011 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5012 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5013
5014 /* Initialize NS/BSSGP side */
5015 f_init_bssgp();
5016 /* Initialize GPRS MS side */
5017 f_init_gprs_ms();
5018 ms := g_ms[0]; /* We only use first MS in this test */
5019
5020 /* Initialize the PCU interface abstraction */
5021 f_init_raw(testcasename(), info_ind);
5022
5023 /* Make sure we are not affected by full cache from previous tests */
5024 f_pcuvty_flush_neigh_caches();
5025
5026 /* Establish BSSGP connection to the PCU */
5027 f_bssgp_establish();
5028 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5029
5030 /* Send PACKET RESOURCE REQUEST */
5031 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5032 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5033 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5034
5035 /* Start NACC from MS side */
5036 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5037 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5038
5039 /* osmo-pcu should now ask for resolution: */
5040 f_ipa_ctrl_wait_link_up();
5041 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5042 int2str(info_ind.lac) & "." &
5043 int2str(info_ind.cell_id) & "." &
5044 int2str(req_arfcn) & "." &
5045 int2str(req_bsic);
5046 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5047 /* RIM procedure: */
5048 as_outbound_nacc_rim_resolve(info_ind);
5049
5050 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
5051 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5052 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5053
5054 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
5055 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5056
5057 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5058 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5059 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5060 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5061 f_shutdown(__BFILE__, __LINE__);
5062 }
5063 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5064 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5065 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5066 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5067 }
5068}
5069
5070/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
5071testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
5072 var PollFnCtx pollctx;
5073 var GprsMS ms;
5074 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5075 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5076 var RlcmacDlBlock dl_block;
5077 var uint32_t sched_fn;
5078 var CtrlMessage rx_ctrl;
5079 var GsmArfcn req_arfcn := 862;
5080 var uint6_t req_bsic := 43;
5081
5082 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5083 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5084
5085 /* Initialize NS/BSSGP side */
5086 f_init_bssgp();
5087 /* Initialize GPRS MS side */
5088 f_init_gprs_ms();
5089 ms := g_ms[0]; /* We only use first MS in this test */
5090
5091 /* Initialize the PCU interface abstraction */
5092 f_init_raw(testcasename(), info_ind);
5093
5094 /* Make sure we are not affected by full cache from previous tests */
5095 f_pcuvty_flush_neigh_caches();
5096
5097 /* Establish BSSGP connection to the PCU */
5098 f_bssgp_establish();
5099 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5100
5101 /* Send PACKET RESOURCE REQUEST */
5102 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5103 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5104 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5105
5106 /* Start NACC from MS side */
5107 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5108 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5109
5110 /* osmo-pcu should now ask for resolution: */
5111 f_ipa_ctrl_wait_link_up();
5112 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5113 int2str(info_ind.lac) & "." &
5114 int2str(info_ind.cell_id) & "." &
5115 int2str(req_arfcn) & "." &
5116 int2str(req_bsic);
5117 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5118 /* RIM procedure: */
5119 as_outbound_nacc_rim_resolve(info_ind);
5120
5121 /* Announce SI back to MS, continue NACC procedure */
5122 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5123
5124 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5125 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5126
5127 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5128 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5129 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5130 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5131 f_shutdown(__BFILE__, __LINE__);
5132 }
5133 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5134 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5135 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5136 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5137 }
5138}
5139
5140/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5141testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
5142 var PollFnCtx pollctx;
5143 var GprsMS ms;
5144 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5145 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5146 var RlcmacDlBlock dl_block;
5147 var uint32_t sched_fn;
5148 var CtrlMessage rx_ctrl;
5149 var GsmArfcn req_arfcn := 862;
5150 var uint6_t req_bsic := 43;
5151
5152 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5153 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5154
5155 /* Initialize NS/BSSGP side */
5156 f_init_bssgp();
5157 /* Initialize GPRS MS side */
5158 f_init_gprs_ms();
5159 ms := g_ms[0]; /* We only use first MS in this test */
5160
5161 /* Initialize the PCU interface abstraction */
5162 f_init_raw(testcasename(), info_ind);
5163
5164 /* Make sure we are not affected by full cache from previous tests */
5165 f_pcuvty_flush_neigh_caches();
5166
5167 /* Establish BSSGP connection to the PCU */
5168 f_bssgp_establish();
5169 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5170
5171 /* Send PACKET RESOURCE REQUEST */
5172 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5173 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5174 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5175
5176 /* Start NACC from MS side */
5177 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5178 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5179
5180 /* osmo-pcu should now ask for resolution: */
5181 f_ipa_ctrl_wait_link_up();
5182 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5183 int2str(info_ind.lac) & "." &
5184 int2str(info_ind.cell_id) & "." &
5185 int2str(req_arfcn) & "." &
5186 int2str(req_bsic);
5187 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5188 /* RIM procedure: */
5189 as_outbound_nacc_rim_resolve(info_ind);
5190
5191 /* Announce SI back to MS, continue NACC procedure */
5192 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5193
5194 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5195 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5196 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5197 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5198 f_shutdown(__BFILE__, __LINE__);
5199 }
5200 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5201 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5202
5203 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5204 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5205 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5206 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5207 }
5208}
5209
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005210/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5211 * while waiting for CTRL resolution */
5212testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5213 var PollFnCtx pollctx;
5214 var GprsMS ms;
5215 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5216 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5217 var RlcmacDlBlock dl_block;
5218 var uint32_t sched_fn;
5219 var CtrlMessage rx_ctrl;
5220 var GsmArfcn req_arfcn := 862;
5221 var uint6_t req_bsic := 43;
5222
5223 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5224 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5225
5226 /* Initialize NS/BSSGP side */
5227 f_init_bssgp();
5228 /* Initialize GPRS MS side */
5229 f_init_gprs_ms();
5230 ms := g_ms[0]; /* We only use first MS in this test */
5231
5232 /* Initialize the PCU interface abstraction */
5233 f_init_raw(testcasename(), info_ind);
5234
5235 /* Make sure we are not affected by full cache from previous tests */
5236 f_pcuvty_flush_neigh_caches();
5237
5238 /* Establish BSSGP connection to the PCU */
5239 f_bssgp_establish();
5240 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5241
5242 /* Send PACKET RESOURCE REQUEST */
5243 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5244 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5245 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5246
5247 /* Start NACC from MS side */
5248 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5249 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5250
5251 /* osmo-pcu should now ask for resolution: */
5252 f_ipa_ctrl_wait_link_up();
5253 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5254 int2str(info_ind.lac) & "." &
5255 int2str(info_ind.cell_id) & "." &
5256 int2str(req_arfcn) & "." &
5257 int2str(req_bsic);
5258 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5259 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5260 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5261 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5262 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5263 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5264 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
5265 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5266 int2str(info_ind.lac) & "." &
5267 int2str(info_ind.cell_id) & "." &
5268 int2str(req_arfcn + 1) & "." &
5269 int2str(req_bsic + 1);
5270 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5271
5272 /* And finally everything continues as usual with RIN procedure */
5273 as_outbound_nacc_rim_resolve(info_ind);
5274
5275 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005276 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005277
5278 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5279 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5280 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5281 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5282 f_shutdown(__BFILE__, __LINE__);
5283 }
5284 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5285 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5286 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5287 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5288 }
5289
5290 f_shutdown(__BFILE__, __LINE__, final := true);
5291}
5292
5293/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5294 * while waiting for SI resolution */
5295testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5296 var PollFnCtx pollctx;
5297 var GprsMS ms;
5298 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5299 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5300 var RlcmacDlBlock dl_block;
5301 var uint32_t sched_fn;
5302 var CtrlMessage rx_ctrl;
5303 var GsmArfcn req_arfcn := 862;
5304 var uint6_t req_bsic := 43;
5305
5306 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5307 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5308
5309 /* Initialize NS/BSSGP side */
5310 f_init_bssgp();
5311 /* Initialize GPRS MS side */
5312 f_init_gprs_ms();
5313 ms := g_ms[0]; /* We only use first MS in this test */
5314
5315 /* Initialize the PCU interface abstraction */
5316 f_init_raw(testcasename(), info_ind);
5317
5318 /* Make sure we are not affected by full cache from previous tests */
5319 f_pcuvty_flush_neigh_caches();
5320
5321 /* Establish BSSGP connection to the PCU */
5322 f_bssgp_establish();
5323 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5324
5325 /* Send PACKET RESOURCE REQUEST */
5326 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5327 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5328 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5329
5330 /* Start NACC from MS side */
5331 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5332 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5333
5334 /* osmo-pcu should now ask for resolution: */
5335 f_ipa_ctrl_wait_link_up();
5336 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5337 int2str(info_ind.lac) & "." &
5338 int2str(info_ind.cell_id) & "." &
5339 int2str(req_arfcn) & "." &
5340 int2str(req_bsic);
5341 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5342 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5343 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5344 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5345 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5346 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5347 f_outbound_nacc_rim_tx_resp(info_ind);
5348
5349 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
5350 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5351 int2str(info_ind.lac) & "." &
5352 int2str(info_ind.cell_id) & "." &
5353 int2str(req_arfcn + 1) & "." &
5354 int2str(req_bsic + 1);
5355 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5356
5357 /* And finally everything continues as usual with RIN procedure */
5358 as_outbound_nacc_rim_resolve(info_ind);
5359
5360 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005361 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005362
5363 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5364 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5365 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5366 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5367 f_shutdown(__BFILE__, __LINE__);
5368 }
5369 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5370 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5371 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5372 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5373 }
5374
5375 f_shutdown(__BFILE__, __LINE__, final := true);
5376}
5377
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005378/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5379 * while sending Pkt Neigh Data Change */
5380testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5381 var PollFnCtx pollctx;
5382 var GprsMS ms;
5383 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5384 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5385 var RlcmacDlBlock dl_block;
5386 var uint32_t sched_fn;
5387 var CtrlMessage rx_ctrl;
5388 var GsmArfcn req_arfcn := 862;
5389 var uint6_t req_bsic := 43;
5390
5391 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5392 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5393
5394 /* Initialize NS/BSSGP side */
5395 f_init_bssgp();
5396 /* Initialize GPRS MS side */
5397 f_init_gprs_ms();
5398 ms := g_ms[0]; /* We only use first MS in this test */
5399
5400 /* Initialize the PCU interface abstraction */
5401 f_init_raw(testcasename(), info_ind);
5402
5403 /* Make sure we are not affected by full cache from previous tests */
5404 f_pcuvty_flush_neigh_caches();
5405
5406 /* Establish BSSGP connection to the PCU */
5407 f_bssgp_establish();
5408 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5409
5410 /* Send PACKET RESOURCE REQUEST */
5411 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5412 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5413 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5414
5415 /* Start NACC from MS side */
5416 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5417 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5418
5419 /* osmo-pcu should now ask for resolution: */
5420 f_ipa_ctrl_wait_link_up();
5421 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5422 int2str(info_ind.lac) & "." &
5423 int2str(info_ind.cell_id) & "." &
5424 int2str(req_arfcn) & "." &
5425 int2str(req_bsic);
5426 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5427 /* RIM procedure: */
5428 as_outbound_nacc_rim_resolve(info_ind);
5429
5430 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5431 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5432 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5433 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5434
5435 /* It should trigger RAC_CI resolution to start again: */
5436 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5437 int2str(info_ind.lac) & "." &
5438 int2str(info_ind.cell_id) & "." &
5439 int2str(req_arfcn + 1) & "." &
5440 int2str(req_bsic + 1);
5441 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5442 /* RIM procedure: */
5443 as_outbound_nacc_rim_resolve(info_ind);
5444 /* Transmit SI back to MS */
5445 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5446
5447 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5448 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5449 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5450 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5451 f_shutdown(__BFILE__, __LINE__);
5452 }
5453 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5454 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5455 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5456 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5457 }
5458}
5459
5460/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5461testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5462 var PollFnCtx pollctx;
5463 var GprsMS ms;
5464 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5465 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5466 var RlcmacDlBlock dl_block;
5467 var uint32_t sched_fn;
5468 var CtrlMessage rx_ctrl;
5469 var GsmArfcn req_arfcn := 862;
5470 var uint6_t req_bsic := 43;
5471
5472 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5473 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5474
5475 /* Initialize NS/BSSGP side */
5476 f_init_bssgp();
5477 /* Initialize GPRS MS side */
5478 f_init_gprs_ms();
5479 ms := g_ms[0]; /* We only use first MS in this test */
5480
5481 /* Initialize the PCU interface abstraction */
5482 f_init_raw(testcasename(), info_ind);
5483
5484 /* Make sure we are not affected by full cache from previous tests */
5485 f_pcuvty_flush_neigh_caches();
5486
5487 /* Establish BSSGP connection to the PCU */
5488 f_bssgp_establish();
5489 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5490
5491 /* Send PACKET RESOURCE REQUEST */
5492 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5493 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5494 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5495
5496 /* Start NACC from MS side */
5497 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5498 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5499
5500 /* osmo-pcu should now ask for resolution: */
5501 f_ipa_ctrl_wait_link_up();
5502 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5503 int2str(info_ind.lac) & "." &
5504 int2str(info_ind.cell_id) & "." &
5505 int2str(req_arfcn) & "." &
5506 int2str(req_bsic);
5507 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5508 /* RIM procedure: */
5509 as_outbound_nacc_rim_resolve(info_ind);
5510
5511 /* Announce SI back to MS, continue NACC procedure */
5512 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5513
5514 /* trigger a Pkt Cell Change Notif with different tgt cell */
5515 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5516 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5517
5518 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5519 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5520
5521 /* It should trigger RAC_CI resolution to start again: */
5522 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5523 int2str(info_ind.lac) & "." &
5524 int2str(info_ind.cell_id) & "." &
5525 int2str(req_arfcn + 1) & "." &
5526 int2str(req_bsic + 1);
5527 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5528 /* RIM procedure: */
5529 as_outbound_nacc_rim_resolve(info_ind);
5530 /* Transmit SI back to MS */
5531 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5532
5533 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5534 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5535 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5536 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5537 f_shutdown(__BFILE__, __LINE__);
5538 }
5539 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5540 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5541 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5542 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5543 }
5544}
5545
5546/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5547testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5548 var PollFnCtx pollctx;
5549 var GprsMS ms;
5550 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5551 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5552 var RlcmacDlBlock dl_block;
5553 var uint32_t sched_fn;
5554 var CtrlMessage rx_ctrl;
5555 var GsmArfcn req_arfcn := 862;
5556 var uint6_t req_bsic := 43;
5557
5558 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5559 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5560
5561 /* Initialize NS/BSSGP side */
5562 f_init_bssgp();
5563 /* Initialize GPRS MS side */
5564 f_init_gprs_ms();
5565 ms := g_ms[0]; /* We only use first MS in this test */
5566
5567 /* Initialize the PCU interface abstraction */
5568 f_init_raw(testcasename(), info_ind);
5569
5570 /* Make sure we are not affected by full cache from previous tests */
5571 f_pcuvty_flush_neigh_caches();
5572
5573 /* Establish BSSGP connection to the PCU */
5574 f_bssgp_establish();
5575 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5576
5577 /* Send PACKET RESOURCE REQUEST */
5578 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5579 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5580 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5581
5582 /* Start NACC from MS side */
5583 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5584 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5585
5586 /* osmo-pcu should now ask for resolution: */
5587 f_ipa_ctrl_wait_link_up();
5588 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5589 int2str(info_ind.lac) & "." &
5590 int2str(info_ind.cell_id) & "." &
5591 int2str(req_arfcn) & "." &
5592 int2str(req_bsic);
5593 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5594 /* RIM procedure: */
5595 as_outbound_nacc_rim_resolve(info_ind);
5596
5597 /* Announce SI back to MS, continue NACC procedure */
5598 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5599
5600 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5601 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5602 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5603 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5604 f_shutdown(__BFILE__, __LINE__);
5605 }
5606
5607 /* trigger a Pkt Cell Change Notif with different tgt cell */
5608 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5609 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5610
5611 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5612 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5613 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5614 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5615 }
5616 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5617 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
5618
5619 /* It should trigger RAC_CI resolution to start again: */
5620 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5621 int2str(info_ind.lac) & "." &
5622 int2str(info_ind.cell_id) & "." &
5623 int2str(req_arfcn + 1) & "." &
5624 int2str(req_bsic + 1);
5625 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5626 /* RIM procedure: */
5627 as_outbound_nacc_rim_resolve(info_ind);
5628 /* Transmit SI back to MS */
5629 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5630
5631 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5632 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5633 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5634 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5635 f_shutdown(__BFILE__, __LINE__);
5636 }
5637 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5638 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5639 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5640 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5641 }
5642}
5643
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005644/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
5645testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
5646 var PollFnCtx pollctx;
5647 var GprsMS ms;
5648 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5649 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5650 var RlcmacDlBlock dl_block;
5651 var uint32_t sched_fn, dl_fn;
5652 var CtrlMessage rx_ctrl;
5653 var GsmArfcn req_arfcn := 862;
5654 var uint6_t req_bsic := 43;
5655 var octetstring data := f_rnd_octstring(10);
5656
5657 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5658 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5659
5660 /* Initialize NS/BSSGP side */
5661 f_init_bssgp();
5662 /* Initialize GPRS MS side */
5663 f_init_gprs_ms();
5664 ms := g_ms[0]; /* We only use first MS in this test */
5665
5666 /* Initialize the PCU interface abstraction */
5667 f_init_raw(testcasename(), info_ind);
5668
5669 /* Make sure we are not affected by full cache from previous tests */
5670 f_pcuvty_flush_neigh_caches();
5671
5672 /* Establish BSSGP connection to the PCU */
5673 f_bssgp_establish();
5674 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5675
5676 /* Send PACKET RESOURCE REQUEST */
5677 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5678 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5679 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5680
5681 /* Start NACC from MS side */
5682 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5683 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5684
5685 /* osmo-pcu should now ask for resolution: */
5686 f_ipa_ctrl_wait_link_up();
5687 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5688 int2str(info_ind.lac) & "." &
5689 int2str(info_ind.cell_id) & "." &
5690 int2str(req_arfcn) & "." &
5691 int2str(req_bsic);
5692 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5693 /* RIM procedure: */
5694 as_outbound_nacc_rim_resolve(info_ind);
5695
5696 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
5697 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
5698 f_sleep(0.1);
5699 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
5700 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
5701
5702 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
5703 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5704 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
5705 * Data with unassigned DL TBF in line above): */
5706 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5707 /* Continue receiving Pkt Cell Neighbor Data */
5708 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5709
5710 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5711 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5712 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5713 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5714 f_shutdown(__BFILE__, __LINE__);
5715 }
5716 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5717 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5718 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5719 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5720 }
5721
5722 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
5723 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
5724 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
5725 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
5726 f_dl_block_ack_fn(dl_block, dl_fn));
5727}
5728
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005729
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005730function f_do_inbound_nacc(template (value) RIM_Routing_Information tx_src_addr, template RIM_Routing_Information rx_dst_addr)
5731runs on RAW_PCU_Test_CT
5732{
5733 var template (value) RAN_Information_Request_RIM_Container req_cont;
5734 var template (value) PDU_BSSGP bssgp_rim_pdu;
5735 var template PDU_BSSGP bssgp_rim_pdu_expect;
5736 var template RAN_Information_RIM_Container rim_cont_expect;
5737 var RIM_Routing_Address bts_addr;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005738
5739 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005740 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 +01005741 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005742 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 +01005743 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02005744 var template PCUIF_Message si13_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, '0106'O & si13_default, 0, 0, 0, 0, 32767);
5745 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005746 f_sleep(1.0);
5747
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005748 bts_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005749
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005750 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5751 ts_RIM_Sequence_Number(1),
5752 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5753 ts_RIM_Protocol_Version_Number(1),
5754 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5755 omit);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005756 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
5757 tx_src_addr, req_cont);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005758
5759 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5760 tr_RIM_Sequence_Number(1),
5761 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5762 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005763 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 +01005764 omit);
5765
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005766 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(rx_dst_addr,
5767 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005768 rim_cont_expect);
5769 RIM.send(bssgp_rim_pdu);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005770 timer T := 2.0;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005771 T.start;
5772 alt {
5773 [] RIM.receive(bssgp_rim_pdu_expect) { }
5774 [] RIM.receive {
5775 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5776 }
5777 [] T.timeout {
5778 setverdict(fail, "No BSSGP RIM PDU received");
5779 mtc.stop;
5780 }
5781 }
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005782}
5783/* Send a RIM RAN info request to the PCU and verify the response, we expect
5784 * getting the system information back which we have transfered to the PCU via
5785 * PCUIF on startup. */
5786testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
5787 /* Initialize NS/BSSGP side */
5788 f_init_bssgp();
5789
5790 /* Initialize the PCU interface abstraction */
5791 f_init_raw(testcasename());
5792
5793 /* Establish BSSGP connection to the PCU */
5794 f_bssgp_establish();
5795
5796 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
5797 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5798
5799 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5800 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr));
5801
5802 f_shutdown(__BFILE__, __LINE__, final := true);
5803}
5804
5805/* Same as TC_rim_ran_info_req_single_rep, but using an EUTRAN eNodeB ID as
5806 * Routing information, to verify PCU handles that kind of address just fine
5807 */
5808testcase TC_rim_ran_info_req_single_rep_eutran() runs on RAW_PCU_Test_CT {
5809 /* Initialize NS/BSSGP side */
5810 f_init_bssgp();
5811
5812 /* Initialize the PCU interface abstraction */
5813 f_init_raw(testcasename());
5814
5815 /* Establish BSSGP connection to the PCU */
5816 f_bssgp_establish();
5817
5818 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
5819 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_enbid(src_cid, tac := 3, gnbid := '12345678123456'O));
5820
5821 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr),
5822 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005823
5824 f_shutdown(__BFILE__, __LINE__, final := true);
5825}
5826
5827/* Same as above, but in this case we simulate the rare case in which the PCU
5828 * has no system information available. We expect getting a response back but
5829 * with no system information inside. */
5830testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005831 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005832 var PCUIF_Message pcu_msg;
5833 timer T := 2.0;
5834
5835 /* Initialize NS/BSSGP side */
5836 f_init_bssgp();
5837
5838 /* Initialize the PCU interface abstraction */
5839 f_init_raw(testcasename(), info_ind);
5840
5841 /* Establish BSSGP connection to the PCU */
5842 f_bssgp_establish();
5843
5844 /* Clear sysinfo from the PCU */
5845 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);
5846 BTS.send(si1_data_ind);
5847 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);
5848 BTS.send(si3_data_ind);
5849 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);
5850 BTS.send(si16_data_ind);
5851 f_sleep(1.0);
5852
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005853 var RIM_Routing_Address dst_addr;
5854 var RIM_Routing_Address src_addr;
5855 var template (value) RAN_Information_Request_RIM_Container req_cont;
5856 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005857 var template PDU_BSSGP bssgp_rim_pdu_expect;
5858 var template RAN_Information_RIM_Container rim_cont_expect;
5859
5860 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 +01005861 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5862 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005863
5864 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5865 ts_RIM_Sequence_Number(1),
5866 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5867 ts_RIM_Protocol_Version_Number(1),
5868 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5869 omit);
5870 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5871 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5872 req_cont);
5873
5874
5875 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5876 tr_RIM_Sequence_Number(1),
5877 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5878 tr_RIM_Protocol_Version_Number(1),
5879 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
5880 omit);
5881
5882 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5883 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5884 rim_cont_expect);
5885 RIM.send(bssgp_rim_pdu);
5886 T.start;
5887 alt {
5888 [] RIM.receive(bssgp_rim_pdu_expect) { }
5889 [] RIM.receive {
5890 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5891 }
5892 [] T.timeout {
5893 setverdict(fail, "No BSSGP RIM PDU received");
5894 mtc.stop;
5895 }
5896 }
5897
5898 f_shutdown(__BFILE__, __LINE__, final := true);
5899}
5900
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005901control {
5902 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01005903 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005904 execute( TC_ta_ptcch_idle() );
5905 execute( TC_ta_rach_imm_ass() );
Vadim Yanitskiy866f8702021-05-26 14:50:27 +02005906 execute( TC_ta_ul_ack_nack_first_block() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005907 execute( TC_ta_idle_dl_tbf_ass() );
5908 execute( TC_ta_ptcch_ul_multi_tbf() );
5909 execute( TC_cs_lqual_ul_tbf() );
5910 execute( TC_cs_initial_ul() );
5911 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01005912 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01005913 execute( TC_cs_max_dl() );
5914 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01005915 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01005916 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01005917 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01005918 execute( TC_mcs_max_dl() );
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02005919 execute( TC_t3141() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01005920 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02005921 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01005922 execute( TC_x2031_t3191() );
5923 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005924 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01005925 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02005926 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02005927 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02005928 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005929 execute( TC_mo_ping_pong() );
5930 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02005931 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005932 execute( TC_mt_ping_pong() );
5933 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005934 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005935 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07005936 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005937 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01005938 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005939 execute( TC_paging_cs_from_bts() );
5940 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
5941 execute( TC_paging_cs_from_sgsn_sign() );
5942 execute( TC_paging_cs_from_sgsn_ptp() );
5943 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
5944 execute( TC_paging_ps_from_sgsn_sign() );
5945 execute( TC_paging_ps_from_sgsn_ptp() );
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005946 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
5947 execute( TC_paging_cs_multi_ms_imsi() );
5948 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02005949 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
5950 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01005951 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
5952 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005953
5954 /* EGPRS specific test cases */
5955 execute( TC_egprs_pkt_chan_req_signalling() );
5956 execute( TC_egprs_pkt_chan_req_one_phase() );
5957 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07005958 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07005959 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07005960 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02005961
5962 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005963
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01005964 /* Immediate Assignment on AGCH/PCH */
5965 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
5966 execute( TC_pcuif_fh_imm_ass_ul() );
5967 execute( TC_pcuif_fh_imm_ass_dl() );
5968 /* Packet Uplink/Downlink Assignment on PACCH */
5969 execute( TC_pcuif_fh_pkt_ass_ul() );
5970 execute( TC_pcuif_fh_pkt_ass_dl() );
5971 execute( TC_multitrx_multims_alloc() );
5972 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
5973 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
5974 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
5975
Pau Espin Pedrole1303052020-11-16 11:13:51 +01005976 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07005977
5978 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005979 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005980 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005981 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005982 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005983 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005984 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005985 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005986 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005987 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
5988 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005989 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
5990 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
5991 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005992 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
5993 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005994 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
5995 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
5996 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005997 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005998
5999 execute( TC_rim_ran_info_req_single_rep() );
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006000 execute( TC_rim_ran_info_req_single_rep_eutran() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006001 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006002}
6003
Harald Weltea419df22019-03-21 17:23:04 +01006004}