blob: 2daf89bd983c3d69efd481585017ba38640ce016 [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
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +020072 charstring mp_ctrl_neigh_ip := ""; /* Use new PCUIF over IPA multiplex for Neigh Addr Resolution */
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010073 integer mp_ctrl_neigh_port := 4248;
Oliver Smith61b4e732021-07-22 08:14:29 +020074
75 boolean mp_osmo_pcu_newer_than_0_9_0 := true; /* Drop after OsmoPCU > 0.9.0 was released */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020076}
77
78
79/* 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 +010080friend template (value) PCUIF_info_ind ts_PCUIF_INFO_default(template (value) PCUIF_Flags flags := c_PCUIF_Flags_default)
81:= {
Vadim Yanitskiyc1559302020-07-19 16:39:12 +070082 version := PCUIF_Types.mp_pcuif_version,
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +010083 flags := flags,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +010084 trx := ts_PCUIF_InfoTrxs_def(GPRS_Components.mp_base_arfcn),
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020085 bsic := 7,
86 mcc := 262,
87 mnc := 42,
88 mnc_3_digits := 0,
89 lac := 13135,
90 rac := 0,
91 nsei := mp_nsconfig.nsei,
92 nse_timer := { 3, 3, 3, 3, 30, 3, 10 },
93 cell_timer := { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 },
94 cell_id := 20960,
95 repeat_time := 5 * 50,
96 repeat_count := 3,
Harald Welte5339b2e2020-10-04 22:52:56 +020097 bvci := mp_gb_cfg.bvc[0].bvci,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020098 t3142 := 20,
99 t3169 := 5,
100 t3191 := 5,
101 t3193_10ms := 160,
102 t3195 := 5,
Pau Espin Pedrol76de1662021-03-01 17:40:58 +0100103 n3101 := 10,
104 n3103 := 4,
105 n3105 := 8,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200106 cv_countdown := 15,
107 dl_tbf_ext := 250 * 10, /* ms */
108 ul_tbf_ext := 250 * 10, /* ms */
109 initial_cs := 2,
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +0100110 initial_mcs := 1,
Harald Welte90f19742020-11-06 19:34:40 +0100111 nsvci := { mp_nsconfig.nsvc[0].nsvci, 0 },
112 local_port := { mp_nsconfig.nsvc[0].provider.ip.remote_udp_port, 0 },
113 remote_port := { mp_nsconfig.nsvc[0].provider.ip.local_udp_port, 0 },
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100114 remote_addr := f_PCUIF_RemoteAddr(
Harald Welte90f19742020-11-06 19:34:40 +0100115 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 +0200116}
117
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100118/* Passed in RAN-INFO message from emulated neighbor using RIM */
119const octetstring si1_default := '198fb100000000000000000000000000007900002b'O;
120const octetstring si3_default := '1b753000f110236ec9033c2747407900003c0b2b2b'O;
121const octetstring si13_default := '009000185a6fc9e08410ab2b2b2b2b2b2b2b2b2b2b'O;
122const octetstring si_default := si1_default & si3_default & si13_default;
123
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +0100124const MultislotCap_GPRS mscap_gprs_def := {
125 gprsmultislotclass := '00011'B,
126 gprsextendeddynalloccap := '0'B
127};
128const MultislotCap_EGPRS mscap_egprs_def := {
129 egprsmultislotclass := '00011'B,
130 egprsextendeddynalloccap := '0'B
131};
132template (value) MSRadioAccessCapabilityV ms_racap_gprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, omit) };
133template (value) MSRadioAccessCapabilityV ms_racap_egprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, mscap_egprs_def) };
134
135const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs_def := {
136 gprsmultislotclass := '00011'B,
137 gprsextendeddynalloccap := '0'B
138};
139const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs_def := {
140 egprsmultislotclass := '00011'B,
141 egprsextendeddynalloccap := '0'B
142};
143template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, omit)) };
144template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, bssgp_mscap_egprs_def)) };
145
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200146type record lqual_range {
147 /* component reference to the IPA_Client component used for RSL */
148 uint8_t low,
149 uint8_t high
150}
151
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +0100152type component RAW_PCU_Test_CT extends bssgp_CT, MS_BTS_IFACE_CT, StatsD_ConnHdlr, CTRL_Adapter_CT {
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700153 /* PCU interface abstraction component */
154 var RAW_PCUIF_CT vc_PCUIF;
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700155
Daniel Willmann535aea62020-09-21 13:27:08 +0200156 /* StatsD */
157 var StatsD_Checker_CT vc_STATSD;
158
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200159 /* Connection to the PCUIF component */
160 port RAW_PCU_MSG_PT PCUIF;
161 /* VTY connection to the PCU */
162 port TELNETasp_PT PCUVTY;
163
164 /* Uplink CS/MCS thresholds, default from pcu_main.c: */
165 var lqual_range g_cs_lqual_ranges[4] := {{low := 0, high := 6},
166 {low := 5, high := 8},
167 {low := 7, high := 13},
168 {low := 12,high := 35}};
169 var lqual_range g_mcs_lqual_ranges[9] := {{low := 0, high := 6},
170 {low := 5, high := 8},
171 {low := 7, high := 13},
172 {low := 12,high := 15},
173 {low := 14, high := 17},
174 {low := 16, high := 18},
175 {low := 17,high := 20},
176 {low := 19, high := 24},
177 {low := 23,high := 35}};
178 var uint8_t g_cs_initial_dl := 1;
179 var uint8_t g_cs_initial_ul := 1;
180 var uint8_t g_mcs_initial_dl := 1;
181 var uint8_t g_mcs_initial_ul := 1;
182 var uint8_t g_cs_max_dl := 4;
183 var uint8_t g_cs_max_ul := 4;
184 var uint8_t g_mcs_max_dl := 9;
185 var uint8_t g_mcs_max_ul := 9;
186
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200187 var boolean g_force_two_phase_access := false;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200188
189 /* Guard timeout */
190 timer g_T_guard := 60.0;
191};
192
193private altstep as_Tguard_RAW() runs on RAW_PCU_Test_CT {
194 [] g_T_guard.timeout {
195 setverdict(fail, "Timeout of T_guard");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700196 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200197 }
198}
199
200private function f_pcuvty_set_allowed_cs_mcs() runs on RAW_PCU_Test_CT {
201 f_vty_config2(PCUVTY, {"pcu"}, "cs " & int2str(g_cs_initial_dl) & " " & int2str(g_cs_initial_ul));
202 f_vty_config2(PCUVTY, {"pcu"}, "cs max " & int2str(g_cs_max_dl) & " " & int2str(g_cs_max_ul));
203
204 f_vty_config2(PCUVTY, {"pcu"}, "mcs " & int2str(g_mcs_initial_dl) & " " & int2str(g_mcs_initial_ul));
205 f_vty_config2(PCUVTY, {"pcu"}, "mcs max " & int2str(g_mcs_max_dl) & " " & int2str(g_mcs_max_ul));
206}
207
208private function f_pcuvty_set_link_quality_ranges() runs on RAW_PCU_Test_CT {
209 var charstring cmd;
210
211 cmd := "cs link-quality-ranges" &
212 " cs1 " & int2str(g_cs_lqual_ranges[0].high) &
213 " cs2 " & int2str(g_cs_lqual_ranges[1].low) & " " & int2str(g_cs_lqual_ranges[1].high) &
214 " cs3 " & int2str(g_cs_lqual_ranges[2].low) & " " & int2str(g_cs_lqual_ranges[2].high) &
215 " cs4 " & int2str(g_cs_lqual_ranges[3].low);
216 f_vty_config2(PCUVTY, {"pcu"}, cmd);
217
218 cmd := "mcs link-quality-ranges" &
219 " mcs1 " & int2str(g_mcs_lqual_ranges[0].high) &
220 " mcs2 " & int2str(g_mcs_lqual_ranges[1].low) & " " & int2str(g_mcs_lqual_ranges[1].high) &
221 " mcs3 " & int2str(g_mcs_lqual_ranges[2].low) & " " & int2str(g_mcs_lqual_ranges[2].high) &
222 " mcs4 " & int2str(g_mcs_lqual_ranges[3].low) & " " & int2str(g_mcs_lqual_ranges[3].high) &
223 " mcs5 " & int2str(g_mcs_lqual_ranges[4].low) & " " & int2str(g_mcs_lqual_ranges[4].high) &
224 " mcs6 " & int2str(g_mcs_lqual_ranges[5].low) & " " & int2str(g_mcs_lqual_ranges[5].high) &
225 " mcs7 " & int2str(g_mcs_lqual_ranges[6].low) & " " & int2str(g_mcs_lqual_ranges[6].high) &
226 " mcs8 " & int2str(g_mcs_lqual_ranges[7].low) & " " & int2str(g_mcs_lqual_ranges[7].high) &
227 " mcs9 " & int2str(g_mcs_lqual_ranges[8].low);
228 f_vty_config2(PCUVTY, {"pcu"}, cmd);
229}
230
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100231private function f_pcuvty_flush_neigh_caches() runs on RAW_PCU_Test_CT {
232 f_pcuvty_set_neigh_caches(0, 0);
233}
234
235private function f_pcuvty_set_neigh_caches(integer neigh_cache_secs := -1, integer si_cache_secs := -1)
236runs on RAW_PCU_Test_CT {
237 if (neigh_cache_secs == -1) {
238 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 default");
239 } else {
240 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 " & int2str(neigh_cache_secs));
241 }
242 if (si_cache_secs == -1) {
243 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 default");
244 } else {
245 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 " & int2str(si_cache_secs));
246 }
247}
248
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100249private function f_init_vty(charstring id, boolean egprs_only) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200250 map(self:PCUVTY, system:PCUVTY);
251 f_vty_set_prompts(PCUVTY);
252 f_vty_transceive(PCUVTY, "enable");
253
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100254 /* This will be removed soon, not needed. EGPRS support is controlled through pcu_ind flags */
255 if (egprs_only) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200256 f_vty_config2(PCUVTY, {"pcu"}, "egprs only");
257 } else {
258 f_vty_config2(PCUVTY, {"pcu"}, "no egprs");
259 }
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200260
261 if (g_force_two_phase_access) {
262 f_vty_config2(PCUVTY, {"pcu"}, "two-phase-access");
263 } else {
264 f_vty_config2(PCUVTY, {"pcu"}, "no two-phase-access");
265 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200266}
267
Pau Espin Pedrol2456dad2020-04-30 20:22:38 +0200268function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200269runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200270 /* Start the guard timer */
271 g_T_guard.start;
272 activate(as_Tguard_RAW());
273
274 /* Init PCU interface component */
Harald Welte5339b2e2020-10-04 22:52:56 +0200275 vc_PCUIF := RAW_PCUIF_CT.create("PCUIF");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200276 connect(vc_PCUIF:MTC, self:PCUIF);
277 map(vc_PCUIF:PCU, system:PCU);
278
279 /* Create one BTS component (we may want more some day) */
Harald Welte5339b2e2020-10-04 22:52:56 +0200280 vc_BTS := RAW_PCU_BTS_CT.create("BTS");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200281 connect(vc_BTS:PCUIF, vc_PCUIF:BTS);
282 connect(vc_BTS:TC, self:BTS);
283
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100284 f_init_vty(id, f_pcuif_ind_flags_egprs_enabled(valueof(info_ind.flags)));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200285
Daniel Willmann535aea62020-09-21 13:27:08 +0200286 f_init_statsd(id, vc_STATSD, mp_pcu_statsd_ip, mp_pcu_statsd_port);
287 /* This is normally done in the ConnHdlr component, but here
288 * the Test_CT doubles as ConnHdlr */
289 connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
290
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200291 vc_PCUIF.start(f_PCUIF_CT_handler(mp_pcu_sock_path));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100292 vc_BTS.start(f_BTS_CT_handler(0, valueof(info_ind), true));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200293
294 /* Wait until the BTS is ready (SI13 negotiated) */
295 BTS.receive(tr_RAW_PCU_EV(BTS_EV_SI13_NEGO));
296}
297
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700298/* Register TLLI of each allocated GprsMS instance */
299private function f_multi_ms_bssgp_register()
300runs on RAW_PCU_Test_CT {
301 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
302 f_bssgp_client_llgmm_assign(TLLI_UNUSED, g_ms[i].tlli);
303 }
304}
305
306/* Allocate [and activate] an Uplink TBF for each allocated GprsMS instance */
307private function f_multi_ms_establish_tbf(boolean do_activate := false)
308runs on RAW_PCU_Test_CT {
309 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
310 /* Establish an Uplink TBF */
311 f_ms_establish_ul_tbf(g_ms[i]);
312
313 /* Send a random block, so this TBF becomes "active" */
314 if (do_activate) {
315 /* FIXME: use the new APU by Pau to get correct TRX/TS here */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100316 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, i mod 8);
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700317 var octetstring dummy := f_rnd_octstring(12);
318 var RlcmacDlBlock dl_block;
319 var uint32_t poll_fn;
320
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200321 f_ms_tx_ul_data_block(g_ms[i], dummy, with_tlli := true, fn := g_ms[i].ul_tbf.start_time_fn, nr := nr);
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700322 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := nr);
323 }
324 }
325}
326
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100327private function f_ms_establish_ul_tbf_2phase_access(inout GprsMS ms,
328 template (omit) RlcmacUlCtrlMsg pkt_res_req := omit)
329runs on RAW_PCU_Test_CT return PollFnCtx {
330 var PollFnCtx pollctx;
331
332 /* Single block (two phase) packet access */
333 var uint16_t ra := bit2int(chan_req_sb);
334 if (g_force_two_phase_access) {
335 /* If 2phase access is enforced by the network, then let's
336 * request a One phase packet access, we'll receive a single block
337 * anyway
338 */
339 ra := bit2int(chan_req_def);
340 }
341
342 /* Establish an Uplink TBF */
343 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
344 f_ms_establish_ul_tbf(ms);
345
346 /* Make sure we've got an Uplink TBF assignment */
347 if (not match(ms.ul_tbf.ass.ccch, tr_PacketUlSglAssign)) {
348 setverdict(fail, "Wrong Packet Uplink Assignment received: ", ms.ul_tbf.ass.ccch, " vs exp: ", tr_PacketUlSglAssign);
349 f_shutdown(__BFILE__, __LINE__);
350 }
351
352 /* Send PACKET RESOURCE REQUEST
353 * (see 3GPP TS 04.60 "7.1.3.1 Initiation of the Packet resource request procedure")
354 */
355 if (istemplatekind(pkt_res_req, "omit")) {
356 pkt_res_req := ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit);
357 }
358
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200359 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(valueof(pkt_res_req)), ms.ul_tbf.start_time_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100360 /* Store 1st UlTBF context before receiving next one, will
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100361 * overwrite the TS allocation on MS with info from new UL TBF:
362 */
363 pollctx.tstrxbts := f_ms_tx_TsTrxBtsNum(ms);
364 f_ms_rx_pkt_ass_pacch(ms, pollctx.fn, tr_RLCMAC_UL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
365 return pollctx;
366}
367
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200368testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +0200369 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
Pau Espin Pedrol2889f872021-01-11 14:43:35 +0100370 var GprsTlli tlli := TLLI_UNUSED;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200371 timer T;
372
373 /* Initialize NS/BSSGP side */
374 f_init_bssgp();
375
376 /* Initialize the PCU interface abstraction */
377 f_init_raw(testcasename());
378
379 /* Establish BSSGP connection to the PCU */
380 f_bssgp_establish();
381
382 BTS.send(ts_PCUIF_SUSP_REQ(0, tlli, ra_id, 0));
383
384 T.start(2.0);
385 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100386 [] 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 +0200387 setverdict(pass);
388 }
389 [] T.timeout {
390 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
391 }
392 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700393
394 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200395}
396
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100397/* Make sure TBF is released and no data is sent for in after reciving a Suspend Request from that MS. See OS#4761 */
398testcase TC_pcuif_suspend_active_tbf() runs on RAW_PCU_Test_CT {
399 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200400 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100401 var RlcmacDlBlock dl_block;
402 var octetstring data := f_rnd_octstring(10);
403 var uint32_t sched_fn;
404 var uint32_t dl_fn;
405 var GprsMS ms;
406 timer T;
407
408 /* Initialize NS/BSSGP side */
409 f_init_bssgp();
410 /* Initialize GPRS MS side */
411 f_init_gprs_ms();
412 ms := g_ms[0]; /* We only use first MS in this test */
413
414 /* Initialize the PCU interface abstraction */
415 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
416
417 /* Establish BSSGP connection to the PCU */
418 f_bssgp_establish();
419 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
420
421 /* Establish an Uplink TBF */
422 f_ms_establish_ul_tbf(ms);
423
424 /* Send one UL block (with TLLI since we are in One-Phase Access
425 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200426 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100427 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
428 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
429 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
430
431 /* UL block should be received in SGSN */
432 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
433
434 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
435 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
436 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
437
438 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
439 f_sleep(X2002);
440 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
441
442 /* MS has moved to CS, it sent SUSP REQ to BTS and PCU gets it, TBF is freed: */
443 BTS.send(ts_PCUIF_SUSP_REQ(0, ms.tlli, ra_id, 0));
444
445 T.start(2.0);
446 alt {
447 [] BSSGP_GLOBAL[0].receive(tr_BSSGP_SUSPEND(ms.tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
448 setverdict(pass);
449 }
450 [] T.timeout {
451 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
452 f_shutdown(__BFILE__, __LINE__);
453 }
454 }
455
456 /* Make sure we don't receive data for that TBF since it was released
457 * before. Also check our TBF is not polled for UL. */
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200458 f_pcuif_rx_data_req_pdtch(data_msg);
459 if (mp_osmo_pcu_newer_than_0_9_0 and data_msg.dl_block == omit) {
460 /* IDLE block, expected on new PCU versions */
461 } else if (not mp_osmo_pcu_newer_than_0_9_0 and match(data_msg.dl_block, tr_RLCMAC_DUMMY_CTRL())) {
462 /* Dummy RLCMAC block, expected on older PCU versions */
463 if (data_msg.dl_block.ctrl.mac_hdr.usf != USF_UNUSED) {
464 setverdict(fail, "Unexpected USF ", data_msg.dl_block.ctrl.mac_hdr.usf);
465 f_shutdown(__BFILE__, __LINE__);
466 }
467 } else {
468 setverdict(fail, "Unexpected dl_block", data_msg.dl_block);
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100469 f_shutdown(__BFILE__, __LINE__);
470 }
471
472 /* New data arrives, PCU should page the MS since no TBF active exists: */
473 /* Send some more data, it will never reach the MS */
474 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
475 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
476
477 f_shutdown(__BFILE__, __LINE__, final := true);
478}
479
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200480/* Test of correct Timing Advance at the time of TBF establishment
481 * (derived from timing offset of the Access Burst). */
482testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200483 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200484
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200485 /* Initialize GPRS MS side */
486 f_init_gprs_ms();
487 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200488 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100489 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200490
491 /* We cannot send too many TBF requests in a short time because
492 * at some point the PCU will fail to allocate a new TBF. */
493 for (var TimingAdvance ta := 0; ta < 64; ta := ta + 16) {
494 /* Establish an Uplink TBF (send RACH.ind with current TA) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200495 ms.ta := ta;
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700496 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200497
498 /* Make sure Timing Advance IE matches out expectations */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200499 if (ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance != ta) {
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700500 setverdict(fail, "Timing Advance mismatch: ",
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200501 ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance,
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700502 " vs expected ", ta);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700503 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200504 }
505 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700506
507 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200508}
509
Vadim Yanitskiy866f8702021-05-26 14:50:27 +0200510/* Verify Timing Advance value indicated in Packet Uplink ACK/NACK message
511 * sent in response to the first Uplink block after resource allocation. */
512testcase TC_ta_ul_ack_nack_first_block() runs on RAW_PCU_Test_CT {
513 var GprsMS ms := valueof(t_GprsMS_def);
514 var PacketUlAckNack ul_ack_nack;
515 var PacketTimingAdvance pkt_ta;
516 var RlcmacDlBlock dl_block;
517 var uint32_t sched_fn;
518
519 /* Initialize NS/BSSGP side */
520 f_init_bssgp();
521
522 /* Initialize the PCU interface abstraction */
523 f_init_raw(testcasename());
524
525 /* Establish BSSGP connection to the PCU */
526 f_bssgp_establish();
527 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
528
529 /* Establish an Uplink TBF */
530 f_ms_establish_ul_tbf(ms);
531
532 /* In a busy network, there can be a significant delay between resource
533 * allocation (Packet Uplink Assignment above) and the actual time when
534 * the MS is allowed to transmit the first Uplink data block. */
535
536 /* Simulate a delay > 0 */
537 ms.ta := 2;
538
539 /* We're in One-Phase Access contention resoultion, include TLLI */
540 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
541 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
542
543 ul_ack_nack := dl_block.ctrl.payload.u.ul_ack_nack;
544 if (ispresent(ul_ack_nack.gprs.pkt_ta)) {
545 pkt_ta := ul_ack_nack.gprs.pkt_ta;
546 } else if (ispresent(ul_ack_nack.egprs.pkt_ta)) {
547 pkt_ta := ul_ack_nack.egprs.pkt_ta;
548 } else {
549 setverdict(fail, "PacketTimingAdvance IE is not present");
550 f_shutdown(__BFILE__, __LINE__);
551 }
552
553 if (not ispresent(pkt_ta.val)) {
554 setverdict(fail, "Timing Advance value is not present");
555 f_shutdown(__BFILE__, __LINE__);
556 } else if (pkt_ta.val != ms.ta) {
557 setverdict(fail, "Timing Advance mismatch: expected ",
558 ms.ta, ", but received ", pkt_ta.val);
559 f_shutdown(__BFILE__, __LINE__);
560 }
561}
562
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200563/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
564 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
565 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
566 * no active TBF exists at the moment of establishment (idle mode). */
567testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100568 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200569
570 /* Initialize NS/BSSGP side */
571 f_init_bssgp();
572
573 /* Initialize the PCU interface abstraction */
574 f_init_raw(testcasename());
575
576 /* Establish BSSGP connection to the PCU */
577 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100578 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200579
580 /* SGSN sends some DL data, PCU will initiate Packet Downlink
581 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100582 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
583 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200584
585 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
586 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
587 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100588 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700589 setverdict(fail, "Timing Advance value doesn't match");
590 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700591
592 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200593}
594
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200595/* Verify that the PCU generates idle blocks in PTCCH/D
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200596 * while neither Uplink nor Downlink TBF is established. */
597testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100598 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200599 timer T;
600
601 /* Initialize the PCU interface abstraction */
602 f_init_raw(testcasename());
603
604 /* Sent an RTS.req for PTCCH/D */
605 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
606 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
607 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100608
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200609 T.start(5.0);
610 alt {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200611 [] BTS.receive(tr_PCUIF_DATA_PTCCH(0,
612 tr_PCUIF_DATA(0, 7, sapi := PCU_IF_SAPI_PTCCH),
613 omit)) {
614 if (not mp_osmo_pcu_newer_than_0_9_0) {
615 setverdict(fail, "Expected PTCCH/D block instead of IDLE block");
616 f_shutdown(__BFILE__, __LINE__);
617 }
618 }
619 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg) {
620 if (mp_osmo_pcu_newer_than_0_9_0) {
621 setverdict(fail, "Expected IDLE block instead of PTCCH/D block");
622 f_shutdown(__BFILE__, __LINE__);
623 }
624 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200625 [] BTS.receive(PCUIF_Message:?) { repeat; }
626 [] T.timeout {
627 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700628 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200629 }
630 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100631 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700632
633 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200634}
635
636/* Test of correct Timing Advance during an active Uplink TBF.
637 *
638 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
639 * are not continuous and there can be long time gaps between them. This happens
640 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
641 * significantly change between such rare Uplink transmissions, so GPRS introduces
642 * additional mechanisms to control Timing Advance, and thus reduce interference
643 * between neighboring TDMA time-slots.
644 *
645 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
646 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
647 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
648 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
649 * among with the initial Timing Advance value. And here PTCCH comes to play.
650 *
651 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
652 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
653 * continuously. To ensure continuous measurements of the signal propagation
654 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
655 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
656 *
657 * The purpose of this test case is to verify the assignment of Timing Advance
658 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
659 * first establishes several Uplink TBFs, but does not transmit any Uplink
660 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
661 * indications to the PCU, checking the correctness of two received PTCCH/D
662 * messages (period of PTCCH/D is two multi-frames).
663 */
664
665/* List of ToA values for Access Bursts to be sent on PTCCH/U,
666 * each ToA (Timing of Arrival) value is in units of 1/4 of
667 * a symbol (i.e. 1 symbol is 4 QTA units). */
668type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
669const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
670 0, 0, 0, 0,
671 0, 0, 0, 0,
672 0, 0, 0, 0,
673 0, 0, 0, 0
674};
675
676private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
677 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
678runs on RAW_PCU_Test_CT {
679 var RAW_PCU_Event event;
680 var integer ss;
681
682 /* Send Access Bursts on PTCCH/U for every TA Index */
683 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
684 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700685 if (ss < 0) { /* Shall not happen */
686 f_shutdown(__BFILE__, __LINE__);
687 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200688
689 log("Sending an Access Burst on PTCCH/U",
690 ", sub-slot=", ss, " (TAI)",
691 ", fn=", event.data.tdma_fn,
692 ", ToA=", toa_map[ss], " (QTA)");
693 /* TODO: do we care about RA and burst format? */
694 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
695 ra := oct2int('3A'O),
696 is_11bit := 0,
697 burst_type := BURST_TYPE_0,
698 fn := event.data.tdma_fn,
699 arfcn := 871,
700 qta := toa_map[ss],
701 sapi := PCU_IF_SAPI_PTCCH));
702 repeat;
703 }
704}
705
706private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
707 template PTCCHDownlinkMsg t_ta_msg)
708runs on RAW_PCU_Test_CT {
709 var PTCCHDownlinkMsg ta_msg;
710 var PCUIF_Message pcu_msg;
711 timer T;
712
713 /* First, send an RTS.req for the upcoming PTCCH/D block */
714 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
715 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
716 arfcn := 871, block_nr := 0));
717 T.start(2.0);
718 alt {
719 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
720 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
721 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
722 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
723 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
724 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
725 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
726 log("Rx PTCCH/D message: ", ta_msg);
727
728 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700729 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200730 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
731 }
732 }
733 [] BTS.receive { repeat; }
734 [] T.timeout {
735 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200736 }
737 }
738}
739
740testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
741 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200742 var GprsMS ms;
743
744 /* Initialize GPRS MS side */
745 f_init_gprs_ms();
746 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200747
748 /* Initialize the PCU interface abstraction */
749 f_init_raw(testcasename());
750
751 /* Enable forwarding of PTCCH/U TDMA events to us */
752 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
753
754 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
755 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200756 /* Establish an Uplink TBF */
757 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200758
759 /* We expect incremental TFI/USF assignment (dynamic allocation) */
760 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200761 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200762 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700763 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200764 }
765
766 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200767 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200768 setverdict(fail, "Failed to match Timing Advance Index for #", i);
769 /* Keep going, the current OsmoPCU does not assign TA Index */
770 }
771 }
772
773 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
774 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
775 for (var integer i := 0; i < 7; i := i + 1) {
776 /* ToA in units of 1/4 of a symbol */
777 toa_map[i] := (i + 1) * 7 * 4;
778 }
779
780 /* Now we have all 7 TBFs established in one-phase access mode,
781 * however we will not be sending any data on them. Instead, we
782 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
783 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
784 *
785 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
786 * time-slots, so at the moment of scheduling a PTCCH/D block
787 * the PCU has odd number of PTCCH/U Access Bursts received. */
788 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
789 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
790 /* Other values are not known (yet) */
791 tai3_ta := ?));
792 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
793 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
794 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
795 /* Other values are out of our interest */
796 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700797
798 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200799}
800
801/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
802 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
803 *
804 * NOTE: the ranges are intentionally overlapping because OsmoPCU
805 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
806private template integer CS1_lqual_dB_range := (-infinity .. 6);
807private template integer CS2_lqual_dB_range := (5 .. 8);
808private template integer CS3_lqual_dB_range := (7 .. 13);
809private template integer CS4_lqual_dB_range := (12 .. infinity);
810
811testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200812 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200813 var GprsMS ms;
814 var uint32_t unused_fn, sched_fn;
815 var uint4_t cv;
816
817 /* Initialize GPRS MS side */
818 f_init_gprs_ms();
819 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200820
821 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100822 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200823
824 f_pcuvty_set_allowed_cs_mcs();
825 f_pcuvty_set_link_quality_ranges();
826
827 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200828 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200829
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200830
831 /* The actual / old link quality values. We need to keep track of the old
832 * (basically previous) link quality value, because OsmoPCU actually
833 * changes the coding scheme if not only the actual, but also the old
834 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200835 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200836 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200837
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200838 /* Send one UL block (with TLLI since we are in One-Phase Access
839 contention resoultion) and make sure it is ACKED fine. */
840 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
841 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200842 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200843 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
844 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
845 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200846
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200847 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
848 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200849 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200850 lqual_old := ms.lqual_cb;
851 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200852
853 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200854 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
855 if (i > g_bs_cv_max) {
856 cv := 15;
857 } else {
858 cv := i;
859 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200860
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200861 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
862
863 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
864 f_rx_rlcmac_dl_block(dl_block, unused_fn);
865 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
866 continue;
867 }
868 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
869 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
870 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
871 f_shutdown(__BFILE__, __LINE__);
872 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200873
874 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
875 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
876
877 /* Match the received Channel Coding Command. Since we are increasing
878 * the link quality value on each iteration and not decreasing, there
879 * is no need to check the both old and current link quality values. */
880 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200881 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200882 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
883 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
884 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
885 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
886 }
887
888 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
889 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200890 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200891 }
892 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700893
894 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200895}
896
897/* Test the max UL CS set by VTY works fine */
898testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200899 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200900 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200901 var uint32_t unused_fn, sched_fn;
902 var GprsMS ms;
903
904 /* Initialize GPRS MS side */
905 f_init_gprs_ms();
906 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200907
908 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100909 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200910
911 /* Set initial UL CS to 3 */
912 g_cs_initial_ul := 3;
913 f_pcuvty_set_allowed_cs_mcs();
914 f_pcuvty_set_link_quality_ranges();
915
916 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200917 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200918
919 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200920 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200921
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200922 /* Send one UL block (with TLLI since we are in One-Phase Access
923 contention resoultion) and make sure it is ACKED fine. */
924 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
925 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200926 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200927 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
928 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
929 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200930
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200931 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
932 while (true) {
933 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
934 f_rx_rlcmac_dl_block(dl_block, unused_fn);
935 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
936 continue;
937 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200938
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200939 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
940 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
941 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
942 f_shutdown(__BFILE__, __LINE__);
943 break;
944 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200945
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200946 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200947 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200948 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200949 if (last_ch_coding != CH_CODING_CS3) {
950 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200951 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200952 }
953
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200954 /* Remaining UL blocks are used to make sure regardless of initial
955 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200956 /* 0 dB, make sure we downgrade CS */
957 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200958 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200959 f_ms_tx_ul_data_block_multi(ms, 5);
960 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
961 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
962 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200963
964 if (last_ch_coding != CH_CODING_CS1) {
965 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200966 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200967 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700968
969 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200970}
971
972/* Test the max UL CS set by VTY works fine */
973testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200974 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200975 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200976 var uint32_t unused_fn, sched_fn;
977 var GprsMS ms;
978
979 /* Initialize GPRS MS side */
980 f_init_gprs_ms();
981 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200982
983 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100984 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200985
986 /* Set maximum allowed UL CS to 3 */
987 g_cs_max_ul := 3;
988 f_pcuvty_set_allowed_cs_mcs();
989 f_pcuvty_set_link_quality_ranges();
990
991 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200992 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200993
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200994 /* Send one UL block (with TLLI since we are in One-Phase Access
995 contention resoultion) and make sure it is ACKED fine. */
996 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
997 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200998 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200999 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1000 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1001 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001002
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001003 ms.lqual_cb := 40*10; /* 40 dB */
1004 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001005
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001006 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1007 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001008
1009 if (last_ch_coding != CH_CODING_CS3) {
1010 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +02001011 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001012 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001013
1014 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001015}
1016
Pau Espin Pedrol75122592020-11-03 15:22:59 +01001017/* Test the initial DL CS set by VTY works fine */
1018testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
1019 var octetstring data := f_rnd_octstring(10);
1020 var CodingScheme exp_dl_cs_mcs;
1021 var RlcmacDlBlock dl_block;
1022 var uint32_t poll_fn;
1023 var GprsMS ms;
1024
1025 /* Initialize NS/BSSGP side */
1026 f_init_bssgp();
1027 /* Initialize GPRS MS side */
1028 f_init_gprs_ms();
1029 ms := g_ms[0]; /* We only use first MS in this test */
1030
1031 /* Initialize the PCU interface abstraction */
1032 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1033
1034 /* Set initial allowed DL CS to 3 */
1035 g_cs_initial_dl := 3;
1036 exp_dl_cs_mcs := CS_3;
1037 /* Set maximum allowed UL CS to 4 */
1038 g_cs_max_dl := 4;
1039 f_pcuvty_set_allowed_cs_mcs();
1040 f_pcuvty_set_link_quality_ranges();
1041
1042 /* Establish BSSGP connection to the PCU */
1043 f_bssgp_establish();
1044 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1045
1046 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1047 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1048 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1049
1050 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1051 f_sleep(X2002);
1052 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1053
1054 /* ACK the DL block */
1055 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1056 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1057 f_dl_block_ack_fn(dl_block, poll_fn));
1058
1059 f_shutdown(__BFILE__, __LINE__, final := true);
1060}
1061
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001062/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001063function 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 +01001064 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001065 var RlcmacDlBlock prev_dl_block, dl_block;
1066 var uint32_t ack_fn;
1067 var uint32_t fn;
1068 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001069 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001070 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001071 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
1072 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001073 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001074
1075 if (using_egprs) {
1076 exp_tmp_csmcs := mcs_egprs_any;
1077 bsn_mod := 2048;
1078 } else {
1079 exp_tmp_csmcs := cs_gprs_any;
1080 bsn_mod := 128;
1081 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001082
1083 /* Establish BSSGP connection to the PCU */
1084 f_bssgp_establish();
1085
1086 ms := g_ms[0]; /* We only use first MS in this test */
1087 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1088
1089 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001090 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001091 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1092
1093 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1094 f_sleep(X2002);
1095
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001096 for (var integer i := 0; i < 800; i := i + 1) {
1097 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001098 f_rx_rlcmac_dl_block(dl_block, fn);
1099
1100 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
1101 /* No more data to receive, done */
1102 break;
1103 }
1104
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001105 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001106
1107 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001108 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001109
1110 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001111 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001112 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001113 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 +01001114 if (tx_data_remain != 0) {
1115 /* Submit more data from time to time to keep the TBF ongoing */
1116 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1117 tx_data_remain := tx_data_remain - 1;
1118 }
1119 }
1120 prev_dl_block := dl_block;
1121 }
1122
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001123 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1124 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001125
1126
1127 f_shutdown(__BFILE__, __LINE__, final := true);
1128}
1129
1130/* Verify DL CS above "cs max" set by VTY is never used */
1131testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1132 /* Initialize NS/BSSGP side */
1133 f_init_bssgp();
1134 /* Initialize GPRS MS side */
1135 f_init_gprs_ms();
1136
1137 /* Initialize the PCU interface abstraction */
1138 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1139
1140 /* Set maximum allowed DL CS to 3 */
1141 g_cs_initial_dl := 1;
1142 g_cs_max_dl := 3;
1143 f_pcuvty_set_allowed_cs_mcs();
1144 f_pcuvty_set_link_quality_ranges();
1145
1146 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1147}
1148
1149/* Check DL CS4 is used in good link conditions if allowed by config */
1150testcase TC_dl_cs1_to_cs4() runs on RAW_PCU_Test_CT {
1151 /* Initialize NS/BSSGP side */
1152 f_init_bssgp();
1153 /* Initialize GPRS MS side */
1154 f_init_gprs_ms();
1155
1156 /* Initialize the PCU interface abstraction */
1157 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1158
1159 /* Set initial DL CS to 1 & maximum allowed DL CS to 4 */
1160 g_cs_initial_dl := 1;
1161 g_cs_max_dl := 4;
1162 f_pcuvty_set_allowed_cs_mcs();
1163 f_pcuvty_set_link_quality_ranges();
1164
1165 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1166}
1167
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001168/* Test the initial UL MCS set by VTY works fine */
1169testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1170 var RlcmacDlBlock dl_block;
1171 var PollFnCtx pollctx;
1172 var EgprsChCodingCommand last_ch_coding;
1173 var uint32_t unused_fn, sched_fn;
1174 var GprsMS ms;
1175 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001176
1177 /* Initialize GPRS MS side */
1178 f_init_gprs_ms();
1179 ms := g_ms[0]; /* We only use first MS in this test */
1180
1181 /* Initialize the PCU interface abstraction */
1182 f_init_raw(testcasename());
1183
1184 /* Set initial UL MCS to 3 */
1185 g_mcs_initial_ul := 3;
1186 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1187 f_pcuvty_set_allowed_cs_mcs();
1188 f_pcuvty_set_link_quality_ranges();
1189
1190 /* Take lqual (dB->cB) so that we stay in that MCS */
1191 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1192
1193 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001194 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 +01001195
1196 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1197 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1198 f_shutdown(__BFILE__, __LINE__);
1199 }
1200
1201 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1202 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1203
1204 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1205 while (true) {
1206 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1207 f_rx_rlcmac_dl_block(dl_block, unused_fn);
1208 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1209 continue;
1210 }
1211
1212 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1213 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1214 f_shutdown(__BFILE__, __LINE__);
1215 break;
1216 }
1217
1218 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1219 break;
1220 }
1221 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1222 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1223 f_shutdown(__BFILE__, __LINE__);
1224 }
1225
1226 /* Remaining UL blocks are used to make sure regardless of initial
1227 * lqual, we can go lower at any time
1228 * 0 dB, make sure we downgrade MCS */
1229 ms.lqual_cb := 0;
1230 /* 5 UL blocks, check we are in same initial MCS: */
1231 f_ms_tx_ul_data_block_multi(ms, 5);
1232 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1233 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1234 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1235
1236 if (last_ch_coding != CH_CODING_MCS1) {
1237 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1238 f_shutdown(__BFILE__, __LINE__);
1239 }
1240
1241 f_shutdown(__BFILE__, __LINE__, final := true);
1242}
1243
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001244/* Test the maximum UL MCS set by VTY works fine */
1245testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1246 var RlcmacDlBlock dl_block;
1247 var EgprsChCodingCommand last_ch_coding;
1248 var PollFnCtx pollctx;
1249 var uint32_t unused_fn, sched_fn;
1250 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001251
1252 /* Initialize GPRS MS side */
1253 f_init_gprs_ms();
1254 ms := g_ms[0]; /* We only use first MS in this test */
1255
1256 /* Initialize the PCU interface abstraction */
1257 f_init_raw(testcasename());
1258
1259 /* Set maximum allowed UL MCS to 5 */
1260 g_mcs_max_ul := 5;
1261 f_pcuvty_set_allowed_cs_mcs();
1262 f_pcuvty_set_link_quality_ranges();
1263
1264 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001265 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 +01001266 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1267 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1268
1269 ms.lqual_cb := 40*10; /* 40 dB */
1270 f_ms_tx_ul_data_block_multi(ms, 16);
1271
1272 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1273 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1274
1275 if (last_ch_coding != CH_CODING_MCS5) {
1276 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1277 f_shutdown(__BFILE__, __LINE__);
1278 }
1279
1280 f_shutdown(__BFILE__, __LINE__, final := true);
1281}
1282
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001283/* Test the initial DL CS set by VTY works fine */
1284testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1285 var octetstring data := f_rnd_octstring(10);
1286 var CodingScheme exp_dl_cs_mcs;
1287 var RlcmacDlBlock dl_block;
1288 var uint32_t poll_fn;
1289 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001290
1291 /* Initialize NS/BSSGP side */
1292 f_init_bssgp();
1293 /* Initialize GPRS MS side */
1294 f_init_gprs_ms();
1295 ms := g_ms[0]; /* We only use first MS in this test */
1296
1297 /* Initialize the PCU interface abstraction */
1298 f_init_raw(testcasename());
1299
1300 /* Set initial allowed DL MCS to 3 */
1301 g_mcs_initial_dl := 3;
1302 exp_dl_cs_mcs := MCS_3;
1303 /* Set maximum allowed DL MCS to 4 */
1304 g_mcs_max_dl := 4;
1305 f_pcuvty_set_allowed_cs_mcs();
1306 f_pcuvty_set_link_quality_ranges();
1307
1308 /* Establish BSSGP connection to the PCU */
1309 f_bssgp_establish();
1310 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1311
1312 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001313 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001314 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1315
1316 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1317 f_sleep(X2002);
1318 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1319
1320 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001321 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1322 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 +01001323 f_dl_block_ack_fn(dl_block, poll_fn));
1324
1325 f_shutdown(__BFILE__, __LINE__, final := true);
1326}
1327
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001328/* Verify DL MCS above "mcs max" set by VTY is never used */
1329testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1330 /* Initialize NS/BSSGP side */
1331 f_init_bssgp();
1332 /* Initialize GPRS MS side */
1333 f_init_gprs_ms();
1334
1335 /* Initialize the PCU interface abstraction */
1336 f_init_raw(testcasename());
1337
1338 /* Set maximum allowed DL CS to 3 */
1339 g_mcs_initial_dl := 1;
1340 g_mcs_max_dl := 3;
1341 f_pcuvty_set_allowed_cs_mcs();
1342 f_pcuvty_set_link_quality_ranges();
1343
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001344 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 +01001345}
1346
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02001347/* Verify PCU drops TBF after some time of inactivity. */
1348testcase TC_t3141() runs on RAW_PCU_Test_CT {
1349 var PCUIF_info_ind info_ind;
1350 var template (value) TsTrxBtsNum nr;
1351 var BTS_PDTCH_Block data_msg;
1352 var GprsMS ms;
1353 var uint3_t rx_usf;
1354 timer T_3141 := 1.0;
1355 var boolean ul_tbf_usf_req := false;
1356
1357 /* Initialize NS/BSSGP side */
1358 f_init_bssgp();
1359 /* Initialize GPRS MS side */
1360 f_init_gprs_ms();
1361 ms := g_ms[0]; /* We only use first MS in this test */
1362
1363 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1364 /* Only use 1 PDCH to simplify test: */
1365 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
1366 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
1367 /* Initialize the PCU interface abstraction */
1368 f_init_raw(testcasename(), info_ind);
1369
1370 f_vty_config2(PCUVTY, {"pcu"}, "timer T3141 1");
1371
1372 /* Establish BSSGP connection to the PCU */
1373 f_bssgp_establish();
1374 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1375
1376 /* Establish a one-phase access Uplink TBF */
1377 f_ms_establish_ul_tbf(ms);
1378
1379 T_3141.start;
1380
1381 /* Now we wait for PCU to transmit our USF */
1382 nr := ts_TsTrxBtsNum;
1383 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1384 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1385 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1386 block_nr := nr.blk_nr));
1387
1388 alt {
1389 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1390 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1391 ?)) -> value data_msg {
1392 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1393 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1394 f_shutdown(__BFILE__, __LINE__);
1395 }
1396
1397 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1398 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1399 /* PCU requests our USF, transmit WITHOUT tlli to avoid contention resolution success */
1400 ul_tbf_usf_req := true;
1401 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15, with_tlli := false, fn := f_next_pdch_block(data_msg.raw.fn))
1402 } else if (rx_usf == USF_UNUSED) {
1403 if (data_msg.raw.fn >= ms.ul_tbf.start_time_fn) {
1404 if (ul_tbf_usf_req) {
1405 /* TBF was dropped by T3141, success */
1406 setverdict(pass);
1407 break;
1408 } else {
1409 log("PCU never requested USF, unexpected");
1410 f_shutdown(__BFILE__, __LINE__);
1411 }
1412 } /* else: Keep waiting for TBF to be active by network */
1413 } else {
1414 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1415 f_shutdown(__BFILE__, __LINE__);
1416 }
1417
1418 /* Make sure we don't receive a Ul ACK/NACK with TLLI set: */
1419 if (match(data_msg.dl_block,
1420 tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
1421 tr_UlAckNackGprs(tlli := ?,
1422 acknack_desc := ?,
1423 rel99 := *))))
1424 {
1425 log("Received UL ACK/NACK with TLLI set");
1426 f_shutdown(__BFILE__, __LINE__);
1427 }
1428
1429 nr := ts_TsTrxBtsNum;
1430 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1431 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1432 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1433 block_nr := nr.blk_nr));
1434 repeat;
1435 }
1436 [] T_3141.timeout {
1437 log("T_3141 expired but TBF is still active, unexpected");
1438 f_shutdown(__BFILE__, __LINE__);
1439 }
1440 [] BTS.receive {
1441 /* We should never receive non-dummy messages, aka UL ACK/NACK,
1442 * because we never sent the TLLI to the PCU */
1443 setverdict(fail, "Unexpected BTS message");
1444 f_shutdown(__BFILE__, __LINE__);
1445 }
1446 }
1447
1448 f_shutdown(__BFILE__, __LINE__, final := true);
1449}
1450
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001451/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1452 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1453 * T3169. See OS#5033 */
1454testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1455 var PCUIF_info_ind info_ind;
1456 var template (value) TsTrxBtsNum nr;
1457 var BTS_PDTCH_Block data_msg;
1458 var GprsMS ms;
1459 var uint3_t rx_usf;
1460 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1461 var integer n3101 := 0;
1462 timer T_3169 := 1.0;
1463
1464 /* Initialize NS/BSSGP side */
1465 f_init_bssgp();
1466 /* Initialize GPRS MS side */
1467 f_init_gprs_ms();
1468 ms := g_ms[0]; /* We only use first MS in this test */
1469
1470 /* Initialize the PCU interface abstraction */
1471 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1472 info_ind.n3101 := N3101_MAX;
1473 info_ind.t3169 := 1;
1474 f_init_raw(testcasename(), info_ind);
1475
1476 /* Establish BSSGP connection to the PCU */
1477 f_bssgp_establish();
1478 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1479
1480 /* Establish UL TBF */
1481 f_ms_establish_ul_tbf(ms);
1482
1483 /* Now we wait for PCU to transmit our USF */
1484 nr := ts_TsTrxBtsNum;
1485 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1486 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1487 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1488 block_nr := nr.blk_nr));
1489
1490 alt {
1491 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1492 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1493 ?)) -> value data_msg {
1494 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1495 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1496 f_shutdown(__BFILE__, __LINE__);
1497 }
1498
1499 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1500 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1501 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1502 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001503 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1504 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001505 f_shutdown(__BFILE__, __LINE__);
1506 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001507 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001508 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1509 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1510 if (not T_3169.running) {
1511 log("T3169 started");
1512 T_3169.start;
1513 }
1514 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1515 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1516 f_shutdown(__BFILE__, __LINE__);
1517 } else {
1518 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1519 }
1520 nr := ts_TsTrxBtsNum;
1521 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1522 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1523 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1524 block_nr := nr.blk_nr));
1525 repeat;
1526 }
1527 [] T_3169.timeout {
1528 log("T_3169 expired");
1529 /* Done in alt */
1530 }
1531 [] BTS.receive {
1532 setverdict(fail, "Unexpected BTS message");
1533 f_shutdown(__BFILE__, __LINE__);
1534 }
1535 }
1536
1537 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1538 /* USFs as per previous TBF since they were freed at expiration time: */
1539 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1540 var uint5_t old_tfi := ms.ul_tbf.tfi;
1541 f_ms_establish_ul_tbf(ms);
1542 if (old_tfi != ms.ul_tbf.tfi) {
1543 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1544 f_shutdown(__BFILE__, __LINE__);
1545 }
1546 for (var integer i := 0; i < 8; i := i +1) {
1547 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1548 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1549 f_shutdown(__BFILE__, __LINE__);
1550 }
1551 }
1552
1553 f_shutdown(__BFILE__, __LINE__, final := true);
1554}
1555
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001556
1557/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1558 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1559 the final UL ACK sent at us. */
1560testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1561 var PCUIF_info_ind info_ind;
1562 var BTS_PDTCH_Block data_msg;
1563 var RlcmacDlBlock dl_block;
1564 var uint32_t sched_fn;
1565 var template (value) TsTrxBtsNum nr;
1566 var template RlcmacDlBlock exp_ul_ack;
1567 var template UlAckNackGprs exp_ul_ack_sub;
1568 var GprsMS ms;
1569 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1570 var integer N3103 := 0;
1571 timer T_3169 := 1.0;
1572
1573 /* Initialize GPRS MS side */
1574 f_init_gprs_ms();
1575 ms := g_ms[0]; /* We only use first MS in this test */
1576
1577 /* Initialize the PCU interface abstraction */
1578 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1579 info_ind.n3103 := N3103_MAX;
1580 info_ind.t3169 := 1;
1581 f_init_raw(testcasename(), info_ind);
1582
1583 /* Establish an Uplink TBF */
1584 f_ms_establish_ul_tbf(ms);
1585
Pau Espin Pedrol93ae4522021-05-11 15:58:26 +02001586 f_ms_tx_ul_data_block_multi(ms, 5, with_tlli := true);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001587 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1588 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1589
1590 nr := ts_TsTrxBtsNum;
1591 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1592 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1593 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1594 block_nr := nr.blk_nr));
1595 alt {
1596 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1597 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1598 exp_ul_ack)) -> value data_msg {
1599 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1600 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1601 f_shutdown(__BFILE__, __LINE__);
1602 }
1603
1604 nr := ts_TsTrxBtsNum;
1605 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1606 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1607 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1608 block_nr := nr.blk_nr));
1609 N3103 := N3103 + 1;
1610 if (N3103 == N3103_MAX) {
1611 /* At this point in time (N3103_MAX reached), PCU is
1612 * moving the TBF to RELEASE state so no data/ctrl for
1613 * it is tx'ed, hence the dummy blocks: */
1614 T_3169.start;
1615 }
1616 repeat;
1617 }
1618 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1619 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1620 exp_ul_ack)) -> value data_msg {
1621 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1622 f_shutdown(__BFILE__, __LINE__);
1623 }
1624 [] as_ms_rx_ignore_dummy(ms, nr);
1625 [T_3169.running] T_3169.timeout {
1626 log("T_3169 timeout");
1627 /* Done in alt, wait for pending RTS initiated previously in
1628 * above case before continuing (expect /* Dummy block): */
1629 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1630 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1631 tr_RLCMAC_DUMMY_CTRL));
1632 }
1633 [] BTS.receive {
1634 setverdict(fail, "Unexpected BTS message");
1635 f_shutdown(__BFILE__, __LINE__);
1636 }
1637 }
1638
1639 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1640 * USFs as per previous TBF since they were freed at expiration time: */
1641 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1642 var uint5_t old_tfi := ms.ul_tbf.tfi;
1643 f_ms_establish_ul_tbf(ms);
1644 if (old_tfi != ms.ul_tbf.tfi) {
1645 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1646 f_shutdown(__BFILE__, __LINE__);
1647 }
1648 for (var integer i := 0; i < 8; i := i +1) {
1649 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1650 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1651 f_shutdown(__BFILE__, __LINE__);
1652 }
1653 }
1654
1655 f_shutdown(__BFILE__, __LINE__, final := true);
1656}
1657
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001658/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1659 * point the TBF is no longer available. In order to get to start of T3191, we
1660 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1661 * until TBF release procedure starts after draining DL queue. */
1662testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1663 var PCUIF_info_ind info_ind;
1664 var RlcmacDlBlock dl_block;
1665 var octetstring data1 := f_rnd_octstring(200);
1666 var octetstring data2 := f_rnd_octstring(10);
1667 var uint32_t dl_fn;
1668 var template (value) TsTrxBtsNum nr;
1669 var BTS_PDTCH_Block data_msg;
1670 var GprsMS ms;
1671
1672 /* Initialize NS/BSSGP side */
1673 f_init_bssgp();
1674 /* Initialize GPRS MS side */
1675 f_init_gprs_ms();
1676 ms := g_ms[0]; /* We only use first MS in this test */
1677
1678 /* Initialize the PCU interface abstraction */
1679 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1680 /* Set timer to 1 sec (default 5) to speedup test: */
1681 info_ind.t3191 := 1;
1682 f_init_raw(testcasename(), info_ind);
1683
1684 /* Establish BSSGP connection to the PCU */
1685 f_bssgp_establish();
1686 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1687
1688 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1689 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1690 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1691
1692 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1693 f_sleep(X2002);
1694
1695 while (true) {
1696 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1697
1698 /* Keep Ack/Nack description updated (except for last BSN) */
1699 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1700
1701 if (f_dl_block_rrbp_valid(dl_block)) {
1702 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1703 f_dl_block_ack_fn(dl_block, dl_fn));
1704 break;
1705 }
1706 }
1707
1708 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1709 nr := ts_TsTrxBtsNum;
1710 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1711 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1712 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1713 block_nr := nr.blk_nr));
1714 alt {
1715 [] as_ms_rx_ignore_dummy(ms, nr);
1716 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1717 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1718 ?)) -> value data_msg {
1719 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1720 log("Received FINAL_ACK");
1721 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1722 break;
1723 }
1724 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1725 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1726 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1727 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1728 }
1729 nr := ts_TsTrxBtsNum;
1730 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1731 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1732 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1733 block_nr := nr.blk_nr));
1734 repeat;
1735 }
1736 [] BTS.receive {
1737 setverdict(fail, "Unexpected BTS message");
1738 f_shutdown(__BFILE__, __LINE__);
1739 }
1740 }
1741
1742 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1743 to time out. We simply sleep instead of requesting blocks because
1744 otherwise retransmissions would keep restarting the timer. */
1745 f_sleep(int2float(info_ind.t3191));
1746
1747 /* The TBF should be freed now, so new data should trigger an Assignment: */
1748 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1749 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1750
1751 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1752 f_sleep(X2002);
1753 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1754 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1755 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1756 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1757 f_dl_block_ack_fn(dl_block, dl_fn));
1758
1759 f_shutdown(__BFILE__, __LINE__, final := true);
1760}
1761
1762/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1763testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1764 var PCUIF_info_ind info_ind;
1765 var RlcmacDlBlock dl_block;
1766 var octetstring data1 := f_rnd_octstring(1400);
1767 var octetstring data2 := f_rnd_octstring(10);
1768 var uint32_t dl_fn;
1769 var GprsMS ms;
1770
1771 /* Initialize NS/BSSGP side */
1772 f_init_bssgp();
1773 /* Initialize GPRS MS side */
1774 f_init_gprs_ms();
1775 ms := g_ms[0]; /* We only use first MS in this test */
1776
1777 /* Initialize the PCU interface abstraction */
1778 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1779 /* Set timer to 1 sec (default 5) to speedup test: */
1780 info_ind.t3191 := 1;
1781 f_init_raw(testcasename(), info_ind);
1782
1783 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1784
1785 /* Establish BSSGP connection to the PCU */
1786 f_bssgp_establish();
1787 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1788
1789 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1790 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1791 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1792
1793 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1794 f_sleep(X2002);
1795
1796 /* Send enough DL data to at least be able to DL ACK once (excl the
1797 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1798 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1799 while (true) {
1800 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1801
1802 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1803 log("Received FINAL_ACK");
1804 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1805 break;
1806 }
1807
1808 /* Keep Ack/Nack description updated (except for last BSN) */
1809 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1810
1811 if (f_dl_block_rrbp_valid(dl_block)) {
1812 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1813 f_dl_block_ack_fn(dl_block, dl_fn));
1814 }
1815 }
1816
1817 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1818 to time out. We simply sleep instead of requesting blocks because
1819 otherwise retransmissions would keep restarting the timer. */
1820 f_sleep(int2float(info_ind.t3191));
1821
1822 /* The TBF should be freed now, so new data should trigger an Assignment: */
1823 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1824 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1825
1826 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1827 f_sleep(X2002);
1828 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1829 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1830 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1831 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1832 f_dl_block_ack_fn(dl_block, dl_fn));
1833
1834 f_shutdown(__BFILE__, __LINE__, final := true);
1835}
1836
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001837/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1838 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1839 * T3193) after DL TBF release */
1840testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001841 var RlcmacDlBlock dl_block;
1842 var octetstring data := f_rnd_octstring(10);
1843 var boolean ok;
1844 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001845 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001846 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001847 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1848
1849 /* Initialize NS/BSSGP side */
1850 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001851 /* Initialize GPRS MS side */
1852 f_init_gprs_ms();
1853 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001854
1855 /* Initialize the PCU interface abstraction */
1856 f_init_raw(testcasename());
1857
1858 /* Establish BSSGP connection to the PCU */
1859 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001860 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001861
1862 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001863 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1864 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001865
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001866 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1867 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001868 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001869
1870 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001871 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1872 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1873 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001874
1875 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001876 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001877 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001878 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001879 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001880
1881 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001882
1883 /* 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 +07001884 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001885 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1886 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1887 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001888
1889 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001890}
1891
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001892/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1893 freed and no longer available. Trigger it by sending DL blocks and never DL
1894 ACKing the data (which are requested through RRBP) */
1895testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1896 var PCUIF_info_ind info_ind;
1897 var RlcmacDlBlock dl_block;
1898 var octetstring data1 := f_rnd_octstring(1000);
1899 var octetstring data2 := f_rnd_octstring(10);
1900 var uint32_t dl_fn;
1901 var template (value) TsTrxBtsNum nr;
1902 var BTS_PDTCH_Block data_msg;
1903 var GprsMS ms;
1904 const integer N3105_MAX := 2;
1905 var integer N3105 := 0;
1906 timer T_3195 := 1.0;
1907 var integer num_poll_recv := 0;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001908 var template RlcmacDlBlock dl_block_exp;
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001909
1910 /* Initialize NS/BSSGP side */
1911 f_init_bssgp();
1912 /* Initialize GPRS MS side */
1913 f_init_gprs_ms();
1914 ms := g_ms[0]; /* We only use first MS in this test */
1915
1916 /* Initialize the PCU interface abstraction */
1917 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1918 /* Speedup test: */
1919 info_ind.n3105 := N3105_MAX;
1920 info_ind.t3195 := 1;
1921 f_init_raw(testcasename(), info_ind);
1922
1923 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1924 * MS and retransmitted after the TBF is released and later on created
1925 * (because the MS is reused) */
1926 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1927
1928 /* Establish BSSGP connection to the PCU */
1929 f_bssgp_establish();
1930 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1931
1932 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1933 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1934 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1935
1936 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1937 f_sleep(X2002);
1938
1939 /* Now we go on receiving DL data and not answering RRBP: */
1940 nr := ts_TsTrxBtsNum;
1941 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1942 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1943 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1944 block_nr := nr.blk_nr));
1945 alt {
1946 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1947 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1948 tr_RLCMAC_DATA)) -> value data_msg {
1949 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1950 if (num_poll_recv == 0) {
1951 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1952 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1953 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1954 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1955 } else {
1956 log("Ignoring RRBP ", num_poll_recv);
1957 N3105 := N3105 + 1;
1958 }
1959 num_poll_recv := num_poll_recv + 1;
1960 }
1961
1962 nr := ts_TsTrxBtsNum;
1963 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1964 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1965 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1966 block_nr := nr.blk_nr));
1967 repeat;
1968 }
1969 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001970 * RELEASE state so no data for it is tx'ed, hence the dummy/idle blocks:
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001971 */
1972 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1973 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1974 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1975 if (not T_3195.running) {
1976 T_3195.start;
1977 /* We even send some new data, nothing should be sent to MS */
1978 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1979 }
1980 nr := ts_TsTrxBtsNum;
1981 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1982 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1983 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1984 block_nr := nr.blk_nr));
1985 repeat;
1986 }
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001987 [mp_osmo_pcu_newer_than_0_9_0 and N3105 == N3105_MAX]
1988 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1989 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1990 omit)) -> value data_msg {
1991 /* We may already receive idle blocks before our own TTCN3 timer
1992 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
1993 nr := ts_TsTrxBtsNum;
1994 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1995 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1996 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1997 block_nr := nr.blk_nr));
1998 repeat;
1999 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002000 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002001 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002002 /* Done in alt, wait for pending RTS initiated previously in
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02002003 * above case before continuing (expect empty blocks on new
2004 * versions, Dummy block on older versions): */
2005 if (mp_osmo_pcu_newer_than_0_9_0) {
2006 dl_block_exp := omit;
2007 } else {
2008 dl_block_exp := tr_RLCMAC_DUMMY_CTRL;
2009 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002010 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2011 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02002012 dl_block_exp));
2013 }
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002014 [] BTS.receive {
2015 setverdict(fail, "Unexpected BTS message");
2016 f_shutdown(__BFILE__, __LINE__);
2017 }
2018 }
2019
2020 /* after T_3195 timeout, TBF is released */
2021 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
2022 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2023
2024 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2025 f_sleep(X2002);
2026 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
2027
2028 /* ACK the DL block */
2029 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2030 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2031 f_dl_block_ack_fn(dl_block, dl_fn));
2032
2033 f_shutdown(__BFILE__, __LINE__, final := true);
2034}
2035
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002036/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
2037testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002038 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002039 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002040 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002041 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002042
2043 /* Initialize NS/BSSGP side */
2044 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002045 /* Initialize GPRS MS side */
2046 f_init_gprs_ms();
2047 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002048
2049 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002050 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002051
2052 /* Establish BSSGP connection to the PCU */
2053 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002054 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002055
2056 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002057 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002058
2059 /* Send one UL block (with TLLI since we are in One-Phase Access
2060 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002061 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002062 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002063 f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002064 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2065 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002066 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002067
2068 /* Send enough blocks to test whole procedure: Until Nth block
2069 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
2070 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002071 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002072 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2073 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002074 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002075
2076 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002077 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 +07002078
2079 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002080}
2081
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002082/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
2083testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
2084 var RlcmacDlBlock dl_block;
2085 var uint32_t dl_fn, sched_fn;
2086 var octetstring payload;
2087 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002088 var template (value) LlcBlockHdr blk_hdr;
2089 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002090 var integer blk_len;
2091 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002092 var GprsMS ms;
2093
2094 /* Initialize NS/BSSGP side */
2095 f_init_bssgp();
2096 /* Initialize GPRS MS side */
2097 f_init_gprs_ms();
2098 ms := g_ms[0]; /* We only use first MS in this test */
2099
2100 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002101 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002102
2103 /* Establish BSSGP connection to the PCU */
2104 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002105 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002106
2107 /* Establish an Uplink TBF */
2108 f_ms_establish_ul_tbf(ms);
2109
2110 /* Send one UL block (with TLLI since we are in One-Phase Access
2111 contention resoultion) and make sure it is ACKED fine. */
2112 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002113 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2114 more := false, e := true);
2115 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002116 /* 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 +01002117 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
2118 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002119 cv := 15,
2120 bsn := ms.ul_tbf.bsn,
2121 blocks := blocks,
2122 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002123 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002124 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002125
2126 /* ACK and check it was received fine */
2127 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2128 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2129 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2130 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002131 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 +02002132
2133 /* Test sending LLC PDUS of incrementing size */
2134 var integer max_size := 49;
2135 for (var integer i := 1; i <= max_size; i := i + 1) {
2136 var integer cv;
2137 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
2138 log("Sending DATA.ind with LLC payload size ", i);
2139 if (i < max_size - g_bs_cv_max) {
2140 cv := 15;
2141 } else {
2142 cv := max_size - i;
2143 }
2144
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002145 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
2146 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002147 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002148 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2149 more := false, e := true);
2150 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002151 /* 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 +01002152 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
2153 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002154 cv := cv,
2155 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002156 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002157 f_ultbf_inc_bsn(ms.ul_tbf);
2158 f_ms_tx_ul_block(ms, ul_data);
2159
2160 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002161 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 +02002162
2163 /* we will receive UL ACK/NACK from time to time, handle it. */
2164 f_rx_rlcmac_dl_block(dl_block, dl_fn);
2165 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
2166 continue;
2167 }
2168 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2169 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2170 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2171 f_shutdown(__BFILE__, __LINE__);
2172 }
2173
2174 log("Rx Packet Uplink ACK / NACK");
2175 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2176 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2177 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2178 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002179
2180 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002181}
2182
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002183function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2184 var octetstring payload;
2185 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002186 var template (value) LlcBlockHdr blk_hdr;
2187 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002188 var integer block_len, max_valid_data_len;
2189 timer T;
2190
2191 block_len := f_rlcmac_cs_mcs2block_len(cs);
2192 /* We need to send with TLLI since we are in One-Phase Access Contenion
2193 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
2194 * indicator, -1 for spare bits octet at the end */
2195 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2196 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 +07002197 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2198 more := false, e := true);
2199 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002200 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2201 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002202 cv := cv,
2203 bsn := ms.ul_tbf.bsn,
2204 blocks := blocks,
2205 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002206 f_ultbf_inc_bsn(ms.ul_tbf);
2207 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2208
2209 T.start(0.5);
2210 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002211 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002212 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2213 f_shutdown(__BFILE__, __LINE__);
2214 }
2215 [] T.timeout {
2216 setverdict(pass);
2217 }
2218 }
2219}
2220/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2221 blocks intentionally contain last byte of data placed in last byte of RLC
2222 containing padding/spare bits, which is incorrect. Spare bits exist and are
2223 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2224 discounting padding in octet" */
2225testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2226 var GprsMS ms;
2227 var integer block_len, max_valid_data_len;
2228
2229 /* Initialize NS/BSSGP side */
2230 f_init_bssgp();
2231 /* Initialize GPRS MS side */
2232 f_init_gprs_ms();
2233 ms := g_ms[0]; /* We only use first MS in this test */
2234
2235 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002236 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002237
2238 /* Establish BSSGP connection to the PCU */
2239 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002240 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002241
2242 /* Establish an Uplink TBF */
2243 f_ms_establish_ul_tbf(ms);
2244
2245 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2246 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2247 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2248
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002249 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002250}
2251
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002252/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2253 * answered, so TBFs for uplink and later for downlink are created.
2254 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002255private 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 +02002256 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002257 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002258 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002259 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002260 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002261
2262 /* Initialize NS/BSSGP side */
2263 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002264 /* Initialize GPRS MS side */
2265 f_init_gprs_ms();
2266 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002267
2268 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002269 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002270
2271 /* Establish BSSGP connection to the PCU */
2272 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002273 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002274
2275 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002276 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002277
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002278 /* Send one UL block (with TLLI since we are in One-Phase Access
2279 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002280 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002281 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2282 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002283 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002284
2285 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002286 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002287
2288 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002289 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2290 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002291
2292 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2293 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002294 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002295
2296 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002297 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2298 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2299 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002300
2301 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002302}
2303
2304/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2305 * answered, so TBFs for uplink and later for downlink are created.
2306 */
2307testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002308 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002309 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002310}
2311
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002312/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2313 * answered, so TBFs for uplink and later for downlink are created.
2314 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002315private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2316 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002317 template (present) CodingScheme exp_ul_cs_mcs := ?,
2318 template (present) CodingScheme exp_dl_cs_mcs := ?)
2319runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002320 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002321 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002322 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002323 var uint32_t sched_fn;
2324 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002325 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002326 var GprsMS ms;
2327
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002328 /* Initialize NS/BSSGP side */
2329 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002330 /* Initialize GPRS MS side */
2331 f_init_gprs_ms();
2332 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002333
2334 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002335 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002336
2337 /* Establish BSSGP connection to the PCU */
2338 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002339 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002340
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002341 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2342 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 +02002343
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002344 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2345 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 +02002346 f_shutdown(__BFILE__, __LINE__);
2347 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002348
2349 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2350 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002351 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002352
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002353 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002354 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 +02002355
2356 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002357 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002358
2359 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002360 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002361 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2362 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002363 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002364 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002365 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002366
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002367 /* PCU acks the UL data after having received CV=0) */
2368 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2369
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002370 /* 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 +02002371 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 +02002372
2373 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002374 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2375 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 +02002376 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002377
2378 f_shutdown(__BFILE__, __LINE__, final := true);
2379}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002380
2381testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002382 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2383 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002384
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002385 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 +02002386}
2387
2388testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002389 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2390 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002391
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002392 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 +02002393}
2394
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002395testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2396 /* Configure PCU to force two phase access */
2397 g_force_two_phase_access := true;
2398
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002399 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002400 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002401
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002402 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 +02002403}
2404
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002405/* Test scenario where SGSN wants to send some data against MS and it is
2406 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2407 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002408private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2409 template (present) CodingScheme exp_cs_mcs := ?)
2410runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002411 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002412 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002413 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002414 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002415 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002416
2417 /* Initialize NS/BSSGP side */
2418 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002419 /* Initialize GPRS MS side */
2420 f_init_gprs_ms();
2421 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002422
2423 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002424 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002425
2426 /* Establish BSSGP connection to the PCU */
2427 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002428 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002429
2430 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002431 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2432 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002433
2434 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2435 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002436 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002437
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002438 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002439 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2440 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 +02002441 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002442
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002443 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002444 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002445
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002446 /* Send one UL block (with TLLI since we are in One-Phase Access
2447 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002448 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002449 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2450 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002451 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002452
2453 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002454 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002455
2456 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002457}
2458
2459testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002460 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002461 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2462}
2463
2464/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2465/* information about the MS */
2466testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002467 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002468 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002469}
2470
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002471/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2472 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2473 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2474 * be transferred).
2475 */
2476testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002477 var RlcmacDlBlock dl_block;
2478 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002479 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002480 var octetstring total_payload;
2481 var octetstring payload;
2482 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002483 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002484 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002485 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002486
2487 /* Initialize NS/BSSGP side */
2488 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002489 /* Initialize GPRS MS side */
2490 f_init_gprs_ms();
2491 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002492
2493 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002494 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002495
2496 /* Establish BSSGP connection to the PCU */
2497 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002498 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002499
2500 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002501 f_ms_establish_ul_tbf(ms);
2502 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002503
2504 /* Send one UL block (with TLLI since we are in One-Phase Access
2505 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002506 payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002507 f_ms_tx_ul_data_block(ms, payload, cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002508
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002509 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2510 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002511 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002512 total_payload := payload;
2513
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002514 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2515
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002516 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002517 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002518 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002519 total_payload := total_payload & payload;
2520
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002521 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002522 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002523 total_payload := total_payload & payload;
2524
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002525 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002526 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 +02002527 total_payload := total_payload & lost_payload;
2528
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002529 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002530 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002531 total_payload := total_payload & payload;
2532
2533 /* 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 +02002534 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002535
2536 /* On CV=0, we'll receive a UL ACK asking about missing block */
2537 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2538 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002539 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2540 tfi := tfi,
2541 cv := 15,
2542 bsn := 3,
2543 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002544 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002545
2546 /* Now final ack is recieved */
2547 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2548 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002549 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002550
2551 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002552 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 +07002553
2554 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002555}
2556
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002557/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2558 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2559 * timeout occurs (specified by sent RRBP on DL block). */
2560testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002561 var RlcmacDlBlock dl_block;
2562 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002563 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002564 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002565
2566 /* Initialize NS/BSSGP side */
2567 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002568 /* Initialize GPRS MS side */
2569 f_init_gprs_ms();
2570 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002571
2572 /* Initialize the PCU interface abstraction */
2573 f_init_raw(testcasename());
2574
2575 /* Establish BSSGP connection to the PCU */
2576 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002577 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002578
2579 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002580 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2581 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002582
2583 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2584 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002585 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002586
2587 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2588 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2589 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002590 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002591
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002592 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2593 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002594 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002595
2596 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002597 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2598 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2599 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002600
2601 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002602}
2603
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002604/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2605testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2606 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2607 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002608 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002609 var RlcmacDlBlock dl_block;
2610 var uint32_t ack_fn;
2611 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002612 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002613 timer T := 5.0;
2614
2615 /* Initialize NS/BSSGP side */
2616 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002617 /* Initialize GPRS MS side */
2618 f_init_gprs_ms();
2619 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002620
2621 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002622 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002623
Daniel Willmann535aea62020-09-21 13:27:08 +02002624 f_statsd_reset();
2625
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002626 /* Establish BSSGP connection to the PCU */
2627 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002628 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002629
2630 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002631 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2632 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002633
2634 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2635 f_sleep(X2002);
2636
2637 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2638 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002639 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002640
2641 /* TDMA frame number on which we are supposed to send the ACK */
2642 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2643
2644 /* SGSN sends more blocks during the indicated RRBP */
2645 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2646 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002647 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002648
2649 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2650
2651 /* Make sure this block has the same TFI as was assigned
2652 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002653 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002654 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2655 dl_block.data.mac_hdr.hdr_ext.tfi);
2656 f_shutdown(__BFILE__, __LINE__);
2657 }
2658
2659 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002660 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002661
2662 /* Break if this is the end of RRBP */
2663 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002664 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002665 break;
2666 }
2667 }
2668
2669 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002670 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 +07002671
2672 /* Make sure that the next block (after the Ack) is dummy */
2673 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2674
Daniel Willmann535aea62020-09-21 13:27:08 +02002675 var StatsDExpects expect := {
2676 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2677 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2678 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2679 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2680 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002681 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002682 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2683 };
2684 f_statsd_expect(expect);
2685
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002686 f_shutdown(__BFILE__, __LINE__, final := true);
2687}
2688
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002689/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2690 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2691 * Check "3GPP TS 44.060" Annex B. */
2692testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2693 var RlcmacDlBlock dl_block;
2694 var octetstring dataA := f_rnd_octstring(20);
2695 var octetstring dataB := f_rnd_octstring(13);
2696 var octetstring dataC := f_rnd_octstring(3);
2697 var octetstring dataD := f_rnd_octstring(12);
2698 var uint32_t sched_fn;
2699 var GprsMS ms;
2700 var template (value) RlcmacUlBlock ul_data;
2701
2702 /* Initialize NS/BSSGP side */
2703 f_init_bssgp();
2704 /* Initialize GPRS MS side */
2705 f_init_gprs_ms();
2706 ms := g_ms[0]; /* We only use first MS in this test */
2707
2708 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002709 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002710
2711 /* Establish BSSGP connection to the PCU */
2712 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002713 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002714
2715 /* Establish an Uplink TBF */
2716 f_ms_establish_ul_tbf(ms);
2717
2718 /* Summary of what's transmitted:
2719 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2720 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2721 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2722 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2723 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2724 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2725 */
2726
2727 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002728 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2729 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002730 cv := 3,
2731 bsn := ms.ul_tbf.bsn,
2732 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2733 tlli := ms.tlli);
2734 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2735 * RLCMAC block being sent. */
2736 ul_data.data.mac_hdr.e := true;
2737 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002738 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002739
2740 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002741 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2742 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002743 cv := 2,
2744 bsn := ms.ul_tbf.bsn,
2745 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2746 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2747 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2748 },
2749 tlli := ms.tlli);
2750 f_ultbf_inc_bsn(ms.ul_tbf);
2751 f_ms_tx_ul_block(ms, ul_data);
2752
2753 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002754 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 +02002755
2756 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002757 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2758 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002759 cv := 1,
2760 bsn := ms.ul_tbf.bsn,
2761 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2762 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2763 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2764 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2765 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2766 },
2767 tlli := ms.tlli);
2768 f_ultbf_inc_bsn(ms.ul_tbf);
2769 f_ms_tx_ul_block(ms, ul_data);
2770
2771 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002772 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2773 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 +02002774
2775 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002776 ul_data := t_RLCMAC_UL_DATA_TLLI(
2777 cs := CS_1,
2778 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002779 cv := 0,
2780 bsn := ms.ul_tbf.bsn,
2781 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2782 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2783 },
2784 tlli := ms.tlli);
2785 f_ultbf_inc_bsn(ms.ul_tbf);
2786 f_ms_tx_ul_block(ms, ul_data);
2787
2788 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002789 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 +02002790
2791 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2792 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2793 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2794
2795 f_shutdown(__BFILE__, __LINE__, final := true);
2796}
2797
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002798/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2799 * ACK/NACK is not answered */
2800testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2801 var RlcmacDlBlock dl_block;
2802 var octetstring data1 := f_rnd_octstring(200);
2803 var octetstring data2 := f_rnd_octstring(10);
2804 var uint32_t dl_fn;
2805 var GprsMS ms;
2806 var template (value) TsTrxBtsNum nr;
2807 var BTS_PDTCH_Block data_msg;
2808
2809 /* Initialize NS/BSSGP side */
2810 f_init_bssgp();
2811 /* Initialize GPRS MS side */
2812 f_init_gprs_ms();
2813 ms := g_ms[0]; /* We only use first MS in this test */
2814
2815 /* Initialize the PCU interface abstraction */
2816 f_init_raw(testcasename())
2817
2818 /* Establish BSSGP connection to the PCU */
2819 f_bssgp_establish();
2820 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2821
2822 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2823 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2824 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2825
2826 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2827 f_sleep(X2002);
2828
2829 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2830 while (true) {
2831 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2832
2833 /* Keep Ack/Nack description updated (except for last BSN) */
2834 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2835
2836 if (f_dl_block_rrbp_valid(dl_block)) {
2837 /* Don't transmit DL ACK here on purpose ignore it */
2838 break;
2839 }
2840 }
2841
2842 /* PCU starts whole process again */
2843 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2844
2845 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2846 f_sleep(X2002);
2847
2848 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2849 /* DL data), after that we receive only DUMMY blocks so we are done */
2850 var boolean data_received := false;
2851 nr := ts_TsTrxBtsNum;
2852 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2853 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2854 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2855 block_nr := nr.blk_nr));
2856 alt {
2857 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2858 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2859 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2860 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2861 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2862 tr_RLCMAC_DATA)) -> value data_msg {
2863 data_received := true;
2864 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2865 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2866 log("Received FINAL_ACK");
2867 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2868 }
2869 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2870 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2871 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2872 }
2873 nr := ts_TsTrxBtsNum;
2874 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2875 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2876 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2877 block_nr := nr.blk_nr));
2878 repeat;
2879 }
2880 [] BTS.receive {
2881 setverdict(fail, "Unexpected BTS message");
2882 f_shutdown(__BFILE__, __LINE__);
2883 }
2884 }
2885
2886 f_shutdown(__BFILE__, __LINE__, final := true);
2887}
2888
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002889/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2890testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002891 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002892 var octetstring data := f_rnd_octstring(10);
2893 var PacketDlAssign dl_tbf_ass;
2894 var RlcmacDlBlock dl_block;
2895 var uint32_t poll_fn;
2896 var uint32_t sched_fn;
2897 var GprsMS ms;
2898 timer T := 5.0;
2899
2900 /* Initialize NS/BSSGP side */
2901 f_init_bssgp();
2902 /* Initialize GPRS MS side */
2903 f_init_gprs_ms();
2904 ms := g_ms[0]; /* We only use first MS in this test */
2905
2906 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002907 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2908 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002909
2910 /* Initialize the PCU interface abstraction */
2911 f_init_raw(testcasename(), info_ind);
2912
2913 /* Establish BSSGP connection to the PCU */
2914 f_bssgp_establish();
2915 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2916
2917 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2918 through PDCH (no multiblock assignment possible through PCH) */
2919 f_ms_establish_ul_tbf(ms);
2920
2921 /* Send one UL block (with TLLI since we are in One-Phase Access
2922 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002923 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
2924 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002925 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2926 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2927
2928 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2929 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2930 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2931 gprsextendeddynalloccap := '0'B
2932 };
2933 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2934 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2935 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2936 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2937 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2938 f_shutdown(__BFILE__, __LINE__);
2939 }
2940 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2941
2942 f_shutdown(__BFILE__, __LINE__, final := true);
2943}
2944
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002945testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002946 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002947 var RlcmacDlBlock dl_block;
2948 var octetstring data := f_rnd_octstring(10);
2949 var PollFnCtx pollctx;
2950 var uint32_t sched_fn;
2951 var GprsMS ms;
2952
2953 var MultislotCap_GPRS mscap_gprs := {
2954 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2955 gprsextendeddynalloccap := '0'B
2956 };
2957 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2958
2959
2960 /* Initialize NS/BSSGP side */
2961 f_init_bssgp();
2962 /* Initialize GPRS MS side */
2963 f_init_gprs_ms();
2964 ms := g_ms[0]; /* We only use first MS in this test */
2965
2966 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002967 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2968 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002969
2970 /* Initialize the PCU interface abstraction */
2971 f_init_raw(testcasename(), info_ind);
2972
2973 /* Establish BSSGP connection to the PCU */
2974 f_bssgp_establish();
2975 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2976
2977 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
2978 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
2979
2980 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
2981 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
2982
2983 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2984 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2985 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2986 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2987 f_shutdown(__BFILE__, __LINE__);
2988 }
2989 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2990
2991 f_shutdown(__BFILE__, __LINE__, final := true);
2992}
2993
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01002994testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
2995 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
2996 var RlcmacDlBlock dl_block;
2997 var octetstring data := f_rnd_octstring(10);
2998 var PollFnCtx pollctx;
2999 var uint32_t sched_fn;
3000 var GprsMS ms;
3001
3002 var MultislotCap_GPRS mscap_gprs := {
3003 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3004 gprsextendeddynalloccap := '0'B
3005 };
3006 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3007
3008
3009 /* Initialize NS/BSSGP side */
3010 f_init_bssgp();
3011 /* Initialize GPRS MS side */
3012 f_init_gprs_ms();
3013 ms := g_ms[0]; /* We only use first MS in this test */
3014
3015 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003016 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3017 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003018
3019 /* Initialize the PCU interface abstraction */
3020 f_init_raw(testcasename(), info_ind);
3021
3022 /* Establish BSSGP connection to the PCU */
3023 f_bssgp_establish();
3024 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3025
3026 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3027 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3028
3029 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
3030 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
3031 f_shutdown(__BFILE__, __LINE__);
3032 }
3033
3034 f_shutdown(__BFILE__, __LINE__, final := true);
3035}
3036
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003037/* Test scenario where MS wants to request a new TBF once the current one is
3038 * ending, by means of sending a Packet Resource Request on ul slot provided by
3039 * last Pkt Ul ACK's RRBP.
3040 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3041testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003042 var RlcmacDlBlock dl_block;
3043 var octetstring data := f_rnd_octstring(10);
3044 var uint32_t sched_fn;
3045 var uint32_t dl_fn;
3046 var template RlcmacDlBlock acknack_tmpl;
3047 var GprsMS ms;
3048
3049 /* Initialize NS/BSSGP side */
3050 f_init_bssgp();
3051 /* Initialize GPRS MS side */
3052 f_init_gprs_ms();
3053 ms := g_ms[0]; /* We only use first MS in this test */
3054
3055 /* Initialize the PCU interface abstraction */
3056 f_init_raw(testcasename());
3057
3058 /* Establish BSSGP connection to the PCU */
3059 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003060 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003061
3062 /* Establish an Uplink TBF */
3063 f_ms_establish_ul_tbf(ms);
3064
3065 /* Send one UL block (with TLLI since we are in One-Phase Access
3066 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003067 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003068
3069 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003070 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003071
3072 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3073 tr_UlAckNackGprs(ms.tlli,
3074 tr_AckNackDescription(final_ack := '1'B),
3075 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3076 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3077
3078 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3079
3080 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07003081 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 +07003082 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003083 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3084 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3085
3086 /* Send one UL block (without TLLI since we are in Second-Phase Access)
3087 and make sure it is ACKED fine */
3088 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
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 Pedrolcdbe9032020-07-07 20:20:42 +02003092
3093 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3094 /* ACK the ACK */
3095 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3096
3097 f_shutdown(__BFILE__, __LINE__, final := true);
3098}
3099
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003100/* Test scenario where MS wants to request a new TBF once the current one is
3101 * ending, by means of sending a Packet Resource Request on ul slot provided by
3102 * last Pkt Ul ACK's RRBP. new Pkt Ul Ass is never confirmed by the MS in this test.
3103 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3104testcase TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() runs on RAW_PCU_Test_CT {
3105 var PCUIF_info_ind info_ind;
3106 var RlcmacDlBlock dl_block;
3107 var octetstring data := f_rnd_octstring(10);
3108 var uint32_t sched_fn;
3109 var uint32_t dl_fn;
3110 var template (value) TsTrxBtsNum nr;
3111 var BTS_PDTCH_Block data_msg;
3112 var template RlcmacDlBlock acknack_tmpl;
3113 var GprsMS ms;
3114 const integer N3105_MAX := 2;
3115 var integer N3105 := 0;
3116 timer T_3195 := 1.0 + 0.5; /* 0.5: extra offset since we cannot match exactly */
3117
3118 /* Initialize NS/BSSGP side */
3119 f_init_bssgp();
3120 /* Initialize GPRS MS side */
3121 f_init_gprs_ms();
3122 ms := g_ms[0]; /* We only use first MS in this test */
3123
3124 /* Initialize the PCU interface abstraction */
3125 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3126 /* Speedup test: */
3127 info_ind.n3105 := N3105_MAX;
3128 info_ind.t3195 := 1;
3129 f_init_raw(testcasename(), info_ind);
3130
3131 /* Establish BSSGP connection to the PCU */
3132 f_bssgp_establish();
3133 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3134
3135 /* Establish an Uplink TBF */
3136 f_ms_establish_ul_tbf(ms);
3137
3138 /* Send one UL block (with TLLI since we are in One-Phase Access
3139 contention resoultion) and make sure it is ACKED fine */
3140 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
3141
3142 /* UL block should be received in SGSN */
3143 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
3144
3145 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3146 tr_UlAckNackGprs(ms.tlli,
3147 tr_AckNackDescription(final_ack := '1'B),
3148 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3149 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3150
3151 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3152
3153 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
3154 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)), sched_fn);
3155
3156 /* Now Keep ignoring the Pkt Ul Ass on PACCH: */
3157 /* Now we go on receiving DL data and not answering RRBP: */
3158 nr := ts_TsTrxBtsNum;
3159 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3160 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3161 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3162 block_nr := nr.blk_nr));
3163 alt {
3164 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3165 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3166 tr_RLCMAC_UL_PACKET_ASS)) -> value data_msg {
3167 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
3168 log("Ignoring RRBP N3105 ", N3105);
3169 N3105 := N3105 + 1;
3170 }
3171 nr := ts_TsTrxBtsNum;
3172 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3173 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3174 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3175 block_nr := nr.blk_nr));
3176 repeat;
3177 }
3178 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
3179 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
3180 */
3181 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3182 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3183 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
3184 if (not T_3195.running) {
3185 T_3195.start;
3186 }
3187 nr := ts_TsTrxBtsNum;
3188 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3189 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3190 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3191 block_nr := nr.blk_nr));
3192 repeat;
3193 }
3194 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3195 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3196 omit)) -> value data_msg {
3197 /* We may already receive idle blocks before our own TTCN3 timer
3198 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
3199 nr := ts_TsTrxBtsNum;
3200 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3201 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3202 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3203 block_nr := nr.blk_nr));
3204 repeat;
3205 }
3206 /* We receive Dummy blocks in between Pkt Ul Ass while PCU waits for us to ack it */
3207 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3208 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3209 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
3210 log("Ignoring Dummy block FN ", data_msg.raw.fn);
3211 nr := ts_TsTrxBtsNum;
3212 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3213 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3214 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3215 block_nr := nr.blk_nr));
3216 repeat;
3217 }
3218 [T_3195.running] T_3195.timeout {
3219 log("T_3195 timeout");
3220 /* Done in alt, wait for pending RTS initiated previously in
3221 * above case before continuing (expect nothing to be sent since there's no active TBF): */
3222 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3223 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3224 omit));
3225 }
3226 [] BTS.receive {
3227 setverdict(fail, "Unexpected BTS message");
3228 f_shutdown(__BFILE__, __LINE__);
3229 }
3230 }
3231
3232 f_shutdown(__BFILE__, __LINE__, final := true);
3233}
3234
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003235/* Test CS paging over the BTS<->PCU socket.
3236 * 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.
3237 * Paging should be send on the PACCH.
3238 *
3239 * 1. Send a Paging Request over PCU socket.
3240 * 2. Send a Ready-To-Send message over PCU socket
3241 * 3. Expect a Paging Frame
3242 */
3243testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003244 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003245 var MobileIdentityLV mi;
3246 var octetstring mi_enc_lv;
3247 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003248 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003249
3250 /* Initialize NS/BSSGP side */
3251 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003252 /* Initialize GPRS MS side */
3253 f_init_gprs_ms();
3254 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003255
3256 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003257 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003258
3259 /* Establish BSSGP connection to the PCU */
3260 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003261 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003262
3263 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003264 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003265
3266 /* build mobile Identity */
3267 mi := valueof(ts_MI_IMSI_LV(imsi));
3268 mi_enc_lv := enc_MobileIdentityLV(mi);
3269 /* Send paging request */
3270 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
3271 sapi :=PCU_IF_SAPI_PDTCH));
3272
3273 /* Receive it on BTS side towards MS */
3274 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3275
3276 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003277 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3278 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3279 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3280 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003281
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003282 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003283}
3284
3285/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
3286 */
3287private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3288runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003289 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003290 var hexstring imsi := f_gen_imsi(42);
3291 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003292 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003293
3294 /* Initialize NS/BSSGP side */
3295 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003296 /* Initialize GPRS MS side */
3297 f_init_gprs_ms();
3298 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003299
3300 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003301 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003302
3303 /* Establish BSSGP connection to the PCU */
3304 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003305 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003306
3307 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003308 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003309
3310 /* Send paging request with or without TMSI */
3311 if (use_ptmsi) {
3312 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3313 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3314 } else {
3315 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3316 }
3317
3318 /* Receive it on BTS side towards MS */
3319 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3320
3321 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003322 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003323 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003324 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3325 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3326 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003327 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003328 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3329 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3330 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003331 }
3332
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003333 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003334}
3335
3336testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3337 f_tc_paging_cs_from_sgsn(0, true);
3338}
3339
3340testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3341 f_tc_paging_cs_from_sgsn(0);
3342}
3343
3344testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003345 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003346}
3347
3348/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3349 */
3350private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3351runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003352 var integer imsi_suff_tx := 423;
3353 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003354 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003355
3356 /* Initialize NS/BSSGP side */
3357 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003358 /* Initialize GPRS MS side */
3359 f_init_gprs_ms();
3360 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003361
Oliver Smith61b4e732021-07-22 08:14:29 +02003362 f_statsd_reset();
3363
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003364 /* Establish BSSGP connection to the PCU */
3365 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003366 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003367
3368 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3369 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3370 if (use_ptmsi) {
3371 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3372 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3373 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3374 } else {
3375 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3376 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3377 }
3378
Oliver Smith61b4e732021-07-22 08:14:29 +02003379 if (mp_osmo_pcu_newer_than_0_9_0) {
3380 var StatsDExpects expect := {
Oliver Smith36d95d82021-08-06 22:01:53 +02003381 { name := "TTCN3.pcu.sgsn.0.rx_paging_ps", mtype := "c", min := 1, max := 1 },
3382 /* After the PCU receives the paging request from SGSN,
3383 * and it doesn't have any errors, PCU sends it to the
3384 * BTS to do paging over PCH. */
3385 { name := "TTCN3.bts.0.pch.requests", mtype := "c", min := 1, max := 1 }
Oliver Smith61b4e732021-07-22 08:14:29 +02003386 };
3387 f_statsd_expect(expect);
3388 }
Oliver Smithfbd39312021-07-27 15:23:39 +02003389}
3390
3391testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3392 /* Initialize the PCU interface abstraction */
3393 f_init_raw(testcasename());
3394
3395 f_tc_paging_ps_from_sgsn(0, true);
Oliver Smith61b4e732021-07-22 08:14:29 +02003396
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003397 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003398}
3399
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003400testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003401 /* Initialize the PCU interface abstraction */
3402 f_init_raw(testcasename());
3403
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003404 f_tc_paging_ps_from_sgsn(0);
Oliver Smithfbd39312021-07-27 15:23:39 +02003405
3406 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003407}
3408
3409testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003410 /* Initialize the PCU interface abstraction */
3411 f_init_raw(testcasename());
3412
Harald Welte5339b2e2020-10-04 22:52:56 +02003413 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Oliver Smithfbd39312021-07-27 15:23:39 +02003414
3415 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003416}
3417
Oliver Smithe1a77c42021-07-28 13:36:09 +02003418testcase TC_paging_pch_timeout() runs on RAW_PCU_Test_CT {
3419 /* Initialize the PCU interface abstraction */
3420 f_init_raw(testcasename());
3421
3422 /* Set T3113 to 1s to shorten the test duration */
3423 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 1");
3424
3425 /* Reset stats and send paging PS request */
3426 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
3427
3428 /* Verify that counter increases when T3113 times out (MS did not start
3429 * TBF to respond to paging). */
3430 f_sleep(1.2);
3431 var StatsDExpects expect := {
3432 { name := "TTCN3.bts.0.pch.requests.timeout", mtype := "c", min := 1, max := 1 }
3433 };
3434 f_statsd_expect(expect);
3435
3436 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 default");
3437 f_shutdown(__BFILE__, __LINE__, final := true);
3438}
3439
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003440/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3441testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3442 var RlcmacDlBlock dl_block;
3443 var octetstring data := f_rnd_octstring(10);
3444 var uint32_t sched_fn;
3445 var uint32_t dl_fn;
3446 var GprsMS ms;
3447
3448 /* Initialize NS/BSSGP side */
3449 f_init_bssgp();
3450 /* Initialize GPRS MS side */
3451 f_init_gprs_ms();
3452 ms := g_ms[0]; /* We only use first MS in this test */
3453
3454 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003455 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003456
Daniel Willmann535aea62020-09-21 13:27:08 +02003457 f_statsd_reset();
3458
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003459 /* Establish BSSGP connection to the PCU */
3460 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003461 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003462
3463 /* Establish an Uplink TBF */
3464 f_ms_establish_ul_tbf(ms);
3465
3466 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003467 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003468 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3469 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3470 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3471
3472 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003473 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003474
3475 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3476 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3477 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3478
3479 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3480 f_sleep(X2002);
3481 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3482
3483 /* ACK the DL block */
3484 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3485 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3486 f_dl_block_ack_fn(dl_block, dl_fn));
3487
Daniel Willmann535aea62020-09-21 13:27:08 +02003488 var StatsDExpects expect := {
3489 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3490 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3491 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3492 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003493 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003494 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003495 };
3496 f_statsd_expect(expect);
3497
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003498 f_shutdown(__BFILE__, __LINE__, final := true);
3499}
3500
3501/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3502testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3503 var RlcmacDlBlock dl_block;
3504 var octetstring data := f_rnd_octstring(10);
3505 var uint32_t sched_fn;
3506 var uint32_t dl_fn;
3507 var GprsMS ms;
3508
3509 /* Initialize NS/BSSGP side */
3510 f_init_bssgp();
3511 /* Initialize GPRS MS side */
3512 f_init_gprs_ms();
3513 ms := g_ms[0]; /* We only use first MS in this test */
3514
3515 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003516 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003517
3518 /* Establish BSSGP connection to the PCU */
3519 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003520 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003521
3522 /* Establish an Uplink TBF */
3523 f_ms_establish_ul_tbf(ms);
3524
3525 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003526 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003527 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3528 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3529 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3530
3531 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003532 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003533
3534 /* Now SGSN sends some DL data with an invalid IMSI */
3535 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3536
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003537 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003538
3539 /* TODO: make sure no data is sent over PCU -> MS */
3540
3541 f_shutdown(__BFILE__, __LINE__, final := true);
3542}
3543
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003544private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3545 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3546 var octetstring data := f_rnd_octstring(6);
3547 var RlcmacDlBlock dl_block;
3548 var GprsMS ms;
3549 var uint32_t fn;
3550
3551 /* Initialize NS/BSSGP side */
3552 f_init_bssgp();
3553 /* Initialize GPRS MS side */
3554 f_init_gprs_ms();
3555 ms := g_ms[0]; /* We only use first MS in this test */
3556
3557 /* Initialize the PCU interface abstraction */
3558 f_init_raw(testcasename());
3559
3560 /* Establish BSSGP connection to the PCU */
3561 f_bssgp_establish();
3562 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3563
3564 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3565 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3566 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3567
3568 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3569 f_sleep(X2002);
3570
3571 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3572 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3573
3574 if (ischosen(dl_block.data_egprs)) {
3575 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3576 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3577 f_shutdown(__BFILE__, __LINE__);
3578 }
3579 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3580 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3581 f_shutdown(__BFILE__, __LINE__);
3582 }
3583 if (not match(dl_block.data_egprs.blocks[1].payload,
3584 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3585 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3586 f_shutdown(__BFILE__, __LINE__);
3587 }
3588 } else if (lengthof(dl_block.data.blocks) > 1) {
3589 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3590 f_shutdown(__BFILE__, __LINE__);
3591 }
3592
3593 f_shutdown(__BFILE__, __LINE__, final := true);
3594}
3595
3596/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3597 * containing llc data. See OS#4849 */
3598testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3599 f_tc_dl_data_no_llc_ui_dummy(omit);
3600}
3601
3602/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3603 * containing llc data. See OS#4849 */
3604testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003605 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003606}
3607
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003608private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003609 template GsmRrMessage t_imm_ass := ?,
3610 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003611runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003612 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003613 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003614
3615 ra11 := enc_EGPRSPktChRequest2uint(req);
3616 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3617
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003618 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003619 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003620 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003621 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003622 }
3623
3624 setverdict(pass);
3625}
3626
3627testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3628 var template GsmRrMessage imm_ass;
3629 var template IaRestOctets rest;
3630 var template EgprsUlAss ul_ass;
3631
3632 /* Initialize the PCU interface abstraction */
3633 f_init_raw(testcasename());
3634
3635 var EGPRSPktChRequest req := {
3636 /* NOTE: other fields are set in the loop */
3637 signalling := { tag := '110011'B }
3638 };
3639
3640 for (var integer i := 0; i < 6; i := i + 1) {
3641 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3642 req.signalling.random_bits := ext_ra;
3643
3644 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3645 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3646 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3647 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3648
3649 f_TC_egprs_pkt_chan_req(req, imm_ass);
3650 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003651
3652 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003653}
3654
3655testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3656 var template GsmRrMessage imm_ass;
3657 var template IaRestOctets rest;
3658 var template EgprsUlAss ul_ass;
3659
3660 /* Initialize the PCU interface abstraction */
3661 f_init_raw(testcasename());
3662
3663 var EGPRSPktChRequest req := {
3664 /* NOTE: other fields are set in the loop */
3665 one_phase := { tag := '0'B }
3666 };
3667
3668 for (var integer i := 0; i < 6; i := i + 1) {
3669 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3670 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3671 var BIT2 priority := substr(ext_ra, 0, 2);
3672 var BIT3 rand := substr(ext_ra, 2, 3);
3673
3674 req.one_phase.multislot_class := mslot_class;
3675 req.one_phase.priority := priority;
3676 req.one_phase.random_bits := rand;
3677
3678 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3679 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3680 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3681 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3682
3683 f_TC_egprs_pkt_chan_req(req, imm_ass);
3684 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003685
3686 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003687}
3688
3689testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3690 var template GsmRrMessage imm_ass;
3691 var template IaRestOctets rest;
3692 var template EgprsUlAss ul_ass;
3693
3694 /* Initialize the PCU interface abstraction */
3695 f_init_raw(testcasename());
3696
3697 var EGPRSPktChRequest req := {
3698 /* NOTE: other fields are set in the loop */
3699 two_phase := { tag := '110000'B }
3700 };
3701
3702 for (var integer i := 0; i < 6; i := i + 1) {
3703 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3704 var BIT2 priority := substr(ext_ra, 0, 2);
3705 var BIT3 rand := substr(ext_ra, 2, 3);
3706
3707 req.two_phase.priority := priority;
3708 req.two_phase.random_bits := rand;
3709
3710 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3711 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3712 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3713 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3714
3715 f_TC_egprs_pkt_chan_req(req, imm_ass);
3716 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003717
3718 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003719}
3720
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003721private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3722 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003723 PCUIF_BurstType bt := BURST_TYPE_1,
3724 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003725runs on RAW_PCU_Test_CT {
3726 var template ReqRefWaitInd tr_ref;
3727 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003728
3729 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3730 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3731 ra := bit2int(ra11), is_11bit := 1,
3732 burst_type := bt, fn := fn,
3733 arfcn := 871));
3734
3735 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003736 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003737
3738 /* Just to have a short-name reference to the actual message */
3739 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3740
3741 /* Make sure that Request Reference list contains at least one entry
3742 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003743 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003744 if (not match(iar.payload, { *, tr_ref, * })) {
3745 setverdict(fail, "Request Reference list does not match");
3746 f_shutdown(__BFILE__, __LINE__);
3747 }
3748
3749 /* Match Feature Indicator (must indicate PS domain) */
3750 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3751 setverdict(fail, "Feature Indicator does not match");
3752 f_shutdown(__BFILE__, __LINE__);
3753 }
3754
3755 /* Match IAR Rest Octets */
3756 if (not match(iar.rest_octets, rest)) {
3757 setverdict(fail, "IAR Rest Octets does not match: ",
3758 iar.rest_octets, " vs expected ", rest);
3759 f_shutdown(__BFILE__, __LINE__);
3760 }
3761
3762 setverdict(pass);
3763}
3764
3765/* Verify the contents of RR Immediate Assignment Reject message and its
3766 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3767testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3768 var template IARRestOctets rest;
3769 var BIT5 ext_ra;
3770
3771 /* Initialize the PCU interface abstraction */
3772 f_init_raw(testcasename());
3773
3774 for (var integer i := 0; i < 6; i := i + 1) {
3775 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3776 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3777
3778 /* Intentionally incorrect message (see table 11.2.5a.2) */
3779 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3780 }
3781
3782 f_shutdown(__BFILE__, __LINE__, final := true);
3783}
3784
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003785/* At the moment, the IUT does not support any emergency services. Make sure
3786 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3787testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3788 var template IARRestOctets rest;
3789 var BIT5 ext_ra;
3790 var BIT11 ra11;
3791
3792 /* Initialize the PCU interface abstraction */
3793 f_init_raw(testcasename());
3794
3795 var EGPRSPktChRequest req := {
3796 /* NOTE: other fields are set in the loop */
3797 emergency := { tag := '110111'B }
3798 };
3799
3800 for (var integer i := 0; i < 6; i := i + 1) {
3801 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3802 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3803
3804 req.emergency.random_bits := ext_ra;
3805 ra11 := enc_EGPRSPktChRequest2bits(req);
3806
3807 /* Intentionally incorrect message (see table 11.2.5a.2) */
3808 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3809 }
3810
3811 f_shutdown(__BFILE__, __LINE__, final := true);
3812}
3813
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003814/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3815testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003816 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003817 var template IARRestOctets rest;
3818 var BIT11 ra11;
3819
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003820 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003821 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003822
3823 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003824 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3825 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003826
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003827 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003828 f_init_raw(testcasename(), info_ind);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003829
3830 var EGPRSPktChRequest req := {
3831 one_phase := {
3832 tag := '0'B,
3833 multislot_class := '10101'B,
3834 priority := '01'B,
3835 random_bits := '101'B
3836 }
3837 };
3838
3839 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3840 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3841 for (var integer i := 0; i < 7; i := i + 1) {
3842 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3843 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3844 }
3845
3846 ra11 := enc_EGPRSPktChRequest2bits(req);
3847 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3848
3849 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003850 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003851
3852 f_shutdown(__BFILE__, __LINE__, final := true);
3853}
3854
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003855/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003856private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003857return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07003858 /* Pick a random MA length in range 2 .. max_ma_len */
3859 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
3860
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003861 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
3862 hsn := f_rnd_int(63),
3863 maio := f_rnd_int(63),
3864 ma := f_rnd_bitstring(ma_len));
3865}
3866
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003867private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
3868 in GsmRrMessage rr_msg)
3869{
3870 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003871 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003872
3873 var template PacketChannelDescription tr_pkt_chan_desc := {
3874 channel_Type_spare := ?,
3875 tn := ?,
3876 tsc := ts.tsc,
3877 presence := '1'B,
3878 zero := omit,
3879 one := {
3880 maio := ts.maio,
3881 hsn := ts.hsn
3882 }
3883 };
3884
3885 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
3886 setverdict(fail, "Packet Channel Description does not match: ",
3887 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
3888 }
3889
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003890 /* Mobile Allocation is expected to be octet-aligned */
3891 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
3892 var template MobileAllocationLV tr_ma := {
3893 len := ma_oct_len, /* in bytes */
3894 ma := substr(ts.ma, 0, ma_oct_len * 8)
3895 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003896
3897 if (not match(ia.mobile_allocation, tr_ma)) {
3898 setverdict(fail, "Mobile Allocation does not match: ",
3899 ia.mobile_allocation, " vs ", tr_ma);
3900 }
3901
3902 setverdict(pass);
3903}
3904
3905/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
3906testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003907 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003908 var GprsMS ms := valueof(t_GprsMS_def);
3909
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003910 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003911 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003912
3913 /* Initialize the PCU interface abstraction */
3914 f_init_raw(testcasename(), info_ind);
3915
3916 /* EGPRS Packet Channel Request (cause=Signalling) */
3917 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
3918
3919 /* Establish an Uplink EGPRS TBF */
3920 f_ms_establish_ul_tbf(ms);
3921
3922 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3923 f_shutdown(__BFILE__, __LINE__, final := true);
3924}
3925
3926/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
3927testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003928 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003929 var GprsMS ms := valueof(t_GprsMS_def);
3930
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003931 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003932 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003933
3934 /* Initialize the PCU interface abstraction */
3935 f_init_raw(testcasename(), info_ind);
3936
3937 /* Establish an Uplink TBF */
3938 f_ms_establish_ul_tbf(ms);
3939
3940 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
3941 f_shutdown(__BFILE__, __LINE__, final := true);
3942}
3943
3944/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
3945testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01003946 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003947 var GprsMS ms := valueof(t_GprsMS_def);
3948
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07003949 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003950 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003951
3952 /* Initialize NS/BSSGP side */
3953 f_init_bssgp();
3954
3955 /* Initialize the PCU interface abstraction */
3956 f_init_raw(testcasename(), info_ind);
3957
3958 /* Establish BSSGP connection to the PCU */
3959 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003960 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003961
3962 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3963 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
3964 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3965
3966 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
3967 f_shutdown(__BFILE__, __LINE__, final := true);
3968}
3969
3970private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
3971 in FrequencyParameters fp)
3972{
3973 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003974 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003975
3976 /* Table 12.8.1: Frequency Parameters information elements */
3977 var template FrequencyParameters tr_fp := {
3978 tsc := ts.tsc,
3979 presence := '10'B, /* Direct encoding 1 */
3980 arfcn := omit,
3981 indirect := omit,
3982 direct1 := {
3983 maio := ts.maio,
3984 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
3985 mobile_allocation := {
3986 hsn := ts.hsn,
3987 rfl_number_list_present := '0'B,
3988 rfl_number_list := omit,
3989 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07003990 ma_length := ts.ma_bit_len,
3991 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07003992 }
3993 },
3994 direct2 := omit
3995 };
3996
3997 if (not match(fp, tr_fp)) {
3998 setverdict(fail, "Frequency Parameters IE does not match: ",
3999 fp, " vs ", tr_fp);
4000 }
4001
4002 setverdict(pass);
4003}
4004
4005/* Make sure that Packet Uplink Assignment contains hopping parameters */
4006testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004007 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004008 var GprsMS ms := valueof(t_GprsMS_def);
4009 var uint32_t poll_fn;
4010
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004011 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004012 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004013
4014 /* Initialize the PCU interface abstraction */
4015 f_init_raw(testcasename(), info_ind);
4016
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004017 /* Single block (two phase) packet access */
4018 var uint16_t ra := bit2int(chan_req_sb);
4019 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
4020
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004021 /* Establish an Uplink TBF */
4022 f_ms_establish_ul_tbf(ms);
4023
4024 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004025 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
4026 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004027
4028 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004029 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
4030 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004031
4032 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
4033 var template (omit) FrequencyParameters fp;
4034 if (ua.is_egprs == '1'B) {
4035 fp := ua.egprs.freq_par;
4036 } else {
4037 fp := ua.gprs.freq_par;
4038 }
4039
4040 /* This is an optional IE, so it's worth to check its presence */
4041 if (istemplatekind(fp, "omit")) {
4042 setverdict(fail, "Frequency Parameters IE is not present");
4043 f_shutdown(__BFILE__, __LINE__);
4044 }
4045
4046 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
4047 f_shutdown(__BFILE__, __LINE__, final := true);
4048}
4049
4050/* Make sure that Packet Downlink Assignment contains hopping parameters */
4051testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004052 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004053 var octetstring data := f_rnd_octstring(10);
4054 var GprsMS ms := valueof(t_GprsMS_def);
4055 var RlcmacDlBlock dl_block;
4056 var uint32_t poll_fn;
4057
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004058 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004059 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004060
4061 /* Initialize NS/BSSGP side */
4062 f_init_bssgp();
4063
4064 /* Initialize the PCU interface abstraction */
4065 f_init_raw(testcasename(), info_ind);
4066
4067 /* Establish BSSGP connection to the PCU */
4068 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004069 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004070
4071 /* Establish an Uplink TBF */
4072 f_ms_establish_ul_tbf(ms);
4073
4074 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004075 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004076
4077 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4078 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
4079 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4080
4081 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
4082 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4083
4084 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004085 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4086 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004087
4088 /* This is an optional IE, so it's worth to check its presence */
4089 if (not ispresent(da.freq_par)) {
4090 setverdict(fail, "Frequency Parameters IE is not present");
4091 f_shutdown(__BFILE__, __LINE__);
4092 }
4093
4094 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
4095 f_shutdown(__BFILE__, __LINE__, final := true);
4096}
4097
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004098/* Check if the IUT handles subsequent INFO.ind messages */
4099testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004100 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004101 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004102
4103 /* Initialize the PCU interface abstraction */
4104 f_init_raw(testcasename(), info_ind);
4105
4106 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
4107 for (var integer i := 0; i < 16; i := i + 1) {
4108 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004109 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004110 }
4111
4112 f_shutdown(__BFILE__, __LINE__, final := true);
4113}
4114
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004115/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
4116testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
4117 var PCUIF_info_ind info_ind;
4118 var integer i;
4119 const integer num_ms := 8;
4120
4121 /* Initialize NS/BSSGP side */
4122 f_init_bssgp();
4123 /* Initialize GPRS MS side */
4124 f_init_gprs_ms(num_ms);
4125
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01004126 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004127 /* Only the 3 first TRX are enabled. The enabled ones all have same
4128 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004129 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
4130 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
4131 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
4132 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004133
4134 /* Initialize the PCU interface abstraction */
4135 f_init_raw(testcasename(), info_ind);
4136
4137 /* Establish BSSGP connection to the PCU */
4138 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004139 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004140
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004141 /* Establish an Uplink TBF for each GprsMS instance */
4142 f_multi_ms_establish_tbf(do_activate := false);
4143
4144 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004145 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004146 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01004147 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004148 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004149 f_shutdown(__BFILE__, __LINE__);
4150 }
4151 }
4152
4153 f_shutdown(__BFILE__, __LINE__, final := true);
4154}
4155
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004156/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
4157 * downgraded to CS1-4 so that GPRS can read the USF).
4158 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
4159 */
4160testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
4161 var PCUIF_info_ind info_ind;
4162 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
4163 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004164 var uint32_t sched_fn, dl_fn, ack_fn;
4165 var octetstring data := f_rnd_octstring(10);
4166 var RlcmacDlBlock dl_block;
4167 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004168 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004169 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
4170 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
4171
4172 /* Initialize NS/BSSGP side */
4173 f_init_bssgp();
4174 /* Initialize GPRS MS side */
4175 f_init_gprs_ms(num_ms);
4176
4177 info_ind := valueof(ts_PCUIF_INFO_default);
4178 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004179 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
4180 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004181
4182 /* Initialize the PCU interface abstraction */
4183 f_init_raw(testcasename(), info_ind);
4184
4185 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
4186 g_mcs_initial_dl := 5;
4187 g_mcs_max_dl := 5;
4188 f_pcuvty_set_allowed_cs_mcs();
4189
4190 /* Establish BSSGP connection to the PCU */
4191 f_bssgp_establish();
4192 f_multi_ms_bssgp_register();
4193
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004194 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004195 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 +01004196 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
4197 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
4198 f_shutdown(__BFILE__, __LINE__);
4199 }
4200 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4201 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4202
4203 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004204 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 +01004205 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
4206 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
4207 f_shutdown(__BFILE__, __LINE__);
4208 }
4209 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4210 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4211
4212 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
4213 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4214 f_sleep(0.1);
4215 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4216 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4217 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
4218 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4219 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
4220 /* ACK the DL block */
4221 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
4222 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
4223 f_dl_block_ack_fn(dl_block, dl_fn));
4224
4225 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
4226 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4227 f_sleep(0.1);
4228 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4229 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4230 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
4231 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4232 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
4233 /* ACK the DL block */
4234 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
4235 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
4236 f_dl_block_ack_fn(dl_block, dl_fn));
4237
4238 data := f_rnd_octstring(1400);
4239 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4240 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4241
4242 for (var integer i := 0; i < 800; i := i + 1) {
4243 f_rx_rlcmac_dl_block(dl_block, dl_fn);
4244
4245 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
4246 /* No more data to receive, done */
4247 break;
4248 }
4249
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004250 usf_ms := -1;
4251
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004252 if (ischosen(dl_block.ctrl)) {
4253 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
4254 f_shutdown(__BFILE__, __LINE__);
4255 } else if (ischosen(dl_block.data_egprs)) {
4256 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
4257 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
4258 f_shutdown(__BFILE__, __LINE__);
4259 }
4260 tgt_ms := 1;
4261 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
4262 if (dl_block.data_egprs.mcs > MCS_4) {
4263 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
4264 f_shutdown(__BFILE__, __LINE__);
4265 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004266 usf_ms := 0;
4267 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004268 } else {
4269 if (dl_block.data_egprs.mcs <= MCS_4) {
4270 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
4271 f_shutdown(__BFILE__, __LINE__);
4272 }
4273 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004274 usf_ms := 1;
4275 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004276 }
4277 }
4278 } else {
4279 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
4280 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
4281 f_shutdown(__BFILE__, __LINE__);
4282 }
4283 tgt_ms := 0;
4284 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 +01004285 usf_ms := 0;
4286 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004287 } 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 +01004288 usf_ms := 1;
4289 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004290 }
4291 }
4292
4293 /* Keep Ack/Nack description updated */
4294 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
4295
4296 /* TDMA frame number on which we are supposed to send the ACK */
4297 if (f_dl_block_rrbp_valid(dl_block)) {
4298 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
4299 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);
4300 if (tx_data_remain != 0) {
4301 /* Submit more data from time to time to keep the TBF ongoing */
4302 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4303 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4304 tx_data_remain := tx_data_remain - 1;
4305 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004306 } else if (tx_data_remain != 0) {
4307 /* keep sending UL blocks when requested by USF to avoid
4308 * UL TBF timeout and hence stop receival of USFs */
4309 if (usf_ms != -1) {
4310 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
4311 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004312 }
4313 }
4314
4315 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 +01004316 /* He we check that DL blocks scheduled at GPRS can still request UL
4317 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
4318 * condition also ensures the downgrade to <=MCS4 condition is tested
4319 * above */
4320 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
4321 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004322 f_shutdown(__BFILE__, __LINE__);
4323 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004324 /* Here check for some level of fairness between them (at least ~40%): */
4325 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
4326 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
4327 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
4328 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
4329 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4330 f_shutdown(__BFILE__, __LINE__);
4331 }
4332 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
4333 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4334 f_shutdown(__BFILE__, __LINE__);
4335 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004336
4337 f_shutdown(__BFILE__, __LINE__, final := true);
4338}
4339
4340
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004341private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4342 boolean exp_imsi, boolean exp_tmsi)
4343runs on RAW_PCU_Test_CT {
4344 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4345 var integer pending := lengthof(g_ms);
4346 var RlcmacDlBlock dl_block;
4347 var boolean f1, f2;
4348
4349 while (pending > 0) {
4350 var uint32_t poll_fn;
4351
4352 /* Obtain a Downlink block and make sure it is a paging request */
4353 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4354 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4355 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4356 break;
4357 }
4358
4359 /* This should not happen in general, but who knows... */
4360 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4361 if (not ispresent(req.repeated_pageinfo)) {
4362 setverdict(fail, "Repeated Page Info IE is absent?!?");
4363 break;
4364 }
4365
4366 /* A single message may contain several MIs depending on their type */
4367 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4368 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4369 ps_domain := false);
4370 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4371 ps_domain := false);
4372 if (not f1 and not f2)
4373 { continue; }
4374
4375 /* Detect duplicate MIs */
4376 if (mask[i] == '1'B) {
4377 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4378 continue;
4379 }
4380
4381 mask[i] := '1'B;
4382 }
4383
4384 pending := pending - lengthof(req.repeated_pageinfo);
4385 }
4386
4387 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4388 if (mask[i] != '1'B) {
4389 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4390 log("===== mask := ", mask);
4391 }
4392 }
4393
4394 /* All messages must have been received by now, expect a dummy block */
4395 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4396}
4397
4398private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4399runs on RAW_PCU_Test_CT {
4400 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4401 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4402
4403 /* Initialize NS/BSSGP side */
4404 f_init_bssgp();
4405
4406 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004407 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004408
4409 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4410 f_init_gprs_ms(7 * 8);
4411
4412 /* Initialize the PCU interface abstraction */
4413 f_init_raw(testcasename(), info_ind);
4414
4415 /* Establish BSSGP connection to the PCU */
4416 f_bssgp_establish();
4417 f_multi_ms_bssgp_register();
4418
4419 /* Establish an Uplink TBF for each GprsMS instance */
4420 f_multi_ms_establish_tbf(do_activate := true);
4421}
4422
4423testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4424 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4425
4426 /* Common part: send INFO.ind, establish TBFs... */
4427 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4428
4429 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4430 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4431 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4432 }
4433
4434 /* FIXME: work around a race condition between PCUIF and BSSGP */
4435 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4436
4437 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4438 * The IUT is expected to page on all PDCH slots of all transceivers. */
4439 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4440 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4441 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4442 }
4443
4444 f_shutdown(__BFILE__, __LINE__, final := true);
4445}
4446
4447testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4448 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4449
4450 /* Common part: send INFO.ind, establish TBFs... */
4451 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4452
4453 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4454 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4455 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4456 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4457 }
4458
4459 /* FIXME: work around a race condition between PCUIF and BSSGP */
4460 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4461
4462 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4463 * The IUT is expected to page on all PDCH slots of all transceivers. */
4464 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4465 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4466 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4467 }
4468
4469 f_shutdown(__BFILE__, __LINE__, final := true);
4470}
4471
4472testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4473 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4474
4475 /* Common part: send INFO.ind, establish TBFs... */
4476 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4477
4478 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4479 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4480 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4481 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4482 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4483 } else {
4484 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4485 }
4486 }
4487
4488 /* FIXME: work around a race condition between PCUIF and BSSGP */
4489 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4490
4491 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4492 * The IUT is expected to page on all PDCH slots of all transceivers. */
4493 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4494 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4495 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4496 }
4497
4498 f_shutdown(__BFILE__, __LINE__, final := true);
4499}
4500
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004501private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004502runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4503 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004504 var integer i := 0;
4505 while (true) {
4506 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4507 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4508 break;
4509 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004510 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004511 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4512 f_shutdown(__BFILE__, __LINE__);
4513 }
4514 i := i + 1;
4515 }
4516 return dl_block;
4517}
4518
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004519private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4520runs on RAW_PCU_Test_CT {
4521 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),
4522 info_ind.lac),
4523 info_ind.rac),
4524 info_ind.cell_id));
4525 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4526 423),
4527 2),
4528 5));
4529 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4530 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4531 var template (value) RAN_Information_RIM_Container res_cont :=
4532 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4533 ts_RIM_Sequence_Number(2),
4534 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4535 ts_RIM_Protocol_Version_Number(1),
4536 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4537 omit);
4538 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4539 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4540 res_cont));
4541}
4542
4543altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4544runs on RAW_PCU_Test_CT {
4545 /* RIM procedure: */
4546 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),
4547 info_ind.lac),
4548 info_ind.rac),
4549 info_ind.cell_id));
4550 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4551 423),
4552 2),
4553 5));
4554 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4555 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4556 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4557 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4558 tr_RAN_Information_Request_RIM_Container)) {
4559 if (do_answer) {
4560 f_outbound_nacc_rim_tx_resp(info_ind);
4561 }
4562 if (do_repeat) {
4563 repeat;
4564 }
4565 }
4566}
4567
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004568private function f_handle_nacc_rac_ci_query(PCUIF_info_ind info_ind, GsmArfcn req_arfcn, uint6_t req_bsic,
4569 boolean answer := true, boolean use_old_ctrl_iface := false)
4570runs on RAW_PCU_Test_CT {
4571 if (use_old_ctrl_iface == true) {
4572 f_ipa_ctrl_wait_link_up();
4573 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4574 int2str(info_ind.lac) & "." &
4575 int2str(info_ind.cell_id) & "." &
4576 int2str(req_arfcn) & "." &
4577 int2str(req_bsic);
4578 if (answer) {
4579 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4580 } else {
4581 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4582 }
4583 } else {
4584 var PCUIF_Message pcu_msg;
4585 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
4586 if (answer) {
4587 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
4588 }
4589 }
4590}
4591
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004592/* Start NACC from MS side */
4593private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004594 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004595 boolean skip_final_ctrl_ack := false,
4596 boolean use_old_ctrl_iface := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004597runs on RAW_PCU_Test_CT {
4598 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4599 var RlcmacDlBlock dl_block;
4600 var uint32_t sched_fn;
4601 var GsmArfcn req_arfcn := 862;
4602 var uint6_t req_bsic := 43;
4603
4604 /* Start NACC from MS side */
4605 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4606 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4607
4608 if (exp_rac_ci_query == true) {
4609 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004610 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004611 }
4612
4613 if (exp_si_query == true) {
4614 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004615 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004616 }
4617
4618 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004619 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004620
4621 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4622 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4623 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4624 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4625 f_shutdown(__BFILE__, __LINE__);
4626 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004627 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004628 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004629 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4630 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4631 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004632}
4633
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004634/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4635testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004636 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004637 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004638 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004639 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004640
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004641 if (use_old_ctrl_iface) {
4642 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4643 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4644 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004645
4646 /* Initialize NS/BSSGP side */
4647 f_init_bssgp();
4648 /* Initialize GPRS MS side */
4649 f_init_gprs_ms();
4650 ms := g_ms[0]; /* We only use first MS in this test */
4651
4652 /* Initialize the PCU interface abstraction */
4653 f_init_raw(testcasename(), info_ind);
4654
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004655 /* Make sure we are not affected by full cache from previous tests */
4656 f_pcuvty_flush_neigh_caches();
4657
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004658 /* Establish BSSGP connection to the PCU */
4659 f_bssgp_establish();
4660 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4661
4662 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004663 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 +01004664 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4665 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4666
4667 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004668 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004669
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004670 f_shutdown(__BFILE__, __LINE__, final := true);
4671}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004672
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004673/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4674testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4675 var PollFnCtx pollctx;
4676 var GprsMS ms;
4677 var RlcmacDlBlock dl_block;
4678 var uint32_t sched_fn;
4679 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004680 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004681
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004682 if (use_old_ctrl_iface) {
4683 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4684 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4685 }
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004686
4687 /* Initialize NS/BSSGP side */
4688 f_init_bssgp();
4689 /* Initialize GPRS MS side */
4690 f_init_gprs_ms();
4691 ms := g_ms[0]; /* We only use first MS in this test */
4692
4693 /* Initialize the PCU interface abstraction */
4694 f_init_raw(testcasename(), info_ind);
4695
4696 /* Make sure we are not affected by full cache from previous tests */
4697 f_pcuvty_flush_neigh_caches();
4698
4699 /* Establish BSSGP connection to the PCU */
4700 f_bssgp_establish();
4701 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4702
4703 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004704 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 +01004705 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4706 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4707
4708 /* Start NACC from MS side, avoid sending final CTRL ACK */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004709 f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004710
4711 /* Wait until we receive something non-dummy */
4712 dl_block := f_skip_dummy(0, sched_fn);
4713 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4714 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4715 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4716 }
4717 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4718 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4719 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4720 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4721 }
4722
4723 f_shutdown(__BFILE__, __LINE__, final := true);
4724}
4725
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004726/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4727testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4728 var PollFnCtx pollctx;
4729 var GprsMS ms;
4730 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004731 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004732 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004733
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004734 if (use_old_ctrl_iface) {
4735 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4736 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4737 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004738
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004739 /* Initialize NS/BSSGP side */
4740 f_init_bssgp();
4741 /* Initialize GPRS MS side */
4742 f_init_gprs_ms();
4743 ms := g_ms[0]; /* We only use first MS in this test */
4744
4745 /* Initialize the PCU interface abstraction */
4746 f_init_raw(testcasename(), info_ind);
4747
4748 /* Make sure we are not affected by full cache from previous tests */
4749 f_pcuvty_flush_neigh_caches();
4750 /* Set timeout values for caches so that entries will be in cache during second try */
4751 f_pcuvty_set_neigh_caches(10, 10);
4752
4753 /* Establish BSSGP connection to the PCU */
4754 f_bssgp_establish();
4755 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4756
4757 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004758 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 +01004759 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4760 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4761
4762 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004763 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004764
4765 /* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004766 f_outbound_nacc_success(ms, info_ind, false, false, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004767
4768 f_shutdown(__BFILE__, __LINE__, final := true);
4769}
4770
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004771/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4772 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4773 */
4774testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4775 var PollFnCtx pollctx;
4776 var GprsMS ms;
4777 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004778 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004779 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004780
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004781 if (use_old_ctrl_iface) {
4782 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4783 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4784 }
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004785
4786 /* Initialize NS/BSSGP side */
4787 f_init_bssgp();
4788 /* Initialize GPRS MS side */
4789 f_init_gprs_ms();
4790 ms := g_ms[0]; /* We only use first MS in this test */
4791
4792 /* Initialize the PCU interface abstraction */
4793 f_init_raw(testcasename(), info_ind);
4794
4795 /* Make sure we are not affected by full cache from previous tests */
4796 f_pcuvty_flush_neigh_caches();
4797 /* Set timeout values for caches so that entries will be erased before the second try */
4798 f_pcuvty_set_neigh_caches(1, 1);
4799
4800 /* Establish BSSGP connection to the PCU */
4801 f_bssgp_establish();
4802 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4803
4804 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004805 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 +01004806 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4807 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4808
4809 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004810 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004811
4812 /* CTRL client should have disconnected from us */
4813 f_ipa_ctrl_wait_link_down();
4814 /* wait for cache entries to time out */
4815 f_sleep(2.0);
4816 /* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004817 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004818
4819 f_shutdown(__BFILE__, __LINE__, final := true);
4820}
4821
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004822/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004823testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4824 var RlcmacDlBlock dl_block;
4825 var PollFnCtx pollctx;
4826 var uint32_t sched_fn;
4827 var GprsMS ms;
4828 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4829 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004830 var GsmArfcn req_arfcn := 862;
4831 var uint6_t req_bsic := 43;
4832
4833 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4834 * resolution CTRL port, to trigger Conn Refused by socket:
4835 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4836 */
4837
4838 /* Initialize NS/BSSGP side */
4839 f_init_bssgp();
4840 /* Initialize GPRS MS side */
4841 f_init_gprs_ms();
4842 ms := g_ms[0]; /* We only use first MS in this test */
4843
4844 /* Initialize the PCU interface abstraction */
4845 f_init_raw(testcasename(), info_ind);
4846
4847 /* Make sure we are not affected by full cache from previous tests */
4848 f_pcuvty_flush_neigh_caches();
4849
4850 /* Establish BSSGP connection to the PCU */
4851 f_bssgp_establish();
4852 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4853
4854 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004855 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 +01004856 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4857 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4858
4859 /* Start NACC from MS side */
4860 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4861 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4862
4863 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004864 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004865 /* Make sure it is a Pkt Cell Chg Continue */
4866 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4867 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4868 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004869 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4870 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4871 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4872 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4873 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004874
4875 f_shutdown(__BFILE__, __LINE__, final := true);
4876}
4877
4878/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004879testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
4880 var RlcmacDlBlock dl_block;
4881 var PollFnCtx pollctx;
4882 var uint32_t sched_fn;
4883 var GprsMS ms;
4884 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4885 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004886 var GsmArfcn req_arfcn := 862;
4887 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004888 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004889
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004890 if (use_old_ctrl_iface) {
4891 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4892 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4893 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004894
4895 /* Initialize NS/BSSGP side */
4896 f_init_bssgp();
4897 /* Initialize GPRS MS side */
4898 f_init_gprs_ms();
4899 ms := g_ms[0]; /* We only use first MS in this test */
4900
4901 /* Initialize the PCU interface abstraction */
4902 f_init_raw(testcasename(), info_ind);
4903
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004904 /* Make sure we are not affected by full cache from previous tests */
4905 f_pcuvty_flush_neigh_caches();
4906
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004907 /* Establish BSSGP connection to the PCU */
4908 f_bssgp_establish();
4909 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4910
4911 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004912 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 +01004913 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4914 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4915
4916 /* Start NACC from MS side */
4917 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4918 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4919
4920 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004921 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004922 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, false, use_old_ctrl_iface);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004923
4924 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004925 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004926 /* Make sure it is a Pkt Cell Chg Continue */
4927 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4928 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4929 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004930 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4931 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4932 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4933 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4934 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004935
4936 f_shutdown(__BFILE__, __LINE__, final := true);
4937}
4938
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004939/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
4940testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
4941 var RlcmacDlBlock dl_block;
4942 var PollFnCtx pollctx;
4943 var uint32_t sched_fn;
4944 var GprsMS ms;
4945 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4946 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004947 var GsmArfcn req_arfcn := 862;
4948 var uint6_t req_bsic := 43;
4949
4950 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4951 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4952
4953 /* Initialize NS/BSSGP side */
4954 f_init_bssgp();
4955 /* Initialize GPRS MS side */
4956 f_init_gprs_ms();
4957 ms := g_ms[0]; /* We only use first MS in this test */
4958
4959 /* Initialize the PCU interface abstraction */
4960 f_init_raw(testcasename(), info_ind);
4961
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004962 /* Make sure we are not affected by full cache from previous tests */
4963 f_pcuvty_flush_neigh_caches();
4964
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004965 /* Establish BSSGP connection to the PCU */
4966 f_bssgp_establish();
4967 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4968
4969 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004970 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 +01004971 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4972 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4973
4974 /* Start NACC from MS side */
4975 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4976 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4977
4978 /* osmo-pcu should now ask for resolution: */
4979 f_ipa_ctrl_wait_link_up();
4980 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4981 int2str(info_ind.lac) & "." &
4982 int2str(info_ind.cell_id) & "." &
4983 int2str(req_arfcn) & "." &
4984 int2str(req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004985 /* we receive RAC+CI resolution request and we send incorrectly formated response */
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004986 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
4987
4988 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004989 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004990 /* Make sure it is a Pkt Cell Chg Continue */
4991 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4992 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4993 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004994 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4995 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4996 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4997 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4998 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01004999
5000 f_shutdown(__BFILE__, __LINE__, final := true);
5001}
5002
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005003/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
5004testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
5005 var RlcmacDlBlock dl_block;
5006 var PollFnCtx pollctx;
5007 var uint32_t sched_fn;
5008 var GprsMS ms;
5009 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5010 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005011 var GsmArfcn req_arfcn := 862;
5012 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005013 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005014 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 */
5015 info_ind.lac),
5016 info_ind.rac),
5017 info_ind.cell_id));
5018 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
5019 423),
5020 2),
5021 5));
5022 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
5023 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
5024
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005025 if (use_old_ctrl_iface) {
5026 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5027 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5028 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005029
5030 /* Initialize NS/BSSGP side */
5031 f_init_bssgp();
5032 /* Initialize GPRS MS side */
5033 f_init_gprs_ms();
5034 ms := g_ms[0]; /* We only use first MS in this test */
5035
5036 /* Initialize the PCU interface abstraction */
5037 f_init_raw(testcasename(), info_ind);
5038
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005039 /* Make sure we are not affected by full cache from previous tests */
5040 f_pcuvty_flush_neigh_caches();
5041
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005042 /* Establish BSSGP connection to the PCU */
5043 f_bssgp_establish();
5044 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5045
5046 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005047 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 +01005048 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5049 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5050
5051 /* Start NACC from MS side */
5052 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5053 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5054
5055 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005056 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005057
5058 /* RIM procedure: */
5059 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5060 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5061 tr_RAN_Information_Request_RIM_Container));
5062 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
5063
5064 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005065 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005066 /* Make sure it is a Pkt Cell Chg Continue */
5067 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5068 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5069 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005070 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5071 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5072 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5073 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5074 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005075
5076 f_shutdown(__BFILE__, __LINE__, final := true);
5077}
5078
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005079/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
5080testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
5081 var PollFnCtx pollctx;
5082 var GprsMS ms;
5083 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5084 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5085 var RlcmacDlBlock dl_block;
5086 var uint32_t sched_fn;
5087 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005088 var charstring ctrl_var;
5089 var PCUIF_Message pcu_msg;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005090 var GsmArfcn req_arfcn := 862;
5091 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005092 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005093
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005094 if (use_old_ctrl_iface) {
5095 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5096 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5097 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005098
5099 /* Initialize NS/BSSGP side */
5100 f_init_bssgp();
5101 /* Initialize GPRS MS side */
5102 f_init_gprs_ms();
5103 ms := g_ms[0]; /* We only use first MS in this test */
5104
5105 /* Initialize the PCU interface abstraction */
5106 f_init_raw(testcasename(), info_ind);
5107
5108 /* Make sure we are not affected by full cache from previous tests */
5109 f_pcuvty_flush_neigh_caches();
5110
5111 /* Establish BSSGP connection to the PCU */
5112 f_bssgp_establish();
5113 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5114
5115 /* Send PACKET RESOURCE REQUEST */
5116 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5117 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5118 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5119
5120 /* Start NACC from MS side */
5121 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5122 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5123
5124 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005125 if (use_old_ctrl_iface) {
5126 f_ipa_ctrl_wait_link_up();
5127 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5128 int2str(info_ind.lac) & "." &
5129 int2str(info_ind.cell_id) & "." &
5130 int2str(req_arfcn) & "." &
5131 int2str(req_bsic);
5132 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5133 } else {
5134 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5135 }
5136
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005137 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
5138 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5139 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005140
5141 if (use_old_ctrl_iface) {
5142 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5143 } else {
5144 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5145 }
5146
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005147 timer T := 2.0;
5148 T.start;
5149 alt {
5150 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005151 [use_old_ctrl_iface] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005152 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
5153 f_shutdown(__BFILE__, __LINE__);
5154 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005155 [not use_old_ctrl_iface] BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg {
5156 setverdict(fail, "Received unexpected PCUIF resolution after duplicate Pkt Cell Change Notification:", pcu_msg);
5157 f_shutdown(__BFILE__, __LINE__);
5158 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005159 [] T.timeout {
5160 setverdict(pass);
5161 }
5162 }
5163
5164 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005165 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005166
5167 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5168 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5169 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5170 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5171 f_shutdown(__BFILE__, __LINE__);
5172 }
5173 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5174 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5175 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5176 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5177 }
5178
5179 f_shutdown(__BFILE__, __LINE__, final := true);
5180}
5181
5182/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
5183testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
5184 var PollFnCtx pollctx;
5185 var GprsMS ms;
5186 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5187 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5188 var RlcmacDlBlock dl_block;
5189 var uint32_t sched_fn;
5190 var CtrlMessage rx_ctrl;
5191 var GsmArfcn req_arfcn := 862;
5192 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005193 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005194
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005195 if (use_old_ctrl_iface) {
5196 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5197 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5198 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005199
5200 /* Initialize NS/BSSGP side */
5201 f_init_bssgp();
5202 /* Initialize GPRS MS side */
5203 f_init_gprs_ms();
5204 ms := g_ms[0]; /* We only use first MS in this test */
5205
5206 /* Initialize the PCU interface abstraction */
5207 f_init_raw(testcasename(), info_ind);
5208
5209 /* Make sure we are not affected by full cache from previous tests */
5210 f_pcuvty_flush_neigh_caches();
5211
5212 /* Establish BSSGP connection to the PCU */
5213 f_bssgp_establish();
5214 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5215
5216 /* Send PACKET RESOURCE REQUEST */
5217 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5218 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5219 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5220
5221 /* Start NACC from MS side */
5222 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5223 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5224
5225 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005226 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005227 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5228 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
5229 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5230 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5231 f_outbound_nacc_rim_tx_resp(info_ind);
5232 timer T := 1.0;
5233 T.start;
5234 alt {
5235 [] RIM.receive {
5236 setverdict(fail, "Received unexpected RIM message");
5237 f_shutdown(__BFILE__, __LINE__);
5238 }
5239 [] T.timeout {
5240 setverdict(pass);
5241 }
5242 }
5243
5244 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005245 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005246
5247 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5248 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5249 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5250 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5251 f_shutdown(__BFILE__, __LINE__);
5252 }
5253 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5254 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5255 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5256 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5257 }
5258
5259 f_shutdown(__BFILE__, __LINE__, final := true);
5260}
5261
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005262/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
5263testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
5264 var PollFnCtx pollctx;
5265 var GprsMS ms;
5266 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5267 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5268 var RlcmacDlBlock dl_block;
5269 var uint32_t sched_fn;
5270 var CtrlMessage rx_ctrl;
5271 var GsmArfcn req_arfcn := 862;
5272 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005273 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005274
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005275 if (use_old_ctrl_iface) {
5276 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5277 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5278 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005279
5280 /* Initialize NS/BSSGP side */
5281 f_init_bssgp();
5282 /* Initialize GPRS MS side */
5283 f_init_gprs_ms();
5284 ms := g_ms[0]; /* We only use first MS in this test */
5285
5286 /* Initialize the PCU interface abstraction */
5287 f_init_raw(testcasename(), info_ind);
5288
5289 /* Make sure we are not affected by full cache from previous tests */
5290 f_pcuvty_flush_neigh_caches();
5291
5292 /* Establish BSSGP connection to the PCU */
5293 f_bssgp_establish();
5294 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5295
5296 /* Send PACKET RESOURCE REQUEST */
5297 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5298 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5299 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5300
5301 /* Start NACC from MS side */
5302 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5303 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5304
5305 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005306 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005307 /* RIM procedure: */
5308 as_outbound_nacc_rim_resolve(info_ind);
5309
5310 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
5311 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5312 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5313
5314 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
5315 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5316
5317 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5318 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5319 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5320 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5321 f_shutdown(__BFILE__, __LINE__);
5322 }
5323 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5324 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5325 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5326 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5327 }
5328}
5329
5330/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
5331testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
5332 var PollFnCtx pollctx;
5333 var GprsMS ms;
5334 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5335 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5336 var RlcmacDlBlock dl_block;
5337 var uint32_t sched_fn;
5338 var CtrlMessage rx_ctrl;
5339 var GsmArfcn req_arfcn := 862;
5340 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005341 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005342
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005343 if (use_old_ctrl_iface) {
5344 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5345 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5346 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005347
5348 /* Initialize NS/BSSGP side */
5349 f_init_bssgp();
5350 /* Initialize GPRS MS side */
5351 f_init_gprs_ms();
5352 ms := g_ms[0]; /* We only use first MS in this test */
5353
5354 /* Initialize the PCU interface abstraction */
5355 f_init_raw(testcasename(), info_ind);
5356
5357 /* Make sure we are not affected by full cache from previous tests */
5358 f_pcuvty_flush_neigh_caches();
5359
5360 /* Establish BSSGP connection to the PCU */
5361 f_bssgp_establish();
5362 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5363
5364 /* Send PACKET RESOURCE REQUEST */
5365 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5366 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5367 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5368
5369 /* Start NACC from MS side */
5370 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5371 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5372
5373 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005374 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005375 /* RIM procedure: */
5376 as_outbound_nacc_rim_resolve(info_ind);
5377
5378 /* Announce SI back to MS, continue NACC procedure */
5379 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5380
5381 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5382 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5383
5384 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5385 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5386 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5387 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5388 f_shutdown(__BFILE__, __LINE__);
5389 }
5390 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5391 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5392 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5393 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5394 }
5395}
5396
5397/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5398testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
5399 var PollFnCtx pollctx;
5400 var GprsMS ms;
5401 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5402 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5403 var RlcmacDlBlock dl_block;
5404 var uint32_t sched_fn;
5405 var CtrlMessage rx_ctrl;
5406 var GsmArfcn req_arfcn := 862;
5407 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005408 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005409
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005410 if (use_old_ctrl_iface) {
5411 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5412 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5413 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005414
5415 /* Initialize NS/BSSGP side */
5416 f_init_bssgp();
5417 /* Initialize GPRS MS side */
5418 f_init_gprs_ms();
5419 ms := g_ms[0]; /* We only use first MS in this test */
5420
5421 /* Initialize the PCU interface abstraction */
5422 f_init_raw(testcasename(), info_ind);
5423
5424 /* Make sure we are not affected by full cache from previous tests */
5425 f_pcuvty_flush_neigh_caches();
5426
5427 /* Establish BSSGP connection to the PCU */
5428 f_bssgp_establish();
5429 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5430
5431 /* Send PACKET RESOURCE REQUEST */
5432 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5433 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5434 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5435
5436 /* Start NACC from MS side */
5437 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5438 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5439
5440 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005441 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005442 /* RIM procedure: */
5443 as_outbound_nacc_rim_resolve(info_ind);
5444
5445 /* Announce SI back to MS, continue NACC procedure */
5446 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5447
5448 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5449 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5450 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5451 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5452 f_shutdown(__BFILE__, __LINE__);
5453 }
5454 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5455 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5456
5457 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5458 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5459 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5460 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5461 }
5462}
5463
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005464/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5465 * while waiting for CTRL resolution */
5466testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5467 var PollFnCtx pollctx;
5468 var GprsMS ms;
5469 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5470 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5471 var RlcmacDlBlock dl_block;
5472 var uint32_t sched_fn;
5473 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005474 var charstring ctrl_var;
5475 var PCUIF_Message pcu_msg;
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005476 var GsmArfcn req_arfcn := 862;
5477 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005478 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005479
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005480 if (use_old_ctrl_iface) {
5481 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5482 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5483 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005484
5485 /* Initialize NS/BSSGP side */
5486 f_init_bssgp();
5487 /* Initialize GPRS MS side */
5488 f_init_gprs_ms();
5489 ms := g_ms[0]; /* We only use first MS in this test */
5490
5491 /* Initialize the PCU interface abstraction */
5492 f_init_raw(testcasename(), info_ind);
5493
5494 /* Make sure we are not affected by full cache from previous tests */
5495 f_pcuvty_flush_neigh_caches();
5496
5497 /* Establish BSSGP connection to the PCU */
5498 f_bssgp_establish();
5499 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5500
5501 /* Send PACKET RESOURCE REQUEST */
5502 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5503 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5504 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5505
5506 /* Start NACC from MS side */
5507 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5508 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5509
5510 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005511 if (use_old_ctrl_iface) {
5512 f_ipa_ctrl_wait_link_up();
5513 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5514 int2str(info_ind.lac) & "." &
5515 int2str(info_ind.cell_id) & "." &
5516 int2str(req_arfcn) & "." &
5517 int2str(req_bsic);
5518 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5519 } else {
5520 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5521 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005522 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5523 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5524 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5525 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005526 if (use_old_ctrl_iface) {
5527 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5528 } else {
5529 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5530 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005531 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005532 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005533
5534 /* And finally everything continues as usual with RIN procedure */
5535 as_outbound_nacc_rim_resolve(info_ind);
5536
5537 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005538 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005539
5540 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5541 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5542 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5543 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5544 f_shutdown(__BFILE__, __LINE__);
5545 }
5546 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5547 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5548 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5549 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5550 }
5551
5552 f_shutdown(__BFILE__, __LINE__, final := true);
5553}
5554
5555/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5556 * while waiting for SI resolution */
5557testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5558 var PollFnCtx pollctx;
5559 var GprsMS ms;
5560 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5561 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5562 var RlcmacDlBlock dl_block;
5563 var uint32_t sched_fn;
5564 var CtrlMessage rx_ctrl;
5565 var GsmArfcn req_arfcn := 862;
5566 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005567 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005568
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005569 if (use_old_ctrl_iface) {
5570 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5571 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5572 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005573
5574 /* Initialize NS/BSSGP side */
5575 f_init_bssgp();
5576 /* Initialize GPRS MS side */
5577 f_init_gprs_ms();
5578 ms := g_ms[0]; /* We only use first MS in this test */
5579
5580 /* Initialize the PCU interface abstraction */
5581 f_init_raw(testcasename(), info_ind);
5582
5583 /* Make sure we are not affected by full cache from previous tests */
5584 f_pcuvty_flush_neigh_caches();
5585
5586 /* Establish BSSGP connection to the PCU */
5587 f_bssgp_establish();
5588 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5589
5590 /* Send PACKET RESOURCE REQUEST */
5591 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5592 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5593 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5594
5595 /* Start NACC from MS side */
5596 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5597 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5598
5599 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005600 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005601 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5602 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5603 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5604 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5605 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5606 f_outbound_nacc_rim_tx_resp(info_ind);
5607
5608 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005609 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005610
5611 /* And finally everything continues as usual with RIN procedure */
5612 as_outbound_nacc_rim_resolve(info_ind);
5613
5614 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005615 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005616
5617 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5618 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5619 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5620 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5621 f_shutdown(__BFILE__, __LINE__);
5622 }
5623 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5624 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5625 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5626 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5627 }
5628
5629 f_shutdown(__BFILE__, __LINE__, final := true);
5630}
5631
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005632/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5633 * while sending Pkt Neigh Data Change */
5634testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5635 var PollFnCtx pollctx;
5636 var GprsMS ms;
5637 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5638 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5639 var RlcmacDlBlock dl_block;
5640 var uint32_t sched_fn;
5641 var CtrlMessage rx_ctrl;
5642 var GsmArfcn req_arfcn := 862;
5643 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005644 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005645
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005646 if (use_old_ctrl_iface) {
5647 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5648 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5649 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005650
5651 /* Initialize NS/BSSGP side */
5652 f_init_bssgp();
5653 /* Initialize GPRS MS side */
5654 f_init_gprs_ms();
5655 ms := g_ms[0]; /* We only use first MS in this test */
5656
5657 /* Initialize the PCU interface abstraction */
5658 f_init_raw(testcasename(), info_ind);
5659
5660 /* Make sure we are not affected by full cache from previous tests */
5661 f_pcuvty_flush_neigh_caches();
5662
5663 /* Establish BSSGP connection to the PCU */
5664 f_bssgp_establish();
5665 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5666
5667 /* Send PACKET RESOURCE REQUEST */
5668 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5669 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5670 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5671
5672 /* Start NACC from MS side */
5673 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5674 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5675
5676 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005677 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005678 /* RIM procedure: */
5679 as_outbound_nacc_rim_resolve(info_ind);
5680
5681 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5682 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5683 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5684 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5685
5686 /* It should trigger RAC_CI resolution to start again: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005687 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005688 /* RIM procedure: */
5689 as_outbound_nacc_rim_resolve(info_ind);
5690 /* Transmit SI back to MS */
5691 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5692
5693 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5694 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5695 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5696 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5697 f_shutdown(__BFILE__, __LINE__);
5698 }
5699 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5700 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5701 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5702 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5703 }
5704}
5705
5706/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5707testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5708 var PollFnCtx pollctx;
5709 var GprsMS ms;
5710 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5711 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5712 var RlcmacDlBlock dl_block;
5713 var uint32_t sched_fn;
5714 var CtrlMessage rx_ctrl;
5715 var GsmArfcn req_arfcn := 862;
5716 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005717 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005718
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005719 if (use_old_ctrl_iface) {
5720 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5721 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5722 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005723
5724 /* Initialize NS/BSSGP side */
5725 f_init_bssgp();
5726 /* Initialize GPRS MS side */
5727 f_init_gprs_ms();
5728 ms := g_ms[0]; /* We only use first MS in this test */
5729
5730 /* Initialize the PCU interface abstraction */
5731 f_init_raw(testcasename(), info_ind);
5732
5733 /* Make sure we are not affected by full cache from previous tests */
5734 f_pcuvty_flush_neigh_caches();
5735
5736 /* Establish BSSGP connection to the PCU */
5737 f_bssgp_establish();
5738 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5739
5740 /* Send PACKET RESOURCE REQUEST */
5741 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5742 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5743 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5744
5745 /* Start NACC from MS side */
5746 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5747 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5748
5749 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005750 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005751 /* RIM procedure: */
5752 as_outbound_nacc_rim_resolve(info_ind);
5753
5754 /* Announce SI back to MS, continue NACC procedure */
5755 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5756
5757 /* trigger a Pkt Cell Change Notif with different tgt cell */
5758 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5759 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5760
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005761 /* It should trigger RAC_CI resolution to start again: */
5762 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
5763
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005764 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5765 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5766
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005767 /* RIM procedure: */
5768 as_outbound_nacc_rim_resolve(info_ind);
5769 /* Transmit SI back to MS */
5770 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5771
5772 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5773 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5774 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5775 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5776 f_shutdown(__BFILE__, __LINE__);
5777 }
5778 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5779 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5780 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5781 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5782 }
5783}
5784
5785/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5786testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5787 var PollFnCtx pollctx;
5788 var GprsMS ms;
5789 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5790 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5791 var RlcmacDlBlock dl_block;
5792 var uint32_t sched_fn;
5793 var CtrlMessage rx_ctrl;
5794 var GsmArfcn req_arfcn := 862;
5795 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005796 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005797
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005798 if (use_old_ctrl_iface) {
5799 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5800 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5801 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005802
5803 /* Initialize NS/BSSGP side */
5804 f_init_bssgp();
5805 /* Initialize GPRS MS side */
5806 f_init_gprs_ms();
5807 ms := g_ms[0]; /* We only use first MS in this test */
5808
5809 /* Initialize the PCU interface abstraction */
5810 f_init_raw(testcasename(), info_ind);
5811
5812 /* Make sure we are not affected by full cache from previous tests */
5813 f_pcuvty_flush_neigh_caches();
5814
5815 /* Establish BSSGP connection to the PCU */
5816 f_bssgp_establish();
5817 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5818
5819 /* Send PACKET RESOURCE REQUEST */
5820 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5821 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5822 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5823
5824 /* Start NACC from MS side */
5825 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5826 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5827
5828 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005829 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005830 /* RIM procedure: */
5831 as_outbound_nacc_rim_resolve(info_ind);
5832
5833 /* Announce SI back to MS, continue NACC procedure */
5834 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5835
5836 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5837 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5838 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5839 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5840 f_shutdown(__BFILE__, __LINE__);
5841 }
5842
5843 /* trigger a Pkt Cell Change Notif with different tgt cell */
5844 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5845 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5846
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005847 /* It should trigger RAC_CI resolution to start again: */
5848 /* When using new PCUIF interface for resolution, we must
5849 * PCUIF.receive() here since that's the first message in the PCUIF
5850 * queue that PCU will have sent. Calling other functions doing
5851 * PCUIF.receive() (like f_ms_tx_ul_block() below) will make them fail
5852 * due to unexpected message receive. */
5853 if (not use_old_ctrl_iface) {
5854 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
5855 }
5856
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005857 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5858 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5859 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5860 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5861 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005862
5863 /* When using CTRL interface, we must schedule the ACK before (see
5864 * above) blocking here waiting for the resoltion, otherwise we'll be
5865 * too late scheduling by the time the resolution is done. */
5866 if (use_old_ctrl_iface) {
5867 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
5868 }
5869
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005870 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5871 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
5872
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005873 /* RIM procedure: */
5874 as_outbound_nacc_rim_resolve(info_ind);
5875 /* Transmit SI back to MS */
5876 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5877
5878 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5879 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5880 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5881 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5882 f_shutdown(__BFILE__, __LINE__);
5883 }
5884 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5885 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5886 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5887 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5888 }
5889}
5890
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005891/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
5892testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
5893 var PollFnCtx pollctx;
5894 var GprsMS ms;
5895 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5896 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5897 var RlcmacDlBlock dl_block;
5898 var uint32_t sched_fn, dl_fn;
5899 var CtrlMessage rx_ctrl;
5900 var GsmArfcn req_arfcn := 862;
5901 var uint6_t req_bsic := 43;
5902 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005903 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005904
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005905 if (use_old_ctrl_iface) {
5906 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5907 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5908 }
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005909
5910 /* Initialize NS/BSSGP side */
5911 f_init_bssgp();
5912 /* Initialize GPRS MS side */
5913 f_init_gprs_ms();
5914 ms := g_ms[0]; /* We only use first MS in this test */
5915
5916 /* Initialize the PCU interface abstraction */
5917 f_init_raw(testcasename(), info_ind);
5918
5919 /* Make sure we are not affected by full cache from previous tests */
5920 f_pcuvty_flush_neigh_caches();
5921
5922 /* Establish BSSGP connection to the PCU */
5923 f_bssgp_establish();
5924 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5925
5926 /* Send PACKET RESOURCE REQUEST */
5927 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5928 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5929 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5930
5931 /* Start NACC from MS side */
5932 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5933 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5934
5935 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005936 f_handle_nacc_rac_ci_query(info_ind, req_arfcn, req_bsic, true, use_old_ctrl_iface);
Pau Espin Pedrol13035772021-02-18 16:07:06 +01005937 /* RIM procedure: */
5938 as_outbound_nacc_rim_resolve(info_ind);
5939
5940 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
5941 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
5942 f_sleep(0.1);
5943 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
5944 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
5945
5946 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
5947 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5948 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
5949 * Data with unassigned DL TBF in line above): */
5950 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5951 /* Continue receiving Pkt Cell Neighbor Data */
5952 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5953
5954 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5955 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5956 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5957 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5958 f_shutdown(__BFILE__, __LINE__);
5959 }
5960 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5961 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5962 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5963 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5964 }
5965
5966 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
5967 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
5968 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
5969 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
5970 f_dl_block_ack_fn(dl_block, dl_fn));
5971}
5972
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005973
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005974function f_do_inbound_nacc(template (value) RIM_Routing_Information tx_src_addr, template RIM_Routing_Information rx_dst_addr)
5975runs on RAW_PCU_Test_CT
5976{
5977 var template (value) RAN_Information_Request_RIM_Container req_cont;
5978 var template (value) PDU_BSSGP bssgp_rim_pdu;
5979 var template PDU_BSSGP bssgp_rim_pdu_expect;
5980 var template RAN_Information_RIM_Container rim_cont_expect;
5981 var RIM_Routing_Address bts_addr;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005982
5983 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005984 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 +01005985 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01005986 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 +01005987 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02005988 var template PCUIF_Message si13_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, '0106'O & si13_default, 0, 0, 0, 0, 32767);
5989 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005990 f_sleep(1.0);
5991
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02005992 bts_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005993
Philipp Maierd55fe7e2021-02-01 17:23:40 +01005994 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
5995 ts_RIM_Sequence_Number(1),
5996 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
5997 ts_RIM_Protocol_Version_Number(1),
5998 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
5999 omit);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006000 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
6001 tx_src_addr, req_cont);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006002
6003 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6004 tr_RIM_Sequence_Number(1),
6005 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6006 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006007 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 +01006008 omit);
6009
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006010 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(rx_dst_addr,
6011 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006012 rim_cont_expect);
6013 RIM.send(bssgp_rim_pdu);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006014 timer T := 2.0;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006015 T.start;
6016 alt {
6017 [] RIM.receive(bssgp_rim_pdu_expect) { }
6018 [] RIM.receive {
6019 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6020 }
6021 [] T.timeout {
6022 setverdict(fail, "No BSSGP RIM PDU received");
6023 mtc.stop;
6024 }
6025 }
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006026}
6027/* Send a RIM RAN info request to the PCU and verify the response, we expect
6028 * getting the system information back which we have transfered to the PCU via
6029 * PCUIF on startup. */
6030testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
6031 /* Initialize NS/BSSGP side */
6032 f_init_bssgp();
6033
6034 /* Initialize the PCU interface abstraction */
6035 f_init_raw(testcasename());
6036
6037 /* Establish BSSGP connection to the PCU */
6038 f_bssgp_establish();
6039
6040 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6041 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6042
6043 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6044 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr));
6045
6046 f_shutdown(__BFILE__, __LINE__, final := true);
6047}
6048
6049/* Same as TC_rim_ran_info_req_single_rep, but using an EUTRAN eNodeB ID as
6050 * Routing information, to verify PCU handles that kind of address just fine
6051 */
6052testcase TC_rim_ran_info_req_single_rep_eutran() runs on RAW_PCU_Test_CT {
6053 /* Initialize NS/BSSGP side */
6054 f_init_bssgp();
6055
6056 /* Initialize the PCU interface abstraction */
6057 f_init_raw(testcasename());
6058
6059 /* Establish BSSGP connection to the PCU */
6060 f_bssgp_establish();
6061
6062 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6063 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_enbid(src_cid, tac := 3, gnbid := '12345678123456'O));
6064
6065 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr),
6066 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006067
6068 f_shutdown(__BFILE__, __LINE__, final := true);
6069}
6070
6071/* Same as above, but in this case we simulate the rare case in which the PCU
6072 * has no system information available. We expect getting a response back but
6073 * with no system information inside. */
6074testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006075 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006076 var PCUIF_Message pcu_msg;
6077 timer T := 2.0;
6078
6079 /* Initialize NS/BSSGP side */
6080 f_init_bssgp();
6081
6082 /* Initialize the PCU interface abstraction */
6083 f_init_raw(testcasename(), info_ind);
6084
6085 /* Establish BSSGP connection to the PCU */
6086 f_bssgp_establish();
6087
6088 /* Clear sysinfo from the PCU */
6089 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);
6090 BTS.send(si1_data_ind);
6091 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);
6092 BTS.send(si3_data_ind);
6093 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);
6094 BTS.send(si16_data_ind);
6095 f_sleep(1.0);
6096
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006097 var RIM_Routing_Address dst_addr;
6098 var RIM_Routing_Address src_addr;
6099 var template (value) RAN_Information_Request_RIM_Container req_cont;
6100 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006101 var template PDU_BSSGP bssgp_rim_pdu_expect;
6102 var template RAN_Information_RIM_Container rim_cont_expect;
6103
6104 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 +01006105 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6106 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006107
6108 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6109 ts_RIM_Sequence_Number(1),
6110 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6111 ts_RIM_Protocol_Version_Number(1),
6112 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6113 omit);
6114 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6115 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6116 req_cont);
6117
6118
6119 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6120 tr_RIM_Sequence_Number(1),
6121 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6122 tr_RIM_Protocol_Version_Number(1),
6123 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
6124 omit);
6125
6126 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6127 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6128 rim_cont_expect);
6129 RIM.send(bssgp_rim_pdu);
6130 T.start;
6131 alt {
6132 [] RIM.receive(bssgp_rim_pdu_expect) { }
6133 [] RIM.receive {
6134 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6135 }
6136 [] T.timeout {
6137 setverdict(fail, "No BSSGP RIM PDU received");
6138 mtc.stop;
6139 }
6140 }
6141
6142 f_shutdown(__BFILE__, __LINE__, final := true);
6143}
6144
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006145/* Verify PCU schedule idle blocks (len=0) if no TBF attached to it. See OS#4772, SYS#4919 */
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006146testcase TC_pdch_energy_saving() runs on RAW_PCU_Test_CT {
6147 var PCUIF_info_ind info_ind;
6148 var template (value) TsTrxBtsNum nr;
6149 var RlcmacDlBlock dl_block;
6150 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006151 var integer ts;
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006152 timer T;
6153
6154 /* Initialize NS/BSSGP side */
6155 f_init_bssgp();
6156
6157 info_ind := valueof(ts_PCUIF_INFO_default);
6158 /* The 2 first TRX are enabled. */
6159 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (2 .. 7));
6160 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6161 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 1);
6162
6163 /* Initialize the PCU interface abstraction */
6164 f_init_raw(testcasename(), info_ind);
6165
6166 /* Establish BSSGP connection to the PCU */
6167 f_bssgp_establish();
6168
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006169 for (ts := 0; ts < 2; ts := ts + 1) {
6170 nr := ts_TsTrxBtsNum(ts_nr := 7, trx_nr := ts, bts_nr := 0, blk_nr := 0);
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006171
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006172 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
6173 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
6174 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), block_nr := nr.blk_nr));
6175 T.start(0.5);
6176 alt {
6177 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
6178 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
6179 omit)) -> value data_msg {
6180 setverdict(pass);
6181 T.stop;
6182 }
6183 [] as_rx_fail_dummy(nr);
6184 [] BTS.receive {
6185 setverdict(fail, "Unexpected block from BTS");
6186 f_shutdown(__BFILE__, __LINE__);
6187 }
6188 [] T.timeout {
6189 setverdict(fail, "Expected IDLE block from BTS");
6190 f_shutdown(__BFILE__, __LINE__);
6191 }
6192 }
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006193 }
6194
6195 f_shutdown(__BFILE__, __LINE__, final := true);
6196}
6197
Oliver Smith3d174882021-09-03 11:38:51 +02006198/* Test stats for available and occupied PDCHs */
6199testcase TC_stat_pdch_avail_occ() runs on RAW_PCU_Test_CT {
6200 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6201 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6202
6203 /* Initialize NS/BSSGP side */
6204 f_init_bssgp();
6205
Oliver Smithedcded22021-09-14 09:26:55 +02006206 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6207 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6208 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6209 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6210 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6211 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
Oliver Smith3d174882021-09-03 11:38:51 +02006212
Oliver Smith72d0c692021-09-08 10:03:52 +02006213 /* Allocate 4 GprsMS instances */
Oliver Smith3d174882021-09-03 11:38:51 +02006214 f_init_gprs_ms(4);
6215
6216 /* Initialize the PCU interface abstraction */
6217 f_init_raw(testcasename(), info_ind);
6218
6219 /* Reset stats */
6220 f_statsd_reset();
6221
6222 /* Establish BSSGP */
6223 f_bssgp_establish();
6224
6225 /* 8 PDCHs available, 0 occupied */
6226 var StatsDExpects expect := {
6227 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006228 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6229 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6230 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
Oliver Smith3d174882021-09-03 11:38:51 +02006231 };
6232 f_statsd_expect(expect);
6233
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006234 /* Establish an Uplink TBF for each GprsMS instance (3x GPRS, 1x EGPRS) */
Oliver Smith3d174882021-09-03 11:38:51 +02006235 f_multi_ms_bssgp_register();
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006236 f_ms_establish_ul_tbf(g_ms[0]);
6237 f_ms_establish_ul_tbf(g_ms[1]);
6238 f_ms_establish_ul_tbf(g_ms[2]);
6239 f_ms_establish_ul_tbf_2phase_access(g_ms[3], ts_RlcMacUlCtrl_PKT_RES_REQ(g_ms[3].tlli, ms_racap_egprs_def));
Oliver Smith3d174882021-09-03 11:38:51 +02006240
6241 /* 4 PDCHs occupied */
6242 expect := {
6243 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006244 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 4, max := 4 },
6245 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 3, max := 3 },
6246 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
Oliver Smith3d174882021-09-03 11:38:51 +02006247 };
6248 f_statsd_expect(expect);
6249
6250 f_shutdown(__BFILE__, __LINE__, final := true);
6251}
6252
Oliver Smithf04762d2021-09-14 17:20:38 +02006253/* Test stats for available and occupied PDCHs, for MS which is not known by
6254 * the PCU (e.g. because it was forgotten due to no interaction, and old DL
6255 * data arrives from SGSN) */
6256function f_tc_stat_pdch_avail_occ_ms_not_known(boolean egprs) runs on RAW_PCU_Test_CT {
6257 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6258 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6259
6260 /* Ensure a deterministic slot allocation of 1 PDCH with MS class 1 */
6261 const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs := {
6262 gprsmultislotclass := '00001'B,
6263 gprsextendeddynalloccap := '0'B
6264 };
6265 const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs := {
6266 egprsmultislotclass := '00001'B,
6267 egprsextendeddynalloccap := '0'B
6268 };
6269 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs := {
6270 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, omit)) };
6271 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs := {
6272 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, bssgp_mscap_egprs)) };
6273
6274 /* Initialize NS/BSSGP side */
6275 f_init_bssgp();
6276
6277 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6278 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6279 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6280 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6281 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6282 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
6283
6284 /* Allocate 1 GprsMS instance */
6285 f_init_gprs_ms(1);
6286
6287 /* Initialize the PCU interface abstraction */
6288 f_init_raw(testcasename(), info_ind);
6289
6290 /* Reset stats */
6291 f_statsd_reset();
6292
6293 /* Establish BSSGP */
6294 f_bssgp_establish();
6295
6296 /* 8 PDCHs available, 0 occupied */
6297 var StatsDExpects expect := {
6298 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6299 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6300 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6301 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6302 };
6303 f_statsd_expect(expect);
6304
6305 var GprsMS ms := g_ms[0]; /* We only use first MS in this test */
6306 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6307
6308 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
6309 var octetstring data := f_rnd_octstring(1400);
6310 if (egprs) {
6311 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs));
6312 } else {
6313 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_gprs));
6314 }
6315 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
6316
6317 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
6318 f_sleep(X2002);
6319
6320 /* 1 PDCH occupied */
6321 if (egprs) {
6322 expect := {
6323 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6324 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6325 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6326 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
6327 };
6328 } else {
6329 expect := {
6330 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6331 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6332 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 1, max := 1 },
6333 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6334 };
6335 }
6336 f_statsd_expect(expect);
6337
6338 /* Clean up */
6339 f_shutdown(__BFILE__, __LINE__, final := true);
6340}
6341testcase TC_stat_pdch_avail_occ_ms_not_known_gprs() runs on RAW_PCU_Test_CT {
6342 f_tc_stat_pdch_avail_occ_ms_not_known(false);
6343}
6344testcase TC_stat_pdch_avail_occ_ms_not_known_egprs() runs on RAW_PCU_Test_CT {
6345 f_tc_stat_pdch_avail_occ_ms_not_known(true);
6346}
6347
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006348control {
6349 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01006350 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006351 execute( TC_ta_ptcch_idle() );
6352 execute( TC_ta_rach_imm_ass() );
Vadim Yanitskiy866f8702021-05-26 14:50:27 +02006353 execute( TC_ta_ul_ack_nack_first_block() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006354 execute( TC_ta_idle_dl_tbf_ass() );
6355 execute( TC_ta_ptcch_ul_multi_tbf() );
6356 execute( TC_cs_lqual_ul_tbf() );
6357 execute( TC_cs_initial_ul() );
6358 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01006359 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01006360 execute( TC_cs_max_dl() );
6361 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01006362 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01006363 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01006364 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01006365 execute( TC_mcs_max_dl() );
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02006366 execute( TC_t3141() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01006367 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02006368 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01006369 execute( TC_x2031_t3191() );
6370 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006371 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01006372 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02006373 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02006374 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02006375 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006376 execute( TC_mo_ping_pong() );
6377 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02006378 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006379 execute( TC_mt_ping_pong() );
6380 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006381 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006382 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07006383 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006384 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01006385 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006386 execute( TC_paging_cs_from_bts() );
6387 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
6388 execute( TC_paging_cs_from_sgsn_sign() );
6389 execute( TC_paging_cs_from_sgsn_ptp() );
6390 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
6391 execute( TC_paging_ps_from_sgsn_sign() );
6392 execute( TC_paging_ps_from_sgsn_ptp() );
Oliver Smithe1a77c42021-07-28 13:36:09 +02006393 if (mp_osmo_pcu_newer_than_0_9_0) {
6394 execute( TC_paging_pch_timeout() );
6395 }
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07006396 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
6397 execute( TC_paging_cs_multi_ms_imsi() );
6398 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02006399 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
6400 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01006401 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
6402 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006403
6404 /* EGPRS specific test cases */
6405 execute( TC_egprs_pkt_chan_req_signalling() );
6406 execute( TC_egprs_pkt_chan_req_one_phase() );
6407 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07006408 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07006409 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07006410 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02006411
6412 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07006413
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006414 /* Immediate Assignment on AGCH/PCH */
6415 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
6416 execute( TC_pcuif_fh_imm_ass_ul() );
6417 execute( TC_pcuif_fh_imm_ass_dl() );
6418 /* Packet Uplink/Downlink Assignment on PACCH */
6419 execute( TC_pcuif_fh_pkt_ass_ul() );
6420 execute( TC_pcuif_fh_pkt_ass_dl() );
6421 execute( TC_multitrx_multims_alloc() );
6422 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
6423 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
6424 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
Pau Espin Pedrol37604572021-10-15 14:36:16 +02006425 execute( TC_ul_tbf_reestablish_with_pkt_resource_req() );
Pau Espin Pedrold658f342021-10-15 14:52:22 +02006426 execute( TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() );
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006427
Pau Espin Pedrole1303052020-11-16 11:13:51 +01006428 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07006429
6430 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01006431 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01006432 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01006433 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01006434 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01006435 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01006436 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01006437 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
6438 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006439 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
6440 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
6441 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006442 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
6443 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006444 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
6445 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
6446 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006447 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006448 if (mp_ctrl_neigh_ip != "") { /* PCU using old CTRL neigh addr resolution iface */
6449 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
6450 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
6451 }
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006452
6453 execute( TC_rim_ran_info_req_single_rep() );
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006454 execute( TC_rim_ran_info_req_single_rep_eutran() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006455 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006456
6457 execute (TC_pdch_energy_saving() );
Oliver Smith3d174882021-09-03 11:38:51 +02006458
6459 execute( TC_stat_pdch_avail_occ() );
Oliver Smithf04762d2021-09-14 17:20:38 +02006460 execute( TC_stat_pdch_avail_occ_ms_not_known_gprs() );
6461 execute( TC_stat_pdch_avail_occ_ms_not_known_egprs() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006462}
6463
Harald Weltea419df22019-03-21 17:23:04 +01006464}