blob: 52d62713522f40fb2e32dba86f6fbd18479d3027 [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
499/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
500 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
501 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
502 * no active TBF exists at the moment of establishment (idle mode). */
503testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100504 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200505
506 /* Initialize NS/BSSGP side */
507 f_init_bssgp();
508
509 /* Initialize the PCU interface abstraction */
510 f_init_raw(testcasename());
511
512 /* Establish BSSGP connection to the PCU */
513 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100514 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200515
516 /* SGSN sends some DL data, PCU will initiate Packet Downlink
517 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100518 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
519 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200520
521 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
522 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
523 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100524 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700525 setverdict(fail, "Timing Advance value doesn't match");
526 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700527
528 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200529}
530
531/* Verify that the PCU generates valid PTCCH/D messages
532 * while neither Uplink nor Downlink TBF is established. */
533testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100534 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200535 timer T;
536
537 /* Initialize the PCU interface abstraction */
538 f_init_raw(testcasename());
539
540 /* Sent an RTS.req for PTCCH/D */
541 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
542 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
543 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100544
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200545 T.start(5.0);
546 alt {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100547 /* Make sure the message is encoded correctly
548 * TODO: do we expect all TA values to be equal '1111111'B? */
549 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg);
550
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200551 [] BTS.receive(PCUIF_Message:?) { repeat; }
552 [] T.timeout {
553 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700554 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200555 }
556 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100557 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700558
559 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200560}
561
562/* Test of correct Timing Advance during an active Uplink TBF.
563 *
564 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
565 * are not continuous and there can be long time gaps between them. This happens
566 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
567 * significantly change between such rare Uplink transmissions, so GPRS introduces
568 * additional mechanisms to control Timing Advance, and thus reduce interference
569 * between neighboring TDMA time-slots.
570 *
571 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
572 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
573 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
574 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
575 * among with the initial Timing Advance value. And here PTCCH comes to play.
576 *
577 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
578 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
579 * continuously. To ensure continuous measurements of the signal propagation
580 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
581 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
582 *
583 * The purpose of this test case is to verify the assignment of Timing Advance
584 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
585 * first establishes several Uplink TBFs, but does not transmit any Uplink
586 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
587 * indications to the PCU, checking the correctness of two received PTCCH/D
588 * messages (period of PTCCH/D is two multi-frames).
589 */
590
591/* List of ToA values for Access Bursts to be sent on PTCCH/U,
592 * each ToA (Timing of Arrival) value is in units of 1/4 of
593 * a symbol (i.e. 1 symbol is 4 QTA units). */
594type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
595const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
596 0, 0, 0, 0,
597 0, 0, 0, 0,
598 0, 0, 0, 0,
599 0, 0, 0, 0
600};
601
602private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
603 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
604runs on RAW_PCU_Test_CT {
605 var RAW_PCU_Event event;
606 var integer ss;
607
608 /* Send Access Bursts on PTCCH/U for every TA Index */
609 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
610 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700611 if (ss < 0) { /* Shall not happen */
612 f_shutdown(__BFILE__, __LINE__);
613 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200614
615 log("Sending an Access Burst on PTCCH/U",
616 ", sub-slot=", ss, " (TAI)",
617 ", fn=", event.data.tdma_fn,
618 ", ToA=", toa_map[ss], " (QTA)");
619 /* TODO: do we care about RA and burst format? */
620 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
621 ra := oct2int('3A'O),
622 is_11bit := 0,
623 burst_type := BURST_TYPE_0,
624 fn := event.data.tdma_fn,
625 arfcn := 871,
626 qta := toa_map[ss],
627 sapi := PCU_IF_SAPI_PTCCH));
628 repeat;
629 }
630}
631
632private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
633 template PTCCHDownlinkMsg t_ta_msg)
634runs on RAW_PCU_Test_CT {
635 var PTCCHDownlinkMsg ta_msg;
636 var PCUIF_Message pcu_msg;
637 timer T;
638
639 /* First, send an RTS.req for the upcoming PTCCH/D block */
640 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
641 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
642 arfcn := 871, block_nr := 0));
643 T.start(2.0);
644 alt {
645 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
646 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
647 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
648 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
649 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
650 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
651 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
652 log("Rx PTCCH/D message: ", ta_msg);
653
654 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700655 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200656 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
657 }
658 }
659 [] BTS.receive { repeat; }
660 [] T.timeout {
661 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200662 }
663 }
664}
665
666testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
667 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200668 var GprsMS ms;
669
670 /* Initialize GPRS MS side */
671 f_init_gprs_ms();
672 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200673
674 /* Initialize the PCU interface abstraction */
675 f_init_raw(testcasename());
676
677 /* Enable forwarding of PTCCH/U TDMA events to us */
678 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
679
680 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
681 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200682 /* Establish an Uplink TBF */
683 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200684
685 /* We expect incremental TFI/USF assignment (dynamic allocation) */
686 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200687 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200688 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700689 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200690 }
691
692 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200693 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200694 setverdict(fail, "Failed to match Timing Advance Index for #", i);
695 /* Keep going, the current OsmoPCU does not assign TA Index */
696 }
697 }
698
699 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
700 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
701 for (var integer i := 0; i < 7; i := i + 1) {
702 /* ToA in units of 1/4 of a symbol */
703 toa_map[i] := (i + 1) * 7 * 4;
704 }
705
706 /* Now we have all 7 TBFs established in one-phase access mode,
707 * however we will not be sending any data on them. Instead, we
708 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
709 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
710 *
711 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
712 * time-slots, so at the moment of scheduling a PTCCH/D block
713 * the PCU has odd number of PTCCH/U Access Bursts received. */
714 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
715 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
716 /* Other values are not known (yet) */
717 tai3_ta := ?));
718 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
719 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
720 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
721 /* Other values are out of our interest */
722 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700723
724 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200725}
726
727/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
728 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
729 *
730 * NOTE: the ranges are intentionally overlapping because OsmoPCU
731 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
732private template integer CS1_lqual_dB_range := (-infinity .. 6);
733private template integer CS2_lqual_dB_range := (5 .. 8);
734private template integer CS3_lqual_dB_range := (7 .. 13);
735private template integer CS4_lqual_dB_range := (12 .. infinity);
736
737testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200738 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200739 var GprsMS ms;
740 var uint32_t unused_fn, sched_fn;
741 var uint4_t cv;
742
743 /* Initialize GPRS MS side */
744 f_init_gprs_ms();
745 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200746
747 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100748 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200749
750 f_pcuvty_set_allowed_cs_mcs();
751 f_pcuvty_set_link_quality_ranges();
752
753 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200754 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200755
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200756
757 /* The actual / old link quality values. We need to keep track of the old
758 * (basically previous) link quality value, because OsmoPCU actually
759 * changes the coding scheme if not only the actual, but also the old
760 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200761 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200762 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200763
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200764 /* Send one UL block (with TLLI since we are in One-Phase Access
765 contention resoultion) and make sure it is ACKED fine. */
766 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
767 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200768 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 +0200769 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
770 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
771 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200772
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200773 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
774 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200775 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200776 lqual_old := ms.lqual_cb;
777 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200778
779 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200780 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
781 if (i > g_bs_cv_max) {
782 cv := 15;
783 } else {
784 cv := i;
785 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200786
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200787 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
788
789 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
790 f_rx_rlcmac_dl_block(dl_block, unused_fn);
791 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
792 continue;
793 }
794 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
795 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
796 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
797 f_shutdown(__BFILE__, __LINE__);
798 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200799
800 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
801 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
802
803 /* Match the received Channel Coding Command. Since we are increasing
804 * the link quality value on each iteration and not decreasing, there
805 * is no need to check the both old and current link quality values. */
806 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200807 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200808 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
809 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
810 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
811 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
812 }
813
814 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
815 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200816 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200817 }
818 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700819
820 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200821}
822
823/* Test the max UL CS set by VTY works fine */
824testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200825 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200826 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200827 var uint32_t unused_fn, sched_fn;
828 var GprsMS ms;
829
830 /* Initialize GPRS MS side */
831 f_init_gprs_ms();
832 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200833
834 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100835 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200836
837 /* Set initial UL CS to 3 */
838 g_cs_initial_ul := 3;
839 f_pcuvty_set_allowed_cs_mcs();
840 f_pcuvty_set_link_quality_ranges();
841
842 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200843 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200844
845 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200846 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200847
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200848 /* Send one UL block (with TLLI since we are in One-Phase Access
849 contention resoultion) and make sure it is ACKED fine. */
850 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
851 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200852 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 +0200853 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
854 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
855 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200856
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200857 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
858 while (true) {
859 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
860 f_rx_rlcmac_dl_block(dl_block, unused_fn);
861 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
862 continue;
863 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200864
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200865 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
866 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
867 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
868 f_shutdown(__BFILE__, __LINE__);
869 break;
870 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200871
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200872 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200873 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200874 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200875 if (last_ch_coding != CH_CODING_CS3) {
876 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200877 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200878 }
879
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200880 /* Remaining UL blocks are used to make sure regardless of initial
881 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200882 /* 0 dB, make sure we downgrade CS */
883 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200884 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200885 f_ms_tx_ul_data_block_multi(ms, 5);
886 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
887 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
888 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200889
890 if (last_ch_coding != CH_CODING_CS1) {
891 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200892 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200893 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700894
895 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200896}
897
898/* Test the max UL CS set by VTY works fine */
899testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200900 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200901 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200902 var uint32_t unused_fn, sched_fn;
903 var GprsMS ms;
904
905 /* Initialize GPRS MS side */
906 f_init_gprs_ms();
907 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200908
909 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100910 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200911
912 /* Set maximum allowed UL CS to 3 */
913 g_cs_max_ul := 3;
914 f_pcuvty_set_allowed_cs_mcs();
915 f_pcuvty_set_link_quality_ranges();
916
917 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200918 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200919
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200920 /* Send one UL block (with TLLI since we are in One-Phase Access
921 contention resoultion) and make sure it is ACKED fine. */
922 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
923 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200924 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 +0200925 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
926 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
927 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200928
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200929 ms.lqual_cb := 40*10; /* 40 dB */
930 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200931
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200932 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
933 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200934
935 if (last_ch_coding != CH_CODING_CS3) {
936 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200937 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200938 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700939
940 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200941}
942
Pau Espin Pedrol75122592020-11-03 15:22:59 +0100943/* Test the initial DL CS set by VTY works fine */
944testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
945 var octetstring data := f_rnd_octstring(10);
946 var CodingScheme exp_dl_cs_mcs;
947 var RlcmacDlBlock dl_block;
948 var uint32_t poll_fn;
949 var GprsMS ms;
950
951 /* Initialize NS/BSSGP side */
952 f_init_bssgp();
953 /* Initialize GPRS MS side */
954 f_init_gprs_ms();
955 ms := g_ms[0]; /* We only use first MS in this test */
956
957 /* Initialize the PCU interface abstraction */
958 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
959
960 /* Set initial allowed DL CS to 3 */
961 g_cs_initial_dl := 3;
962 exp_dl_cs_mcs := CS_3;
963 /* Set maximum allowed UL CS to 4 */
964 g_cs_max_dl := 4;
965 f_pcuvty_set_allowed_cs_mcs();
966 f_pcuvty_set_link_quality_ranges();
967
968 /* Establish BSSGP connection to the PCU */
969 f_bssgp_establish();
970 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
971
972 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
973 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
974 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
975
976 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
977 f_sleep(X2002);
978 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
979
980 /* ACK the DL block */
981 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
982 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
983 f_dl_block_ack_fn(dl_block, poll_fn));
984
985 f_shutdown(__BFILE__, __LINE__, final := true);
986}
987
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100988/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100989function f_dl_data_exp_cs(template (present) CodingScheme exp_final_cs := ?, template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +0100990 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100991 var RlcmacDlBlock prev_dl_block, dl_block;
992 var uint32_t ack_fn;
993 var uint32_t fn;
994 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +0100995 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100996 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +0100997 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
998 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100999 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001000
1001 if (using_egprs) {
1002 exp_tmp_csmcs := mcs_egprs_any;
1003 bsn_mod := 2048;
1004 } else {
1005 exp_tmp_csmcs := cs_gprs_any;
1006 bsn_mod := 128;
1007 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001008
1009 /* Establish BSSGP connection to the PCU */
1010 f_bssgp_establish();
1011
1012 ms := g_ms[0]; /* We only use first MS in this test */
1013 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1014
1015 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001016 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001017 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1018
1019 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1020 f_sleep(X2002);
1021
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001022 for (var integer i := 0; i < 800; i := i + 1) {
1023 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001024 f_rx_rlcmac_dl_block(dl_block, fn);
1025
1026 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
1027 /* No more data to receive, done */
1028 break;
1029 }
1030
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001031 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001032
1033 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001034 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001035
1036 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001037 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001038 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001039 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, using_egprs), ack_fn);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001040 if (tx_data_remain != 0) {
1041 /* Submit more data from time to time to keep the TBF ongoing */
1042 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1043 tx_data_remain := tx_data_remain - 1;
1044 }
1045 }
1046 prev_dl_block := dl_block;
1047 }
1048
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001049 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1050 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001051
1052
1053 f_shutdown(__BFILE__, __LINE__, final := true);
1054}
1055
1056/* Verify DL CS above "cs max" set by VTY is never used */
1057testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1058 /* Initialize NS/BSSGP side */
1059 f_init_bssgp();
1060 /* Initialize GPRS MS side */
1061 f_init_gprs_ms();
1062
1063 /* Initialize the PCU interface abstraction */
1064 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1065
1066 /* Set maximum allowed DL CS to 3 */
1067 g_cs_initial_dl := 1;
1068 g_cs_max_dl := 3;
1069 f_pcuvty_set_allowed_cs_mcs();
1070 f_pcuvty_set_link_quality_ranges();
1071
1072 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1073}
1074
1075/* Check DL CS4 is used in good link conditions if allowed by config */
1076testcase TC_dl_cs1_to_cs4() runs on RAW_PCU_Test_CT {
1077 /* Initialize NS/BSSGP side */
1078 f_init_bssgp();
1079 /* Initialize GPRS MS side */
1080 f_init_gprs_ms();
1081
1082 /* Initialize the PCU interface abstraction */
1083 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1084
1085 /* Set initial DL CS to 1 & maximum allowed DL CS to 4 */
1086 g_cs_initial_dl := 1;
1087 g_cs_max_dl := 4;
1088 f_pcuvty_set_allowed_cs_mcs();
1089 f_pcuvty_set_link_quality_ranges();
1090
1091 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1092}
1093
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001094/* Test the initial UL MCS set by VTY works fine */
1095testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1096 var RlcmacDlBlock dl_block;
1097 var PollFnCtx pollctx;
1098 var EgprsChCodingCommand last_ch_coding;
1099 var uint32_t unused_fn, sched_fn;
1100 var GprsMS ms;
1101 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001102
1103 /* Initialize GPRS MS side */
1104 f_init_gprs_ms();
1105 ms := g_ms[0]; /* We only use first MS in this test */
1106
1107 /* Initialize the PCU interface abstraction */
1108 f_init_raw(testcasename());
1109
1110 /* Set initial UL MCS to 3 */
1111 g_mcs_initial_ul := 3;
1112 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1113 f_pcuvty_set_allowed_cs_mcs();
1114 f_pcuvty_set_link_quality_ranges();
1115
1116 /* Take lqual (dB->cB) so that we stay in that MCS */
1117 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1118
1119 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001120 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_egprs_def));
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001121
1122 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1123 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1124 f_shutdown(__BFILE__, __LINE__);
1125 }
1126
1127 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1128 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1129
1130 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1131 while (true) {
1132 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1133 f_rx_rlcmac_dl_block(dl_block, unused_fn);
1134 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1135 continue;
1136 }
1137
1138 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1139 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1140 f_shutdown(__BFILE__, __LINE__);
1141 break;
1142 }
1143
1144 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1145 break;
1146 }
1147 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1148 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1149 f_shutdown(__BFILE__, __LINE__);
1150 }
1151
1152 /* Remaining UL blocks are used to make sure regardless of initial
1153 * lqual, we can go lower at any time
1154 * 0 dB, make sure we downgrade MCS */
1155 ms.lqual_cb := 0;
1156 /* 5 UL blocks, check we are in same initial MCS: */
1157 f_ms_tx_ul_data_block_multi(ms, 5);
1158 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1159 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1160 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1161
1162 if (last_ch_coding != CH_CODING_MCS1) {
1163 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1164 f_shutdown(__BFILE__, __LINE__);
1165 }
1166
1167 f_shutdown(__BFILE__, __LINE__, final := true);
1168}
1169
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001170/* Test the maximum UL MCS set by VTY works fine */
1171testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1172 var RlcmacDlBlock dl_block;
1173 var EgprsChCodingCommand last_ch_coding;
1174 var PollFnCtx pollctx;
1175 var uint32_t unused_fn, sched_fn;
1176 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001177
1178 /* Initialize GPRS MS side */
1179 f_init_gprs_ms();
1180 ms := g_ms[0]; /* We only use first MS in this test */
1181
1182 /* Initialize the PCU interface abstraction */
1183 f_init_raw(testcasename());
1184
1185 /* Set maximum allowed UL MCS to 5 */
1186 g_mcs_max_ul := 5;
1187 f_pcuvty_set_allowed_cs_mcs();
1188 f_pcuvty_set_link_quality_ranges();
1189
1190 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001191 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_egprs_def));
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001192 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1193 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1194
1195 ms.lqual_cb := 40*10; /* 40 dB */
1196 f_ms_tx_ul_data_block_multi(ms, 16);
1197
1198 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1199 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1200
1201 if (last_ch_coding != CH_CODING_MCS5) {
1202 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1203 f_shutdown(__BFILE__, __LINE__);
1204 }
1205
1206 f_shutdown(__BFILE__, __LINE__, final := true);
1207}
1208
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001209/* Test the initial DL CS set by VTY works fine */
1210testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1211 var octetstring data := f_rnd_octstring(10);
1212 var CodingScheme exp_dl_cs_mcs;
1213 var RlcmacDlBlock dl_block;
1214 var uint32_t poll_fn;
1215 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001216
1217 /* Initialize NS/BSSGP side */
1218 f_init_bssgp();
1219 /* Initialize GPRS MS side */
1220 f_init_gprs_ms();
1221 ms := g_ms[0]; /* We only use first MS in this test */
1222
1223 /* Initialize the PCU interface abstraction */
1224 f_init_raw(testcasename());
1225
1226 /* Set initial allowed DL MCS to 3 */
1227 g_mcs_initial_dl := 3;
1228 exp_dl_cs_mcs := MCS_3;
1229 /* Set maximum allowed DL MCS to 4 */
1230 g_mcs_max_dl := 4;
1231 f_pcuvty_set_allowed_cs_mcs();
1232 f_pcuvty_set_link_quality_ranges();
1233
1234 /* Establish BSSGP connection to the PCU */
1235 f_bssgp_establish();
1236 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1237
1238 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001239 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001240 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1241
1242 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1243 f_sleep(X2002);
1244 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1245
1246 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001247 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1248 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, ischosen(dl_block.data_egprs)),
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001249 f_dl_block_ack_fn(dl_block, poll_fn));
1250
1251 f_shutdown(__BFILE__, __LINE__, final := true);
1252}
1253
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001254/* Verify DL MCS above "mcs max" set by VTY is never used */
1255testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1256 /* Initialize NS/BSSGP side */
1257 f_init_bssgp();
1258 /* Initialize GPRS MS side */
1259 f_init_gprs_ms();
1260
1261 /* Initialize the PCU interface abstraction */
1262 f_init_raw(testcasename());
1263
1264 /* Set maximum allowed DL CS to 3 */
1265 g_mcs_initial_dl := 1;
1266 g_mcs_max_dl := 3;
1267 f_pcuvty_set_allowed_cs_mcs();
1268 f_pcuvty_set_link_quality_ranges();
1269
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001270 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_mcs_max_dl, true), bssgp_ms_racap_egprs_def);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001271}
1272
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001273/* Verify PCU drops TBF after some time of inactivity. */
1274testcase TC_t3169() runs on RAW_PCU_Test_CT {
1275 var PCUIF_info_ind info_ind;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001276 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001277 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001278 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001279
1280 /* Initialize NS/BSSGP side */
1281 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001282 /* Initialize GPRS MS side */
1283 f_init_gprs_ms();
1284 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001285
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001286 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001287 /* Set timer to 1 sec (default 5) to speedup test: */
1288 info_ind.t3169 := 1;
1289
1290 /* Initialize the PCU interface abstraction */
1291 f_init_raw(testcasename(), info_ind);
1292
1293 /* Establish BSSGP connection to the PCU */
1294 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001295 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001296
1297 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001298 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001299
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02001300 /* Send one UL block (with TLLI since we are in One-Phase Access
1301 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02001302 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001303 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001304 /* UL block should NOT be received in SGSN, since we didn't get CV=0 */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001305
1306 /* Wait until T3169 fires (plus 1 extra sec to make sure) */
1307 f_sleep(int2float(info_ind.t3169) + 1.0);
1308
1309 /* Send an UL block once again, the TBF should be gone by now so no ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001310 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 0)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001311 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001312
1313 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001314}
1315
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001316/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1317 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1318 * T3169. See OS#5033 */
1319testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1320 var PCUIF_info_ind info_ind;
1321 var template (value) TsTrxBtsNum nr;
1322 var BTS_PDTCH_Block data_msg;
1323 var GprsMS ms;
1324 var uint3_t rx_usf;
1325 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1326 var integer n3101 := 0;
1327 timer T_3169 := 1.0;
1328
1329 /* Initialize NS/BSSGP side */
1330 f_init_bssgp();
1331 /* Initialize GPRS MS side */
1332 f_init_gprs_ms();
1333 ms := g_ms[0]; /* We only use first MS in this test */
1334
1335 /* Initialize the PCU interface abstraction */
1336 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1337 info_ind.n3101 := N3101_MAX;
1338 info_ind.t3169 := 1;
1339 f_init_raw(testcasename(), info_ind);
1340
1341 /* Establish BSSGP connection to the PCU */
1342 f_bssgp_establish();
1343 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1344
1345 /* Establish UL TBF */
1346 f_ms_establish_ul_tbf(ms);
1347
1348 /* Now we wait for PCU to transmit our USF */
1349 nr := ts_TsTrxBtsNum;
1350 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1351 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1352 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1353 block_nr := nr.blk_nr));
1354
1355 alt {
1356 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1357 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1358 ?)) -> value data_msg {
1359 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1360 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1361 f_shutdown(__BFILE__, __LINE__);
1362 }
1363
1364 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1365 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1366 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1367 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001368 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1369 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001370 f_shutdown(__BFILE__, __LINE__);
1371 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001372 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001373 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1374 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1375 if (not T_3169.running) {
1376 log("T3169 started");
1377 T_3169.start;
1378 }
1379 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1380 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1381 f_shutdown(__BFILE__, __LINE__);
1382 } else {
1383 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1384 }
1385 nr := ts_TsTrxBtsNum;
1386 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1387 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1388 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1389 block_nr := nr.blk_nr));
1390 repeat;
1391 }
1392 [] T_3169.timeout {
1393 log("T_3169 expired");
1394 /* Done in alt */
1395 }
1396 [] BTS.receive {
1397 setverdict(fail, "Unexpected BTS message");
1398 f_shutdown(__BFILE__, __LINE__);
1399 }
1400 }
1401
1402 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1403 /* USFs as per previous TBF since they were freed at expiration time: */
1404 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1405 var uint5_t old_tfi := ms.ul_tbf.tfi;
1406 f_ms_establish_ul_tbf(ms);
1407 if (old_tfi != ms.ul_tbf.tfi) {
1408 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1409 f_shutdown(__BFILE__, __LINE__);
1410 }
1411 for (var integer i := 0; i < 8; i := i +1) {
1412 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1413 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1414 f_shutdown(__BFILE__, __LINE__);
1415 }
1416 }
1417
1418 f_shutdown(__BFILE__, __LINE__, final := true);
1419}
1420
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001421
1422/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1423 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1424 the final UL ACK sent at us. */
1425testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1426 var PCUIF_info_ind info_ind;
1427 var BTS_PDTCH_Block data_msg;
1428 var RlcmacDlBlock dl_block;
1429 var uint32_t sched_fn;
1430 var template (value) TsTrxBtsNum nr;
1431 var template RlcmacDlBlock exp_ul_ack;
1432 var template UlAckNackGprs exp_ul_ack_sub;
1433 var GprsMS ms;
1434 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1435 var integer N3103 := 0;
1436 timer T_3169 := 1.0;
1437
1438 /* Initialize GPRS MS side */
1439 f_init_gprs_ms();
1440 ms := g_ms[0]; /* We only use first MS in this test */
1441
1442 /* Initialize the PCU interface abstraction */
1443 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1444 info_ind.n3103 := N3103_MAX;
1445 info_ind.t3169 := 1;
1446 f_init_raw(testcasename(), info_ind);
1447
1448 /* Establish an Uplink TBF */
1449 f_ms_establish_ul_tbf(ms);
1450
1451 f_ms_tx_ul_data_block_multi(ms, 5);
1452 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1453 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1454
1455 nr := ts_TsTrxBtsNum;
1456 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1457 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1458 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1459 block_nr := nr.blk_nr));
1460 alt {
1461 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1462 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1463 exp_ul_ack)) -> value data_msg {
1464 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1465 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1466 f_shutdown(__BFILE__, __LINE__);
1467 }
1468
1469 nr := ts_TsTrxBtsNum;
1470 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1471 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1472 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1473 block_nr := nr.blk_nr));
1474 N3103 := N3103 + 1;
1475 if (N3103 == N3103_MAX) {
1476 /* At this point in time (N3103_MAX reached), PCU is
1477 * moving the TBF to RELEASE state so no data/ctrl for
1478 * it is tx'ed, hence the dummy blocks: */
1479 T_3169.start;
1480 }
1481 repeat;
1482 }
1483 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1484 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1485 exp_ul_ack)) -> value data_msg {
1486 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1487 f_shutdown(__BFILE__, __LINE__);
1488 }
1489 [] as_ms_rx_ignore_dummy(ms, nr);
1490 [T_3169.running] T_3169.timeout {
1491 log("T_3169 timeout");
1492 /* Done in alt, wait for pending RTS initiated previously in
1493 * above case before continuing (expect /* Dummy block): */
1494 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1495 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1496 tr_RLCMAC_DUMMY_CTRL));
1497 }
1498 [] BTS.receive {
1499 setverdict(fail, "Unexpected BTS message");
1500 f_shutdown(__BFILE__, __LINE__);
1501 }
1502 }
1503
1504 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1505 * USFs as per previous TBF since they were freed at expiration time: */
1506 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1507 var uint5_t old_tfi := ms.ul_tbf.tfi;
1508 f_ms_establish_ul_tbf(ms);
1509 if (old_tfi != ms.ul_tbf.tfi) {
1510 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1511 f_shutdown(__BFILE__, __LINE__);
1512 }
1513 for (var integer i := 0; i < 8; i := i +1) {
1514 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1515 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1516 f_shutdown(__BFILE__, __LINE__);
1517 }
1518 }
1519
1520 f_shutdown(__BFILE__, __LINE__, final := true);
1521}
1522
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001523/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1524 * point the TBF is no longer available. In order to get to start of T3191, we
1525 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1526 * until TBF release procedure starts after draining DL queue. */
1527testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1528 var PCUIF_info_ind info_ind;
1529 var RlcmacDlBlock dl_block;
1530 var octetstring data1 := f_rnd_octstring(200);
1531 var octetstring data2 := f_rnd_octstring(10);
1532 var uint32_t dl_fn;
1533 var template (value) TsTrxBtsNum nr;
1534 var BTS_PDTCH_Block data_msg;
1535 var GprsMS ms;
1536
1537 /* Initialize NS/BSSGP side */
1538 f_init_bssgp();
1539 /* Initialize GPRS MS side */
1540 f_init_gprs_ms();
1541 ms := g_ms[0]; /* We only use first MS in this test */
1542
1543 /* Initialize the PCU interface abstraction */
1544 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1545 /* Set timer to 1 sec (default 5) to speedup test: */
1546 info_ind.t3191 := 1;
1547 f_init_raw(testcasename(), info_ind);
1548
1549 /* Establish BSSGP connection to the PCU */
1550 f_bssgp_establish();
1551 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1552
1553 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1554 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1555 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1556
1557 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1558 f_sleep(X2002);
1559
1560 while (true) {
1561 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1562
1563 /* Keep Ack/Nack description updated (except for last BSN) */
1564 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1565
1566 if (f_dl_block_rrbp_valid(dl_block)) {
1567 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1568 f_dl_block_ack_fn(dl_block, dl_fn));
1569 break;
1570 }
1571 }
1572
1573 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1574 nr := ts_TsTrxBtsNum;
1575 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1576 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1577 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1578 block_nr := nr.blk_nr));
1579 alt {
1580 [] as_ms_rx_ignore_dummy(ms, nr);
1581 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1582 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1583 ?)) -> value data_msg {
1584 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1585 log("Received FINAL_ACK");
1586 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1587 break;
1588 }
1589 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1590 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1591 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1592 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1593 }
1594 nr := ts_TsTrxBtsNum;
1595 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1596 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1597 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1598 block_nr := nr.blk_nr));
1599 repeat;
1600 }
1601 [] BTS.receive {
1602 setverdict(fail, "Unexpected BTS message");
1603 f_shutdown(__BFILE__, __LINE__);
1604 }
1605 }
1606
1607 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1608 to time out. We simply sleep instead of requesting blocks because
1609 otherwise retransmissions would keep restarting the timer. */
1610 f_sleep(int2float(info_ind.t3191));
1611
1612 /* The TBF should be freed now, so new data should trigger an Assignment: */
1613 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1614 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1615
1616 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1617 f_sleep(X2002);
1618 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1619 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1620 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1621 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1622 f_dl_block_ack_fn(dl_block, dl_fn));
1623
1624 f_shutdown(__BFILE__, __LINE__, final := true);
1625}
1626
1627/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1628testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1629 var PCUIF_info_ind info_ind;
1630 var RlcmacDlBlock dl_block;
1631 var octetstring data1 := f_rnd_octstring(1400);
1632 var octetstring data2 := f_rnd_octstring(10);
1633 var uint32_t dl_fn;
1634 var GprsMS ms;
1635
1636 /* Initialize NS/BSSGP side */
1637 f_init_bssgp();
1638 /* Initialize GPRS MS side */
1639 f_init_gprs_ms();
1640 ms := g_ms[0]; /* We only use first MS in this test */
1641
1642 /* Initialize the PCU interface abstraction */
1643 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1644 /* Set timer to 1 sec (default 5) to speedup test: */
1645 info_ind.t3191 := 1;
1646 f_init_raw(testcasename(), info_ind);
1647
1648 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1649
1650 /* Establish BSSGP connection to the PCU */
1651 f_bssgp_establish();
1652 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1653
1654 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1655 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1656 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1657
1658 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1659 f_sleep(X2002);
1660
1661 /* Send enough DL data to at least be able to DL ACK once (excl the
1662 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1663 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1664 while (true) {
1665 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1666
1667 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1668 log("Received FINAL_ACK");
1669 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1670 break;
1671 }
1672
1673 /* Keep Ack/Nack description updated (except for last BSN) */
1674 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1675
1676 if (f_dl_block_rrbp_valid(dl_block)) {
1677 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1678 f_dl_block_ack_fn(dl_block, dl_fn));
1679 }
1680 }
1681
1682 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1683 to time out. We simply sleep instead of requesting blocks because
1684 otherwise retransmissions would keep restarting the timer. */
1685 f_sleep(int2float(info_ind.t3191));
1686
1687 /* The TBF should be freed now, so new data should trigger an Assignment: */
1688 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1689 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1690
1691 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1692 f_sleep(X2002);
1693 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1694 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1695 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1696 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1697 f_dl_block_ack_fn(dl_block, dl_fn));
1698
1699 f_shutdown(__BFILE__, __LINE__, final := true);
1700}
1701
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001702/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1703 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1704 * T3193) after DL TBF release */
1705testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001706 var RlcmacDlBlock dl_block;
1707 var octetstring data := f_rnd_octstring(10);
1708 var boolean ok;
1709 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001710 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001711 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001712 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1713
1714 /* Initialize NS/BSSGP side */
1715 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001716 /* Initialize GPRS MS side */
1717 f_init_gprs_ms();
1718 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001719
1720 /* Initialize the PCU interface abstraction */
1721 f_init_raw(testcasename());
1722
1723 /* Establish BSSGP connection to the PCU */
1724 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001725 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001726
1727 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001728 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1729 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001730
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001731 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1732 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001733 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001734
1735 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001736 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1737 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1738 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001739
1740 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001741 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001742 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001743 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001744 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001745
1746 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001747
1748 /* 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 +07001749 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001750 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1751 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1752 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001753
1754 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001755}
1756
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001757/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1758 freed and no longer available. Trigger it by sending DL blocks and never DL
1759 ACKing the data (which are requested through RRBP) */
1760testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1761 var PCUIF_info_ind info_ind;
1762 var RlcmacDlBlock dl_block;
1763 var octetstring data1 := f_rnd_octstring(1000);
1764 var octetstring data2 := f_rnd_octstring(10);
1765 var uint32_t dl_fn;
1766 var template (value) TsTrxBtsNum nr;
1767 var BTS_PDTCH_Block data_msg;
1768 var GprsMS ms;
1769 const integer N3105_MAX := 2;
1770 var integer N3105 := 0;
1771 timer T_3195 := 1.0;
1772 var integer num_poll_recv := 0;
1773
1774 /* Initialize NS/BSSGP side */
1775 f_init_bssgp();
1776 /* Initialize GPRS MS side */
1777 f_init_gprs_ms();
1778 ms := g_ms[0]; /* We only use first MS in this test */
1779
1780 /* Initialize the PCU interface abstraction */
1781 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1782 /* Speedup test: */
1783 info_ind.n3105 := N3105_MAX;
1784 info_ind.t3195 := 1;
1785 f_init_raw(testcasename(), info_ind);
1786
1787 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1788 * MS and retransmitted after the TBF is released and later on created
1789 * (because the MS is reused) */
1790 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1791
1792 /* Establish BSSGP connection to the PCU */
1793 f_bssgp_establish();
1794 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1795
1796 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1797 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1798 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1799
1800 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1801 f_sleep(X2002);
1802
1803 /* Now we go on receiving DL data and not answering RRBP: */
1804 nr := ts_TsTrxBtsNum;
1805 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1806 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1807 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1808 block_nr := nr.blk_nr));
1809 alt {
1810 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1811 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1812 tr_RLCMAC_DATA)) -> value data_msg {
1813 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1814 if (num_poll_recv == 0) {
1815 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1816 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1817 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1818 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1819 } else {
1820 log("Ignoring RRBP ", num_poll_recv);
1821 N3105 := N3105 + 1;
1822 }
1823 num_poll_recv := num_poll_recv + 1;
1824 }
1825
1826 nr := ts_TsTrxBtsNum;
1827 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1828 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1829 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1830 block_nr := nr.blk_nr));
1831 repeat;
1832 }
1833 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
1834 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
1835 */
1836 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1837 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1838 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1839 if (not T_3195.running) {
1840 T_3195.start;
1841 /* We even send some new data, nothing should be sent to MS */
1842 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1843 }
1844 nr := ts_TsTrxBtsNum;
1845 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1846 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1847 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1848 block_nr := nr.blk_nr));
1849 repeat;
1850 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001851 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001852 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001853 /* Done in alt, wait for pending RTS initiated previously in
1854 * above case before continuing (expect /* Dummy block): */
1855 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1856 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1857 tr_RLCMAC_DUMMY_CTRL));
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001858 }
1859 [] BTS.receive {
1860 setverdict(fail, "Unexpected BTS message");
1861 f_shutdown(__BFILE__, __LINE__);
1862 }
1863 }
1864
1865 /* after T_3195 timeout, TBF is released */
1866 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1867 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1868
1869 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1870 f_sleep(X2002);
1871 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1872
1873 /* ACK the DL block */
1874 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1875 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1876 f_dl_block_ack_fn(dl_block, dl_fn));
1877
1878 f_shutdown(__BFILE__, __LINE__, final := true);
1879}
1880
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001881/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
1882testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001883 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001884 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001885 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001886 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001887
1888 /* Initialize NS/BSSGP side */
1889 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001890 /* Initialize GPRS MS side */
1891 f_init_gprs_ms();
1892 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001893
1894 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001895 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001896
1897 /* Establish BSSGP connection to the PCU */
1898 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001899 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001900
1901 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001902 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001903
1904 /* Send one UL block (with TLLI since we are in One-Phase Access
1905 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001906 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001907 /* 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 +02001908 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 +02001909 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1910 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001911 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001912
1913 /* Send enough blocks to test whole procedure: Until Nth block
1914 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
1915 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001916 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001917 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1918 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001919 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001920
1921 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001922 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 +07001923
1924 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001925}
1926
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001927/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
1928testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
1929 var RlcmacDlBlock dl_block;
1930 var uint32_t dl_fn, sched_fn;
1931 var octetstring payload;
1932 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001933 var template (value) LlcBlockHdr blk_hdr;
1934 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001935 var integer blk_len;
1936 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001937 var GprsMS ms;
1938
1939 /* Initialize NS/BSSGP side */
1940 f_init_bssgp();
1941 /* Initialize GPRS MS side */
1942 f_init_gprs_ms();
1943 ms := g_ms[0]; /* We only use first MS in this test */
1944
1945 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001946 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001947
1948 /* Establish BSSGP connection to the PCU */
1949 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001950 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001951
1952 /* Establish an Uplink TBF */
1953 f_ms_establish_ul_tbf(ms);
1954
1955 /* Send one UL block (with TLLI since we are in One-Phase Access
1956 contention resoultion) and make sure it is ACKED fine. */
1957 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001958 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1959 more := false, e := true);
1960 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001961 /* 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 +01001962 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
1963 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001964 cv := 15,
1965 bsn := ms.ul_tbf.bsn,
1966 blocks := blocks,
1967 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001968 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02001969 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001970
1971 /* ACK and check it was received fine */
1972 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1973 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1974 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1975 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001976 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 +02001977
1978 /* Test sending LLC PDUS of incrementing size */
1979 var integer max_size := 49;
1980 for (var integer i := 1; i <= max_size; i := i + 1) {
1981 var integer cv;
1982 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
1983 log("Sending DATA.ind with LLC payload size ", i);
1984 if (i < max_size - g_bs_cv_max) {
1985 cv := 15;
1986 } else {
1987 cv := max_size - i;
1988 }
1989
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001990 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
1991 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001992 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001993 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1994 more := false, e := true);
1995 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001996 /* 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 +01001997 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
1998 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001999 cv := cv,
2000 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002001 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002002 f_ultbf_inc_bsn(ms.ul_tbf);
2003 f_ms_tx_ul_block(ms, ul_data);
2004
2005 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002006 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 +02002007
2008 /* we will receive UL ACK/NACK from time to time, handle it. */
2009 f_rx_rlcmac_dl_block(dl_block, dl_fn);
2010 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
2011 continue;
2012 }
2013 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2014 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2015 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2016 f_shutdown(__BFILE__, __LINE__);
2017 }
2018
2019 log("Rx Packet Uplink ACK / NACK");
2020 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2021 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2022 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2023 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002024
2025 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002026}
2027
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002028function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2029 var octetstring payload;
2030 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002031 var template (value) LlcBlockHdr blk_hdr;
2032 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002033 var integer block_len, max_valid_data_len;
2034 timer T;
2035
2036 block_len := f_rlcmac_cs_mcs2block_len(cs);
2037 /* We need to send with TLLI since we are in One-Phase Access Contenion
2038 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
2039 * indicator, -1 for spare bits octet at the end */
2040 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2041 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 +07002042 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2043 more := false, e := true);
2044 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002045 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2046 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002047 cv := cv,
2048 bsn := ms.ul_tbf.bsn,
2049 blocks := blocks,
2050 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002051 f_ultbf_inc_bsn(ms.ul_tbf);
2052 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2053
2054 T.start(0.5);
2055 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002056 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002057 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2058 f_shutdown(__BFILE__, __LINE__);
2059 }
2060 [] T.timeout {
2061 setverdict(pass);
2062 }
2063 }
2064}
2065/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2066 blocks intentionally contain last byte of data placed in last byte of RLC
2067 containing padding/spare bits, which is incorrect. Spare bits exist and are
2068 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2069 discounting padding in octet" */
2070testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2071 var GprsMS ms;
2072 var integer block_len, max_valid_data_len;
2073
2074 /* Initialize NS/BSSGP side */
2075 f_init_bssgp();
2076 /* Initialize GPRS MS side */
2077 f_init_gprs_ms();
2078 ms := g_ms[0]; /* We only use first MS in this test */
2079
2080 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002081 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002082
2083 /* Establish BSSGP connection to the PCU */
2084 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002085 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002086
2087 /* Establish an Uplink TBF */
2088 f_ms_establish_ul_tbf(ms);
2089
2090 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2091 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2092 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2093
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002094 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002095}
2096
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002097/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2098 * answered, so TBFs for uplink and later for downlink are created.
2099 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002100private 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 +02002101 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002102 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002103 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002104 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002105 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002106
2107 /* Initialize NS/BSSGP side */
2108 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002109 /* Initialize GPRS MS side */
2110 f_init_gprs_ms();
2111 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002112
2113 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002114 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002115
2116 /* Establish BSSGP connection to the PCU */
2117 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002118 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002119
2120 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002121 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002122
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002123 /* Send one UL block (with TLLI since we are in One-Phase Access
2124 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002125 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 +02002126 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2127 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002128 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002129
2130 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002131 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002132
2133 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002134 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2135 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002136
2137 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2138 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002139 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002140
2141 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002142 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2143 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2144 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002145
2146 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002147}
2148
2149/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2150 * answered, so TBFs for uplink and later for downlink are created.
2151 */
2152testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002153 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002154 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002155}
2156
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002157/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2158 * answered, so TBFs for uplink and later for downlink are created.
2159 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002160private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2161 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002162 template (present) CodingScheme exp_ul_cs_mcs := ?,
2163 template (present) CodingScheme exp_dl_cs_mcs := ?)
2164runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002165 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002166 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002167 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002168 var uint32_t sched_fn;
2169 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002170 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002171 var GprsMS ms;
2172
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002173 /* Initialize NS/BSSGP side */
2174 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002175 /* Initialize GPRS MS side */
2176 f_init_gprs_ms();
2177 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002178
2179 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002180 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002181
2182 /* Establish BSSGP connection to the PCU */
2183 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002184 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002185
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002186 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2187 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 +02002188
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002189 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2190 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 +02002191 f_shutdown(__BFILE__, __LINE__);
2192 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002193
2194 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2195 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002196 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002197
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002198 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002199 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 +02002200
2201 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002202 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002203
2204 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002205 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002206 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2207 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002208 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002209 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002210 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002211
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002212 /* PCU acks the UL data after having received CV=0) */
2213 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2214
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002215 /* 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 +02002216 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 +02002217
2218 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002219 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2220 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 +02002221 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002222
2223 f_shutdown(__BFILE__, __LINE__, final := true);
2224}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002225
2226testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002227 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2228 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002229
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002230 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 +02002231}
2232
2233testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002234 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2235 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002236
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002237 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 +02002238}
2239
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002240testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2241 /* Configure PCU to force two phase access */
2242 g_force_two_phase_access := true;
2243
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002244 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002245 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002246
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002247 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 +02002248}
2249
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002250/* Test scenario where SGSN wants to send some data against MS and it is
2251 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2252 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002253private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2254 template (present) CodingScheme exp_cs_mcs := ?)
2255runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002256 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002257 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002258 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002259 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002260 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002261
2262 /* Initialize NS/BSSGP side */
2263 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002264 /* Initialize GPRS MS side */
2265 f_init_gprs_ms();
2266 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002267
2268 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002269 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002270
2271 /* Establish BSSGP connection to the PCU */
2272 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002273 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002274
2275 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002276 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2277 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002278
2279 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2280 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002281 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002282
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002283 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002284 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2285 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 +02002286 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002287
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002288 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002289 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002290
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002291 /* Send one UL block (with TLLI since we are in One-Phase Access
2292 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002293 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002294 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2295 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002296 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002297
2298 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002299 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002300
2301 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002302}
2303
2304testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002305 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002306 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2307}
2308
2309/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2310/* information about the MS */
2311testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002312 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002313 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002314}
2315
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002316/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2317 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2318 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2319 * be transferred).
2320 */
2321testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002322 var RlcmacDlBlock dl_block;
2323 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002324 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002325 var octetstring total_payload;
2326 var octetstring payload;
2327 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002328 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002329 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002330 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002331
2332 /* Initialize NS/BSSGP side */
2333 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002334 /* Initialize GPRS MS side */
2335 f_init_gprs_ms();
2336 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002337
2338 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002339 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002340
2341 /* Establish BSSGP connection to the PCU */
2342 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002343 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002344
2345 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002346 f_ms_establish_ul_tbf(ms);
2347 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002348
2349 /* Send one UL block (with TLLI since we are in One-Phase Access
2350 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002351 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 +02002352 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 +02002353
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002354 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2355 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002356 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002357 total_payload := payload;
2358
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002359 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2360
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002361 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002362 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002363 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002364 total_payload := total_payload & payload;
2365
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002366 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002367 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002368 total_payload := total_payload & payload;
2369
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002370 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002371 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 +02002372 total_payload := total_payload & lost_payload;
2373
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002374 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002375 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002376 total_payload := total_payload & payload;
2377
2378 /* 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 +02002379 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002380
2381 /* On CV=0, we'll receive a UL ACK asking about missing block */
2382 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2383 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002384 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2385 tfi := tfi,
2386 cv := 15,
2387 bsn := 3,
2388 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002389 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002390
2391 /* Now final ack is recieved */
2392 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2393 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002394 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002395
2396 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002397 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 +07002398
2399 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002400}
2401
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002402/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2403 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2404 * timeout occurs (specified by sent RRBP on DL block). */
2405testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002406 var RlcmacDlBlock dl_block;
2407 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002408 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002409 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002410
2411 /* Initialize NS/BSSGP side */
2412 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002413 /* Initialize GPRS MS side */
2414 f_init_gprs_ms();
2415 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002416
2417 /* Initialize the PCU interface abstraction */
2418 f_init_raw(testcasename());
2419
2420 /* Establish BSSGP connection to the PCU */
2421 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002422 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002423
2424 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002425 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2426 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002427
2428 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2429 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002430 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002431
2432 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2433 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2434 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002435 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002436
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002437 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2438 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002439 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002440
2441 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002442 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2443 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2444 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002445
2446 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002447}
2448
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002449/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2450testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2451 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2452 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002453 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002454 var RlcmacDlBlock dl_block;
2455 var uint32_t ack_fn;
2456 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002457 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002458 timer T := 5.0;
2459
2460 /* Initialize NS/BSSGP side */
2461 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002462 /* Initialize GPRS MS side */
2463 f_init_gprs_ms();
2464 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002465
2466 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002467 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002468
Daniel Willmann535aea62020-09-21 13:27:08 +02002469 f_statsd_reset();
2470
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002471 /* Establish BSSGP connection to the PCU */
2472 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002473 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002474
2475 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002476 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2477 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002478
2479 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2480 f_sleep(X2002);
2481
2482 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2483 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002484 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002485
2486 /* TDMA frame number on which we are supposed to send the ACK */
2487 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2488
2489 /* SGSN sends more blocks during the indicated RRBP */
2490 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2491 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002492 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002493
2494 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2495
2496 /* Make sure this block has the same TFI as was assigned
2497 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002498 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002499 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2500 dl_block.data.mac_hdr.hdr_ext.tfi);
2501 f_shutdown(__BFILE__, __LINE__);
2502 }
2503
2504 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002505 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002506
2507 /* Break if this is the end of RRBP */
2508 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002509 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002510 break;
2511 }
2512 }
2513
2514 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002515 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 +07002516
2517 /* Make sure that the next block (after the Ack) is dummy */
2518 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2519
Daniel Willmann535aea62020-09-21 13:27:08 +02002520 var StatsDExpects expect := {
2521 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2522 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2523 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2524 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2525 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002526 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002527 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2528 };
2529 f_statsd_expect(expect);
2530
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002531 f_shutdown(__BFILE__, __LINE__, final := true);
2532}
2533
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002534/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2535 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2536 * Check "3GPP TS 44.060" Annex B. */
2537testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2538 var RlcmacDlBlock dl_block;
2539 var octetstring dataA := f_rnd_octstring(20);
2540 var octetstring dataB := f_rnd_octstring(13);
2541 var octetstring dataC := f_rnd_octstring(3);
2542 var octetstring dataD := f_rnd_octstring(12);
2543 var uint32_t sched_fn;
2544 var GprsMS ms;
2545 var template (value) RlcmacUlBlock ul_data;
2546
2547 /* Initialize NS/BSSGP side */
2548 f_init_bssgp();
2549 /* Initialize GPRS MS side */
2550 f_init_gprs_ms();
2551 ms := g_ms[0]; /* We only use first MS in this test */
2552
2553 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002554 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002555
2556 /* Establish BSSGP connection to the PCU */
2557 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002558 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002559
2560 /* Establish an Uplink TBF */
2561 f_ms_establish_ul_tbf(ms);
2562
2563 /* Summary of what's transmitted:
2564 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2565 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2566 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2567 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2568 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2569 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2570 */
2571
2572 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002573 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2574 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002575 cv := 3,
2576 bsn := ms.ul_tbf.bsn,
2577 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2578 tlli := ms.tlli);
2579 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2580 * RLCMAC block being sent. */
2581 ul_data.data.mac_hdr.e := true;
2582 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002583 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002584
2585 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002586 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2587 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002588 cv := 2,
2589 bsn := ms.ul_tbf.bsn,
2590 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2591 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2592 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2593 },
2594 tlli := ms.tlli);
2595 f_ultbf_inc_bsn(ms.ul_tbf);
2596 f_ms_tx_ul_block(ms, ul_data);
2597
2598 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002599 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 +02002600
2601 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002602 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2603 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002604 cv := 1,
2605 bsn := ms.ul_tbf.bsn,
2606 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2607 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2608 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2609 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2610 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2611 },
2612 tlli := ms.tlli);
2613 f_ultbf_inc_bsn(ms.ul_tbf);
2614 f_ms_tx_ul_block(ms, ul_data);
2615
2616 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002617 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2618 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 +02002619
2620 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002621 ul_data := t_RLCMAC_UL_DATA_TLLI(
2622 cs := CS_1,
2623 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002624 cv := 0,
2625 bsn := ms.ul_tbf.bsn,
2626 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2627 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2628 },
2629 tlli := ms.tlli);
2630 f_ultbf_inc_bsn(ms.ul_tbf);
2631 f_ms_tx_ul_block(ms, ul_data);
2632
2633 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002634 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 +02002635
2636 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2637 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2638 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2639
2640 f_shutdown(__BFILE__, __LINE__, final := true);
2641}
2642
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002643/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2644 * ACK/NACK is not answered */
2645testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2646 var RlcmacDlBlock dl_block;
2647 var octetstring data1 := f_rnd_octstring(200);
2648 var octetstring data2 := f_rnd_octstring(10);
2649 var uint32_t dl_fn;
2650 var GprsMS ms;
2651 var template (value) TsTrxBtsNum nr;
2652 var BTS_PDTCH_Block data_msg;
2653
2654 /* Initialize NS/BSSGP side */
2655 f_init_bssgp();
2656 /* Initialize GPRS MS side */
2657 f_init_gprs_ms();
2658 ms := g_ms[0]; /* We only use first MS in this test */
2659
2660 /* Initialize the PCU interface abstraction */
2661 f_init_raw(testcasename())
2662
2663 /* Establish BSSGP connection to the PCU */
2664 f_bssgp_establish();
2665 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2666
2667 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2668 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2669 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2670
2671 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2672 f_sleep(X2002);
2673
2674 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2675 while (true) {
2676 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2677
2678 /* Keep Ack/Nack description updated (except for last BSN) */
2679 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2680
2681 if (f_dl_block_rrbp_valid(dl_block)) {
2682 /* Don't transmit DL ACK here on purpose ignore it */
2683 break;
2684 }
2685 }
2686
2687 /* PCU starts whole process again */
2688 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2689
2690 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2691 f_sleep(X2002);
2692
2693 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2694 /* DL data), after that we receive only DUMMY blocks so we are done */
2695 var boolean data_received := false;
2696 nr := ts_TsTrxBtsNum;
2697 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2698 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2699 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2700 block_nr := nr.blk_nr));
2701 alt {
2702 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2703 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2704 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2705 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2706 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2707 tr_RLCMAC_DATA)) -> value data_msg {
2708 data_received := true;
2709 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2710 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2711 log("Received FINAL_ACK");
2712 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2713 }
2714 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2715 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2716 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2717 }
2718 nr := ts_TsTrxBtsNum;
2719 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2720 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2721 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2722 block_nr := nr.blk_nr));
2723 repeat;
2724 }
2725 [] BTS.receive {
2726 setverdict(fail, "Unexpected BTS message");
2727 f_shutdown(__BFILE__, __LINE__);
2728 }
2729 }
2730
2731 f_shutdown(__BFILE__, __LINE__, final := true);
2732}
2733
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002734/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2735testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002736 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002737 var octetstring data := f_rnd_octstring(10);
2738 var PacketDlAssign dl_tbf_ass;
2739 var RlcmacDlBlock dl_block;
2740 var uint32_t poll_fn;
2741 var uint32_t sched_fn;
2742 var GprsMS ms;
2743 timer T := 5.0;
2744
2745 /* Initialize NS/BSSGP side */
2746 f_init_bssgp();
2747 /* Initialize GPRS MS side */
2748 f_init_gprs_ms();
2749 ms := g_ms[0]; /* We only use first MS in this test */
2750
2751 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002752 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2753 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002754
2755 /* Initialize the PCU interface abstraction */
2756 f_init_raw(testcasename(), info_ind);
2757
2758 /* Establish BSSGP connection to the PCU */
2759 f_bssgp_establish();
2760 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2761
2762 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2763 through PDCH (no multiblock assignment possible through PCH) */
2764 f_ms_establish_ul_tbf(ms);
2765
2766 /* Send one UL block (with TLLI since we are in One-Phase Access
2767 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002768 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
2769 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002770 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2771 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2772
2773 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2774 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2775 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2776 gprsextendeddynalloccap := '0'B
2777 };
2778 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2779 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2780 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2781 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2782 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2783 f_shutdown(__BFILE__, __LINE__);
2784 }
2785 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2786
2787 f_shutdown(__BFILE__, __LINE__, final := true);
2788}
2789
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002790testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002791 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002792 var RlcmacDlBlock dl_block;
2793 var octetstring data := f_rnd_octstring(10);
2794 var PollFnCtx pollctx;
2795 var uint32_t sched_fn;
2796 var GprsMS ms;
2797
2798 var MultislotCap_GPRS mscap_gprs := {
2799 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2800 gprsextendeddynalloccap := '0'B
2801 };
2802 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2803
2804
2805 /* Initialize NS/BSSGP side */
2806 f_init_bssgp();
2807 /* Initialize GPRS MS side */
2808 f_init_gprs_ms();
2809 ms := g_ms[0]; /* We only use first MS in this test */
2810
2811 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002812 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2813 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002814
2815 /* Initialize the PCU interface abstraction */
2816 f_init_raw(testcasename(), info_ind);
2817
2818 /* Establish BSSGP connection to the PCU */
2819 f_bssgp_establish();
2820 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2821
2822 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2823 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2824
2825 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
2826 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
2827
2828 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2829 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2830 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2831 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2832 f_shutdown(__BFILE__, __LINE__);
2833 }
2834 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2835
2836 f_shutdown(__BFILE__, __LINE__, final := true);
2837}
2838
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002839testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
2840 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
2841 var RlcmacDlBlock dl_block;
2842 var octetstring data := f_rnd_octstring(10);
2843 var PollFnCtx pollctx;
2844 var uint32_t sched_fn;
2845 var GprsMS ms;
2846
2847 var MultislotCap_GPRS mscap_gprs := {
2848 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2849 gprsextendeddynalloccap := '0'B
2850 };
2851 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2852
2853
2854 /* Initialize NS/BSSGP side */
2855 f_init_bssgp();
2856 /* Initialize GPRS MS side */
2857 f_init_gprs_ms();
2858 ms := g_ms[0]; /* We only use first MS in this test */
2859
2860 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002861 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2862 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002863
2864 /* Initialize the PCU interface abstraction */
2865 f_init_raw(testcasename(), info_ind);
2866
2867 /* Establish BSSGP connection to the PCU */
2868 f_bssgp_establish();
2869 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2870
2871 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2872 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2873
2874 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
2875 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
2876 f_shutdown(__BFILE__, __LINE__);
2877 }
2878
2879 f_shutdown(__BFILE__, __LINE__, final := true);
2880}
2881
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002882/* Test scenario where MS wants to request a new TBF once the current one is
2883 * ending, by means of sending a Packet Resource Request on ul slot provided by
2884 * last Pkt Ul ACK's RRBP.
2885 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
2886testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002887 var RlcmacDlBlock dl_block;
2888 var octetstring data := f_rnd_octstring(10);
2889 var uint32_t sched_fn;
2890 var uint32_t dl_fn;
2891 var template RlcmacDlBlock acknack_tmpl;
2892 var GprsMS ms;
2893
2894 /* Initialize NS/BSSGP side */
2895 f_init_bssgp();
2896 /* Initialize GPRS MS side */
2897 f_init_gprs_ms();
2898 ms := g_ms[0]; /* We only use first MS in this test */
2899
2900 /* Initialize the PCU interface abstraction */
2901 f_init_raw(testcasename());
2902
2903 /* Establish BSSGP connection to the PCU */
2904 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002905 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002906
2907 /* Establish an Uplink TBF */
2908 f_ms_establish_ul_tbf(ms);
2909
2910 /* Send one UL block (with TLLI since we are in One-Phase Access
2911 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002912 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 +02002913
2914 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002915 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002916
2917 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
2918 tr_UlAckNackGprs(ms.tlli,
2919 tr_AckNackDescription(final_ack := '1'B),
2920 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
2921 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2922
2923 /* TODO: verify TBF_EST and FinalACK are both '1' above */
2924
2925 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07002926 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 +07002927 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002928 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2929 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2930
2931 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2932 and make sure it is ACKED fine */
2933 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
2934
2935 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002936 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002937
2938 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2939 /* ACK the ACK */
2940 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2941
2942 f_shutdown(__BFILE__, __LINE__, final := true);
2943}
2944
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002945/* Test CS paging over the BTS<->PCU socket.
2946 * 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.
2947 * Paging should be send on the PACCH.
2948 *
2949 * 1. Send a Paging Request over PCU socket.
2950 * 2. Send a Ready-To-Send message over PCU socket
2951 * 3. Expect a Paging Frame
2952 */
2953testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002954 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002955 var MobileIdentityLV mi;
2956 var octetstring mi_enc_lv;
2957 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002958 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002959
2960 /* Initialize NS/BSSGP side */
2961 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002962 /* Initialize GPRS MS side */
2963 f_init_gprs_ms();
2964 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002965
2966 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002967 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002968
2969 /* Establish BSSGP connection to the PCU */
2970 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002971 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002972
2973 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002974 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002975
2976 /* build mobile Identity */
2977 mi := valueof(ts_MI_IMSI_LV(imsi));
2978 mi_enc_lv := enc_MobileIdentityLV(mi);
2979 /* Send paging request */
2980 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
2981 sapi :=PCU_IF_SAPI_PDTCH));
2982
2983 /* Receive it on BTS side towards MS */
2984 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2985
2986 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002987 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
2988 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2989 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2990 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002991
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002992 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002993}
2994
2995/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
2996 */
2997private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2998runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002999 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003000 var hexstring imsi := f_gen_imsi(42);
3001 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003002 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003003
3004 /* Initialize NS/BSSGP side */
3005 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003006 /* Initialize GPRS MS side */
3007 f_init_gprs_ms();
3008 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003009
3010 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003011 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003012
3013 /* Establish BSSGP connection to the PCU */
3014 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003015 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003016
3017 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003018 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003019
3020 /* Send paging request with or without TMSI */
3021 if (use_ptmsi) {
3022 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3023 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3024 } else {
3025 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3026 }
3027
3028 /* Receive it on BTS side towards MS */
3029 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3030
3031 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003032 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003033 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003034 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3035 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3036 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003037 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003038 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3039 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3040 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003041 }
3042
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003043 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003044}
3045
3046testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3047 f_tc_paging_cs_from_sgsn(0, true);
3048}
3049
3050testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3051 f_tc_paging_cs_from_sgsn(0);
3052}
3053
3054testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003055 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003056}
3057
3058/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3059 */
3060private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3061runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003062 var integer imsi_suff_tx := 423;
3063 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003064 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003065
3066 /* Initialize NS/BSSGP side */
3067 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003068 /* Initialize GPRS MS side */
3069 f_init_gprs_ms();
3070 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003071
3072 /* Initialize the PCU interface abstraction */
3073 f_init_raw(testcasename());
3074
3075 /* Establish BSSGP connection to the PCU */
3076 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003077 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003078
3079 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3080 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3081 if (use_ptmsi) {
3082 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3083 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3084 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3085 } else {
3086 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3087 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3088 }
3089
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003090 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003091}
3092
3093testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3094 f_tc_paging_ps_from_sgsn(0, true);
3095}
3096
3097testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3098 f_tc_paging_ps_from_sgsn(0);
3099}
3100
3101testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003102 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003103}
3104
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003105/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3106testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3107 var RlcmacDlBlock dl_block;
3108 var octetstring data := f_rnd_octstring(10);
3109 var uint32_t sched_fn;
3110 var uint32_t dl_fn;
3111 var GprsMS ms;
3112
3113 /* Initialize NS/BSSGP side */
3114 f_init_bssgp();
3115 /* Initialize GPRS MS side */
3116 f_init_gprs_ms();
3117 ms := g_ms[0]; /* We only use first MS in this test */
3118
3119 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003120 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003121
Daniel Willmann535aea62020-09-21 13:27:08 +02003122 f_statsd_reset();
3123
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003124 /* Establish BSSGP connection to the PCU */
3125 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003126 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003127
3128 /* Establish an Uplink TBF */
3129 f_ms_establish_ul_tbf(ms);
3130
3131 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003132 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 +02003133 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3134 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3135 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3136
3137 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003138 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003139
3140 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3141 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3142 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3143
3144 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3145 f_sleep(X2002);
3146 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3147
3148 /* ACK the DL block */
3149 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3150 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3151 f_dl_block_ack_fn(dl_block, dl_fn));
3152
Daniel Willmann535aea62020-09-21 13:27:08 +02003153 var StatsDExpects expect := {
3154 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3155 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3156 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3157 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003158 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003159 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003160 };
3161 f_statsd_expect(expect);
3162
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003163 f_shutdown(__BFILE__, __LINE__, final := true);
3164}
3165
3166/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3167testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3168 var RlcmacDlBlock dl_block;
3169 var octetstring data := f_rnd_octstring(10);
3170 var uint32_t sched_fn;
3171 var uint32_t dl_fn;
3172 var GprsMS ms;
3173
3174 /* Initialize NS/BSSGP side */
3175 f_init_bssgp();
3176 /* Initialize GPRS MS side */
3177 f_init_gprs_ms();
3178 ms := g_ms[0]; /* We only use first MS in this test */
3179
3180 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003181 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003182
3183 /* Establish BSSGP connection to the PCU */
3184 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003185 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003186
3187 /* Establish an Uplink TBF */
3188 f_ms_establish_ul_tbf(ms);
3189
3190 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003191 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 +02003192 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3193 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3194 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3195
3196 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003197 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003198
3199 /* Now SGSN sends some DL data with an invalid IMSI */
3200 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3201
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003202 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003203
3204 /* TODO: make sure no data is sent over PCU -> MS */
3205
3206 f_shutdown(__BFILE__, __LINE__, final := true);
3207}
3208
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003209private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3210 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3211 var octetstring data := f_rnd_octstring(6);
3212 var RlcmacDlBlock dl_block;
3213 var GprsMS ms;
3214 var uint32_t fn;
3215
3216 /* Initialize NS/BSSGP side */
3217 f_init_bssgp();
3218 /* Initialize GPRS MS side */
3219 f_init_gprs_ms();
3220 ms := g_ms[0]; /* We only use first MS in this test */
3221
3222 /* Initialize the PCU interface abstraction */
3223 f_init_raw(testcasename());
3224
3225 /* Establish BSSGP connection to the PCU */
3226 f_bssgp_establish();
3227 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3228
3229 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3230 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3231 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3232
3233 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3234 f_sleep(X2002);
3235
3236 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3237 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3238
3239 if (ischosen(dl_block.data_egprs)) {
3240 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3241 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3242 f_shutdown(__BFILE__, __LINE__);
3243 }
3244 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3245 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3246 f_shutdown(__BFILE__, __LINE__);
3247 }
3248 if (not match(dl_block.data_egprs.blocks[1].payload,
3249 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3250 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3251 f_shutdown(__BFILE__, __LINE__);
3252 }
3253 } else if (lengthof(dl_block.data.blocks) > 1) {
3254 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3255 f_shutdown(__BFILE__, __LINE__);
3256 }
3257
3258 f_shutdown(__BFILE__, __LINE__, final := true);
3259}
3260
3261/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3262 * containing llc data. See OS#4849 */
3263testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3264 f_tc_dl_data_no_llc_ui_dummy(omit);
3265}
3266
3267/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3268 * containing llc data. See OS#4849 */
3269testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003270 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003271}
3272
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003273private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003274 template GsmRrMessage t_imm_ass := ?,
3275 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003276runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003277 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003278 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003279
3280 ra11 := enc_EGPRSPktChRequest2uint(req);
3281 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3282
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003283 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003284 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003285 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003286 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003287 }
3288
3289 setverdict(pass);
3290}
3291
3292testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3293 var template GsmRrMessage imm_ass;
3294 var template IaRestOctets rest;
3295 var template EgprsUlAss ul_ass;
3296
3297 /* Initialize the PCU interface abstraction */
3298 f_init_raw(testcasename());
3299
3300 var EGPRSPktChRequest req := {
3301 /* NOTE: other fields are set in the loop */
3302 signalling := { tag := '110011'B }
3303 };
3304
3305 for (var integer i := 0; i < 6; i := i + 1) {
3306 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3307 req.signalling.random_bits := ext_ra;
3308
3309 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3310 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3311 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3312 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3313
3314 f_TC_egprs_pkt_chan_req(req, imm_ass);
3315 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003316
3317 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003318}
3319
3320testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3321 var template GsmRrMessage imm_ass;
3322 var template IaRestOctets rest;
3323 var template EgprsUlAss ul_ass;
3324
3325 /* Initialize the PCU interface abstraction */
3326 f_init_raw(testcasename());
3327
3328 var EGPRSPktChRequest req := {
3329 /* NOTE: other fields are set in the loop */
3330 one_phase := { tag := '0'B }
3331 };
3332
3333 for (var integer i := 0; i < 6; i := i + 1) {
3334 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3335 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3336 var BIT2 priority := substr(ext_ra, 0, 2);
3337 var BIT3 rand := substr(ext_ra, 2, 3);
3338
3339 req.one_phase.multislot_class := mslot_class;
3340 req.one_phase.priority := priority;
3341 req.one_phase.random_bits := rand;
3342
3343 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3344 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3345 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3346 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3347
3348 f_TC_egprs_pkt_chan_req(req, imm_ass);
3349 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003350
3351 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003352}
3353
3354testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3355 var template GsmRrMessage imm_ass;
3356 var template IaRestOctets rest;
3357 var template EgprsUlAss ul_ass;
3358
3359 /* Initialize the PCU interface abstraction */
3360 f_init_raw(testcasename());
3361
3362 var EGPRSPktChRequest req := {
3363 /* NOTE: other fields are set in the loop */
3364 two_phase := { tag := '110000'B }
3365 };
3366
3367 for (var integer i := 0; i < 6; i := i + 1) {
3368 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3369 var BIT2 priority := substr(ext_ra, 0, 2);
3370 var BIT3 rand := substr(ext_ra, 2, 3);
3371
3372 req.two_phase.priority := priority;
3373 req.two_phase.random_bits := rand;
3374
3375 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3376 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3377 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3378 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3379
3380 f_TC_egprs_pkt_chan_req(req, imm_ass);
3381 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003382
3383 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003384}
3385
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003386private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3387 template IARRestOctets rest := ?,
3388 PCUIF_BurstType bt := BURST_TYPE_1)
3389runs on RAW_PCU_Test_CT {
3390 var template ReqRefWaitInd tr_ref;
3391 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003392
3393 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3394 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3395 ra := bit2int(ra11), is_11bit := 1,
3396 burst_type := bt, fn := fn,
3397 arfcn := 871));
3398
3399 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003400 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003401
3402 /* Just to have a short-name reference to the actual message */
3403 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3404
3405 /* Make sure that Request Reference list contains at least one entry
3406 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
3407 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn));
3408 if (not match(iar.payload, { *, tr_ref, * })) {
3409 setverdict(fail, "Request Reference list does not match");
3410 f_shutdown(__BFILE__, __LINE__);
3411 }
3412
3413 /* Match Feature Indicator (must indicate PS domain) */
3414 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3415 setverdict(fail, "Feature Indicator does not match");
3416 f_shutdown(__BFILE__, __LINE__);
3417 }
3418
3419 /* Match IAR Rest Octets */
3420 if (not match(iar.rest_octets, rest)) {
3421 setverdict(fail, "IAR Rest Octets does not match: ",
3422 iar.rest_octets, " vs expected ", rest);
3423 f_shutdown(__BFILE__, __LINE__);
3424 }
3425
3426 setverdict(pass);
3427}
3428
3429/* Verify the contents of RR Immediate Assignment Reject message and its
3430 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3431testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3432 var template IARRestOctets rest;
3433 var BIT5 ext_ra;
3434
3435 /* Initialize the PCU interface abstraction */
3436 f_init_raw(testcasename());
3437
3438 for (var integer i := 0; i < 6; i := i + 1) {
3439 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3440 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3441
3442 /* Intentionally incorrect message (see table 11.2.5a.2) */
3443 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3444 }
3445
3446 f_shutdown(__BFILE__, __LINE__, final := true);
3447}
3448
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003449/* At the moment, the IUT does not support any emergency services. Make sure
3450 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3451testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3452 var template IARRestOctets rest;
3453 var BIT5 ext_ra;
3454 var BIT11 ra11;
3455
3456 /* Initialize the PCU interface abstraction */
3457 f_init_raw(testcasename());
3458
3459 var EGPRSPktChRequest req := {
3460 /* NOTE: other fields are set in the loop */
3461 emergency := { tag := '110111'B }
3462 };
3463
3464 for (var integer i := 0; i < 6; i := i + 1) {
3465 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3466 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3467
3468 req.emergency.random_bits := ext_ra;
3469 ra11 := enc_EGPRSPktChRequest2bits(req);
3470
3471 /* Intentionally incorrect message (see table 11.2.5a.2) */
3472 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3473 }
3474
3475 f_shutdown(__BFILE__, __LINE__, final := true);
3476}
3477
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003478/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3479testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003480 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003481 var template IARRestOctets rest;
3482 var BIT11 ra11;
3483
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003484 info_ind := valueof(ts_PCUIF_INFO_default);
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003485
3486 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003487 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3488 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003489
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003490 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003491 f_init_raw(testcasename(), info_ind);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003492
3493 var EGPRSPktChRequest req := {
3494 one_phase := {
3495 tag := '0'B,
3496 multislot_class := '10101'B,
3497 priority := '01'B,
3498 random_bits := '101'B
3499 }
3500 };
3501
3502 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3503 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3504 for (var integer i := 0; i < 7; i := i + 1) {
3505 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3506 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3507 }
3508
3509 ra11 := enc_EGPRSPktChRequest2bits(req);
3510 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3511
3512 /* At this point, the IUT should run out of free USFs */
3513 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
3514
3515 f_shutdown(__BFILE__, __LINE__, final := true);
3516}
3517
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003518/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003519private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003520return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003521 /* Pick a random MA length in range 2 .. max_ma_len */
3522 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
3523
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003524 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
3525 hsn := f_rnd_int(63),
3526 maio := f_rnd_int(63),
3527 ma := f_rnd_bitstring(ma_len));
3528}
3529
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003530private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
3531 in GsmRrMessage rr_msg)
3532{
3533 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003534 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003535
3536 var template PacketChannelDescription tr_pkt_chan_desc := {
3537 channel_Type_spare := ?,
3538 tn := ?,
3539 tsc := ts.tsc,
3540 presence := '1'B,
3541 zero := omit,
3542 one := {
3543 maio := ts.maio,
3544 hsn := ts.hsn
3545 }
3546 };
3547
3548 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
3549 setverdict(fail, "Packet Channel Description does not match: ",
3550 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
3551 }
3552
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003553 /* Mobile Allocation is expected to be octet-aligned */
3554 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
3555 var template MobileAllocationLV tr_ma := {
3556 len := ma_oct_len, /* in bytes */
3557 ma := substr(ts.ma, 0, ma_oct_len * 8)
3558 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003559
3560 if (not match(ia.mobile_allocation, tr_ma)) {
3561 setverdict(fail, "Mobile Allocation does not match: ",
3562 ia.mobile_allocation, " vs ", tr_ma);
3563 }
3564
3565 setverdict(pass);
3566}
3567
3568/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
3569testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003570 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003571 var GprsMS ms := valueof(t_GprsMS_def);
3572
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003573 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003574 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003575
3576 /* Initialize the PCU interface abstraction */
3577 f_init_raw(testcasename(), info_ind);
3578
3579 /* EGPRS Packet Channel Request (cause=Signalling) */
3580 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
3581
3582 /* Establish an Uplink EGPRS TBF */
3583 f_ms_establish_ul_tbf(ms);
3584
3585 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3586 f_shutdown(__BFILE__, __LINE__, final := true);
3587}
3588
3589/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
3590testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003591 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003592 var GprsMS ms := valueof(t_GprsMS_def);
3593
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003594 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003595 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003596
3597 /* Initialize the PCU interface abstraction */
3598 f_init_raw(testcasename(), info_ind);
3599
3600 /* Establish an Uplink TBF */
3601 f_ms_establish_ul_tbf(ms);
3602
3603 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3604 f_shutdown(__BFILE__, __LINE__, final := true);
3605}
3606
3607/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
3608testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003609 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003610 var GprsMS ms := valueof(t_GprsMS_def);
3611
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003612 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003613 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003614
3615 /* Initialize NS/BSSGP side */
3616 f_init_bssgp();
3617
3618 /* Initialize the PCU interface abstraction */
3619 f_init_raw(testcasename(), info_ind);
3620
3621 /* Establish BSSGP connection to the PCU */
3622 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003623 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003624
3625 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3626 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
3627 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3628
3629 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
3630 f_shutdown(__BFILE__, __LINE__, final := true);
3631}
3632
3633private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
3634 in FrequencyParameters fp)
3635{
3636 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003637 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003638
3639 /* Table 12.8.1: Frequency Parameters information elements */
3640 var template FrequencyParameters tr_fp := {
3641 tsc := ts.tsc,
3642 presence := '10'B, /* Direct encoding 1 */
3643 arfcn := omit,
3644 indirect := omit,
3645 direct1 := {
3646 maio := ts.maio,
3647 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
3648 mobile_allocation := {
3649 hsn := ts.hsn,
3650 rfl_number_list_present := '0'B,
3651 rfl_number_list := omit,
3652 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003653 ma_length := ts.ma_bit_len,
3654 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003655 }
3656 },
3657 direct2 := omit
3658 };
3659
3660 if (not match(fp, tr_fp)) {
3661 setverdict(fail, "Frequency Parameters IE does not match: ",
3662 fp, " vs ", tr_fp);
3663 }
3664
3665 setverdict(pass);
3666}
3667
3668/* Make sure that Packet Uplink Assignment contains hopping parameters */
3669testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003670 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003671 var GprsMS ms := valueof(t_GprsMS_def);
3672 var uint32_t poll_fn;
3673
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003674 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003675 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003676
3677 /* Initialize the PCU interface abstraction */
3678 f_init_raw(testcasename(), info_ind);
3679
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003680 /* Single block (two phase) packet access */
3681 var uint16_t ra := bit2int(chan_req_sb);
3682 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
3683
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003684 /* Establish an Uplink TBF */
3685 f_ms_establish_ul_tbf(ms);
3686
3687 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003688 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
3689 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003690
3691 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003692 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
3693 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003694
3695 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
3696 var template (omit) FrequencyParameters fp;
3697 if (ua.is_egprs == '1'B) {
3698 fp := ua.egprs.freq_par;
3699 } else {
3700 fp := ua.gprs.freq_par;
3701 }
3702
3703 /* This is an optional IE, so it's worth to check its presence */
3704 if (istemplatekind(fp, "omit")) {
3705 setverdict(fail, "Frequency Parameters IE is not present");
3706 f_shutdown(__BFILE__, __LINE__);
3707 }
3708
3709 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
3710 f_shutdown(__BFILE__, __LINE__, final := true);
3711}
3712
3713/* Make sure that Packet Downlink Assignment contains hopping parameters */
3714testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003715 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003716 var octetstring data := f_rnd_octstring(10);
3717 var GprsMS ms := valueof(t_GprsMS_def);
3718 var RlcmacDlBlock dl_block;
3719 var uint32_t poll_fn;
3720
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003721 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003722 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003723
3724 /* Initialize NS/BSSGP side */
3725 f_init_bssgp();
3726
3727 /* Initialize the PCU interface abstraction */
3728 f_init_raw(testcasename(), info_ind);
3729
3730 /* Establish BSSGP connection to the PCU */
3731 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003732 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003733
3734 /* Establish an Uplink TBF */
3735 f_ms_establish_ul_tbf(ms);
3736
3737 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003738 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 +07003739
3740 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3741 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
3742 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
3743
3744 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
3745 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3746
3747 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003748 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
3749 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003750
3751 /* This is an optional IE, so it's worth to check its presence */
3752 if (not ispresent(da.freq_par)) {
3753 setverdict(fail, "Frequency Parameters IE is not present");
3754 f_shutdown(__BFILE__, __LINE__);
3755 }
3756
3757 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
3758 f_shutdown(__BFILE__, __LINE__, final := true);
3759}
3760
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003761/* Check if the IUT handles subsequent INFO.ind messages */
3762testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003763 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003764 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003765
3766 /* Initialize the PCU interface abstraction */
3767 f_init_raw(testcasename(), info_ind);
3768
3769 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
3770 for (var integer i := 0; i < 16; i := i + 1) {
3771 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003772 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003773 }
3774
3775 f_shutdown(__BFILE__, __LINE__, final := true);
3776}
3777
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003778/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
3779testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
3780 var PCUIF_info_ind info_ind;
3781 var integer i;
3782 const integer num_ms := 8;
3783
3784 /* Initialize NS/BSSGP side */
3785 f_init_bssgp();
3786 /* Initialize GPRS MS side */
3787 f_init_gprs_ms(num_ms);
3788
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003789 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003790 /* Only the 3 first TRX are enabled. The enabled ones all have same
3791 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003792 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
3793 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
3794 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
3795 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003796
3797 /* Initialize the PCU interface abstraction */
3798 f_init_raw(testcasename(), info_ind);
3799
3800 /* Establish BSSGP connection to the PCU */
3801 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003802 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003803
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003804 /* Establish an Uplink TBF for each GprsMS instance */
3805 f_multi_ms_establish_tbf(do_activate := false);
3806
3807 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003808 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003809 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01003810 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003811 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003812 f_shutdown(__BFILE__, __LINE__);
3813 }
3814 }
3815
3816 f_shutdown(__BFILE__, __LINE__, final := true);
3817}
3818
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003819/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
3820 * downgraded to CS1-4 so that GPRS can read the USF).
3821 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
3822 */
3823testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
3824 var PCUIF_info_ind info_ind;
3825 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
3826 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003827 var uint32_t sched_fn, dl_fn, ack_fn;
3828 var octetstring data := f_rnd_octstring(10);
3829 var RlcmacDlBlock dl_block;
3830 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003831 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003832 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
3833 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
3834
3835 /* Initialize NS/BSSGP side */
3836 f_init_bssgp();
3837 /* Initialize GPRS MS side */
3838 f_init_gprs_ms(num_ms);
3839
3840 info_ind := valueof(ts_PCUIF_INFO_default);
3841 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003842 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
3843 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003844
3845 /* Initialize the PCU interface abstraction */
3846 f_init_raw(testcasename(), info_ind);
3847
3848 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
3849 g_mcs_initial_dl := 5;
3850 g_mcs_max_dl := 5;
3851 f_pcuvty_set_allowed_cs_mcs();
3852
3853 /* Establish BSSGP connection to the PCU */
3854 f_bssgp_establish();
3855 f_multi_ms_bssgp_register();
3856
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003857 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003858 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 +01003859 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
3860 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
3861 f_shutdown(__BFILE__, __LINE__);
3862 }
3863 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3864 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3865
3866 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003867 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 +01003868 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
3869 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
3870 f_shutdown(__BFILE__, __LINE__);
3871 }
3872 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3873 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3874
3875 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
3876 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3877 f_sleep(0.1);
3878 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3879 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3880 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
3881 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3882 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
3883 /* ACK the DL block */
3884 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
3885 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
3886 f_dl_block_ack_fn(dl_block, dl_fn));
3887
3888 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
3889 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3890 f_sleep(0.1);
3891 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3892 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3893 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
3894 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3895 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
3896 /* ACK the DL block */
3897 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
3898 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
3899 f_dl_block_ack_fn(dl_block, dl_fn));
3900
3901 data := f_rnd_octstring(1400);
3902 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3903 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3904
3905 for (var integer i := 0; i < 800; i := i + 1) {
3906 f_rx_rlcmac_dl_block(dl_block, dl_fn);
3907
3908 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
3909 /* No more data to receive, done */
3910 break;
3911 }
3912
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003913 usf_ms := -1;
3914
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003915 if (ischosen(dl_block.ctrl)) {
3916 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
3917 f_shutdown(__BFILE__, __LINE__);
3918 } else if (ischosen(dl_block.data_egprs)) {
3919 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
3920 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
3921 f_shutdown(__BFILE__, __LINE__);
3922 }
3923 tgt_ms := 1;
3924 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
3925 if (dl_block.data_egprs.mcs > MCS_4) {
3926 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
3927 f_shutdown(__BFILE__, __LINE__);
3928 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003929 usf_ms := 0;
3930 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003931 } else {
3932 if (dl_block.data_egprs.mcs <= MCS_4) {
3933 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
3934 f_shutdown(__BFILE__, __LINE__);
3935 }
3936 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003937 usf_ms := 1;
3938 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003939 }
3940 }
3941 } else {
3942 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
3943 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
3944 f_shutdown(__BFILE__, __LINE__);
3945 }
3946 tgt_ms := 0;
3947 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 +01003948 usf_ms := 0;
3949 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003950 } 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 +01003951 usf_ms := 1;
3952 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003953 }
3954 }
3955
3956 /* Keep Ack/Nack description updated */
3957 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
3958
3959 /* TDMA frame number on which we are supposed to send the ACK */
3960 if (f_dl_block_rrbp_valid(dl_block)) {
3961 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
3962 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);
3963 if (tx_data_remain != 0) {
3964 /* Submit more data from time to time to keep the TBF ongoing */
3965 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3966 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3967 tx_data_remain := tx_data_remain - 1;
3968 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003969 } else if (tx_data_remain != 0) {
3970 /* keep sending UL blocks when requested by USF to avoid
3971 * UL TBF timeout and hence stop receival of USFs */
3972 if (usf_ms != -1) {
3973 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
3974 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003975 }
3976 }
3977
3978 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 +01003979 /* He we check that DL blocks scheduled at GPRS can still request UL
3980 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
3981 * condition also ensures the downgrade to <=MCS4 condition is tested
3982 * above */
3983 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
3984 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003985 f_shutdown(__BFILE__, __LINE__);
3986 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003987 /* Here check for some level of fairness between them (at least ~40%): */
3988 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
3989 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
3990 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
3991 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
3992 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3993 f_shutdown(__BFILE__, __LINE__);
3994 }
3995 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
3996 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3997 f_shutdown(__BFILE__, __LINE__);
3998 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003999
4000 f_shutdown(__BFILE__, __LINE__, final := true);
4001}
4002
4003
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004004private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4005 boolean exp_imsi, boolean exp_tmsi)
4006runs on RAW_PCU_Test_CT {
4007 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4008 var integer pending := lengthof(g_ms);
4009 var RlcmacDlBlock dl_block;
4010 var boolean f1, f2;
4011
4012 while (pending > 0) {
4013 var uint32_t poll_fn;
4014
4015 /* Obtain a Downlink block and make sure it is a paging request */
4016 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4017 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4018 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4019 break;
4020 }
4021
4022 /* This should not happen in general, but who knows... */
4023 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4024 if (not ispresent(req.repeated_pageinfo)) {
4025 setverdict(fail, "Repeated Page Info IE is absent?!?");
4026 break;
4027 }
4028
4029 /* A single message may contain several MIs depending on their type */
4030 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4031 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4032 ps_domain := false);
4033 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4034 ps_domain := false);
4035 if (not f1 and not f2)
4036 { continue; }
4037
4038 /* Detect duplicate MIs */
4039 if (mask[i] == '1'B) {
4040 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4041 continue;
4042 }
4043
4044 mask[i] := '1'B;
4045 }
4046
4047 pending := pending - lengthof(req.repeated_pageinfo);
4048 }
4049
4050 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4051 if (mask[i] != '1'B) {
4052 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4053 log("===== mask := ", mask);
4054 }
4055 }
4056
4057 /* All messages must have been received by now, expect a dummy block */
4058 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4059}
4060
4061private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4062runs on RAW_PCU_Test_CT {
4063 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4064 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4065
4066 /* Initialize NS/BSSGP side */
4067 f_init_bssgp();
4068
4069 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004070 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004071
4072 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4073 f_init_gprs_ms(7 * 8);
4074
4075 /* Initialize the PCU interface abstraction */
4076 f_init_raw(testcasename(), info_ind);
4077
4078 /* Establish BSSGP connection to the PCU */
4079 f_bssgp_establish();
4080 f_multi_ms_bssgp_register();
4081
4082 /* Establish an Uplink TBF for each GprsMS instance */
4083 f_multi_ms_establish_tbf(do_activate := true);
4084}
4085
4086testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4087 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4088
4089 /* Common part: send INFO.ind, establish TBFs... */
4090 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4091
4092 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4093 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4094 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4095 }
4096
4097 /* FIXME: work around a race condition between PCUIF and BSSGP */
4098 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4099
4100 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4101 * The IUT is expected to page on all PDCH slots of all transceivers. */
4102 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4103 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4104 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4105 }
4106
4107 f_shutdown(__BFILE__, __LINE__, final := true);
4108}
4109
4110testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4111 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4112
4113 /* Common part: send INFO.ind, establish TBFs... */
4114 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4115
4116 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4117 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4118 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4119 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4120 }
4121
4122 /* FIXME: work around a race condition between PCUIF and BSSGP */
4123 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4124
4125 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4126 * The IUT is expected to page on all PDCH slots of all transceivers. */
4127 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4128 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4129 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4130 }
4131
4132 f_shutdown(__BFILE__, __LINE__, final := true);
4133}
4134
4135testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4136 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4137
4138 /* Common part: send INFO.ind, establish TBFs... */
4139 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4140
4141 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4142 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4143 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4144 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4145 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4146 } else {
4147 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4148 }
4149 }
4150
4151 /* FIXME: work around a race condition between PCUIF and BSSGP */
4152 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4153
4154 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4155 * The IUT is expected to page on all PDCH slots of all transceivers. */
4156 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4157 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4158 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4159 }
4160
4161 f_shutdown(__BFILE__, __LINE__, final := true);
4162}
4163
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004164private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004165runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4166 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004167 var integer i := 0;
4168 while (true) {
4169 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4170 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4171 break;
4172 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004173 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004174 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4175 f_shutdown(__BFILE__, __LINE__);
4176 }
4177 i := i + 1;
4178 }
4179 return dl_block;
4180}
4181
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004182private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4183runs on RAW_PCU_Test_CT {
4184 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),
4185 info_ind.lac),
4186 info_ind.rac),
4187 info_ind.cell_id));
4188 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4189 423),
4190 2),
4191 5));
4192 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4193 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4194 var template (value) RAN_Information_RIM_Container res_cont :=
4195 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4196 ts_RIM_Sequence_Number(2),
4197 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4198 ts_RIM_Protocol_Version_Number(1),
4199 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4200 omit);
4201 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4202 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4203 res_cont));
4204}
4205
4206altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4207runs on RAW_PCU_Test_CT {
4208 /* RIM procedure: */
4209 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),
4210 info_ind.lac),
4211 info_ind.rac),
4212 info_ind.cell_id));
4213 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4214 423),
4215 2),
4216 5));
4217 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4218 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4219 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4220 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4221 tr_RAN_Information_Request_RIM_Container)) {
4222 if (do_answer) {
4223 f_outbound_nacc_rim_tx_resp(info_ind);
4224 }
4225 if (do_repeat) {
4226 repeat;
4227 }
4228 }
4229}
4230
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004231/* Start NACC from MS side */
4232private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004233 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
4234 boolean skip_final_ctrl_ack := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004235runs on RAW_PCU_Test_CT {
4236 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4237 var RlcmacDlBlock dl_block;
4238 var uint32_t sched_fn;
4239 var GsmArfcn req_arfcn := 862;
4240 var uint6_t req_bsic := 43;
4241
4242 /* Start NACC from MS side */
4243 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4244 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4245
4246 if (exp_rac_ci_query == true) {
4247 /* osmo-pcu should now ask for resolution: */
4248 f_ipa_ctrl_wait_link_up();
4249 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4250 int2str(info_ind.lac) & "." &
4251 int2str(info_ind.cell_id) & "." &
4252 int2str(req_arfcn) & "." &
4253 int2str(req_bsic);
4254 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4255 }
4256
4257 if (exp_si_query == true) {
4258 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004259 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004260 }
4261
4262 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004263 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004264
4265 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4266 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4267 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4268 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4269 f_shutdown(__BFILE__, __LINE__);
4270 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004271 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004272 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004273 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4274 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4275 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004276}
4277
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004278/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4279testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004280 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004281 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004282 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004283
4284 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4285 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4286
4287 /* Initialize NS/BSSGP side */
4288 f_init_bssgp();
4289 /* Initialize GPRS MS side */
4290 f_init_gprs_ms();
4291 ms := g_ms[0]; /* We only use first MS in this test */
4292
4293 /* Initialize the PCU interface abstraction */
4294 f_init_raw(testcasename(), info_ind);
4295
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004296 /* Make sure we are not affected by full cache from previous tests */
4297 f_pcuvty_flush_neigh_caches();
4298
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004299 /* Establish BSSGP connection to the PCU */
4300 f_bssgp_establish();
4301 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4302
4303 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004304 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 +01004305 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4306 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4307
4308 /* Start NACC from MS side */
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004309 f_outbound_nacc_success(ms, info_ind);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004310
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004311 f_shutdown(__BFILE__, __LINE__, final := true);
4312}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004313
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004314/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4315testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4316 var PollFnCtx pollctx;
4317 var GprsMS ms;
4318 var RlcmacDlBlock dl_block;
4319 var uint32_t sched_fn;
4320 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004321
4322 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4323 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4324
4325 /* Initialize NS/BSSGP side */
4326 f_init_bssgp();
4327 /* Initialize GPRS MS side */
4328 f_init_gprs_ms();
4329 ms := g_ms[0]; /* We only use first MS in this test */
4330
4331 /* Initialize the PCU interface abstraction */
4332 f_init_raw(testcasename(), info_ind);
4333
4334 /* Make sure we are not affected by full cache from previous tests */
4335 f_pcuvty_flush_neigh_caches();
4336
4337 /* Establish BSSGP connection to the PCU */
4338 f_bssgp_establish();
4339 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4340
4341 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004342 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 +01004343 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4344 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4345
4346 /* Start NACC from MS side, avoid sending final CTRL ACK */
4347 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true);
4348
4349 /* Wait until we receive something non-dummy */
4350 dl_block := f_skip_dummy(0, sched_fn);
4351 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4352 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4353 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4354 }
4355 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4356 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4357 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4358 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4359 }
4360
4361 f_shutdown(__BFILE__, __LINE__, final := true);
4362}
4363
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004364/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4365testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4366 var PollFnCtx pollctx;
4367 var GprsMS ms;
4368 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004369 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004370
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004371 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4372 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004373
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004374 /* Initialize NS/BSSGP side */
4375 f_init_bssgp();
4376 /* Initialize GPRS MS side */
4377 f_init_gprs_ms();
4378 ms := g_ms[0]; /* We only use first MS in this test */
4379
4380 /* Initialize the PCU interface abstraction */
4381 f_init_raw(testcasename(), info_ind);
4382
4383 /* Make sure we are not affected by full cache from previous tests */
4384 f_pcuvty_flush_neigh_caches();
4385 /* Set timeout values for caches so that entries will be in cache during second try */
4386 f_pcuvty_set_neigh_caches(10, 10);
4387
4388 /* Establish BSSGP connection to the PCU */
4389 f_bssgp_establish();
4390 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4391
4392 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004393 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 +01004394 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4395 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4396
4397 /* Start NACC from MS side */
4398 f_outbound_nacc_success(ms, info_ind);
4399
4400 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
4401 f_outbound_nacc_success(ms, info_ind, false, false);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004402
4403 f_shutdown(__BFILE__, __LINE__, final := true);
4404}
4405
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004406/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4407 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4408 */
4409testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4410 var PollFnCtx pollctx;
4411 var GprsMS ms;
4412 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004413 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4414
4415 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4416 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4417
4418 /* Initialize NS/BSSGP side */
4419 f_init_bssgp();
4420 /* Initialize GPRS MS side */
4421 f_init_gprs_ms();
4422 ms := g_ms[0]; /* We only use first MS in this test */
4423
4424 /* Initialize the PCU interface abstraction */
4425 f_init_raw(testcasename(), info_ind);
4426
4427 /* Make sure we are not affected by full cache from previous tests */
4428 f_pcuvty_flush_neigh_caches();
4429 /* Set timeout values for caches so that entries will be erased before the second try */
4430 f_pcuvty_set_neigh_caches(1, 1);
4431
4432 /* Establish BSSGP connection to the PCU */
4433 f_bssgp_establish();
4434 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4435
4436 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004437 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 +01004438 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4439 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4440
4441 /* Start NACC from MS side */
4442 f_outbound_nacc_success(ms, info_ind);
4443
4444 /* CTRL client should have disconnected from us */
4445 f_ipa_ctrl_wait_link_down();
4446 /* wait for cache entries to time out */
4447 f_sleep(2.0);
4448 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
4449 f_outbound_nacc_success(ms, info_ind);
4450
4451 f_shutdown(__BFILE__, __LINE__, final := true);
4452}
4453
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004454/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004455testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4456 var RlcmacDlBlock dl_block;
4457 var PollFnCtx pollctx;
4458 var uint32_t sched_fn;
4459 var GprsMS ms;
4460 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4461 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004462 var GsmArfcn req_arfcn := 862;
4463 var uint6_t req_bsic := 43;
4464
4465 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4466 * resolution CTRL port, to trigger Conn Refused by socket:
4467 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4468 */
4469
4470 /* Initialize NS/BSSGP side */
4471 f_init_bssgp();
4472 /* Initialize GPRS MS side */
4473 f_init_gprs_ms();
4474 ms := g_ms[0]; /* We only use first MS in this test */
4475
4476 /* Initialize the PCU interface abstraction */
4477 f_init_raw(testcasename(), info_ind);
4478
4479 /* Make sure we are not affected by full cache from previous tests */
4480 f_pcuvty_flush_neigh_caches();
4481
4482 /* Establish BSSGP connection to the PCU */
4483 f_bssgp_establish();
4484 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4485
4486 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004487 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 +01004488 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4489 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4490
4491 /* Start NACC from MS side */
4492 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4493 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4494
4495 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004496 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004497 /* Make sure it is a Pkt Cell Chg Continue */
4498 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4499 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4500 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004501 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4502 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4503 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4504 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4505 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004506
4507 f_shutdown(__BFILE__, __LINE__, final := true);
4508}
4509
4510/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004511testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
4512 var RlcmacDlBlock dl_block;
4513 var PollFnCtx pollctx;
4514 var uint32_t sched_fn;
4515 var GprsMS ms;
4516 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4517 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004518 var GsmArfcn req_arfcn := 862;
4519 var uint6_t req_bsic := 43;
4520
4521 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4522 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4523
4524 /* Initialize NS/BSSGP side */
4525 f_init_bssgp();
4526 /* Initialize GPRS MS side */
4527 f_init_gprs_ms();
4528 ms := g_ms[0]; /* We only use first MS in this test */
4529
4530 /* Initialize the PCU interface abstraction */
4531 f_init_raw(testcasename(), info_ind);
4532
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004533 /* Make sure we are not affected by full cache from previous tests */
4534 f_pcuvty_flush_neigh_caches();
4535
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004536 /* Establish BSSGP connection to the PCU */
4537 f_bssgp_establish();
4538 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4539
4540 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004541 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 +01004542 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4543 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4544
4545 /* Start NACC from MS side */
4546 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4547 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4548
4549 /* osmo-pcu should now ask for resolution: */
4550 f_ipa_ctrl_wait_link_up();
4551 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4552 int2str(info_ind.lac) & "." &
4553 int2str(info_ind.cell_id) & "." &
4554 int2str(req_arfcn) & "." &
4555 int2str(req_bsic);
4556 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
4557 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4558
4559 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004560 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004561 /* Make sure it is a Pkt Cell Chg Continue */
4562 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4563 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4564 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004565 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4566 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4567 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4568 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4569 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004570
4571 f_shutdown(__BFILE__, __LINE__, final := true);
4572}
4573
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004574/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
4575testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
4576 var RlcmacDlBlock dl_block;
4577 var PollFnCtx pollctx;
4578 var uint32_t sched_fn;
4579 var GprsMS ms;
4580 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4581 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004582 var GsmArfcn req_arfcn := 862;
4583 var uint6_t req_bsic := 43;
4584
4585 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4586 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4587
4588 /* Initialize NS/BSSGP side */
4589 f_init_bssgp();
4590 /* Initialize GPRS MS side */
4591 f_init_gprs_ms();
4592 ms := g_ms[0]; /* We only use first MS in this test */
4593
4594 /* Initialize the PCU interface abstraction */
4595 f_init_raw(testcasename(), info_ind);
4596
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004597 /* Make sure we are not affected by full cache from previous tests */
4598 f_pcuvty_flush_neigh_caches();
4599
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004600 /* Establish BSSGP connection to the PCU */
4601 f_bssgp_establish();
4602 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4603
4604 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004605 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 +01004606 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4607 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4608
4609 /* Start NACC from MS side */
4610 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4611 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4612
4613 /* osmo-pcu should now ask for resolution: */
4614 f_ipa_ctrl_wait_link_up();
4615 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4616 int2str(info_ind.lac) & "." &
4617 int2str(info_ind.cell_id) & "." &
4618 int2str(req_arfcn) & "." &
4619 int2str(req_bsic);
4620 /* we receive RAC+CI resolution request and we send incorrectlt formated response */
4621 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
4622
4623 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004624 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004625 /* Make sure it is a Pkt Cell Chg Continue */
4626 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4627 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4628 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004629 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4630 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4631 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4632 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4633 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004634
4635 f_shutdown(__BFILE__, __LINE__, final := true);
4636}
4637
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004638/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
4639testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
4640 var RlcmacDlBlock dl_block;
4641 var PollFnCtx pollctx;
4642 var uint32_t sched_fn;
4643 var GprsMS ms;
4644 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4645 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004646 var GsmArfcn req_arfcn := 862;
4647 var uint6_t req_bsic := 43;
4648 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 */
4649 info_ind.lac),
4650 info_ind.rac),
4651 info_ind.cell_id));
4652 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4653 423),
4654 2),
4655 5));
4656 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
4657 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
4658
4659 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4660 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4661
4662 /* Initialize NS/BSSGP side */
4663 f_init_bssgp();
4664 /* Initialize GPRS MS side */
4665 f_init_gprs_ms();
4666 ms := g_ms[0]; /* We only use first MS in this test */
4667
4668 /* Initialize the PCU interface abstraction */
4669 f_init_raw(testcasename(), info_ind);
4670
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004671 /* Make sure we are not affected by full cache from previous tests */
4672 f_pcuvty_flush_neigh_caches();
4673
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004674 /* Establish BSSGP connection to the PCU */
4675 f_bssgp_establish();
4676 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4677
4678 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004679 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 +01004680 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4681 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4682
4683 /* Start NACC from MS side */
4684 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4685 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4686
4687 /* osmo-pcu should now ask for resolution: */
4688 f_ipa_ctrl_wait_link_up();
4689 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4690 int2str(info_ind.lac) & "." &
4691 int2str(info_ind.cell_id) & "." &
4692 int2str(req_arfcn) & "." &
4693 int2str(req_bsic);
4694 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4695
4696 /* RIM procedure: */
4697 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4698 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4699 tr_RAN_Information_Request_RIM_Container));
4700 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
4701
4702 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004703 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004704 /* Make sure it is a Pkt Cell Chg Continue */
4705 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4706 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4707 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004708 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4709 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4710 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4711 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4712 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004713
4714 f_shutdown(__BFILE__, __LINE__, final := true);
4715}
4716
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004717/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
4718testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
4719 var PollFnCtx pollctx;
4720 var GprsMS ms;
4721 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4722 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4723 var RlcmacDlBlock dl_block;
4724 var uint32_t sched_fn;
4725 var CtrlMessage rx_ctrl;
4726 var GsmArfcn req_arfcn := 862;
4727 var uint6_t req_bsic := 43;
4728
4729 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4730 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4731
4732 /* Initialize NS/BSSGP side */
4733 f_init_bssgp();
4734 /* Initialize GPRS MS side */
4735 f_init_gprs_ms();
4736 ms := g_ms[0]; /* We only use first MS in this test */
4737
4738 /* Initialize the PCU interface abstraction */
4739 f_init_raw(testcasename(), info_ind);
4740
4741 /* Make sure we are not affected by full cache from previous tests */
4742 f_pcuvty_flush_neigh_caches();
4743
4744 /* Establish BSSGP connection to the PCU */
4745 f_bssgp_establish();
4746 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4747
4748 /* Send PACKET RESOURCE REQUEST */
4749 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4750 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4751 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4752
4753 /* Start NACC from MS side */
4754 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4755 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4756
4757 /* osmo-pcu should now ask for resolution: */
4758 f_ipa_ctrl_wait_link_up();
4759 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4760 int2str(info_ind.lac) & "." &
4761 int2str(info_ind.cell_id) & "." &
4762 int2str(req_arfcn) & "." &
4763 int2str(req_bsic);
4764 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4765 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
4766 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4767 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4768 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4769 timer T := 2.0;
4770 T.start;
4771 alt {
4772 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
4773 [] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
4774 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
4775 f_shutdown(__BFILE__, __LINE__);
4776 }
4777 [] T.timeout {
4778 setverdict(pass);
4779 }
4780 }
4781
4782 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004783 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004784
4785 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4786 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4787 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4788 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4789 f_shutdown(__BFILE__, __LINE__);
4790 }
4791 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4792 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4793 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4794 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4795 }
4796
4797 f_shutdown(__BFILE__, __LINE__, final := true);
4798}
4799
4800/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
4801testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
4802 var PollFnCtx pollctx;
4803 var GprsMS ms;
4804 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4805 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4806 var RlcmacDlBlock dl_block;
4807 var uint32_t sched_fn;
4808 var CtrlMessage rx_ctrl;
4809 var GsmArfcn req_arfcn := 862;
4810 var uint6_t req_bsic := 43;
4811
4812 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4813 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4814
4815 /* Initialize NS/BSSGP side */
4816 f_init_bssgp();
4817 /* Initialize GPRS MS side */
4818 f_init_gprs_ms();
4819 ms := g_ms[0]; /* We only use first MS in this test */
4820
4821 /* Initialize the PCU interface abstraction */
4822 f_init_raw(testcasename(), info_ind);
4823
4824 /* Make sure we are not affected by full cache from previous tests */
4825 f_pcuvty_flush_neigh_caches();
4826
4827 /* Establish BSSGP connection to the PCU */
4828 f_bssgp_establish();
4829 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4830
4831 /* Send PACKET RESOURCE REQUEST */
4832 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4833 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4834 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4835
4836 /* Start NACC from MS side */
4837 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4838 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4839
4840 /* osmo-pcu should now ask for resolution: */
4841 f_ipa_ctrl_wait_link_up();
4842 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4843 int2str(info_ind.lac) & "." &
4844 int2str(info_ind.cell_id) & "." &
4845 int2str(req_arfcn) & "." &
4846 int2str(req_bsic);
4847 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4848 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4849 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
4850 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4851 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4852 f_outbound_nacc_rim_tx_resp(info_ind);
4853 timer T := 1.0;
4854 T.start;
4855 alt {
4856 [] RIM.receive {
4857 setverdict(fail, "Received unexpected RIM message");
4858 f_shutdown(__BFILE__, __LINE__);
4859 }
4860 [] T.timeout {
4861 setverdict(pass);
4862 }
4863 }
4864
4865 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004866 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004867
4868 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4869 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4870 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4871 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4872 f_shutdown(__BFILE__, __LINE__);
4873 }
4874 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4875 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4876 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4877 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4878 }
4879
4880 f_shutdown(__BFILE__, __LINE__, final := true);
4881}
4882
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01004883/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
4884testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
4885 var PollFnCtx pollctx;
4886 var GprsMS ms;
4887 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4888 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4889 var RlcmacDlBlock dl_block;
4890 var uint32_t sched_fn;
4891 var CtrlMessage rx_ctrl;
4892 var GsmArfcn req_arfcn := 862;
4893 var uint6_t req_bsic := 43;
4894
4895 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4896 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4897
4898 /* Initialize NS/BSSGP side */
4899 f_init_bssgp();
4900 /* Initialize GPRS MS side */
4901 f_init_gprs_ms();
4902 ms := g_ms[0]; /* We only use first MS in this test */
4903
4904 /* Initialize the PCU interface abstraction */
4905 f_init_raw(testcasename(), info_ind);
4906
4907 /* Make sure we are not affected by full cache from previous tests */
4908 f_pcuvty_flush_neigh_caches();
4909
4910 /* Establish BSSGP connection to the PCU */
4911 f_bssgp_establish();
4912 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4913
4914 /* Send PACKET RESOURCE REQUEST */
4915 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4916 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4917 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4918
4919 /* Start NACC from MS side */
4920 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4921 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4922
4923 /* osmo-pcu should now ask for resolution: */
4924 f_ipa_ctrl_wait_link_up();
4925 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4926 int2str(info_ind.lac) & "." &
4927 int2str(info_ind.cell_id) & "." &
4928 int2str(req_arfcn) & "." &
4929 int2str(req_bsic);
4930 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4931 /* RIM procedure: */
4932 as_outbound_nacc_rim_resolve(info_ind);
4933
4934 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
4935 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
4936 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4937
4938 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
4939 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
4940
4941 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4942 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4943 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4944 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4945 f_shutdown(__BFILE__, __LINE__);
4946 }
4947 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4948 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4949 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4950 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4951 }
4952}
4953
4954/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
4955testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
4956 var PollFnCtx pollctx;
4957 var GprsMS ms;
4958 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4959 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4960 var RlcmacDlBlock dl_block;
4961 var uint32_t sched_fn;
4962 var CtrlMessage rx_ctrl;
4963 var GsmArfcn req_arfcn := 862;
4964 var uint6_t req_bsic := 43;
4965
4966 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4967 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4968
4969 /* Initialize NS/BSSGP side */
4970 f_init_bssgp();
4971 /* Initialize GPRS MS side */
4972 f_init_gprs_ms();
4973 ms := g_ms[0]; /* We only use first MS in this test */
4974
4975 /* Initialize the PCU interface abstraction */
4976 f_init_raw(testcasename(), info_ind);
4977
4978 /* Make sure we are not affected by full cache from previous tests */
4979 f_pcuvty_flush_neigh_caches();
4980
4981 /* Establish BSSGP connection to the PCU */
4982 f_bssgp_establish();
4983 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4984
4985 /* Send PACKET RESOURCE REQUEST */
4986 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4987 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4988 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4989
4990 /* Start NACC from MS side */
4991 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4992 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4993
4994 /* osmo-pcu should now ask for resolution: */
4995 f_ipa_ctrl_wait_link_up();
4996 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4997 int2str(info_ind.lac) & "." &
4998 int2str(info_ind.cell_id) & "." &
4999 int2str(req_arfcn) & "." &
5000 int2str(req_bsic);
5001 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5002 /* RIM procedure: */
5003 as_outbound_nacc_rim_resolve(info_ind);
5004
5005 /* Announce SI back to MS, continue NACC procedure */
5006 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5007
5008 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5009 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5010
5011 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5012 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5013 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5014 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5015 f_shutdown(__BFILE__, __LINE__);
5016 }
5017 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5018 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5019 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5020 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5021 }
5022}
5023
5024/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5025testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
5026 var PollFnCtx pollctx;
5027 var GprsMS ms;
5028 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5029 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5030 var RlcmacDlBlock dl_block;
5031 var uint32_t sched_fn;
5032 var CtrlMessage rx_ctrl;
5033 var GsmArfcn req_arfcn := 862;
5034 var uint6_t req_bsic := 43;
5035
5036 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5037 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5038
5039 /* Initialize NS/BSSGP side */
5040 f_init_bssgp();
5041 /* Initialize GPRS MS side */
5042 f_init_gprs_ms();
5043 ms := g_ms[0]; /* We only use first MS in this test */
5044
5045 /* Initialize the PCU interface abstraction */
5046 f_init_raw(testcasename(), info_ind);
5047
5048 /* Make sure we are not affected by full cache from previous tests */
5049 f_pcuvty_flush_neigh_caches();
5050
5051 /* Establish BSSGP connection to the PCU */
5052 f_bssgp_establish();
5053 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5054
5055 /* Send PACKET RESOURCE REQUEST */
5056 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5057 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5058 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5059
5060 /* Start NACC from MS side */
5061 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5062 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5063
5064 /* osmo-pcu should now ask for resolution: */
5065 f_ipa_ctrl_wait_link_up();
5066 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5067 int2str(info_ind.lac) & "." &
5068 int2str(info_ind.cell_id) & "." &
5069 int2str(req_arfcn) & "." &
5070 int2str(req_bsic);
5071 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5072 /* RIM procedure: */
5073 as_outbound_nacc_rim_resolve(info_ind);
5074
5075 /* Announce SI back to MS, continue NACC procedure */
5076 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5077
5078 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5079 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5080 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5081 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5082 f_shutdown(__BFILE__, __LINE__);
5083 }
5084 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5085 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5086
5087 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5088 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5089 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5090 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5091 }
5092}
5093
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005094/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5095 * while waiting for CTRL resolution */
5096testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5097 var PollFnCtx pollctx;
5098 var GprsMS ms;
5099 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5100 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5101 var RlcmacDlBlock dl_block;
5102 var uint32_t sched_fn;
5103 var CtrlMessage rx_ctrl;
5104 var GsmArfcn req_arfcn := 862;
5105 var uint6_t req_bsic := 43;
5106
5107 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5108 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5109
5110 /* Initialize NS/BSSGP side */
5111 f_init_bssgp();
5112 /* Initialize GPRS MS side */
5113 f_init_gprs_ms();
5114 ms := g_ms[0]; /* We only use first MS in this test */
5115
5116 /* Initialize the PCU interface abstraction */
5117 f_init_raw(testcasename(), info_ind);
5118
5119 /* Make sure we are not affected by full cache from previous tests */
5120 f_pcuvty_flush_neigh_caches();
5121
5122 /* Establish BSSGP connection to the PCU */
5123 f_bssgp_establish();
5124 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5125
5126 /* Send PACKET RESOURCE REQUEST */
5127 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5128 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5129 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5130
5131 /* Start NACC from MS side */
5132 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5133 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5134
5135 /* osmo-pcu should now ask for resolution: */
5136 f_ipa_ctrl_wait_link_up();
5137 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5138 int2str(info_ind.lac) & "." &
5139 int2str(info_ind.cell_id) & "." &
5140 int2str(req_arfcn) & "." &
5141 int2str(req_bsic);
5142 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5143 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5144 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5145 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5146 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5147 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5148 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
5149 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5150 int2str(info_ind.lac) & "." &
5151 int2str(info_ind.cell_id) & "." &
5152 int2str(req_arfcn + 1) & "." &
5153 int2str(req_bsic + 1);
5154 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5155
5156 /* And finally everything continues as usual with RIN procedure */
5157 as_outbound_nacc_rim_resolve(info_ind);
5158
5159 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005160 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005161
5162 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5163 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5164 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5165 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5166 f_shutdown(__BFILE__, __LINE__);
5167 }
5168 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5169 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5170 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5171 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5172 }
5173
5174 f_shutdown(__BFILE__, __LINE__, final := true);
5175}
5176
5177/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5178 * while waiting for SI resolution */
5179testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5180 var PollFnCtx pollctx;
5181 var GprsMS ms;
5182 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5183 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5184 var RlcmacDlBlock dl_block;
5185 var uint32_t sched_fn;
5186 var CtrlMessage rx_ctrl;
5187 var GsmArfcn req_arfcn := 862;
5188 var uint6_t req_bsic := 43;
5189
5190 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5191 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5192
5193 /* Initialize NS/BSSGP side */
5194 f_init_bssgp();
5195 /* Initialize GPRS MS side */
5196 f_init_gprs_ms();
5197 ms := g_ms[0]; /* We only use first MS in this test */
5198
5199 /* Initialize the PCU interface abstraction */
5200 f_init_raw(testcasename(), info_ind);
5201
5202 /* Make sure we are not affected by full cache from previous tests */
5203 f_pcuvty_flush_neigh_caches();
5204
5205 /* Establish BSSGP connection to the PCU */
5206 f_bssgp_establish();
5207 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5208
5209 /* Send PACKET RESOURCE REQUEST */
5210 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5211 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5212 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5213
5214 /* Start NACC from MS side */
5215 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5216 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5217
5218 /* osmo-pcu should now ask for resolution: */
5219 f_ipa_ctrl_wait_link_up();
5220 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5221 int2str(info_ind.lac) & "." &
5222 int2str(info_ind.cell_id) & "." &
5223 int2str(req_arfcn) & "." &
5224 int2str(req_bsic);
5225 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5226 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5227 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5228 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5229 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5230 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5231 f_outbound_nacc_rim_tx_resp(info_ind);
5232
5233 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
5234 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5235 int2str(info_ind.lac) & "." &
5236 int2str(info_ind.cell_id) & "." &
5237 int2str(req_arfcn + 1) & "." &
5238 int2str(req_bsic + 1);
5239 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5240
5241 /* And finally everything continues as usual with RIN procedure */
5242 as_outbound_nacc_rim_resolve(info_ind);
5243
5244 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005245 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005246
5247 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5248 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5249 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5250 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5251 f_shutdown(__BFILE__, __LINE__);
5252 }
5253 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5254 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5255 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5256 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5257 }
5258
5259 f_shutdown(__BFILE__, __LINE__, final := true);
5260}
5261
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005262/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5263 * while sending Pkt Neigh Data Change */
5264testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5265 var PollFnCtx pollctx;
5266 var GprsMS ms;
5267 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5268 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5269 var RlcmacDlBlock dl_block;
5270 var uint32_t sched_fn;
5271 var CtrlMessage rx_ctrl;
5272 var GsmArfcn req_arfcn := 862;
5273 var uint6_t req_bsic := 43;
5274
5275 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5276 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5277
5278 /* Initialize NS/BSSGP side */
5279 f_init_bssgp();
5280 /* Initialize GPRS MS side */
5281 f_init_gprs_ms();
5282 ms := g_ms[0]; /* We only use first MS in this test */
5283
5284 /* Initialize the PCU interface abstraction */
5285 f_init_raw(testcasename(), info_ind);
5286
5287 /* Make sure we are not affected by full cache from previous tests */
5288 f_pcuvty_flush_neigh_caches();
5289
5290 /* Establish BSSGP connection to the PCU */
5291 f_bssgp_establish();
5292 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5293
5294 /* Send PACKET RESOURCE REQUEST */
5295 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5296 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5297 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5298
5299 /* Start NACC from MS side */
5300 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5301 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5302
5303 /* osmo-pcu should now ask for resolution: */
5304 f_ipa_ctrl_wait_link_up();
5305 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5306 int2str(info_ind.lac) & "." &
5307 int2str(info_ind.cell_id) & "." &
5308 int2str(req_arfcn) & "." &
5309 int2str(req_bsic);
5310 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5311 /* RIM procedure: */
5312 as_outbound_nacc_rim_resolve(info_ind);
5313
5314 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5315 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5316 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5317 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5318
5319 /* It should trigger RAC_CI resolution to start again: */
5320 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5321 int2str(info_ind.lac) & "." &
5322 int2str(info_ind.cell_id) & "." &
5323 int2str(req_arfcn + 1) & "." &
5324 int2str(req_bsic + 1);
5325 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5326 /* RIM procedure: */
5327 as_outbound_nacc_rim_resolve(info_ind);
5328 /* Transmit SI back to MS */
5329 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5330
5331 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5332 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5333 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5334 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5335 f_shutdown(__BFILE__, __LINE__);
5336 }
5337 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5338 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5339 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5340 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5341 }
5342}
5343
5344/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5345testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5346 var PollFnCtx pollctx;
5347 var GprsMS ms;
5348 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5349 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5350 var RlcmacDlBlock dl_block;
5351 var uint32_t sched_fn;
5352 var CtrlMessage rx_ctrl;
5353 var GsmArfcn req_arfcn := 862;
5354 var uint6_t req_bsic := 43;
5355
5356 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5357 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5358
5359 /* Initialize NS/BSSGP side */
5360 f_init_bssgp();
5361 /* Initialize GPRS MS side */
5362 f_init_gprs_ms();
5363 ms := g_ms[0]; /* We only use first MS in this test */
5364
5365 /* Initialize the PCU interface abstraction */
5366 f_init_raw(testcasename(), info_ind);
5367
5368 /* Make sure we are not affected by full cache from previous tests */
5369 f_pcuvty_flush_neigh_caches();
5370
5371 /* Establish BSSGP connection to the PCU */
5372 f_bssgp_establish();
5373 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5374
5375 /* Send PACKET RESOURCE REQUEST */
5376 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5377 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5378 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5379
5380 /* Start NACC from MS side */
5381 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5382 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5383
5384 /* osmo-pcu should now ask for resolution: */
5385 f_ipa_ctrl_wait_link_up();
5386 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5387 int2str(info_ind.lac) & "." &
5388 int2str(info_ind.cell_id) & "." &
5389 int2str(req_arfcn) & "." &
5390 int2str(req_bsic);
5391 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5392 /* RIM procedure: */
5393 as_outbound_nacc_rim_resolve(info_ind);
5394
5395 /* Announce SI back to MS, continue NACC procedure */
5396 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5397
5398 /* trigger a Pkt Cell Change Notif with different tgt cell */
5399 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5400 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5401
5402 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5403 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5404
5405 /* It should trigger RAC_CI resolution to start again: */
5406 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5407 int2str(info_ind.lac) & "." &
5408 int2str(info_ind.cell_id) & "." &
5409 int2str(req_arfcn + 1) & "." &
5410 int2str(req_bsic + 1);
5411 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5412 /* RIM procedure: */
5413 as_outbound_nacc_rim_resolve(info_ind);
5414 /* Transmit SI back to MS */
5415 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5416
5417 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5418 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5419 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5420 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5421 f_shutdown(__BFILE__, __LINE__);
5422 }
5423 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5424 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5425 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5426 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5427 }
5428}
5429
5430/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5431testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5432 var PollFnCtx pollctx;
5433 var GprsMS ms;
5434 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5435 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5436 var RlcmacDlBlock dl_block;
5437 var uint32_t sched_fn;
5438 var CtrlMessage rx_ctrl;
5439 var GsmArfcn req_arfcn := 862;
5440 var uint6_t req_bsic := 43;
5441
5442 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5443 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5444
5445 /* Initialize NS/BSSGP side */
5446 f_init_bssgp();
5447 /* Initialize GPRS MS side */
5448 f_init_gprs_ms();
5449 ms := g_ms[0]; /* We only use first MS in this test */
5450
5451 /* Initialize the PCU interface abstraction */
5452 f_init_raw(testcasename(), info_ind);
5453
5454 /* Make sure we are not affected by full cache from previous tests */
5455 f_pcuvty_flush_neigh_caches();
5456
5457 /* Establish BSSGP connection to the PCU */
5458 f_bssgp_establish();
5459 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5460
5461 /* Send PACKET RESOURCE REQUEST */
5462 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5463 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5464 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5465
5466 /* Start NACC from MS side */
5467 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5468 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5469
5470 /* osmo-pcu should now ask for resolution: */
5471 f_ipa_ctrl_wait_link_up();
5472 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5473 int2str(info_ind.lac) & "." &
5474 int2str(info_ind.cell_id) & "." &
5475 int2str(req_arfcn) & "." &
5476 int2str(req_bsic);
5477 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5478 /* RIM procedure: */
5479 as_outbound_nacc_rim_resolve(info_ind);
5480
5481 /* Announce SI back to MS, continue NACC procedure */
5482 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5483
5484 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5485 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5486 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5487 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5488 f_shutdown(__BFILE__, __LINE__);
5489 }
5490
5491 /* trigger a Pkt Cell Change Notif with different tgt cell */
5492 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5493 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5494
5495 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5496 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5497 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5498 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5499 }
5500 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5501 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
5502
5503 /* It should trigger RAC_CI resolution to start again: */
5504 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5505 int2str(info_ind.lac) & "." &
5506 int2str(info_ind.cell_id) & "." &
5507 int2str(req_arfcn + 1) & "." &
5508 int2str(req_bsic + 1);
5509 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5510 /* RIM procedure: */
5511 as_outbound_nacc_rim_resolve(info_ind);
5512 /* Transmit SI back to MS */
5513 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5514
5515 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5516 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5517 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5518 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5519 f_shutdown(__BFILE__, __LINE__);
5520 }
5521 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5522 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5523 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5524 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5525 }
5526}
5527
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005528/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
5529testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
5530 var PollFnCtx pollctx;
5531 var GprsMS ms;
5532 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5533 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5534 var RlcmacDlBlock dl_block;
5535 var uint32_t sched_fn, dl_fn;
5536 var CtrlMessage rx_ctrl;
5537 var GsmArfcn req_arfcn := 862;
5538 var uint6_t req_bsic := 43;
5539 var octetstring data := f_rnd_octstring(10);
5540
5541 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5542 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5543
5544 /* Initialize NS/BSSGP side */
5545 f_init_bssgp();
5546 /* Initialize GPRS MS side */
5547 f_init_gprs_ms();
5548 ms := g_ms[0]; /* We only use first MS in this test */
5549
5550 /* Initialize the PCU interface abstraction */
5551 f_init_raw(testcasename(), info_ind);
5552
5553 /* Make sure we are not affected by full cache from previous tests */
5554 f_pcuvty_flush_neigh_caches();
5555
5556 /* Establish BSSGP connection to the PCU */
5557 f_bssgp_establish();
5558 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5559
5560 /* Send PACKET RESOURCE REQUEST */
5561 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5562 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5563 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5564
5565 /* Start NACC from MS side */
5566 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5567 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5568
5569 /* osmo-pcu should now ask for resolution: */
5570 f_ipa_ctrl_wait_link_up();
5571 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5572 int2str(info_ind.lac) & "." &
5573 int2str(info_ind.cell_id) & "." &
5574 int2str(req_arfcn) & "." &
5575 int2str(req_bsic);
5576 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5577 /* RIM procedure: */
5578 as_outbound_nacc_rim_resolve(info_ind);
5579
5580 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
5581 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
5582 f_sleep(0.1);
5583 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
5584 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
5585
5586 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
5587 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5588 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
5589 * Data with unassigned DL TBF in line above): */
5590 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5591 /* Continue receiving Pkt Cell Neighbor Data */
5592 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5593
5594 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5595 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5596 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5597 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5598 f_shutdown(__BFILE__, __LINE__);
5599 }
5600 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5601 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5602 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5603 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5604 }
5605
5606 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
5607 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
5608 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
5609 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
5610 f_dl_block_ack_fn(dl_block, dl_fn));
5611}
5612
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005613/* Send a RIM RAN info request to the PCU and verify the response, we expect
5614 * getting the system information back which we have transfered to the PCU via
5615 * PCUIF on startup. */
5616testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
5617 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005618 timer T := 2.0;
5619
5620 /* Initialize NS/BSSGP side */
5621 f_init_bssgp();
5622
5623 /* Initialize the PCU interface abstraction */
5624 f_init_raw(testcasename());
5625
5626 /* Establish BSSGP connection to the PCU */
5627 f_bssgp_establish();
5628
5629 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005630 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 +01005631 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005632 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 +01005633 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02005634 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);
5635 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005636 f_sleep(1.0);
5637
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005638 var RIM_Routing_Address dst_addr;
5639 var RIM_Routing_Address src_addr;
5640 var template (value) RAN_Information_Request_RIM_Container req_cont;
5641 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005642 var template PDU_BSSGP bssgp_rim_pdu_expect;
5643 var template RAN_Information_RIM_Container rim_cont_expect;
5644
5645 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 +01005646 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5647 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005648
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005649 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5650 ts_RIM_Sequence_Number(1),
5651 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5652 ts_RIM_Protocol_Version_Number(1),
5653 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5654 omit);
5655 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5656 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5657 req_cont);
5658
5659 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5660 tr_RIM_Sequence_Number(1),
5661 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5662 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005663 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 +01005664 omit);
5665
5666 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5667 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5668 rim_cont_expect);
5669 RIM.send(bssgp_rim_pdu);
5670 T.start;
5671 alt {
5672 [] RIM.receive(bssgp_rim_pdu_expect) { }
5673 [] RIM.receive {
5674 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5675 }
5676 [] T.timeout {
5677 setverdict(fail, "No BSSGP RIM PDU received");
5678 mtc.stop;
5679 }
5680 }
5681
5682 f_shutdown(__BFILE__, __LINE__, final := true);
5683}
5684
5685/* Same as above, but in this case we simulate the rare case in which the PCU
5686 * has no system information available. We expect getting a response back but
5687 * with no system information inside. */
5688testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005689 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005690 var PCUIF_Message pcu_msg;
5691 timer T := 2.0;
5692
5693 /* Initialize NS/BSSGP side */
5694 f_init_bssgp();
5695
5696 /* Initialize the PCU interface abstraction */
5697 f_init_raw(testcasename(), info_ind);
5698
5699 /* Establish BSSGP connection to the PCU */
5700 f_bssgp_establish();
5701
5702 /* Clear sysinfo from the PCU */
5703 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);
5704 BTS.send(si1_data_ind);
5705 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);
5706 BTS.send(si3_data_ind);
5707 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);
5708 BTS.send(si16_data_ind);
5709 f_sleep(1.0);
5710
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005711 var RIM_Routing_Address dst_addr;
5712 var RIM_Routing_Address src_addr;
5713 var template (value) RAN_Information_Request_RIM_Container req_cont;
5714 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005715 var template PDU_BSSGP bssgp_rim_pdu_expect;
5716 var template RAN_Information_RIM_Container rim_cont_expect;
5717
5718 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 +01005719 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5720 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005721
5722 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5723 ts_RIM_Sequence_Number(1),
5724 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5725 ts_RIM_Protocol_Version_Number(1),
5726 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5727 omit);
5728 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5729 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5730 req_cont);
5731
5732
5733 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5734 tr_RIM_Sequence_Number(1),
5735 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5736 tr_RIM_Protocol_Version_Number(1),
5737 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
5738 omit);
5739
5740 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5741 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5742 rim_cont_expect);
5743 RIM.send(bssgp_rim_pdu);
5744 T.start;
5745 alt {
5746 [] RIM.receive(bssgp_rim_pdu_expect) { }
5747 [] RIM.receive {
5748 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5749 }
5750 [] T.timeout {
5751 setverdict(fail, "No BSSGP RIM PDU received");
5752 mtc.stop;
5753 }
5754 }
5755
5756 f_shutdown(__BFILE__, __LINE__, final := true);
5757}
5758
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005759control {
5760 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01005761 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005762 execute( TC_ta_ptcch_idle() );
5763 execute( TC_ta_rach_imm_ass() );
5764 execute( TC_ta_idle_dl_tbf_ass() );
5765 execute( TC_ta_ptcch_ul_multi_tbf() );
5766 execute( TC_cs_lqual_ul_tbf() );
5767 execute( TC_cs_initial_ul() );
5768 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01005769 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01005770 execute( TC_cs_max_dl() );
5771 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01005772 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01005773 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01005774 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01005775 execute( TC_mcs_max_dl() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005776 execute( TC_t3169() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01005777 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02005778 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01005779 execute( TC_x2031_t3191() );
5780 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005781 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01005782 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02005783 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02005784 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02005785 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005786 execute( TC_mo_ping_pong() );
5787 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02005788 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005789 execute( TC_mt_ping_pong() );
5790 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005791 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005792 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07005793 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005794 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01005795 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005796 execute( TC_paging_cs_from_bts() );
5797 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
5798 execute( TC_paging_cs_from_sgsn_sign() );
5799 execute( TC_paging_cs_from_sgsn_ptp() );
5800 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
5801 execute( TC_paging_ps_from_sgsn_sign() );
5802 execute( TC_paging_ps_from_sgsn_ptp() );
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005803 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
5804 execute( TC_paging_cs_multi_ms_imsi() );
5805 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02005806 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
5807 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01005808 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
5809 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005810
5811 /* EGPRS specific test cases */
5812 execute( TC_egprs_pkt_chan_req_signalling() );
5813 execute( TC_egprs_pkt_chan_req_one_phase() );
5814 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07005815 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07005816 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07005817 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02005818
5819 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005820
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01005821 /* Immediate Assignment on AGCH/PCH */
5822 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
5823 execute( TC_pcuif_fh_imm_ass_ul() );
5824 execute( TC_pcuif_fh_imm_ass_dl() );
5825 /* Packet Uplink/Downlink Assignment on PACCH */
5826 execute( TC_pcuif_fh_pkt_ass_ul() );
5827 execute( TC_pcuif_fh_pkt_ass_dl() );
5828 execute( TC_multitrx_multims_alloc() );
5829 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
5830 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
5831 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
5832
Pau Espin Pedrole1303052020-11-16 11:13:51 +01005833 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07005834
5835 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005836 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005837 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005838 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005839 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005840 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005841 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005842 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005843 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005844 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
5845 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005846 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
5847 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
5848 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005849 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
5850 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005851 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
5852 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
5853 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005854 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005855
5856 execute( TC_rim_ran_info_req_single_rep() );
5857 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005858}
5859
Harald Weltea419df22019-03-21 17:23:04 +01005860}