blob: 333a68d31b31a087dba9ca98e15c209bb09bd40a [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 Pedrolf30fa1d2021-03-03 19:55:11 +01001273/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1274 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1275 * T3169. See OS#5033 */
1276testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1277 var PCUIF_info_ind info_ind;
1278 var template (value) TsTrxBtsNum nr;
1279 var BTS_PDTCH_Block data_msg;
1280 var GprsMS ms;
1281 var uint3_t rx_usf;
1282 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1283 var integer n3101 := 0;
1284 timer T_3169 := 1.0;
1285
1286 /* Initialize NS/BSSGP side */
1287 f_init_bssgp();
1288 /* Initialize GPRS MS side */
1289 f_init_gprs_ms();
1290 ms := g_ms[0]; /* We only use first MS in this test */
1291
1292 /* Initialize the PCU interface abstraction */
1293 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1294 info_ind.n3101 := N3101_MAX;
1295 info_ind.t3169 := 1;
1296 f_init_raw(testcasename(), info_ind);
1297
1298 /* Establish BSSGP connection to the PCU */
1299 f_bssgp_establish();
1300 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1301
1302 /* Establish UL TBF */
1303 f_ms_establish_ul_tbf(ms);
1304
1305 /* Now we wait for PCU to transmit our USF */
1306 nr := ts_TsTrxBtsNum;
1307 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1308 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1309 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1310 block_nr := nr.blk_nr));
1311
1312 alt {
1313 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1314 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1315 ?)) -> value data_msg {
1316 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1317 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1318 f_shutdown(__BFILE__, __LINE__);
1319 }
1320
1321 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1322 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1323 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1324 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001325 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1326 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001327 f_shutdown(__BFILE__, __LINE__);
1328 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001329 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001330 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1331 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1332 if (not T_3169.running) {
1333 log("T3169 started");
1334 T_3169.start;
1335 }
1336 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1337 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1338 f_shutdown(__BFILE__, __LINE__);
1339 } else {
1340 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1341 }
1342 nr := ts_TsTrxBtsNum;
1343 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1344 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1345 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1346 block_nr := nr.blk_nr));
1347 repeat;
1348 }
1349 [] T_3169.timeout {
1350 log("T_3169 expired");
1351 /* Done in alt */
1352 }
1353 [] BTS.receive {
1354 setverdict(fail, "Unexpected BTS message");
1355 f_shutdown(__BFILE__, __LINE__);
1356 }
1357 }
1358
1359 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1360 /* USFs as per previous TBF since they were freed at expiration time: */
1361 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1362 var uint5_t old_tfi := ms.ul_tbf.tfi;
1363 f_ms_establish_ul_tbf(ms);
1364 if (old_tfi != ms.ul_tbf.tfi) {
1365 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1366 f_shutdown(__BFILE__, __LINE__);
1367 }
1368 for (var integer i := 0; i < 8; i := i +1) {
1369 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1370 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1371 f_shutdown(__BFILE__, __LINE__);
1372 }
1373 }
1374
1375 f_shutdown(__BFILE__, __LINE__, final := true);
1376}
1377
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001378
1379/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1380 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1381 the final UL ACK sent at us. */
1382testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1383 var PCUIF_info_ind info_ind;
1384 var BTS_PDTCH_Block data_msg;
1385 var RlcmacDlBlock dl_block;
1386 var uint32_t sched_fn;
1387 var template (value) TsTrxBtsNum nr;
1388 var template RlcmacDlBlock exp_ul_ack;
1389 var template UlAckNackGprs exp_ul_ack_sub;
1390 var GprsMS ms;
1391 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1392 var integer N3103 := 0;
1393 timer T_3169 := 1.0;
1394
1395 /* Initialize GPRS MS side */
1396 f_init_gprs_ms();
1397 ms := g_ms[0]; /* We only use first MS in this test */
1398
1399 /* Initialize the PCU interface abstraction */
1400 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1401 info_ind.n3103 := N3103_MAX;
1402 info_ind.t3169 := 1;
1403 f_init_raw(testcasename(), info_ind);
1404
1405 /* Establish an Uplink TBF */
1406 f_ms_establish_ul_tbf(ms);
1407
Pau Espin Pedrol93ae4522021-05-11 15:58:26 +02001408 f_ms_tx_ul_data_block_multi(ms, 5, with_tlli := true);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001409 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1410 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1411
1412 nr := ts_TsTrxBtsNum;
1413 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1414 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1415 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1416 block_nr := nr.blk_nr));
1417 alt {
1418 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1419 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1420 exp_ul_ack)) -> value data_msg {
1421 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1422 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1423 f_shutdown(__BFILE__, __LINE__);
1424 }
1425
1426 nr := ts_TsTrxBtsNum;
1427 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1428 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1429 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1430 block_nr := nr.blk_nr));
1431 N3103 := N3103 + 1;
1432 if (N3103 == N3103_MAX) {
1433 /* At this point in time (N3103_MAX reached), PCU is
1434 * moving the TBF to RELEASE state so no data/ctrl for
1435 * it is tx'ed, hence the dummy blocks: */
1436 T_3169.start;
1437 }
1438 repeat;
1439 }
1440 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1441 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1442 exp_ul_ack)) -> value data_msg {
1443 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1444 f_shutdown(__BFILE__, __LINE__);
1445 }
1446 [] as_ms_rx_ignore_dummy(ms, nr);
1447 [T_3169.running] T_3169.timeout {
1448 log("T_3169 timeout");
1449 /* Done in alt, wait for pending RTS initiated previously in
1450 * above case before continuing (expect /* Dummy block): */
1451 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1452 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1453 tr_RLCMAC_DUMMY_CTRL));
1454 }
1455 [] BTS.receive {
1456 setverdict(fail, "Unexpected BTS message");
1457 f_shutdown(__BFILE__, __LINE__);
1458 }
1459 }
1460
1461 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1462 * USFs as per previous TBF since they were freed at expiration time: */
1463 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1464 var uint5_t old_tfi := ms.ul_tbf.tfi;
1465 f_ms_establish_ul_tbf(ms);
1466 if (old_tfi != ms.ul_tbf.tfi) {
1467 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1468 f_shutdown(__BFILE__, __LINE__);
1469 }
1470 for (var integer i := 0; i < 8; i := i +1) {
1471 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1472 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1473 f_shutdown(__BFILE__, __LINE__);
1474 }
1475 }
1476
1477 f_shutdown(__BFILE__, __LINE__, final := true);
1478}
1479
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001480/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1481 * point the TBF is no longer available. In order to get to start of T3191, we
1482 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1483 * until TBF release procedure starts after draining DL queue. */
1484testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1485 var PCUIF_info_ind info_ind;
1486 var RlcmacDlBlock dl_block;
1487 var octetstring data1 := f_rnd_octstring(200);
1488 var octetstring data2 := f_rnd_octstring(10);
1489 var uint32_t dl_fn;
1490 var template (value) TsTrxBtsNum nr;
1491 var BTS_PDTCH_Block data_msg;
1492 var GprsMS ms;
1493
1494 /* Initialize NS/BSSGP side */
1495 f_init_bssgp();
1496 /* Initialize GPRS MS side */
1497 f_init_gprs_ms();
1498 ms := g_ms[0]; /* We only use first MS in this test */
1499
1500 /* Initialize the PCU interface abstraction */
1501 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1502 /* Set timer to 1 sec (default 5) to speedup test: */
1503 info_ind.t3191 := 1;
1504 f_init_raw(testcasename(), info_ind);
1505
1506 /* Establish BSSGP connection to the PCU */
1507 f_bssgp_establish();
1508 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1509
1510 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1511 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1512 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1513
1514 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1515 f_sleep(X2002);
1516
1517 while (true) {
1518 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1519
1520 /* Keep Ack/Nack description updated (except for last BSN) */
1521 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1522
1523 if (f_dl_block_rrbp_valid(dl_block)) {
1524 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1525 f_dl_block_ack_fn(dl_block, dl_fn));
1526 break;
1527 }
1528 }
1529
1530 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1531 nr := ts_TsTrxBtsNum;
1532 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1533 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1534 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1535 block_nr := nr.blk_nr));
1536 alt {
1537 [] as_ms_rx_ignore_dummy(ms, nr);
1538 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1539 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1540 ?)) -> value data_msg {
1541 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1542 log("Received FINAL_ACK");
1543 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1544 break;
1545 }
1546 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1547 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1548 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1549 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1550 }
1551 nr := ts_TsTrxBtsNum;
1552 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1553 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1554 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1555 block_nr := nr.blk_nr));
1556 repeat;
1557 }
1558 [] BTS.receive {
1559 setverdict(fail, "Unexpected BTS message");
1560 f_shutdown(__BFILE__, __LINE__);
1561 }
1562 }
1563
1564 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1565 to time out. We simply sleep instead of requesting blocks because
1566 otherwise retransmissions would keep restarting the timer. */
1567 f_sleep(int2float(info_ind.t3191));
1568
1569 /* The TBF should be freed now, so new data should trigger an Assignment: */
1570 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1571 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1572
1573 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1574 f_sleep(X2002);
1575 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1576 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1577 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1578 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1579 f_dl_block_ack_fn(dl_block, dl_fn));
1580
1581 f_shutdown(__BFILE__, __LINE__, final := true);
1582}
1583
1584/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1585testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1586 var PCUIF_info_ind info_ind;
1587 var RlcmacDlBlock dl_block;
1588 var octetstring data1 := f_rnd_octstring(1400);
1589 var octetstring data2 := f_rnd_octstring(10);
1590 var uint32_t dl_fn;
1591 var GprsMS ms;
1592
1593 /* Initialize NS/BSSGP side */
1594 f_init_bssgp();
1595 /* Initialize GPRS MS side */
1596 f_init_gprs_ms();
1597 ms := g_ms[0]; /* We only use first MS in this test */
1598
1599 /* Initialize the PCU interface abstraction */
1600 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1601 /* Set timer to 1 sec (default 5) to speedup test: */
1602 info_ind.t3191 := 1;
1603 f_init_raw(testcasename(), info_ind);
1604
1605 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1606
1607 /* Establish BSSGP connection to the PCU */
1608 f_bssgp_establish();
1609 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1610
1611 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1612 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1613 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1614
1615 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1616 f_sleep(X2002);
1617
1618 /* Send enough DL data to at least be able to DL ACK once (excl the
1619 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1620 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1621 while (true) {
1622 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1623
1624 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1625 log("Received FINAL_ACK");
1626 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1627 break;
1628 }
1629
1630 /* Keep Ack/Nack description updated (except for last BSN) */
1631 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1632
1633 if (f_dl_block_rrbp_valid(dl_block)) {
1634 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1635 f_dl_block_ack_fn(dl_block, dl_fn));
1636 }
1637 }
1638
1639 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1640 to time out. We simply sleep instead of requesting blocks because
1641 otherwise retransmissions would keep restarting the timer. */
1642 f_sleep(int2float(info_ind.t3191));
1643
1644 /* The TBF should be freed now, so new data should trigger an Assignment: */
1645 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1646 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1647
1648 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1649 f_sleep(X2002);
1650 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1651 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1652 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1653 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1654 f_dl_block_ack_fn(dl_block, dl_fn));
1655
1656 f_shutdown(__BFILE__, __LINE__, final := true);
1657}
1658
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001659/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1660 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1661 * T3193) after DL TBF release */
1662testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001663 var RlcmacDlBlock dl_block;
1664 var octetstring data := f_rnd_octstring(10);
1665 var boolean ok;
1666 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001667 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001668 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001669 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1670
1671 /* Initialize NS/BSSGP side */
1672 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001673 /* Initialize GPRS MS side */
1674 f_init_gprs_ms();
1675 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001676
1677 /* Initialize the PCU interface abstraction */
1678 f_init_raw(testcasename());
1679
1680 /* Establish BSSGP connection to the PCU */
1681 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001682 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001683
1684 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001685 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1686 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001687
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001688 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1689 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001690 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001691
1692 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001693 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1694 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1695 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001696
1697 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001698 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001699 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001700 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001701 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001702
1703 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001704
1705 /* 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 +07001706 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001707 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1708 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1709 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001710
1711 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001712}
1713
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001714/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1715 freed and no longer available. Trigger it by sending DL blocks and never DL
1716 ACKing the data (which are requested through RRBP) */
1717testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1718 var PCUIF_info_ind info_ind;
1719 var RlcmacDlBlock dl_block;
1720 var octetstring data1 := f_rnd_octstring(1000);
1721 var octetstring data2 := f_rnd_octstring(10);
1722 var uint32_t dl_fn;
1723 var template (value) TsTrxBtsNum nr;
1724 var BTS_PDTCH_Block data_msg;
1725 var GprsMS ms;
1726 const integer N3105_MAX := 2;
1727 var integer N3105 := 0;
1728 timer T_3195 := 1.0;
1729 var integer num_poll_recv := 0;
1730
1731 /* Initialize NS/BSSGP side */
1732 f_init_bssgp();
1733 /* Initialize GPRS MS side */
1734 f_init_gprs_ms();
1735 ms := g_ms[0]; /* We only use first MS in this test */
1736
1737 /* Initialize the PCU interface abstraction */
1738 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1739 /* Speedup test: */
1740 info_ind.n3105 := N3105_MAX;
1741 info_ind.t3195 := 1;
1742 f_init_raw(testcasename(), info_ind);
1743
1744 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1745 * MS and retransmitted after the TBF is released and later on created
1746 * (because the MS is reused) */
1747 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1748
1749 /* Establish BSSGP connection to the PCU */
1750 f_bssgp_establish();
1751 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1752
1753 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1754 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1755 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1756
1757 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1758 f_sleep(X2002);
1759
1760 /* Now we go on receiving DL data and not answering RRBP: */
1761 nr := ts_TsTrxBtsNum;
1762 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1763 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1764 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1765 block_nr := nr.blk_nr));
1766 alt {
1767 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1768 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1769 tr_RLCMAC_DATA)) -> value data_msg {
1770 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1771 if (num_poll_recv == 0) {
1772 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1773 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1774 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1775 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1776 } else {
1777 log("Ignoring RRBP ", num_poll_recv);
1778 N3105 := N3105 + 1;
1779 }
1780 num_poll_recv := num_poll_recv + 1;
1781 }
1782
1783 nr := ts_TsTrxBtsNum;
1784 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1785 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1786 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1787 block_nr := nr.blk_nr));
1788 repeat;
1789 }
1790 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
1791 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
1792 */
1793 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1794 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1795 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1796 if (not T_3195.running) {
1797 T_3195.start;
1798 /* We even send some new data, nothing should be sent to MS */
1799 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1800 }
1801 nr := ts_TsTrxBtsNum;
1802 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1803 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1804 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1805 block_nr := nr.blk_nr));
1806 repeat;
1807 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001808 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001809 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001810 /* Done in alt, wait for pending RTS initiated previously in
1811 * above case before continuing (expect /* Dummy block): */
1812 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1813 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1814 tr_RLCMAC_DUMMY_CTRL));
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001815 }
1816 [] BTS.receive {
1817 setverdict(fail, "Unexpected BTS message");
1818 f_shutdown(__BFILE__, __LINE__);
1819 }
1820 }
1821
1822 /* after T_3195 timeout, TBF is released */
1823 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1824 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1825
1826 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1827 f_sleep(X2002);
1828 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1829
1830 /* ACK the DL block */
1831 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1832 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1833 f_dl_block_ack_fn(dl_block, dl_fn));
1834
1835 f_shutdown(__BFILE__, __LINE__, final := true);
1836}
1837
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001838/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
1839testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001840 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001841 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001842 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001843 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001844
1845 /* Initialize NS/BSSGP side */
1846 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001847 /* Initialize GPRS MS side */
1848 f_init_gprs_ms();
1849 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001850
1851 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001852 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001853
1854 /* Establish BSSGP connection to the PCU */
1855 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001856 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001857
1858 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001859 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001860
1861 /* Send one UL block (with TLLI since we are in One-Phase Access
1862 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001863 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001864 /* 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 +02001865 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 +02001866 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1867 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001868 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001869
1870 /* Send enough blocks to test whole procedure: Until Nth block
1871 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
1872 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001873 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001874 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1875 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001876 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001877
1878 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001879 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 +07001880
1881 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001882}
1883
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001884/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
1885testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
1886 var RlcmacDlBlock dl_block;
1887 var uint32_t dl_fn, sched_fn;
1888 var octetstring payload;
1889 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001890 var template (value) LlcBlockHdr blk_hdr;
1891 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001892 var integer blk_len;
1893 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001894 var GprsMS ms;
1895
1896 /* Initialize NS/BSSGP side */
1897 f_init_bssgp();
1898 /* Initialize GPRS MS side */
1899 f_init_gprs_ms();
1900 ms := g_ms[0]; /* We only use first MS in this test */
1901
1902 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001903 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001904
1905 /* Establish BSSGP connection to the PCU */
1906 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001907 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001908
1909 /* Establish an Uplink TBF */
1910 f_ms_establish_ul_tbf(ms);
1911
1912 /* Send one UL block (with TLLI since we are in One-Phase Access
1913 contention resoultion) and make sure it is ACKED fine. */
1914 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001915 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1916 more := false, e := true);
1917 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001918 /* 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 +01001919 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
1920 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001921 cv := 15,
1922 bsn := ms.ul_tbf.bsn,
1923 blocks := blocks,
1924 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001925 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02001926 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001927
1928 /* ACK and check it was received fine */
1929 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1930 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1931 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1932 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001933 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 +02001934
1935 /* Test sending LLC PDUS of incrementing size */
1936 var integer max_size := 49;
1937 for (var integer i := 1; i <= max_size; i := i + 1) {
1938 var integer cv;
1939 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
1940 log("Sending DATA.ind with LLC payload size ", i);
1941 if (i < max_size - g_bs_cv_max) {
1942 cv := 15;
1943 } else {
1944 cv := max_size - i;
1945 }
1946
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001947 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
1948 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001949 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001950 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1951 more := false, e := true);
1952 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001953 /* 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 +01001954 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
1955 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001956 cv := cv,
1957 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001958 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001959 f_ultbf_inc_bsn(ms.ul_tbf);
1960 f_ms_tx_ul_block(ms, ul_data);
1961
1962 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001963 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 +02001964
1965 /* we will receive UL ACK/NACK from time to time, handle it. */
1966 f_rx_rlcmac_dl_block(dl_block, dl_fn);
1967 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1968 continue;
1969 }
1970 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
1971 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1972 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1973 f_shutdown(__BFILE__, __LINE__);
1974 }
1975
1976 log("Rx Packet Uplink ACK / NACK");
1977 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
1978 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1979 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1980 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07001981
1982 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001983}
1984
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001985function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
1986 var octetstring payload;
1987 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001988 var template (value) LlcBlockHdr blk_hdr;
1989 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001990 var integer block_len, max_valid_data_len;
1991 timer T;
1992
1993 block_len := f_rlcmac_cs_mcs2block_len(cs);
1994 /* We need to send with TLLI since we are in One-Phase Access Contenion
1995 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
1996 * indicator, -1 for spare bits octet at the end */
1997 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
1998 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 +07001999 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2000 more := false, e := true);
2001 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002002 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2003 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002004 cv := cv,
2005 bsn := ms.ul_tbf.bsn,
2006 blocks := blocks,
2007 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002008 f_ultbf_inc_bsn(ms.ul_tbf);
2009 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2010
2011 T.start(0.5);
2012 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002013 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002014 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2015 f_shutdown(__BFILE__, __LINE__);
2016 }
2017 [] T.timeout {
2018 setverdict(pass);
2019 }
2020 }
2021}
2022/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2023 blocks intentionally contain last byte of data placed in last byte of RLC
2024 containing padding/spare bits, which is incorrect. Spare bits exist and are
2025 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2026 discounting padding in octet" */
2027testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2028 var GprsMS ms;
2029 var integer block_len, max_valid_data_len;
2030
2031 /* Initialize NS/BSSGP side */
2032 f_init_bssgp();
2033 /* Initialize GPRS MS side */
2034 f_init_gprs_ms();
2035 ms := g_ms[0]; /* We only use first MS in this test */
2036
2037 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002038 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002039
2040 /* Establish BSSGP connection to the PCU */
2041 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002042 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002043
2044 /* Establish an Uplink TBF */
2045 f_ms_establish_ul_tbf(ms);
2046
2047 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2048 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2049 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2050
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002051 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002052}
2053
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002054/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2055 * answered, so TBFs for uplink and later for downlink are created.
2056 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002057private 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 +02002058 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002059 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002060 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002061 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002062 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002063
2064 /* Initialize NS/BSSGP side */
2065 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002066 /* Initialize GPRS MS side */
2067 f_init_gprs_ms();
2068 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002069
2070 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002071 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002072
2073 /* Establish BSSGP connection to the PCU */
2074 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002075 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002076
2077 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002078 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002079
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002080 /* Send one UL block (with TLLI since we are in One-Phase Access
2081 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002082 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 +02002083 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2084 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002085 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002086
2087 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002088 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002089
2090 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002091 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2092 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002093
2094 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2095 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002096 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002097
2098 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002099 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2100 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2101 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002102
2103 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002104}
2105
2106/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2107 * answered, so TBFs for uplink and later for downlink are created.
2108 */
2109testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002110 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002111 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002112}
2113
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002114/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2115 * answered, so TBFs for uplink and later for downlink are created.
2116 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002117private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2118 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002119 template (present) CodingScheme exp_ul_cs_mcs := ?,
2120 template (present) CodingScheme exp_dl_cs_mcs := ?)
2121runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002122 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002123 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002124 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002125 var uint32_t sched_fn;
2126 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002127 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002128 var GprsMS ms;
2129
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002130 /* Initialize NS/BSSGP side */
2131 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002132 /* Initialize GPRS MS side */
2133 f_init_gprs_ms();
2134 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002135
2136 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002137 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002138
2139 /* Establish BSSGP connection to the PCU */
2140 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002141 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002142
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002143 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2144 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 +02002145
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002146 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2147 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 +02002148 f_shutdown(__BFILE__, __LINE__);
2149 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002150
2151 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2152 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002153 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002154
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002155 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002156 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 +02002157
2158 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002159 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002160
2161 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002162 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002163 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2164 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002165 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002166 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002167 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002168
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002169 /* PCU acks the UL data after having received CV=0) */
2170 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2171
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002172 /* 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 +02002173 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 +02002174
2175 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002176 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2177 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 +02002178 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002179
2180 f_shutdown(__BFILE__, __LINE__, final := true);
2181}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002182
2183testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002184 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2185 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002186
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002187 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 +02002188}
2189
2190testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002191 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2192 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002193
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002194 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 +02002195}
2196
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002197testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2198 /* Configure PCU to force two phase access */
2199 g_force_two_phase_access := true;
2200
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002201 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002202 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002203
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002204 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 +02002205}
2206
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002207/* Test scenario where SGSN wants to send some data against MS and it is
2208 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2209 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002210private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2211 template (present) CodingScheme exp_cs_mcs := ?)
2212runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002213 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002214 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002215 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002216 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002217 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002218
2219 /* Initialize NS/BSSGP side */
2220 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002221 /* Initialize GPRS MS side */
2222 f_init_gprs_ms();
2223 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002224
2225 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002226 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002227
2228 /* Establish BSSGP connection to the PCU */
2229 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002230 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002231
2232 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002233 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2234 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002235
2236 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2237 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002238 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002239
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002240 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002241 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2242 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 +02002243 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002244
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002245 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002246 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002247
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002248 /* Send one UL block (with TLLI since we are in One-Phase Access
2249 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002250 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002251 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2252 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002253 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002254
2255 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002256 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002257
2258 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002259}
2260
2261testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002262 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002263 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2264}
2265
2266/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2267/* information about the MS */
2268testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002269 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002270 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002271}
2272
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002273/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2274 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2275 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2276 * be transferred).
2277 */
2278testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002279 var RlcmacDlBlock dl_block;
2280 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002281 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002282 var octetstring total_payload;
2283 var octetstring payload;
2284 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002285 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002286 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002287 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002288
2289 /* Initialize NS/BSSGP side */
2290 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002291 /* Initialize GPRS MS side */
2292 f_init_gprs_ms();
2293 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002294
2295 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002296 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002297
2298 /* Establish BSSGP connection to the PCU */
2299 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002300 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002301
2302 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002303 f_ms_establish_ul_tbf(ms);
2304 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002305
2306 /* Send one UL block (with TLLI since we are in One-Phase Access
2307 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002308 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 +02002309 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 +02002310
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002311 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2312 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002313 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002314 total_payload := payload;
2315
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002316 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2317
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002318 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002319 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002320 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002321 total_payload := total_payload & payload;
2322
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002323 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002324 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002325 total_payload := total_payload & payload;
2326
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002327 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002328 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 +02002329 total_payload := total_payload & lost_payload;
2330
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002331 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002332 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002333 total_payload := total_payload & payload;
2334
2335 /* 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 +02002336 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002337
2338 /* On CV=0, we'll receive a UL ACK asking about missing block */
2339 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2340 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002341 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2342 tfi := tfi,
2343 cv := 15,
2344 bsn := 3,
2345 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002346 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002347
2348 /* Now final ack is recieved */
2349 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2350 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002351 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002352
2353 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002354 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 +07002355
2356 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002357}
2358
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002359/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2360 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2361 * timeout occurs (specified by sent RRBP on DL block). */
2362testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002363 var RlcmacDlBlock dl_block;
2364 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002365 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002366 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002367
2368 /* Initialize NS/BSSGP side */
2369 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002370 /* Initialize GPRS MS side */
2371 f_init_gprs_ms();
2372 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002373
2374 /* Initialize the PCU interface abstraction */
2375 f_init_raw(testcasename());
2376
2377 /* Establish BSSGP connection to the PCU */
2378 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002379 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002380
2381 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002382 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2383 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002384
2385 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2386 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002387 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002388
2389 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2390 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2391 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002392 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002393
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002394 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2395 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002396 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002397
2398 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002399 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2400 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2401 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002402
2403 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002404}
2405
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002406/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2407testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2408 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2409 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002410 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002411 var RlcmacDlBlock dl_block;
2412 var uint32_t ack_fn;
2413 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002414 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002415 timer T := 5.0;
2416
2417 /* Initialize NS/BSSGP side */
2418 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002419 /* Initialize GPRS MS side */
2420 f_init_gprs_ms();
2421 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002422
2423 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002424 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002425
Daniel Willmann535aea62020-09-21 13:27:08 +02002426 f_statsd_reset();
2427
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002428 /* Establish BSSGP connection to the PCU */
2429 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002430 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002431
2432 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002433 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2434 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002435
2436 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2437 f_sleep(X2002);
2438
2439 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2440 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002441 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002442
2443 /* TDMA frame number on which we are supposed to send the ACK */
2444 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2445
2446 /* SGSN sends more blocks during the indicated RRBP */
2447 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2448 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002449 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002450
2451 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2452
2453 /* Make sure this block has the same TFI as was assigned
2454 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002455 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002456 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2457 dl_block.data.mac_hdr.hdr_ext.tfi);
2458 f_shutdown(__BFILE__, __LINE__);
2459 }
2460
2461 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002462 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002463
2464 /* Break if this is the end of RRBP */
2465 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002466 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002467 break;
2468 }
2469 }
2470
2471 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002472 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 +07002473
2474 /* Make sure that the next block (after the Ack) is dummy */
2475 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2476
Daniel Willmann535aea62020-09-21 13:27:08 +02002477 var StatsDExpects expect := {
2478 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2479 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2480 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2481 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2482 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002483 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002484 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2485 };
2486 f_statsd_expect(expect);
2487
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002488 f_shutdown(__BFILE__, __LINE__, final := true);
2489}
2490
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002491/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2492 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2493 * Check "3GPP TS 44.060" Annex B. */
2494testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2495 var RlcmacDlBlock dl_block;
2496 var octetstring dataA := f_rnd_octstring(20);
2497 var octetstring dataB := f_rnd_octstring(13);
2498 var octetstring dataC := f_rnd_octstring(3);
2499 var octetstring dataD := f_rnd_octstring(12);
2500 var uint32_t sched_fn;
2501 var GprsMS ms;
2502 var template (value) RlcmacUlBlock ul_data;
2503
2504 /* Initialize NS/BSSGP side */
2505 f_init_bssgp();
2506 /* Initialize GPRS MS side */
2507 f_init_gprs_ms();
2508 ms := g_ms[0]; /* We only use first MS in this test */
2509
2510 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002511 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002512
2513 /* Establish BSSGP connection to the PCU */
2514 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002515 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002516
2517 /* Establish an Uplink TBF */
2518 f_ms_establish_ul_tbf(ms);
2519
2520 /* Summary of what's transmitted:
2521 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2522 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2523 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2524 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2525 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2526 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2527 */
2528
2529 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002530 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2531 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002532 cv := 3,
2533 bsn := ms.ul_tbf.bsn,
2534 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2535 tlli := ms.tlli);
2536 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2537 * RLCMAC block being sent. */
2538 ul_data.data.mac_hdr.e := true;
2539 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002540 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002541
2542 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002543 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2544 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002545 cv := 2,
2546 bsn := ms.ul_tbf.bsn,
2547 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2548 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2549 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2550 },
2551 tlli := ms.tlli);
2552 f_ultbf_inc_bsn(ms.ul_tbf);
2553 f_ms_tx_ul_block(ms, ul_data);
2554
2555 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002556 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 +02002557
2558 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002559 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2560 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002561 cv := 1,
2562 bsn := ms.ul_tbf.bsn,
2563 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2564 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2565 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2566 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2567 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2568 },
2569 tlli := ms.tlli);
2570 f_ultbf_inc_bsn(ms.ul_tbf);
2571 f_ms_tx_ul_block(ms, ul_data);
2572
2573 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002574 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2575 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 +02002576
2577 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002578 ul_data := t_RLCMAC_UL_DATA_TLLI(
2579 cs := CS_1,
2580 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002581 cv := 0,
2582 bsn := ms.ul_tbf.bsn,
2583 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2584 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2585 },
2586 tlli := ms.tlli);
2587 f_ultbf_inc_bsn(ms.ul_tbf);
2588 f_ms_tx_ul_block(ms, ul_data);
2589
2590 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002591 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 +02002592
2593 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2594 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2595 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2596
2597 f_shutdown(__BFILE__, __LINE__, final := true);
2598}
2599
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002600/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2601 * ACK/NACK is not answered */
2602testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2603 var RlcmacDlBlock dl_block;
2604 var octetstring data1 := f_rnd_octstring(200);
2605 var octetstring data2 := f_rnd_octstring(10);
2606 var uint32_t dl_fn;
2607 var GprsMS ms;
2608 var template (value) TsTrxBtsNum nr;
2609 var BTS_PDTCH_Block data_msg;
2610
2611 /* Initialize NS/BSSGP side */
2612 f_init_bssgp();
2613 /* Initialize GPRS MS side */
2614 f_init_gprs_ms();
2615 ms := g_ms[0]; /* We only use first MS in this test */
2616
2617 /* Initialize the PCU interface abstraction */
2618 f_init_raw(testcasename())
2619
2620 /* Establish BSSGP connection to the PCU */
2621 f_bssgp_establish();
2622 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2623
2624 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2625 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2626 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2627
2628 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2629 f_sleep(X2002);
2630
2631 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2632 while (true) {
2633 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2634
2635 /* Keep Ack/Nack description updated (except for last BSN) */
2636 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2637
2638 if (f_dl_block_rrbp_valid(dl_block)) {
2639 /* Don't transmit DL ACK here on purpose ignore it */
2640 break;
2641 }
2642 }
2643
2644 /* PCU starts whole process again */
2645 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2646
2647 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2648 f_sleep(X2002);
2649
2650 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2651 /* DL data), after that we receive only DUMMY blocks so we are done */
2652 var boolean data_received := false;
2653 nr := ts_TsTrxBtsNum;
2654 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2655 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2656 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2657 block_nr := nr.blk_nr));
2658 alt {
2659 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2660 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2661 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2662 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2663 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2664 tr_RLCMAC_DATA)) -> value data_msg {
2665 data_received := true;
2666 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2667 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2668 log("Received FINAL_ACK");
2669 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2670 }
2671 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2672 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2673 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2674 }
2675 nr := ts_TsTrxBtsNum;
2676 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2677 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2678 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2679 block_nr := nr.blk_nr));
2680 repeat;
2681 }
2682 [] BTS.receive {
2683 setverdict(fail, "Unexpected BTS message");
2684 f_shutdown(__BFILE__, __LINE__);
2685 }
2686 }
2687
2688 f_shutdown(__BFILE__, __LINE__, final := true);
2689}
2690
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002691/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2692testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002693 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002694 var octetstring data := f_rnd_octstring(10);
2695 var PacketDlAssign dl_tbf_ass;
2696 var RlcmacDlBlock dl_block;
2697 var uint32_t poll_fn;
2698 var uint32_t sched_fn;
2699 var GprsMS ms;
2700 timer T := 5.0;
2701
2702 /* Initialize NS/BSSGP side */
2703 f_init_bssgp();
2704 /* Initialize GPRS MS side */
2705 f_init_gprs_ms();
2706 ms := g_ms[0]; /* We only use first MS in this test */
2707
2708 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002709 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2710 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002711
2712 /* Initialize the PCU interface abstraction */
2713 f_init_raw(testcasename(), info_ind);
2714
2715 /* Establish BSSGP connection to the PCU */
2716 f_bssgp_establish();
2717 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2718
2719 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2720 through PDCH (no multiblock assignment possible through PCH) */
2721 f_ms_establish_ul_tbf(ms);
2722
2723 /* Send one UL block (with TLLI since we are in One-Phase Access
2724 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002725 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
2726 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002727 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2728 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2729
2730 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2731 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2732 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2733 gprsextendeddynalloccap := '0'B
2734 };
2735 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2736 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2737 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2738 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2739 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2740 f_shutdown(__BFILE__, __LINE__);
2741 }
2742 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2743
2744 f_shutdown(__BFILE__, __LINE__, final := true);
2745}
2746
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002747testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002748 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002749 var RlcmacDlBlock dl_block;
2750 var octetstring data := f_rnd_octstring(10);
2751 var PollFnCtx pollctx;
2752 var uint32_t sched_fn;
2753 var GprsMS ms;
2754
2755 var MultislotCap_GPRS mscap_gprs := {
2756 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2757 gprsextendeddynalloccap := '0'B
2758 };
2759 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2760
2761
2762 /* Initialize NS/BSSGP side */
2763 f_init_bssgp();
2764 /* Initialize GPRS MS side */
2765 f_init_gprs_ms();
2766 ms := g_ms[0]; /* We only use first MS in this test */
2767
2768 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002769 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2770 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002771
2772 /* Initialize the PCU interface abstraction */
2773 f_init_raw(testcasename(), info_ind);
2774
2775 /* Establish BSSGP connection to the PCU */
2776 f_bssgp_establish();
2777 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2778
2779 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2780 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2781
2782 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
2783 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
2784
2785 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2786 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2787 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2788 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2789 f_shutdown(__BFILE__, __LINE__);
2790 }
2791 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2792
2793 f_shutdown(__BFILE__, __LINE__, final := true);
2794}
2795
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002796testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
2797 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
2798 var RlcmacDlBlock dl_block;
2799 var octetstring data := f_rnd_octstring(10);
2800 var PollFnCtx pollctx;
2801 var uint32_t sched_fn;
2802 var GprsMS ms;
2803
2804 var MultislotCap_GPRS mscap_gprs := {
2805 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2806 gprsextendeddynalloccap := '0'B
2807 };
2808 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2809
2810
2811 /* Initialize NS/BSSGP side */
2812 f_init_bssgp();
2813 /* Initialize GPRS MS side */
2814 f_init_gprs_ms();
2815 ms := g_ms[0]; /* We only use first MS in this test */
2816
2817 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002818 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2819 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002820
2821 /* Initialize the PCU interface abstraction */
2822 f_init_raw(testcasename(), info_ind);
2823
2824 /* Establish BSSGP connection to the PCU */
2825 f_bssgp_establish();
2826 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2827
2828 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2829 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2830
2831 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
2832 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
2833 f_shutdown(__BFILE__, __LINE__);
2834 }
2835
2836 f_shutdown(__BFILE__, __LINE__, final := true);
2837}
2838
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002839/* Test scenario where MS wants to request a new TBF once the current one is
2840 * ending, by means of sending a Packet Resource Request on ul slot provided by
2841 * last Pkt Ul ACK's RRBP.
2842 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
2843testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002844 var RlcmacDlBlock dl_block;
2845 var octetstring data := f_rnd_octstring(10);
2846 var uint32_t sched_fn;
2847 var uint32_t dl_fn;
2848 var template RlcmacDlBlock acknack_tmpl;
2849 var GprsMS ms;
2850
2851 /* Initialize NS/BSSGP side */
2852 f_init_bssgp();
2853 /* Initialize GPRS MS side */
2854 f_init_gprs_ms();
2855 ms := g_ms[0]; /* We only use first MS in this test */
2856
2857 /* Initialize the PCU interface abstraction */
2858 f_init_raw(testcasename());
2859
2860 /* Establish BSSGP connection to the PCU */
2861 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002862 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002863
2864 /* Establish an Uplink TBF */
2865 f_ms_establish_ul_tbf(ms);
2866
2867 /* Send one UL block (with TLLI since we are in One-Phase Access
2868 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002869 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 +02002870
2871 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002872 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002873
2874 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
2875 tr_UlAckNackGprs(ms.tlli,
2876 tr_AckNackDescription(final_ack := '1'B),
2877 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
2878 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2879
2880 /* TODO: verify TBF_EST and FinalACK are both '1' above */
2881
2882 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07002883 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 +07002884 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002885 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2886 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2887
2888 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2889 and make sure it is ACKED fine */
2890 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
2891
2892 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002893 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002894
2895 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2896 /* ACK the ACK */
2897 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2898
2899 f_shutdown(__BFILE__, __LINE__, final := true);
2900}
2901
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002902/* Test CS paging over the BTS<->PCU socket.
2903 * 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.
2904 * Paging should be send on the PACCH.
2905 *
2906 * 1. Send a Paging Request over PCU socket.
2907 * 2. Send a Ready-To-Send message over PCU socket
2908 * 3. Expect a Paging Frame
2909 */
2910testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002911 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002912 var MobileIdentityLV mi;
2913 var octetstring mi_enc_lv;
2914 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002915 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002916
2917 /* Initialize NS/BSSGP side */
2918 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002919 /* Initialize GPRS MS side */
2920 f_init_gprs_ms();
2921 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002922
2923 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002924 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002925
2926 /* Establish BSSGP connection to the PCU */
2927 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002928 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002929
2930 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002931 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002932
2933 /* build mobile Identity */
2934 mi := valueof(ts_MI_IMSI_LV(imsi));
2935 mi_enc_lv := enc_MobileIdentityLV(mi);
2936 /* Send paging request */
2937 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
2938 sapi :=PCU_IF_SAPI_PDTCH));
2939
2940 /* Receive it on BTS side towards MS */
2941 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2942
2943 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002944 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
2945 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2946 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2947 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002948
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002949 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002950}
2951
2952/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
2953 */
2954private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2955runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002956 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002957 var hexstring imsi := f_gen_imsi(42);
2958 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002959 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002960
2961 /* Initialize NS/BSSGP side */
2962 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002963 /* Initialize GPRS MS side */
2964 f_init_gprs_ms();
2965 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002966
2967 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002968 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002969
2970 /* Establish BSSGP connection to the PCU */
2971 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002972 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002973
2974 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002975 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002976
2977 /* Send paging request with or without TMSI */
2978 if (use_ptmsi) {
2979 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
2980 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
2981 } else {
2982 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
2983 }
2984
2985 /* Receive it on BTS side towards MS */
2986 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2987
2988 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002989 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002990 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002991 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
2992 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
2993 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002994 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002995 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2996 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2997 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002998 }
2999
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003000 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003001}
3002
3003testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3004 f_tc_paging_cs_from_sgsn(0, true);
3005}
3006
3007testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3008 f_tc_paging_cs_from_sgsn(0);
3009}
3010
3011testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003012 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003013}
3014
3015/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3016 */
3017private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3018runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003019 var integer imsi_suff_tx := 423;
3020 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003021 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003022
3023 /* Initialize NS/BSSGP side */
3024 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003025 /* Initialize GPRS MS side */
3026 f_init_gprs_ms();
3027 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003028
3029 /* Initialize the PCU interface abstraction */
3030 f_init_raw(testcasename());
3031
3032 /* Establish BSSGP connection to the PCU */
3033 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003034 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003035
3036 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3037 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3038 if (use_ptmsi) {
3039 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3040 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3041 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3042 } else {
3043 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3044 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3045 }
3046
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003047 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003048}
3049
3050testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3051 f_tc_paging_ps_from_sgsn(0, true);
3052}
3053
3054testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3055 f_tc_paging_ps_from_sgsn(0);
3056}
3057
3058testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003059 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003060}
3061
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003062/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3063testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3064 var RlcmacDlBlock dl_block;
3065 var octetstring data := f_rnd_octstring(10);
3066 var uint32_t sched_fn;
3067 var uint32_t dl_fn;
3068 var GprsMS ms;
3069
3070 /* Initialize NS/BSSGP side */
3071 f_init_bssgp();
3072 /* Initialize GPRS MS side */
3073 f_init_gprs_ms();
3074 ms := g_ms[0]; /* We only use first MS in this test */
3075
3076 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003077 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003078
Daniel Willmann535aea62020-09-21 13:27:08 +02003079 f_statsd_reset();
3080
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003081 /* Establish BSSGP connection to the PCU */
3082 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003083 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003084
3085 /* Establish an Uplink TBF */
3086 f_ms_establish_ul_tbf(ms);
3087
3088 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003089 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 +02003090 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3091 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3092 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3093
3094 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003095 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003096
3097 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3098 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3099 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3100
3101 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3102 f_sleep(X2002);
3103 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3104
3105 /* ACK the DL block */
3106 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3107 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3108 f_dl_block_ack_fn(dl_block, dl_fn));
3109
Daniel Willmann535aea62020-09-21 13:27:08 +02003110 var StatsDExpects expect := {
3111 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3112 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3113 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3114 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003115 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003116 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003117 };
3118 f_statsd_expect(expect);
3119
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003120 f_shutdown(__BFILE__, __LINE__, final := true);
3121}
3122
3123/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3124testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3125 var RlcmacDlBlock dl_block;
3126 var octetstring data := f_rnd_octstring(10);
3127 var uint32_t sched_fn;
3128 var uint32_t dl_fn;
3129 var GprsMS ms;
3130
3131 /* Initialize NS/BSSGP side */
3132 f_init_bssgp();
3133 /* Initialize GPRS MS side */
3134 f_init_gprs_ms();
3135 ms := g_ms[0]; /* We only use first MS in this test */
3136
3137 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003138 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003139
3140 /* Establish BSSGP connection to the PCU */
3141 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003142 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003143
3144 /* Establish an Uplink TBF */
3145 f_ms_establish_ul_tbf(ms);
3146
3147 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003148 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 +02003149 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3150 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3151 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3152
3153 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003154 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003155
3156 /* Now SGSN sends some DL data with an invalid IMSI */
3157 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3158
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003159 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003160
3161 /* TODO: make sure no data is sent over PCU -> MS */
3162
3163 f_shutdown(__BFILE__, __LINE__, final := true);
3164}
3165
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003166private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3167 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3168 var octetstring data := f_rnd_octstring(6);
3169 var RlcmacDlBlock dl_block;
3170 var GprsMS ms;
3171 var uint32_t fn;
3172
3173 /* Initialize NS/BSSGP side */
3174 f_init_bssgp();
3175 /* Initialize GPRS MS side */
3176 f_init_gprs_ms();
3177 ms := g_ms[0]; /* We only use first MS in this test */
3178
3179 /* Initialize the PCU interface abstraction */
3180 f_init_raw(testcasename());
3181
3182 /* Establish BSSGP connection to the PCU */
3183 f_bssgp_establish();
3184 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3185
3186 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3187 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3188 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3189
3190 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3191 f_sleep(X2002);
3192
3193 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3194 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3195
3196 if (ischosen(dl_block.data_egprs)) {
3197 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3198 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3199 f_shutdown(__BFILE__, __LINE__);
3200 }
3201 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3202 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3203 f_shutdown(__BFILE__, __LINE__);
3204 }
3205 if (not match(dl_block.data_egprs.blocks[1].payload,
3206 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3207 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3208 f_shutdown(__BFILE__, __LINE__);
3209 }
3210 } else if (lengthof(dl_block.data.blocks) > 1) {
3211 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3212 f_shutdown(__BFILE__, __LINE__);
3213 }
3214
3215 f_shutdown(__BFILE__, __LINE__, final := true);
3216}
3217
3218/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3219 * containing llc data. See OS#4849 */
3220testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3221 f_tc_dl_data_no_llc_ui_dummy(omit);
3222}
3223
3224/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3225 * containing llc data. See OS#4849 */
3226testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003227 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003228}
3229
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003230private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003231 template GsmRrMessage t_imm_ass := ?,
3232 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003233runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003234 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003235 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003236
3237 ra11 := enc_EGPRSPktChRequest2uint(req);
3238 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3239
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003240 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003241 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003242 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003243 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003244 }
3245
3246 setverdict(pass);
3247}
3248
3249testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3250 var template GsmRrMessage imm_ass;
3251 var template IaRestOctets rest;
3252 var template EgprsUlAss ul_ass;
3253
3254 /* Initialize the PCU interface abstraction */
3255 f_init_raw(testcasename());
3256
3257 var EGPRSPktChRequest req := {
3258 /* NOTE: other fields are set in the loop */
3259 signalling := { tag := '110011'B }
3260 };
3261
3262 for (var integer i := 0; i < 6; i := i + 1) {
3263 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3264 req.signalling.random_bits := ext_ra;
3265
3266 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3267 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3268 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3269 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3270
3271 f_TC_egprs_pkt_chan_req(req, imm_ass);
3272 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003273
3274 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003275}
3276
3277testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3278 var template GsmRrMessage imm_ass;
3279 var template IaRestOctets rest;
3280 var template EgprsUlAss ul_ass;
3281
3282 /* Initialize the PCU interface abstraction */
3283 f_init_raw(testcasename());
3284
3285 var EGPRSPktChRequest req := {
3286 /* NOTE: other fields are set in the loop */
3287 one_phase := { tag := '0'B }
3288 };
3289
3290 for (var integer i := 0; i < 6; i := i + 1) {
3291 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3292 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3293 var BIT2 priority := substr(ext_ra, 0, 2);
3294 var BIT3 rand := substr(ext_ra, 2, 3);
3295
3296 req.one_phase.multislot_class := mslot_class;
3297 req.one_phase.priority := priority;
3298 req.one_phase.random_bits := rand;
3299
3300 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3301 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3302 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3303 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3304
3305 f_TC_egprs_pkt_chan_req(req, imm_ass);
3306 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003307
3308 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003309}
3310
3311testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3312 var template GsmRrMessage imm_ass;
3313 var template IaRestOctets rest;
3314 var template EgprsUlAss ul_ass;
3315
3316 /* Initialize the PCU interface abstraction */
3317 f_init_raw(testcasename());
3318
3319 var EGPRSPktChRequest req := {
3320 /* NOTE: other fields are set in the loop */
3321 two_phase := { tag := '110000'B }
3322 };
3323
3324 for (var integer i := 0; i < 6; i := i + 1) {
3325 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3326 var BIT2 priority := substr(ext_ra, 0, 2);
3327 var BIT3 rand := substr(ext_ra, 2, 3);
3328
3329 req.two_phase.priority := priority;
3330 req.two_phase.random_bits := rand;
3331
3332 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3333 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3334 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3335 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3336
3337 f_TC_egprs_pkt_chan_req(req, imm_ass);
3338 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003339
3340 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003341}
3342
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003343private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3344 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003345 PCUIF_BurstType bt := BURST_TYPE_1,
3346 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003347runs on RAW_PCU_Test_CT {
3348 var template ReqRefWaitInd tr_ref;
3349 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003350
3351 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3352 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3353 ra := bit2int(ra11), is_11bit := 1,
3354 burst_type := bt, fn := fn,
3355 arfcn := 871));
3356
3357 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003358 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003359
3360 /* Just to have a short-name reference to the actual message */
3361 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3362
3363 /* Make sure that Request Reference list contains at least one entry
3364 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003365 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003366 if (not match(iar.payload, { *, tr_ref, * })) {
3367 setverdict(fail, "Request Reference list does not match");
3368 f_shutdown(__BFILE__, __LINE__);
3369 }
3370
3371 /* Match Feature Indicator (must indicate PS domain) */
3372 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3373 setverdict(fail, "Feature Indicator does not match");
3374 f_shutdown(__BFILE__, __LINE__);
3375 }
3376
3377 /* Match IAR Rest Octets */
3378 if (not match(iar.rest_octets, rest)) {
3379 setverdict(fail, "IAR Rest Octets does not match: ",
3380 iar.rest_octets, " vs expected ", rest);
3381 f_shutdown(__BFILE__, __LINE__);
3382 }
3383
3384 setverdict(pass);
3385}
3386
3387/* Verify the contents of RR Immediate Assignment Reject message and its
3388 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3389testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3390 var template IARRestOctets rest;
3391 var BIT5 ext_ra;
3392
3393 /* Initialize the PCU interface abstraction */
3394 f_init_raw(testcasename());
3395
3396 for (var integer i := 0; i < 6; i := i + 1) {
3397 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3398 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3399
3400 /* Intentionally incorrect message (see table 11.2.5a.2) */
3401 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3402 }
3403
3404 f_shutdown(__BFILE__, __LINE__, final := true);
3405}
3406
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003407/* At the moment, the IUT does not support any emergency services. Make sure
3408 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3409testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3410 var template IARRestOctets rest;
3411 var BIT5 ext_ra;
3412 var BIT11 ra11;
3413
3414 /* Initialize the PCU interface abstraction */
3415 f_init_raw(testcasename());
3416
3417 var EGPRSPktChRequest req := {
3418 /* NOTE: other fields are set in the loop */
3419 emergency := { tag := '110111'B }
3420 };
3421
3422 for (var integer i := 0; i < 6; i := i + 1) {
3423 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3424 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3425
3426 req.emergency.random_bits := ext_ra;
3427 ra11 := enc_EGPRSPktChRequest2bits(req);
3428
3429 /* Intentionally incorrect message (see table 11.2.5a.2) */
3430 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3431 }
3432
3433 f_shutdown(__BFILE__, __LINE__, final := true);
3434}
3435
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003436/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3437testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003438 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003439 var template IARRestOctets rest;
3440 var BIT11 ra11;
3441
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003442 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003443 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003444
3445 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003446 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3447 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003448
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003449 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003450 f_init_raw(testcasename(), info_ind);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003451
3452 var EGPRSPktChRequest req := {
3453 one_phase := {
3454 tag := '0'B,
3455 multislot_class := '10101'B,
3456 priority := '01'B,
3457 random_bits := '101'B
3458 }
3459 };
3460
3461 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3462 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3463 for (var integer i := 0; i < 7; i := i + 1) {
3464 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3465 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3466 }
3467
3468 ra11 := enc_EGPRSPktChRequest2bits(req);
3469 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3470
3471 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003472 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003473
3474 f_shutdown(__BFILE__, __LINE__, final := true);
3475}
3476
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003477/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003478private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003479return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003480 /* Pick a random MA length in range 2 .. max_ma_len */
3481 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
3482
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003483 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
3484 hsn := f_rnd_int(63),
3485 maio := f_rnd_int(63),
3486 ma := f_rnd_bitstring(ma_len));
3487}
3488
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003489private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
3490 in GsmRrMessage rr_msg)
3491{
3492 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003493 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003494
3495 var template PacketChannelDescription tr_pkt_chan_desc := {
3496 channel_Type_spare := ?,
3497 tn := ?,
3498 tsc := ts.tsc,
3499 presence := '1'B,
3500 zero := omit,
3501 one := {
3502 maio := ts.maio,
3503 hsn := ts.hsn
3504 }
3505 };
3506
3507 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
3508 setverdict(fail, "Packet Channel Description does not match: ",
3509 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
3510 }
3511
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003512 /* Mobile Allocation is expected to be octet-aligned */
3513 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
3514 var template MobileAllocationLV tr_ma := {
3515 len := ma_oct_len, /* in bytes */
3516 ma := substr(ts.ma, 0, ma_oct_len * 8)
3517 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003518
3519 if (not match(ia.mobile_allocation, tr_ma)) {
3520 setverdict(fail, "Mobile Allocation does not match: ",
3521 ia.mobile_allocation, " vs ", tr_ma);
3522 }
3523
3524 setverdict(pass);
3525}
3526
3527/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
3528testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003529 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003530 var GprsMS ms := valueof(t_GprsMS_def);
3531
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003532 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003533 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003534
3535 /* Initialize the PCU interface abstraction */
3536 f_init_raw(testcasename(), info_ind);
3537
3538 /* EGPRS Packet Channel Request (cause=Signalling) */
3539 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
3540
3541 /* Establish an Uplink EGPRS TBF */
3542 f_ms_establish_ul_tbf(ms);
3543
3544 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3545 f_shutdown(__BFILE__, __LINE__, final := true);
3546}
3547
3548/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
3549testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003550 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003551 var GprsMS ms := valueof(t_GprsMS_def);
3552
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003553 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003554 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003555
3556 /* Initialize the PCU interface abstraction */
3557 f_init_raw(testcasename(), info_ind);
3558
3559 /* Establish an Uplink TBF */
3560 f_ms_establish_ul_tbf(ms);
3561
3562 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3563 f_shutdown(__BFILE__, __LINE__, final := true);
3564}
3565
3566/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
3567testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003568 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003569 var GprsMS ms := valueof(t_GprsMS_def);
3570
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003571 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003572 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003573
3574 /* Initialize NS/BSSGP side */
3575 f_init_bssgp();
3576
3577 /* Initialize the PCU interface abstraction */
3578 f_init_raw(testcasename(), info_ind);
3579
3580 /* Establish BSSGP connection to the PCU */
3581 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003582 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003583
3584 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3585 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
3586 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3587
3588 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
3589 f_shutdown(__BFILE__, __LINE__, final := true);
3590}
3591
3592private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
3593 in FrequencyParameters fp)
3594{
3595 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003596 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003597
3598 /* Table 12.8.1: Frequency Parameters information elements */
3599 var template FrequencyParameters tr_fp := {
3600 tsc := ts.tsc,
3601 presence := '10'B, /* Direct encoding 1 */
3602 arfcn := omit,
3603 indirect := omit,
3604 direct1 := {
3605 maio := ts.maio,
3606 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
3607 mobile_allocation := {
3608 hsn := ts.hsn,
3609 rfl_number_list_present := '0'B,
3610 rfl_number_list := omit,
3611 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003612 ma_length := ts.ma_bit_len,
3613 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003614 }
3615 },
3616 direct2 := omit
3617 };
3618
3619 if (not match(fp, tr_fp)) {
3620 setverdict(fail, "Frequency Parameters IE does not match: ",
3621 fp, " vs ", tr_fp);
3622 }
3623
3624 setverdict(pass);
3625}
3626
3627/* Make sure that Packet Uplink Assignment contains hopping parameters */
3628testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003629 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003630 var GprsMS ms := valueof(t_GprsMS_def);
3631 var uint32_t poll_fn;
3632
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003633 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003634 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003635
3636 /* Initialize the PCU interface abstraction */
3637 f_init_raw(testcasename(), info_ind);
3638
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003639 /* Single block (two phase) packet access */
3640 var uint16_t ra := bit2int(chan_req_sb);
3641 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
3642
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003643 /* Establish an Uplink TBF */
3644 f_ms_establish_ul_tbf(ms);
3645
3646 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003647 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
3648 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003649
3650 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003651 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
3652 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003653
3654 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
3655 var template (omit) FrequencyParameters fp;
3656 if (ua.is_egprs == '1'B) {
3657 fp := ua.egprs.freq_par;
3658 } else {
3659 fp := ua.gprs.freq_par;
3660 }
3661
3662 /* This is an optional IE, so it's worth to check its presence */
3663 if (istemplatekind(fp, "omit")) {
3664 setverdict(fail, "Frequency Parameters IE is not present");
3665 f_shutdown(__BFILE__, __LINE__);
3666 }
3667
3668 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
3669 f_shutdown(__BFILE__, __LINE__, final := true);
3670}
3671
3672/* Make sure that Packet Downlink Assignment contains hopping parameters */
3673testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003674 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003675 var octetstring data := f_rnd_octstring(10);
3676 var GprsMS ms := valueof(t_GprsMS_def);
3677 var RlcmacDlBlock dl_block;
3678 var uint32_t poll_fn;
3679
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003680 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003681 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003682
3683 /* Initialize NS/BSSGP side */
3684 f_init_bssgp();
3685
3686 /* Initialize the PCU interface abstraction */
3687 f_init_raw(testcasename(), info_ind);
3688
3689 /* Establish BSSGP connection to the PCU */
3690 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003691 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003692
3693 /* Establish an Uplink TBF */
3694 f_ms_establish_ul_tbf(ms);
3695
3696 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003697 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 +07003698
3699 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3700 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
3701 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
3702
3703 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
3704 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3705
3706 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003707 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
3708 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003709
3710 /* This is an optional IE, so it's worth to check its presence */
3711 if (not ispresent(da.freq_par)) {
3712 setverdict(fail, "Frequency Parameters IE is not present");
3713 f_shutdown(__BFILE__, __LINE__);
3714 }
3715
3716 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
3717 f_shutdown(__BFILE__, __LINE__, final := true);
3718}
3719
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003720/* Check if the IUT handles subsequent INFO.ind messages */
3721testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003722 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003723 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003724
3725 /* Initialize the PCU interface abstraction */
3726 f_init_raw(testcasename(), info_ind);
3727
3728 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
3729 for (var integer i := 0; i < 16; i := i + 1) {
3730 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003731 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003732 }
3733
3734 f_shutdown(__BFILE__, __LINE__, final := true);
3735}
3736
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003737/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
3738testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
3739 var PCUIF_info_ind info_ind;
3740 var integer i;
3741 const integer num_ms := 8;
3742
3743 /* Initialize NS/BSSGP side */
3744 f_init_bssgp();
3745 /* Initialize GPRS MS side */
3746 f_init_gprs_ms(num_ms);
3747
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003748 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003749 /* Only the 3 first TRX are enabled. The enabled ones all have same
3750 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003751 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
3752 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
3753 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
3754 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003755
3756 /* Initialize the PCU interface abstraction */
3757 f_init_raw(testcasename(), info_ind);
3758
3759 /* Establish BSSGP connection to the PCU */
3760 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003761 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003762
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003763 /* Establish an Uplink TBF for each GprsMS instance */
3764 f_multi_ms_establish_tbf(do_activate := false);
3765
3766 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003767 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003768 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01003769 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003770 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003771 f_shutdown(__BFILE__, __LINE__);
3772 }
3773 }
3774
3775 f_shutdown(__BFILE__, __LINE__, final := true);
3776}
3777
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003778/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
3779 * downgraded to CS1-4 so that GPRS can read the USF).
3780 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
3781 */
3782testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
3783 var PCUIF_info_ind info_ind;
3784 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
3785 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003786 var uint32_t sched_fn, dl_fn, ack_fn;
3787 var octetstring data := f_rnd_octstring(10);
3788 var RlcmacDlBlock dl_block;
3789 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003790 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003791 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
3792 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
3793
3794 /* Initialize NS/BSSGP side */
3795 f_init_bssgp();
3796 /* Initialize GPRS MS side */
3797 f_init_gprs_ms(num_ms);
3798
3799 info_ind := valueof(ts_PCUIF_INFO_default);
3800 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003801 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
3802 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003803
3804 /* Initialize the PCU interface abstraction */
3805 f_init_raw(testcasename(), info_ind);
3806
3807 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
3808 g_mcs_initial_dl := 5;
3809 g_mcs_max_dl := 5;
3810 f_pcuvty_set_allowed_cs_mcs();
3811
3812 /* Establish BSSGP connection to the PCU */
3813 f_bssgp_establish();
3814 f_multi_ms_bssgp_register();
3815
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003816 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003817 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 +01003818 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
3819 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
3820 f_shutdown(__BFILE__, __LINE__);
3821 }
3822 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3823 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3824
3825 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003826 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 +01003827 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
3828 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
3829 f_shutdown(__BFILE__, __LINE__);
3830 }
3831 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3832 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3833
3834 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
3835 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3836 f_sleep(0.1);
3837 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3838 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3839 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
3840 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3841 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
3842 /* ACK the DL block */
3843 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
3844 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
3845 f_dl_block_ack_fn(dl_block, dl_fn));
3846
3847 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
3848 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3849 f_sleep(0.1);
3850 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3851 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3852 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
3853 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3854 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
3855 /* ACK the DL block */
3856 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
3857 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
3858 f_dl_block_ack_fn(dl_block, dl_fn));
3859
3860 data := f_rnd_octstring(1400);
3861 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3862 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3863
3864 for (var integer i := 0; i < 800; i := i + 1) {
3865 f_rx_rlcmac_dl_block(dl_block, dl_fn);
3866
3867 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
3868 /* No more data to receive, done */
3869 break;
3870 }
3871
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003872 usf_ms := -1;
3873
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003874 if (ischosen(dl_block.ctrl)) {
3875 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
3876 f_shutdown(__BFILE__, __LINE__);
3877 } else if (ischosen(dl_block.data_egprs)) {
3878 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
3879 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
3880 f_shutdown(__BFILE__, __LINE__);
3881 }
3882 tgt_ms := 1;
3883 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
3884 if (dl_block.data_egprs.mcs > MCS_4) {
3885 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
3886 f_shutdown(__BFILE__, __LINE__);
3887 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003888 usf_ms := 0;
3889 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003890 } else {
3891 if (dl_block.data_egprs.mcs <= MCS_4) {
3892 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
3893 f_shutdown(__BFILE__, __LINE__);
3894 }
3895 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003896 usf_ms := 1;
3897 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003898 }
3899 }
3900 } else {
3901 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
3902 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
3903 f_shutdown(__BFILE__, __LINE__);
3904 }
3905 tgt_ms := 0;
3906 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 +01003907 usf_ms := 0;
3908 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003909 } 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 +01003910 usf_ms := 1;
3911 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003912 }
3913 }
3914
3915 /* Keep Ack/Nack description updated */
3916 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
3917
3918 /* TDMA frame number on which we are supposed to send the ACK */
3919 if (f_dl_block_rrbp_valid(dl_block)) {
3920 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
3921 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);
3922 if (tx_data_remain != 0) {
3923 /* Submit more data from time to time to keep the TBF ongoing */
3924 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3925 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3926 tx_data_remain := tx_data_remain - 1;
3927 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003928 } else if (tx_data_remain != 0) {
3929 /* keep sending UL blocks when requested by USF to avoid
3930 * UL TBF timeout and hence stop receival of USFs */
3931 if (usf_ms != -1) {
3932 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
3933 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003934 }
3935 }
3936
3937 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 +01003938 /* He we check that DL blocks scheduled at GPRS can still request UL
3939 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
3940 * condition also ensures the downgrade to <=MCS4 condition is tested
3941 * above */
3942 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
3943 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003944 f_shutdown(__BFILE__, __LINE__);
3945 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003946 /* Here check for some level of fairness between them (at least ~40%): */
3947 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
3948 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
3949 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
3950 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
3951 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3952 f_shutdown(__BFILE__, __LINE__);
3953 }
3954 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
3955 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3956 f_shutdown(__BFILE__, __LINE__);
3957 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003958
3959 f_shutdown(__BFILE__, __LINE__, final := true);
3960}
3961
3962
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07003963private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
3964 boolean exp_imsi, boolean exp_tmsi)
3965runs on RAW_PCU_Test_CT {
3966 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
3967 var integer pending := lengthof(g_ms);
3968 var RlcmacDlBlock dl_block;
3969 var boolean f1, f2;
3970
3971 while (pending > 0) {
3972 var uint32_t poll_fn;
3973
3974 /* Obtain a Downlink block and make sure it is a paging request */
3975 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
3976 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
3977 setverdict(fail, "Rx unexpected DL block: ", dl_block);
3978 break;
3979 }
3980
3981 /* This should not happen in general, but who knows... */
3982 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3983 if (not ispresent(req.repeated_pageinfo)) {
3984 setverdict(fail, "Repeated Page Info IE is absent?!?");
3985 break;
3986 }
3987
3988 /* A single message may contain several MIs depending on their type */
3989 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3990 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
3991 ps_domain := false);
3992 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
3993 ps_domain := false);
3994 if (not f1 and not f2)
3995 { continue; }
3996
3997 /* Detect duplicate MIs */
3998 if (mask[i] == '1'B) {
3999 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4000 continue;
4001 }
4002
4003 mask[i] := '1'B;
4004 }
4005
4006 pending := pending - lengthof(req.repeated_pageinfo);
4007 }
4008
4009 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4010 if (mask[i] != '1'B) {
4011 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4012 log("===== mask := ", mask);
4013 }
4014 }
4015
4016 /* All messages must have been received by now, expect a dummy block */
4017 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4018}
4019
4020private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4021runs on RAW_PCU_Test_CT {
4022 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4023 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4024
4025 /* Initialize NS/BSSGP side */
4026 f_init_bssgp();
4027
4028 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004029 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004030
4031 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4032 f_init_gprs_ms(7 * 8);
4033
4034 /* Initialize the PCU interface abstraction */
4035 f_init_raw(testcasename(), info_ind);
4036
4037 /* Establish BSSGP connection to the PCU */
4038 f_bssgp_establish();
4039 f_multi_ms_bssgp_register();
4040
4041 /* Establish an Uplink TBF for each GprsMS instance */
4042 f_multi_ms_establish_tbf(do_activate := true);
4043}
4044
4045testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4046 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4047
4048 /* Common part: send INFO.ind, establish TBFs... */
4049 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4050
4051 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4052 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4053 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4054 }
4055
4056 /* FIXME: work around a race condition between PCUIF and BSSGP */
4057 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4058
4059 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4060 * The IUT is expected to page on all PDCH slots of all transceivers. */
4061 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4062 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4063 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4064 }
4065
4066 f_shutdown(__BFILE__, __LINE__, final := true);
4067}
4068
4069testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4070 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4071
4072 /* Common part: send INFO.ind, establish TBFs... */
4073 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4074
4075 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4076 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4077 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4078 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4079 }
4080
4081 /* FIXME: work around a race condition between PCUIF and BSSGP */
4082 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4083
4084 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4085 * The IUT is expected to page on all PDCH slots of all transceivers. */
4086 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4087 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4088 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4089 }
4090
4091 f_shutdown(__BFILE__, __LINE__, final := true);
4092}
4093
4094testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4095 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4096
4097 /* Common part: send INFO.ind, establish TBFs... */
4098 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4099
4100 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4101 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4102 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4103 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4104 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4105 } else {
4106 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4107 }
4108 }
4109
4110 /* FIXME: work around a race condition between PCUIF and BSSGP */
4111 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4112
4113 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4114 * The IUT is expected to page on all PDCH slots of all transceivers. */
4115 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4116 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4117 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4118 }
4119
4120 f_shutdown(__BFILE__, __LINE__, final := true);
4121}
4122
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004123private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004124runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4125 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004126 var integer i := 0;
4127 while (true) {
4128 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4129 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4130 break;
4131 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004132 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004133 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4134 f_shutdown(__BFILE__, __LINE__);
4135 }
4136 i := i + 1;
4137 }
4138 return dl_block;
4139}
4140
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004141private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4142runs on RAW_PCU_Test_CT {
4143 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),
4144 info_ind.lac),
4145 info_ind.rac),
4146 info_ind.cell_id));
4147 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4148 423),
4149 2),
4150 5));
4151 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4152 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4153 var template (value) RAN_Information_RIM_Container res_cont :=
4154 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4155 ts_RIM_Sequence_Number(2),
4156 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4157 ts_RIM_Protocol_Version_Number(1),
4158 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4159 omit);
4160 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4161 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4162 res_cont));
4163}
4164
4165altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4166runs on RAW_PCU_Test_CT {
4167 /* RIM procedure: */
4168 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),
4169 info_ind.lac),
4170 info_ind.rac),
4171 info_ind.cell_id));
4172 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4173 423),
4174 2),
4175 5));
4176 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4177 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4178 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4179 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4180 tr_RAN_Information_Request_RIM_Container)) {
4181 if (do_answer) {
4182 f_outbound_nacc_rim_tx_resp(info_ind);
4183 }
4184 if (do_repeat) {
4185 repeat;
4186 }
4187 }
4188}
4189
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004190/* Start NACC from MS side */
4191private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004192 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
4193 boolean skip_final_ctrl_ack := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004194runs on RAW_PCU_Test_CT {
4195 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4196 var RlcmacDlBlock dl_block;
4197 var uint32_t sched_fn;
4198 var GsmArfcn req_arfcn := 862;
4199 var uint6_t req_bsic := 43;
4200
4201 /* Start NACC from MS side */
4202 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4203 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4204
4205 if (exp_rac_ci_query == true) {
4206 /* osmo-pcu should now ask for resolution: */
4207 f_ipa_ctrl_wait_link_up();
4208 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4209 int2str(info_ind.lac) & "." &
4210 int2str(info_ind.cell_id) & "." &
4211 int2str(req_arfcn) & "." &
4212 int2str(req_bsic);
4213 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4214 }
4215
4216 if (exp_si_query == true) {
4217 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004218 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004219 }
4220
4221 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004222 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004223
4224 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4225 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4226 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4227 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4228 f_shutdown(__BFILE__, __LINE__);
4229 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004230 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004231 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004232 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4233 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4234 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004235}
4236
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004237/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4238testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004239 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004240 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004241 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004242
4243 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4244 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4245
4246 /* Initialize NS/BSSGP side */
4247 f_init_bssgp();
4248 /* Initialize GPRS MS side */
4249 f_init_gprs_ms();
4250 ms := g_ms[0]; /* We only use first MS in this test */
4251
4252 /* Initialize the PCU interface abstraction */
4253 f_init_raw(testcasename(), info_ind);
4254
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004255 /* Make sure we are not affected by full cache from previous tests */
4256 f_pcuvty_flush_neigh_caches();
4257
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004258 /* Establish BSSGP connection to the PCU */
4259 f_bssgp_establish();
4260 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4261
4262 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004263 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 +01004264 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4265 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4266
4267 /* Start NACC from MS side */
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004268 f_outbound_nacc_success(ms, info_ind);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004269
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004270 f_shutdown(__BFILE__, __LINE__, final := true);
4271}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004272
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004273/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4274testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4275 var PollFnCtx pollctx;
4276 var GprsMS ms;
4277 var RlcmacDlBlock dl_block;
4278 var uint32_t sched_fn;
4279 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004280
4281 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4282 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4283
4284 /* Initialize NS/BSSGP side */
4285 f_init_bssgp();
4286 /* Initialize GPRS MS side */
4287 f_init_gprs_ms();
4288 ms := g_ms[0]; /* We only use first MS in this test */
4289
4290 /* Initialize the PCU interface abstraction */
4291 f_init_raw(testcasename(), info_ind);
4292
4293 /* Make sure we are not affected by full cache from previous tests */
4294 f_pcuvty_flush_neigh_caches();
4295
4296 /* Establish BSSGP connection to the PCU */
4297 f_bssgp_establish();
4298 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4299
4300 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004301 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 +01004302 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4303 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4304
4305 /* Start NACC from MS side, avoid sending final CTRL ACK */
4306 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true);
4307
4308 /* Wait until we receive something non-dummy */
4309 dl_block := f_skip_dummy(0, sched_fn);
4310 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4311 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4312 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4313 }
4314 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4315 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4316 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4317 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4318 }
4319
4320 f_shutdown(__BFILE__, __LINE__, final := true);
4321}
4322
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004323/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4324testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4325 var PollFnCtx pollctx;
4326 var GprsMS ms;
4327 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004328 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004329
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004330 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4331 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004332
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004333 /* Initialize NS/BSSGP side */
4334 f_init_bssgp();
4335 /* Initialize GPRS MS side */
4336 f_init_gprs_ms();
4337 ms := g_ms[0]; /* We only use first MS in this test */
4338
4339 /* Initialize the PCU interface abstraction */
4340 f_init_raw(testcasename(), info_ind);
4341
4342 /* Make sure we are not affected by full cache from previous tests */
4343 f_pcuvty_flush_neigh_caches();
4344 /* Set timeout values for caches so that entries will be in cache during second try */
4345 f_pcuvty_set_neigh_caches(10, 10);
4346
4347 /* Establish BSSGP connection to the PCU */
4348 f_bssgp_establish();
4349 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4350
4351 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004352 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 +01004353 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4354 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4355
4356 /* Start NACC from MS side */
4357 f_outbound_nacc_success(ms, info_ind);
4358
4359 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
4360 f_outbound_nacc_success(ms, info_ind, false, false);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004361
4362 f_shutdown(__BFILE__, __LINE__, final := true);
4363}
4364
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004365/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4366 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4367 */
4368testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4369 var PollFnCtx pollctx;
4370 var GprsMS ms;
4371 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004372 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4373
4374 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4375 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4376
4377 /* Initialize NS/BSSGP side */
4378 f_init_bssgp();
4379 /* Initialize GPRS MS side */
4380 f_init_gprs_ms();
4381 ms := g_ms[0]; /* We only use first MS in this test */
4382
4383 /* Initialize the PCU interface abstraction */
4384 f_init_raw(testcasename(), info_ind);
4385
4386 /* Make sure we are not affected by full cache from previous tests */
4387 f_pcuvty_flush_neigh_caches();
4388 /* Set timeout values for caches so that entries will be erased before the second try */
4389 f_pcuvty_set_neigh_caches(1, 1);
4390
4391 /* Establish BSSGP connection to the PCU */
4392 f_bssgp_establish();
4393 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4394
4395 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004396 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 +01004397 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4398 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4399
4400 /* Start NACC from MS side */
4401 f_outbound_nacc_success(ms, info_ind);
4402
4403 /* CTRL client should have disconnected from us */
4404 f_ipa_ctrl_wait_link_down();
4405 /* wait for cache entries to time out */
4406 f_sleep(2.0);
4407 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
4408 f_outbound_nacc_success(ms, info_ind);
4409
4410 f_shutdown(__BFILE__, __LINE__, final := true);
4411}
4412
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004413/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004414testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4415 var RlcmacDlBlock dl_block;
4416 var PollFnCtx pollctx;
4417 var uint32_t sched_fn;
4418 var GprsMS ms;
4419 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4420 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004421 var GsmArfcn req_arfcn := 862;
4422 var uint6_t req_bsic := 43;
4423
4424 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4425 * resolution CTRL port, to trigger Conn Refused by socket:
4426 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4427 */
4428
4429 /* Initialize NS/BSSGP side */
4430 f_init_bssgp();
4431 /* Initialize GPRS MS side */
4432 f_init_gprs_ms();
4433 ms := g_ms[0]; /* We only use first MS in this test */
4434
4435 /* Initialize the PCU interface abstraction */
4436 f_init_raw(testcasename(), info_ind);
4437
4438 /* Make sure we are not affected by full cache from previous tests */
4439 f_pcuvty_flush_neigh_caches();
4440
4441 /* Establish BSSGP connection to the PCU */
4442 f_bssgp_establish();
4443 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4444
4445 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004446 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 +01004447 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4448 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4449
4450 /* Start NACC from MS side */
4451 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4452 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4453
4454 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004455 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004456 /* Make sure it is a Pkt Cell Chg Continue */
4457 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4458 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4459 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004460 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4461 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4462 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4463 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4464 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004465
4466 f_shutdown(__BFILE__, __LINE__, final := true);
4467}
4468
4469/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004470testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
4471 var RlcmacDlBlock dl_block;
4472 var PollFnCtx pollctx;
4473 var uint32_t sched_fn;
4474 var GprsMS ms;
4475 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4476 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004477 var GsmArfcn req_arfcn := 862;
4478 var uint6_t req_bsic := 43;
4479
4480 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4481 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4482
4483 /* Initialize NS/BSSGP side */
4484 f_init_bssgp();
4485 /* Initialize GPRS MS side */
4486 f_init_gprs_ms();
4487 ms := g_ms[0]; /* We only use first MS in this test */
4488
4489 /* Initialize the PCU interface abstraction */
4490 f_init_raw(testcasename(), info_ind);
4491
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004492 /* Make sure we are not affected by full cache from previous tests */
4493 f_pcuvty_flush_neigh_caches();
4494
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004495 /* Establish BSSGP connection to the PCU */
4496 f_bssgp_establish();
4497 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4498
4499 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004500 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 +01004501 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4502 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4503
4504 /* Start NACC from MS side */
4505 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4506 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4507
4508 /* osmo-pcu should now ask for resolution: */
4509 f_ipa_ctrl_wait_link_up();
4510 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4511 int2str(info_ind.lac) & "." &
4512 int2str(info_ind.cell_id) & "." &
4513 int2str(req_arfcn) & "." &
4514 int2str(req_bsic);
4515 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
4516 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4517
4518 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004519 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004520 /* Make sure it is a Pkt Cell Chg Continue */
4521 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4522 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4523 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004524 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4525 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4526 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4527 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4528 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004529
4530 f_shutdown(__BFILE__, __LINE__, final := true);
4531}
4532
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004533/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
4534testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
4535 var RlcmacDlBlock dl_block;
4536 var PollFnCtx pollctx;
4537 var uint32_t sched_fn;
4538 var GprsMS ms;
4539 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4540 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004541 var GsmArfcn req_arfcn := 862;
4542 var uint6_t req_bsic := 43;
4543
4544 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4545 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4546
4547 /* Initialize NS/BSSGP side */
4548 f_init_bssgp();
4549 /* Initialize GPRS MS side */
4550 f_init_gprs_ms();
4551 ms := g_ms[0]; /* We only use first MS in this test */
4552
4553 /* Initialize the PCU interface abstraction */
4554 f_init_raw(testcasename(), info_ind);
4555
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004556 /* Make sure we are not affected by full cache from previous tests */
4557 f_pcuvty_flush_neigh_caches();
4558
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004559 /* Establish BSSGP connection to the PCU */
4560 f_bssgp_establish();
4561 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4562
4563 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004564 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 +01004565 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4566 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4567
4568 /* Start NACC from MS side */
4569 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4570 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4571
4572 /* osmo-pcu should now ask for resolution: */
4573 f_ipa_ctrl_wait_link_up();
4574 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4575 int2str(info_ind.lac) & "." &
4576 int2str(info_ind.cell_id) & "." &
4577 int2str(req_arfcn) & "." &
4578 int2str(req_bsic);
4579 /* we receive RAC+CI resolution request and we send incorrectlt formated response */
4580 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
4581
4582 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004583 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004584 /* Make sure it is a Pkt Cell Chg Continue */
4585 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4586 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4587 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004588 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4589 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4590 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4591 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4592 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004593
4594 f_shutdown(__BFILE__, __LINE__, final := true);
4595}
4596
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004597/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
4598testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
4599 var RlcmacDlBlock dl_block;
4600 var PollFnCtx pollctx;
4601 var uint32_t sched_fn;
4602 var GprsMS ms;
4603 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4604 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004605 var GsmArfcn req_arfcn := 862;
4606 var uint6_t req_bsic := 43;
4607 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 */
4608 info_ind.lac),
4609 info_ind.rac),
4610 info_ind.cell_id));
4611 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4612 423),
4613 2),
4614 5));
4615 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
4616 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
4617
4618 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4619 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4620
4621 /* Initialize NS/BSSGP side */
4622 f_init_bssgp();
4623 /* Initialize GPRS MS side */
4624 f_init_gprs_ms();
4625 ms := g_ms[0]; /* We only use first MS in this test */
4626
4627 /* Initialize the PCU interface abstraction */
4628 f_init_raw(testcasename(), info_ind);
4629
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004630 /* Make sure we are not affected by full cache from previous tests */
4631 f_pcuvty_flush_neigh_caches();
4632
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004633 /* Establish BSSGP connection to the PCU */
4634 f_bssgp_establish();
4635 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4636
4637 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004638 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 +01004639 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4640 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4641
4642 /* Start NACC from MS side */
4643 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4644 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4645
4646 /* osmo-pcu should now ask for resolution: */
4647 f_ipa_ctrl_wait_link_up();
4648 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4649 int2str(info_ind.lac) & "." &
4650 int2str(info_ind.cell_id) & "." &
4651 int2str(req_arfcn) & "." &
4652 int2str(req_bsic);
4653 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4654
4655 /* RIM procedure: */
4656 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4657 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4658 tr_RAN_Information_Request_RIM_Container));
4659 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
4660
4661 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004662 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004663 /* Make sure it is a Pkt Cell Chg Continue */
4664 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4665 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4666 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004667 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4668 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4669 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4670 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4671 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004672
4673 f_shutdown(__BFILE__, __LINE__, final := true);
4674}
4675
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004676/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
4677testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
4678 var PollFnCtx pollctx;
4679 var GprsMS ms;
4680 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4681 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4682 var RlcmacDlBlock dl_block;
4683 var uint32_t sched_fn;
4684 var CtrlMessage rx_ctrl;
4685 var GsmArfcn req_arfcn := 862;
4686 var uint6_t req_bsic := 43;
4687
4688 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4689 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4690
4691 /* Initialize NS/BSSGP side */
4692 f_init_bssgp();
4693 /* Initialize GPRS MS side */
4694 f_init_gprs_ms();
4695 ms := g_ms[0]; /* We only use first MS in this test */
4696
4697 /* Initialize the PCU interface abstraction */
4698 f_init_raw(testcasename(), info_ind);
4699
4700 /* Make sure we are not affected by full cache from previous tests */
4701 f_pcuvty_flush_neigh_caches();
4702
4703 /* Establish BSSGP connection to the PCU */
4704 f_bssgp_establish();
4705 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4706
4707 /* Send PACKET RESOURCE REQUEST */
4708 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4709 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4710 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4711
4712 /* Start NACC from MS side */
4713 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4714 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4715
4716 /* osmo-pcu should now ask for resolution: */
4717 f_ipa_ctrl_wait_link_up();
4718 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4719 int2str(info_ind.lac) & "." &
4720 int2str(info_ind.cell_id) & "." &
4721 int2str(req_arfcn) & "." &
4722 int2str(req_bsic);
4723 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4724 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
4725 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4726 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4727 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4728 timer T := 2.0;
4729 T.start;
4730 alt {
4731 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
4732 [] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
4733 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
4734 f_shutdown(__BFILE__, __LINE__);
4735 }
4736 [] T.timeout {
4737 setverdict(pass);
4738 }
4739 }
4740
4741 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004742 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004743
4744 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4745 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4746 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4747 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4748 f_shutdown(__BFILE__, __LINE__);
4749 }
4750 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4751 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4752 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4753 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4754 }
4755
4756 f_shutdown(__BFILE__, __LINE__, final := true);
4757}
4758
4759/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
4760testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
4761 var PollFnCtx pollctx;
4762 var GprsMS ms;
4763 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4764 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4765 var RlcmacDlBlock dl_block;
4766 var uint32_t sched_fn;
4767 var CtrlMessage rx_ctrl;
4768 var GsmArfcn req_arfcn := 862;
4769 var uint6_t req_bsic := 43;
4770
4771 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4772 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4773
4774 /* Initialize NS/BSSGP side */
4775 f_init_bssgp();
4776 /* Initialize GPRS MS side */
4777 f_init_gprs_ms();
4778 ms := g_ms[0]; /* We only use first MS in this test */
4779
4780 /* Initialize the PCU interface abstraction */
4781 f_init_raw(testcasename(), info_ind);
4782
4783 /* Make sure we are not affected by full cache from previous tests */
4784 f_pcuvty_flush_neigh_caches();
4785
4786 /* Establish BSSGP connection to the PCU */
4787 f_bssgp_establish();
4788 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4789
4790 /* Send PACKET RESOURCE REQUEST */
4791 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4792 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4793 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4794
4795 /* Start NACC from MS side */
4796 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4797 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4798
4799 /* osmo-pcu should now ask for resolution: */
4800 f_ipa_ctrl_wait_link_up();
4801 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4802 int2str(info_ind.lac) & "." &
4803 int2str(info_ind.cell_id) & "." &
4804 int2str(req_arfcn) & "." &
4805 int2str(req_bsic);
4806 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4807 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4808 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
4809 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4810 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4811 f_outbound_nacc_rim_tx_resp(info_ind);
4812 timer T := 1.0;
4813 T.start;
4814 alt {
4815 [] RIM.receive {
4816 setverdict(fail, "Received unexpected RIM message");
4817 f_shutdown(__BFILE__, __LINE__);
4818 }
4819 [] T.timeout {
4820 setverdict(pass);
4821 }
4822 }
4823
4824 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004825 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004826
4827 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4828 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4829 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4830 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4831 f_shutdown(__BFILE__, __LINE__);
4832 }
4833 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4834 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4835 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4836 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4837 }
4838
4839 f_shutdown(__BFILE__, __LINE__, final := true);
4840}
4841
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01004842/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
4843testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
4844 var PollFnCtx pollctx;
4845 var GprsMS ms;
4846 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4847 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4848 var RlcmacDlBlock dl_block;
4849 var uint32_t sched_fn;
4850 var CtrlMessage rx_ctrl;
4851 var GsmArfcn req_arfcn := 862;
4852 var uint6_t req_bsic := 43;
4853
4854 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4855 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4856
4857 /* Initialize NS/BSSGP side */
4858 f_init_bssgp();
4859 /* Initialize GPRS MS side */
4860 f_init_gprs_ms();
4861 ms := g_ms[0]; /* We only use first MS in this test */
4862
4863 /* Initialize the PCU interface abstraction */
4864 f_init_raw(testcasename(), info_ind);
4865
4866 /* Make sure we are not affected by full cache from previous tests */
4867 f_pcuvty_flush_neigh_caches();
4868
4869 /* Establish BSSGP connection to the PCU */
4870 f_bssgp_establish();
4871 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4872
4873 /* Send PACKET RESOURCE REQUEST */
4874 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4875 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4876 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4877
4878 /* Start NACC from MS side */
4879 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4880 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4881
4882 /* osmo-pcu should now ask for resolution: */
4883 f_ipa_ctrl_wait_link_up();
4884 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4885 int2str(info_ind.lac) & "." &
4886 int2str(info_ind.cell_id) & "." &
4887 int2str(req_arfcn) & "." &
4888 int2str(req_bsic);
4889 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4890 /* RIM procedure: */
4891 as_outbound_nacc_rim_resolve(info_ind);
4892
4893 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
4894 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
4895 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4896
4897 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
4898 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
4899
4900 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4901 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4902 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4903 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4904 f_shutdown(__BFILE__, __LINE__);
4905 }
4906 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4907 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4908 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4909 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4910 }
4911}
4912
4913/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
4914testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
4915 var PollFnCtx pollctx;
4916 var GprsMS ms;
4917 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4918 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4919 var RlcmacDlBlock dl_block;
4920 var uint32_t sched_fn;
4921 var CtrlMessage rx_ctrl;
4922 var GsmArfcn req_arfcn := 862;
4923 var uint6_t req_bsic := 43;
4924
4925 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4926 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4927
4928 /* Initialize NS/BSSGP side */
4929 f_init_bssgp();
4930 /* Initialize GPRS MS side */
4931 f_init_gprs_ms();
4932 ms := g_ms[0]; /* We only use first MS in this test */
4933
4934 /* Initialize the PCU interface abstraction */
4935 f_init_raw(testcasename(), info_ind);
4936
4937 /* Make sure we are not affected by full cache from previous tests */
4938 f_pcuvty_flush_neigh_caches();
4939
4940 /* Establish BSSGP connection to the PCU */
4941 f_bssgp_establish();
4942 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4943
4944 /* Send PACKET RESOURCE REQUEST */
4945 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4946 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4947 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4948
4949 /* Start NACC from MS side */
4950 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4951 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4952
4953 /* osmo-pcu should now ask for resolution: */
4954 f_ipa_ctrl_wait_link_up();
4955 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4956 int2str(info_ind.lac) & "." &
4957 int2str(info_ind.cell_id) & "." &
4958 int2str(req_arfcn) & "." &
4959 int2str(req_bsic);
4960 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4961 /* RIM procedure: */
4962 as_outbound_nacc_rim_resolve(info_ind);
4963
4964 /* Announce SI back to MS, continue NACC procedure */
4965 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
4966
4967 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
4968 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4969
4970 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4971 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4972 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4973 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4974 f_shutdown(__BFILE__, __LINE__);
4975 }
4976 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4977 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4978 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4979 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4980 }
4981}
4982
4983/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
4984testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
4985 var PollFnCtx pollctx;
4986 var GprsMS ms;
4987 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4988 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4989 var RlcmacDlBlock dl_block;
4990 var uint32_t sched_fn;
4991 var CtrlMessage rx_ctrl;
4992 var GsmArfcn req_arfcn := 862;
4993 var uint6_t req_bsic := 43;
4994
4995 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4996 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4997
4998 /* Initialize NS/BSSGP side */
4999 f_init_bssgp();
5000 /* Initialize GPRS MS side */
5001 f_init_gprs_ms();
5002 ms := g_ms[0]; /* We only use first MS in this test */
5003
5004 /* Initialize the PCU interface abstraction */
5005 f_init_raw(testcasename(), info_ind);
5006
5007 /* Make sure we are not affected by full cache from previous tests */
5008 f_pcuvty_flush_neigh_caches();
5009
5010 /* Establish BSSGP connection to the PCU */
5011 f_bssgp_establish();
5012 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5013
5014 /* Send PACKET RESOURCE REQUEST */
5015 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5016 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5017 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5018
5019 /* Start NACC from MS side */
5020 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5021 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5022
5023 /* osmo-pcu should now ask for resolution: */
5024 f_ipa_ctrl_wait_link_up();
5025 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5026 int2str(info_ind.lac) & "." &
5027 int2str(info_ind.cell_id) & "." &
5028 int2str(req_arfcn) & "." &
5029 int2str(req_bsic);
5030 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5031 /* RIM procedure: */
5032 as_outbound_nacc_rim_resolve(info_ind);
5033
5034 /* Announce SI back to MS, continue NACC procedure */
5035 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5036
5037 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5038 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5039 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5040 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5041 f_shutdown(__BFILE__, __LINE__);
5042 }
5043 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5044 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5045
5046 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5047 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5048 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5049 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5050 }
5051}
5052
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005053/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5054 * while waiting for CTRL resolution */
5055testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5056 var PollFnCtx pollctx;
5057 var GprsMS ms;
5058 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5059 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5060 var RlcmacDlBlock dl_block;
5061 var uint32_t sched_fn;
5062 var CtrlMessage rx_ctrl;
5063 var GsmArfcn req_arfcn := 862;
5064 var uint6_t req_bsic := 43;
5065
5066 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5067 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5068
5069 /* Initialize NS/BSSGP side */
5070 f_init_bssgp();
5071 /* Initialize GPRS MS side */
5072 f_init_gprs_ms();
5073 ms := g_ms[0]; /* We only use first MS in this test */
5074
5075 /* Initialize the PCU interface abstraction */
5076 f_init_raw(testcasename(), info_ind);
5077
5078 /* Make sure we are not affected by full cache from previous tests */
5079 f_pcuvty_flush_neigh_caches();
5080
5081 /* Establish BSSGP connection to the PCU */
5082 f_bssgp_establish();
5083 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5084
5085 /* Send PACKET RESOURCE REQUEST */
5086 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5087 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5088 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5089
5090 /* Start NACC from MS side */
5091 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5092 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5093
5094 /* osmo-pcu should now ask for resolution: */
5095 f_ipa_ctrl_wait_link_up();
5096 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5097 int2str(info_ind.lac) & "." &
5098 int2str(info_ind.cell_id) & "." &
5099 int2str(req_arfcn) & "." &
5100 int2str(req_bsic);
5101 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5102 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5103 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5104 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5105 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5106 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5107 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
5108 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5109 int2str(info_ind.lac) & "." &
5110 int2str(info_ind.cell_id) & "." &
5111 int2str(req_arfcn + 1) & "." &
5112 int2str(req_bsic + 1);
5113 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5114
5115 /* And finally everything continues as usual with RIN procedure */
5116 as_outbound_nacc_rim_resolve(info_ind);
5117
5118 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005119 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005120
5121 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5122 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5123 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5124 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5125 f_shutdown(__BFILE__, __LINE__);
5126 }
5127 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5128 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5129 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5130 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5131 }
5132
5133 f_shutdown(__BFILE__, __LINE__, final := true);
5134}
5135
5136/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5137 * while waiting for SI resolution */
5138testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5139 var PollFnCtx pollctx;
5140 var GprsMS ms;
5141 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5142 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5143 var RlcmacDlBlock dl_block;
5144 var uint32_t sched_fn;
5145 var CtrlMessage rx_ctrl;
5146 var GsmArfcn req_arfcn := 862;
5147 var uint6_t req_bsic := 43;
5148
5149 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5150 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5151
5152 /* Initialize NS/BSSGP side */
5153 f_init_bssgp();
5154 /* Initialize GPRS MS side */
5155 f_init_gprs_ms();
5156 ms := g_ms[0]; /* We only use first MS in this test */
5157
5158 /* Initialize the PCU interface abstraction */
5159 f_init_raw(testcasename(), info_ind);
5160
5161 /* Make sure we are not affected by full cache from previous tests */
5162 f_pcuvty_flush_neigh_caches();
5163
5164 /* Establish BSSGP connection to the PCU */
5165 f_bssgp_establish();
5166 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5167
5168 /* Send PACKET RESOURCE REQUEST */
5169 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5170 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5171 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5172
5173 /* Start NACC from MS side */
5174 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5175 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5176
5177 /* osmo-pcu should now ask for resolution: */
5178 f_ipa_ctrl_wait_link_up();
5179 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5180 int2str(info_ind.lac) & "." &
5181 int2str(info_ind.cell_id) & "." &
5182 int2str(req_arfcn) & "." &
5183 int2str(req_bsic);
5184 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5185 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5186 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5187 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5188 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5189 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5190 f_outbound_nacc_rim_tx_resp(info_ind);
5191
5192 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
5193 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5194 int2str(info_ind.lac) & "." &
5195 int2str(info_ind.cell_id) & "." &
5196 int2str(req_arfcn + 1) & "." &
5197 int2str(req_bsic + 1);
5198 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5199
5200 /* And finally everything continues as usual with RIN procedure */
5201 as_outbound_nacc_rim_resolve(info_ind);
5202
5203 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005204 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005205
5206 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5207 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5208 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5209 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5210 f_shutdown(__BFILE__, __LINE__);
5211 }
5212 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5213 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5214 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5215 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5216 }
5217
5218 f_shutdown(__BFILE__, __LINE__, final := true);
5219}
5220
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005221/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5222 * while sending Pkt Neigh Data Change */
5223testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5224 var PollFnCtx pollctx;
5225 var GprsMS ms;
5226 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5227 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5228 var RlcmacDlBlock dl_block;
5229 var uint32_t sched_fn;
5230 var CtrlMessage rx_ctrl;
5231 var GsmArfcn req_arfcn := 862;
5232 var uint6_t req_bsic := 43;
5233
5234 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5235 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5236
5237 /* Initialize NS/BSSGP side */
5238 f_init_bssgp();
5239 /* Initialize GPRS MS side */
5240 f_init_gprs_ms();
5241 ms := g_ms[0]; /* We only use first MS in this test */
5242
5243 /* Initialize the PCU interface abstraction */
5244 f_init_raw(testcasename(), info_ind);
5245
5246 /* Make sure we are not affected by full cache from previous tests */
5247 f_pcuvty_flush_neigh_caches();
5248
5249 /* Establish BSSGP connection to the PCU */
5250 f_bssgp_establish();
5251 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5252
5253 /* Send PACKET RESOURCE REQUEST */
5254 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5255 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5256 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5257
5258 /* Start NACC from MS side */
5259 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5260 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5261
5262 /* osmo-pcu should now ask for resolution: */
5263 f_ipa_ctrl_wait_link_up();
5264 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5265 int2str(info_ind.lac) & "." &
5266 int2str(info_ind.cell_id) & "." &
5267 int2str(req_arfcn) & "." &
5268 int2str(req_bsic);
5269 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5270 /* RIM procedure: */
5271 as_outbound_nacc_rim_resolve(info_ind);
5272
5273 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5274 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5275 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5276 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5277
5278 /* It should trigger RAC_CI resolution to start again: */
5279 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5280 int2str(info_ind.lac) & "." &
5281 int2str(info_ind.cell_id) & "." &
5282 int2str(req_arfcn + 1) & "." &
5283 int2str(req_bsic + 1);
5284 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5285 /* RIM procedure: */
5286 as_outbound_nacc_rim_resolve(info_ind);
5287 /* Transmit SI back to MS */
5288 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5289
5290 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5291 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5292 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5293 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5294 f_shutdown(__BFILE__, __LINE__);
5295 }
5296 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5297 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5298 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5299 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5300 }
5301}
5302
5303/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5304testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5305 var PollFnCtx pollctx;
5306 var GprsMS ms;
5307 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5308 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5309 var RlcmacDlBlock dl_block;
5310 var uint32_t sched_fn;
5311 var CtrlMessage rx_ctrl;
5312 var GsmArfcn req_arfcn := 862;
5313 var uint6_t req_bsic := 43;
5314
5315 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5316 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5317
5318 /* Initialize NS/BSSGP side */
5319 f_init_bssgp();
5320 /* Initialize GPRS MS side */
5321 f_init_gprs_ms();
5322 ms := g_ms[0]; /* We only use first MS in this test */
5323
5324 /* Initialize the PCU interface abstraction */
5325 f_init_raw(testcasename(), info_ind);
5326
5327 /* Make sure we are not affected by full cache from previous tests */
5328 f_pcuvty_flush_neigh_caches();
5329
5330 /* Establish BSSGP connection to the PCU */
5331 f_bssgp_establish();
5332 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5333
5334 /* Send PACKET RESOURCE REQUEST */
5335 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5336 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5337 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5338
5339 /* Start NACC from MS side */
5340 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5341 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5342
5343 /* osmo-pcu should now ask for resolution: */
5344 f_ipa_ctrl_wait_link_up();
5345 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5346 int2str(info_ind.lac) & "." &
5347 int2str(info_ind.cell_id) & "." &
5348 int2str(req_arfcn) & "." &
5349 int2str(req_bsic);
5350 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5351 /* RIM procedure: */
5352 as_outbound_nacc_rim_resolve(info_ind);
5353
5354 /* Announce SI back to MS, continue NACC procedure */
5355 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5356
5357 /* trigger a Pkt Cell Change Notif with different tgt cell */
5358 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5359 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5360
5361 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5362 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5363
5364 /* It should trigger RAC_CI resolution to start again: */
5365 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5366 int2str(info_ind.lac) & "." &
5367 int2str(info_ind.cell_id) & "." &
5368 int2str(req_arfcn + 1) & "." &
5369 int2str(req_bsic + 1);
5370 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5371 /* RIM procedure: */
5372 as_outbound_nacc_rim_resolve(info_ind);
5373 /* Transmit SI back to MS */
5374 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5375
5376 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5377 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5378 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5379 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5380 f_shutdown(__BFILE__, __LINE__);
5381 }
5382 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5383 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5384 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5385 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5386 }
5387}
5388
5389/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5390testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5391 var PollFnCtx pollctx;
5392 var GprsMS ms;
5393 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5394 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5395 var RlcmacDlBlock dl_block;
5396 var uint32_t sched_fn;
5397 var CtrlMessage rx_ctrl;
5398 var GsmArfcn req_arfcn := 862;
5399 var uint6_t req_bsic := 43;
5400
5401 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5402 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5403
5404 /* Initialize NS/BSSGP side */
5405 f_init_bssgp();
5406 /* Initialize GPRS MS side */
5407 f_init_gprs_ms();
5408 ms := g_ms[0]; /* We only use first MS in this test */
5409
5410 /* Initialize the PCU interface abstraction */
5411 f_init_raw(testcasename(), info_ind);
5412
5413 /* Make sure we are not affected by full cache from previous tests */
5414 f_pcuvty_flush_neigh_caches();
5415
5416 /* Establish BSSGP connection to the PCU */
5417 f_bssgp_establish();
5418 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5419
5420 /* Send PACKET RESOURCE REQUEST */
5421 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5422 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5423 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5424
5425 /* Start NACC from MS side */
5426 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5427 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5428
5429 /* osmo-pcu should now ask for resolution: */
5430 f_ipa_ctrl_wait_link_up();
5431 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5432 int2str(info_ind.lac) & "." &
5433 int2str(info_ind.cell_id) & "." &
5434 int2str(req_arfcn) & "." &
5435 int2str(req_bsic);
5436 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5437 /* RIM procedure: */
5438 as_outbound_nacc_rim_resolve(info_ind);
5439
5440 /* Announce SI back to MS, continue NACC procedure */
5441 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5442
5443 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5444 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5445 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5446 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5447 f_shutdown(__BFILE__, __LINE__);
5448 }
5449
5450 /* trigger a Pkt Cell Change Notif with different tgt cell */
5451 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5452 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5453
5454 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5455 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5456 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5457 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5458 }
5459 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5460 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
5461
5462 /* It should trigger RAC_CI resolution to start again: */
5463 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5464 int2str(info_ind.lac) & "." &
5465 int2str(info_ind.cell_id) & "." &
5466 int2str(req_arfcn + 1) & "." &
5467 int2str(req_bsic + 1);
5468 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5469 /* RIM procedure: */
5470 as_outbound_nacc_rim_resolve(info_ind);
5471 /* Transmit SI back to MS */
5472 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5473
5474 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5475 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5476 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5477 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5478 f_shutdown(__BFILE__, __LINE__);
5479 }
5480 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5481 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5482 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5483 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5484 }
5485}
5486
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005487/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
5488testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
5489 var PollFnCtx pollctx;
5490 var GprsMS ms;
5491 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5492 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5493 var RlcmacDlBlock dl_block;
5494 var uint32_t sched_fn, dl_fn;
5495 var CtrlMessage rx_ctrl;
5496 var GsmArfcn req_arfcn := 862;
5497 var uint6_t req_bsic := 43;
5498 var octetstring data := f_rnd_octstring(10);
5499
5500 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5501 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5502
5503 /* Initialize NS/BSSGP side */
5504 f_init_bssgp();
5505 /* Initialize GPRS MS side */
5506 f_init_gprs_ms();
5507 ms := g_ms[0]; /* We only use first MS in this test */
5508
5509 /* Initialize the PCU interface abstraction */
5510 f_init_raw(testcasename(), info_ind);
5511
5512 /* Make sure we are not affected by full cache from previous tests */
5513 f_pcuvty_flush_neigh_caches();
5514
5515 /* Establish BSSGP connection to the PCU */
5516 f_bssgp_establish();
5517 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5518
5519 /* Send PACKET RESOURCE REQUEST */
5520 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5521 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5522 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5523
5524 /* Start NACC from MS side */
5525 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5526 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5527
5528 /* osmo-pcu should now ask for resolution: */
5529 f_ipa_ctrl_wait_link_up();
5530 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5531 int2str(info_ind.lac) & "." &
5532 int2str(info_ind.cell_id) & "." &
5533 int2str(req_arfcn) & "." &
5534 int2str(req_bsic);
5535 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5536 /* RIM procedure: */
5537 as_outbound_nacc_rim_resolve(info_ind);
5538
5539 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
5540 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
5541 f_sleep(0.1);
5542 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
5543 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
5544
5545 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
5546 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5547 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
5548 * Data with unassigned DL TBF in line above): */
5549 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5550 /* Continue receiving Pkt Cell Neighbor Data */
5551 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5552
5553 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5554 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5555 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5556 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5557 f_shutdown(__BFILE__, __LINE__);
5558 }
5559 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5560 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5561 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5562 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5563 }
5564
5565 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
5566 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
5567 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
5568 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
5569 f_dl_block_ack_fn(dl_block, dl_fn));
5570}
5571
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005572/* Send a RIM RAN info request to the PCU and verify the response, we expect
5573 * getting the system information back which we have transfered to the PCU via
5574 * PCUIF on startup. */
5575testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
5576 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005577 timer T := 2.0;
5578
5579 /* Initialize NS/BSSGP side */
5580 f_init_bssgp();
5581
5582 /* Initialize the PCU interface abstraction */
5583 f_init_raw(testcasename());
5584
5585 /* Establish BSSGP connection to the PCU */
5586 f_bssgp_establish();
5587
5588 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005589 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 +01005590 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005591 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 +01005592 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02005593 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);
5594 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005595 f_sleep(1.0);
5596
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005597 var RIM_Routing_Address dst_addr;
5598 var RIM_Routing_Address src_addr;
5599 var template (value) RAN_Information_Request_RIM_Container req_cont;
5600 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005601 var template PDU_BSSGP bssgp_rim_pdu_expect;
5602 var template RAN_Information_RIM_Container rim_cont_expect;
5603
5604 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 +01005605 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5606 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005607
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005608 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5609 ts_RIM_Sequence_Number(1),
5610 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5611 ts_RIM_Protocol_Version_Number(1),
5612 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5613 omit);
5614 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5615 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5616 req_cont);
5617
5618 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5619 tr_RIM_Sequence_Number(1),
5620 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5621 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005622 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 +01005623 omit);
5624
5625 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5626 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5627 rim_cont_expect);
5628 RIM.send(bssgp_rim_pdu);
5629 T.start;
5630 alt {
5631 [] RIM.receive(bssgp_rim_pdu_expect) { }
5632 [] RIM.receive {
5633 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5634 }
5635 [] T.timeout {
5636 setverdict(fail, "No BSSGP RIM PDU received");
5637 mtc.stop;
5638 }
5639 }
5640
5641 f_shutdown(__BFILE__, __LINE__, final := true);
5642}
5643
5644/* Same as above, but in this case we simulate the rare case in which the PCU
5645 * has no system information available. We expect getting a response back but
5646 * with no system information inside. */
5647testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005648 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005649 var PCUIF_Message pcu_msg;
5650 timer T := 2.0;
5651
5652 /* Initialize NS/BSSGP side */
5653 f_init_bssgp();
5654
5655 /* Initialize the PCU interface abstraction */
5656 f_init_raw(testcasename(), info_ind);
5657
5658 /* Establish BSSGP connection to the PCU */
5659 f_bssgp_establish();
5660
5661 /* Clear sysinfo from the PCU */
5662 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);
5663 BTS.send(si1_data_ind);
5664 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);
5665 BTS.send(si3_data_ind);
5666 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);
5667 BTS.send(si16_data_ind);
5668 f_sleep(1.0);
5669
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005670 var RIM_Routing_Address dst_addr;
5671 var RIM_Routing_Address src_addr;
5672 var template (value) RAN_Information_Request_RIM_Container req_cont;
5673 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005674 var template PDU_BSSGP bssgp_rim_pdu_expect;
5675 var template RAN_Information_RIM_Container rim_cont_expect;
5676
5677 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 +01005678 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5679 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005680
5681 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5682 ts_RIM_Sequence_Number(1),
5683 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5684 ts_RIM_Protocol_Version_Number(1),
5685 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5686 omit);
5687 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5688 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5689 req_cont);
5690
5691
5692 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5693 tr_RIM_Sequence_Number(1),
5694 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5695 tr_RIM_Protocol_Version_Number(1),
5696 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
5697 omit);
5698
5699 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5700 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5701 rim_cont_expect);
5702 RIM.send(bssgp_rim_pdu);
5703 T.start;
5704 alt {
5705 [] RIM.receive(bssgp_rim_pdu_expect) { }
5706 [] RIM.receive {
5707 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5708 }
5709 [] T.timeout {
5710 setverdict(fail, "No BSSGP RIM PDU received");
5711 mtc.stop;
5712 }
5713 }
5714
5715 f_shutdown(__BFILE__, __LINE__, final := true);
5716}
5717
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005718control {
5719 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01005720 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005721 execute( TC_ta_ptcch_idle() );
5722 execute( TC_ta_rach_imm_ass() );
5723 execute( TC_ta_idle_dl_tbf_ass() );
5724 execute( TC_ta_ptcch_ul_multi_tbf() );
5725 execute( TC_cs_lqual_ul_tbf() );
5726 execute( TC_cs_initial_ul() );
5727 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01005728 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01005729 execute( TC_cs_max_dl() );
5730 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01005731 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01005732 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01005733 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01005734 execute( TC_mcs_max_dl() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01005735 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02005736 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01005737 execute( TC_x2031_t3191() );
5738 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005739 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01005740 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02005741 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02005742 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02005743 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005744 execute( TC_mo_ping_pong() );
5745 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02005746 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005747 execute( TC_mt_ping_pong() );
5748 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005749 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005750 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07005751 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005752 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01005753 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005754 execute( TC_paging_cs_from_bts() );
5755 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
5756 execute( TC_paging_cs_from_sgsn_sign() );
5757 execute( TC_paging_cs_from_sgsn_ptp() );
5758 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
5759 execute( TC_paging_ps_from_sgsn_sign() );
5760 execute( TC_paging_ps_from_sgsn_ptp() );
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005761 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
5762 execute( TC_paging_cs_multi_ms_imsi() );
5763 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02005764 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
5765 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01005766 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
5767 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005768
5769 /* EGPRS specific test cases */
5770 execute( TC_egprs_pkt_chan_req_signalling() );
5771 execute( TC_egprs_pkt_chan_req_one_phase() );
5772 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07005773 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07005774 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07005775 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02005776
5777 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005778
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01005779 /* Immediate Assignment on AGCH/PCH */
5780 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
5781 execute( TC_pcuif_fh_imm_ass_ul() );
5782 execute( TC_pcuif_fh_imm_ass_dl() );
5783 /* Packet Uplink/Downlink Assignment on PACCH */
5784 execute( TC_pcuif_fh_pkt_ass_ul() );
5785 execute( TC_pcuif_fh_pkt_ass_dl() );
5786 execute( TC_multitrx_multims_alloc() );
5787 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
5788 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
5789 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
5790
Pau Espin Pedrole1303052020-11-16 11:13:51 +01005791 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07005792
5793 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005794 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005795 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005796 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005797 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005798 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005799 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005800 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005801 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005802 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
5803 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005804 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
5805 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
5806 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005807 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
5808 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005809 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
5810 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
5811 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005812 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005813
5814 execute( TC_rim_ran_info_req_single_rep() );
5815 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005816}
5817
Harald Weltea419df22019-03-21 17:23:04 +01005818}