blob: a191cc5b586f6334e36ebbeca61848830b57c10a [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 }
Pau Espin Pedrol907ba202021-11-12 17:25:24 +01001527 /* We may already receive empty (idle) blocks before our own TTCN3 timer
1528 * triggers due to the TBF being released. Keep going until our T_3169 triggers. */
1529 [mp_osmo_pcu_newer_than_0_9_0 and n3101 == N3101_MAX + 1] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001530 [] T_3169.timeout {
1531 log("T_3169 expired");
1532 /* Done in alt */
1533 }
1534 [] BTS.receive {
1535 setverdict(fail, "Unexpected BTS message");
1536 f_shutdown(__BFILE__, __LINE__);
1537 }
1538 }
1539
1540 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1541 /* USFs as per previous TBF since they were freed at expiration time: */
1542 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1543 var uint5_t old_tfi := ms.ul_tbf.tfi;
1544 f_ms_establish_ul_tbf(ms);
1545 if (old_tfi != ms.ul_tbf.tfi) {
1546 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1547 f_shutdown(__BFILE__, __LINE__);
1548 }
1549 for (var integer i := 0; i < 8; i := i +1) {
1550 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1551 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1552 f_shutdown(__BFILE__, __LINE__);
1553 }
1554 }
1555
1556 f_shutdown(__BFILE__, __LINE__, final := true);
1557}
1558
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001559
1560/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1561 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1562 the final UL ACK sent at us. */
1563testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1564 var PCUIF_info_ind info_ind;
1565 var BTS_PDTCH_Block data_msg;
1566 var RlcmacDlBlock dl_block;
1567 var uint32_t sched_fn;
1568 var template (value) TsTrxBtsNum nr;
1569 var template RlcmacDlBlock exp_ul_ack;
1570 var template UlAckNackGprs exp_ul_ack_sub;
1571 var GprsMS ms;
1572 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1573 var integer N3103 := 0;
1574 timer T_3169 := 1.0;
1575
1576 /* Initialize GPRS MS side */
1577 f_init_gprs_ms();
1578 ms := g_ms[0]; /* We only use first MS in this test */
1579
1580 /* Initialize the PCU interface abstraction */
1581 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1582 info_ind.n3103 := N3103_MAX;
1583 info_ind.t3169 := 1;
1584 f_init_raw(testcasename(), info_ind);
1585
1586 /* Establish an Uplink TBF */
1587 f_ms_establish_ul_tbf(ms);
1588
Pau Espin Pedrol93ae4522021-05-11 15:58:26 +02001589 f_ms_tx_ul_data_block_multi(ms, 5, with_tlli := true);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001590 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1591 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1592
1593 nr := ts_TsTrxBtsNum;
1594 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1595 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1596 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1597 block_nr := nr.blk_nr));
1598 alt {
1599 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1600 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1601 exp_ul_ack)) -> value data_msg {
1602 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1603 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1604 f_shutdown(__BFILE__, __LINE__);
1605 }
1606
1607 nr := ts_TsTrxBtsNum;
1608 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1609 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1610 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1611 block_nr := nr.blk_nr));
1612 N3103 := N3103 + 1;
1613 if (N3103 == N3103_MAX) {
1614 /* At this point in time (N3103_MAX reached), PCU is
1615 * moving the TBF to RELEASE state so no data/ctrl for
1616 * it is tx'ed, hence the dummy blocks: */
1617 T_3169.start;
1618 }
1619 repeat;
1620 }
1621 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1622 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1623 exp_ul_ack)) -> value data_msg {
1624 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1625 f_shutdown(__BFILE__, __LINE__);
1626 }
1627 [] as_ms_rx_ignore_dummy(ms, nr);
Pau Espin Pedrol907ba202021-11-12 17:25:24 +01001628 [] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001629 [T_3169.running] T_3169.timeout {
1630 log("T_3169 timeout");
1631 /* Done in alt, wait for pending RTS initiated previously in
1632 * above case before continuing (expect /* Dummy block): */
1633 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1634 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1635 tr_RLCMAC_DUMMY_CTRL));
1636 }
1637 [] BTS.receive {
1638 setverdict(fail, "Unexpected BTS message");
1639 f_shutdown(__BFILE__, __LINE__);
1640 }
1641 }
1642
1643 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1644 * USFs as per previous TBF since they were freed at expiration time: */
1645 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1646 var uint5_t old_tfi := ms.ul_tbf.tfi;
1647 f_ms_establish_ul_tbf(ms);
1648 if (old_tfi != ms.ul_tbf.tfi) {
1649 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1650 f_shutdown(__BFILE__, __LINE__);
1651 }
1652 for (var integer i := 0; i < 8; i := i +1) {
1653 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1654 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1655 f_shutdown(__BFILE__, __LINE__);
1656 }
1657 }
1658
1659 f_shutdown(__BFILE__, __LINE__, final := true);
1660}
1661
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001662/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1663 * point the TBF is no longer available. In order to get to start of T3191, we
1664 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1665 * until TBF release procedure starts after draining DL queue. */
1666testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1667 var PCUIF_info_ind info_ind;
1668 var RlcmacDlBlock dl_block;
1669 var octetstring data1 := f_rnd_octstring(200);
1670 var octetstring data2 := f_rnd_octstring(10);
1671 var uint32_t dl_fn;
1672 var template (value) TsTrxBtsNum nr;
1673 var BTS_PDTCH_Block data_msg;
1674 var GprsMS ms;
1675
1676 /* Initialize NS/BSSGP side */
1677 f_init_bssgp();
1678 /* Initialize GPRS MS side */
1679 f_init_gprs_ms();
1680 ms := g_ms[0]; /* We only use first MS in this test */
1681
1682 /* Initialize the PCU interface abstraction */
1683 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1684 /* Set timer to 1 sec (default 5) to speedup test: */
1685 info_ind.t3191 := 1;
1686 f_init_raw(testcasename(), info_ind);
1687
1688 /* Establish BSSGP connection to the PCU */
1689 f_bssgp_establish();
1690 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1691
1692 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1693 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1694 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1695
1696 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1697 f_sleep(X2002);
1698
1699 while (true) {
1700 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1701
1702 /* Keep Ack/Nack description updated (except for last BSN) */
1703 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1704
1705 if (f_dl_block_rrbp_valid(dl_block)) {
1706 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1707 f_dl_block_ack_fn(dl_block, dl_fn));
1708 break;
1709 }
1710 }
1711
1712 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1713 nr := ts_TsTrxBtsNum;
1714 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1715 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1716 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1717 block_nr := nr.blk_nr));
1718 alt {
1719 [] as_ms_rx_ignore_dummy(ms, nr);
1720 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1721 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1722 ?)) -> value data_msg {
1723 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1724 log("Received FINAL_ACK");
1725 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1726 break;
1727 }
1728 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1729 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1730 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1731 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1732 }
1733 nr := ts_TsTrxBtsNum;
1734 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1735 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1736 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1737 block_nr := nr.blk_nr));
1738 repeat;
1739 }
1740 [] BTS.receive {
1741 setverdict(fail, "Unexpected BTS message");
1742 f_shutdown(__BFILE__, __LINE__);
1743 }
1744 }
1745
1746 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1747 to time out. We simply sleep instead of requesting blocks because
1748 otherwise retransmissions would keep restarting the timer. */
1749 f_sleep(int2float(info_ind.t3191));
1750
1751 /* The TBF should be freed now, so new data should trigger an Assignment: */
1752 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1753 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1754
1755 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1756 f_sleep(X2002);
1757 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1758 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1759 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1760 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1761 f_dl_block_ack_fn(dl_block, dl_fn));
1762
1763 f_shutdown(__BFILE__, __LINE__, final := true);
1764}
1765
1766/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1767testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1768 var PCUIF_info_ind info_ind;
1769 var RlcmacDlBlock dl_block;
1770 var octetstring data1 := f_rnd_octstring(1400);
1771 var octetstring data2 := f_rnd_octstring(10);
1772 var uint32_t dl_fn;
1773 var GprsMS ms;
1774
1775 /* Initialize NS/BSSGP side */
1776 f_init_bssgp();
1777 /* Initialize GPRS MS side */
1778 f_init_gprs_ms();
1779 ms := g_ms[0]; /* We only use first MS in this test */
1780
1781 /* Initialize the PCU interface abstraction */
1782 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1783 /* Set timer to 1 sec (default 5) to speedup test: */
1784 info_ind.t3191 := 1;
1785 f_init_raw(testcasename(), info_ind);
1786
1787 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1788
1789 /* Establish BSSGP connection to the PCU */
1790 f_bssgp_establish();
1791 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1792
1793 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1794 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1795 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1796
1797 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1798 f_sleep(X2002);
1799
1800 /* Send enough DL data to at least be able to DL ACK once (excl the
1801 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1802 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1803 while (true) {
1804 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1805
1806 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1807 log("Received FINAL_ACK");
1808 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1809 break;
1810 }
1811
1812 /* Keep Ack/Nack description updated (except for last BSN) */
1813 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1814
1815 if (f_dl_block_rrbp_valid(dl_block)) {
1816 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1817 f_dl_block_ack_fn(dl_block, dl_fn));
1818 }
1819 }
1820
1821 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1822 to time out. We simply sleep instead of requesting blocks because
1823 otherwise retransmissions would keep restarting the timer. */
1824 f_sleep(int2float(info_ind.t3191));
1825
1826 /* The TBF should be freed now, so new data should trigger an Assignment: */
1827 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1828 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1829
1830 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1831 f_sleep(X2002);
1832 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1833 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1834 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1835 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1836 f_dl_block_ack_fn(dl_block, dl_fn));
1837
1838 f_shutdown(__BFILE__, __LINE__, final := true);
1839}
1840
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001841/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1842 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1843 * T3193) after DL TBF release */
1844testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001845 var RlcmacDlBlock dl_block;
1846 var octetstring data := f_rnd_octstring(10);
1847 var boolean ok;
1848 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001849 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001850 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001851 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1852
1853 /* Initialize NS/BSSGP side */
1854 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001855 /* Initialize GPRS MS side */
1856 f_init_gprs_ms();
1857 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001858
1859 /* Initialize the PCU interface abstraction */
1860 f_init_raw(testcasename());
1861
1862 /* Establish BSSGP connection to the PCU */
1863 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001864 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001865
1866 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001867 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1868 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001869
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001870 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1871 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001872 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001873
1874 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001875 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1876 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1877 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001878
1879 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001880 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001881 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001882 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001883 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001884
1885 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001886
1887 /* 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 +07001888 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001889 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1890 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1891 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001892
1893 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001894}
1895
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001896/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1897 freed and no longer available. Trigger it by sending DL blocks and never DL
1898 ACKing the data (which are requested through RRBP) */
1899testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1900 var PCUIF_info_ind info_ind;
1901 var RlcmacDlBlock dl_block;
1902 var octetstring data1 := f_rnd_octstring(1000);
1903 var octetstring data2 := f_rnd_octstring(10);
1904 var uint32_t dl_fn;
1905 var template (value) TsTrxBtsNum nr;
1906 var BTS_PDTCH_Block data_msg;
1907 var GprsMS ms;
1908 const integer N3105_MAX := 2;
1909 var integer N3105 := 0;
1910 timer T_3195 := 1.0;
1911 var integer num_poll_recv := 0;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001912 var template RlcmacDlBlock dl_block_exp;
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001913
1914 /* Initialize NS/BSSGP side */
1915 f_init_bssgp();
1916 /* Initialize GPRS MS side */
1917 f_init_gprs_ms();
1918 ms := g_ms[0]; /* We only use first MS in this test */
1919
1920 /* Initialize the PCU interface abstraction */
1921 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1922 /* Speedup test: */
1923 info_ind.n3105 := N3105_MAX;
1924 info_ind.t3195 := 1;
1925 f_init_raw(testcasename(), info_ind);
1926
1927 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1928 * MS and retransmitted after the TBF is released and later on created
1929 * (because the MS is reused) */
1930 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1931
1932 /* Establish BSSGP connection to the PCU */
1933 f_bssgp_establish();
1934 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1935
1936 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1937 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1938 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1939
1940 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1941 f_sleep(X2002);
1942
1943 /* Now we go on receiving DL data and not answering RRBP: */
1944 nr := ts_TsTrxBtsNum;
1945 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1946 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1947 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1948 block_nr := nr.blk_nr));
1949 alt {
1950 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1951 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1952 tr_RLCMAC_DATA)) -> value data_msg {
1953 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1954 if (num_poll_recv == 0) {
1955 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1956 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1957 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1958 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1959 } else {
1960 log("Ignoring RRBP ", num_poll_recv);
1961 N3105 := N3105 + 1;
1962 }
1963 num_poll_recv := num_poll_recv + 1;
1964 }
1965
1966 nr := ts_TsTrxBtsNum;
1967 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1968 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1969 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1970 block_nr := nr.blk_nr));
1971 repeat;
1972 }
1973 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001974 * RELEASE state so no data for it is tx'ed, hence the dummy/idle blocks:
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001975 */
1976 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1977 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1978 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1979 if (not T_3195.running) {
1980 T_3195.start;
1981 /* We even send some new data, nothing should be sent to MS */
1982 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1983 }
1984 nr := ts_TsTrxBtsNum;
1985 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1986 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1987 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1988 block_nr := nr.blk_nr));
1989 repeat;
1990 }
Pau Espin Pedrol518e82f2021-11-12 17:24:33 +01001991 /* 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 [mp_osmo_pcu_newer_than_0_9_0 and N3105 == N3105_MAX] as_pcuif_rx_ignore_empty(nr);
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001994 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001995 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02001996 /* Done in alt, wait for pending RTS initiated previously in
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001997 * above case before continuing (expect empty blocks on new
1998 * versions, Dummy block on older versions): */
1999 if (mp_osmo_pcu_newer_than_0_9_0) {
2000 dl_block_exp := omit;
2001 } else {
2002 dl_block_exp := tr_RLCMAC_DUMMY_CTRL;
2003 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002004 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2005 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02002006 dl_block_exp));
2007 }
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002008 [] BTS.receive {
2009 setverdict(fail, "Unexpected BTS message");
2010 f_shutdown(__BFILE__, __LINE__);
2011 }
2012 }
2013
2014 /* after T_3195 timeout, TBF is released */
2015 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
2016 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2017
2018 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2019 f_sleep(X2002);
2020 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
2021
2022 /* ACK the DL block */
2023 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2024 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2025 f_dl_block_ack_fn(dl_block, dl_fn));
2026
2027 f_shutdown(__BFILE__, __LINE__, final := true);
2028}
2029
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002030/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
2031testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002032 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002033 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002034 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002035 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002036
2037 /* Initialize NS/BSSGP side */
2038 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002039 /* Initialize GPRS MS side */
2040 f_init_gprs_ms();
2041 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002042
2043 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002044 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002045
2046 /* Establish BSSGP connection to the PCU */
2047 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002048 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002049
2050 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002051 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002052
2053 /* Send one UL block (with TLLI since we are in One-Phase Access
2054 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002055 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002056 /* 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 +02002057 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 +02002058 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2059 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002060 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002061
2062 /* Send enough blocks to test whole procedure: Until Nth block
2063 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
2064 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002065 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002066 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2067 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002068 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002069
2070 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002071 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 +07002072
2073 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002074}
2075
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002076/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
2077testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
2078 var RlcmacDlBlock dl_block;
2079 var uint32_t dl_fn, sched_fn;
2080 var octetstring payload;
2081 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002082 var template (value) LlcBlockHdr blk_hdr;
2083 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002084 var integer blk_len;
2085 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002086 var GprsMS ms;
2087
2088 /* Initialize NS/BSSGP side */
2089 f_init_bssgp();
2090 /* Initialize GPRS MS side */
2091 f_init_gprs_ms();
2092 ms := g_ms[0]; /* We only use first MS in this test */
2093
2094 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002095 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002096
2097 /* Establish BSSGP connection to the PCU */
2098 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002099 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002100
2101 /* Establish an Uplink TBF */
2102 f_ms_establish_ul_tbf(ms);
2103
2104 /* Send one UL block (with TLLI since we are in One-Phase Access
2105 contention resoultion) and make sure it is ACKED fine. */
2106 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002107 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2108 more := false, e := true);
2109 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002110 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002111 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
2112 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002113 cv := 15,
2114 bsn := ms.ul_tbf.bsn,
2115 blocks := blocks,
2116 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002117 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002118 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002119
2120 /* ACK and check it was received fine */
2121 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2122 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2123 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2124 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002125 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 +02002126
2127 /* Test sending LLC PDUS of incrementing size */
2128 var integer max_size := 49;
2129 for (var integer i := 1; i <= max_size; i := i + 1) {
2130 var integer cv;
2131 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
2132 log("Sending DATA.ind with LLC payload size ", i);
2133 if (i < max_size - g_bs_cv_max) {
2134 cv := 15;
2135 } else {
2136 cv := max_size - i;
2137 }
2138
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002139 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
2140 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002141 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002142 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2143 more := false, e := true);
2144 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002145 /* 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 +01002146 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
2147 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002148 cv := cv,
2149 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002150 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002151 f_ultbf_inc_bsn(ms.ul_tbf);
2152 f_ms_tx_ul_block(ms, ul_data);
2153
2154 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002155 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 +02002156
2157 /* we will receive UL ACK/NACK from time to time, handle it. */
2158 f_rx_rlcmac_dl_block(dl_block, dl_fn);
2159 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
2160 continue;
2161 }
2162 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2163 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2164 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2165 f_shutdown(__BFILE__, __LINE__);
2166 }
2167
2168 log("Rx Packet Uplink ACK / NACK");
2169 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2170 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2171 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2172 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002173
2174 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002175}
2176
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002177function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2178 var octetstring payload;
2179 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002180 var template (value) LlcBlockHdr blk_hdr;
2181 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002182 var integer block_len, max_valid_data_len;
2183 timer T;
2184
2185 block_len := f_rlcmac_cs_mcs2block_len(cs);
2186 /* We need to send with TLLI since we are in One-Phase Access Contenion
2187 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
2188 * indicator, -1 for spare bits octet at the end */
2189 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2190 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 +07002191 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2192 more := false, e := true);
2193 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002194 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2195 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002196 cv := cv,
2197 bsn := ms.ul_tbf.bsn,
2198 blocks := blocks,
2199 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002200 f_ultbf_inc_bsn(ms.ul_tbf);
2201 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2202
2203 T.start(0.5);
2204 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002205 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002206 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2207 f_shutdown(__BFILE__, __LINE__);
2208 }
2209 [] T.timeout {
2210 setverdict(pass);
2211 }
2212 }
2213}
2214/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2215 blocks intentionally contain last byte of data placed in last byte of RLC
2216 containing padding/spare bits, which is incorrect. Spare bits exist and are
2217 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2218 discounting padding in octet" */
2219testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2220 var GprsMS ms;
2221 var integer block_len, max_valid_data_len;
2222
2223 /* Initialize NS/BSSGP side */
2224 f_init_bssgp();
2225 /* Initialize GPRS MS side */
2226 f_init_gprs_ms();
2227 ms := g_ms[0]; /* We only use first MS in this test */
2228
2229 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002230 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002231
2232 /* Establish BSSGP connection to the PCU */
2233 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002234 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002235
2236 /* Establish an Uplink TBF */
2237 f_ms_establish_ul_tbf(ms);
2238
2239 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2240 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2241 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2242
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002243 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002244}
2245
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002246/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2247 * answered, so TBFs for uplink and later for downlink are created.
2248 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002249private 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 +02002250 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002251 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002252 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002253 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002254 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002255
2256 /* Initialize NS/BSSGP side */
2257 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002258 /* Initialize GPRS MS side */
2259 f_init_gprs_ms();
2260 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002261
2262 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002263 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002264
2265 /* Establish BSSGP connection to the PCU */
2266 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002267 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002268
2269 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002270 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002271
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002272 /* Send one UL block (with TLLI since we are in One-Phase Access
2273 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002274 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 +02002275 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2276 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002277 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002278
2279 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002280 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002281
2282 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002283 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2284 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002285
2286 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2287 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002288 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002289
2290 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002291 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2292 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2293 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002294
2295 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002296}
2297
2298/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2299 * answered, so TBFs for uplink and later for downlink are created.
2300 */
2301testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002302 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002303 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002304}
2305
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002306/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2307 * answered, so TBFs for uplink and later for downlink are created.
2308 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002309private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2310 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002311 template (present) CodingScheme exp_ul_cs_mcs := ?,
2312 template (present) CodingScheme exp_dl_cs_mcs := ?)
2313runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002314 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002315 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002316 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002317 var uint32_t sched_fn;
2318 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002319 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002320 var GprsMS ms;
2321
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002322 /* Initialize NS/BSSGP side */
2323 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002324 /* Initialize GPRS MS side */
2325 f_init_gprs_ms();
2326 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002327
2328 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002329 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002330
2331 /* Establish BSSGP connection to the PCU */
2332 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002333 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002334
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002335 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2336 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 +02002337
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002338 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2339 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 +02002340 f_shutdown(__BFILE__, __LINE__);
2341 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002342
2343 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2344 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002345 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002346
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002347 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002348 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 +02002349
2350 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002351 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002352
2353 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002354 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002355 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2356 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002357 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002358 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002359 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002360
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002361 /* PCU acks the UL data after having received CV=0) */
2362 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2363
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002364 /* 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 +02002365 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 +02002366
2367 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002368 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2369 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 +02002370 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002371
2372 f_shutdown(__BFILE__, __LINE__, final := true);
2373}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002374
2375testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002376 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2377 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002378
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002379 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 Pedrol023330d2021-11-08 14:10:21 +01002380
2381 if (mp_osmo_pcu_newer_than_0_9_0) {
2382 var StatsDExpects expect := {
2383 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2384 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2385 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2386 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2387 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2388 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2389 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2390 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2391 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2392 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2393 };
2394 f_statsd_expect(expect);
2395 }
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002396}
2397
2398testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002399 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2400 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002401
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002402 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 Pedrol023330d2021-11-08 14:10:21 +01002403 if (mp_osmo_pcu_newer_than_0_9_0) {
2404 var StatsDExpects expect := {
2405 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2406 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2407 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2408 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2409 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2410 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2411 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2412 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2413 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2414 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2415 };
2416 f_statsd_expect(expect);
2417 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002418}
2419
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002420testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2421 /* Configure PCU to force two phase access */
2422 g_force_two_phase_access := true;
2423
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002424 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002425 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002426
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002427 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 Pedrol023330d2021-11-08 14:10:21 +01002428
2429 if (mp_osmo_pcu_newer_than_0_9_0) {
2430 var StatsDExpects expect := {
2431 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2432 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2433 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
2434 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
2435 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2436 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2437 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2438 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2439 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2440 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2441 };
2442 f_statsd_expect(expect);
2443 }
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002444}
2445
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002446/* Test scenario where SGSN wants to send some data against MS and it is
2447 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2448 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002449private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2450 template (present) CodingScheme exp_cs_mcs := ?)
2451runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002452 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002453 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002454 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002455 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002456 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002457
2458 /* Initialize NS/BSSGP side */
2459 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002460 /* Initialize GPRS MS side */
2461 f_init_gprs_ms();
2462 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002463
2464 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002465 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002466
2467 /* Establish BSSGP connection to the PCU */
2468 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002469 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002470
2471 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002472 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2473 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002474
2475 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2476 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002477 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002478
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002479 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002480 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2481 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 +02002482 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002483
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002484 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002485 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002486
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002487 /* Send one UL block (with TLLI since we are in One-Phase Access
2488 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002489 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002490 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2491 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002492 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002493
2494 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002495 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002496
2497 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002498}
2499
2500testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002501 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002502 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2503}
2504
2505/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2506/* information about the MS */
2507testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002508 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002509 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002510}
2511
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002512/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2513 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2514 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2515 * be transferred).
2516 */
2517testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002518 var RlcmacDlBlock dl_block;
2519 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002520 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002521 var octetstring total_payload;
2522 var octetstring payload;
2523 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002524 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002525 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002526 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002527
2528 /* Initialize NS/BSSGP side */
2529 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002530 /* Initialize GPRS MS side */
2531 f_init_gprs_ms();
2532 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002533
2534 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002535 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002536
2537 /* Establish BSSGP connection to the PCU */
2538 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002539 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002540
2541 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002542 f_ms_establish_ul_tbf(ms);
2543 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002544
2545 /* Send one UL block (with TLLI since we are in One-Phase Access
2546 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002547 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 +02002548 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 +02002549
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002550 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2551 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002552 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002553 total_payload := payload;
2554
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002555 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2556
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002557 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002558 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002559 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002560 total_payload := total_payload & payload;
2561
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002562 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002563 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002564 total_payload := total_payload & payload;
2565
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002566 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002567 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 +02002568 total_payload := total_payload & lost_payload;
2569
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002570 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002571 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002572 total_payload := total_payload & payload;
2573
2574 /* 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 +02002575 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002576
2577 /* On CV=0, we'll receive a UL ACK asking about missing block */
2578 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2579 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002580 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2581 tfi := tfi,
2582 cv := 15,
2583 bsn := 3,
2584 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002585 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002586
2587 /* Now final ack is recieved */
2588 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2589 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002590 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002591
2592 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002593 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 +07002594
2595 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002596}
2597
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002598/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2599 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2600 * timeout occurs (specified by sent RRBP on DL block). */
2601testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002602 var RlcmacDlBlock dl_block;
2603 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002604 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002605 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002606
2607 /* Initialize NS/BSSGP side */
2608 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002609 /* Initialize GPRS MS side */
2610 f_init_gprs_ms();
2611 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002612
2613 /* Initialize the PCU interface abstraction */
2614 f_init_raw(testcasename());
2615
2616 /* Establish BSSGP connection to the PCU */
2617 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002618 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002619
2620 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002621 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2622 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002623
2624 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2625 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002626 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002627
2628 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2629 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2630 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002631 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002632
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002633 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2634 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002635 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002636
2637 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002638 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2639 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2640 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002641
2642 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002643}
2644
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002645/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2646testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2647 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2648 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002649 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002650 var RlcmacDlBlock dl_block;
2651 var uint32_t ack_fn;
2652 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002653 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002654 timer T := 5.0;
2655
2656 /* Initialize NS/BSSGP side */
2657 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002658 /* Initialize GPRS MS side */
2659 f_init_gprs_ms();
2660 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002661
2662 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002663 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002664
Daniel Willmann535aea62020-09-21 13:27:08 +02002665 f_statsd_reset();
2666
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002667 /* Establish BSSGP connection to the PCU */
2668 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002669 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002670
2671 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002672 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2673 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002674
2675 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2676 f_sleep(X2002);
2677
2678 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2679 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002680 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002681
2682 /* TDMA frame number on which we are supposed to send the ACK */
2683 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2684
2685 /* SGSN sends more blocks during the indicated RRBP */
2686 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2687 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002688 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002689
2690 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2691
2692 /* Make sure this block has the same TFI as was assigned
2693 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002694 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002695 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2696 dl_block.data.mac_hdr.hdr_ext.tfi);
2697 f_shutdown(__BFILE__, __LINE__);
2698 }
2699
2700 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002701 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002702
2703 /* Break if this is the end of RRBP */
2704 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002705 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002706 break;
2707 }
2708 }
2709
2710 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002711 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 +07002712
2713 /* Make sure that the next block (after the Ack) is dummy */
2714 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2715
Daniel Willmann535aea62020-09-21 13:27:08 +02002716 var StatsDExpects expect := {
2717 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2718 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2719 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2720 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2721 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002722 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002723 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2724 };
2725 f_statsd_expect(expect);
2726
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002727 f_shutdown(__BFILE__, __LINE__, final := true);
2728}
2729
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002730/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2731 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2732 * Check "3GPP TS 44.060" Annex B. */
2733testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2734 var RlcmacDlBlock dl_block;
2735 var octetstring dataA := f_rnd_octstring(20);
2736 var octetstring dataB := f_rnd_octstring(13);
2737 var octetstring dataC := f_rnd_octstring(3);
2738 var octetstring dataD := f_rnd_octstring(12);
2739 var uint32_t sched_fn;
2740 var GprsMS ms;
2741 var template (value) RlcmacUlBlock ul_data;
2742
2743 /* Initialize NS/BSSGP side */
2744 f_init_bssgp();
2745 /* Initialize GPRS MS side */
2746 f_init_gprs_ms();
2747 ms := g_ms[0]; /* We only use first MS in this test */
2748
2749 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002750 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002751
2752 /* Establish BSSGP connection to the PCU */
2753 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002754 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002755
2756 /* Establish an Uplink TBF */
2757 f_ms_establish_ul_tbf(ms);
2758
2759 /* Summary of what's transmitted:
2760 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2761 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2762 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2763 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2764 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2765 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2766 */
2767
2768 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002769 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2770 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002771 cv := 3,
2772 bsn := ms.ul_tbf.bsn,
2773 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2774 tlli := ms.tlli);
2775 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2776 * RLCMAC block being sent. */
2777 ul_data.data.mac_hdr.e := true;
2778 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002779 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002780
2781 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002782 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2783 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002784 cv := 2,
2785 bsn := ms.ul_tbf.bsn,
2786 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2787 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2788 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2789 },
2790 tlli := ms.tlli);
2791 f_ultbf_inc_bsn(ms.ul_tbf);
2792 f_ms_tx_ul_block(ms, ul_data);
2793
2794 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002795 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 +02002796
2797 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002798 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2799 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002800 cv := 1,
2801 bsn := ms.ul_tbf.bsn,
2802 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2803 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2804 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2805 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2806 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2807 },
2808 tlli := ms.tlli);
2809 f_ultbf_inc_bsn(ms.ul_tbf);
2810 f_ms_tx_ul_block(ms, ul_data);
2811
2812 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002813 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2814 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 +02002815
2816 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002817 ul_data := t_RLCMAC_UL_DATA_TLLI(
2818 cs := CS_1,
2819 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002820 cv := 0,
2821 bsn := ms.ul_tbf.bsn,
2822 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2823 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2824 },
2825 tlli := ms.tlli);
2826 f_ultbf_inc_bsn(ms.ul_tbf);
2827 f_ms_tx_ul_block(ms, ul_data);
2828
2829 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002830 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataD));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002831
2832 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2833 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2834 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2835
2836 f_shutdown(__BFILE__, __LINE__, final := true);
2837}
2838
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002839/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2840 * ACK/NACK is not answered */
2841testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2842 var RlcmacDlBlock dl_block;
2843 var octetstring data1 := f_rnd_octstring(200);
2844 var octetstring data2 := f_rnd_octstring(10);
2845 var uint32_t dl_fn;
2846 var GprsMS ms;
2847 var template (value) TsTrxBtsNum nr;
2848 var BTS_PDTCH_Block data_msg;
2849
2850 /* Initialize NS/BSSGP side */
2851 f_init_bssgp();
2852 /* Initialize GPRS MS side */
2853 f_init_gprs_ms();
2854 ms := g_ms[0]; /* We only use first MS in this test */
2855
2856 /* Initialize the PCU interface abstraction */
2857 f_init_raw(testcasename())
2858
2859 /* Establish BSSGP connection to the PCU */
2860 f_bssgp_establish();
2861 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2862
2863 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2864 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2865 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2866
2867 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2868 f_sleep(X2002);
2869
2870 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2871 while (true) {
2872 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2873
2874 /* Keep Ack/Nack description updated (except for last BSN) */
2875 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2876
2877 if (f_dl_block_rrbp_valid(dl_block)) {
2878 /* Don't transmit DL ACK here on purpose ignore it */
2879 break;
2880 }
2881 }
2882
2883 /* PCU starts whole process again */
2884 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2885
2886 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2887 f_sleep(X2002);
2888
2889 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2890 /* DL data), after that we receive only DUMMY blocks so we are done */
2891 var boolean data_received := false;
2892 nr := ts_TsTrxBtsNum;
2893 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2894 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2895 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2896 block_nr := nr.blk_nr));
2897 alt {
2898 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2899 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2900 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2901 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2902 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2903 tr_RLCMAC_DATA)) -> value data_msg {
2904 data_received := true;
2905 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2906 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2907 log("Received FINAL_ACK");
2908 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2909 }
2910 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2911 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2912 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2913 }
2914 nr := ts_TsTrxBtsNum;
2915 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2916 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2917 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2918 block_nr := nr.blk_nr));
2919 repeat;
2920 }
2921 [] BTS.receive {
2922 setverdict(fail, "Unexpected BTS message");
2923 f_shutdown(__BFILE__, __LINE__);
2924 }
2925 }
2926
2927 f_shutdown(__BFILE__, __LINE__, final := true);
2928}
2929
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002930/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2931testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002932 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002933 var octetstring data := f_rnd_octstring(10);
2934 var PacketDlAssign dl_tbf_ass;
2935 var RlcmacDlBlock dl_block;
2936 var uint32_t poll_fn;
2937 var uint32_t sched_fn;
2938 var GprsMS ms;
2939 timer T := 5.0;
2940
2941 /* Initialize NS/BSSGP side */
2942 f_init_bssgp();
2943 /* Initialize GPRS MS side */
2944 f_init_gprs_ms();
2945 ms := g_ms[0]; /* We only use first MS in this test */
2946
2947 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002948 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2949 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002950
2951 /* Initialize the PCU interface abstraction */
2952 f_init_raw(testcasename(), info_ind);
2953
2954 /* Establish BSSGP connection to the PCU */
2955 f_bssgp_establish();
2956 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2957
2958 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2959 through PDCH (no multiblock assignment possible through PCH) */
2960 f_ms_establish_ul_tbf(ms);
2961
2962 /* Send one UL block (with TLLI since we are in One-Phase Access
2963 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002964 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
2965 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002966 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2967 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2968
2969 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2970 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2971 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2972 gprsextendeddynalloccap := '0'B
2973 };
2974 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2975 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2976 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2977 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2978 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2979 f_shutdown(__BFILE__, __LINE__);
2980 }
2981 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2982
2983 f_shutdown(__BFILE__, __LINE__, final := true);
2984}
2985
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002986testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002987 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002988 var RlcmacDlBlock dl_block;
2989 var octetstring data := f_rnd_octstring(10);
2990 var PollFnCtx pollctx;
2991 var uint32_t sched_fn;
2992 var GprsMS ms;
2993
2994 var MultislotCap_GPRS mscap_gprs := {
2995 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2996 gprsextendeddynalloccap := '0'B
2997 };
2998 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
2999
3000
3001 /* Initialize NS/BSSGP side */
3002 f_init_bssgp();
3003 /* Initialize GPRS MS side */
3004 f_init_gprs_ms();
3005 ms := g_ms[0]; /* We only use first MS in this test */
3006
3007 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003008 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3009 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003010
3011 /* Initialize the PCU interface abstraction */
3012 f_init_raw(testcasename(), info_ind);
3013
3014 /* Establish BSSGP connection to the PCU */
3015 f_bssgp_establish();
3016 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3017
3018 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3019 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3020
3021 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3022 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
3023
3024 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3025 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
3026 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
3027 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
3028 f_shutdown(__BFILE__, __LINE__);
3029 }
3030 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3031
3032 f_shutdown(__BFILE__, __LINE__, final := true);
3033}
3034
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003035testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
3036 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3037 var RlcmacDlBlock dl_block;
3038 var octetstring data := f_rnd_octstring(10);
3039 var PollFnCtx pollctx;
3040 var uint32_t sched_fn;
3041 var GprsMS ms;
3042
3043 var MultislotCap_GPRS mscap_gprs := {
3044 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3045 gprsextendeddynalloccap := '0'B
3046 };
3047 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3048
3049
3050 /* Initialize NS/BSSGP side */
3051 f_init_bssgp();
3052 /* Initialize GPRS MS side */
3053 f_init_gprs_ms();
3054 ms := g_ms[0]; /* We only use first MS in this test */
3055
3056 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003057 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3058 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003059
3060 /* Initialize the PCU interface abstraction */
3061 f_init_raw(testcasename(), info_ind);
3062
3063 /* Establish BSSGP connection to the PCU */
3064 f_bssgp_establish();
3065 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3066
3067 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3068 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3069
3070 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
3071 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
3072 f_shutdown(__BFILE__, __LINE__);
3073 }
3074
3075 f_shutdown(__BFILE__, __LINE__, final := true);
3076}
3077
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003078/* Test scenario where MS wants to request a new TBF once the current one is
3079 * ending, by means of sending a Packet Resource Request on ul slot provided by
3080 * last Pkt Ul ACK's RRBP.
3081 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3082testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003083 var RlcmacDlBlock dl_block;
3084 var octetstring data := f_rnd_octstring(10);
3085 var uint32_t sched_fn;
3086 var uint32_t dl_fn;
3087 var template RlcmacDlBlock acknack_tmpl;
3088 var GprsMS ms;
3089
3090 /* Initialize NS/BSSGP side */
3091 f_init_bssgp();
3092 /* Initialize GPRS MS side */
3093 f_init_gprs_ms();
3094 ms := g_ms[0]; /* We only use first MS in this test */
3095
3096 /* Initialize the PCU interface abstraction */
3097 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003098 f_statsd_reset();
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003099
3100 /* Establish BSSGP connection to the PCU */
3101 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003102 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003103
3104 /* Establish an Uplink TBF */
3105 f_ms_establish_ul_tbf(ms);
3106
3107 /* Send one UL block (with TLLI since we are in One-Phase Access
3108 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003109 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 +02003110
3111 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003112 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003113
3114 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3115 tr_UlAckNackGprs(ms.tlli,
3116 tr_AckNackDescription(final_ack := '1'B),
3117 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3118 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3119
3120 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3121
3122 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07003123 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 +07003124 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003125 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3126 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3127
3128 /* Send one UL block (without TLLI since we are in Second-Phase Access)
3129 and make sure it is ACKED fine */
3130 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
3131
3132 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003133 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003134
3135 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3136 /* ACK the ACK */
3137 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3138
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003139 if (mp_osmo_pcu_newer_than_0_9_0) {
3140 var StatsDExpects expect := {
3141 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
3142 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
3143 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
3144 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3145 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
3146 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 1, max := 1 },
3147 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
3148 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
3149 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
3150 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
3151 };
3152 f_statsd_expect(expect);
3153 }
3154
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003155 f_shutdown(__BFILE__, __LINE__, final := true);
3156}
3157
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003158/* Test scenario where MS wants to request a new TBF once the current one is
3159 * ending, by means of sending a Packet Resource Request on ul slot provided by
3160 * last Pkt Ul ACK's RRBP. new Pkt Ul Ass is never confirmed by the MS in this test.
3161 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3162testcase TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() runs on RAW_PCU_Test_CT {
3163 var PCUIF_info_ind info_ind;
3164 var RlcmacDlBlock dl_block;
3165 var octetstring data := f_rnd_octstring(10);
3166 var uint32_t sched_fn;
3167 var uint32_t dl_fn;
3168 var template (value) TsTrxBtsNum nr;
3169 var BTS_PDTCH_Block data_msg;
3170 var template RlcmacDlBlock acknack_tmpl;
3171 var GprsMS ms;
3172 const integer N3105_MAX := 2;
3173 var integer N3105 := 0;
3174 timer T_3195 := 1.0 + 0.5; /* 0.5: extra offset since we cannot match exactly */
3175
3176 /* Initialize NS/BSSGP side */
3177 f_init_bssgp();
3178 /* Initialize GPRS MS side */
3179 f_init_gprs_ms();
3180 ms := g_ms[0]; /* We only use first MS in this test */
3181
3182 /* Initialize the PCU interface abstraction */
3183 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3184 /* Speedup test: */
3185 info_ind.n3105 := N3105_MAX;
3186 info_ind.t3195 := 1;
3187 f_init_raw(testcasename(), info_ind);
3188
3189 /* Establish BSSGP connection to the PCU */
3190 f_bssgp_establish();
3191 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3192
3193 /* Establish an Uplink TBF */
3194 f_ms_establish_ul_tbf(ms);
3195
3196 /* Send one UL block (with TLLI since we are in One-Phase Access
3197 contention resoultion) and make sure it is ACKED fine */
3198 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
3199
3200 /* UL block should be received in SGSN */
3201 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
3202
3203 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3204 tr_UlAckNackGprs(ms.tlli,
3205 tr_AckNackDescription(final_ack := '1'B),
3206 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3207 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3208
3209 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3210
3211 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
3212 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)), sched_fn);
3213
3214 /* Now Keep ignoring the Pkt Ul Ass on PACCH: */
3215 /* Now we go on receiving DL data and not answering RRBP: */
3216 nr := ts_TsTrxBtsNum;
3217 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3218 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3219 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3220 block_nr := nr.blk_nr));
3221 alt {
3222 [not T_3195.running] 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 tr_RLCMAC_UL_PACKET_ASS)) -> value data_msg {
3225 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
3226 log("Ignoring RRBP N3105 ", N3105);
3227 N3105 := N3105 + 1;
3228 }
3229 nr := ts_TsTrxBtsNum;
3230 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3231 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3232 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3233 block_nr := nr.blk_nr));
3234 repeat;
3235 }
3236 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
3237 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
3238 */
3239 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3240 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3241 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
3242 if (not T_3195.running) {
3243 T_3195.start;
3244 }
3245 nr := ts_TsTrxBtsNum;
3246 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3247 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3248 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3249 block_nr := nr.blk_nr));
3250 repeat;
3251 }
3252 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3253 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3254 omit)) -> value data_msg {
3255 /* We may already receive idle blocks before our own TTCN3 timer
3256 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
3257 nr := ts_TsTrxBtsNum;
3258 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3259 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3260 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3261 block_nr := nr.blk_nr));
3262 repeat;
3263 }
3264 /* We receive Dummy blocks in between Pkt Ul Ass while PCU waits for us to ack it */
3265 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3266 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3267 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
3268 log("Ignoring Dummy block FN ", data_msg.raw.fn);
3269 nr := ts_TsTrxBtsNum;
3270 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3271 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3272 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3273 block_nr := nr.blk_nr));
3274 repeat;
3275 }
3276 [T_3195.running] T_3195.timeout {
3277 log("T_3195 timeout");
3278 /* Done in alt, wait for pending RTS initiated previously in
3279 * above case before continuing (expect nothing to be sent since there's no active TBF): */
3280 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3281 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3282 omit));
3283 }
3284 [] BTS.receive {
3285 setverdict(fail, "Unexpected BTS message");
3286 f_shutdown(__BFILE__, __LINE__);
3287 }
3288 }
3289
3290 f_shutdown(__BFILE__, __LINE__, final := true);
3291}
3292
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003293/* Test CS paging over the BTS<->PCU socket.
3294 * 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.
3295 * Paging should be send on the PACCH.
3296 *
3297 * 1. Send a Paging Request over PCU socket.
3298 * 2. Send a Ready-To-Send message over PCU socket
3299 * 3. Expect a Paging Frame
3300 */
3301testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003302 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003303 var MobileIdentityLV mi;
3304 var octetstring mi_enc_lv;
3305 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003306 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003307
3308 /* Initialize NS/BSSGP side */
3309 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003310 /* Initialize GPRS MS side */
3311 f_init_gprs_ms();
3312 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003313
3314 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003315 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003316
3317 /* Establish BSSGP connection to the PCU */
3318 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003319 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003320
3321 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003322 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003323
3324 /* build mobile Identity */
3325 mi := valueof(ts_MI_IMSI_LV(imsi));
3326 mi_enc_lv := enc_MobileIdentityLV(mi);
3327 /* Send paging request */
3328 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
3329 sapi :=PCU_IF_SAPI_PDTCH));
3330
3331 /* Receive it on BTS side towards MS */
3332 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3333
3334 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003335 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3336 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3337 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3338 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003339
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003340 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003341}
3342
3343/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
3344 */
3345private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3346runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003347 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003348 var hexstring imsi := f_gen_imsi(42);
3349 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003350 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003351
3352 /* Initialize NS/BSSGP side */
3353 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003354 /* Initialize GPRS MS side */
3355 f_init_gprs_ms();
3356 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003357
3358 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003359 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003360
3361 /* Establish BSSGP connection to the PCU */
3362 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003363 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003364
3365 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003366 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003367
3368 /* Send paging request with or without TMSI */
3369 if (use_ptmsi) {
3370 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3371 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3372 } else {
3373 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3374 }
3375
3376 /* Receive it on BTS side towards MS */
3377 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3378
3379 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003380 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003381 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003382 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3383 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3384 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003385 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003386 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3387 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3388 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003389 }
3390
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003391 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003392}
3393
3394testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3395 f_tc_paging_cs_from_sgsn(0, true);
3396}
3397
3398testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3399 f_tc_paging_cs_from_sgsn(0);
3400}
3401
3402testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003403 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003404}
3405
3406/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3407 */
3408private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3409runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003410 var integer imsi_suff_tx := 423;
3411 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003412 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003413
3414 /* Initialize NS/BSSGP side */
3415 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003416 /* Initialize GPRS MS side */
3417 f_init_gprs_ms();
3418 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003419
Oliver Smith61b4e732021-07-22 08:14:29 +02003420 f_statsd_reset();
3421
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003422 /* Establish BSSGP connection to the PCU */
3423 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003424 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003425
3426 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3427 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3428 if (use_ptmsi) {
3429 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3430 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3431 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3432 } else {
3433 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3434 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3435 }
3436
Oliver Smith61b4e732021-07-22 08:14:29 +02003437 if (mp_osmo_pcu_newer_than_0_9_0) {
3438 var StatsDExpects expect := {
Oliver Smith36d95d82021-08-06 22:01:53 +02003439 { name := "TTCN3.pcu.sgsn.0.rx_paging_ps", mtype := "c", min := 1, max := 1 },
3440 /* After the PCU receives the paging request from SGSN,
3441 * and it doesn't have any errors, PCU sends it to the
3442 * BTS to do paging over PCH. */
3443 { name := "TTCN3.bts.0.pch.requests", mtype := "c", min := 1, max := 1 }
Oliver Smith61b4e732021-07-22 08:14:29 +02003444 };
3445 f_statsd_expect(expect);
3446 }
Oliver Smithfbd39312021-07-27 15:23:39 +02003447}
3448
3449testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3450 /* Initialize the PCU interface abstraction */
3451 f_init_raw(testcasename());
3452
3453 f_tc_paging_ps_from_sgsn(0, true);
Oliver Smith61b4e732021-07-22 08:14:29 +02003454
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003455 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003456}
3457
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003458testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003459 /* Initialize the PCU interface abstraction */
3460 f_init_raw(testcasename());
3461
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003462 f_tc_paging_ps_from_sgsn(0);
Oliver Smithfbd39312021-07-27 15:23:39 +02003463
3464 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003465}
3466
3467testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003468 /* Initialize the PCU interface abstraction */
3469 f_init_raw(testcasename());
3470
Harald Welte5339b2e2020-10-04 22:52:56 +02003471 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Oliver Smithfbd39312021-07-27 15:23:39 +02003472
3473 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003474}
3475
Oliver Smithe1a77c42021-07-28 13:36:09 +02003476testcase TC_paging_pch_timeout() runs on RAW_PCU_Test_CT {
3477 /* Initialize the PCU interface abstraction */
3478 f_init_raw(testcasename());
3479
3480 /* Set T3113 to 1s to shorten the test duration */
3481 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 1");
3482
3483 /* Reset stats and send paging PS request */
3484 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
3485
3486 /* Verify that counter increases when T3113 times out (MS did not start
3487 * TBF to respond to paging). */
3488 f_sleep(1.2);
3489 var StatsDExpects expect := {
3490 { name := "TTCN3.bts.0.pch.requests.timeout", mtype := "c", min := 1, max := 1 }
3491 };
3492 f_statsd_expect(expect);
3493
3494 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 default");
3495 f_shutdown(__BFILE__, __LINE__, final := true);
3496}
3497
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003498/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3499testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3500 var RlcmacDlBlock dl_block;
3501 var octetstring data := f_rnd_octstring(10);
3502 var uint32_t sched_fn;
3503 var uint32_t dl_fn;
3504 var GprsMS ms;
3505
3506 /* Initialize NS/BSSGP side */
3507 f_init_bssgp();
3508 /* Initialize GPRS MS side */
3509 f_init_gprs_ms();
3510 ms := g_ms[0]; /* We only use first MS in this test */
3511
3512 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003513 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003514
Daniel Willmann535aea62020-09-21 13:27:08 +02003515 f_statsd_reset();
3516
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003517 /* Establish BSSGP connection to the PCU */
3518 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003519 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003520
3521 /* Establish an Uplink TBF */
3522 f_ms_establish_ul_tbf(ms);
3523
3524 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003525 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 +02003526 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3527 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3528 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3529
3530 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003531 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003532
3533 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3534 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3535 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3536
3537 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3538 f_sleep(X2002);
3539 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3540
3541 /* ACK the DL block */
3542 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3543 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3544 f_dl_block_ack_fn(dl_block, dl_fn));
3545
Daniel Willmann535aea62020-09-21 13:27:08 +02003546 var StatsDExpects expect := {
3547 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3548 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3549 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3550 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003551 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003552 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003553 };
3554 f_statsd_expect(expect);
3555
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003556 f_shutdown(__BFILE__, __LINE__, final := true);
3557}
3558
3559/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3560testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3561 var RlcmacDlBlock dl_block;
3562 var octetstring data := f_rnd_octstring(10);
3563 var uint32_t sched_fn;
3564 var uint32_t dl_fn;
3565 var GprsMS ms;
3566
3567 /* Initialize NS/BSSGP side */
3568 f_init_bssgp();
3569 /* Initialize GPRS MS side */
3570 f_init_gprs_ms();
3571 ms := g_ms[0]; /* We only use first MS in this test */
3572
3573 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003574 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003575
3576 /* Establish BSSGP connection to the PCU */
3577 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003578 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003579
3580 /* Establish an Uplink TBF */
3581 f_ms_establish_ul_tbf(ms);
3582
3583 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003584 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 +02003585 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3586 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3587 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3588
3589 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003590 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003591
3592 /* Now SGSN sends some DL data with an invalid IMSI */
3593 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3594
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003595 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003596
3597 /* TODO: make sure no data is sent over PCU -> MS */
3598
3599 f_shutdown(__BFILE__, __LINE__, final := true);
3600}
3601
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003602private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3603 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3604 var octetstring data := f_rnd_octstring(6);
3605 var RlcmacDlBlock dl_block;
3606 var GprsMS ms;
3607 var uint32_t fn;
3608
3609 /* Initialize NS/BSSGP side */
3610 f_init_bssgp();
3611 /* Initialize GPRS MS side */
3612 f_init_gprs_ms();
3613 ms := g_ms[0]; /* We only use first MS in this test */
3614
3615 /* Initialize the PCU interface abstraction */
3616 f_init_raw(testcasename());
3617
3618 /* Establish BSSGP connection to the PCU */
3619 f_bssgp_establish();
3620 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3621
3622 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3623 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3624 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3625
3626 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3627 f_sleep(X2002);
3628
3629 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3630 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3631
3632 if (ischosen(dl_block.data_egprs)) {
3633 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3634 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3635 f_shutdown(__BFILE__, __LINE__);
3636 }
3637 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3638 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3639 f_shutdown(__BFILE__, __LINE__);
3640 }
3641 if (not match(dl_block.data_egprs.blocks[1].payload,
3642 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3643 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3644 f_shutdown(__BFILE__, __LINE__);
3645 }
3646 } else if (lengthof(dl_block.data.blocks) > 1) {
3647 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3648 f_shutdown(__BFILE__, __LINE__);
3649 }
3650
3651 f_shutdown(__BFILE__, __LINE__, final := true);
3652}
3653
3654/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3655 * containing llc data. See OS#4849 */
3656testcase TC_dl_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3657 f_tc_dl_data_no_llc_ui_dummy(omit);
3658}
3659
3660/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3661 * containing llc data. See OS#4849 */
3662testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003663 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003664}
3665
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003666private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003667 template GsmRrMessage t_imm_ass := ?,
3668 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003669runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003670 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003671 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003672
3673 ra11 := enc_EGPRSPktChRequest2uint(req);
3674 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3675
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003676 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003677 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003678 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003679 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003680 }
3681
3682 setverdict(pass);
3683}
3684
3685testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3686 var template GsmRrMessage imm_ass;
3687 var template IaRestOctets rest;
3688 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003689 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003690
3691 /* Initialize the PCU interface abstraction */
3692 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003693 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003694
3695 var EGPRSPktChRequest req := {
3696 /* NOTE: other fields are set in the loop */
3697 signalling := { tag := '110011'B }
3698 };
3699
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003700 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003701 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3702 req.signalling.random_bits := ext_ra;
3703
3704 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3705 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3706 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3707 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3708
3709 f_TC_egprs_pkt_chan_req(req, imm_ass);
3710 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003711
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003712 if (mp_osmo_pcu_newer_than_0_9_0) {
3713 var StatsDExpects expect := {
3714 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3715 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3716 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3717 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
3718 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3719 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
3720 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
3721 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3722 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3723 };
3724 f_statsd_expect(expect);
3725 }
3726
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003727 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003728}
3729
3730testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3731 var template GsmRrMessage imm_ass;
3732 var template IaRestOctets rest;
3733 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003734 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003735
3736 /* Initialize the PCU interface abstraction */
3737 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003738 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003739
3740 var EGPRSPktChRequest req := {
3741 /* NOTE: other fields are set in the loop */
3742 one_phase := { tag := '0'B }
3743 };
3744
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003745 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003746 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3747 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3748 var BIT2 priority := substr(ext_ra, 0, 2);
3749 var BIT3 rand := substr(ext_ra, 2, 3);
3750
3751 req.one_phase.multislot_class := mslot_class;
3752 req.one_phase.priority := priority;
3753 req.one_phase.random_bits := rand;
3754
3755 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3756 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3757 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3758 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3759
3760 f_TC_egprs_pkt_chan_req(req, imm_ass);
3761 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003762
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003763 if (mp_osmo_pcu_newer_than_0_9_0) {
3764 var StatsDExpects expect := {
3765 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3766 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3767 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := num_req, max := num_req },
3768 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3769 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3770 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := num_req, max := num_req },
3771 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
3772 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3773 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3774 };
3775 f_statsd_expect(expect);
3776 }
3777
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003778 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003779}
3780
3781testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3782 var template GsmRrMessage imm_ass;
3783 var template IaRestOctets rest;
3784 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003785 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003786
3787 /* Initialize the PCU interface abstraction */
3788 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003789 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003790
3791 var EGPRSPktChRequest req := {
3792 /* NOTE: other fields are set in the loop */
3793 two_phase := { tag := '110000'B }
3794 };
3795
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003796 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003797 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3798 var BIT2 priority := substr(ext_ra, 0, 2);
3799 var BIT3 rand := substr(ext_ra, 2, 3);
3800
3801 req.two_phase.priority := priority;
3802 req.two_phase.random_bits := rand;
3803
3804 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3805 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3806 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3807 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3808
3809 f_TC_egprs_pkt_chan_req(req, imm_ass);
3810 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003811
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003812 if (mp_osmo_pcu_newer_than_0_9_0) {
3813 var StatsDExpects expect := {
3814 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3815 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3816 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3817 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
3818 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3819 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
3820 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
3821 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3822 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3823 };
3824 f_statsd_expect(expect);
3825 }
3826
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003827 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003828}
3829
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003830private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3831 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003832 PCUIF_BurstType bt := BURST_TYPE_1,
3833 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003834runs on RAW_PCU_Test_CT {
3835 var template ReqRefWaitInd tr_ref;
3836 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003837
3838 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3839 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3840 ra := bit2int(ra11), is_11bit := 1,
3841 burst_type := bt, fn := fn,
3842 arfcn := 871));
3843
3844 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003845 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003846
3847 /* Just to have a short-name reference to the actual message */
3848 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3849
3850 /* Make sure that Request Reference list contains at least one entry
3851 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003852 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003853 if (not match(iar.payload, { *, tr_ref, * })) {
3854 setverdict(fail, "Request Reference list does not match");
3855 f_shutdown(__BFILE__, __LINE__);
3856 }
3857
3858 /* Match Feature Indicator (must indicate PS domain) */
3859 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3860 setverdict(fail, "Feature Indicator does not match");
3861 f_shutdown(__BFILE__, __LINE__);
3862 }
3863
3864 /* Match IAR Rest Octets */
3865 if (not match(iar.rest_octets, rest)) {
3866 setverdict(fail, "IAR Rest Octets does not match: ",
3867 iar.rest_octets, " vs expected ", rest);
3868 f_shutdown(__BFILE__, __LINE__);
3869 }
3870
3871 setverdict(pass);
3872}
3873
3874/* Verify the contents of RR Immediate Assignment Reject message and its
3875 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3876testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3877 var template IARRestOctets rest;
3878 var BIT5 ext_ra;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003879 const integer num_req := 6;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003880
3881 /* Initialize the PCU interface abstraction */
3882 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003883 f_statsd_reset();
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003884
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003885 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003886 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3887 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3888
3889 /* Intentionally incorrect message (see table 11.2.5a.2) */
3890 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3891 }
3892
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003893 if (mp_osmo_pcu_newer_than_0_9_0) {
3894 var StatsDExpects expect := {
3895 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3896 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3897 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3898 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3899 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
3900 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
3901 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
3902 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3903 };
3904 f_statsd_expect(expect);
3905 }
3906
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003907 f_shutdown(__BFILE__, __LINE__, final := true);
3908}
3909
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003910/* At the moment, the IUT does not support any emergency services. Make sure
3911 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3912testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3913 var template IARRestOctets rest;
3914 var BIT5 ext_ra;
3915 var BIT11 ra11;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003916 const integer num_req := 6;
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003917
3918 /* Initialize the PCU interface abstraction */
3919 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003920 f_statsd_reset();
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003921
3922 var EGPRSPktChRequest req := {
3923 /* NOTE: other fields are set in the loop */
3924 emergency := { tag := '110111'B }
3925 };
3926
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003927 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003928 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3929 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3930
3931 req.emergency.random_bits := ext_ra;
3932 ra11 := enc_EGPRSPktChRequest2bits(req);
3933
3934 /* Intentionally incorrect message (see table 11.2.5a.2) */
3935 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3936 }
3937
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003938 if (mp_osmo_pcu_newer_than_0_9_0) {
3939 var StatsDExpects expect := {
3940 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3941 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3942 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3943 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3944 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
3945 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
3946 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
3947 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3948 };
3949 f_statsd_expect(expect);
3950 }
3951
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003952 f_shutdown(__BFILE__, __LINE__, final := true);
3953}
3954
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003955/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3956testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003957 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003958 var template IARRestOctets rest;
3959 var BIT11 ra11;
3960
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003961 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003962 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003963
3964 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003965 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3966 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003967
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003968 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003969 f_init_raw(testcasename(), info_ind);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003970 f_statsd_reset();
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003971
3972 var EGPRSPktChRequest req := {
3973 one_phase := {
3974 tag := '0'B,
3975 multislot_class := '10101'B,
3976 priority := '01'B,
3977 random_bits := '101'B
3978 }
3979 };
3980
3981 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3982 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3983 for (var integer i := 0; i < 7; i := i + 1) {
3984 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3985 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3986 }
3987
3988 ra11 := enc_EGPRSPktChRequest2bits(req);
3989 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3990
3991 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003992 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003993
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003994 if (mp_osmo_pcu_newer_than_0_9_0) {
3995 var StatsDExpects expect := {
3996 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 8, max := 8 },
3997 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 8, max := 8 },
3998 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 8, max := 8 },
3999 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4000 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := 0, max := 0 },
4001 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 7, max := 7 },
4002 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 7, max := 7 },
4003 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4004 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4005 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := 1, max := 1 },
4006 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4007 };
4008 f_statsd_expect(expect);
4009 }
4010
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004011 f_shutdown(__BFILE__, __LINE__, final := true);
4012}
4013
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004014/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004015private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004016return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004017 /* Pick a random MA length in range 2 .. max_ma_len */
4018 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
4019
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004020 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
4021 hsn := f_rnd_int(63),
4022 maio := f_rnd_int(63),
4023 ma := f_rnd_bitstring(ma_len));
4024}
4025
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004026private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
4027 in GsmRrMessage rr_msg)
4028{
4029 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004030 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004031
4032 var template PacketChannelDescription tr_pkt_chan_desc := {
4033 channel_Type_spare := ?,
4034 tn := ?,
4035 tsc := ts.tsc,
4036 presence := '1'B,
4037 zero := omit,
4038 one := {
4039 maio := ts.maio,
4040 hsn := ts.hsn
4041 }
4042 };
4043
4044 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
4045 setverdict(fail, "Packet Channel Description does not match: ",
4046 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
4047 }
4048
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004049 /* Mobile Allocation is expected to be octet-aligned */
4050 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
4051 var template MobileAllocationLV tr_ma := {
4052 len := ma_oct_len, /* in bytes */
4053 ma := substr(ts.ma, 0, ma_oct_len * 8)
4054 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004055
4056 if (not match(ia.mobile_allocation, tr_ma)) {
4057 setverdict(fail, "Mobile Allocation does not match: ",
4058 ia.mobile_allocation, " vs ", tr_ma);
4059 }
4060
4061 setverdict(pass);
4062}
4063
4064/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
4065testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004066 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004067 var GprsMS ms := valueof(t_GprsMS_def);
4068
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004069 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004070 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004071
4072 /* Initialize the PCU interface abstraction */
4073 f_init_raw(testcasename(), info_ind);
4074
4075 /* EGPRS Packet Channel Request (cause=Signalling) */
4076 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
4077
4078 /* Establish an Uplink EGPRS TBF */
4079 f_ms_establish_ul_tbf(ms);
4080
4081 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4082 f_shutdown(__BFILE__, __LINE__, final := true);
4083}
4084
4085/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
4086testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004087 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004088 var GprsMS ms := valueof(t_GprsMS_def);
4089
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004090 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004091 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004092
4093 /* Initialize the PCU interface abstraction */
4094 f_init_raw(testcasename(), info_ind);
4095
4096 /* Establish an Uplink TBF */
4097 f_ms_establish_ul_tbf(ms);
4098
4099 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4100 f_shutdown(__BFILE__, __LINE__, final := true);
4101}
4102
4103/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
4104testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004105 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004106 var GprsMS ms := valueof(t_GprsMS_def);
4107
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004108 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004109 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004110
4111 /* Initialize NS/BSSGP side */
4112 f_init_bssgp();
4113
4114 /* Initialize the PCU interface abstraction */
4115 f_init_raw(testcasename(), info_ind);
4116
4117 /* Establish BSSGP connection to the PCU */
4118 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004119 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004120
4121 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
4122 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
4123 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4124
4125 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
4126 f_shutdown(__BFILE__, __LINE__, final := true);
4127}
4128
4129private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
4130 in FrequencyParameters fp)
4131{
4132 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004133 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004134
4135 /* Table 12.8.1: Frequency Parameters information elements */
4136 var template FrequencyParameters tr_fp := {
4137 tsc := ts.tsc,
4138 presence := '10'B, /* Direct encoding 1 */
4139 arfcn := omit,
4140 indirect := omit,
4141 direct1 := {
4142 maio := ts.maio,
4143 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
4144 mobile_allocation := {
4145 hsn := ts.hsn,
4146 rfl_number_list_present := '0'B,
4147 rfl_number_list := omit,
4148 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004149 ma_length := ts.ma_bit_len,
4150 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004151 }
4152 },
4153 direct2 := omit
4154 };
4155
4156 if (not match(fp, tr_fp)) {
4157 setverdict(fail, "Frequency Parameters IE does not match: ",
4158 fp, " vs ", tr_fp);
4159 }
4160
4161 setverdict(pass);
4162}
4163
4164/* Make sure that Packet Uplink Assignment contains hopping parameters */
4165testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004166 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004167 var GprsMS ms := valueof(t_GprsMS_def);
4168 var uint32_t poll_fn;
4169
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004170 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004171 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004172
4173 /* Initialize the PCU interface abstraction */
4174 f_init_raw(testcasename(), info_ind);
4175
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004176 /* Single block (two phase) packet access */
4177 var uint16_t ra := bit2int(chan_req_sb);
4178 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
4179
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004180 /* Establish an Uplink TBF */
4181 f_ms_establish_ul_tbf(ms);
4182
4183 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004184 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
4185 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004186
4187 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004188 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
4189 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004190
4191 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
4192 var template (omit) FrequencyParameters fp;
4193 if (ua.is_egprs == '1'B) {
4194 fp := ua.egprs.freq_par;
4195 } else {
4196 fp := ua.gprs.freq_par;
4197 }
4198
4199 /* This is an optional IE, so it's worth to check its presence */
4200 if (istemplatekind(fp, "omit")) {
4201 setverdict(fail, "Frequency Parameters IE is not present");
4202 f_shutdown(__BFILE__, __LINE__);
4203 }
4204
4205 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
4206 f_shutdown(__BFILE__, __LINE__, final := true);
4207}
4208
4209/* Make sure that Packet Downlink Assignment contains hopping parameters */
4210testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004211 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004212 var octetstring data := f_rnd_octstring(10);
4213 var GprsMS ms := valueof(t_GprsMS_def);
4214 var RlcmacDlBlock dl_block;
4215 var uint32_t poll_fn;
4216
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004217 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004218 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004219
4220 /* Initialize NS/BSSGP side */
4221 f_init_bssgp();
4222
4223 /* Initialize the PCU interface abstraction */
4224 f_init_raw(testcasename(), info_ind);
4225
4226 /* Establish BSSGP connection to the PCU */
4227 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004228 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004229
4230 /* Establish an Uplink TBF */
4231 f_ms_establish_ul_tbf(ms);
4232
4233 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004234 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 +07004235
4236 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4237 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
4238 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4239
4240 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
4241 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4242
4243 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004244 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4245 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004246
4247 /* This is an optional IE, so it's worth to check its presence */
4248 if (not ispresent(da.freq_par)) {
4249 setverdict(fail, "Frequency Parameters IE is not present");
4250 f_shutdown(__BFILE__, __LINE__);
4251 }
4252
4253 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
4254 f_shutdown(__BFILE__, __LINE__, final := true);
4255}
4256
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004257/* Check if the IUT handles subsequent INFO.ind messages */
4258testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004259 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004260 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004261
4262 /* Initialize the PCU interface abstraction */
4263 f_init_raw(testcasename(), info_ind);
4264
4265 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
4266 for (var integer i := 0; i < 16; i := i + 1) {
4267 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004268 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004269 }
4270
4271 f_shutdown(__BFILE__, __LINE__, final := true);
4272}
4273
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004274/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
4275testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
4276 var PCUIF_info_ind info_ind;
4277 var integer i;
4278 const integer num_ms := 8;
4279
4280 /* Initialize NS/BSSGP side */
4281 f_init_bssgp();
4282 /* Initialize GPRS MS side */
4283 f_init_gprs_ms(num_ms);
4284
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01004285 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004286 /* Only the 3 first TRX are enabled. The enabled ones all have same
4287 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004288 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
4289 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
4290 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
4291 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004292
4293 /* Initialize the PCU interface abstraction */
4294 f_init_raw(testcasename(), info_ind);
4295
4296 /* Establish BSSGP connection to the PCU */
4297 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004298 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004299
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004300 /* Establish an Uplink TBF for each GprsMS instance */
4301 f_multi_ms_establish_tbf(do_activate := false);
4302
4303 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004304 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004305 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01004306 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004307 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004308 f_shutdown(__BFILE__, __LINE__);
4309 }
4310 }
4311
4312 f_shutdown(__BFILE__, __LINE__, final := true);
4313}
4314
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004315/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
4316 * downgraded to CS1-4 so that GPRS can read the USF).
4317 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
4318 */
4319testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
4320 var PCUIF_info_ind info_ind;
4321 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
4322 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004323 var uint32_t sched_fn, dl_fn, ack_fn;
4324 var octetstring data := f_rnd_octstring(10);
4325 var RlcmacDlBlock dl_block;
4326 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004327 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004328 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
4329 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
4330
4331 /* Initialize NS/BSSGP side */
4332 f_init_bssgp();
4333 /* Initialize GPRS MS side */
4334 f_init_gprs_ms(num_ms);
4335
4336 info_ind := valueof(ts_PCUIF_INFO_default);
4337 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004338 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
4339 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004340
4341 /* Initialize the PCU interface abstraction */
4342 f_init_raw(testcasename(), info_ind);
4343
4344 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
4345 g_mcs_initial_dl := 5;
4346 g_mcs_max_dl := 5;
4347 f_pcuvty_set_allowed_cs_mcs();
4348
4349 /* Establish BSSGP connection to the PCU */
4350 f_bssgp_establish();
4351 f_multi_ms_bssgp_register();
4352
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004353 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004354 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 +01004355 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
4356 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
4357 f_shutdown(__BFILE__, __LINE__);
4358 }
4359 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4360 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4361
4362 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004363 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 +01004364 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
4365 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
4366 f_shutdown(__BFILE__, __LINE__);
4367 }
4368 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4369 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4370
4371 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
4372 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4373 f_sleep(0.1);
4374 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4375 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4376 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
4377 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4378 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
4379 /* ACK the DL block */
4380 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
4381 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
4382 f_dl_block_ack_fn(dl_block, dl_fn));
4383
4384 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
4385 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4386 f_sleep(0.1);
4387 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4388 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4389 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
4390 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4391 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
4392 /* ACK the DL block */
4393 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
4394 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
4395 f_dl_block_ack_fn(dl_block, dl_fn));
4396
4397 data := f_rnd_octstring(1400);
4398 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4399 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4400
4401 for (var integer i := 0; i < 800; i := i + 1) {
4402 f_rx_rlcmac_dl_block(dl_block, dl_fn);
4403
4404 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
4405 /* No more data to receive, done */
4406 break;
4407 }
4408
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004409 usf_ms := -1;
4410
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004411 if (ischosen(dl_block.ctrl)) {
4412 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
4413 f_shutdown(__BFILE__, __LINE__);
4414 } else if (ischosen(dl_block.data_egprs)) {
4415 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
4416 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
4417 f_shutdown(__BFILE__, __LINE__);
4418 }
4419 tgt_ms := 1;
4420 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
4421 if (dl_block.data_egprs.mcs > MCS_4) {
4422 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
4423 f_shutdown(__BFILE__, __LINE__);
4424 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004425 usf_ms := 0;
4426 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004427 } else {
4428 if (dl_block.data_egprs.mcs <= MCS_4) {
4429 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
4430 f_shutdown(__BFILE__, __LINE__);
4431 }
4432 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004433 usf_ms := 1;
4434 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004435 }
4436 }
4437 } else {
4438 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
4439 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
4440 f_shutdown(__BFILE__, __LINE__);
4441 }
4442 tgt_ms := 0;
4443 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 +01004444 usf_ms := 0;
4445 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004446 } 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 +01004447 usf_ms := 1;
4448 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004449 }
4450 }
4451
4452 /* Keep Ack/Nack description updated */
4453 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
4454
4455 /* TDMA frame number on which we are supposed to send the ACK */
4456 if (f_dl_block_rrbp_valid(dl_block)) {
4457 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
4458 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);
4459 if (tx_data_remain != 0) {
4460 /* Submit more data from time to time to keep the TBF ongoing */
4461 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4462 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4463 tx_data_remain := tx_data_remain - 1;
4464 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004465 } else if (tx_data_remain != 0) {
4466 /* keep sending UL blocks when requested by USF to avoid
4467 * UL TBF timeout and hence stop receival of USFs */
4468 if (usf_ms != -1) {
4469 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
4470 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004471 }
4472 }
4473
4474 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 +01004475 /* He we check that DL blocks scheduled at GPRS can still request UL
4476 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
4477 * condition also ensures the downgrade to <=MCS4 condition is tested
4478 * above */
4479 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
4480 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004481 f_shutdown(__BFILE__, __LINE__);
4482 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004483 /* Here check for some level of fairness between them (at least ~40%): */
4484 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
4485 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
4486 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
4487 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
4488 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4489 f_shutdown(__BFILE__, __LINE__);
4490 }
4491 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
4492 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4493 f_shutdown(__BFILE__, __LINE__);
4494 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004495
4496 f_shutdown(__BFILE__, __LINE__, final := true);
4497}
4498
4499
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004500private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4501 boolean exp_imsi, boolean exp_tmsi)
4502runs on RAW_PCU_Test_CT {
4503 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4504 var integer pending := lengthof(g_ms);
4505 var RlcmacDlBlock dl_block;
4506 var boolean f1, f2;
4507
4508 while (pending > 0) {
4509 var uint32_t poll_fn;
4510
4511 /* Obtain a Downlink block and make sure it is a paging request */
4512 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4513 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4514 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4515 break;
4516 }
4517
4518 /* This should not happen in general, but who knows... */
4519 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4520 if (not ispresent(req.repeated_pageinfo)) {
4521 setverdict(fail, "Repeated Page Info IE is absent?!?");
4522 break;
4523 }
4524
4525 /* A single message may contain several MIs depending on their type */
4526 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4527 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4528 ps_domain := false);
4529 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4530 ps_domain := false);
4531 if (not f1 and not f2)
4532 { continue; }
4533
4534 /* Detect duplicate MIs */
4535 if (mask[i] == '1'B) {
4536 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4537 continue;
4538 }
4539
4540 mask[i] := '1'B;
4541 }
4542
4543 pending := pending - lengthof(req.repeated_pageinfo);
4544 }
4545
4546 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4547 if (mask[i] != '1'B) {
4548 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4549 log("===== mask := ", mask);
4550 }
4551 }
4552
4553 /* All messages must have been received by now, expect a dummy block */
4554 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4555}
4556
4557private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4558runs on RAW_PCU_Test_CT {
4559 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4560 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4561
4562 /* Initialize NS/BSSGP side */
4563 f_init_bssgp();
4564
4565 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004566 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004567
4568 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4569 f_init_gprs_ms(7 * 8);
4570
4571 /* Initialize the PCU interface abstraction */
4572 f_init_raw(testcasename(), info_ind);
4573
4574 /* Establish BSSGP connection to the PCU */
4575 f_bssgp_establish();
4576 f_multi_ms_bssgp_register();
4577
4578 /* Establish an Uplink TBF for each GprsMS instance */
4579 f_multi_ms_establish_tbf(do_activate := true);
4580}
4581
4582testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4583 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4584
4585 /* Common part: send INFO.ind, establish TBFs... */
4586 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4587
4588 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4589 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4590 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4591 }
4592
4593 /* FIXME: work around a race condition between PCUIF and BSSGP */
4594 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4595
4596 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4597 * The IUT is expected to page on all PDCH slots of all transceivers. */
4598 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4599 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4600 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4601 }
4602
4603 f_shutdown(__BFILE__, __LINE__, final := true);
4604}
4605
4606testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4607 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4608
4609 /* Common part: send INFO.ind, establish TBFs... */
4610 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4611
4612 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4613 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4614 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4615 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4616 }
4617
4618 /* FIXME: work around a race condition between PCUIF and BSSGP */
4619 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4620
4621 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4622 * The IUT is expected to page on all PDCH slots of all transceivers. */
4623 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4624 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4625 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4626 }
4627
4628 f_shutdown(__BFILE__, __LINE__, final := true);
4629}
4630
4631testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4632 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4633
4634 /* Common part: send INFO.ind, establish TBFs... */
4635 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4636
4637 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4638 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4639 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4640 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4641 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4642 } else {
4643 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4644 }
4645 }
4646
4647 /* FIXME: work around a race condition between PCUIF and BSSGP */
4648 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4649
4650 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4651 * The IUT is expected to page on all PDCH slots of all transceivers. */
4652 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4653 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4654 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4655 }
4656
4657 f_shutdown(__BFILE__, __LINE__, final := true);
4658}
4659
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004660private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004661runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4662 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004663 var integer i := 0;
4664 while (true) {
4665 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4666 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4667 break;
4668 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004669 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004670 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4671 f_shutdown(__BFILE__, __LINE__);
4672 }
4673 i := i + 1;
4674 }
4675 return dl_block;
4676}
4677
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004678private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4679runs on RAW_PCU_Test_CT {
4680 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),
4681 info_ind.lac),
4682 info_ind.rac),
4683 info_ind.cell_id));
4684 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4685 423),
4686 2),
4687 5));
4688 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4689 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4690 var template (value) RAN_Information_RIM_Container res_cont :=
4691 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4692 ts_RIM_Sequence_Number(2),
4693 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4694 ts_RIM_Protocol_Version_Number(1),
4695 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4696 omit);
4697 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4698 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4699 res_cont));
4700}
4701
4702altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4703runs on RAW_PCU_Test_CT {
4704 /* RIM procedure: */
4705 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),
4706 info_ind.lac),
4707 info_ind.rac),
4708 info_ind.cell_id));
4709 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4710 423),
4711 2),
4712 5));
4713 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4714 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4715 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4716 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4717 tr_RAN_Information_Request_RIM_Container)) {
4718 if (do_answer) {
4719 f_outbound_nacc_rim_tx_resp(info_ind);
4720 }
4721 if (do_repeat) {
4722 repeat;
4723 }
4724 }
4725}
4726
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004727private function f_handle_nacc_rac_ci_query(PCUIF_info_ind info_ind, GsmArfcn req_arfcn, uint6_t req_bsic,
4728 boolean answer := true, boolean use_old_ctrl_iface := false)
4729runs on RAW_PCU_Test_CT {
4730 if (use_old_ctrl_iface == true) {
4731 f_ipa_ctrl_wait_link_up();
4732 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4733 int2str(info_ind.lac) & "." &
4734 int2str(info_ind.cell_id) & "." &
4735 int2str(req_arfcn) & "." &
4736 int2str(req_bsic);
4737 if (answer) {
4738 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4739 } else {
4740 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4741 }
4742 } else {
4743 var PCUIF_Message pcu_msg;
4744 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
4745 if (answer) {
4746 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
4747 }
4748 }
4749}
4750
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004751/* Start NACC from MS side */
4752private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004753 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004754 boolean skip_final_ctrl_ack := false,
4755 boolean use_old_ctrl_iface := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004756runs on RAW_PCU_Test_CT {
4757 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4758 var RlcmacDlBlock dl_block;
4759 var uint32_t sched_fn;
4760 var GsmArfcn req_arfcn := 862;
4761 var uint6_t req_bsic := 43;
4762
4763 /* Start NACC from MS side */
4764 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4765 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4766
4767 if (exp_rac_ci_query == true) {
4768 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004769 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 +01004770 }
4771
4772 if (exp_si_query == true) {
4773 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004774 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004775 }
4776
4777 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004778 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004779
4780 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4781 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4782 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4783 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4784 f_shutdown(__BFILE__, __LINE__);
4785 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004786 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004787 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004788 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4789 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4790 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004791}
4792
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004793/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4794testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004795 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004796 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004797 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004798 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004799
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004800 if (use_old_ctrl_iface) {
4801 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4802 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4803 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004804
4805 /* Initialize NS/BSSGP side */
4806 f_init_bssgp();
4807 /* Initialize GPRS MS side */
4808 f_init_gprs_ms();
4809 ms := g_ms[0]; /* We only use first MS in this test */
4810
4811 /* Initialize the PCU interface abstraction */
4812 f_init_raw(testcasename(), info_ind);
4813
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004814 /* Make sure we are not affected by full cache from previous tests */
4815 f_pcuvty_flush_neigh_caches();
4816
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004817 /* Establish BSSGP connection to the PCU */
4818 f_bssgp_establish();
4819 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4820
4821 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004822 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 +01004823 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4824 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4825
4826 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004827 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004828
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004829 f_shutdown(__BFILE__, __LINE__, final := true);
4830}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004831
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004832/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4833testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4834 var PollFnCtx pollctx;
4835 var GprsMS ms;
4836 var RlcmacDlBlock dl_block;
4837 var uint32_t sched_fn;
4838 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004839 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004840
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004841 if (use_old_ctrl_iface) {
4842 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4843 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4844 }
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004845
4846 /* Initialize NS/BSSGP side */
4847 f_init_bssgp();
4848 /* Initialize GPRS MS side */
4849 f_init_gprs_ms();
4850 ms := g_ms[0]; /* We only use first MS in this test */
4851
4852 /* Initialize the PCU interface abstraction */
4853 f_init_raw(testcasename(), info_ind);
4854
4855 /* Make sure we are not affected by full cache from previous tests */
4856 f_pcuvty_flush_neigh_caches();
4857
4858 /* Establish BSSGP connection to the PCU */
4859 f_bssgp_establish();
4860 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4861
4862 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004863 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 +01004864 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4865 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4866
4867 /* Start NACC from MS side, avoid sending final CTRL ACK */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004868 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 +01004869
4870 /* Wait until we receive something non-dummy */
4871 dl_block := f_skip_dummy(0, sched_fn);
4872 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4873 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4874 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4875 }
4876 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4877 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4878 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4879 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4880 }
4881
4882 f_shutdown(__BFILE__, __LINE__, final := true);
4883}
4884
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004885/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4886testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4887 var PollFnCtx pollctx;
4888 var GprsMS ms;
4889 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004890 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004891 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004892
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004893 if (use_old_ctrl_iface) {
4894 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4895 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4896 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004897
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004898 /* Initialize NS/BSSGP side */
4899 f_init_bssgp();
4900 /* Initialize GPRS MS side */
4901 f_init_gprs_ms();
4902 ms := g_ms[0]; /* We only use first MS in this test */
4903
4904 /* Initialize the PCU interface abstraction */
4905 f_init_raw(testcasename(), info_ind);
4906
4907 /* Make sure we are not affected by full cache from previous tests */
4908 f_pcuvty_flush_neigh_caches();
4909 /* Set timeout values for caches so that entries will be in cache during second try */
4910 f_pcuvty_set_neigh_caches(10, 10);
4911
4912 /* Establish BSSGP connection to the PCU */
4913 f_bssgp_establish();
4914 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4915
4916 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004917 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 +01004918 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4919 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4920
4921 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004922 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004923
4924 /* 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 +02004925 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 +01004926
4927 f_shutdown(__BFILE__, __LINE__, final := true);
4928}
4929
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004930/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4931 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4932 */
4933testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4934 var PollFnCtx pollctx;
4935 var GprsMS ms;
4936 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004937 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004938 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004939
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004940 if (use_old_ctrl_iface) {
4941 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4942 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4943 }
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004944
4945 /* Initialize NS/BSSGP side */
4946 f_init_bssgp();
4947 /* Initialize GPRS MS side */
4948 f_init_gprs_ms();
4949 ms := g_ms[0]; /* We only use first MS in this test */
4950
4951 /* Initialize the PCU interface abstraction */
4952 f_init_raw(testcasename(), info_ind);
4953
4954 /* Make sure we are not affected by full cache from previous tests */
4955 f_pcuvty_flush_neigh_caches();
4956 /* Set timeout values for caches so that entries will be erased before the second try */
4957 f_pcuvty_set_neigh_caches(1, 1);
4958
4959 /* Establish BSSGP connection to the PCU */
4960 f_bssgp_establish();
4961 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4962
4963 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004964 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 +01004965 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4966 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4967
4968 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004969 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004970
4971 /* CTRL client should have disconnected from us */
4972 f_ipa_ctrl_wait_link_down();
4973 /* wait for cache entries to time out */
4974 f_sleep(2.0);
4975 /* 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 +02004976 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004977
4978 f_shutdown(__BFILE__, __LINE__, final := true);
4979}
4980
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004981/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004982testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4983 var RlcmacDlBlock dl_block;
4984 var PollFnCtx pollctx;
4985 var uint32_t sched_fn;
4986 var GprsMS ms;
4987 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4988 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004989 var GsmArfcn req_arfcn := 862;
4990 var uint6_t req_bsic := 43;
4991
4992 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4993 * resolution CTRL port, to trigger Conn Refused by socket:
4994 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4995 */
4996
4997 /* Initialize NS/BSSGP side */
4998 f_init_bssgp();
4999 /* Initialize GPRS MS side */
5000 f_init_gprs_ms();
5001 ms := g_ms[0]; /* We only use first MS in this test */
5002
5003 /* Initialize the PCU interface abstraction */
5004 f_init_raw(testcasename(), info_ind);
5005
5006 /* Make sure we are not affected by full cache from previous tests */
5007 f_pcuvty_flush_neigh_caches();
5008
5009 /* Establish BSSGP connection to the PCU */
5010 f_bssgp_establish();
5011 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5012
5013 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005014 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 +01005015 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5016 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5017
5018 /* Start NACC from MS side */
5019 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5020 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5021
5022 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005023 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005024 /* Make sure it is a Pkt Cell Chg Continue */
5025 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5026 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5027 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005028 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5029 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5030 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5031 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5032 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005033
5034 f_shutdown(__BFILE__, __LINE__, final := true);
5035}
5036
5037/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005038testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
5039 var RlcmacDlBlock dl_block;
5040 var PollFnCtx pollctx;
5041 var uint32_t sched_fn;
5042 var GprsMS ms;
5043 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5044 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005045 var GsmArfcn req_arfcn := 862;
5046 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005047 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005048
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005049 if (use_old_ctrl_iface) {
5050 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5051 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5052 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005053
5054 /* Initialize NS/BSSGP side */
5055 f_init_bssgp();
5056 /* Initialize GPRS MS side */
5057 f_init_gprs_ms();
5058 ms := g_ms[0]; /* We only use first MS in this test */
5059
5060 /* Initialize the PCU interface abstraction */
5061 f_init_raw(testcasename(), info_ind);
5062
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005063 /* Make sure we are not affected by full cache from previous tests */
5064 f_pcuvty_flush_neigh_caches();
5065
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005066 /* Establish BSSGP connection to the PCU */
5067 f_bssgp_establish();
5068 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5069
5070 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005071 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 +01005072 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5073 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5074
5075 /* Start NACC from MS side */
5076 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5077 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5078
5079 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005080 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005081 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 +01005082
5083 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005084 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005085 /* Make sure it is a Pkt Cell Chg Continue */
5086 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5087 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5088 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005089 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5090 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5091 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5092 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5093 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005094
5095 f_shutdown(__BFILE__, __LINE__, final := true);
5096}
5097
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005098/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
5099testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
5100 var RlcmacDlBlock dl_block;
5101 var PollFnCtx pollctx;
5102 var uint32_t sched_fn;
5103 var GprsMS ms;
5104 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5105 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005106 var GsmArfcn req_arfcn := 862;
5107 var uint6_t req_bsic := 43;
5108
5109 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5110 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5111
5112 /* Initialize NS/BSSGP side */
5113 f_init_bssgp();
5114 /* Initialize GPRS MS side */
5115 f_init_gprs_ms();
5116 ms := g_ms[0]; /* We only use first MS in this test */
5117
5118 /* Initialize the PCU interface abstraction */
5119 f_init_raw(testcasename(), info_ind);
5120
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005121 /* Make sure we are not affected by full cache from previous tests */
5122 f_pcuvty_flush_neigh_caches();
5123
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005124 /* Establish BSSGP connection to the PCU */
5125 f_bssgp_establish();
5126 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5127
5128 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005129 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 +01005130 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5131 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5132
5133 /* Start NACC from MS side */
5134 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5135 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5136
5137 /* osmo-pcu should now ask for resolution: */
5138 f_ipa_ctrl_wait_link_up();
5139 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5140 int2str(info_ind.lac) & "." &
5141 int2str(info_ind.cell_id) & "." &
5142 int2str(req_arfcn) & "." &
5143 int2str(req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005144 /* we receive RAC+CI resolution request and we send incorrectly formated response */
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005145 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
5146
5147 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005148 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005149 /* Make sure it is a Pkt Cell Chg Continue */
5150 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5151 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5152 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005153 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5154 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5155 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5156 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5157 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005158
5159 f_shutdown(__BFILE__, __LINE__, final := true);
5160}
5161
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005162/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
5163testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
5164 var RlcmacDlBlock dl_block;
5165 var PollFnCtx pollctx;
5166 var uint32_t sched_fn;
5167 var GprsMS ms;
5168 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5169 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005170 var GsmArfcn req_arfcn := 862;
5171 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005172 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005173 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 */
5174 info_ind.lac),
5175 info_ind.rac),
5176 info_ind.cell_id));
5177 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
5178 423),
5179 2),
5180 5));
5181 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
5182 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
5183
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005184 if (use_old_ctrl_iface) {
5185 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5186 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5187 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005188
5189 /* Initialize NS/BSSGP side */
5190 f_init_bssgp();
5191 /* Initialize GPRS MS side */
5192 f_init_gprs_ms();
5193 ms := g_ms[0]; /* We only use first MS in this test */
5194
5195 /* Initialize the PCU interface abstraction */
5196 f_init_raw(testcasename(), info_ind);
5197
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005198 /* Make sure we are not affected by full cache from previous tests */
5199 f_pcuvty_flush_neigh_caches();
5200
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005201 /* Establish BSSGP connection to the PCU */
5202 f_bssgp_establish();
5203 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5204
5205 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005206 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 +01005207 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5208 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5209
5210 /* Start NACC from MS side */
5211 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5212 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5213
5214 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005215 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 +01005216
5217 /* RIM procedure: */
5218 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5219 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5220 tr_RAN_Information_Request_RIM_Container));
5221 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
5222
5223 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005224 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005225 /* Make sure it is a Pkt Cell Chg Continue */
5226 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5227 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5228 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005229 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5230 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5231 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5232 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5233 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005234
5235 f_shutdown(__BFILE__, __LINE__, final := true);
5236}
5237
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005238/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
5239testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
5240 var PollFnCtx pollctx;
5241 var GprsMS ms;
5242 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5243 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5244 var RlcmacDlBlock dl_block;
5245 var uint32_t sched_fn;
5246 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005247 var charstring ctrl_var;
5248 var PCUIF_Message pcu_msg;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005249 var GsmArfcn req_arfcn := 862;
5250 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005251 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005252
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005253 if (use_old_ctrl_iface) {
5254 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5255 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5256 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005257
5258 /* Initialize NS/BSSGP side */
5259 f_init_bssgp();
5260 /* Initialize GPRS MS side */
5261 f_init_gprs_ms();
5262 ms := g_ms[0]; /* We only use first MS in this test */
5263
5264 /* Initialize the PCU interface abstraction */
5265 f_init_raw(testcasename(), info_ind);
5266
5267 /* Make sure we are not affected by full cache from previous tests */
5268 f_pcuvty_flush_neigh_caches();
5269
5270 /* Establish BSSGP connection to the PCU */
5271 f_bssgp_establish();
5272 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5273
5274 /* Send PACKET RESOURCE REQUEST */
5275 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5276 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5277 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5278
5279 /* Start NACC from MS side */
5280 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5281 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5282
5283 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005284 if (use_old_ctrl_iface) {
5285 f_ipa_ctrl_wait_link_up();
5286 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5287 int2str(info_ind.lac) & "." &
5288 int2str(info_ind.cell_id) & "." &
5289 int2str(req_arfcn) & "." &
5290 int2str(req_bsic);
5291 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5292 } else {
5293 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5294 }
5295
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005296 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
5297 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5298 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005299
5300 if (use_old_ctrl_iface) {
5301 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5302 } else {
5303 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5304 }
5305
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005306 timer T := 2.0;
5307 T.start;
5308 alt {
5309 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005310 [use_old_ctrl_iface] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005311 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
5312 f_shutdown(__BFILE__, __LINE__);
5313 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005314 [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 {
5315 setverdict(fail, "Received unexpected PCUIF resolution after duplicate Pkt Cell Change Notification:", pcu_msg);
5316 f_shutdown(__BFILE__, __LINE__);
5317 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005318 [] T.timeout {
5319 setverdict(pass);
5320 }
5321 }
5322
5323 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005324 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005325
5326 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5327 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5328 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5329 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5330 f_shutdown(__BFILE__, __LINE__);
5331 }
5332 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5333 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5334 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5335 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5336 }
5337
5338 f_shutdown(__BFILE__, __LINE__, final := true);
5339}
5340
5341/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
5342testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
5343 var PollFnCtx pollctx;
5344 var GprsMS ms;
5345 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5346 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5347 var RlcmacDlBlock dl_block;
5348 var uint32_t sched_fn;
5349 var CtrlMessage rx_ctrl;
5350 var GsmArfcn req_arfcn := 862;
5351 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005352 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005353
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005354 if (use_old_ctrl_iface) {
5355 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5356 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5357 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005358
5359 /* Initialize NS/BSSGP side */
5360 f_init_bssgp();
5361 /* Initialize GPRS MS side */
5362 f_init_gprs_ms();
5363 ms := g_ms[0]; /* We only use first MS in this test */
5364
5365 /* Initialize the PCU interface abstraction */
5366 f_init_raw(testcasename(), info_ind);
5367
5368 /* Make sure we are not affected by full cache from previous tests */
5369 f_pcuvty_flush_neigh_caches();
5370
5371 /* Establish BSSGP connection to the PCU */
5372 f_bssgp_establish();
5373 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5374
5375 /* Send PACKET RESOURCE REQUEST */
5376 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5377 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5378 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5379
5380 /* Start NACC from MS side */
5381 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5382 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5383
5384 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005385 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 +01005386 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5387 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
5388 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5389 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5390 f_outbound_nacc_rim_tx_resp(info_ind);
5391 timer T := 1.0;
5392 T.start;
5393 alt {
5394 [] RIM.receive {
5395 setverdict(fail, "Received unexpected RIM message");
5396 f_shutdown(__BFILE__, __LINE__);
5397 }
5398 [] T.timeout {
5399 setverdict(pass);
5400 }
5401 }
5402
5403 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005404 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005405
5406 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5407 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5408 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5409 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5410 f_shutdown(__BFILE__, __LINE__);
5411 }
5412 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5413 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5414 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5415 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5416 }
5417
5418 f_shutdown(__BFILE__, __LINE__, final := true);
5419}
5420
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005421/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
5422testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
5423 var PollFnCtx pollctx;
5424 var GprsMS ms;
5425 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5426 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5427 var RlcmacDlBlock dl_block;
5428 var uint32_t sched_fn;
5429 var CtrlMessage rx_ctrl;
5430 var GsmArfcn req_arfcn := 862;
5431 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005432 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005433
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005434 if (use_old_ctrl_iface) {
5435 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5436 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5437 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005438
5439 /* Initialize NS/BSSGP side */
5440 f_init_bssgp();
5441 /* Initialize GPRS MS side */
5442 f_init_gprs_ms();
5443 ms := g_ms[0]; /* We only use first MS in this test */
5444
5445 /* Initialize the PCU interface abstraction */
5446 f_init_raw(testcasename(), info_ind);
5447
5448 /* Make sure we are not affected by full cache from previous tests */
5449 f_pcuvty_flush_neigh_caches();
5450
5451 /* Establish BSSGP connection to the PCU */
5452 f_bssgp_establish();
5453 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5454
5455 /* Send PACKET RESOURCE REQUEST */
5456 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5457 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5458 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5459
5460 /* Start NACC from MS side */
5461 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5462 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5463
5464 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005465 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 +01005466 /* RIM procedure: */
5467 as_outbound_nacc_rim_resolve(info_ind);
5468
5469 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
5470 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5471 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5472
5473 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
5474 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5475
5476 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5477 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5478 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5479 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5480 f_shutdown(__BFILE__, __LINE__);
5481 }
5482 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5483 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5484 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5485 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5486 }
5487}
5488
5489/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
5490testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
5491 var PollFnCtx pollctx;
5492 var GprsMS ms;
5493 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5494 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5495 var RlcmacDlBlock dl_block;
5496 var uint32_t sched_fn;
5497 var CtrlMessage rx_ctrl;
5498 var GsmArfcn req_arfcn := 862;
5499 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005500 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005501
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005502 if (use_old_ctrl_iface) {
5503 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5504 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5505 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005506
5507 /* Initialize NS/BSSGP side */
5508 f_init_bssgp();
5509 /* Initialize GPRS MS side */
5510 f_init_gprs_ms();
5511 ms := g_ms[0]; /* We only use first MS in this test */
5512
5513 /* Initialize the PCU interface abstraction */
5514 f_init_raw(testcasename(), info_ind);
5515
5516 /* Make sure we are not affected by full cache from previous tests */
5517 f_pcuvty_flush_neigh_caches();
5518
5519 /* Establish BSSGP connection to the PCU */
5520 f_bssgp_establish();
5521 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5522
5523 /* Send PACKET RESOURCE REQUEST */
5524 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5525 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5526 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5527
5528 /* Start NACC from MS side */
5529 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5530 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5531
5532 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005533 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 +01005534 /* RIM procedure: */
5535 as_outbound_nacc_rim_resolve(info_ind);
5536
5537 /* Announce SI back to MS, continue NACC procedure */
5538 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5539
5540 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5541 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5542
5543 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5544 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5545 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5546 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5547 f_shutdown(__BFILE__, __LINE__);
5548 }
5549 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5550 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5551 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5552 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5553 }
5554}
5555
5556/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5557testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() 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 Pedrol0d6ebb72021-02-11 14:53:24 +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 Pedrol0d6ebb72021-02-11 14:53:24 +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 Pedrol0d6ebb72021-02-11 14:53:24 +01005601 /* RIM procedure: */
5602 as_outbound_nacc_rim_resolve(info_ind);
5603
5604 /* Announce SI back to MS, continue NACC procedure */
5605 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5606
5607 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5608 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5609 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5610 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5611 f_shutdown(__BFILE__, __LINE__);
5612 }
5613 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5614 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5615
5616 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5617 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5618 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5619 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5620 }
5621}
5622
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005623/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5624 * while waiting for CTRL resolution */
5625testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5626 var PollFnCtx pollctx;
5627 var GprsMS ms;
5628 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5629 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5630 var RlcmacDlBlock dl_block;
5631 var uint32_t sched_fn;
5632 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005633 var charstring ctrl_var;
5634 var PCUIF_Message pcu_msg;
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005635 var GsmArfcn req_arfcn := 862;
5636 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005637 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005638
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005639 if (use_old_ctrl_iface) {
5640 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5641 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5642 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005643
5644 /* Initialize NS/BSSGP side */
5645 f_init_bssgp();
5646 /* Initialize GPRS MS side */
5647 f_init_gprs_ms();
5648 ms := g_ms[0]; /* We only use first MS in this test */
5649
5650 /* Initialize the PCU interface abstraction */
5651 f_init_raw(testcasename(), info_ind);
5652
5653 /* Make sure we are not affected by full cache from previous tests */
5654 f_pcuvty_flush_neigh_caches();
5655
5656 /* Establish BSSGP connection to the PCU */
5657 f_bssgp_establish();
5658 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5659
5660 /* Send PACKET RESOURCE REQUEST */
5661 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5662 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5663 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5664
5665 /* Start NACC from MS side */
5666 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5667 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5668
5669 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005670 if (use_old_ctrl_iface) {
5671 f_ipa_ctrl_wait_link_up();
5672 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5673 int2str(info_ind.lac) & "." &
5674 int2str(info_ind.cell_id) & "." &
5675 int2str(req_arfcn) & "." &
5676 int2str(req_bsic);
5677 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5678 } else {
5679 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5680 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005681 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5682 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5683 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5684 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005685 if (use_old_ctrl_iface) {
5686 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5687 } else {
5688 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5689 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005690 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005691 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 +01005692
5693 /* And finally everything continues as usual with RIN procedure */
5694 as_outbound_nacc_rim_resolve(info_ind);
5695
5696 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005697 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005698
5699 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5700 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5701 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5702 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5703 f_shutdown(__BFILE__, __LINE__);
5704 }
5705 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5706 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5707 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5708 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5709 }
5710
5711 f_shutdown(__BFILE__, __LINE__, final := true);
5712}
5713
5714/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5715 * while waiting for SI resolution */
5716testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5717 var PollFnCtx pollctx;
5718 var GprsMS ms;
5719 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5720 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5721 var RlcmacDlBlock dl_block;
5722 var uint32_t sched_fn;
5723 var CtrlMessage rx_ctrl;
5724 var GsmArfcn req_arfcn := 862;
5725 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005726 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005727
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005728 if (use_old_ctrl_iface) {
5729 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5730 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5731 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005732
5733 /* Initialize NS/BSSGP side */
5734 f_init_bssgp();
5735 /* Initialize GPRS MS side */
5736 f_init_gprs_ms();
5737 ms := g_ms[0]; /* We only use first MS in this test */
5738
5739 /* Initialize the PCU interface abstraction */
5740 f_init_raw(testcasename(), info_ind);
5741
5742 /* Make sure we are not affected by full cache from previous tests */
5743 f_pcuvty_flush_neigh_caches();
5744
5745 /* Establish BSSGP connection to the PCU */
5746 f_bssgp_establish();
5747 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5748
5749 /* Send PACKET RESOURCE REQUEST */
5750 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5751 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5752 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5753
5754 /* Start NACC from MS side */
5755 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5756 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5757
5758 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005759 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 +01005760 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5761 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5762 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5763 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5764 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5765 f_outbound_nacc_rim_tx_resp(info_ind);
5766
5767 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005768 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 +01005769
5770 /* And finally everything continues as usual with RIN procedure */
5771 as_outbound_nacc_rim_resolve(info_ind);
5772
5773 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005774 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005775
5776 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5777 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5778 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5779 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5780 f_shutdown(__BFILE__, __LINE__);
5781 }
5782 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5783 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5784 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5785 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5786 }
5787
5788 f_shutdown(__BFILE__, __LINE__, final := true);
5789}
5790
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005791/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5792 * while sending Pkt Neigh Data Change */
5793testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5794 var PollFnCtx pollctx;
5795 var GprsMS ms;
5796 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5797 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5798 var RlcmacDlBlock dl_block;
5799 var uint32_t sched_fn;
5800 var CtrlMessage rx_ctrl;
5801 var GsmArfcn req_arfcn := 862;
5802 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005803 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005804
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005805 if (use_old_ctrl_iface) {
5806 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5807 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5808 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005809
5810 /* Initialize NS/BSSGP side */
5811 f_init_bssgp();
5812 /* Initialize GPRS MS side */
5813 f_init_gprs_ms();
5814 ms := g_ms[0]; /* We only use first MS in this test */
5815
5816 /* Initialize the PCU interface abstraction */
5817 f_init_raw(testcasename(), info_ind);
5818
5819 /* Make sure we are not affected by full cache from previous tests */
5820 f_pcuvty_flush_neigh_caches();
5821
5822 /* Establish BSSGP connection to the PCU */
5823 f_bssgp_establish();
5824 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5825
5826 /* Send PACKET RESOURCE REQUEST */
5827 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5828 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5829 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5830
5831 /* Start NACC from MS side */
5832 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5833 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5834
5835 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005836 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 +01005837 /* RIM procedure: */
5838 as_outbound_nacc_rim_resolve(info_ind);
5839
5840 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5841 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5842 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5843 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5844
5845 /* It should trigger RAC_CI resolution to start again: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005846 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 +01005847 /* RIM procedure: */
5848 as_outbound_nacc_rim_resolve(info_ind);
5849 /* Transmit SI back to MS */
5850 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5851
5852 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5853 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5854 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5855 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5856 f_shutdown(__BFILE__, __LINE__);
5857 }
5858 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5859 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5860 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5861 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5862 }
5863}
5864
5865/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5866testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5867 var PollFnCtx pollctx;
5868 var GprsMS ms;
5869 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5870 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5871 var RlcmacDlBlock dl_block;
5872 var uint32_t sched_fn;
5873 var CtrlMessage rx_ctrl;
5874 var GsmArfcn req_arfcn := 862;
5875 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005876 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005877
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005878 if (use_old_ctrl_iface) {
5879 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5880 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5881 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005882
5883 /* Initialize NS/BSSGP side */
5884 f_init_bssgp();
5885 /* Initialize GPRS MS side */
5886 f_init_gprs_ms();
5887 ms := g_ms[0]; /* We only use first MS in this test */
5888
5889 /* Initialize the PCU interface abstraction */
5890 f_init_raw(testcasename(), info_ind);
5891
5892 /* Make sure we are not affected by full cache from previous tests */
5893 f_pcuvty_flush_neigh_caches();
5894
5895 /* Establish BSSGP connection to the PCU */
5896 f_bssgp_establish();
5897 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5898
5899 /* Send PACKET RESOURCE REQUEST */
5900 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5901 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5902 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5903
5904 /* Start NACC from MS side */
5905 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5906 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5907
5908 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005909 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 +01005910 /* RIM procedure: */
5911 as_outbound_nacc_rim_resolve(info_ind);
5912
5913 /* Announce SI back to MS, continue NACC procedure */
5914 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5915
5916 /* trigger a Pkt Cell Change Notif with different tgt cell */
5917 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5918 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5919
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005920 /* It should trigger RAC_CI resolution to start again: */
5921 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
5922
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005923 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5924 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5925
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005926 /* RIM procedure: */
5927 as_outbound_nacc_rim_resolve(info_ind);
5928 /* Transmit SI back to MS */
5929 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5930
5931 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5932 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5933 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5934 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5935 f_shutdown(__BFILE__, __LINE__);
5936 }
5937 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5938 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5939 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5940 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5941 }
5942}
5943
5944/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5945testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5946 var PollFnCtx pollctx;
5947 var GprsMS ms;
5948 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5949 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5950 var RlcmacDlBlock dl_block;
5951 var uint32_t sched_fn;
5952 var CtrlMessage rx_ctrl;
5953 var GsmArfcn req_arfcn := 862;
5954 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005955 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005956
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005957 if (use_old_ctrl_iface) {
5958 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5959 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5960 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005961
5962 /* Initialize NS/BSSGP side */
5963 f_init_bssgp();
5964 /* Initialize GPRS MS side */
5965 f_init_gprs_ms();
5966 ms := g_ms[0]; /* We only use first MS in this test */
5967
5968 /* Initialize the PCU interface abstraction */
5969 f_init_raw(testcasename(), info_ind);
5970
5971 /* Make sure we are not affected by full cache from previous tests */
5972 f_pcuvty_flush_neigh_caches();
5973
5974 /* Establish BSSGP connection to the PCU */
5975 f_bssgp_establish();
5976 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5977
5978 /* Send PACKET RESOURCE REQUEST */
5979 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5980 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5981 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5982
5983 /* Start NACC from MS side */
5984 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5985 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5986
5987 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005988 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 +01005989 /* RIM procedure: */
5990 as_outbound_nacc_rim_resolve(info_ind);
5991
5992 /* Announce SI back to MS, continue NACC procedure */
5993 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5994
5995 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5996 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5997 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5998 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5999 f_shutdown(__BFILE__, __LINE__);
6000 }
6001
6002 /* trigger a Pkt Cell Change Notif with different tgt cell */
6003 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6004 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6005
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006006 /* It should trigger RAC_CI resolution to start again: */
6007 /* When using new PCUIF interface for resolution, we must
6008 * PCUIF.receive() here since that's the first message in the PCUIF
6009 * queue that PCU will have sent. Calling other functions doing
6010 * PCUIF.receive() (like f_ms_tx_ul_block() below) will make them fail
6011 * due to unexpected message receive. */
6012 if (not use_old_ctrl_iface) {
6013 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6014 }
6015
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006016 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6017 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6018 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6019 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6020 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006021
6022 /* When using CTRL interface, we must schedule the ACK before (see
6023 * above) blocking here waiting for the resoltion, otherwise we'll be
6024 * too late scheduling by the time the resolution is done. */
6025 if (use_old_ctrl_iface) {
6026 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6027 }
6028
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006029 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6030 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
6031
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006032 /* RIM procedure: */
6033 as_outbound_nacc_rim_resolve(info_ind);
6034 /* Transmit SI back to MS */
6035 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6036
6037 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6038 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6039 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6040 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6041 f_shutdown(__BFILE__, __LINE__);
6042 }
6043 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6044 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6045 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6046 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6047 }
6048}
6049
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006050/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
6051testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
6052 var PollFnCtx pollctx;
6053 var GprsMS ms;
6054 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6055 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6056 var RlcmacDlBlock dl_block;
6057 var uint32_t sched_fn, dl_fn;
6058 var CtrlMessage rx_ctrl;
6059 var GsmArfcn req_arfcn := 862;
6060 var uint6_t req_bsic := 43;
6061 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006062 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006063
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006064 if (use_old_ctrl_iface) {
6065 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6066 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6067 }
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006068
6069 /* Initialize NS/BSSGP side */
6070 f_init_bssgp();
6071 /* Initialize GPRS MS side */
6072 f_init_gprs_ms();
6073 ms := g_ms[0]; /* We only use first MS in this test */
6074
6075 /* Initialize the PCU interface abstraction */
6076 f_init_raw(testcasename(), info_ind);
6077
6078 /* Make sure we are not affected by full cache from previous tests */
6079 f_pcuvty_flush_neigh_caches();
6080
6081 /* Establish BSSGP connection to the PCU */
6082 f_bssgp_establish();
6083 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6084
6085 /* Send PACKET RESOURCE REQUEST */
6086 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6087 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6088 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6089
6090 /* Start NACC from MS side */
6091 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6092 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6093
6094 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006095 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 +01006096 /* RIM procedure: */
6097 as_outbound_nacc_rim_resolve(info_ind);
6098
6099 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
6100 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
6101 f_sleep(0.1);
6102 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
6103 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
6104
6105 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
6106 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
6107 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
6108 * Data with unassigned DL TBF in line above): */
6109 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6110 /* Continue receiving Pkt Cell Neighbor Data */
6111 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
6112
6113 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6114 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6115 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6116 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6117 f_shutdown(__BFILE__, __LINE__);
6118 }
6119 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6120 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6121 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6122 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6123 }
6124
6125 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
6126 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
6127 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
6128 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
6129 f_dl_block_ack_fn(dl_block, dl_fn));
6130}
6131
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006132
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006133function f_do_inbound_nacc(template (value) RIM_Routing_Information tx_src_addr, template RIM_Routing_Information rx_dst_addr)
6134runs on RAW_PCU_Test_CT
6135{
6136 var template (value) RAN_Information_Request_RIM_Container req_cont;
6137 var template (value) PDU_BSSGP bssgp_rim_pdu;
6138 var template PDU_BSSGP bssgp_rim_pdu_expect;
6139 var template RAN_Information_RIM_Container rim_cont_expect;
6140 var RIM_Routing_Address bts_addr;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006141
6142 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006143 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 +01006144 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006145 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 +01006146 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02006147 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);
6148 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006149 f_sleep(1.0);
6150
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006151 bts_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006152
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006153 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6154 ts_RIM_Sequence_Number(1),
6155 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6156 ts_RIM_Protocol_Version_Number(1),
6157 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6158 omit);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006159 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
6160 tx_src_addr, req_cont);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006161
6162 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6163 tr_RIM_Sequence_Number(1),
6164 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6165 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006166 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 +01006167 omit);
6168
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006169 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(rx_dst_addr,
6170 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006171 rim_cont_expect);
6172 RIM.send(bssgp_rim_pdu);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006173 timer T := 2.0;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006174 T.start;
6175 alt {
6176 [] RIM.receive(bssgp_rim_pdu_expect) { }
6177 [] RIM.receive {
6178 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6179 }
6180 [] T.timeout {
6181 setverdict(fail, "No BSSGP RIM PDU received");
6182 mtc.stop;
6183 }
6184 }
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006185}
6186/* Send a RIM RAN info request to the PCU and verify the response, we expect
6187 * getting the system information back which we have transfered to the PCU via
6188 * PCUIF on startup. */
6189testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
6190 /* Initialize NS/BSSGP side */
6191 f_init_bssgp();
6192
6193 /* Initialize the PCU interface abstraction */
6194 f_init_raw(testcasename());
6195
6196 /* Establish BSSGP connection to the PCU */
6197 f_bssgp_establish();
6198
6199 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6200 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6201
6202 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6203 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr));
6204
6205 f_shutdown(__BFILE__, __LINE__, final := true);
6206}
6207
6208/* Same as TC_rim_ran_info_req_single_rep, but using an EUTRAN eNodeB ID as
6209 * Routing information, to verify PCU handles that kind of address just fine
6210 */
6211testcase TC_rim_ran_info_req_single_rep_eutran() runs on RAW_PCU_Test_CT {
6212 /* Initialize NS/BSSGP side */
6213 f_init_bssgp();
6214
6215 /* Initialize the PCU interface abstraction */
6216 f_init_raw(testcasename());
6217
6218 /* Establish BSSGP connection to the PCU */
6219 f_bssgp_establish();
6220
6221 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6222 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_enbid(src_cid, tac := 3, gnbid := '12345678123456'O));
6223
6224 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr),
6225 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006226
6227 f_shutdown(__BFILE__, __LINE__, final := true);
6228}
6229
6230/* Same as above, but in this case we simulate the rare case in which the PCU
6231 * has no system information available. We expect getting a response back but
6232 * with no system information inside. */
6233testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006234 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006235 var PCUIF_Message pcu_msg;
6236 timer T := 2.0;
6237
6238 /* Initialize NS/BSSGP side */
6239 f_init_bssgp();
6240
6241 /* Initialize the PCU interface abstraction */
6242 f_init_raw(testcasename(), info_ind);
6243
6244 /* Establish BSSGP connection to the PCU */
6245 f_bssgp_establish();
6246
6247 /* Clear sysinfo from the PCU */
6248 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);
6249 BTS.send(si1_data_ind);
6250 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);
6251 BTS.send(si3_data_ind);
6252 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);
6253 BTS.send(si16_data_ind);
6254 f_sleep(1.0);
6255
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006256 var RIM_Routing_Address dst_addr;
6257 var RIM_Routing_Address src_addr;
6258 var template (value) RAN_Information_Request_RIM_Container req_cont;
6259 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006260 var template PDU_BSSGP bssgp_rim_pdu_expect;
6261 var template RAN_Information_RIM_Container rim_cont_expect;
6262
6263 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 +01006264 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6265 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006266
6267 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6268 ts_RIM_Sequence_Number(1),
6269 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6270 ts_RIM_Protocol_Version_Number(1),
6271 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6272 omit);
6273 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6274 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6275 req_cont);
6276
6277
6278 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6279 tr_RIM_Sequence_Number(1),
6280 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6281 tr_RIM_Protocol_Version_Number(1),
6282 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
6283 omit);
6284
6285 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6286 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6287 rim_cont_expect);
6288 RIM.send(bssgp_rim_pdu);
6289 T.start;
6290 alt {
6291 [] RIM.receive(bssgp_rim_pdu_expect) { }
6292 [] RIM.receive {
6293 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6294 }
6295 [] T.timeout {
6296 setverdict(fail, "No BSSGP RIM PDU received");
6297 mtc.stop;
6298 }
6299 }
6300
6301 f_shutdown(__BFILE__, __LINE__, final := true);
6302}
6303
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006304/* 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 +02006305testcase TC_pdch_energy_saving() runs on RAW_PCU_Test_CT {
6306 var PCUIF_info_ind info_ind;
6307 var template (value) TsTrxBtsNum nr;
6308 var RlcmacDlBlock dl_block;
6309 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006310 var integer ts;
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006311 timer T;
6312
6313 /* Initialize NS/BSSGP side */
6314 f_init_bssgp();
6315
6316 info_ind := valueof(ts_PCUIF_INFO_default);
6317 /* The 2 first TRX are enabled. */
6318 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (2 .. 7));
6319 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6320 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 1);
6321
6322 /* Initialize the PCU interface abstraction */
6323 f_init_raw(testcasename(), info_ind);
6324
6325 /* Establish BSSGP connection to the PCU */
6326 f_bssgp_establish();
6327
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006328 for (ts := 0; ts < 2; ts := ts + 1) {
6329 nr := ts_TsTrxBtsNum(ts_nr := 7, trx_nr := ts, bts_nr := 0, blk_nr := 0);
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006330
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006331 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
6332 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
6333 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), block_nr := nr.blk_nr));
6334 T.start(0.5);
6335 alt {
6336 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
6337 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
6338 omit)) -> value data_msg {
6339 setverdict(pass);
6340 T.stop;
6341 }
6342 [] as_rx_fail_dummy(nr);
6343 [] BTS.receive {
6344 setverdict(fail, "Unexpected block from BTS");
6345 f_shutdown(__BFILE__, __LINE__);
6346 }
6347 [] T.timeout {
6348 setverdict(fail, "Expected IDLE block from BTS");
6349 f_shutdown(__BFILE__, __LINE__);
6350 }
6351 }
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006352 }
6353
6354 f_shutdown(__BFILE__, __LINE__, final := true);
6355}
6356
Oliver Smith3d174882021-09-03 11:38:51 +02006357/* Test stats for available and occupied PDCHs */
6358testcase TC_stat_pdch_avail_occ() runs on RAW_PCU_Test_CT {
6359 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6360 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6361
6362 /* Initialize NS/BSSGP side */
6363 f_init_bssgp();
6364
Oliver Smithedcded22021-09-14 09:26:55 +02006365 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6366 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6367 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6368 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6369 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6370 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
Oliver Smith3d174882021-09-03 11:38:51 +02006371
Oliver Smith72d0c692021-09-08 10:03:52 +02006372 /* Allocate 4 GprsMS instances */
Oliver Smith3d174882021-09-03 11:38:51 +02006373 f_init_gprs_ms(4);
6374
6375 /* Initialize the PCU interface abstraction */
6376 f_init_raw(testcasename(), info_ind);
6377
6378 /* Reset stats */
6379 f_statsd_reset();
6380
6381 /* Establish BSSGP */
6382 f_bssgp_establish();
6383
6384 /* 8 PDCHs available, 0 occupied */
6385 var StatsDExpects expect := {
6386 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006387 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6388 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6389 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
Oliver Smith3d174882021-09-03 11:38:51 +02006390 };
6391 f_statsd_expect(expect);
6392
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006393 /* Establish an Uplink TBF for each GprsMS instance (3x GPRS, 1x EGPRS) */
Oliver Smith3d174882021-09-03 11:38:51 +02006394 f_multi_ms_bssgp_register();
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006395 f_ms_establish_ul_tbf(g_ms[0]);
6396 f_ms_establish_ul_tbf(g_ms[1]);
6397 f_ms_establish_ul_tbf(g_ms[2]);
6398 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 +02006399
6400 /* 4 PDCHs occupied */
6401 expect := {
6402 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006403 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 4, max := 4 },
6404 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 3, max := 3 },
6405 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
Oliver Smith3d174882021-09-03 11:38:51 +02006406 };
6407 f_statsd_expect(expect);
6408
6409 f_shutdown(__BFILE__, __LINE__, final := true);
6410}
6411
Oliver Smithf04762d2021-09-14 17:20:38 +02006412/* Test stats for available and occupied PDCHs, for MS which is not known by
6413 * the PCU (e.g. because it was forgotten due to no interaction, and old DL
6414 * data arrives from SGSN) */
6415function f_tc_stat_pdch_avail_occ_ms_not_known(boolean egprs) runs on RAW_PCU_Test_CT {
6416 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6417 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6418
6419 /* Ensure a deterministic slot allocation of 1 PDCH with MS class 1 */
6420 const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs := {
6421 gprsmultislotclass := '00001'B,
6422 gprsextendeddynalloccap := '0'B
6423 };
6424 const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs := {
6425 egprsmultislotclass := '00001'B,
6426 egprsextendeddynalloccap := '0'B
6427 };
6428 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs := {
6429 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, omit)) };
6430 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs := {
6431 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, bssgp_mscap_egprs)) };
6432
6433 /* Initialize NS/BSSGP side */
6434 f_init_bssgp();
6435
6436 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6437 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6438 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6439 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6440 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6441 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
6442
6443 /* Allocate 1 GprsMS instance */
6444 f_init_gprs_ms(1);
6445
6446 /* Initialize the PCU interface abstraction */
6447 f_init_raw(testcasename(), info_ind);
6448
6449 /* Reset stats */
6450 f_statsd_reset();
6451
6452 /* Establish BSSGP */
6453 f_bssgp_establish();
6454
6455 /* 8 PDCHs available, 0 occupied */
6456 var StatsDExpects expect := {
6457 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6458 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6459 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6460 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6461 };
6462 f_statsd_expect(expect);
6463
6464 var GprsMS ms := g_ms[0]; /* We only use first MS in this test */
6465 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6466
6467 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
6468 var octetstring data := f_rnd_octstring(1400);
6469 if (egprs) {
6470 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs));
6471 } else {
6472 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_gprs));
6473 }
6474 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
6475
6476 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
6477 f_sleep(X2002);
6478
6479 /* 1 PDCH occupied */
6480 if (egprs) {
6481 expect := {
6482 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6483 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6484 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6485 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
6486 };
6487 } else {
6488 expect := {
6489 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6490 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6491 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 1, max := 1 },
6492 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6493 };
6494 }
6495 f_statsd_expect(expect);
6496
6497 /* Clean up */
6498 f_shutdown(__BFILE__, __LINE__, final := true);
6499}
6500testcase TC_stat_pdch_avail_occ_ms_not_known_gprs() runs on RAW_PCU_Test_CT {
6501 f_tc_stat_pdch_avail_occ_ms_not_known(false);
6502}
6503testcase TC_stat_pdch_avail_occ_ms_not_known_egprs() runs on RAW_PCU_Test_CT {
6504 f_tc_stat_pdch_avail_occ_ms_not_known(true);
6505}
6506
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006507/* Make sure that bts.0.pdch.all_allocated is set when we allocate all resources */
6508testcase TC_ratectr_all_available_allocated() runs on RAW_PCU_Test_CT {
6509 var PCUIF_info_ind info_ind;
6510 var template IARRestOctets rest;
6511 var BIT11 ra11;
6512
6513 info_ind := valueof(ts_PCUIF_INFO_default);
6514 info_ind.t3142 := 3;
6515
6516 /* Only the first TRX is enabled. */
6517 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
6518 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6519
6520 /* Initialize the PCU interface abstraction */
6521 f_init_raw(testcasename(), info_ind);
6522 f_statsd_reset();
6523
6524 var EGPRSPktChRequest req := {
6525 one_phase := {
6526 tag := '0'B,
6527 multislot_class := '10101'B,
6528 priority := '01'B,
6529 random_bits := '101'B
6530 }
6531 };
6532
6533 /* We send 7 requests, the IUT gives us all available USFs (0..6) */
6534 for (var integer i := 0; i < 7; i := i + 1) {
6535 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
6536 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
6537 }
6538
6539 ra11 := enc_EGPRSPktChRequest2bits(req);
6540 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
6541
6542 /* At this point, the IUT should run out of free USFs */
6543 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
6544
6545 /* bts.0.pdch.all_allocated is updated once per second, wait some time to make sure it was updated. */
6546 f_sleep(2.0);
6547 var StatsDExpects expect := {
6548 { name := "TTCN3.bts.0.pdch.all_allocated", mtype := "c", min := 1, max := 1 }
6549 };
6550 f_statsd_expect(expect);
6551
6552 f_shutdown(__BFILE__, __LINE__, final := true);
6553}
6554
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006555control {
6556 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01006557 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006558 execute( TC_ta_ptcch_idle() );
6559 execute( TC_ta_rach_imm_ass() );
Vadim Yanitskiy866f8702021-05-26 14:50:27 +02006560 execute( TC_ta_ul_ack_nack_first_block() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006561 execute( TC_ta_idle_dl_tbf_ass() );
6562 execute( TC_ta_ptcch_ul_multi_tbf() );
6563 execute( TC_cs_lqual_ul_tbf() );
6564 execute( TC_cs_initial_ul() );
6565 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01006566 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01006567 execute( TC_cs_max_dl() );
6568 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01006569 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01006570 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01006571 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01006572 execute( TC_mcs_max_dl() );
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02006573 execute( TC_t3141() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01006574 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02006575 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01006576 execute( TC_x2031_t3191() );
6577 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006578 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01006579 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02006580 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02006581 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02006582 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006583 execute( TC_mo_ping_pong() );
6584 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02006585 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006586 execute( TC_mt_ping_pong() );
6587 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006588 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006589 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07006590 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006591 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01006592 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006593 execute( TC_paging_cs_from_bts() );
6594 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
6595 execute( TC_paging_cs_from_sgsn_sign() );
6596 execute( TC_paging_cs_from_sgsn_ptp() );
6597 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
6598 execute( TC_paging_ps_from_sgsn_sign() );
6599 execute( TC_paging_ps_from_sgsn_ptp() );
Oliver Smithe1a77c42021-07-28 13:36:09 +02006600 if (mp_osmo_pcu_newer_than_0_9_0) {
6601 execute( TC_paging_pch_timeout() );
6602 }
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07006603 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
6604 execute( TC_paging_cs_multi_ms_imsi() );
6605 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02006606 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
6607 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01006608 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
6609 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006610
6611 /* EGPRS specific test cases */
6612 execute( TC_egprs_pkt_chan_req_signalling() );
6613 execute( TC_egprs_pkt_chan_req_one_phase() );
6614 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07006615 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07006616 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07006617 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02006618
6619 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07006620
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006621 /* Immediate Assignment on AGCH/PCH */
6622 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
6623 execute( TC_pcuif_fh_imm_ass_ul() );
6624 execute( TC_pcuif_fh_imm_ass_dl() );
6625 /* Packet Uplink/Downlink Assignment on PACCH */
6626 execute( TC_pcuif_fh_pkt_ass_ul() );
6627 execute( TC_pcuif_fh_pkt_ass_dl() );
6628 execute( TC_multitrx_multims_alloc() );
6629 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
6630 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
6631 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
Pau Espin Pedrol37604572021-10-15 14:36:16 +02006632 execute( TC_ul_tbf_reestablish_with_pkt_resource_req() );
Pau Espin Pedrold658f342021-10-15 14:52:22 +02006633 execute( TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() );
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006634
Pau Espin Pedrole1303052020-11-16 11:13:51 +01006635 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07006636
6637 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01006638 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01006639 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01006640 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01006641 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01006642 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01006643 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01006644 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
6645 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006646 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
6647 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
6648 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006649 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
6650 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006651 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
6652 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
6653 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006654 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006655 if (mp_ctrl_neigh_ip != "") { /* PCU using old CTRL neigh addr resolution iface */
6656 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
6657 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
6658 }
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006659
6660 execute( TC_rim_ran_info_req_single_rep() );
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006661 execute( TC_rim_ran_info_req_single_rep_eutran() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006662 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006663
6664 execute (TC_pdch_energy_saving() );
Oliver Smith3d174882021-09-03 11:38:51 +02006665
6666 execute( TC_stat_pdch_avail_occ() );
Oliver Smithf04762d2021-09-14 17:20:38 +02006667 execute( TC_stat_pdch_avail_occ_ms_not_known_gprs() );
6668 execute( TC_stat_pdch_avail_occ_ms_not_known_egprs() );
Pau Espin Pedrol6eb4d252021-11-15 11:53:40 +01006669 execute( TC_ratectr_all_available_allocated() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006670}
6671
Harald Weltea419df22019-03-21 17:23:04 +01006672}