blob: 5f60cef025361d0c2126ebcecb0beb22b352a014 [file] [log] [blame]
Harald Weltea0895f92018-03-08 11:51:23 +01001module PCU_Tests {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002
3/* "RAW" PCU tests: Talk directly to the PCU socket of OsmoPCU on the one hand side (emulating
4 the BTS/BSC side PCU socket server) and the Gb interface on the other hand side. No NS/BSSGP
5 Emulation is used; rather, we simply use the NS_CodecPort to implement both standard and non-
6 standard procedures on the NS and BSSGP level. The goal of these tests is to test exactly
7 those NS and BSSGP implementations on the BSS (PCU) side. */
8
9/* (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +070010 * (C) 2019-2020 Vadim Yanitskiy <axilirator@gmail.com>
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020011 * All rights reserved.
12 *
13 * Released under the terms of GNU General Public License, Version 2 or
14 * (at your option) any later version.
15 *
16 * SPDX-License-Identifier: GPL-2.0-or-later
17 */
18
19friend module PCU_Tests_NS;
20
21import from General_Types all;
22import from Osmocom_Types all;
23import from GSM_Types all;
24import from GSM_RR_Types all;
25
26import from Osmocom_VTY_Functions all;
27import from TELNETasp_PortType all;
28
29import from MobileL3_GMM_SM_Types all;
30import from RLCMAC_CSN1_Types all;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020031import from RLCMAC_CSN1_Templates all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020032import from RLCMAC_Types all;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020033import from RLCMAC_Templates all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020034
35import from MobileL3_CommonIE_Types all;
36import from L3_Templates all;
37
38import from NS_Types all;
39import from BSSGP_Types all;
40import from Osmocom_Gb_Types all;
41
42import from BSSGP_Emulation all; /* BssgpConfig */
43import from NS_Emulation all; /* NSConfiguration */
44
45import from UD_Types all;
46import from PCUIF_Types all;
47import from PCUIF_CodecPort all;
48import from PCUIF_Components all;
49import from IPL4asp_Types all;
50import from Native_Functions all;
51import from SGSN_Components all;
Pau Espin Pedrolaedc5112020-05-16 17:30:42 +020052import from GPRS_Components all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020053
Daniel Willmann535aea62020-09-21 13:27:08 +020054import from StatsD_Types all;
55import from StatsD_CodecPort all;
56import from StatsD_CodecPort_CtrlFunct all;
57import from StatsD_Checker all;
58
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010059import from IPA_Emulation all;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +010060import from Osmocom_CTRL_Types all;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010061import from Osmocom_CTRL_Adapter all;
62import from Osmocom_CTRL_Functions all;
63
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020064modulepar {
65 charstring mp_pcu_sock_path := PCU_SOCK_DEFAULT;
66
67 float X2002 := 0.2; /* Timer -2002, IMM ASSIGN confirm delay */
Daniel Willmann535aea62020-09-21 13:27:08 +020068
69 charstring mp_pcu_statsd_ip := "127.0.0.1";
70 integer mp_pcu_statsd_port := 8125;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010071
72 charstring mp_ctrl_neigh_ip := "127.0.0.1";
73 integer mp_ctrl_neigh_port := 4248;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020074}
75
76
77/* FIXME: make sure to use parameters from mp_gb_cfg.cell_id in the PCU INFO IND */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +010078friend template (value) PCUIF_info_ind ts_PCUIF_INFO_default(template (value) PCUIF_Flags flags := c_PCUIF_Flags_default)
79:= {
Vadim Yanitskiyc1559302020-07-19 16:39:12 +070080 version := PCUIF_Types.mp_pcuif_version,
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +010081 flags := flags,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +010082 trx := ts_PCUIF_InfoTrxs_def(GPRS_Components.mp_base_arfcn),
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020083 bsic := 7,
84 mcc := 262,
85 mnc := 42,
86 mnc_3_digits := 0,
87 lac := 13135,
88 rac := 0,
89 nsei := mp_nsconfig.nsei,
90 nse_timer := { 3, 3, 3, 3, 30, 3, 10 },
91 cell_timer := { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 },
92 cell_id := 20960,
93 repeat_time := 5 * 50,
94 repeat_count := 3,
Harald Welte5339b2e2020-10-04 22:52:56 +020095 bvci := mp_gb_cfg.bvc[0].bvci,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020096 t3142 := 20,
97 t3169 := 5,
98 t3191 := 5,
99 t3193_10ms := 160,
100 t3195 := 5,
Pau Espin Pedrol76de1662021-03-01 17:40:58 +0100101 n3101 := 10,
102 n3103 := 4,
103 n3105 := 8,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200104 cv_countdown := 15,
105 dl_tbf_ext := 250 * 10, /* ms */
106 ul_tbf_ext := 250 * 10, /* ms */
107 initial_cs := 2,
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +0100108 initial_mcs := 1,
Harald Welte90f19742020-11-06 19:34:40 +0100109 nsvci := { mp_nsconfig.nsvc[0].nsvci, 0 },
110 local_port := { mp_nsconfig.nsvc[0].provider.ip.remote_udp_port, 0 },
111 remote_port := { mp_nsconfig.nsvc[0].provider.ip.local_udp_port, 0 },
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100112 remote_addr := f_PCUIF_RemoteAddr(
Harald Welte90f19742020-11-06 19:34:40 +0100113 f_PCUIF_AF2addr_type(mp_nsconfig.nsvc[0].provider.ip.address_family), mp_nsconfig.nsvc[0].provider.ip.local_ip)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200114}
115
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100116/* Passed in RAN-INFO message from emulated neighbor using RIM */
117const octetstring si1_default := '198fb100000000000000000000000000007900002b'O;
118const octetstring si3_default := '1b753000f110236ec9033c2747407900003c0b2b2b'O;
119const octetstring si13_default := '009000185a6fc9e08410ab2b2b2b2b2b2b2b2b2b2b'O;
120const octetstring si_default := si1_default & si3_default & si13_default;
121
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +0100122const MultislotCap_GPRS mscap_gprs_def := {
123 gprsmultislotclass := '00011'B,
124 gprsextendeddynalloccap := '0'B
125};
126const MultislotCap_EGPRS mscap_egprs_def := {
127 egprsmultislotclass := '00011'B,
128 egprsextendeddynalloccap := '0'B
129};
130template (value) MSRadioAccessCapabilityV ms_racap_gprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, omit) };
131template (value) MSRadioAccessCapabilityV ms_racap_egprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, mscap_egprs_def) };
132
133const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs_def := {
134 gprsmultislotclass := '00011'B,
135 gprsextendeddynalloccap := '0'B
136};
137const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs_def := {
138 egprsmultislotclass := '00011'B,
139 egprsextendeddynalloccap := '0'B
140};
141template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, omit)) };
142template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, bssgp_mscap_egprs_def)) };
143
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200144type record lqual_range {
145 /* component reference to the IPA_Client component used for RSL */
146 uint8_t low,
147 uint8_t high
148}
149
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +0100150type component RAW_PCU_Test_CT extends bssgp_CT, MS_BTS_IFACE_CT, StatsD_ConnHdlr, CTRL_Adapter_CT {
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700151 /* PCU interface abstraction component */
152 var RAW_PCUIF_CT vc_PCUIF;
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700153
Daniel Willmann535aea62020-09-21 13:27:08 +0200154 /* StatsD */
155 var StatsD_Checker_CT vc_STATSD;
156
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200157 /* Connection to the PCUIF component */
158 port RAW_PCU_MSG_PT PCUIF;
159 /* VTY connection to the PCU */
160 port TELNETasp_PT PCUVTY;
161
162 /* Uplink CS/MCS thresholds, default from pcu_main.c: */
163 var lqual_range g_cs_lqual_ranges[4] := {{low := 0, high := 6},
164 {low := 5, high := 8},
165 {low := 7, high := 13},
166 {low := 12,high := 35}};
167 var lqual_range g_mcs_lqual_ranges[9] := {{low := 0, high := 6},
168 {low := 5, high := 8},
169 {low := 7, high := 13},
170 {low := 12,high := 15},
171 {low := 14, high := 17},
172 {low := 16, high := 18},
173 {low := 17,high := 20},
174 {low := 19, high := 24},
175 {low := 23,high := 35}};
176 var uint8_t g_cs_initial_dl := 1;
177 var uint8_t g_cs_initial_ul := 1;
178 var uint8_t g_mcs_initial_dl := 1;
179 var uint8_t g_mcs_initial_ul := 1;
180 var uint8_t g_cs_max_dl := 4;
181 var uint8_t g_cs_max_ul := 4;
182 var uint8_t g_mcs_max_dl := 9;
183 var uint8_t g_mcs_max_ul := 9;
184
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200185 var boolean g_force_two_phase_access := false;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200186
187 /* Guard timeout */
188 timer g_T_guard := 60.0;
189};
190
191private altstep as_Tguard_RAW() runs on RAW_PCU_Test_CT {
192 [] g_T_guard.timeout {
193 setverdict(fail, "Timeout of T_guard");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700194 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200195 }
196}
197
198private function f_pcuvty_set_allowed_cs_mcs() runs on RAW_PCU_Test_CT {
199 f_vty_config2(PCUVTY, {"pcu"}, "cs " & int2str(g_cs_initial_dl) & " " & int2str(g_cs_initial_ul));
200 f_vty_config2(PCUVTY, {"pcu"}, "cs max " & int2str(g_cs_max_dl) & " " & int2str(g_cs_max_ul));
201
202 f_vty_config2(PCUVTY, {"pcu"}, "mcs " & int2str(g_mcs_initial_dl) & " " & int2str(g_mcs_initial_ul));
203 f_vty_config2(PCUVTY, {"pcu"}, "mcs max " & int2str(g_mcs_max_dl) & " " & int2str(g_mcs_max_ul));
204}
205
206private function f_pcuvty_set_link_quality_ranges() runs on RAW_PCU_Test_CT {
207 var charstring cmd;
208
209 cmd := "cs link-quality-ranges" &
210 " cs1 " & int2str(g_cs_lqual_ranges[0].high) &
211 " cs2 " & int2str(g_cs_lqual_ranges[1].low) & " " & int2str(g_cs_lqual_ranges[1].high) &
212 " cs3 " & int2str(g_cs_lqual_ranges[2].low) & " " & int2str(g_cs_lqual_ranges[2].high) &
213 " cs4 " & int2str(g_cs_lqual_ranges[3].low);
214 f_vty_config2(PCUVTY, {"pcu"}, cmd);
215
216 cmd := "mcs link-quality-ranges" &
217 " mcs1 " & int2str(g_mcs_lqual_ranges[0].high) &
218 " mcs2 " & int2str(g_mcs_lqual_ranges[1].low) & " " & int2str(g_mcs_lqual_ranges[1].high) &
219 " mcs3 " & int2str(g_mcs_lqual_ranges[2].low) & " " & int2str(g_mcs_lqual_ranges[2].high) &
220 " mcs4 " & int2str(g_mcs_lqual_ranges[3].low) & " " & int2str(g_mcs_lqual_ranges[3].high) &
221 " mcs5 " & int2str(g_mcs_lqual_ranges[4].low) & " " & int2str(g_mcs_lqual_ranges[4].high) &
222 " mcs6 " & int2str(g_mcs_lqual_ranges[5].low) & " " & int2str(g_mcs_lqual_ranges[5].high) &
223 " mcs7 " & int2str(g_mcs_lqual_ranges[6].low) & " " & int2str(g_mcs_lqual_ranges[6].high) &
224 " mcs8 " & int2str(g_mcs_lqual_ranges[7].low) & " " & int2str(g_mcs_lqual_ranges[7].high) &
225 " mcs9 " & int2str(g_mcs_lqual_ranges[8].low);
226 f_vty_config2(PCUVTY, {"pcu"}, cmd);
227}
228
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100229private function f_pcuvty_flush_neigh_caches() runs on RAW_PCU_Test_CT {
230 f_pcuvty_set_neigh_caches(0, 0);
231}
232
233private function f_pcuvty_set_neigh_caches(integer neigh_cache_secs := -1, integer si_cache_secs := -1)
234runs on RAW_PCU_Test_CT {
235 if (neigh_cache_secs == -1) {
236 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 default");
237 } else {
238 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 " & int2str(neigh_cache_secs));
239 }
240 if (si_cache_secs == -1) {
241 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 default");
242 } else {
243 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 " & int2str(si_cache_secs));
244 }
245}
246
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100247private function f_init_vty(charstring id, boolean egprs_only) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200248 map(self:PCUVTY, system:PCUVTY);
249 f_vty_set_prompts(PCUVTY);
250 f_vty_transceive(PCUVTY, "enable");
251
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100252 /* This will be removed soon, not needed. EGPRS support is controlled through pcu_ind flags */
253 if (egprs_only) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200254 f_vty_config2(PCUVTY, {"pcu"}, "egprs only");
255 } else {
256 f_vty_config2(PCUVTY, {"pcu"}, "no egprs");
257 }
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200258
259 if (g_force_two_phase_access) {
260 f_vty_config2(PCUVTY, {"pcu"}, "two-phase-access");
261 } else {
262 f_vty_config2(PCUVTY, {"pcu"}, "no two-phase-access");
263 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200264}
265
Pau Espin Pedrol2456dad2020-04-30 20:22:38 +0200266function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200267runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200268 /* Start the guard timer */
269 g_T_guard.start;
270 activate(as_Tguard_RAW());
271
272 /* Init PCU interface component */
Harald Welte5339b2e2020-10-04 22:52:56 +0200273 vc_PCUIF := RAW_PCUIF_CT.create("PCUIF");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200274 connect(vc_PCUIF:MTC, self:PCUIF);
275 map(vc_PCUIF:PCU, system:PCU);
276
277 /* Create one BTS component (we may want more some day) */
Harald Welte5339b2e2020-10-04 22:52:56 +0200278 vc_BTS := RAW_PCU_BTS_CT.create("BTS");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200279 connect(vc_BTS:PCUIF, vc_PCUIF:BTS);
280 connect(vc_BTS:TC, self:BTS);
281
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100282 f_init_vty(id, f_pcuif_ind_flags_egprs_enabled(valueof(info_ind.flags)));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200283
Daniel Willmann535aea62020-09-21 13:27:08 +0200284 f_init_statsd(id, vc_STATSD, mp_pcu_statsd_ip, mp_pcu_statsd_port);
285 /* This is normally done in the ConnHdlr component, but here
286 * the Test_CT doubles as ConnHdlr */
287 connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
288
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200289 vc_PCUIF.start(f_PCUIF_CT_handler(mp_pcu_sock_path));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100290 vc_BTS.start(f_BTS_CT_handler(0, valueof(info_ind), true));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200291
292 /* Wait until the BTS is ready (SI13 negotiated) */
293 BTS.receive(tr_RAW_PCU_EV(BTS_EV_SI13_NEGO));
294}
295
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700296/* Register TLLI of each allocated GprsMS instance */
297private function f_multi_ms_bssgp_register()
298runs on RAW_PCU_Test_CT {
299 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
300 f_bssgp_client_llgmm_assign(TLLI_UNUSED, g_ms[i].tlli);
301 }
302}
303
304/* Allocate [and activate] an Uplink TBF for each allocated GprsMS instance */
305private function f_multi_ms_establish_tbf(boolean do_activate := false)
306runs on RAW_PCU_Test_CT {
307 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
308 /* Establish an Uplink TBF */
309 f_ms_establish_ul_tbf(g_ms[i]);
310
311 /* Send a random block, so this TBF becomes "active" */
312 if (do_activate) {
313 /* FIXME: use the new APU by Pau to get correct TRX/TS here */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100314 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, i mod 8);
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700315 var octetstring dummy := f_rnd_octstring(12);
316 var RlcmacDlBlock dl_block;
317 var uint32_t poll_fn;
318
319 f_ms_tx_ul_data_block(g_ms[i], dummy, with_tlli := true, nr := nr);
320 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := nr);
321 }
322 }
323}
324
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100325private function f_ms_establish_ul_tbf_2phase_access(inout GprsMS ms,
326 template (omit) RlcmacUlCtrlMsg pkt_res_req := omit)
327runs on RAW_PCU_Test_CT return PollFnCtx {
328 var PollFnCtx pollctx;
329
330 /* Single block (two phase) packet access */
331 var uint16_t ra := bit2int(chan_req_sb);
332 if (g_force_two_phase_access) {
333 /* If 2phase access is enforced by the network, then let's
334 * request a One phase packet access, we'll receive a single block
335 * anyway
336 */
337 ra := bit2int(chan_req_def);
338 }
339
340 /* Establish an Uplink TBF */
341 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
342 f_ms_establish_ul_tbf(ms);
343
344 /* Make sure we've got an Uplink TBF assignment */
345 if (not match(ms.ul_tbf.ass.ccch, tr_PacketUlSglAssign)) {
346 setverdict(fail, "Wrong Packet Uplink Assignment received: ", ms.ul_tbf.ass.ccch, " vs exp: ", tr_PacketUlSglAssign);
347 f_shutdown(__BFILE__, __LINE__);
348 }
349
350 /* Send PACKET RESOURCE REQUEST
351 * (see 3GPP TS 04.60 "7.1.3.1 Initiation of the Packet resource request procedure")
352 */
353 if (istemplatekind(pkt_res_req, "omit")) {
354 pkt_res_req := ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit);
355 }
356
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100357 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(valueof(pkt_res_req)), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
358 /* Store 1st UlTBF context before receiving next one, will
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100359 * overwrite the TS allocation on MS with info from new UL TBF:
360 */
361 pollctx.tstrxbts := f_ms_tx_TsTrxBtsNum(ms);
362 f_ms_rx_pkt_ass_pacch(ms, pollctx.fn, tr_RLCMAC_UL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
363 return pollctx;
364}
365
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200366testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +0200367 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
Pau Espin Pedrol2889f872021-01-11 14:43:35 +0100368 var GprsTlli tlli := TLLI_UNUSED;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200369 timer T;
370
371 /* Initialize NS/BSSGP side */
372 f_init_bssgp();
373
374 /* Initialize the PCU interface abstraction */
375 f_init_raw(testcasename());
376
377 /* Establish BSSGP connection to the PCU */
378 f_bssgp_establish();
379
380 BTS.send(ts_PCUIF_SUSP_REQ(0, tlli, ra_id, 0));
381
382 T.start(2.0);
383 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100384 [] BSSGP_GLOBAL[0].receive(tr_BSSGP_SUSPEND(tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200385 setverdict(pass);
386 }
387 [] T.timeout {
388 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
389 }
390 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700391
392 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200393}
394
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100395/* Make sure TBF is released and no data is sent for in after reciving a Suspend Request from that MS. See OS#4761 */
396testcase TC_pcuif_suspend_active_tbf() runs on RAW_PCU_Test_CT {
397 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
398 var RlcmacDlBlock dl_block;
399 var octetstring data := f_rnd_octstring(10);
400 var uint32_t sched_fn;
401 var uint32_t dl_fn;
402 var GprsMS ms;
403 timer T;
404
405 /* Initialize NS/BSSGP side */
406 f_init_bssgp();
407 /* Initialize GPRS MS side */
408 f_init_gprs_ms();
409 ms := g_ms[0]; /* We only use first MS in this test */
410
411 /* Initialize the PCU interface abstraction */
412 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
413
414 /* Establish BSSGP connection to the PCU */
415 f_bssgp_establish();
416 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
417
418 /* Establish an Uplink TBF */
419 f_ms_establish_ul_tbf(ms);
420
421 /* Send one UL block (with TLLI since we are in One-Phase Access
422 contention resoultion) and make sure it is ACKED fine */
423 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
424 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
425 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
426 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
427
428 /* UL block should be received in SGSN */
429 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
430
431 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
432 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
433 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
434
435 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
436 f_sleep(X2002);
437 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
438
439 /* MS has moved to CS, it sent SUSP REQ to BTS and PCU gets it, TBF is freed: */
440 BTS.send(ts_PCUIF_SUSP_REQ(0, ms.tlli, ra_id, 0));
441
442 T.start(2.0);
443 alt {
444 [] BSSGP_GLOBAL[0].receive(tr_BSSGP_SUSPEND(ms.tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
445 setverdict(pass);
446 }
447 [] T.timeout {
448 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
449 f_shutdown(__BFILE__, __LINE__);
450 }
451 }
452
453 /* Make sure we don't receive data for that TBF since it was released
454 * before. Also check our TBF is not polled for UL. */
455 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
456 if (dl_block.ctrl.mac_hdr.usf != USF_UNUSED) {
457 setverdict(fail, "Unexpected USF ", dl_block.ctrl.mac_hdr.usf);
458 f_shutdown(__BFILE__, __LINE__);
459 }
460
461 /* New data arrives, PCU should page the MS since no TBF active exists: */
462 /* Send some more data, it will never reach the MS */
463 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
464 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
465
466 f_shutdown(__BFILE__, __LINE__, final := true);
467}
468
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200469/* Test of correct Timing Advance at the time of TBF establishment
470 * (derived from timing offset of the Access Burst). */
471testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200472 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200473
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200474 /* Initialize GPRS MS side */
475 f_init_gprs_ms();
476 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200477 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100478 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200479
480 /* We cannot send too many TBF requests in a short time because
481 * at some point the PCU will fail to allocate a new TBF. */
482 for (var TimingAdvance ta := 0; ta < 64; ta := ta + 16) {
483 /* Establish an Uplink TBF (send RACH.ind with current TA) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200484 ms.ta := ta;
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700485 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200486
487 /* Make sure Timing Advance IE matches out expectations */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200488 if (ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance != ta) {
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700489 setverdict(fail, "Timing Advance mismatch: ",
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200490 ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance,
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700491 " vs expected ", ta);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700492 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200493 }
494 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700495
496 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200497}
498
499/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
500 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
501 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
502 * no active TBF exists at the moment of establishment (idle mode). */
503testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100504 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200505
506 /* Initialize NS/BSSGP side */
507 f_init_bssgp();
508
509 /* Initialize the PCU interface abstraction */
510 f_init_raw(testcasename());
511
512 /* Establish BSSGP connection to the PCU */
513 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100514 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200515
516 /* SGSN sends some DL data, PCU will initiate Packet Downlink
517 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100518 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
519 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200520
521 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
522 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
523 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100524 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700525 setverdict(fail, "Timing Advance value doesn't match");
526 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700527
528 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200529}
530
531/* Verify that the PCU generates valid PTCCH/D messages
532 * while neither Uplink nor Downlink TBF is established. */
533testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100534 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200535 timer T;
536
537 /* Initialize the PCU interface abstraction */
538 f_init_raw(testcasename());
539
540 /* Sent an RTS.req for PTCCH/D */
541 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
542 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
543 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100544
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200545 T.start(5.0);
546 alt {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100547 /* Make sure the message is encoded correctly
548 * TODO: do we expect all TA values to be equal '1111111'B? */
549 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg);
550
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200551 [] BTS.receive(PCUIF_Message:?) { repeat; }
552 [] T.timeout {
553 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700554 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200555 }
556 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100557 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700558
559 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200560}
561
562/* Test of correct Timing Advance during an active Uplink TBF.
563 *
564 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
565 * are not continuous and there can be long time gaps between them. This happens
566 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
567 * significantly change between such rare Uplink transmissions, so GPRS introduces
568 * additional mechanisms to control Timing Advance, and thus reduce interference
569 * between neighboring TDMA time-slots.
570 *
571 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
572 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
573 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
574 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
575 * among with the initial Timing Advance value. And here PTCCH comes to play.
576 *
577 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
578 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
579 * continuously. To ensure continuous measurements of the signal propagation
580 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
581 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
582 *
583 * The purpose of this test case is to verify the assignment of Timing Advance
584 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
585 * first establishes several Uplink TBFs, but does not transmit any Uplink
586 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
587 * indications to the PCU, checking the correctness of two received PTCCH/D
588 * messages (period of PTCCH/D is two multi-frames).
589 */
590
591/* List of ToA values for Access Bursts to be sent on PTCCH/U,
592 * each ToA (Timing of Arrival) value is in units of 1/4 of
593 * a symbol (i.e. 1 symbol is 4 QTA units). */
594type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
595const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
596 0, 0, 0, 0,
597 0, 0, 0, 0,
598 0, 0, 0, 0,
599 0, 0, 0, 0
600};
601
602private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
603 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
604runs on RAW_PCU_Test_CT {
605 var RAW_PCU_Event event;
606 var integer ss;
607
608 /* Send Access Bursts on PTCCH/U for every TA Index */
609 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
610 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700611 if (ss < 0) { /* Shall not happen */
612 f_shutdown(__BFILE__, __LINE__);
613 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200614
615 log("Sending an Access Burst on PTCCH/U",
616 ", sub-slot=", ss, " (TAI)",
617 ", fn=", event.data.tdma_fn,
618 ", ToA=", toa_map[ss], " (QTA)");
619 /* TODO: do we care about RA and burst format? */
620 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
621 ra := oct2int('3A'O),
622 is_11bit := 0,
623 burst_type := BURST_TYPE_0,
624 fn := event.data.tdma_fn,
625 arfcn := 871,
626 qta := toa_map[ss],
627 sapi := PCU_IF_SAPI_PTCCH));
628 repeat;
629 }
630}
631
632private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
633 template PTCCHDownlinkMsg t_ta_msg)
634runs on RAW_PCU_Test_CT {
635 var PTCCHDownlinkMsg ta_msg;
636 var PCUIF_Message pcu_msg;
637 timer T;
638
639 /* First, send an RTS.req for the upcoming PTCCH/D block */
640 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
641 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
642 arfcn := 871, block_nr := 0));
643 T.start(2.0);
644 alt {
645 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
646 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
647 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
648 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
649 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
650 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
651 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
652 log("Rx PTCCH/D message: ", ta_msg);
653
654 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700655 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200656 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
657 }
658 }
659 [] BTS.receive { repeat; }
660 [] T.timeout {
661 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200662 }
663 }
664}
665
666testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
667 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200668 var GprsMS ms;
669
670 /* Initialize GPRS MS side */
671 f_init_gprs_ms();
672 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200673
674 /* Initialize the PCU interface abstraction */
675 f_init_raw(testcasename());
676
677 /* Enable forwarding of PTCCH/U TDMA events to us */
678 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
679
680 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
681 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200682 /* Establish an Uplink TBF */
683 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200684
685 /* We expect incremental TFI/USF assignment (dynamic allocation) */
686 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200687 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200688 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700689 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200690 }
691
692 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200693 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200694 setverdict(fail, "Failed to match Timing Advance Index for #", i);
695 /* Keep going, the current OsmoPCU does not assign TA Index */
696 }
697 }
698
699 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
700 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
701 for (var integer i := 0; i < 7; i := i + 1) {
702 /* ToA in units of 1/4 of a symbol */
703 toa_map[i] := (i + 1) * 7 * 4;
704 }
705
706 /* Now we have all 7 TBFs established in one-phase access mode,
707 * however we will not be sending any data on them. Instead, we
708 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
709 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
710 *
711 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
712 * time-slots, so at the moment of scheduling a PTCCH/D block
713 * the PCU has odd number of PTCCH/U Access Bursts received. */
714 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
715 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
716 /* Other values are not known (yet) */
717 tai3_ta := ?));
718 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
719 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
720 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
721 /* Other values are out of our interest */
722 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700723
724 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200725}
726
727/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
728 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
729 *
730 * NOTE: the ranges are intentionally overlapping because OsmoPCU
731 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
732private template integer CS1_lqual_dB_range := (-infinity .. 6);
733private template integer CS2_lqual_dB_range := (5 .. 8);
734private template integer CS3_lqual_dB_range := (7 .. 13);
735private template integer CS4_lqual_dB_range := (12 .. infinity);
736
737testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200738 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200739 var GprsMS ms;
740 var uint32_t unused_fn, sched_fn;
741 var uint4_t cv;
742
743 /* Initialize GPRS MS side */
744 f_init_gprs_ms();
745 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200746
747 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100748 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200749
750 f_pcuvty_set_allowed_cs_mcs();
751 f_pcuvty_set_link_quality_ranges();
752
753 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200754 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200755
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200756
757 /* The actual / old link quality values. We need to keep track of the old
758 * (basically previous) link quality value, because OsmoPCU actually
759 * changes the coding scheme if not only the actual, but also the old
760 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200761 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200762 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200763
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200764 /* Send one UL block (with TLLI since we are in One-Phase Access
765 contention resoultion) and make sure it is ACKED fine. */
766 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
767 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
768 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)
769 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
770 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
771 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200772
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200773 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
774 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200775 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200776 lqual_old := ms.lqual_cb;
777 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200778
779 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200780 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
781 if (i > g_bs_cv_max) {
782 cv := 15;
783 } else {
784 cv := i;
785 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200786
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200787 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
788
789 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
790 f_rx_rlcmac_dl_block(dl_block, unused_fn);
791 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
792 continue;
793 }
794 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
795 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
796 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
797 f_shutdown(__BFILE__, __LINE__);
798 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200799
800 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
801 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
802
803 /* Match the received Channel Coding Command. Since we are increasing
804 * the link quality value on each iteration and not decreasing, there
805 * is no need to check the both old and current link quality values. */
806 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200807 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200808 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
809 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
810 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
811 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
812 }
813
814 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
815 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200816 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200817 }
818 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700819
820 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200821}
822
823/* Test the max UL CS set by VTY works fine */
824testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200825 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200826 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200827 var uint32_t unused_fn, sched_fn;
828 var GprsMS ms;
829
830 /* Initialize GPRS MS side */
831 f_init_gprs_ms();
832 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200833
834 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100835 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200836
837 /* Set initial UL CS to 3 */
838 g_cs_initial_ul := 3;
839 f_pcuvty_set_allowed_cs_mcs();
840 f_pcuvty_set_link_quality_ranges();
841
842 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200843 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200844
845 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200846 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200847
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200848 /* Send one UL block (with TLLI since we are in One-Phase Access
849 contention resoultion) and make sure it is ACKED fine. */
850 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
851 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
852 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)
853 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
854 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
855 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200856
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200857 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
858 while (true) {
859 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
860 f_rx_rlcmac_dl_block(dl_block, unused_fn);
861 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
862 continue;
863 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200864
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200865 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
866 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
867 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
868 f_shutdown(__BFILE__, __LINE__);
869 break;
870 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200871
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200872 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200873 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200874 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200875 if (last_ch_coding != CH_CODING_CS3) {
876 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200877 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200878 }
879
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200880 /* Remaining UL blocks are used to make sure regardless of initial
881 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200882 /* 0 dB, make sure we downgrade CS */
883 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200884 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200885 f_ms_tx_ul_data_block_multi(ms, 5);
886 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
887 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
888 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200889
890 if (last_ch_coding != CH_CODING_CS1) {
891 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200892 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200893 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700894
895 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200896}
897
898/* Test the max UL CS set by VTY works fine */
899testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200900 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200901 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200902 var uint32_t unused_fn, sched_fn;
903 var GprsMS ms;
904
905 /* Initialize GPRS MS side */
906 f_init_gprs_ms();
907 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200908
909 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100910 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200911
912 /* Set maximum allowed UL CS to 3 */
913 g_cs_max_ul := 3;
914 f_pcuvty_set_allowed_cs_mcs();
915 f_pcuvty_set_link_quality_ranges();
916
917 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200918 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200919
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200920 /* Send one UL block (with TLLI since we are in One-Phase Access
921 contention resoultion) and make sure it is ACKED fine. */
922 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
923 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
924 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true)
925 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
926 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
927 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200928
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200929 ms.lqual_cb := 40*10; /* 40 dB */
930 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200931
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200932 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
933 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200934
935 if (last_ch_coding != CH_CODING_CS3) {
936 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200937 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200938 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700939
940 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200941}
942
Pau Espin Pedrol75122592020-11-03 15:22:59 +0100943/* Test the initial DL CS set by VTY works fine */
944testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
945 var octetstring data := f_rnd_octstring(10);
946 var CodingScheme exp_dl_cs_mcs;
947 var RlcmacDlBlock dl_block;
948 var uint32_t poll_fn;
949 var GprsMS ms;
950
951 /* Initialize NS/BSSGP side */
952 f_init_bssgp();
953 /* Initialize GPRS MS side */
954 f_init_gprs_ms();
955 ms := g_ms[0]; /* We only use first MS in this test */
956
957 /* Initialize the PCU interface abstraction */
958 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
959
960 /* Set initial allowed DL CS to 3 */
961 g_cs_initial_dl := 3;
962 exp_dl_cs_mcs := CS_3;
963 /* Set maximum allowed UL CS to 4 */
964 g_cs_max_dl := 4;
965 f_pcuvty_set_allowed_cs_mcs();
966 f_pcuvty_set_link_quality_ranges();
967
968 /* Establish BSSGP connection to the PCU */
969 f_bssgp_establish();
970 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
971
972 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
973 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
974 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
975
976 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
977 f_sleep(X2002);
978 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
979
980 /* ACK the DL block */
981 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
982 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
983 f_dl_block_ack_fn(dl_block, poll_fn));
984
985 f_shutdown(__BFILE__, __LINE__, final := true);
986}
987
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100988/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100989function f_dl_data_exp_cs(template (present) CodingScheme exp_final_cs := ?, template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +0100990 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100991 var RlcmacDlBlock prev_dl_block, dl_block;
992 var uint32_t ack_fn;
993 var uint32_t fn;
994 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +0100995 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +0100996 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +0100997 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
998 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100999 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001000
1001 if (using_egprs) {
1002 exp_tmp_csmcs := mcs_egprs_any;
1003 bsn_mod := 2048;
1004 } else {
1005 exp_tmp_csmcs := cs_gprs_any;
1006 bsn_mod := 128;
1007 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001008
1009 /* Establish BSSGP connection to the PCU */
1010 f_bssgp_establish();
1011
1012 ms := g_ms[0]; /* We only use first MS in this test */
1013 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1014
1015 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001016 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001017 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1018
1019 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1020 f_sleep(X2002);
1021
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001022 for (var integer i := 0; i < 800; i := i + 1) {
1023 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001024 f_rx_rlcmac_dl_block(dl_block, fn);
1025
1026 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
1027 /* No more data to receive, done */
1028 break;
1029 }
1030
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001031 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001032
1033 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001034 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001035
1036 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001037 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001038 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001039 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, using_egprs), ack_fn);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001040 if (tx_data_remain != 0) {
1041 /* Submit more data from time to time to keep the TBF ongoing */
1042 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1043 tx_data_remain := tx_data_remain - 1;
1044 }
1045 }
1046 prev_dl_block := dl_block;
1047 }
1048
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001049 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1050 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001051
1052
1053 f_shutdown(__BFILE__, __LINE__, final := true);
1054}
1055
1056/* Verify DL CS above "cs max" set by VTY is never used */
1057testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1058 /* Initialize NS/BSSGP side */
1059 f_init_bssgp();
1060 /* Initialize GPRS MS side */
1061 f_init_gprs_ms();
1062
1063 /* Initialize the PCU interface abstraction */
1064 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1065
1066 /* Set maximum allowed DL CS to 3 */
1067 g_cs_initial_dl := 1;
1068 g_cs_max_dl := 3;
1069 f_pcuvty_set_allowed_cs_mcs();
1070 f_pcuvty_set_link_quality_ranges();
1071
1072 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1073}
1074
1075/* Check DL CS4 is used in good link conditions if allowed by config */
1076testcase TC_dl_cs1_to_cs4() runs on RAW_PCU_Test_CT {
1077 /* Initialize NS/BSSGP side */
1078 f_init_bssgp();
1079 /* Initialize GPRS MS side */
1080 f_init_gprs_ms();
1081
1082 /* Initialize the PCU interface abstraction */
1083 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1084
1085 /* Set initial DL CS to 1 & maximum allowed DL CS to 4 */
1086 g_cs_initial_dl := 1;
1087 g_cs_max_dl := 4;
1088 f_pcuvty_set_allowed_cs_mcs();
1089 f_pcuvty_set_link_quality_ranges();
1090
1091 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1092}
1093
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001094/* Test the initial UL MCS set by VTY works fine */
1095testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1096 var RlcmacDlBlock dl_block;
1097 var PollFnCtx pollctx;
1098 var EgprsChCodingCommand last_ch_coding;
1099 var uint32_t unused_fn, sched_fn;
1100 var GprsMS ms;
1101 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001102
1103 /* Initialize GPRS MS side */
1104 f_init_gprs_ms();
1105 ms := g_ms[0]; /* We only use first MS in this test */
1106
1107 /* Initialize the PCU interface abstraction */
1108 f_init_raw(testcasename());
1109
1110 /* Set initial UL MCS to 3 */
1111 g_mcs_initial_ul := 3;
1112 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1113 f_pcuvty_set_allowed_cs_mcs();
1114 f_pcuvty_set_link_quality_ranges();
1115
1116 /* Take lqual (dB->cB) so that we stay in that MCS */
1117 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1118
1119 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001120 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_egprs_def));
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001121
1122 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1123 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1124 f_shutdown(__BFILE__, __LINE__);
1125 }
1126
1127 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1128 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1129
1130 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1131 while (true) {
1132 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1133 f_rx_rlcmac_dl_block(dl_block, unused_fn);
1134 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1135 continue;
1136 }
1137
1138 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1139 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1140 f_shutdown(__BFILE__, __LINE__);
1141 break;
1142 }
1143
1144 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1145 break;
1146 }
1147 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1148 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1149 f_shutdown(__BFILE__, __LINE__);
1150 }
1151
1152 /* Remaining UL blocks are used to make sure regardless of initial
1153 * lqual, we can go lower at any time
1154 * 0 dB, make sure we downgrade MCS */
1155 ms.lqual_cb := 0;
1156 /* 5 UL blocks, check we are in same initial MCS: */
1157 f_ms_tx_ul_data_block_multi(ms, 5);
1158 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1159 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1160 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1161
1162 if (last_ch_coding != CH_CODING_MCS1) {
1163 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1164 f_shutdown(__BFILE__, __LINE__);
1165 }
1166
1167 f_shutdown(__BFILE__, __LINE__, final := true);
1168}
1169
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001170/* Test the maximum UL MCS set by VTY works fine */
1171testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1172 var RlcmacDlBlock dl_block;
1173 var EgprsChCodingCommand last_ch_coding;
1174 var PollFnCtx pollctx;
1175 var uint32_t unused_fn, sched_fn;
1176 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001177
1178 /* Initialize GPRS MS side */
1179 f_init_gprs_ms();
1180 ms := g_ms[0]; /* We only use first MS in this test */
1181
1182 /* Initialize the PCU interface abstraction */
1183 f_init_raw(testcasename());
1184
1185 /* Set maximum allowed UL MCS to 5 */
1186 g_mcs_max_ul := 5;
1187 f_pcuvty_set_allowed_cs_mcs();
1188 f_pcuvty_set_link_quality_ranges();
1189
1190 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001191 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_egprs_def));
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001192 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1193 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1194
1195 ms.lqual_cb := 40*10; /* 40 dB */
1196 f_ms_tx_ul_data_block_multi(ms, 16);
1197
1198 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1199 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1200
1201 if (last_ch_coding != CH_CODING_MCS5) {
1202 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1203 f_shutdown(__BFILE__, __LINE__);
1204 }
1205
1206 f_shutdown(__BFILE__, __LINE__, final := true);
1207}
1208
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001209/* Test the initial DL CS set by VTY works fine */
1210testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1211 var octetstring data := f_rnd_octstring(10);
1212 var CodingScheme exp_dl_cs_mcs;
1213 var RlcmacDlBlock dl_block;
1214 var uint32_t poll_fn;
1215 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001216
1217 /* Initialize NS/BSSGP side */
1218 f_init_bssgp();
1219 /* Initialize GPRS MS side */
1220 f_init_gprs_ms();
1221 ms := g_ms[0]; /* We only use first MS in this test */
1222
1223 /* Initialize the PCU interface abstraction */
1224 f_init_raw(testcasename());
1225
1226 /* Set initial allowed DL MCS to 3 */
1227 g_mcs_initial_dl := 3;
1228 exp_dl_cs_mcs := MCS_3;
1229 /* Set maximum allowed DL MCS to 4 */
1230 g_mcs_max_dl := 4;
1231 f_pcuvty_set_allowed_cs_mcs();
1232 f_pcuvty_set_link_quality_ranges();
1233
1234 /* Establish BSSGP connection to the PCU */
1235 f_bssgp_establish();
1236 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1237
1238 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001239 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001240 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1241
1242 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1243 f_sleep(X2002);
1244 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1245
1246 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001247 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1248 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, ischosen(dl_block.data_egprs)),
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001249 f_dl_block_ack_fn(dl_block, poll_fn));
1250
1251 f_shutdown(__BFILE__, __LINE__, final := true);
1252}
1253
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001254/* Verify DL MCS above "mcs max" set by VTY is never used */
1255testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1256 /* Initialize NS/BSSGP side */
1257 f_init_bssgp();
1258 /* Initialize GPRS MS side */
1259 f_init_gprs_ms();
1260
1261 /* Initialize the PCU interface abstraction */
1262 f_init_raw(testcasename());
1263
1264 /* Set maximum allowed DL CS to 3 */
1265 g_mcs_initial_dl := 1;
1266 g_mcs_max_dl := 3;
1267 f_pcuvty_set_allowed_cs_mcs();
1268 f_pcuvty_set_link_quality_ranges();
1269
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001270 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_mcs_max_dl, true), bssgp_ms_racap_egprs_def);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001271}
1272
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001273/* Verify PCU drops TBF after some time of inactivity. */
1274testcase TC_t3169() runs on RAW_PCU_Test_CT {
1275 var PCUIF_info_ind info_ind;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001276 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001277 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001278 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001279
1280 /* Initialize NS/BSSGP side */
1281 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001282 /* Initialize GPRS MS side */
1283 f_init_gprs_ms();
1284 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001285
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001286 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001287 /* Set timer to 1 sec (default 5) to speedup test: */
1288 info_ind.t3169 := 1;
1289
1290 /* Initialize the PCU interface abstraction */
1291 f_init_raw(testcasename(), info_ind);
1292
1293 /* Establish BSSGP connection to the PCU */
1294 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001295 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001296
1297 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001298 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001299
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02001300 /* Send one UL block (with TLLI since we are in One-Phase Access
1301 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001302 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 1, with_tlli := true)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001303 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001304 /* UL block should NOT be received in SGSN, since we didn't get CV=0 */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001305
1306 /* Wait until T3169 fires (plus 1 extra sec to make sure) */
1307 f_sleep(int2float(info_ind.t3169) + 1.0);
1308
1309 /* Send an UL block once again, the TBF should be gone by now so no ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001310 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 0)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001311 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001312
1313 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001314}
1315
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001316/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1317 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1318 * T3169. See OS#5033 */
1319testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1320 var PCUIF_info_ind info_ind;
1321 var template (value) TsTrxBtsNum nr;
1322 var BTS_PDTCH_Block data_msg;
1323 var GprsMS ms;
1324 var uint3_t rx_usf;
1325 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1326 var integer n3101 := 0;
1327 timer T_3169 := 1.0;
1328
1329 /* Initialize NS/BSSGP side */
1330 f_init_bssgp();
1331 /* Initialize GPRS MS side */
1332 f_init_gprs_ms();
1333 ms := g_ms[0]; /* We only use first MS in this test */
1334
1335 /* Initialize the PCU interface abstraction */
1336 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1337 info_ind.n3101 := N3101_MAX;
1338 info_ind.t3169 := 1;
1339 f_init_raw(testcasename(), info_ind);
1340
1341 /* Establish BSSGP connection to the PCU */
1342 f_bssgp_establish();
1343 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1344
1345 /* Establish UL TBF */
1346 f_ms_establish_ul_tbf(ms);
1347
1348 /* Now we wait for PCU to transmit our USF */
1349 nr := ts_TsTrxBtsNum;
1350 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1351 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1352 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1353 block_nr := nr.blk_nr));
1354
1355 alt {
1356 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1357 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1358 ?)) -> value data_msg {
1359 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1360 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1361 f_shutdown(__BFILE__, __LINE__);
1362 }
1363
1364 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1365 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1366 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1367 n3101 := n3101 + 1;
1368 //"if (n3101 > N3101_MAX) {" -> start timer T3169
1369 if (n3101 > N3101_MAX) {
1370 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX, " (N3101_MAX) and PCU still sends us USFs");
1371 f_shutdown(__BFILE__, __LINE__);
1372 }
1373 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX) {
1374 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1375 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1376 if (not T_3169.running) {
1377 log("T3169 started");
1378 T_3169.start;
1379 }
1380 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1381 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1382 f_shutdown(__BFILE__, __LINE__);
1383 } else {
1384 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1385 }
1386 nr := ts_TsTrxBtsNum;
1387 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1388 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1389 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1390 block_nr := nr.blk_nr));
1391 repeat;
1392 }
1393 [] T_3169.timeout {
1394 log("T_3169 expired");
1395 /* Done in alt */
1396 }
1397 [] BTS.receive {
1398 setverdict(fail, "Unexpected BTS message");
1399 f_shutdown(__BFILE__, __LINE__);
1400 }
1401 }
1402
1403 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1404 /* USFs as per previous TBF since they were freed at expiration time: */
1405 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1406 var uint5_t old_tfi := ms.ul_tbf.tfi;
1407 f_ms_establish_ul_tbf(ms);
1408 if (old_tfi != ms.ul_tbf.tfi) {
1409 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1410 f_shutdown(__BFILE__, __LINE__);
1411 }
1412 for (var integer i := 0; i < 8; i := i +1) {
1413 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1414 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1415 f_shutdown(__BFILE__, __LINE__);
1416 }
1417 }
1418
1419 f_shutdown(__BFILE__, __LINE__, final := true);
1420}
1421
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001422/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1423 * point the TBF is no longer available. In order to get to start of T3191, we
1424 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1425 * until TBF release procedure starts after draining DL queue. */
1426testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1427 var PCUIF_info_ind info_ind;
1428 var RlcmacDlBlock dl_block;
1429 var octetstring data1 := f_rnd_octstring(200);
1430 var octetstring data2 := f_rnd_octstring(10);
1431 var uint32_t dl_fn;
1432 var template (value) TsTrxBtsNum nr;
1433 var BTS_PDTCH_Block data_msg;
1434 var GprsMS ms;
1435
1436 /* Initialize NS/BSSGP side */
1437 f_init_bssgp();
1438 /* Initialize GPRS MS side */
1439 f_init_gprs_ms();
1440 ms := g_ms[0]; /* We only use first MS in this test */
1441
1442 /* Initialize the PCU interface abstraction */
1443 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1444 /* Set timer to 1 sec (default 5) to speedup test: */
1445 info_ind.t3191 := 1;
1446 f_init_raw(testcasename(), info_ind);
1447
1448 /* Establish BSSGP connection to the PCU */
1449 f_bssgp_establish();
1450 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1451
1452 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1453 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1454 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1455
1456 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1457 f_sleep(X2002);
1458
1459 while (true) {
1460 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1461
1462 /* Keep Ack/Nack description updated (except for last BSN) */
1463 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1464
1465 if (f_dl_block_rrbp_valid(dl_block)) {
1466 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1467 f_dl_block_ack_fn(dl_block, dl_fn));
1468 break;
1469 }
1470 }
1471
1472 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1473 nr := ts_TsTrxBtsNum;
1474 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1475 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1476 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1477 block_nr := nr.blk_nr));
1478 alt {
1479 [] as_ms_rx_ignore_dummy(ms, nr);
1480 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1481 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1482 ?)) -> value data_msg {
1483 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1484 log("Received FINAL_ACK");
1485 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1486 break;
1487 }
1488 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1489 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1490 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1491 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1492 }
1493 nr := ts_TsTrxBtsNum;
1494 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1495 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1496 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1497 block_nr := nr.blk_nr));
1498 repeat;
1499 }
1500 [] BTS.receive {
1501 setverdict(fail, "Unexpected BTS message");
1502 f_shutdown(__BFILE__, __LINE__);
1503 }
1504 }
1505
1506 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1507 to time out. We simply sleep instead of requesting blocks because
1508 otherwise retransmissions would keep restarting the timer. */
1509 f_sleep(int2float(info_ind.t3191));
1510
1511 /* The TBF should be freed now, so new data should trigger an Assignment: */
1512 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1513 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1514
1515 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1516 f_sleep(X2002);
1517 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1518 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1519 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1520 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1521 f_dl_block_ack_fn(dl_block, dl_fn));
1522
1523 f_shutdown(__BFILE__, __LINE__, final := true);
1524}
1525
1526/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1527testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1528 var PCUIF_info_ind info_ind;
1529 var RlcmacDlBlock dl_block;
1530 var octetstring data1 := f_rnd_octstring(1400);
1531 var octetstring data2 := f_rnd_octstring(10);
1532 var uint32_t dl_fn;
1533 var GprsMS ms;
1534
1535 /* Initialize NS/BSSGP side */
1536 f_init_bssgp();
1537 /* Initialize GPRS MS side */
1538 f_init_gprs_ms();
1539 ms := g_ms[0]; /* We only use first MS in this test */
1540
1541 /* Initialize the PCU interface abstraction */
1542 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1543 /* Set timer to 1 sec (default 5) to speedup test: */
1544 info_ind.t3191 := 1;
1545 f_init_raw(testcasename(), info_ind);
1546
1547 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1548
1549 /* Establish BSSGP connection to the PCU */
1550 f_bssgp_establish();
1551 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1552
1553 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1554 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1555 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1556
1557 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1558 f_sleep(X2002);
1559
1560 /* Send enough DL data to at least be able to DL ACK once (excl the
1561 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1562 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1563 while (true) {
1564 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1565
1566 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1567 log("Received FINAL_ACK");
1568 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1569 break;
1570 }
1571
1572 /* Keep Ack/Nack description updated (except for last BSN) */
1573 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1574
1575 if (f_dl_block_rrbp_valid(dl_block)) {
1576 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1577 f_dl_block_ack_fn(dl_block, dl_fn));
1578 }
1579 }
1580
1581 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1582 to time out. We simply sleep instead of requesting blocks because
1583 otherwise retransmissions would keep restarting the timer. */
1584 f_sleep(int2float(info_ind.t3191));
1585
1586 /* The TBF should be freed now, so new data should trigger an Assignment: */
1587 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1588 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1589
1590 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1591 f_sleep(X2002);
1592 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1593 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1594 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1595 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1596 f_dl_block_ack_fn(dl_block, dl_fn));
1597
1598 f_shutdown(__BFILE__, __LINE__, final := true);
1599}
1600
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001601/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1602 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1603 * T3193) after DL TBF release */
1604testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001605 var RlcmacDlBlock dl_block;
1606 var octetstring data := f_rnd_octstring(10);
1607 var boolean ok;
1608 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001609 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001610 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001611 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1612
1613 /* Initialize NS/BSSGP side */
1614 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001615 /* Initialize GPRS MS side */
1616 f_init_gprs_ms();
1617 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001618
1619 /* Initialize the PCU interface abstraction */
1620 f_init_raw(testcasename());
1621
1622 /* Establish BSSGP connection to the PCU */
1623 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001624 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001625
1626 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001627 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1628 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001629
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001630 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1631 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001632 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001633
1634 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001635 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1636 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1637 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001638
1639 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001640 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001641 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001642 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001643 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001644
1645 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001646
1647 /* 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 +07001648 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001649 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1650 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1651 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001652
1653 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001654}
1655
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001656/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1657 freed and no longer available. Trigger it by sending DL blocks and never DL
1658 ACKing the data (which are requested through RRBP) */
1659testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1660 var PCUIF_info_ind info_ind;
1661 var RlcmacDlBlock dl_block;
1662 var octetstring data1 := f_rnd_octstring(1000);
1663 var octetstring data2 := f_rnd_octstring(10);
1664 var uint32_t dl_fn;
1665 var template (value) TsTrxBtsNum nr;
1666 var BTS_PDTCH_Block data_msg;
1667 var GprsMS ms;
1668 const integer N3105_MAX := 2;
1669 var integer N3105 := 0;
1670 timer T_3195 := 1.0;
1671 var integer num_poll_recv := 0;
1672
1673 /* Initialize NS/BSSGP side */
1674 f_init_bssgp();
1675 /* Initialize GPRS MS side */
1676 f_init_gprs_ms();
1677 ms := g_ms[0]; /* We only use first MS in this test */
1678
1679 /* Initialize the PCU interface abstraction */
1680 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1681 /* Speedup test: */
1682 info_ind.n3105 := N3105_MAX;
1683 info_ind.t3195 := 1;
1684 f_init_raw(testcasename(), info_ind);
1685
1686 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1687 * MS and retransmitted after the TBF is released and later on created
1688 * (because the MS is reused) */
1689 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1690
1691 /* Establish BSSGP connection to the PCU */
1692 f_bssgp_establish();
1693 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1694
1695 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1696 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1697 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1698
1699 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1700 f_sleep(X2002);
1701
1702 /* Now we go on receiving DL data and not answering RRBP: */
1703 nr := ts_TsTrxBtsNum;
1704 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1705 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1706 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1707 block_nr := nr.blk_nr));
1708 alt {
1709 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1710 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1711 tr_RLCMAC_DATA)) -> value data_msg {
1712 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1713 if (num_poll_recv == 0) {
1714 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1715 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1716 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1717 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1718 } else {
1719 log("Ignoring RRBP ", num_poll_recv);
1720 N3105 := N3105 + 1;
1721 }
1722 num_poll_recv := num_poll_recv + 1;
1723 }
1724
1725 nr := ts_TsTrxBtsNum;
1726 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1727 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1728 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1729 block_nr := nr.blk_nr));
1730 repeat;
1731 }
1732 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
1733 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
1734 */
1735 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1736 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1737 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1738 if (not T_3195.running) {
1739 T_3195.start;
1740 /* We even send some new data, nothing should be sent to MS */
1741 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1742 }
1743 nr := ts_TsTrxBtsNum;
1744 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1745 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1746 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1747 block_nr := nr.blk_nr));
1748 repeat;
1749 }
1750 [] T_3195.timeout {
1751 log("T_3195 timeout");
1752 /* Done in alt */
1753 }
1754 [] BTS.receive {
1755 setverdict(fail, "Unexpected BTS message");
1756 f_shutdown(__BFILE__, __LINE__);
1757 }
1758 }
1759
1760 /* after T_3195 timeout, TBF is released */
1761 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1762 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1763
1764 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1765 f_sleep(X2002);
1766 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1767
1768 /* ACK the DL block */
1769 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1770 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1771 f_dl_block_ack_fn(dl_block, dl_fn));
1772
1773 f_shutdown(__BFILE__, __LINE__, final := true);
1774}
1775
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001776/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
1777testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001778 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001779 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001780 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001781 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001782
1783 /* Initialize NS/BSSGP side */
1784 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001785 /* Initialize GPRS MS side */
1786 f_init_gprs_ms();
1787 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001788
1789 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001790 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001791
1792 /* Establish BSSGP connection to the PCU */
1793 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001794 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001795
1796 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001797 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001798
1799 /* Send one UL block (with TLLI since we are in One-Phase Access
1800 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001801 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001802 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
1803 f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true)
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001804 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1805 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001806 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001807
1808 /* Send enough blocks to test whole procedure: Until Nth block
1809 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
1810 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001811 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001812 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1813 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001814 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001815
1816 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001817 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 +07001818
1819 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02001820}
1821
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001822/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
1823testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
1824 var RlcmacDlBlock dl_block;
1825 var uint32_t dl_fn, sched_fn;
1826 var octetstring payload;
1827 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001828 var template (value) LlcBlockHdr blk_hdr;
1829 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001830 var integer blk_len;
1831 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001832 var GprsMS ms;
1833
1834 /* Initialize NS/BSSGP side */
1835 f_init_bssgp();
1836 /* Initialize GPRS MS side */
1837 f_init_gprs_ms();
1838 ms := g_ms[0]; /* We only use first MS in this test */
1839
1840 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001841 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001842
1843 /* Establish BSSGP connection to the PCU */
1844 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001845 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001846
1847 /* Establish an Uplink TBF */
1848 f_ms_establish_ul_tbf(ms);
1849
1850 /* Send one UL block (with TLLI since we are in One-Phase Access
1851 contention resoultion) and make sure it is ACKED fine. */
1852 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001853 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1854 more := false, e := true);
1855 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001856 /* 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 +01001857 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
1858 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001859 cv := 15,
1860 bsn := ms.ul_tbf.bsn,
1861 blocks := blocks,
1862 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001863 f_ultbf_inc_bsn(ms.ul_tbf);
1864 f_ms_tx_ul_block(ms, ul_data);
1865
1866 /* ACK and check it was received fine */
1867 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1868 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1869 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1870 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001871 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 +02001872
1873 /* Test sending LLC PDUS of incrementing size */
1874 var integer max_size := 49;
1875 for (var integer i := 1; i <= max_size; i := i + 1) {
1876 var integer cv;
1877 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
1878 log("Sending DATA.ind with LLC payload size ", i);
1879 if (i < max_size - g_bs_cv_max) {
1880 cv := 15;
1881 } else {
1882 cv := max_size - i;
1883 }
1884
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001885 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
1886 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001887 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001888 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1889 more := false, e := true);
1890 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001891 /* 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 +01001892 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
1893 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001894 cv := cv,
1895 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001896 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001897 f_ultbf_inc_bsn(ms.ul_tbf);
1898 f_ms_tx_ul_block(ms, ul_data);
1899
1900 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02001901 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 +02001902
1903 /* we will receive UL ACK/NACK from time to time, handle it. */
1904 f_rx_rlcmac_dl_block(dl_block, dl_fn);
1905 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1906 continue;
1907 }
1908 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
1909 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1910 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1911 f_shutdown(__BFILE__, __LINE__);
1912 }
1913
1914 log("Rx Packet Uplink ACK / NACK");
1915 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
1916 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1917 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
1918 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07001919
1920 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02001921}
1922
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001923function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
1924 var octetstring payload;
1925 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001926 var template (value) LlcBlockHdr blk_hdr;
1927 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001928 var integer block_len, max_valid_data_len;
1929 timer T;
1930
1931 block_len := f_rlcmac_cs_mcs2block_len(cs);
1932 /* We need to send with TLLI since we are in One-Phase Access Contenion
1933 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
1934 * indicator, -1 for spare bits octet at the end */
1935 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
1936 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 +07001937 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
1938 more := false, e := true);
1939 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01001940 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
1941 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07001942 cv := cv,
1943 bsn := ms.ul_tbf.bsn,
1944 blocks := blocks,
1945 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001946 f_ultbf_inc_bsn(ms.ul_tbf);
1947 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
1948
1949 T.start(0.5);
1950 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02001951 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001952 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
1953 f_shutdown(__BFILE__, __LINE__);
1954 }
1955 [] T.timeout {
1956 setverdict(pass);
1957 }
1958 }
1959}
1960/* Verify PCU finds out incorrectly formated RLC block and discards it. This
1961 blocks intentionally contain last byte of data placed in last byte of RLC
1962 containing padding/spare bits, which is incorrect. Spare bits exist and are
1963 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
1964 discounting padding in octet" */
1965testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
1966 var GprsMS ms;
1967 var integer block_len, max_valid_data_len;
1968
1969 /* Initialize NS/BSSGP side */
1970 f_init_bssgp();
1971 /* Initialize GPRS MS side */
1972 f_init_gprs_ms();
1973 ms := g_ms[0]; /* We only use first MS in this test */
1974
1975 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01001976 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001977
1978 /* Establish BSSGP connection to the PCU */
1979 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001980 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001981
1982 /* Establish an Uplink TBF */
1983 f_ms_establish_ul_tbf(ms);
1984
1985 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
1986 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
1987 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
1988
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07001989 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02001990}
1991
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001992/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
1993 * answered, so TBFs for uplink and later for downlink are created.
1994 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02001995private 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 +02001996 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001997 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001998 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001999 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002000 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002001
2002 /* Initialize NS/BSSGP side */
2003 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002004 /* Initialize GPRS MS side */
2005 f_init_gprs_ms();
2006 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002007
2008 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002009 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002010
2011 /* Establish BSSGP connection to the PCU */
2012 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002013 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002014
2015 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002016 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002017
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002018 /* Send one UL block (with TLLI since we are in One-Phase Access
2019 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002020 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002021 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2022 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002023 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002024
2025 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002026 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002027
2028 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002029 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2030 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002031
2032 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2033 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002034 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002035
2036 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002037 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2038 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2039 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002040
2041 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002042}
2043
2044/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2045 * answered, so TBFs for uplink and later for downlink are created.
2046 */
2047testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002048 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002049 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002050}
2051
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002052/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2053 * answered, so TBFs for uplink and later for downlink are created.
2054 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002055private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2056 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002057 template (present) CodingScheme exp_ul_cs_mcs := ?,
2058 template (present) CodingScheme exp_dl_cs_mcs := ?)
2059runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002060 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002061 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002062 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002063 var uint32_t sched_fn;
2064 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002065 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002066 var GprsMS ms;
2067
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002068 /* Initialize NS/BSSGP side */
2069 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002070 /* Initialize GPRS MS side */
2071 f_init_gprs_ms();
2072 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002073
2074 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002075 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002076
2077 /* Establish BSSGP connection to the PCU */
2078 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002079 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002080
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002081 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2082 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 +02002083
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002084 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2085 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 +02002086 f_shutdown(__BFILE__, __LINE__);
2087 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002088
2089 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2090 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002091 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002092
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002093 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002094 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 +02002095
2096 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002097 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002098
2099 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002100 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002101 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2102 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002103 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002104 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002105 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002106
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002107 /* PCU acks the UL data after having received CV=0) */
2108 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2109
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002110 /* 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 +02002111 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 +02002112
2113 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002114 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2115 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 +02002116 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002117
2118 f_shutdown(__BFILE__, __LINE__, final := true);
2119}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002120
2121testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002122 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2123 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002124
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002125 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 +02002126}
2127
2128testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002129 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2130 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002131
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002132 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 +02002133}
2134
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002135testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2136 /* Configure PCU to force two phase access */
2137 g_force_two_phase_access := true;
2138
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002139 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002140 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002141
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002142 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 +02002143}
2144
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002145/* Test scenario where SGSN wants to send some data against MS and it is
2146 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2147 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002148private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2149 template (present) CodingScheme exp_cs_mcs := ?)
2150runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002151 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002152 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002153 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002154 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002155 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002156
2157 /* Initialize NS/BSSGP side */
2158 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002159 /* Initialize GPRS MS side */
2160 f_init_gprs_ms();
2161 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002162
2163 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002164 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002165
2166 /* Establish BSSGP connection to the PCU */
2167 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002168 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002169
2170 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002171 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2172 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002173
2174 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2175 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002176 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002177
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002178 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002179 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2180 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 +02002181 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002182
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002183 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002184 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002185
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002186 /* Send one UL block (with TLLI since we are in One-Phase Access
2187 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002188 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002189 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2190 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002191 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002192
2193 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002194 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002195
2196 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002197}
2198
2199testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002200 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002201 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2202}
2203
2204/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2205/* information about the MS */
2206testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002207 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002208 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002209}
2210
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002211/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2212 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2213 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2214 * be transferred).
2215 */
2216testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002217 var RlcmacDlBlock dl_block;
2218 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002219 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002220 var octetstring total_payload;
2221 var octetstring payload;
2222 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002223 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002224 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002225 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002226
2227 /* Initialize NS/BSSGP side */
2228 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002229 /* Initialize GPRS MS side */
2230 f_init_gprs_ms();
2231 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002232
2233 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002234 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002235
2236 /* Establish BSSGP connection to the PCU */
2237 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002238 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002239
2240 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002241 f_ms_establish_ul_tbf(ms);
2242 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002243
2244 /* Send one UL block (with TLLI since we are in One-Phase Access
2245 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002246 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002247 f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002248
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002249 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2250 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002251 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002252 total_payload := payload;
2253
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002254 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2255
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002256 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002257 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002258 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002259 total_payload := total_payload & payload;
2260
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002261 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002262 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002263 total_payload := total_payload & payload;
2264
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002265 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002266 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 +02002267 total_payload := total_payload & lost_payload;
2268
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002269 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002270 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002271 total_payload := total_payload & payload;
2272
2273 /* 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 +02002274 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002275
2276 /* On CV=0, we'll receive a UL ACK asking about missing block */
2277 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2278 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002279 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2280 tfi := tfi,
2281 cv := 15,
2282 bsn := 3,
2283 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002284 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002285
2286 /* Now final ack is recieved */
2287 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2288 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002289 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002290
2291 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002292 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 +07002293
2294 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002295}
2296
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002297/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2298 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2299 * timeout occurs (specified by sent RRBP on DL block). */
2300testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002301 var RlcmacDlBlock dl_block;
2302 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002303 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002304 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002305
2306 /* Initialize NS/BSSGP side */
2307 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002308 /* Initialize GPRS MS side */
2309 f_init_gprs_ms();
2310 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002311
2312 /* Initialize the PCU interface abstraction */
2313 f_init_raw(testcasename());
2314
2315 /* Establish BSSGP connection to the PCU */
2316 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002317 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002318
2319 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002320 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2321 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002322
2323 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2324 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002325 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002326
2327 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2328 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2329 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002330 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002331
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002332 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2333 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002334 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002335
2336 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002337 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2338 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2339 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002340
2341 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002342}
2343
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002344/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2345testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2346 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2347 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002348 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002349 var RlcmacDlBlock dl_block;
2350 var uint32_t ack_fn;
2351 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002352 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002353 timer T := 5.0;
2354
2355 /* Initialize NS/BSSGP side */
2356 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002357 /* Initialize GPRS MS side */
2358 f_init_gprs_ms();
2359 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002360
2361 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002362 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002363
Daniel Willmann535aea62020-09-21 13:27:08 +02002364 f_statsd_reset();
2365
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002366 /* Establish BSSGP connection to the PCU */
2367 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002368 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002369
2370 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002371 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2372 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002373
2374 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2375 f_sleep(X2002);
2376
2377 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2378 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002379 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002380
2381 /* TDMA frame number on which we are supposed to send the ACK */
2382 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2383
2384 /* SGSN sends more blocks during the indicated RRBP */
2385 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2386 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002387 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002388
2389 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2390
2391 /* Make sure this block has the same TFI as was assigned
2392 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002393 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002394 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2395 dl_block.data.mac_hdr.hdr_ext.tfi);
2396 f_shutdown(__BFILE__, __LINE__);
2397 }
2398
2399 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002400 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002401
2402 /* Break if this is the end of RRBP */
2403 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002404 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002405 break;
2406 }
2407 }
2408
2409 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002410 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 +07002411
2412 /* Make sure that the next block (after the Ack) is dummy */
2413 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2414
Daniel Willmann535aea62020-09-21 13:27:08 +02002415 var StatsDExpects expect := {
2416 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2417 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2418 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2419 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2420 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002421 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002422 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2423 };
2424 f_statsd_expect(expect);
2425
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002426 f_shutdown(__BFILE__, __LINE__, final := true);
2427}
2428
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002429/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2430 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2431 * Check "3GPP TS 44.060" Annex B. */
2432testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2433 var RlcmacDlBlock dl_block;
2434 var octetstring dataA := f_rnd_octstring(20);
2435 var octetstring dataB := f_rnd_octstring(13);
2436 var octetstring dataC := f_rnd_octstring(3);
2437 var octetstring dataD := f_rnd_octstring(12);
2438 var uint32_t sched_fn;
2439 var GprsMS ms;
2440 var template (value) RlcmacUlBlock ul_data;
2441
2442 /* Initialize NS/BSSGP side */
2443 f_init_bssgp();
2444 /* Initialize GPRS MS side */
2445 f_init_gprs_ms();
2446 ms := g_ms[0]; /* We only use first MS in this test */
2447
2448 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002449 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002450
2451 /* Establish BSSGP connection to the PCU */
2452 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002453 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002454
2455 /* Establish an Uplink TBF */
2456 f_ms_establish_ul_tbf(ms);
2457
2458 /* Summary of what's transmitted:
2459 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2460 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2461 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2462 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2463 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2464 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2465 */
2466
2467 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002468 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2469 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002470 cv := 3,
2471 bsn := ms.ul_tbf.bsn,
2472 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2473 tlli := ms.tlli);
2474 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2475 * RLCMAC block being sent. */
2476 ul_data.data.mac_hdr.e := true;
2477 f_ultbf_inc_bsn(ms.ul_tbf);
2478 f_ms_tx_ul_block(ms, ul_data);
2479
2480 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002481 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2482 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002483 cv := 2,
2484 bsn := ms.ul_tbf.bsn,
2485 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2486 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2487 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2488 },
2489 tlli := ms.tlli);
2490 f_ultbf_inc_bsn(ms.ul_tbf);
2491 f_ms_tx_ul_block(ms, ul_data);
2492
2493 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002494 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 +02002495
2496 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002497 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2498 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002499 cv := 1,
2500 bsn := ms.ul_tbf.bsn,
2501 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2502 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2503 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2504 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2505 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2506 },
2507 tlli := ms.tlli);
2508 f_ultbf_inc_bsn(ms.ul_tbf);
2509 f_ms_tx_ul_block(ms, ul_data);
2510
2511 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002512 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2513 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 +02002514
2515 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002516 ul_data := t_RLCMAC_UL_DATA_TLLI(
2517 cs := CS_1,
2518 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002519 cv := 0,
2520 bsn := ms.ul_tbf.bsn,
2521 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2522 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2523 },
2524 tlli := ms.tlli);
2525 f_ultbf_inc_bsn(ms.ul_tbf);
2526 f_ms_tx_ul_block(ms, ul_data);
2527
2528 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002529 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 +02002530
2531 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2532 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2533 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2534
2535 f_shutdown(__BFILE__, __LINE__, final := true);
2536}
2537
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002538/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2539 * ACK/NACK is not answered */
2540testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2541 var RlcmacDlBlock dl_block;
2542 var octetstring data1 := f_rnd_octstring(200);
2543 var octetstring data2 := f_rnd_octstring(10);
2544 var uint32_t dl_fn;
2545 var GprsMS ms;
2546 var template (value) TsTrxBtsNum nr;
2547 var BTS_PDTCH_Block data_msg;
2548
2549 /* Initialize NS/BSSGP side */
2550 f_init_bssgp();
2551 /* Initialize GPRS MS side */
2552 f_init_gprs_ms();
2553 ms := g_ms[0]; /* We only use first MS in this test */
2554
2555 /* Initialize the PCU interface abstraction */
2556 f_init_raw(testcasename())
2557
2558 /* Establish BSSGP connection to the PCU */
2559 f_bssgp_establish();
2560 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2561
2562 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2563 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2564 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2565
2566 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2567 f_sleep(X2002);
2568
2569 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2570 while (true) {
2571 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2572
2573 /* Keep Ack/Nack description updated (except for last BSN) */
2574 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2575
2576 if (f_dl_block_rrbp_valid(dl_block)) {
2577 /* Don't transmit DL ACK here on purpose ignore it */
2578 break;
2579 }
2580 }
2581
2582 /* PCU starts whole process again */
2583 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2584
2585 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2586 f_sleep(X2002);
2587
2588 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2589 /* DL data), after that we receive only DUMMY blocks so we are done */
2590 var boolean data_received := false;
2591 nr := ts_TsTrxBtsNum;
2592 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2593 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2594 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2595 block_nr := nr.blk_nr));
2596 alt {
2597 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2598 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2599 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2600 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2601 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2602 tr_RLCMAC_DATA)) -> value data_msg {
2603 data_received := true;
2604 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2605 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2606 log("Received FINAL_ACK");
2607 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2608 }
2609 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2610 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2611 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2612 }
2613 nr := ts_TsTrxBtsNum;
2614 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2615 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2616 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2617 block_nr := nr.blk_nr));
2618 repeat;
2619 }
2620 [] BTS.receive {
2621 setverdict(fail, "Unexpected BTS message");
2622 f_shutdown(__BFILE__, __LINE__);
2623 }
2624 }
2625
2626 f_shutdown(__BFILE__, __LINE__, final := true);
2627}
2628
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002629/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2630testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002631 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002632 var octetstring data := f_rnd_octstring(10);
2633 var PacketDlAssign dl_tbf_ass;
2634 var RlcmacDlBlock dl_block;
2635 var uint32_t poll_fn;
2636 var uint32_t sched_fn;
2637 var GprsMS ms;
2638 timer T := 5.0;
2639
2640 /* Initialize NS/BSSGP side */
2641 f_init_bssgp();
2642 /* Initialize GPRS MS side */
2643 f_init_gprs_ms();
2644 ms := g_ms[0]; /* We only use first MS in this test */
2645
2646 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002647 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2648 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002649
2650 /* Initialize the PCU interface abstraction */
2651 f_init_raw(testcasename(), info_ind);
2652
2653 /* Establish BSSGP connection to the PCU */
2654 f_bssgp_establish();
2655 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2656
2657 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2658 through PDCH (no multiblock assignment possible through PCH) */
2659 f_ms_establish_ul_tbf(ms);
2660
2661 /* Send one UL block (with TLLI since we are in One-Phase Access
2662 contention resoultion) and make sure it is ACKED fine */
2663 f_ms_tx_ul_data_block(ms, data, with_tlli := true, nr := f_ms_tx_TsTrxBtsNum(ms));
2664 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2665 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2666
2667 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2668 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2669 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2670 gprsextendeddynalloccap := '0'B
2671 };
2672 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2673 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2674 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2675 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2676 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2677 f_shutdown(__BFILE__, __LINE__);
2678 }
2679 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2680
2681 f_shutdown(__BFILE__, __LINE__, final := true);
2682}
2683
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002684testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002685 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002686 var RlcmacDlBlock dl_block;
2687 var octetstring data := f_rnd_octstring(10);
2688 var PollFnCtx pollctx;
2689 var uint32_t sched_fn;
2690 var GprsMS ms;
2691
2692 var MultislotCap_GPRS mscap_gprs := {
2693 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2694 gprsextendeddynalloccap := '0'B
2695 };
2696 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2697
2698
2699 /* Initialize NS/BSSGP side */
2700 f_init_bssgp();
2701 /* Initialize GPRS MS side */
2702 f_init_gprs_ms();
2703 ms := g_ms[0]; /* We only use first MS in this test */
2704
2705 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002706 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2707 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002708
2709 /* Initialize the PCU interface abstraction */
2710 f_init_raw(testcasename(), info_ind);
2711
2712 /* Establish BSSGP connection to the PCU */
2713 f_bssgp_establish();
2714 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2715
2716 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2717 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2718
2719 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
2720 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
2721
2722 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2723 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2724 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2725 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2726 f_shutdown(__BFILE__, __LINE__);
2727 }
2728 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2729
2730 f_shutdown(__BFILE__, __LINE__, final := true);
2731}
2732
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002733testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
2734 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
2735 var RlcmacDlBlock dl_block;
2736 var octetstring data := f_rnd_octstring(10);
2737 var PollFnCtx pollctx;
2738 var uint32_t sched_fn;
2739 var GprsMS ms;
2740
2741 var MultislotCap_GPRS mscap_gprs := {
2742 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2743 gprsextendeddynalloccap := '0'B
2744 };
2745 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2746
2747
2748 /* Initialize NS/BSSGP side */
2749 f_init_bssgp();
2750 /* Initialize GPRS MS side */
2751 f_init_gprs_ms();
2752 ms := g_ms[0]; /* We only use first MS in this test */
2753
2754 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002755 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2756 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002757
2758 /* Initialize the PCU interface abstraction */
2759 f_init_raw(testcasename(), info_ind);
2760
2761 /* Establish BSSGP connection to the PCU */
2762 f_bssgp_establish();
2763 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2764
2765 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2766 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2767
2768 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
2769 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
2770 f_shutdown(__BFILE__, __LINE__);
2771 }
2772
2773 f_shutdown(__BFILE__, __LINE__, final := true);
2774}
2775
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002776/* Test scenario where MS wants to request a new TBF once the current one is
2777 * ending, by means of sending a Packet Resource Request on ul slot provided by
2778 * last Pkt Ul ACK's RRBP.
2779 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
2780testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002781 var RlcmacDlBlock dl_block;
2782 var octetstring data := f_rnd_octstring(10);
2783 var uint32_t sched_fn;
2784 var uint32_t dl_fn;
2785 var template RlcmacDlBlock acknack_tmpl;
2786 var GprsMS ms;
2787
2788 /* Initialize NS/BSSGP side */
2789 f_init_bssgp();
2790 /* Initialize GPRS MS side */
2791 f_init_gprs_ms();
2792 ms := g_ms[0]; /* We only use first MS in this test */
2793
2794 /* Initialize the PCU interface abstraction */
2795 f_init_raw(testcasename());
2796
2797 /* Establish BSSGP connection to the PCU */
2798 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002799 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002800
2801 /* Establish an Uplink TBF */
2802 f_ms_establish_ul_tbf(ms);
2803
2804 /* Send one UL block (with TLLI since we are in One-Phase Access
2805 contention resoultion) and make sure it is ACKED fine */
2806 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
2807
2808 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002809 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002810
2811 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
2812 tr_UlAckNackGprs(ms.tlli,
2813 tr_AckNackDescription(final_ack := '1'B),
2814 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
2815 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2816
2817 /* TODO: verify TBF_EST and FinalACK are both '1' above */
2818
2819 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07002820 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 +07002821 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002822 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2823 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2824
2825 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2826 and make sure it is ACKED fine */
2827 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
2828
2829 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002830 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02002831
2832 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
2833 /* ACK the ACK */
2834 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2835
2836 f_shutdown(__BFILE__, __LINE__, final := true);
2837}
2838
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002839/* Test CS paging over the BTS<->PCU socket.
2840 * 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.
2841 * Paging should be send on the PACCH.
2842 *
2843 * 1. Send a Paging Request over PCU socket.
2844 * 2. Send a Ready-To-Send message over PCU socket
2845 * 3. Expect a Paging Frame
2846 */
2847testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002848 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002849 var MobileIdentityLV mi;
2850 var octetstring mi_enc_lv;
2851 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002852 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002853
2854 /* Initialize NS/BSSGP side */
2855 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002856 /* Initialize GPRS MS side */
2857 f_init_gprs_ms();
2858 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002859
2860 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002861 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002862
2863 /* Establish BSSGP connection to the PCU */
2864 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002865 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002866
2867 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002868 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002869
2870 /* build mobile Identity */
2871 mi := valueof(ts_MI_IMSI_LV(imsi));
2872 mi_enc_lv := enc_MobileIdentityLV(mi);
2873 /* Send paging request */
2874 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
2875 sapi :=PCU_IF_SAPI_PDTCH));
2876
2877 /* Receive it on BTS side towards MS */
2878 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2879
2880 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002881 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
2882 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2883 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2884 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002885
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002886 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002887}
2888
2889/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
2890 */
2891private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2892runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002893 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002894 var hexstring imsi := f_gen_imsi(42);
2895 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002896 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002897
2898 /* Initialize NS/BSSGP side */
2899 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002900 /* Initialize GPRS MS side */
2901 f_init_gprs_ms();
2902 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002903
2904 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002905 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002906
2907 /* Establish BSSGP connection to the PCU */
2908 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002909 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002910
2911 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002912 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002913
2914 /* Send paging request with or without TMSI */
2915 if (use_ptmsi) {
2916 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
2917 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
2918 } else {
2919 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
2920 }
2921
2922 /* Receive it on BTS side towards MS */
2923 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
2924
2925 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002926 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002927 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002928 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
2929 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
2930 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002931 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07002932 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
2933 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
2934 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002935 }
2936
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002937 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002938}
2939
2940testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
2941 f_tc_paging_cs_from_sgsn(0, true);
2942}
2943
2944testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
2945 f_tc_paging_cs_from_sgsn(0);
2946}
2947
2948testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02002949 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002950}
2951
2952/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
2953 */
2954private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
2955runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002956 var integer imsi_suff_tx := 423;
2957 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002958 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002959
2960 /* Initialize NS/BSSGP side */
2961 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002962 /* Initialize GPRS MS side */
2963 f_init_gprs_ms();
2964 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002965
2966 /* Initialize the PCU interface abstraction */
2967 f_init_raw(testcasename());
2968
2969 /* Establish BSSGP connection to the PCU */
2970 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002971 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002972
2973 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
2974 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
2975 if (use_ptmsi) {
2976 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
2977 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
2978 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
2979 } else {
2980 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
2981 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
2982 }
2983
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002984 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002985}
2986
2987testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
2988 f_tc_paging_ps_from_sgsn(0, true);
2989}
2990
2991testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
2992 f_tc_paging_ps_from_sgsn(0);
2993}
2994
2995testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02002996 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002997}
2998
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02002999/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3000testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3001 var RlcmacDlBlock dl_block;
3002 var octetstring data := f_rnd_octstring(10);
3003 var uint32_t sched_fn;
3004 var uint32_t dl_fn;
3005 var GprsMS ms;
3006
3007 /* Initialize NS/BSSGP side */
3008 f_init_bssgp();
3009 /* Initialize GPRS MS side */
3010 f_init_gprs_ms();
3011 ms := g_ms[0]; /* We only use first MS in this test */
3012
3013 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003014 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003015
Daniel Willmann535aea62020-09-21 13:27:08 +02003016 f_statsd_reset();
3017
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003018 /* Establish BSSGP connection to the PCU */
3019 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003020 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003021
3022 /* Establish an Uplink TBF */
3023 f_ms_establish_ul_tbf(ms);
3024
3025 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
3026 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
3027 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3028 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3029 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3030
3031 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003032 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003033
3034 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3035 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3036 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3037
3038 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3039 f_sleep(X2002);
3040 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3041
3042 /* ACK the DL block */
3043 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3044 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3045 f_dl_block_ack_fn(dl_block, dl_fn));
3046
Daniel Willmann535aea62020-09-21 13:27:08 +02003047 var StatsDExpects expect := {
3048 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3049 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3050 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3051 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003052 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003053 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003054 };
3055 f_statsd_expect(expect);
3056
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003057 f_shutdown(__BFILE__, __LINE__, final := true);
3058}
3059
3060/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3061testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3062 var RlcmacDlBlock dl_block;
3063 var octetstring data := f_rnd_octstring(10);
3064 var uint32_t sched_fn;
3065 var uint32_t dl_fn;
3066 var GprsMS ms;
3067
3068 /* Initialize NS/BSSGP side */
3069 f_init_bssgp();
3070 /* Initialize GPRS MS side */
3071 f_init_gprs_ms();
3072 ms := g_ms[0]; /* We only use first MS in this test */
3073
3074 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003075 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003076
3077 /* Establish BSSGP connection to the PCU */
3078 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003079 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003080
3081 /* Establish an Uplink TBF */
3082 f_ms_establish_ul_tbf(ms);
3083
3084 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
3085 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
3086 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3087 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3088 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3089
3090 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003091 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003092
3093 /* Now SGSN sends some DL data with an invalid IMSI */
3094 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3095
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003096 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003097
3098 /* TODO: make sure no data is sent over PCU -> MS */
3099
3100 f_shutdown(__BFILE__, __LINE__, final := true);
3101}
3102
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003103private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3104 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3105 var octetstring data := f_rnd_octstring(6);
3106 var RlcmacDlBlock dl_block;
3107 var GprsMS ms;
3108 var uint32_t fn;
3109
3110 /* Initialize NS/BSSGP side */
3111 f_init_bssgp();
3112 /* Initialize GPRS MS side */
3113 f_init_gprs_ms();
3114 ms := g_ms[0]; /* We only use first MS in this test */
3115
3116 /* Initialize the PCU interface abstraction */
3117 f_init_raw(testcasename());
3118
3119 /* Establish BSSGP connection to the PCU */
3120 f_bssgp_establish();
3121 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3122
3123 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3124 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3125 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3126
3127 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3128 f_sleep(X2002);
3129
3130 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3131 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3132
3133 if (ischosen(dl_block.data_egprs)) {
3134 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3135 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3136 f_shutdown(__BFILE__, __LINE__);
3137 }
3138 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3139 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3140 f_shutdown(__BFILE__, __LINE__);
3141 }
3142 if (not match(dl_block.data_egprs.blocks[1].payload,
3143 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3144 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3145 f_shutdown(__BFILE__, __LINE__);
3146 }
3147 } else if (lengthof(dl_block.data.blocks) > 1) {
3148 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3149 f_shutdown(__BFILE__, __LINE__);
3150 }
3151
3152 f_shutdown(__BFILE__, __LINE__, final := true);
3153}
3154
3155/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3156 * containing llc data. See OS#4849 */
3157testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3158 f_tc_dl_data_no_llc_ui_dummy(omit);
3159}
3160
3161/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3162 * containing llc data. See OS#4849 */
3163testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003164 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003165}
3166
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003167private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003168 template GsmRrMessage t_imm_ass := ?,
3169 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003170runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003171 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003172 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003173
3174 ra11 := enc_EGPRSPktChRequest2uint(req);
3175 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3176
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003177 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003178 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003179 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003180 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003181 }
3182
3183 setverdict(pass);
3184}
3185
3186testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3187 var template GsmRrMessage imm_ass;
3188 var template IaRestOctets rest;
3189 var template EgprsUlAss ul_ass;
3190
3191 /* Initialize the PCU interface abstraction */
3192 f_init_raw(testcasename());
3193
3194 var EGPRSPktChRequest req := {
3195 /* NOTE: other fields are set in the loop */
3196 signalling := { tag := '110011'B }
3197 };
3198
3199 for (var integer i := 0; i < 6; i := i + 1) {
3200 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3201 req.signalling.random_bits := ext_ra;
3202
3203 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3204 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3205 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3206 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3207
3208 f_TC_egprs_pkt_chan_req(req, imm_ass);
3209 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003210
3211 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003212}
3213
3214testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3215 var template GsmRrMessage imm_ass;
3216 var template IaRestOctets rest;
3217 var template EgprsUlAss ul_ass;
3218
3219 /* Initialize the PCU interface abstraction */
3220 f_init_raw(testcasename());
3221
3222 var EGPRSPktChRequest req := {
3223 /* NOTE: other fields are set in the loop */
3224 one_phase := { tag := '0'B }
3225 };
3226
3227 for (var integer i := 0; i < 6; i := i + 1) {
3228 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3229 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3230 var BIT2 priority := substr(ext_ra, 0, 2);
3231 var BIT3 rand := substr(ext_ra, 2, 3);
3232
3233 req.one_phase.multislot_class := mslot_class;
3234 req.one_phase.priority := priority;
3235 req.one_phase.random_bits := rand;
3236
3237 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3238 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3239 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3240 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3241
3242 f_TC_egprs_pkt_chan_req(req, imm_ass);
3243 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003244
3245 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003246}
3247
3248testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3249 var template GsmRrMessage imm_ass;
3250 var template IaRestOctets rest;
3251 var template EgprsUlAss ul_ass;
3252
3253 /* Initialize the PCU interface abstraction */
3254 f_init_raw(testcasename());
3255
3256 var EGPRSPktChRequest req := {
3257 /* NOTE: other fields are set in the loop */
3258 two_phase := { tag := '110000'B }
3259 };
3260
3261 for (var integer i := 0; i < 6; i := i + 1) {
3262 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3263 var BIT2 priority := substr(ext_ra, 0, 2);
3264 var BIT3 rand := substr(ext_ra, 2, 3);
3265
3266 req.two_phase.priority := priority;
3267 req.two_phase.random_bits := rand;
3268
3269 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3270 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3271 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3272 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3273
3274 f_TC_egprs_pkt_chan_req(req, imm_ass);
3275 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003276
3277 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003278}
3279
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003280private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3281 template IARRestOctets rest := ?,
3282 PCUIF_BurstType bt := BURST_TYPE_1)
3283runs on RAW_PCU_Test_CT {
3284 var template ReqRefWaitInd tr_ref;
3285 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003286
3287 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3288 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3289 ra := bit2int(ra11), is_11bit := 1,
3290 burst_type := bt, fn := fn,
3291 arfcn := 871));
3292
3293 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003294 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003295
3296 /* Just to have a short-name reference to the actual message */
3297 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3298
3299 /* Make sure that Request Reference list contains at least one entry
3300 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
3301 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn));
3302 if (not match(iar.payload, { *, tr_ref, * })) {
3303 setverdict(fail, "Request Reference list does not match");
3304 f_shutdown(__BFILE__, __LINE__);
3305 }
3306
3307 /* Match Feature Indicator (must indicate PS domain) */
3308 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3309 setverdict(fail, "Feature Indicator does not match");
3310 f_shutdown(__BFILE__, __LINE__);
3311 }
3312
3313 /* Match IAR Rest Octets */
3314 if (not match(iar.rest_octets, rest)) {
3315 setverdict(fail, "IAR Rest Octets does not match: ",
3316 iar.rest_octets, " vs expected ", rest);
3317 f_shutdown(__BFILE__, __LINE__);
3318 }
3319
3320 setverdict(pass);
3321}
3322
3323/* Verify the contents of RR Immediate Assignment Reject message and its
3324 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3325testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3326 var template IARRestOctets rest;
3327 var BIT5 ext_ra;
3328
3329 /* Initialize the PCU interface abstraction */
3330 f_init_raw(testcasename());
3331
3332 for (var integer i := 0; i < 6; i := i + 1) {
3333 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3334 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3335
3336 /* Intentionally incorrect message (see table 11.2.5a.2) */
3337 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3338 }
3339
3340 f_shutdown(__BFILE__, __LINE__, final := true);
3341}
3342
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003343/* At the moment, the IUT does not support any emergency services. Make sure
3344 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3345testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3346 var template IARRestOctets rest;
3347 var BIT5 ext_ra;
3348 var BIT11 ra11;
3349
3350 /* Initialize the PCU interface abstraction */
3351 f_init_raw(testcasename());
3352
3353 var EGPRSPktChRequest req := {
3354 /* NOTE: other fields are set in the loop */
3355 emergency := { tag := '110111'B }
3356 };
3357
3358 for (var integer i := 0; i < 6; i := i + 1) {
3359 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3360 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3361
3362 req.emergency.random_bits := ext_ra;
3363 ra11 := enc_EGPRSPktChRequest2bits(req);
3364
3365 /* Intentionally incorrect message (see table 11.2.5a.2) */
3366 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3367 }
3368
3369 f_shutdown(__BFILE__, __LINE__, final := true);
3370}
3371
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003372/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3373testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003374 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003375 var template IARRestOctets rest;
3376 var BIT11 ra11;
3377
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003378 info_ind := valueof(ts_PCUIF_INFO_default);
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003379
3380 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003381 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3382 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003383
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003384 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003385 f_init_raw(testcasename(), info_ind);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003386
3387 var EGPRSPktChRequest req := {
3388 one_phase := {
3389 tag := '0'B,
3390 multislot_class := '10101'B,
3391 priority := '01'B,
3392 random_bits := '101'B
3393 }
3394 };
3395
3396 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3397 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3398 for (var integer i := 0; i < 7; i := i + 1) {
3399 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3400 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3401 }
3402
3403 ra11 := enc_EGPRSPktChRequest2bits(req);
3404 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3405
3406 /* At this point, the IUT should run out of free USFs */
3407 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest);
3408
3409 f_shutdown(__BFILE__, __LINE__, final := true);
3410}
3411
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003412/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003413private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003414return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003415 /* Pick a random MA length in range 2 .. max_ma_len */
3416 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
3417
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003418 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
3419 hsn := f_rnd_int(63),
3420 maio := f_rnd_int(63),
3421 ma := f_rnd_bitstring(ma_len));
3422}
3423
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003424private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
3425 in GsmRrMessage rr_msg)
3426{
3427 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003428 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003429
3430 var template PacketChannelDescription tr_pkt_chan_desc := {
3431 channel_Type_spare := ?,
3432 tn := ?,
3433 tsc := ts.tsc,
3434 presence := '1'B,
3435 zero := omit,
3436 one := {
3437 maio := ts.maio,
3438 hsn := ts.hsn
3439 }
3440 };
3441
3442 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
3443 setverdict(fail, "Packet Channel Description does not match: ",
3444 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
3445 }
3446
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003447 /* Mobile Allocation is expected to be octet-aligned */
3448 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
3449 var template MobileAllocationLV tr_ma := {
3450 len := ma_oct_len, /* in bytes */
3451 ma := substr(ts.ma, 0, ma_oct_len * 8)
3452 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003453
3454 if (not match(ia.mobile_allocation, tr_ma)) {
3455 setverdict(fail, "Mobile Allocation does not match: ",
3456 ia.mobile_allocation, " vs ", tr_ma);
3457 }
3458
3459 setverdict(pass);
3460}
3461
3462/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
3463testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003464 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003465 var GprsMS ms := valueof(t_GprsMS_def);
3466
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003467 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003468 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003469
3470 /* Initialize the PCU interface abstraction */
3471 f_init_raw(testcasename(), info_ind);
3472
3473 /* EGPRS Packet Channel Request (cause=Signalling) */
3474 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
3475
3476 /* Establish an Uplink EGPRS TBF */
3477 f_ms_establish_ul_tbf(ms);
3478
3479 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3480 f_shutdown(__BFILE__, __LINE__, final := true);
3481}
3482
3483/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
3484testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003485 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003486 var GprsMS ms := valueof(t_GprsMS_def);
3487
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003488 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003489 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003490
3491 /* Initialize the PCU interface abstraction */
3492 f_init_raw(testcasename(), info_ind);
3493
3494 /* Establish an Uplink TBF */
3495 f_ms_establish_ul_tbf(ms);
3496
3497 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3498 f_shutdown(__BFILE__, __LINE__, final := true);
3499}
3500
3501/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
3502testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003503 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003504 var GprsMS ms := valueof(t_GprsMS_def);
3505
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003506 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003507 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003508
3509 /* Initialize NS/BSSGP side */
3510 f_init_bssgp();
3511
3512 /* Initialize the PCU interface abstraction */
3513 f_init_raw(testcasename(), info_ind);
3514
3515 /* Establish BSSGP connection to the PCU */
3516 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003517 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003518
3519 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3520 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
3521 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3522
3523 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
3524 f_shutdown(__BFILE__, __LINE__, final := true);
3525}
3526
3527private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
3528 in FrequencyParameters fp)
3529{
3530 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003531 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003532
3533 /* Table 12.8.1: Frequency Parameters information elements */
3534 var template FrequencyParameters tr_fp := {
3535 tsc := ts.tsc,
3536 presence := '10'B, /* Direct encoding 1 */
3537 arfcn := omit,
3538 indirect := omit,
3539 direct1 := {
3540 maio := ts.maio,
3541 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
3542 mobile_allocation := {
3543 hsn := ts.hsn,
3544 rfl_number_list_present := '0'B,
3545 rfl_number_list := omit,
3546 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003547 ma_length := ts.ma_bit_len,
3548 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003549 }
3550 },
3551 direct2 := omit
3552 };
3553
3554 if (not match(fp, tr_fp)) {
3555 setverdict(fail, "Frequency Parameters IE does not match: ",
3556 fp, " vs ", tr_fp);
3557 }
3558
3559 setverdict(pass);
3560}
3561
3562/* Make sure that Packet Uplink Assignment contains hopping parameters */
3563testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003564 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003565 var GprsMS ms := valueof(t_GprsMS_def);
3566 var uint32_t poll_fn;
3567
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003568 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003569 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003570
3571 /* Initialize the PCU interface abstraction */
3572 f_init_raw(testcasename(), info_ind);
3573
3574 /* Establish an Uplink TBF */
3575 f_ms_establish_ul_tbf(ms);
3576
3577 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
3578 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)));
3579
3580 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003581 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
3582 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003583
3584 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
3585 var template (omit) FrequencyParameters fp;
3586 if (ua.is_egprs == '1'B) {
3587 fp := ua.egprs.freq_par;
3588 } else {
3589 fp := ua.gprs.freq_par;
3590 }
3591
3592 /* This is an optional IE, so it's worth to check its presence */
3593 if (istemplatekind(fp, "omit")) {
3594 setverdict(fail, "Frequency Parameters IE is not present");
3595 f_shutdown(__BFILE__, __LINE__);
3596 }
3597
3598 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
3599 f_shutdown(__BFILE__, __LINE__, final := true);
3600}
3601
3602/* Make sure that Packet Downlink Assignment contains hopping parameters */
3603testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003604 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003605 var octetstring data := f_rnd_octstring(10);
3606 var GprsMS ms := valueof(t_GprsMS_def);
3607 var RlcmacDlBlock dl_block;
3608 var uint32_t poll_fn;
3609
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003610 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003611 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003612
3613 /* Initialize NS/BSSGP side */
3614 f_init_bssgp();
3615
3616 /* Initialize the PCU interface abstraction */
3617 f_init_raw(testcasename(), info_ind);
3618
3619 /* Establish BSSGP connection to the PCU */
3620 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003621 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003622
3623 /* Establish an Uplink TBF */
3624 f_ms_establish_ul_tbf(ms);
3625
3626 /* Send an Uplink block, so this TBF becomes "active" */
3627 f_ms_tx_ul_data_block(ms, data, with_tlli := true);
3628
3629 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3630 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
3631 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
3632
3633 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
3634 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3635
3636 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01003637 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
3638 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003639
3640 /* This is an optional IE, so it's worth to check its presence */
3641 if (not ispresent(da.freq_par)) {
3642 setverdict(fail, "Frequency Parameters IE is not present");
3643 f_shutdown(__BFILE__, __LINE__);
3644 }
3645
3646 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
3647 f_shutdown(__BFILE__, __LINE__, final := true);
3648}
3649
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003650/* Check if the IUT handles subsequent INFO.ind messages */
3651testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003652 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003653 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003654
3655 /* Initialize the PCU interface abstraction */
3656 f_init_raw(testcasename(), info_ind);
3657
3658 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
3659 for (var integer i := 0; i < 16; i := i + 1) {
3660 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01003661 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07003662 }
3663
3664 f_shutdown(__BFILE__, __LINE__, final := true);
3665}
3666
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003667/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
3668testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
3669 var PCUIF_info_ind info_ind;
3670 var integer i;
3671 const integer num_ms := 8;
3672
3673 /* Initialize NS/BSSGP side */
3674 f_init_bssgp();
3675 /* Initialize GPRS MS side */
3676 f_init_gprs_ms(num_ms);
3677
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003678 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003679 /* Only the 3 first TRX are enabled. The enabled ones all have same
3680 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003681 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
3682 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
3683 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
3684 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003685
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();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003691 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003692
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07003693 /* Establish an Uplink TBF for each GprsMS instance */
3694 f_multi_ms_establish_tbf(do_activate := false);
3695
3696 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003697 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003698 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01003699 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003700 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02003701 f_shutdown(__BFILE__, __LINE__);
3702 }
3703 }
3704
3705 f_shutdown(__BFILE__, __LINE__, final := true);
3706}
3707
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003708/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
3709 * downgraded to CS1-4 so that GPRS can read the USF).
3710 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
3711 */
3712testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
3713 var PCUIF_info_ind info_ind;
3714 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
3715 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003716 var uint32_t sched_fn, dl_fn, ack_fn;
3717 var octetstring data := f_rnd_octstring(10);
3718 var RlcmacDlBlock dl_block;
3719 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003720 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003721 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
3722 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
3723
3724 /* Initialize NS/BSSGP side */
3725 f_init_bssgp();
3726 /* Initialize GPRS MS side */
3727 f_init_gprs_ms(num_ms);
3728
3729 info_ind := valueof(ts_PCUIF_INFO_default);
3730 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003731 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
3732 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003733
3734 /* Initialize the PCU interface abstraction */
3735 f_init_raw(testcasename(), info_ind);
3736
3737 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
3738 g_mcs_initial_dl := 5;
3739 g_mcs_max_dl := 5;
3740 f_pcuvty_set_allowed_cs_mcs();
3741
3742 /* Establish BSSGP connection to the PCU */
3743 f_bssgp_establish();
3744 f_multi_ms_bssgp_register();
3745
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003746 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003747 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 +01003748 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
3749 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
3750 f_shutdown(__BFILE__, __LINE__);
3751 }
3752 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3753 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3754
3755 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003756 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 +01003757 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
3758 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
3759 f_shutdown(__BFILE__, __LINE__);
3760 }
3761 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3762 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
3763
3764 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
3765 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3766 f_sleep(0.1);
3767 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3768 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3769 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
3770 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3771 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
3772 /* ACK the DL block */
3773 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
3774 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
3775 f_dl_block_ack_fn(dl_block, dl_fn));
3776
3777 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
3778 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3779 f_sleep(0.1);
3780 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
3781 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
3782 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
3783 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
3784 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
3785 /* ACK the DL block */
3786 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
3787 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
3788 f_dl_block_ack_fn(dl_block, dl_fn));
3789
3790 data := f_rnd_octstring(1400);
3791 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3792 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3793
3794 for (var integer i := 0; i < 800; i := i + 1) {
3795 f_rx_rlcmac_dl_block(dl_block, dl_fn);
3796
3797 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
3798 /* No more data to receive, done */
3799 break;
3800 }
3801
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003802 usf_ms := -1;
3803
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003804 if (ischosen(dl_block.ctrl)) {
3805 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
3806 f_shutdown(__BFILE__, __LINE__);
3807 } else if (ischosen(dl_block.data_egprs)) {
3808 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
3809 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
3810 f_shutdown(__BFILE__, __LINE__);
3811 }
3812 tgt_ms := 1;
3813 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
3814 if (dl_block.data_egprs.mcs > MCS_4) {
3815 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
3816 f_shutdown(__BFILE__, __LINE__);
3817 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003818 usf_ms := 0;
3819 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003820 } else {
3821 if (dl_block.data_egprs.mcs <= MCS_4) {
3822 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
3823 f_shutdown(__BFILE__, __LINE__);
3824 }
3825 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003826 usf_ms := 1;
3827 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003828 }
3829 }
3830 } else {
3831 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
3832 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
3833 f_shutdown(__BFILE__, __LINE__);
3834 }
3835 tgt_ms := 0;
3836 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 +01003837 usf_ms := 0;
3838 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003839 } 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 +01003840 usf_ms := 1;
3841 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003842 }
3843 }
3844
3845 /* Keep Ack/Nack description updated */
3846 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
3847
3848 /* TDMA frame number on which we are supposed to send the ACK */
3849 if (f_dl_block_rrbp_valid(dl_block)) {
3850 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
3851 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);
3852 if (tx_data_remain != 0) {
3853 /* Submit more data from time to time to keep the TBF ongoing */
3854 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
3855 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
3856 tx_data_remain := tx_data_remain - 1;
3857 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003858 } else if (tx_data_remain != 0) {
3859 /* keep sending UL blocks when requested by USF to avoid
3860 * UL TBF timeout and hence stop receival of USFs */
3861 if (usf_ms != -1) {
3862 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
3863 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003864 }
3865 }
3866
3867 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 +01003868 /* He we check that DL blocks scheduled at GPRS can still request UL
3869 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
3870 * condition also ensures the downgrade to <=MCS4 condition is tested
3871 * above */
3872 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
3873 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003874 f_shutdown(__BFILE__, __LINE__);
3875 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01003876 /* Here check for some level of fairness between them (at least ~40%): */
3877 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
3878 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
3879 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
3880 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
3881 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3882 f_shutdown(__BFILE__, __LINE__);
3883 }
3884 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
3885 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
3886 f_shutdown(__BFILE__, __LINE__);
3887 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01003888
3889 f_shutdown(__BFILE__, __LINE__, final := true);
3890}
3891
3892
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07003893private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
3894 boolean exp_imsi, boolean exp_tmsi)
3895runs on RAW_PCU_Test_CT {
3896 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
3897 var integer pending := lengthof(g_ms);
3898 var RlcmacDlBlock dl_block;
3899 var boolean f1, f2;
3900
3901 while (pending > 0) {
3902 var uint32_t poll_fn;
3903
3904 /* Obtain a Downlink block and make sure it is a paging request */
3905 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
3906 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
3907 setverdict(fail, "Rx unexpected DL block: ", dl_block);
3908 break;
3909 }
3910
3911 /* This should not happen in general, but who knows... */
3912 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3913 if (not ispresent(req.repeated_pageinfo)) {
3914 setverdict(fail, "Repeated Page Info IE is absent?!?");
3915 break;
3916 }
3917
3918 /* A single message may contain several MIs depending on their type */
3919 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3920 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
3921 ps_domain := false);
3922 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
3923 ps_domain := false);
3924 if (not f1 and not f2)
3925 { continue; }
3926
3927 /* Detect duplicate MIs */
3928 if (mask[i] == '1'B) {
3929 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
3930 continue;
3931 }
3932
3933 mask[i] := '1'B;
3934 }
3935
3936 pending := pending - lengthof(req.repeated_pageinfo);
3937 }
3938
3939 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
3940 if (mask[i] != '1'B) {
3941 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
3942 log("===== mask := ", mask);
3943 }
3944 }
3945
3946 /* All messages must have been received by now, expect a dummy block */
3947 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
3948}
3949
3950private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
3951runs on RAW_PCU_Test_CT {
3952 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3953 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3954
3955 /* Initialize NS/BSSGP side */
3956 f_init_bssgp();
3957
3958 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003959 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07003960
3961 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
3962 f_init_gprs_ms(7 * 8);
3963
3964 /* Initialize the PCU interface abstraction */
3965 f_init_raw(testcasename(), info_ind);
3966
3967 /* Establish BSSGP connection to the PCU */
3968 f_bssgp_establish();
3969 f_multi_ms_bssgp_register();
3970
3971 /* Establish an Uplink TBF for each GprsMS instance */
3972 f_multi_ms_establish_tbf(do_activate := true);
3973}
3974
3975testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
3976 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
3977
3978 /* Common part: send INFO.ind, establish TBFs... */
3979 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
3980
3981 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
3982 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
3983 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
3984 }
3985
3986 /* FIXME: work around a race condition between PCUIF and BSSGP */
3987 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
3988
3989 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
3990 * The IUT is expected to page on all PDCH slots of all transceivers. */
3991 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
3992 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
3993 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
3994 }
3995
3996 f_shutdown(__BFILE__, __LINE__, final := true);
3997}
3998
3999testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4000 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4001
4002 /* Common part: send INFO.ind, establish TBFs... */
4003 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4004
4005 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4006 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4007 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4008 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4009 }
4010
4011 /* FIXME: work around a race condition between PCUIF and BSSGP */
4012 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4013
4014 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4015 * The IUT is expected to page on all PDCH slots of all transceivers. */
4016 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4017 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4018 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4019 }
4020
4021 f_shutdown(__BFILE__, __LINE__, final := true);
4022}
4023
4024testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4025 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4026
4027 /* Common part: send INFO.ind, establish TBFs... */
4028 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4029
4030 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4031 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4032 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4033 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4034 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4035 } else {
4036 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4037 }
4038 }
4039
4040 /* FIXME: work around a race condition between PCUIF and BSSGP */
4041 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4042
4043 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4044 * The IUT is expected to page on all PDCH slots of all transceivers. */
4045 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4046 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4047 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4048 }
4049
4050 f_shutdown(__BFILE__, __LINE__, final := true);
4051}
4052
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004053private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004054runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4055 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004056 var integer i := 0;
4057 while (true) {
4058 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4059 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4060 break;
4061 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004062 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004063 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4064 f_shutdown(__BFILE__, __LINE__);
4065 }
4066 i := i + 1;
4067 }
4068 return dl_block;
4069}
4070
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004071private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4072runs on RAW_PCU_Test_CT {
4073 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),
4074 info_ind.lac),
4075 info_ind.rac),
4076 info_ind.cell_id));
4077 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4078 423),
4079 2),
4080 5));
4081 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4082 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4083 var template (value) RAN_Information_RIM_Container res_cont :=
4084 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4085 ts_RIM_Sequence_Number(2),
4086 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4087 ts_RIM_Protocol_Version_Number(1),
4088 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4089 omit);
4090 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4091 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4092 res_cont));
4093}
4094
4095altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4096runs on RAW_PCU_Test_CT {
4097 /* RIM procedure: */
4098 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),
4099 info_ind.lac),
4100 info_ind.rac),
4101 info_ind.cell_id));
4102 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4103 423),
4104 2),
4105 5));
4106 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4107 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4108 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4109 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4110 tr_RAN_Information_Request_RIM_Container)) {
4111 if (do_answer) {
4112 f_outbound_nacc_rim_tx_resp(info_ind);
4113 }
4114 if (do_repeat) {
4115 repeat;
4116 }
4117 }
4118}
4119
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004120/* Start NACC from MS side */
4121private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004122 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
4123 boolean skip_final_ctrl_ack := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004124runs on RAW_PCU_Test_CT {
4125 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4126 var RlcmacDlBlock dl_block;
4127 var uint32_t sched_fn;
4128 var GsmArfcn req_arfcn := 862;
4129 var uint6_t req_bsic := 43;
4130
4131 /* Start NACC from MS side */
4132 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4133 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4134
4135 if (exp_rac_ci_query == true) {
4136 /* osmo-pcu should now ask for resolution: */
4137 f_ipa_ctrl_wait_link_up();
4138 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4139 int2str(info_ind.lac) & "." &
4140 int2str(info_ind.cell_id) & "." &
4141 int2str(req_arfcn) & "." &
4142 int2str(req_bsic);
4143 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4144 }
4145
4146 if (exp_si_query == true) {
4147 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004148 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004149 }
4150
4151 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004152 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004153
4154 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4155 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4156 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4157 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4158 f_shutdown(__BFILE__, __LINE__);
4159 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004160 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004161 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004162 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4163 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4164 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004165}
4166
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004167/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4168testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004169 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004170 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004171 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004172
4173 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4174 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4175
4176 /* Initialize NS/BSSGP side */
4177 f_init_bssgp();
4178 /* Initialize GPRS MS side */
4179 f_init_gprs_ms();
4180 ms := g_ms[0]; /* We only use first MS in this test */
4181
4182 /* Initialize the PCU interface abstraction */
4183 f_init_raw(testcasename(), info_ind);
4184
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004185 /* Make sure we are not affected by full cache from previous tests */
4186 f_pcuvty_flush_neigh_caches();
4187
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004188 /* Establish BSSGP connection to the PCU */
4189 f_bssgp_establish();
4190 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4191
4192 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004193 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 +01004194 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4195 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4196
4197 /* Start NACC from MS side */
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004198 f_outbound_nacc_success(ms, info_ind);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004199
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004200 f_shutdown(__BFILE__, __LINE__, final := true);
4201}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004202
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004203/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4204testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4205 var PollFnCtx pollctx;
4206 var GprsMS ms;
4207 var RlcmacDlBlock dl_block;
4208 var uint32_t sched_fn;
4209 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004210
4211 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4212 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4213
4214 /* Initialize NS/BSSGP side */
4215 f_init_bssgp();
4216 /* Initialize GPRS MS side */
4217 f_init_gprs_ms();
4218 ms := g_ms[0]; /* We only use first MS in this test */
4219
4220 /* Initialize the PCU interface abstraction */
4221 f_init_raw(testcasename(), info_ind);
4222
4223 /* Make sure we are not affected by full cache from previous tests */
4224 f_pcuvty_flush_neigh_caches();
4225
4226 /* Establish BSSGP connection to the PCU */
4227 f_bssgp_establish();
4228 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4229
4230 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004231 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 +01004232 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4233 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4234
4235 /* Start NACC from MS side, avoid sending final CTRL ACK */
4236 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true);
4237
4238 /* Wait until we receive something non-dummy */
4239 dl_block := f_skip_dummy(0, sched_fn);
4240 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4241 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4242 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4243 }
4244 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4245 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4246 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4247 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4248 }
4249
4250 f_shutdown(__BFILE__, __LINE__, final := true);
4251}
4252
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004253/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4254testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4255 var PollFnCtx pollctx;
4256 var GprsMS ms;
4257 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004258 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004259
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004260 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4261 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004262
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004263 /* Initialize NS/BSSGP side */
4264 f_init_bssgp();
4265 /* Initialize GPRS MS side */
4266 f_init_gprs_ms();
4267 ms := g_ms[0]; /* We only use first MS in this test */
4268
4269 /* Initialize the PCU interface abstraction */
4270 f_init_raw(testcasename(), info_ind);
4271
4272 /* Make sure we are not affected by full cache from previous tests */
4273 f_pcuvty_flush_neigh_caches();
4274 /* Set timeout values for caches so that entries will be in cache during second try */
4275 f_pcuvty_set_neigh_caches(10, 10);
4276
4277 /* Establish BSSGP connection to the PCU */
4278 f_bssgp_establish();
4279 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4280
4281 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004282 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 +01004283 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4284 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4285
4286 /* Start NACC from MS side */
4287 f_outbound_nacc_success(ms, info_ind);
4288
4289 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
4290 f_outbound_nacc_success(ms, info_ind, false, false);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004291
4292 f_shutdown(__BFILE__, __LINE__, final := true);
4293}
4294
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004295/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4296 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4297 */
4298testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4299 var PollFnCtx pollctx;
4300 var GprsMS ms;
4301 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004302 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4303
4304 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4305 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4306
4307 /* Initialize NS/BSSGP side */
4308 f_init_bssgp();
4309 /* Initialize GPRS MS side */
4310 f_init_gprs_ms();
4311 ms := g_ms[0]; /* We only use first MS in this test */
4312
4313 /* Initialize the PCU interface abstraction */
4314 f_init_raw(testcasename(), info_ind);
4315
4316 /* Make sure we are not affected by full cache from previous tests */
4317 f_pcuvty_flush_neigh_caches();
4318 /* Set timeout values for caches so that entries will be erased before the second try */
4319 f_pcuvty_set_neigh_caches(1, 1);
4320
4321 /* Establish BSSGP connection to the PCU */
4322 f_bssgp_establish();
4323 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4324
4325 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004326 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 +01004327 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4328 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4329
4330 /* Start NACC from MS side */
4331 f_outbound_nacc_success(ms, info_ind);
4332
4333 /* CTRL client should have disconnected from us */
4334 f_ipa_ctrl_wait_link_down();
4335 /* wait for cache entries to time out */
4336 f_sleep(2.0);
4337 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
4338 f_outbound_nacc_success(ms, info_ind);
4339
4340 f_shutdown(__BFILE__, __LINE__, final := true);
4341}
4342
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004343/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004344testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4345 var RlcmacDlBlock dl_block;
4346 var PollFnCtx pollctx;
4347 var uint32_t sched_fn;
4348 var GprsMS ms;
4349 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4350 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004351 var GsmArfcn req_arfcn := 862;
4352 var uint6_t req_bsic := 43;
4353
4354 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4355 * resolution CTRL port, to trigger Conn Refused by socket:
4356 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4357 */
4358
4359 /* Initialize NS/BSSGP side */
4360 f_init_bssgp();
4361 /* Initialize GPRS MS side */
4362 f_init_gprs_ms();
4363 ms := g_ms[0]; /* We only use first MS in this test */
4364
4365 /* Initialize the PCU interface abstraction */
4366 f_init_raw(testcasename(), info_ind);
4367
4368 /* Make sure we are not affected by full cache from previous tests */
4369 f_pcuvty_flush_neigh_caches();
4370
4371 /* Establish BSSGP connection to the PCU */
4372 f_bssgp_establish();
4373 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4374
4375 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004376 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 +01004377 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4378 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4379
4380 /* Start NACC from MS side */
4381 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4382 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4383
4384 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004385 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004386 /* Make sure it is a Pkt Cell Chg Continue */
4387 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4388 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4389 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004390 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4391 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4392 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4393 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4394 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004395
4396 f_shutdown(__BFILE__, __LINE__, final := true);
4397}
4398
4399/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004400testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
4401 var RlcmacDlBlock dl_block;
4402 var PollFnCtx pollctx;
4403 var uint32_t sched_fn;
4404 var GprsMS ms;
4405 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4406 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004407 var GsmArfcn req_arfcn := 862;
4408 var uint6_t req_bsic := 43;
4409
4410 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4411 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4412
4413 /* Initialize NS/BSSGP side */
4414 f_init_bssgp();
4415 /* Initialize GPRS MS side */
4416 f_init_gprs_ms();
4417 ms := g_ms[0]; /* We only use first MS in this test */
4418
4419 /* Initialize the PCU interface abstraction */
4420 f_init_raw(testcasename(), info_ind);
4421
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004422 /* Make sure we are not affected by full cache from previous tests */
4423 f_pcuvty_flush_neigh_caches();
4424
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004425 /* Establish BSSGP connection to the PCU */
4426 f_bssgp_establish();
4427 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4428
4429 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004430 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 +01004431 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4432 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4433
4434 /* Start NACC from MS side */
4435 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4436 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4437
4438 /* osmo-pcu should now ask for resolution: */
4439 f_ipa_ctrl_wait_link_up();
4440 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4441 int2str(info_ind.lac) & "." &
4442 int2str(info_ind.cell_id) & "." &
4443 int2str(req_arfcn) & "." &
4444 int2str(req_bsic);
4445 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
4446 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4447
4448 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004449 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004450 /* Make sure it is a Pkt Cell Chg Continue */
4451 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4452 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4453 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004454 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4455 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4456 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4457 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4458 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004459
4460 f_shutdown(__BFILE__, __LINE__, final := true);
4461}
4462
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004463/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
4464testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
4465 var RlcmacDlBlock dl_block;
4466 var PollFnCtx pollctx;
4467 var uint32_t sched_fn;
4468 var GprsMS ms;
4469 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4470 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004471 var GsmArfcn req_arfcn := 862;
4472 var uint6_t req_bsic := 43;
4473
4474 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4475 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4476
4477 /* Initialize NS/BSSGP side */
4478 f_init_bssgp();
4479 /* Initialize GPRS MS side */
4480 f_init_gprs_ms();
4481 ms := g_ms[0]; /* We only use first MS in this test */
4482
4483 /* Initialize the PCU interface abstraction */
4484 f_init_raw(testcasename(), info_ind);
4485
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004486 /* Make sure we are not affected by full cache from previous tests */
4487 f_pcuvty_flush_neigh_caches();
4488
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004489 /* Establish BSSGP connection to the PCU */
4490 f_bssgp_establish();
4491 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4492
4493 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004494 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 +01004495 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4496 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4497
4498 /* Start NACC from MS side */
4499 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4500 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4501
4502 /* osmo-pcu should now ask for resolution: */
4503 f_ipa_ctrl_wait_link_up();
4504 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4505 int2str(info_ind.lac) & "." &
4506 int2str(info_ind.cell_id) & "." &
4507 int2str(req_arfcn) & "." &
4508 int2str(req_bsic);
4509 /* we receive RAC+CI resolution request and we send incorrectlt formated response */
4510 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
4511
4512 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004513 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004514 /* Make sure it is a Pkt Cell Chg Continue */
4515 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4516 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4517 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004518 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4519 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4520 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4521 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4522 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004523
4524 f_shutdown(__BFILE__, __LINE__, final := true);
4525}
4526
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004527/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
4528testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
4529 var RlcmacDlBlock dl_block;
4530 var PollFnCtx pollctx;
4531 var uint32_t sched_fn;
4532 var GprsMS ms;
4533 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4534 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004535 var GsmArfcn req_arfcn := 862;
4536 var uint6_t req_bsic := 43;
4537 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 */
4538 info_ind.lac),
4539 info_ind.rac),
4540 info_ind.cell_id));
4541 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4542 423),
4543 2),
4544 5));
4545 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
4546 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
4547
4548 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4549 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4550
4551 /* Initialize NS/BSSGP side */
4552 f_init_bssgp();
4553 /* Initialize GPRS MS side */
4554 f_init_gprs_ms();
4555 ms := g_ms[0]; /* We only use first MS in this test */
4556
4557 /* Initialize the PCU interface abstraction */
4558 f_init_raw(testcasename(), info_ind);
4559
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004560 /* Make sure we are not affected by full cache from previous tests */
4561 f_pcuvty_flush_neigh_caches();
4562
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004563 /* Establish BSSGP connection to the PCU */
4564 f_bssgp_establish();
4565 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4566
4567 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004568 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 +01004569 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4570 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4571
4572 /* Start NACC from MS side */
4573 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4574 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4575
4576 /* osmo-pcu should now ask for resolution: */
4577 f_ipa_ctrl_wait_link_up();
4578 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4579 int2str(info_ind.lac) & "." &
4580 int2str(info_ind.cell_id) & "." &
4581 int2str(req_arfcn) & "." &
4582 int2str(req_bsic);
4583 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4584
4585 /* RIM procedure: */
4586 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4587 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4588 tr_RAN_Information_Request_RIM_Container));
4589 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
4590
4591 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004592 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004593 /* Make sure it is a Pkt Cell Chg Continue */
4594 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4595 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4596 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004597 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4598 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4599 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4600 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4601 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01004602
4603 f_shutdown(__BFILE__, __LINE__, final := true);
4604}
4605
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004606/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
4607testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
4608 var PollFnCtx pollctx;
4609 var GprsMS ms;
4610 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4611 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4612 var RlcmacDlBlock dl_block;
4613 var uint32_t sched_fn;
4614 var CtrlMessage rx_ctrl;
4615 var GsmArfcn req_arfcn := 862;
4616 var uint6_t req_bsic := 43;
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
4630 /* Make sure we are not affected by full cache from previous tests */
4631 f_pcuvty_flush_neigh_caches();
4632
4633 /* 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 */
4638 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4639 /* 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 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
4654 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
4655 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4656 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4657 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
4658 timer T := 2.0;
4659 T.start;
4660 alt {
4661 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
4662 [] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
4663 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
4664 f_shutdown(__BFILE__, __LINE__);
4665 }
4666 [] T.timeout {
4667 setverdict(pass);
4668 }
4669 }
4670
4671 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004672 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004673
4674 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4675 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4676 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4677 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4678 f_shutdown(__BFILE__, __LINE__);
4679 }
4680 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4681 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4682 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4683 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4684 }
4685
4686 f_shutdown(__BFILE__, __LINE__, final := true);
4687}
4688
4689/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
4690testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
4691 var PollFnCtx pollctx;
4692 var GprsMS ms;
4693 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4694 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4695 var RlcmacDlBlock dl_block;
4696 var uint32_t sched_fn;
4697 var CtrlMessage rx_ctrl;
4698 var GsmArfcn req_arfcn := 862;
4699 var uint6_t req_bsic := 43;
4700
4701 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4702 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4703
4704 /* Initialize NS/BSSGP side */
4705 f_init_bssgp();
4706 /* Initialize GPRS MS side */
4707 f_init_gprs_ms();
4708 ms := g_ms[0]; /* We only use first MS in this test */
4709
4710 /* Initialize the PCU interface abstraction */
4711 f_init_raw(testcasename(), info_ind);
4712
4713 /* Make sure we are not affected by full cache from previous tests */
4714 f_pcuvty_flush_neigh_caches();
4715
4716 /* Establish BSSGP connection to the PCU */
4717 f_bssgp_establish();
4718 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4719
4720 /* Send PACKET RESOURCE REQUEST */
4721 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4722 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4723 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4724
4725 /* Start NACC from MS side */
4726 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4727 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4728
4729 /* osmo-pcu should now ask for resolution: */
4730 f_ipa_ctrl_wait_link_up();
4731 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4732 int2str(info_ind.lac) & "." &
4733 int2str(info_ind.cell_id) & "." &
4734 int2str(req_arfcn) & "." &
4735 int2str(req_bsic);
4736 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4737 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
4738 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
4739 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4740 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
4741 f_outbound_nacc_rim_tx_resp(info_ind);
4742 timer T := 1.0;
4743 T.start;
4744 alt {
4745 [] RIM.receive {
4746 setverdict(fail, "Received unexpected RIM message");
4747 f_shutdown(__BFILE__, __LINE__);
4748 }
4749 [] T.timeout {
4750 setverdict(pass);
4751 }
4752 }
4753
4754 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004755 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004756
4757 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4758 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4759 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4760 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4761 f_shutdown(__BFILE__, __LINE__);
4762 }
4763 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4764 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4765 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4766 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4767 }
4768
4769 f_shutdown(__BFILE__, __LINE__, final := true);
4770}
4771
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01004772/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
4773testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
4774 var PollFnCtx pollctx;
4775 var GprsMS ms;
4776 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4777 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4778 var RlcmacDlBlock dl_block;
4779 var uint32_t sched_fn;
4780 var CtrlMessage rx_ctrl;
4781 var GsmArfcn req_arfcn := 862;
4782 var uint6_t req_bsic := 43;
4783
4784 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4785 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4786
4787 /* Initialize NS/BSSGP side */
4788 f_init_bssgp();
4789 /* Initialize GPRS MS side */
4790 f_init_gprs_ms();
4791 ms := g_ms[0]; /* We only use first MS in this test */
4792
4793 /* Initialize the PCU interface abstraction */
4794 f_init_raw(testcasename(), info_ind);
4795
4796 /* Make sure we are not affected by full cache from previous tests */
4797 f_pcuvty_flush_neigh_caches();
4798
4799 /* Establish BSSGP connection to the PCU */
4800 f_bssgp_establish();
4801 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4802
4803 /* Send PACKET RESOURCE REQUEST */
4804 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4805 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4806 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4807
4808 /* Start NACC from MS side */
4809 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4810 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4811
4812 /* osmo-pcu should now ask for resolution: */
4813 f_ipa_ctrl_wait_link_up();
4814 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4815 int2str(info_ind.lac) & "." &
4816 int2str(info_ind.cell_id) & "." &
4817 int2str(req_arfcn) & "." &
4818 int2str(req_bsic);
4819 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4820 /* RIM procedure: */
4821 as_outbound_nacc_rim_resolve(info_ind);
4822
4823 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
4824 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
4825 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4826
4827 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
4828 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
4829
4830 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4831 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4832 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4833 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4834 f_shutdown(__BFILE__, __LINE__);
4835 }
4836 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4837 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4838 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4839 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4840 }
4841}
4842
4843/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
4844testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
4845 var PollFnCtx pollctx;
4846 var GprsMS ms;
4847 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4848 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4849 var RlcmacDlBlock dl_block;
4850 var uint32_t sched_fn;
4851 var CtrlMessage rx_ctrl;
4852 var GsmArfcn req_arfcn := 862;
4853 var uint6_t req_bsic := 43;
4854
4855 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4856 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4857
4858 /* Initialize NS/BSSGP side */
4859 f_init_bssgp();
4860 /* Initialize GPRS MS side */
4861 f_init_gprs_ms();
4862 ms := g_ms[0]; /* We only use first MS in this test */
4863
4864 /* Initialize the PCU interface abstraction */
4865 f_init_raw(testcasename(), info_ind);
4866
4867 /* Make sure we are not affected by full cache from previous tests */
4868 f_pcuvty_flush_neigh_caches();
4869
4870 /* Establish BSSGP connection to the PCU */
4871 f_bssgp_establish();
4872 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4873
4874 /* Send PACKET RESOURCE REQUEST */
4875 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
4876 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4877 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4878
4879 /* Start NACC from MS side */
4880 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4881 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4882
4883 /* osmo-pcu should now ask for resolution: */
4884 f_ipa_ctrl_wait_link_up();
4885 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4886 int2str(info_ind.lac) & "." &
4887 int2str(info_ind.cell_id) & "." &
4888 int2str(req_arfcn) & "." &
4889 int2str(req_bsic);
4890 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4891 /* RIM procedure: */
4892 as_outbound_nacc_rim_resolve(info_ind);
4893
4894 /* Announce SI back to MS, continue NACC procedure */
4895 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
4896
4897 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
4898 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
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 waiting for Pkt Cell Change Continue CTRL ACK */
4914testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() 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 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4968 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4969 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4970 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4971 f_shutdown(__BFILE__, __LINE__);
4972 }
4973 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
4974 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
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
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01004983/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
4984 * while waiting for CTRL resolution */
4985testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
4986 var PollFnCtx pollctx;
4987 var GprsMS ms;
4988 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4989 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4990 var RlcmacDlBlock dl_block;
4991 var uint32_t sched_fn;
4992 var CtrlMessage rx_ctrl;
4993 var GsmArfcn req_arfcn := 862;
4994 var uint6_t req_bsic := 43;
4995
4996 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4997 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4998
4999 /* Initialize NS/BSSGP side */
5000 f_init_bssgp();
5001 /* Initialize GPRS MS side */
5002 f_init_gprs_ms();
5003 ms := g_ms[0]; /* We only use first MS in this test */
5004
5005 /* Initialize the PCU interface abstraction */
5006 f_init_raw(testcasename(), info_ind);
5007
5008 /* Make sure we are not affected by full cache from previous tests */
5009 f_pcuvty_flush_neigh_caches();
5010
5011 /* Establish BSSGP connection to the PCU */
5012 f_bssgp_establish();
5013 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5014
5015 /* Send PACKET RESOURCE REQUEST */
5016 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5017 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5018 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5019
5020 /* Start NACC from MS side */
5021 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5022 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5023
5024 /* osmo-pcu should now ask for resolution: */
5025 f_ipa_ctrl_wait_link_up();
5026 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5027 int2str(info_ind.lac) & "." &
5028 int2str(info_ind.cell_id) & "." &
5029 int2str(req_arfcn) & "." &
5030 int2str(req_bsic);
5031 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5032 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5033 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5034 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5035 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5036 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5037 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
5038 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5039 int2str(info_ind.lac) & "." &
5040 int2str(info_ind.cell_id) & "." &
5041 int2str(req_arfcn + 1) & "." &
5042 int2str(req_bsic + 1);
5043 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5044
5045 /* And finally everything continues as usual with RIN procedure */
5046 as_outbound_nacc_rim_resolve(info_ind);
5047
5048 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005049 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005050
5051 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5052 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5053 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5054 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5055 f_shutdown(__BFILE__, __LINE__);
5056 }
5057 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5058 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5059 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5060 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5061 }
5062
5063 f_shutdown(__BFILE__, __LINE__, final := true);
5064}
5065
5066/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5067 * while waiting for SI resolution */
5068testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5069 var PollFnCtx pollctx;
5070 var GprsMS ms;
5071 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5072 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5073 var RlcmacDlBlock dl_block;
5074 var uint32_t sched_fn;
5075 var CtrlMessage rx_ctrl;
5076 var GsmArfcn req_arfcn := 862;
5077 var uint6_t req_bsic := 43;
5078
5079 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5080 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5081
5082 /* Initialize NS/BSSGP side */
5083 f_init_bssgp();
5084 /* Initialize GPRS MS side */
5085 f_init_gprs_ms();
5086 ms := g_ms[0]; /* We only use first MS in this test */
5087
5088 /* Initialize the PCU interface abstraction */
5089 f_init_raw(testcasename(), info_ind);
5090
5091 /* Make sure we are not affected by full cache from previous tests */
5092 f_pcuvty_flush_neigh_caches();
5093
5094 /* Establish BSSGP connection to the PCU */
5095 f_bssgp_establish();
5096 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5097
5098 /* Send PACKET RESOURCE REQUEST */
5099 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5100 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5101 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5102
5103 /* Start NACC from MS side */
5104 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5105 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5106
5107 /* osmo-pcu should now ask for resolution: */
5108 f_ipa_ctrl_wait_link_up();
5109 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5110 int2str(info_ind.lac) & "." &
5111 int2str(info_ind.cell_id) & "." &
5112 int2str(req_arfcn) & "." &
5113 int2str(req_bsic);
5114 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5115 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5116 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5117 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5118 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5119 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5120 f_outbound_nacc_rim_tx_resp(info_ind);
5121
5122 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
5123 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5124 int2str(info_ind.lac) & "." &
5125 int2str(info_ind.cell_id) & "." &
5126 int2str(req_arfcn + 1) & "." &
5127 int2str(req_bsic + 1);
5128 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5129
5130 /* And finally everything continues as usual with RIN procedure */
5131 as_outbound_nacc_rim_resolve(info_ind);
5132
5133 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005134 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005135
5136 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5137 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5138 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5139 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5140 f_shutdown(__BFILE__, __LINE__);
5141 }
5142 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5143 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5144 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5145 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5146 }
5147
5148 f_shutdown(__BFILE__, __LINE__, final := true);
5149}
5150
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005151/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5152 * while sending Pkt Neigh Data Change */
5153testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5154 var PollFnCtx pollctx;
5155 var GprsMS ms;
5156 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5157 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5158 var RlcmacDlBlock dl_block;
5159 var uint32_t sched_fn;
5160 var CtrlMessage rx_ctrl;
5161 var GsmArfcn req_arfcn := 862;
5162 var uint6_t req_bsic := 43;
5163
5164 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5165 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5166
5167 /* Initialize NS/BSSGP side */
5168 f_init_bssgp();
5169 /* Initialize GPRS MS side */
5170 f_init_gprs_ms();
5171 ms := g_ms[0]; /* We only use first MS in this test */
5172
5173 /* Initialize the PCU interface abstraction */
5174 f_init_raw(testcasename(), info_ind);
5175
5176 /* Make sure we are not affected by full cache from previous tests */
5177 f_pcuvty_flush_neigh_caches();
5178
5179 /* Establish BSSGP connection to the PCU */
5180 f_bssgp_establish();
5181 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5182
5183 /* Send PACKET RESOURCE REQUEST */
5184 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5185 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5186 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5187
5188 /* Start NACC from MS side */
5189 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5190 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5191
5192 /* osmo-pcu should now ask for resolution: */
5193 f_ipa_ctrl_wait_link_up();
5194 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5195 int2str(info_ind.lac) & "." &
5196 int2str(info_ind.cell_id) & "." &
5197 int2str(req_arfcn) & "." &
5198 int2str(req_bsic);
5199 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5200 /* RIM procedure: */
5201 as_outbound_nacc_rim_resolve(info_ind);
5202
5203 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5204 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5205 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5206 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5207
5208 /* It should trigger RAC_CI resolution to start again: */
5209 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5210 int2str(info_ind.lac) & "." &
5211 int2str(info_ind.cell_id) & "." &
5212 int2str(req_arfcn + 1) & "." &
5213 int2str(req_bsic + 1);
5214 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5215 /* RIM procedure: */
5216 as_outbound_nacc_rim_resolve(info_ind);
5217 /* Transmit SI back to MS */
5218 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5219
5220 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5221 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5222 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5223 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5224 f_shutdown(__BFILE__, __LINE__);
5225 }
5226 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5227 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5228 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5229 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5230 }
5231}
5232
5233/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5234testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5235 var PollFnCtx pollctx;
5236 var GprsMS ms;
5237 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5238 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5239 var RlcmacDlBlock dl_block;
5240 var uint32_t sched_fn;
5241 var CtrlMessage rx_ctrl;
5242 var GsmArfcn req_arfcn := 862;
5243 var uint6_t req_bsic := 43;
5244
5245 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5246 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5247
5248 /* Initialize NS/BSSGP side */
5249 f_init_bssgp();
5250 /* Initialize GPRS MS side */
5251 f_init_gprs_ms();
5252 ms := g_ms[0]; /* We only use first MS in this test */
5253
5254 /* Initialize the PCU interface abstraction */
5255 f_init_raw(testcasename(), info_ind);
5256
5257 /* Make sure we are not affected by full cache from previous tests */
5258 f_pcuvty_flush_neigh_caches();
5259
5260 /* Establish BSSGP connection to the PCU */
5261 f_bssgp_establish();
5262 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5263
5264 /* Send PACKET RESOURCE REQUEST */
5265 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5266 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5267 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5268
5269 /* Start NACC from MS side */
5270 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5271 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5272
5273 /* osmo-pcu should now ask for resolution: */
5274 f_ipa_ctrl_wait_link_up();
5275 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5276 int2str(info_ind.lac) & "." &
5277 int2str(info_ind.cell_id) & "." &
5278 int2str(req_arfcn) & "." &
5279 int2str(req_bsic);
5280 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5281 /* RIM procedure: */
5282 as_outbound_nacc_rim_resolve(info_ind);
5283
5284 /* Announce SI back to MS, continue NACC procedure */
5285 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5286
5287 /* trigger a Pkt Cell Change Notif with different tgt cell */
5288 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5289 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5290
5291 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5292 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5293
5294 /* It should trigger RAC_CI resolution to start again: */
5295 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5296 int2str(info_ind.lac) & "." &
5297 int2str(info_ind.cell_id) & "." &
5298 int2str(req_arfcn + 1) & "." &
5299 int2str(req_bsic + 1);
5300 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5301 /* RIM procedure: */
5302 as_outbound_nacc_rim_resolve(info_ind);
5303 /* Transmit SI back to MS */
5304 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5305
5306 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5307 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5308 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5309 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5310 f_shutdown(__BFILE__, __LINE__);
5311 }
5312 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5313 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5314 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5315 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5316 }
5317}
5318
5319/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5320testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5321 var PollFnCtx pollctx;
5322 var GprsMS ms;
5323 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5324 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5325 var RlcmacDlBlock dl_block;
5326 var uint32_t sched_fn;
5327 var CtrlMessage rx_ctrl;
5328 var GsmArfcn req_arfcn := 862;
5329 var uint6_t req_bsic := 43;
5330
5331 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5332 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5333
5334 /* Initialize NS/BSSGP side */
5335 f_init_bssgp();
5336 /* Initialize GPRS MS side */
5337 f_init_gprs_ms();
5338 ms := g_ms[0]; /* We only use first MS in this test */
5339
5340 /* Initialize the PCU interface abstraction */
5341 f_init_raw(testcasename(), info_ind);
5342
5343 /* Make sure we are not affected by full cache from previous tests */
5344 f_pcuvty_flush_neigh_caches();
5345
5346 /* Establish BSSGP connection to the PCU */
5347 f_bssgp_establish();
5348 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5349
5350 /* Send PACKET RESOURCE REQUEST */
5351 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5352 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5353 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5354
5355 /* Start NACC from MS side */
5356 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5357 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5358
5359 /* osmo-pcu should now ask for resolution: */
5360 f_ipa_ctrl_wait_link_up();
5361 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5362 int2str(info_ind.lac) & "." &
5363 int2str(info_ind.cell_id) & "." &
5364 int2str(req_arfcn) & "." &
5365 int2str(req_bsic);
5366 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5367 /* RIM procedure: */
5368 as_outbound_nacc_rim_resolve(info_ind);
5369
5370 /* Announce SI back to MS, continue NACC procedure */
5371 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5372
5373 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5374 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5375 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5376 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5377 f_shutdown(__BFILE__, __LINE__);
5378 }
5379
5380 /* trigger a Pkt Cell Change Notif with different tgt cell */
5381 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5382 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5383
5384 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5385 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5386 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5387 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5388 }
5389 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5390 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
5391
5392 /* It should trigger RAC_CI resolution to start again: */
5393 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5394 int2str(info_ind.lac) & "." &
5395 int2str(info_ind.cell_id) & "." &
5396 int2str(req_arfcn + 1) & "." &
5397 int2str(req_bsic + 1);
5398 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5399 /* RIM procedure: */
5400 as_outbound_nacc_rim_resolve(info_ind);
5401 /* Transmit SI back to MS */
5402 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5403
5404 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5405 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5406 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5407 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5408 f_shutdown(__BFILE__, __LINE__);
5409 }
5410 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5411 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5412 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5413 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5414 }
5415}
5416
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005417/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
5418testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
5419 var PollFnCtx pollctx;
5420 var GprsMS ms;
5421 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5422 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5423 var RlcmacDlBlock dl_block;
5424 var uint32_t sched_fn, dl_fn;
5425 var CtrlMessage rx_ctrl;
5426 var GsmArfcn req_arfcn := 862;
5427 var uint6_t req_bsic := 43;
5428 var octetstring data := f_rnd_octstring(10);
5429
5430 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5431 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5432
5433 /* Initialize NS/BSSGP side */
5434 f_init_bssgp();
5435 /* Initialize GPRS MS side */
5436 f_init_gprs_ms();
5437 ms := g_ms[0]; /* We only use first MS in this test */
5438
5439 /* Initialize the PCU interface abstraction */
5440 f_init_raw(testcasename(), info_ind);
5441
5442 /* Make sure we are not affected by full cache from previous tests */
5443 f_pcuvty_flush_neigh_caches();
5444
5445 /* Establish BSSGP connection to the PCU */
5446 f_bssgp_establish();
5447 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5448
5449 /* Send PACKET RESOURCE REQUEST */
5450 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5451 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5452 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5453
5454 /* Start NACC from MS side */
5455 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5456 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5457
5458 /* osmo-pcu should now ask for resolution: */
5459 f_ipa_ctrl_wait_link_up();
5460 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5461 int2str(info_ind.lac) & "." &
5462 int2str(info_ind.cell_id) & "." &
5463 int2str(req_arfcn) & "." &
5464 int2str(req_bsic);
5465 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
5466 /* RIM procedure: */
5467 as_outbound_nacc_rim_resolve(info_ind);
5468
5469 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
5470 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
5471 f_sleep(0.1);
5472 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
5473 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
5474
5475 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
5476 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5477 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
5478 * Data with unassigned DL TBF in line above): */
5479 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5480 /* Continue receiving Pkt Cell Neighbor Data */
5481 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5482
5483 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5484 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5485 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5486 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5487 f_shutdown(__BFILE__, __LINE__);
5488 }
5489 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5490 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5491 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5492 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5493 }
5494
5495 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
5496 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
5497 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
5498 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
5499 f_dl_block_ack_fn(dl_block, dl_fn));
5500}
5501
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005502/* Send a RIM RAN info request to the PCU and verify the response, we expect
5503 * getting the system information back which we have transfered to the PCU via
5504 * PCUIF on startup. */
5505testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
5506 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005507 timer T := 2.0;
5508
5509 /* Initialize NS/BSSGP side */
5510 f_init_bssgp();
5511
5512 /* Initialize the PCU interface abstraction */
5513 f_init_raw(testcasename());
5514
5515 /* Establish BSSGP connection to the PCU */
5516 f_bssgp_establish();
5517
5518 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005519 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 +01005520 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005521 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 +01005522 BTS.send(si3_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005523 var template PCUIF_Message si16_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, '0106'O & si13_default, 0, 0, 0, 0, 32767);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005524 BTS.send(si16_data_ind);
5525 f_sleep(1.0);
5526
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005527 var RIM_Routing_Address dst_addr;
5528 var RIM_Routing_Address src_addr;
5529 var template (value) RAN_Information_Request_RIM_Container req_cont;
5530 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005531 var template PDU_BSSGP bssgp_rim_pdu_expect;
5532 var template RAN_Information_RIM_Container rim_cont_expect;
5533
5534 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 +01005535 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5536 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005537
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005538 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5539 ts_RIM_Sequence_Number(1),
5540 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5541 ts_RIM_Protocol_Version_Number(1),
5542 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5543 omit);
5544 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5545 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5546 req_cont);
5547
5548 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5549 tr_RIM_Sequence_Number(1),
5550 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5551 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005552 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 +01005553 omit);
5554
5555 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5556 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5557 rim_cont_expect);
5558 RIM.send(bssgp_rim_pdu);
5559 T.start;
5560 alt {
5561 [] RIM.receive(bssgp_rim_pdu_expect) { }
5562 [] RIM.receive {
5563 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5564 }
5565 [] T.timeout {
5566 setverdict(fail, "No BSSGP RIM PDU received");
5567 mtc.stop;
5568 }
5569 }
5570
5571 f_shutdown(__BFILE__, __LINE__, final := true);
5572}
5573
5574/* Same as above, but in this case we simulate the rare case in which the PCU
5575 * has no system information available. We expect getting a response back but
5576 * with no system information inside. */
5577testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005578 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005579 var PCUIF_Message pcu_msg;
5580 timer T := 2.0;
5581
5582 /* Initialize NS/BSSGP side */
5583 f_init_bssgp();
5584
5585 /* Initialize the PCU interface abstraction */
5586 f_init_raw(testcasename(), info_ind);
5587
5588 /* Establish BSSGP connection to the PCU */
5589 f_bssgp_establish();
5590
5591 /* Clear sysinfo from the PCU */
5592 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);
5593 BTS.send(si1_data_ind);
5594 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);
5595 BTS.send(si3_data_ind);
5596 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);
5597 BTS.send(si16_data_ind);
5598 f_sleep(1.0);
5599
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01005600 var RIM_Routing_Address dst_addr;
5601 var RIM_Routing_Address src_addr;
5602 var template (value) RAN_Information_Request_RIM_Container req_cont;
5603 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005604 var template PDU_BSSGP bssgp_rim_pdu_expect;
5605 var template RAN_Information_RIM_Container rim_cont_expect;
5606
5607 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 +01005608 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
5609 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005610
5611 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5612 ts_RIM_Sequence_Number(1),
5613 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5614 ts_RIM_Protocol_Version_Number(1),
5615 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5616 omit);
5617 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5618 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5619 req_cont);
5620
5621
5622 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
5623 tr_RIM_Sequence_Number(1),
5624 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5625 tr_RIM_Protocol_Version_Number(1),
5626 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
5627 omit);
5628
5629 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5630 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5631 rim_cont_expect);
5632 RIM.send(bssgp_rim_pdu);
5633 T.start;
5634 alt {
5635 [] RIM.receive(bssgp_rim_pdu_expect) { }
5636 [] RIM.receive {
5637 setverdict(fail, "Unexpected BSSGP RIM PDU received");
5638 }
5639 [] T.timeout {
5640 setverdict(fail, "No BSSGP RIM PDU received");
5641 mtc.stop;
5642 }
5643 }
5644
5645 f_shutdown(__BFILE__, __LINE__, final := true);
5646}
5647
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005648control {
5649 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01005650 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005651 execute( TC_ta_ptcch_idle() );
5652 execute( TC_ta_rach_imm_ass() );
5653 execute( TC_ta_idle_dl_tbf_ass() );
5654 execute( TC_ta_ptcch_ul_multi_tbf() );
5655 execute( TC_cs_lqual_ul_tbf() );
5656 execute( TC_cs_initial_ul() );
5657 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01005658 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01005659 execute( TC_cs_max_dl() );
5660 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01005661 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01005662 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01005663 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01005664 execute( TC_mcs_max_dl() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005665 execute( TC_t3169() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01005666 execute( TC_n3101_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01005667 execute( TC_x2031_t3191() );
5668 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005669 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01005670 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02005671 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02005672 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02005673 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005674 execute( TC_mo_ping_pong() );
5675 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02005676 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005677 execute( TC_mt_ping_pong() );
5678 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005679 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005680 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07005681 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02005682 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01005683 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005684 execute( TC_paging_cs_from_bts() );
5685 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
5686 execute( TC_paging_cs_from_sgsn_sign() );
5687 execute( TC_paging_cs_from_sgsn_ptp() );
5688 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
5689 execute( TC_paging_ps_from_sgsn_sign() );
5690 execute( TC_paging_ps_from_sgsn_ptp() );
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07005691 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
5692 execute( TC_paging_cs_multi_ms_imsi() );
5693 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02005694 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
5695 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01005696 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
5697 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005698
5699 /* EGPRS specific test cases */
5700 execute( TC_egprs_pkt_chan_req_signalling() );
5701 execute( TC_egprs_pkt_chan_req_one_phase() );
5702 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07005703 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07005704 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07005705 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02005706
5707 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07005708
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01005709 /* Immediate Assignment on AGCH/PCH */
5710 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
5711 execute( TC_pcuif_fh_imm_ass_ul() );
5712 execute( TC_pcuif_fh_imm_ass_dl() );
5713 /* Packet Uplink/Downlink Assignment on PACCH */
5714 execute( TC_pcuif_fh_pkt_ass_ul() );
5715 execute( TC_pcuif_fh_pkt_ass_dl() );
5716 execute( TC_multitrx_multims_alloc() );
5717 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
5718 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
5719 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
5720
Pau Espin Pedrole1303052020-11-16 11:13:51 +01005721 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07005722
5723 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01005724 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01005725 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005726 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01005727 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005728 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005729 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005730 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005731 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005732 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
5733 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005734 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
5735 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
5736 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005737 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
5738 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005739 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
5740 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
5741 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005742 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005743
5744 execute( TC_rim_ran_info_req_single_rep() );
5745 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02005746}
5747
Harald Weltea419df22019-03-21 17:23:04 +01005748}