blob: 2cc6fadbd069c8f04b7574c06a83be8ab356cf6c [file] [log] [blame]
Harald Weltea0895f92018-03-08 11:51:23 +01001module PCU_Tests {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002
3/* "RAW" PCU tests: Talk directly to the PCU socket of OsmoPCU on the one hand side (emulating
4 the BTS/BSC side PCU socket server) and the Gb interface on the other hand side. No NS/BSSGP
5 Emulation is used; rather, we simply use the NS_CodecPort to implement both standard and non-
6 standard procedures on the NS and BSSGP level. The goal of these tests is to test exactly
7 those NS and BSSGP implementations on the BSS (PCU) side. */
8
9/* (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +070010 * (C) 2019-2020 Vadim Yanitskiy <axilirator@gmail.com>
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020011 * All rights reserved.
12 *
13 * Released under the terms of GNU General Public License, Version 2 or
14 * (at your option) any later version.
15 *
16 * SPDX-License-Identifier: GPL-2.0-or-later
17 */
18
19friend module PCU_Tests_NS;
20
21import from General_Types all;
22import from Osmocom_Types all;
23import from GSM_Types all;
24import from GSM_RR_Types all;
25
26import from Osmocom_VTY_Functions all;
27import from TELNETasp_PortType all;
28
29import from MobileL3_GMM_SM_Types all;
30import from RLCMAC_CSN1_Types all;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020031import from RLCMAC_CSN1_Templates all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020032import from RLCMAC_Types all;
Pau Espin Pedrole8d7d162020-04-29 19:07:36 +020033import from RLCMAC_Templates all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020034
35import from MobileL3_CommonIE_Types all;
36import from L3_Templates all;
37
38import from NS_Types all;
39import from BSSGP_Types all;
40import from Osmocom_Gb_Types all;
41
42import from BSSGP_Emulation all; /* BssgpConfig */
43import from NS_Emulation all; /* NSConfiguration */
44
45import from UD_Types all;
46import from PCUIF_Types all;
47import from PCUIF_CodecPort all;
48import from PCUIF_Components all;
49import from IPL4asp_Types all;
50import from Native_Functions all;
51import from SGSN_Components all;
Pau Espin Pedrolaedc5112020-05-16 17:30:42 +020052import from GPRS_Components all;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020053
Daniel Willmann535aea62020-09-21 13:27:08 +020054import from StatsD_Types all;
55import from StatsD_CodecPort all;
56import from StatsD_CodecPort_CtrlFunct all;
57import from StatsD_Checker all;
58
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010059import from IPA_Emulation all;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +010060import from Osmocom_CTRL_Types all;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010061import from Osmocom_CTRL_Adapter all;
62import from Osmocom_CTRL_Functions all;
63
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020064modulepar {
65 charstring mp_pcu_sock_path := PCU_SOCK_DEFAULT;
66
67 float X2002 := 0.2; /* Timer -2002, IMM ASSIGN confirm delay */
Daniel Willmann535aea62020-09-21 13:27:08 +020068
69 charstring mp_pcu_statsd_ip := "127.0.0.1";
70 integer mp_pcu_statsd_port := 8125;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010071
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +020072 charstring mp_ctrl_neigh_ip := ""; /* Use new PCUIF over IPA multiplex for Neigh Addr Resolution */
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +010073 integer mp_ctrl_neigh_port := 4248;
Oliver Smith61b4e732021-07-22 08:14:29 +020074
75 boolean mp_osmo_pcu_newer_than_0_9_0 := true; /* Drop after OsmoPCU > 0.9.0 was released */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020076}
77
78
79/* FIXME: make sure to use parameters from mp_gb_cfg.cell_id in the PCU INFO IND */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +010080friend template (value) PCUIF_info_ind ts_PCUIF_INFO_default(template (value) PCUIF_Flags flags := c_PCUIF_Flags_default)
81:= {
Vadim Yanitskiyc1559302020-07-19 16:39:12 +070082 version := PCUIF_Types.mp_pcuif_version,
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +010083 flags := flags,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +010084 trx := ts_PCUIF_InfoTrxs_def(GPRS_Components.mp_base_arfcn),
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020085 bsic := 7,
86 mcc := 262,
87 mnc := 42,
88 mnc_3_digits := 0,
89 lac := 13135,
90 rac := 0,
91 nsei := mp_nsconfig.nsei,
92 nse_timer := { 3, 3, 3, 3, 30, 3, 10 },
93 cell_timer := { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 },
94 cell_id := 20960,
95 repeat_time := 5 * 50,
96 repeat_count := 3,
Harald Welte5339b2e2020-10-04 22:52:56 +020097 bvci := mp_gb_cfg.bvc[0].bvci,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +020098 t3142 := 20,
99 t3169 := 5,
100 t3191 := 5,
101 t3193_10ms := 160,
102 t3195 := 5,
Pau Espin Pedrol76de1662021-03-01 17:40:58 +0100103 n3101 := 10,
104 n3103 := 4,
105 n3105 := 8,
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200106 cv_countdown := 15,
107 dl_tbf_ext := 250 * 10, /* ms */
108 ul_tbf_ext := 250 * 10, /* ms */
109 initial_cs := 2,
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +0100110 initial_mcs := 1,
Harald Welte90f19742020-11-06 19:34:40 +0100111 nsvci := { mp_nsconfig.nsvc[0].nsvci, 0 },
112 local_port := { mp_nsconfig.nsvc[0].provider.ip.remote_udp_port, 0 },
113 remote_port := { mp_nsconfig.nsvc[0].provider.ip.local_udp_port, 0 },
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +0100114 remote_addr := f_PCUIF_RemoteAddr(
Harald Welte90f19742020-11-06 19:34:40 +0100115 f_PCUIF_AF2addr_type(mp_nsconfig.nsvc[0].provider.ip.address_family), mp_nsconfig.nsvc[0].provider.ip.local_ip)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200116}
117
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100118/* Passed in RAN-INFO message from emulated neighbor using RIM */
119const octetstring si1_default := '198fb100000000000000000000000000007900002b'O;
120const octetstring si3_default := '1b753000f110236ec9033c2747407900003c0b2b2b'O;
121const octetstring si13_default := '009000185a6fc9e08410ab2b2b2b2b2b2b2b2b2b2b'O;
122const octetstring si_default := si1_default & si3_default & si13_default;
123
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +0100124const MultislotCap_GPRS mscap_gprs_def := {
125 gprsmultislotclass := '00011'B,
126 gprsextendeddynalloccap := '0'B
127};
128const MultislotCap_EGPRS mscap_egprs_def := {
129 egprsmultislotclass := '00011'B,
130 egprsextendeddynalloccap := '0'B
131};
132template (value) MSRadioAccessCapabilityV ms_racap_gprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, omit) };
133template (value) MSRadioAccessCapabilityV ms_racap_egprs_def := { ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs_def, mscap_egprs_def) };
134
135const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs_def := {
136 gprsmultislotclass := '00011'B,
137 gprsextendeddynalloccap := '0'B
138};
139const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs_def := {
140 egprsmultislotclass := '00011'B,
141 egprsextendeddynalloccap := '0'B
142};
143template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, omit)) };
144template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs_def := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs_def, bssgp_mscap_egprs_def)) };
145
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200146type record lqual_range {
147 /* component reference to the IPA_Client component used for RSL */
148 uint8_t low,
149 uint8_t high
150}
151
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +0100152type component RAW_PCU_Test_CT extends bssgp_CT, MS_BTS_IFACE_CT, StatsD_ConnHdlr, CTRL_Adapter_CT {
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700153 /* PCU interface abstraction component */
154 var RAW_PCUIF_CT vc_PCUIF;
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700155
Daniel Willmann535aea62020-09-21 13:27:08 +0200156 /* StatsD */
157 var StatsD_Checker_CT vc_STATSD;
158
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200159 /* Connection to the PCUIF component */
160 port RAW_PCU_MSG_PT PCUIF;
161 /* VTY connection to the PCU */
162 port TELNETasp_PT PCUVTY;
163
164 /* Uplink CS/MCS thresholds, default from pcu_main.c: */
165 var lqual_range g_cs_lqual_ranges[4] := {{low := 0, high := 6},
166 {low := 5, high := 8},
167 {low := 7, high := 13},
168 {low := 12,high := 35}};
169 var lqual_range g_mcs_lqual_ranges[9] := {{low := 0, high := 6},
170 {low := 5, high := 8},
171 {low := 7, high := 13},
172 {low := 12,high := 15},
173 {low := 14, high := 17},
174 {low := 16, high := 18},
175 {low := 17,high := 20},
176 {low := 19, high := 24},
177 {low := 23,high := 35}};
178 var uint8_t g_cs_initial_dl := 1;
179 var uint8_t g_cs_initial_ul := 1;
180 var uint8_t g_mcs_initial_dl := 1;
181 var uint8_t g_mcs_initial_ul := 1;
182 var uint8_t g_cs_max_dl := 4;
183 var uint8_t g_cs_max_ul := 4;
184 var uint8_t g_mcs_max_dl := 9;
185 var uint8_t g_mcs_max_ul := 9;
186
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200187 var boolean g_force_two_phase_access := false;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200188
189 /* Guard timeout */
190 timer g_T_guard := 60.0;
191};
192
193private altstep as_Tguard_RAW() runs on RAW_PCU_Test_CT {
194 [] g_T_guard.timeout {
195 setverdict(fail, "Timeout of T_guard");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700196 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200197 }
198}
199
200private function f_pcuvty_set_allowed_cs_mcs() runs on RAW_PCU_Test_CT {
201 f_vty_config2(PCUVTY, {"pcu"}, "cs " & int2str(g_cs_initial_dl) & " " & int2str(g_cs_initial_ul));
202 f_vty_config2(PCUVTY, {"pcu"}, "cs max " & int2str(g_cs_max_dl) & " " & int2str(g_cs_max_ul));
203
204 f_vty_config2(PCUVTY, {"pcu"}, "mcs " & int2str(g_mcs_initial_dl) & " " & int2str(g_mcs_initial_ul));
205 f_vty_config2(PCUVTY, {"pcu"}, "mcs max " & int2str(g_mcs_max_dl) & " " & int2str(g_mcs_max_ul));
206}
207
208private function f_pcuvty_set_link_quality_ranges() runs on RAW_PCU_Test_CT {
209 var charstring cmd;
210
211 cmd := "cs link-quality-ranges" &
212 " cs1 " & int2str(g_cs_lqual_ranges[0].high) &
213 " cs2 " & int2str(g_cs_lqual_ranges[1].low) & " " & int2str(g_cs_lqual_ranges[1].high) &
214 " cs3 " & int2str(g_cs_lqual_ranges[2].low) & " " & int2str(g_cs_lqual_ranges[2].high) &
215 " cs4 " & int2str(g_cs_lqual_ranges[3].low);
216 f_vty_config2(PCUVTY, {"pcu"}, cmd);
217
218 cmd := "mcs link-quality-ranges" &
219 " mcs1 " & int2str(g_mcs_lqual_ranges[0].high) &
220 " mcs2 " & int2str(g_mcs_lqual_ranges[1].low) & " " & int2str(g_mcs_lqual_ranges[1].high) &
221 " mcs3 " & int2str(g_mcs_lqual_ranges[2].low) & " " & int2str(g_mcs_lqual_ranges[2].high) &
222 " mcs4 " & int2str(g_mcs_lqual_ranges[3].low) & " " & int2str(g_mcs_lqual_ranges[3].high) &
223 " mcs5 " & int2str(g_mcs_lqual_ranges[4].low) & " " & int2str(g_mcs_lqual_ranges[4].high) &
224 " mcs6 " & int2str(g_mcs_lqual_ranges[5].low) & " " & int2str(g_mcs_lqual_ranges[5].high) &
225 " mcs7 " & int2str(g_mcs_lqual_ranges[6].low) & " " & int2str(g_mcs_lqual_ranges[6].high) &
226 " mcs8 " & int2str(g_mcs_lqual_ranges[7].low) & " " & int2str(g_mcs_lqual_ranges[7].high) &
227 " mcs9 " & int2str(g_mcs_lqual_ranges[8].low);
228 f_vty_config2(PCUVTY, {"pcu"}, cmd);
229}
230
Pau Espin Pedrol43be4252021-01-27 16:40:54 +0100231private function f_pcuvty_flush_neigh_caches() runs on RAW_PCU_Test_CT {
232 f_pcuvty_set_neigh_caches(0, 0);
233}
234
235private function f_pcuvty_set_neigh_caches(integer neigh_cache_secs := -1, integer si_cache_secs := -1)
236runs on RAW_PCU_Test_CT {
237 if (neigh_cache_secs == -1) {
238 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 default");
239 } else {
240 f_vty_config2(PCUVTY, {"pcu"}, "timer X10 " & int2str(neigh_cache_secs));
241 }
242 if (si_cache_secs == -1) {
243 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 default");
244 } else {
245 f_vty_config2(PCUVTY, {"pcu"}, "timer X11 " & int2str(si_cache_secs));
246 }
247}
248
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100249private function f_init_vty(charstring id, boolean egprs_only) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200250 map(self:PCUVTY, system:PCUVTY);
251 f_vty_set_prompts(PCUVTY);
252 f_vty_transceive(PCUVTY, "enable");
253
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100254 /* This will be removed soon, not needed. EGPRS support is controlled through pcu_ind flags */
255 if (egprs_only) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200256 f_vty_config2(PCUVTY, {"pcu"}, "egprs only");
257 } else {
258 f_vty_config2(PCUVTY, {"pcu"}, "no egprs");
259 }
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +0200260
261 if (g_force_two_phase_access) {
262 f_vty_config2(PCUVTY, {"pcu"}, "two-phase-access");
263 } else {
264 f_vty_config2(PCUVTY, {"pcu"}, "no two-phase-access");
265 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200266}
267
Pau Espin Pedrol2456dad2020-04-30 20:22:38 +0200268function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200269runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200270 /* Start the guard timer */
271 g_T_guard.start;
272 activate(as_Tguard_RAW());
273
274 /* Init PCU interface component */
Harald Welte5339b2e2020-10-04 22:52:56 +0200275 vc_PCUIF := RAW_PCUIF_CT.create("PCUIF");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200276 connect(vc_PCUIF:MTC, self:PCUIF);
277 map(vc_PCUIF:PCU, system:PCU);
278
279 /* Create one BTS component (we may want more some day) */
Harald Welte5339b2e2020-10-04 22:52:56 +0200280 vc_BTS := RAW_PCU_BTS_CT.create("BTS");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200281 connect(vc_BTS:PCUIF, vc_PCUIF:BTS);
282 connect(vc_BTS:TC, self:BTS);
283
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100284 f_init_vty(id, f_pcuif_ind_flags_egprs_enabled(valueof(info_ind.flags)));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200285
Daniel Willmann535aea62020-09-21 13:27:08 +0200286 f_init_statsd(id, vc_STATSD, mp_pcu_statsd_ip, mp_pcu_statsd_port);
287 /* This is normally done in the ConnHdlr component, but here
288 * the Test_CT doubles as ConnHdlr */
289 connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
290
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200291 vc_PCUIF.start(f_PCUIF_CT_handler(mp_pcu_sock_path));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100292 vc_BTS.start(f_BTS_CT_handler(0, valueof(info_ind), true));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200293
294 /* Wait until the BTS is ready (SI13 negotiated) */
295 BTS.receive(tr_RAW_PCU_EV(BTS_EV_SI13_NEGO));
296}
297
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700298/* Register TLLI of each allocated GprsMS instance */
299private function f_multi_ms_bssgp_register()
300runs on RAW_PCU_Test_CT {
301 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
302 f_bssgp_client_llgmm_assign(TLLI_UNUSED, g_ms[i].tlli);
303 }
304}
305
306/* Allocate [and activate] an Uplink TBF for each allocated GprsMS instance */
307private function f_multi_ms_establish_tbf(boolean do_activate := false)
308runs on RAW_PCU_Test_CT {
309 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
310 /* Establish an Uplink TBF */
311 f_ms_establish_ul_tbf(g_ms[i]);
312
313 /* Send a random block, so this TBF becomes "active" */
314 if (do_activate) {
315 /* FIXME: use the new APU by Pau to get correct TRX/TS here */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100316 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, i mod 8);
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700317 var octetstring dummy := f_rnd_octstring(12);
318 var RlcmacDlBlock dl_block;
319 var uint32_t poll_fn;
320
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200321 f_ms_tx_ul_data_block(g_ms[i], dummy, with_tlli := true, fn := g_ms[i].ul_tbf.start_time_fn, nr := nr);
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +0700322 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := nr);
323 }
324 }
325}
326
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100327private function f_ms_establish_ul_tbf_2phase_access(inout GprsMS ms,
328 template (omit) RlcmacUlCtrlMsg pkt_res_req := omit)
329runs on RAW_PCU_Test_CT return PollFnCtx {
330 var PollFnCtx pollctx;
331
332 /* Single block (two phase) packet access */
333 var uint16_t ra := bit2int(chan_req_sb);
334 if (g_force_two_phase_access) {
335 /* If 2phase access is enforced by the network, then let's
336 * request a One phase packet access, we'll receive a single block
337 * anyway
338 */
339 ra := bit2int(chan_req_def);
340 }
341
342 /* Establish an Uplink TBF */
343 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
344 f_ms_establish_ul_tbf(ms);
345
346 /* Make sure we've got an Uplink TBF assignment */
347 if (not match(ms.ul_tbf.ass.ccch, tr_PacketUlSglAssign)) {
348 setverdict(fail, "Wrong Packet Uplink Assignment received: ", ms.ul_tbf.ass.ccch, " vs exp: ", tr_PacketUlSglAssign);
349 f_shutdown(__BFILE__, __LINE__);
350 }
351
352 /* Send PACKET RESOURCE REQUEST
353 * (see 3GPP TS 04.60 "7.1.3.1 Initiation of the Packet resource request procedure")
354 */
355 if (istemplatekind(pkt_res_req, "omit")) {
356 pkt_res_req := ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit);
357 }
358
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200359 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(valueof(pkt_res_req)), ms.ul_tbf.start_time_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +0100360 /* Store 1st UlTBF context before receiving next one, will
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +0100361 * overwrite the TS allocation on MS with info from new UL TBF:
362 */
363 pollctx.tstrxbts := f_ms_tx_TsTrxBtsNum(ms);
364 f_ms_rx_pkt_ass_pacch(ms, pollctx.fn, tr_RLCMAC_UL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
365 return pollctx;
366}
367
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200368testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +0200369 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
Pau Espin Pedrol2889f872021-01-11 14:43:35 +0100370 var GprsTlli tlli := TLLI_UNUSED;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200371 timer T;
372
373 /* Initialize NS/BSSGP side */
374 f_init_bssgp();
375
376 /* Initialize the PCU interface abstraction */
377 f_init_raw(testcasename());
378
379 /* Establish BSSGP connection to the PCU */
380 f_bssgp_establish();
381
382 BTS.send(ts_PCUIF_SUSP_REQ(0, tlli, ra_id, 0));
383
384 T.start(2.0);
385 alt {
Harald Welte9b461a92020-12-10 23:41:14 +0100386 [] BSSGP_GLOBAL[0].receive(tr_BSSGP_SUSPEND(tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200387 setverdict(pass);
388 }
389 [] T.timeout {
390 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
391 }
392 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700393
394 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200395}
396
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100397/* Make sure TBF is released and no data is sent for in after reciving a Suspend Request from that MS. See OS#4761 */
398testcase TC_pcuif_suspend_active_tbf() runs on RAW_PCU_Test_CT {
399 var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.bvc[0].cell_id.ra_id);
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200400 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100401 var RlcmacDlBlock dl_block;
402 var octetstring data := f_rnd_octstring(10);
403 var uint32_t sched_fn;
404 var uint32_t dl_fn;
405 var GprsMS ms;
406 timer T;
407
408 /* Initialize NS/BSSGP side */
409 f_init_bssgp();
410 /* Initialize GPRS MS side */
411 f_init_gprs_ms();
412 ms := g_ms[0]; /* We only use first MS in this test */
413
414 /* Initialize the PCU interface abstraction */
415 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
416
417 /* Establish BSSGP connection to the PCU */
418 f_bssgp_establish();
419 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
420
421 /* Establish an Uplink TBF */
422 f_ms_establish_ul_tbf(ms);
423
424 /* Send one UL block (with TLLI since we are in One-Phase Access
425 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200426 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100427 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
428 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
429 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
430
431 /* UL block should be received in SGSN */
432 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
433
434 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
435 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
436 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
437
438 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
439 f_sleep(X2002);
440 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
441
442 /* MS has moved to CS, it sent SUSP REQ to BTS and PCU gets it, TBF is freed: */
443 BTS.send(ts_PCUIF_SUSP_REQ(0, ms.tlli, ra_id, 0));
444
445 T.start(2.0);
446 alt {
447 [] BSSGP_GLOBAL[0].receive(tr_BSSGP_SUSPEND(ms.tlli, mp_gb_cfg.bvc[0].cell_id.ra_id)) {
448 setverdict(pass);
449 }
450 [] T.timeout {
451 setverdict(fail, "Timeout waiting for BSSGP SUSPEND");
452 f_shutdown(__BFILE__, __LINE__);
453 }
454 }
455
456 /* Make sure we don't receive data for that TBF since it was released
457 * before. Also check our TBF is not polled for UL. */
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200458 f_pcuif_rx_data_req_pdtch(data_msg);
459 if (mp_osmo_pcu_newer_than_0_9_0 and data_msg.dl_block == omit) {
460 /* IDLE block, expected on new PCU versions */
461 } else if (not mp_osmo_pcu_newer_than_0_9_0 and match(data_msg.dl_block, tr_RLCMAC_DUMMY_CTRL())) {
462 /* Dummy RLCMAC block, expected on older PCU versions */
463 if (data_msg.dl_block.ctrl.mac_hdr.usf != USF_UNUSED) {
464 setverdict(fail, "Unexpected USF ", data_msg.dl_block.ctrl.mac_hdr.usf);
465 f_shutdown(__BFILE__, __LINE__);
466 }
467 } else {
468 setverdict(fail, "Unexpected dl_block", data_msg.dl_block);
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +0100469 f_shutdown(__BFILE__, __LINE__);
470 }
471
472 /* New data arrives, PCU should page the MS since no TBF active exists: */
473 /* Send some more data, it will never reach the MS */
474 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
475 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
476
477 f_shutdown(__BFILE__, __LINE__, final := true);
478}
479
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200480/* Test of correct Timing Advance at the time of TBF establishment
481 * (derived from timing offset of the Access Burst). */
482testcase TC_ta_rach_imm_ass() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200483 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200484
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200485 /* Initialize GPRS MS side */
486 f_init_gprs_ms();
487 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200488 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100489 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200490
491 /* We cannot send too many TBF requests in a short time because
492 * at some point the PCU will fail to allocate a new TBF. */
493 for (var TimingAdvance ta := 0; ta < 64; ta := ta + 16) {
494 /* Establish an Uplink TBF (send RACH.ind with current TA) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200495 ms.ta := ta;
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700496 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200497
498 /* Make sure Timing Advance IE matches out expectations */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200499 if (ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance != ta) {
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700500 setverdict(fail, "Timing Advance mismatch: ",
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200501 ms.ul_tbf.rr_imm_ass.payload.imm_ass.timing_advance,
Vadim Yanitskiy8685b382020-05-06 16:53:26 +0700502 " vs expected ", ta);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700503 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200504 }
505 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700506
507 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200508}
509
Vadim Yanitskiy866f8702021-05-26 14:50:27 +0200510/* Verify Timing Advance value indicated in Packet Uplink ACK/NACK message
511 * sent in response to the first Uplink block after resource allocation. */
512testcase TC_ta_ul_ack_nack_first_block() runs on RAW_PCU_Test_CT {
513 var GprsMS ms := valueof(t_GprsMS_def);
514 var PacketUlAckNack ul_ack_nack;
515 var PacketTimingAdvance pkt_ta;
516 var RlcmacDlBlock dl_block;
517 var uint32_t sched_fn;
518
519 /* Initialize NS/BSSGP side */
520 f_init_bssgp();
521
522 /* Initialize the PCU interface abstraction */
523 f_init_raw(testcasename());
524
525 /* Establish BSSGP connection to the PCU */
526 f_bssgp_establish();
527 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
528
529 /* Establish an Uplink TBF */
530 f_ms_establish_ul_tbf(ms);
531
532 /* In a busy network, there can be a significant delay between resource
533 * allocation (Packet Uplink Assignment above) and the actual time when
534 * the MS is allowed to transmit the first Uplink data block. */
535
536 /* Simulate a delay > 0 */
537 ms.ta := 2;
538
539 /* We're in One-Phase Access contention resoultion, include TLLI */
540 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
541 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
542
543 ul_ack_nack := dl_block.ctrl.payload.u.ul_ack_nack;
544 if (ispresent(ul_ack_nack.gprs.pkt_ta)) {
545 pkt_ta := ul_ack_nack.gprs.pkt_ta;
546 } else if (ispresent(ul_ack_nack.egprs.pkt_ta)) {
547 pkt_ta := ul_ack_nack.egprs.pkt_ta;
548 } else {
549 setverdict(fail, "PacketTimingAdvance IE is not present");
550 f_shutdown(__BFILE__, __LINE__);
551 }
552
553 if (not ispresent(pkt_ta.val)) {
554 setverdict(fail, "Timing Advance value is not present");
555 f_shutdown(__BFILE__, __LINE__);
556 } else if (pkt_ta.val != ms.ta) {
557 setverdict(fail, "Timing Advance mismatch: expected ",
558 ms.ta, ", but received ", pkt_ta.val);
559 f_shutdown(__BFILE__, __LINE__);
560 }
561}
562
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200563/* Verify Timing Advance value(s) indicated during the packet Downlink assignment
564 * procedure as per 3GPP TS 44.018, section 3.5.3. There seems to be a bug in the
565 * IUT that causes it to send an unreasonable Timing Advance value > 0 despite
566 * no active TBF exists at the moment of establishment (idle mode). */
567testcase TC_ta_idle_dl_tbf_ass() runs on RAW_PCU_Test_CT {
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100568 var GprsMS ms := valueof(t_GprsMS_def);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200569
570 /* Initialize NS/BSSGP side */
571 f_init_bssgp();
572
573 /* Initialize the PCU interface abstraction */
574 f_init_raw(testcasename());
575
576 /* Establish BSSGP connection to the PCU */
577 f_bssgp_establish();
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100578 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200579
580 /* SGSN sends some DL data, PCU will initiate Packet Downlink
581 * Assignment on CCCH (PCH). We don't care about the payload. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100582 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(10)));
583 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200584
585 /* Make sure that Timing Advance is 0 (the actual value is not known yet).
586 * As per 3GPP S 44.018, section 3.5.3.1.2, the network *shall* initiate
587 * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */
Vadim Yanitskiy37f33332021-02-21 00:04:23 +0100588 if (ms.dl_tbf.rr_imm_ass.payload.imm_ass.timing_advance != 0) {
Vadim Yanitskiy84d1dd52020-05-28 21:09:22 +0700589 setverdict(fail, "Timing Advance value doesn't match");
590 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700591
592 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200593}
594
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200595/* Verify that the PCU generates idle blocks in PTCCH/D
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200596 * while neither Uplink nor Downlink TBF is established. */
597testcase TC_ta_ptcch_idle() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100598 var BTS_PTCCH_Block pcu_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200599 timer T;
600
601 /* Initialize the PCU interface abstraction */
602 f_init_raw(testcasename());
603
604 /* Sent an RTS.req for PTCCH/D */
605 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
606 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
607 arfcn := 871, block_nr := 0));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100608
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200609 T.start(5.0);
610 alt {
Pau Espin Pedrol332aba82021-09-22 14:50:35 +0200611 [] BTS.receive(tr_PCUIF_DATA_PTCCH(0,
612 tr_PCUIF_DATA(0, 7, sapi := PCU_IF_SAPI_PTCCH),
613 omit)) {
614 if (not mp_osmo_pcu_newer_than_0_9_0) {
615 setverdict(fail, "Expected PTCCH/D block instead of IDLE block");
616 f_shutdown(__BFILE__, __LINE__);
617 }
618 }
619 [] as_rx_ptcch(pcu_msg, tr_PTCCHDownlinkMsg) {
620 if (mp_osmo_pcu_newer_than_0_9_0) {
621 setverdict(fail, "Expected IDLE block instead of PTCCH/D block");
622 f_shutdown(__BFILE__, __LINE__);
623 }
624 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200625 [] BTS.receive(PCUIF_Message:?) { repeat; }
626 [] T.timeout {
627 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700628 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200629 }
630 }
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +0100631 log("Decoded PTCCH/D message: ", pcu_msg.dl_block);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700632
633 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200634}
635
636/* Test of correct Timing Advance during an active Uplink TBF.
637 *
638 * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots
639 * are not continuous and there can be long time gaps between them. This happens
640 * due to a bursty nature of packet data. The actual Timing Advance of a MS may
641 * significantly change between such rare Uplink transmissions, so GPRS introduces
642 * additional mechanisms to control Timing Advance, and thus reduce interference
643 * between neighboring TDMA time-slots.
644 *
645 * At the moment of Uplink TBF establishment, initial Timing Advance is measured
646 * from ToA (Timing of Arrival) of an Access Burst. This is covered by another
647 * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network
648 * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index
649 * among with the initial Timing Advance value. And here PTCCH comes to play.
650 *
651 * PTCCH is a unidirectional channel on which the network can instruct a sub-set
652 * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance
653 * continuously. To ensure continuous measurements of the signal propagation
654 * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots
655 * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).
656 *
657 * The purpose of this test case is to verify the assignment of Timing Advance
658 * Index, and the process of Timing Advance notification on PTCCH/D. The MTC
659 * first establishes several Uplink TBFs, but does not transmit any Uplink
660 * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH
661 * indications to the PCU, checking the correctness of two received PTCCH/D
662 * messages (period of PTCCH/D is two multi-frames).
663 */
664
665/* List of ToA values for Access Bursts to be sent on PTCCH/U,
666 * each ToA (Timing of Arrival) value is in units of 1/4 of
667 * a symbol (i.e. 1 symbol is 4 QTA units). */
668type record length(16) of int16_t PTCCH_TAI_ToA_MAP;
669const PTCCH_TAI_ToA_MAP ptcch_toa_map_def := {
670 0, 0, 0, 0,
671 0, 0, 0, 0,
672 0, 0, 0, 0,
673 0, 0, 0, 0
674};
675
676private altstep as_ta_ptcch(uint8_t bts_nr := 0, uint8_t trx_nr := 0, uint8_t ts_nr := 7,
677 in PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def)
678runs on RAW_PCU_Test_CT {
679 var RAW_PCU_Event event;
680 var integer ss;
681
682 /* Send Access Bursts on PTCCH/U for every TA Index */
683 [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {
684 ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700685 if (ss < 0) { /* Shall not happen */
686 f_shutdown(__BFILE__, __LINE__);
687 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200688
689 log("Sending an Access Burst on PTCCH/U",
690 ", sub-slot=", ss, " (TAI)",
691 ", fn=", event.data.tdma_fn,
692 ", ToA=", toa_map[ss], " (QTA)");
693 /* TODO: do we care about RA and burst format? */
694 BTS.send(ts_PCUIF_RACH_IND(bts_nr, trx_nr, ts_nr,
695 ra := oct2int('3A'O),
696 is_11bit := 0,
697 burst_type := BURST_TYPE_0,
698 fn := event.data.tdma_fn,
699 arfcn := 871,
700 qta := toa_map[ss],
701 sapi := PCU_IF_SAPI_PTCCH));
702 repeat;
703 }
704}
705
706private function f_TC_ta_ptcch_ul_multi_tbf(in PTCCH_TAI_ToA_MAP ptcch_toa_map,
707 template PTCCHDownlinkMsg t_ta_msg)
708runs on RAW_PCU_Test_CT {
709 var PTCCHDownlinkMsg ta_msg;
710 var PCUIF_Message pcu_msg;
711 timer T;
712
713 /* First, send an RTS.req for the upcoming PTCCH/D block */
714 BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
715 sapi := PCU_IF_SAPI_PTCCH, fn := 0,
716 arfcn := 871, block_nr := 0));
717 T.start(2.0);
718 alt {
719 /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)
720 * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */
721 [] as_ta_ptcch(bts_nr := 0, trx_nr := 0, ts_nr := 7, toa_map := ptcch_toa_map);
722 /* In the end of 2nd multi-frame we should receive a PTCCH/D block */
723 [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,
724 sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {
725 ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);
726 log("Rx PTCCH/D message: ", ta_msg);
727
728 /* Make sure Timing Advance values match our expectations */
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700729 if (not match(ta_msg, t_ta_msg)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200730 setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);
731 }
732 }
733 [] BTS.receive { repeat; }
734 [] T.timeout {
735 setverdict(fail, "Timeout waiting for a PTCCH/D block");
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200736 }
737 }
738}
739
740testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {
741 var template PacketUlAssign t_ul_tbf_ass;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200742 var GprsMS ms;
743
744 /* Initialize GPRS MS side */
745 f_init_gprs_ms();
746 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200747
748 /* Initialize the PCU interface abstraction */
749 f_init_raw(testcasename());
750
751 /* Enable forwarding of PTCCH/U TDMA events to us */
752 BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));
753
754 /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */
755 for (var integer i := 0; i < 7; i := i + 1) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200756 /* Establish an Uplink TBF */
757 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200758
759 /* We expect incremental TFI/USF assignment (dynamic allocation) */
760 t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200761 if (not match(ms.ul_tbf.ass.ccch, t_ul_tbf_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200762 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700763 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200764 }
765
766 /* We also expect Timing Advance Index to be a part of the assignment */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200767 if (ms.ul_tbf.ass.ccch.dynamic.ta_index != i) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200768 setverdict(fail, "Failed to match Timing Advance Index for #", i);
769 /* Keep going, the current OsmoPCU does not assign TA Index */
770 }
771 }
772
773 /* Prepare a list of ToA values for Access Bursts to be sent on PTCCH/U */
774 var PTCCH_TAI_ToA_MAP toa_map := ptcch_toa_map_def;
775 for (var integer i := 0; i < 7; i := i + 1) {
776 /* ToA in units of 1/4 of a symbol */
777 toa_map[i] := (i + 1) * 7 * 4;
778 }
779
780 /* Now we have all 7 TBFs established in one-phase access mode,
781 * however we will not be sending any data on them. Instead, we
782 * will be sending RACH.ind on PTCCH/U during 4 multi-frame
783 * periods (TAI 0..8), and then will check two PTCCH/D blocks.
784 *
785 * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA
786 * time-slots, so at the moment of scheduling a PTCCH/D block
787 * the PCU has odd number of PTCCH/U Access Bursts received. */
788 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
789 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
790 /* Other values are not known (yet) */
791 tai3_ta := ?));
792 f_TC_ta_ptcch_ul_multi_tbf(toa_map, tr_PTCCHDownlinkMsg(
793 tai0_ta := 7, tai1_ta := 14, tai2_ta := 21,
794 tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,
795 /* Other values are out of our interest */
796 tai6_ta := ?));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700797
798 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200799}
800
801/* Default link quality adaptation (Coding Scheme) ranges (inclusive).
802 * OsmoPCU (VTY): cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
803 *
804 * NOTE: the ranges are intentionally overlapping because OsmoPCU
805 * does not change CS/MCS on the range borders (5-6, 7-8, 12-13). */
806private template integer CS1_lqual_dB_range := (-infinity .. 6);
807private template integer CS2_lqual_dB_range := (5 .. 8);
808private template integer CS3_lqual_dB_range := (7 .. 13);
809private template integer CS4_lqual_dB_range := (12 .. infinity);
810
811testcase TC_cs_lqual_ul_tbf() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200812 var RlcmacDlBlock dl_block;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200813 var GprsMS ms;
814 var uint32_t unused_fn, sched_fn;
815 var uint4_t cv;
816
817 /* Initialize GPRS MS side */
818 f_init_gprs_ms();
819 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200820
821 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100822 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200823
824 f_pcuvty_set_allowed_cs_mcs();
825 f_pcuvty_set_link_quality_ranges();
826
827 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200828 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200829
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200830
831 /* The actual / old link quality values. We need to keep track of the old
832 * (basically previous) link quality value, because OsmoPCU actually
833 * changes the coding scheme if not only the actual, but also the old
834 * value leaves the current link quality range (window). */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200835 var integer lqual_old;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200836 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200837
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200838 /* Send one UL block (with TLLI since we are in One-Phase Access
839 contention resoultion) and make sure it is ACKED fine. */
840 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
841 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200842 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200843 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
844 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
845 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200846
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200847 /* 16 UL blocks (0 .. 15 dB, step = 1 cB) */
848 for (var integer i := 150; i >= 0; i := i - 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200849 /* Update the old / actual link quality */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200850 lqual_old := ms.lqual_cb;
851 ms.lqual_cb := 150 - i;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200852
853 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200854 log("Sending DATA.ind with link quality (dB): ", ms.lqual_cb);
855 if (i > g_bs_cv_max) {
856 cv := 15;
857 } else {
858 cv := i;
859 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200860
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200861 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := cv)
862
863 /* we will receive UL ACK/NACK from time to time. In that case, check CdCofing increases */
864 f_rx_rlcmac_dl_block(dl_block, unused_fn);
865 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
866 continue;
867 }
868 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
869 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
870 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
871 f_shutdown(__BFILE__, __LINE__);
872 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200873
874 log("Rx Packet Uplink ACK / NACK with Channel Coding Command: ",
875 dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd);
876
877 /* Match the received Channel Coding Command. Since we are increasing
878 * the link quality value on each iteration and not decreasing, there
879 * is no need to check the both old and current link quality values. */
880 var template ChCodingCommand ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200881 select (lqual_old / 10) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200882 case (CS1_lqual_dB_range) { ch_coding := CH_CODING_CS1; }
883 case (CS2_lqual_dB_range) { ch_coding := CH_CODING_CS2; }
884 case (CS3_lqual_dB_range) { ch_coding := CH_CODING_CS3; }
885 case (CS4_lqual_dB_range) { ch_coding := CH_CODING_CS4; }
886 }
887
888 if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {
889 setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200890 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200891 }
892 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700893
894 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200895}
896
897/* Test the max UL CS set by VTY works fine */
898testcase TC_cs_initial_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200899 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200900 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200901 var uint32_t unused_fn, sched_fn;
902 var GprsMS ms;
903
904 /* Initialize GPRS MS side */
905 f_init_gprs_ms();
906 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200907
908 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100909 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200910
911 /* Set initial UL CS to 3 */
912 g_cs_initial_ul := 3;
913 f_pcuvty_set_allowed_cs_mcs();
914 f_pcuvty_set_link_quality_ranges();
915
916 /* Take lqual (dB->cB) so that we stay in that CS */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200917 ms.lqual_cb := g_cs_lqual_ranges[2].low * 10;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200918
919 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200920 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200921
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200922 /* Send one UL block (with TLLI since we are in One-Phase Access
923 contention resoultion) and make sure it is ACKED fine. */
924 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
925 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200926 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200927 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
928 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
929 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200930
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200931 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
932 while (true) {
933 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
934 f_rx_rlcmac_dl_block(dl_block, unused_fn);
935 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
936 continue;
937 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200938
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200939 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
940 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
941 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
942 f_shutdown(__BFILE__, __LINE__);
943 break;
944 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200945
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200946 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200947 break;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200948 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200949 if (last_ch_coding != CH_CODING_CS3) {
950 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200951 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200952 }
953
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200954 /* Remaining UL blocks are used to make sure regardless of initial
955 /* lqual, we can go lower at any time */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200956 /* 0 dB, make sure we downgrade CS */
957 ms.lqual_cb := 0;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200958 /* 5 UL blocks, check we are in same initial CS: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200959 f_ms_tx_ul_data_block_multi(ms, 5);
960 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
961 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
962 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200963
964 if (last_ch_coding != CH_CODING_CS1) {
965 setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +0200966 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200967 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +0700968
969 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200970}
971
972/* Test the max UL CS set by VTY works fine */
973testcase TC_cs_max_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200974 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200975 var ChCodingCommand last_ch_coding;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200976 var uint32_t unused_fn, sched_fn;
977 var GprsMS ms;
978
979 /* Initialize GPRS MS side */
980 f_init_gprs_ms();
981 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200982
983 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +0100984 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200985
986 /* Set maximum allowed UL CS to 3 */
987 g_cs_max_ul := 3;
988 f_pcuvty_set_allowed_cs_mcs();
989 f_pcuvty_set_link_quality_ranges();
990
991 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200992 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +0200993
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200994 /* Send one UL block (with TLLI since we are in One-Phase Access
995 contention resoultion) and make sure it is ACKED fine. */
996 /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
997 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +0200998 f_ms_tx_ul_data_block(ms, f_rnd_octstring(16), cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +0200999 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
1000 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
1001 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001002
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001003 ms.lqual_cb := 40*10; /* 40 dB */
1004 f_ms_tx_ul_data_block_multi(ms, 16);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001005
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001006 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1007 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001008
1009 if (last_ch_coding != CH_CODING_CS3) {
1010 setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);
Pau Espin Pedrol1617e312020-05-22 14:41:14 +02001011 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001012 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001013
1014 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001015}
1016
Pau Espin Pedrol75122592020-11-03 15:22:59 +01001017/* Test the initial DL CS set by VTY works fine */
1018testcase TC_cs_initial_dl() runs on RAW_PCU_Test_CT {
1019 var octetstring data := f_rnd_octstring(10);
1020 var CodingScheme exp_dl_cs_mcs;
1021 var RlcmacDlBlock dl_block;
1022 var uint32_t poll_fn;
1023 var GprsMS ms;
1024
1025 /* Initialize NS/BSSGP side */
1026 f_init_bssgp();
1027 /* Initialize GPRS MS side */
1028 f_init_gprs_ms();
1029 ms := g_ms[0]; /* We only use first MS in this test */
1030
1031 /* Initialize the PCU interface abstraction */
1032 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1033
1034 /* Set initial allowed DL CS to 3 */
1035 g_cs_initial_dl := 3;
1036 exp_dl_cs_mcs := CS_3;
1037 /* Set maximum allowed UL CS to 4 */
1038 g_cs_max_dl := 4;
1039 f_pcuvty_set_allowed_cs_mcs();
1040 f_pcuvty_set_link_quality_ranges();
1041
1042 /* Establish BSSGP connection to the PCU */
1043 f_bssgp_establish();
1044 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1045
1046 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1047 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1048 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1049
1050 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1051 f_sleep(X2002);
1052 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1053
1054 /* ACK the DL block */
1055 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1056 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1057 f_dl_block_ack_fn(dl_block, poll_fn));
1058
1059 f_shutdown(__BFILE__, __LINE__, final := true);
1060}
1061
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001062/* Verify scheduling of multiple Downlink data blocks, enough to reach CS4 */
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001063function f_dl_data_exp_cs(template (present) CodingScheme exp_final_cs := ?, template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001064 var octetstring data := f_rnd_octstring(1400);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001065 var RlcmacDlBlock prev_dl_block, dl_block;
1066 var uint32_t ack_fn;
1067 var uint32_t fn;
1068 var GprsMS ms;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001069 var integer tx_data_remain := 10;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001070 var integer bsn := 0;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001071 var boolean using_egprs := f_rlcmac_cs_mcs_is_mcs(valueof(exp_final_cs));
1072 var integer bsn_mod;
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01001073 var template (present) CodingScheme exp_tmp_csmcs;
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001074
1075 if (using_egprs) {
1076 exp_tmp_csmcs := mcs_egprs_any;
1077 bsn_mod := 2048;
1078 } else {
1079 exp_tmp_csmcs := cs_gprs_any;
1080 bsn_mod := 128;
1081 }
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001082
1083 /* Establish BSSGP connection to the PCU */
1084 f_bssgp_establish();
1085
1086 ms := g_ms[0]; /* We only use first MS in this test */
1087 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1088
1089 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001090 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001091 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1092
1093 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
1094 f_sleep(X2002);
1095
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001096 for (var integer i := 0; i < 800; i := i + 1) {
1097 bsn := i mod bsn_mod;
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001098 f_rx_rlcmac_dl_block(dl_block, fn);
1099
1100 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
1101 /* No more data to receive, done */
1102 break;
1103 }
1104
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001105 f_rlcmac_dl_block_exp_data(dl_block, ?, bsn, exp_tmp_csmcs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001106
1107 /* Keep Ack/Nack description updated */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001108 f_dltbf_ack_block(ms.dl_tbf, dl_block);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001109
1110 /* TDMA frame number on which we are supposed to send the ACK */
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001111 if (f_dl_block_rrbp_valid(dl_block)) {
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001112 ack_fn := f_dl_block_ack_fn(dl_block, fn);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001113 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, using_egprs), ack_fn);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001114 if (tx_data_remain != 0) {
1115 /* Submit more data from time to time to keep the TBF ongoing */
1116 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1117 tx_data_remain := tx_data_remain - 1;
1118 }
1119 }
1120 prev_dl_block := dl_block;
1121 }
1122
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001123 bsn := (bsn + (bsn_mod-1)) mod bsn_mod; /* previous bsn: bsn -1 */
1124 f_rlcmac_dl_block_exp_data(prev_dl_block, ?, bsn, exp_final_cs);
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01001125
1126
1127 f_shutdown(__BFILE__, __LINE__, final := true);
1128}
1129
1130/* Verify DL CS above "cs max" set by VTY is never used */
1131testcase TC_cs_max_dl() runs on RAW_PCU_Test_CT {
1132 /* Initialize NS/BSSGP side */
1133 f_init_bssgp();
1134 /* Initialize GPRS MS side */
1135 f_init_gprs_ms();
1136
1137 /* Initialize the PCU interface abstraction */
1138 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1139
1140 /* Set maximum allowed DL CS to 3 */
1141 g_cs_initial_dl := 1;
1142 g_cs_max_dl := 3;
1143 f_pcuvty_set_allowed_cs_mcs();
1144 f_pcuvty_set_link_quality_ranges();
1145
1146 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1147}
1148
1149/* Check DL CS4 is used in good link conditions if allowed by config */
1150testcase TC_dl_cs1_to_cs4() runs on RAW_PCU_Test_CT {
1151 /* Initialize NS/BSSGP side */
1152 f_init_bssgp();
1153 /* Initialize GPRS MS side */
1154 f_init_gprs_ms();
1155
1156 /* Initialize the PCU interface abstraction */
1157 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1158
1159 /* Set initial DL CS to 1 & maximum allowed DL CS to 4 */
1160 g_cs_initial_dl := 1;
1161 g_cs_max_dl := 4;
1162 f_pcuvty_set_allowed_cs_mcs();
1163 f_pcuvty_set_link_quality_ranges();
1164
1165 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_cs_max_dl, false));
1166}
1167
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001168/* Test the initial UL MCS set by VTY works fine */
1169testcase TC_mcs_initial_ul() runs on RAW_PCU_Test_CT {
1170 var RlcmacDlBlock dl_block;
1171 var PollFnCtx pollctx;
1172 var EgprsChCodingCommand last_ch_coding;
1173 var uint32_t unused_fn, sched_fn;
1174 var GprsMS ms;
1175 var CodingScheme exp_ul_mcs;
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001176
1177 /* Initialize GPRS MS side */
1178 f_init_gprs_ms();
1179 ms := g_ms[0]; /* We only use first MS in this test */
1180
1181 /* Initialize the PCU interface abstraction */
1182 f_init_raw(testcasename());
1183
1184 /* Set initial UL MCS to 3 */
1185 g_mcs_initial_ul := 3;
1186 exp_ul_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, true);
1187 f_pcuvty_set_allowed_cs_mcs();
1188 f_pcuvty_set_link_quality_ranges();
1189
1190 /* Take lqual (dB->cB) so that we stay in that MCS */
1191 ms.lqual_cb := g_mcs_lqual_ranges[2].low * 10;
1192
1193 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001194 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_egprs_def));
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01001195
1196 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_mcs)) {
1197 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_mcs);
1198 f_shutdown(__BFILE__, __LINE__);
1199 }
1200
1201 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1202 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1203
1204 /* Send UL blocks, until we receive UL ACK/NACK and check we are in same initial CS: */
1205 while (true) {
1206 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15);
1207 f_rx_rlcmac_dl_block(dl_block, unused_fn);
1208 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
1209 continue;
1210 }
1211
1212 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
1213 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
1214 f_shutdown(__BFILE__, __LINE__);
1215 break;
1216 }
1217
1218 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1219 break;
1220 }
1221 if (f_rlcmac_block_EgprsChCodingCommand2cs_mcs(last_ch_coding) != exp_ul_mcs) {
1222 setverdict(fail, "Channel Coding does not match our expectations ", exp_ul_mcs, ": ", last_ch_coding);
1223 f_shutdown(__BFILE__, __LINE__);
1224 }
1225
1226 /* Remaining UL blocks are used to make sure regardless of initial
1227 * lqual, we can go lower at any time
1228 * 0 dB, make sure we downgrade MCS */
1229 ms.lqual_cb := 0;
1230 /* 5 UL blocks, check we are in same initial MCS: */
1231 f_ms_tx_ul_data_block_multi(ms, 5);
1232 /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */
1233 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1234 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1235
1236 if (last_ch_coding != CH_CODING_MCS1) {
1237 setverdict(fail, "Channel Coding does not match our expectations (MCS-1): ", last_ch_coding);
1238 f_shutdown(__BFILE__, __LINE__);
1239 }
1240
1241 f_shutdown(__BFILE__, __LINE__, final := true);
1242}
1243
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001244/* Test the maximum UL MCS set by VTY works fine */
1245testcase TC_mcs_max_ul() runs on RAW_PCU_Test_CT {
1246 var RlcmacDlBlock dl_block;
1247 var EgprsChCodingCommand last_ch_coding;
1248 var PollFnCtx pollctx;
1249 var uint32_t unused_fn, sched_fn;
1250 var GprsMS ms;
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001251
1252 /* Initialize GPRS MS side */
1253 f_init_gprs_ms();
1254 ms := g_ms[0]; /* We only use first MS in this test */
1255
1256 /* Initialize the PCU interface abstraction */
1257 f_init_raw(testcasename());
1258
1259 /* Set maximum allowed UL MCS to 5 */
1260 g_mcs_max_ul := 5;
1261 f_pcuvty_set_allowed_cs_mcs();
1262 f_pcuvty_set_link_quality_ranges();
1263
1264 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001265 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_egprs_def));
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01001266 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
1267 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
1268
1269 ms.lqual_cb := 40*10; /* 40 dB */
1270 f_ms_tx_ul_data_block_multi(ms, 16);
1271
1272 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
1273 last_ch_coding := dl_block.ctrl.payload.u.ul_ack_nack.egprs.ch_coding_cmd;
1274
1275 if (last_ch_coding != CH_CODING_MCS5) {
1276 setverdict(fail, "Channel Coding does not match our expectations (MCS-5): ", last_ch_coding);
1277 f_shutdown(__BFILE__, __LINE__);
1278 }
1279
1280 f_shutdown(__BFILE__, __LINE__, final := true);
1281}
1282
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001283/* Test the initial DL CS set by VTY works fine */
1284testcase TC_mcs_initial_dl() runs on RAW_PCU_Test_CT {
1285 var octetstring data := f_rnd_octstring(10);
1286 var CodingScheme exp_dl_cs_mcs;
1287 var RlcmacDlBlock dl_block;
1288 var uint32_t poll_fn;
1289 var GprsMS ms;
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001290
1291 /* Initialize NS/BSSGP side */
1292 f_init_bssgp();
1293 /* Initialize GPRS MS side */
1294 f_init_gprs_ms();
1295 ms := g_ms[0]; /* We only use first MS in this test */
1296
1297 /* Initialize the PCU interface abstraction */
1298 f_init_raw(testcasename());
1299
1300 /* Set initial allowed DL MCS to 3 */
1301 g_mcs_initial_dl := 3;
1302 exp_dl_cs_mcs := MCS_3;
1303 /* Set maximum allowed DL MCS to 4 */
1304 g_mcs_max_dl := 4;
1305 f_pcuvty_set_allowed_cs_mcs();
1306 f_pcuvty_set_link_quality_ranges();
1307
1308 /* Establish BSSGP connection to the PCU */
1309 f_bssgp_establish();
1310 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1311
1312 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001313 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs_def));
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001314 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1315
1316 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1317 f_sleep(X2002);
1318 f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
1319
1320 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01001321 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
1322 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, ischosen(dl_block.data_egprs)),
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01001323 f_dl_block_ack_fn(dl_block, poll_fn));
1324
1325 f_shutdown(__BFILE__, __LINE__, final := true);
1326}
1327
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001328/* Verify DL MCS above "mcs max" set by VTY is never used */
1329testcase TC_mcs_max_dl() runs on RAW_PCU_Test_CT {
1330 /* Initialize NS/BSSGP side */
1331 f_init_bssgp();
1332 /* Initialize GPRS MS side */
1333 f_init_gprs_ms();
1334
1335 /* Initialize the PCU interface abstraction */
1336 f_init_raw(testcasename());
1337
1338 /* Set maximum allowed DL CS to 3 */
1339 g_mcs_initial_dl := 1;
1340 g_mcs_max_dl := 3;
1341 f_pcuvty_set_allowed_cs_mcs();
1342 f_pcuvty_set_link_quality_ranges();
1343
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01001344 f_dl_data_exp_cs(f_rlcmac_block_int2cs_mcs(g_mcs_max_dl, true), bssgp_ms_racap_egprs_def);
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01001345}
1346
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02001347/* Verify PCU drops TBF after some time of inactivity. */
1348testcase TC_t3141() runs on RAW_PCU_Test_CT {
1349 var PCUIF_info_ind info_ind;
1350 var template (value) TsTrxBtsNum nr;
1351 var BTS_PDTCH_Block data_msg;
1352 var GprsMS ms;
1353 var uint3_t rx_usf;
1354 timer T_3141 := 1.0;
1355 var boolean ul_tbf_usf_req := false;
1356
1357 /* Initialize NS/BSSGP side */
1358 f_init_bssgp();
1359 /* Initialize GPRS MS side */
1360 f_init_gprs_ms();
1361 ms := g_ms[0]; /* We only use first MS in this test */
1362
1363 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1364 /* Only use 1 PDCH to simplify test: */
1365 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
1366 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
1367 /* Initialize the PCU interface abstraction */
1368 f_init_raw(testcasename(), info_ind);
1369
1370 f_vty_config2(PCUVTY, {"pcu"}, "timer T3141 1");
1371
1372 /* Establish BSSGP connection to the PCU */
1373 f_bssgp_establish();
1374 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1375
1376 /* Establish a one-phase access Uplink TBF */
1377 f_ms_establish_ul_tbf(ms);
1378
1379 T_3141.start;
1380
1381 /* Now we wait for PCU to transmit our USF */
1382 nr := ts_TsTrxBtsNum;
1383 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1384 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1385 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1386 block_nr := nr.blk_nr));
1387
1388 alt {
1389 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1390 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1391 ?)) -> value data_msg {
1392 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1393 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1394 f_shutdown(__BFILE__, __LINE__);
1395 }
1396
1397 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1398 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1399 /* PCU requests our USF, transmit WITHOUT tlli to avoid contention resolution success */
1400 ul_tbf_usf_req := true;
1401 f_ms_tx_ul_data_block(ms, f_rnd_octstring(10), cv := 15, with_tlli := false, fn := f_next_pdch_block(data_msg.raw.fn))
1402 } else if (rx_usf == USF_UNUSED) {
1403 if (data_msg.raw.fn >= ms.ul_tbf.start_time_fn) {
1404 if (ul_tbf_usf_req) {
1405 /* TBF was dropped by T3141, success */
1406 setverdict(pass);
1407 break;
1408 } else {
1409 log("PCU never requested USF, unexpected");
1410 f_shutdown(__BFILE__, __LINE__);
1411 }
1412 } /* else: Keep waiting for TBF to be active by network */
1413 } else {
1414 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1415 f_shutdown(__BFILE__, __LINE__);
1416 }
1417
1418 /* Make sure we don't receive a Ul ACK/NACK with TLLI set: */
1419 if (match(data_msg.dl_block,
1420 tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
1421 tr_UlAckNackGprs(tlli := ?,
1422 acknack_desc := ?,
1423 rel99 := *))))
1424 {
1425 log("Received UL ACK/NACK with TLLI set");
1426 f_shutdown(__BFILE__, __LINE__);
1427 }
1428
1429 nr := ts_TsTrxBtsNum;
1430 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1431 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1432 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1433 block_nr := nr.blk_nr));
1434 repeat;
1435 }
1436 [] T_3141.timeout {
1437 log("T_3141 expired but TBF is still active, unexpected");
1438 f_shutdown(__BFILE__, __LINE__);
1439 }
1440 [] BTS.receive {
1441 /* We should never receive non-dummy messages, aka UL ACK/NACK,
1442 * because we never sent the TLLI to the PCU */
1443 setverdict(fail, "Unexpected BTS message");
1444 f_shutdown(__BFILE__, __LINE__);
1445 }
1446 }
1447
1448 f_shutdown(__BFILE__, __LINE__, final := true);
1449}
1450
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001451/* Validate what happens when RACH to get UL TBF and then PCU receives no UL
1452 * data. It should end up in N3101 reaching N3101_MAX and finally triggering
1453 * T3169. See OS#5033 */
1454testcase TC_n3101_max_t3169() runs on RAW_PCU_Test_CT {
1455 var PCUIF_info_ind info_ind;
1456 var template (value) TsTrxBtsNum nr;
1457 var BTS_PDTCH_Block data_msg;
1458 var GprsMS ms;
1459 var uint3_t rx_usf;
1460 const integer N3101_MAX := 9; /* N3101 shall be greater than 8 */
1461 var integer n3101 := 0;
1462 timer T_3169 := 1.0;
1463
1464 /* Initialize NS/BSSGP side */
1465 f_init_bssgp();
1466 /* Initialize GPRS MS side */
1467 f_init_gprs_ms();
1468 ms := g_ms[0]; /* We only use first MS in this test */
1469
1470 /* Initialize the PCU interface abstraction */
1471 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1472 info_ind.n3101 := N3101_MAX;
1473 info_ind.t3169 := 1;
1474 f_init_raw(testcasename(), info_ind);
1475
1476 /* Establish BSSGP connection to the PCU */
1477 f_bssgp_establish();
1478 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1479
1480 /* Establish UL TBF */
1481 f_ms_establish_ul_tbf(ms);
1482
1483 /* Now we wait for PCU to transmit our USF */
1484 nr := ts_TsTrxBtsNum;
1485 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1486 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1487 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1488 block_nr := nr.blk_nr));
1489
1490 alt {
1491 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1492 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1493 ?)) -> value data_msg {
1494 if (ms.ul_tbf.usf[valueof(nr.ts_nr)] == USF_UNUSED) {
1495 setverdict(fail, "Unexpected ts_nr ", valueof(nr.ts_nr), " without USF allocated");
1496 f_shutdown(__BFILE__, __LINE__);
1497 }
1498
1499 rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
1500 if (rx_usf == ms.ul_tbf.usf[valueof(nr.ts_nr)]) {
1501 log("PCU requests our USF ", rx_usf, ", n3101=", n3101);
1502 n3101 := n3101 + 1;
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001503 if (n3101 > N3101_MAX + 1) { //+1: DL<->UL FN offset
1504 setverdict(fail, "Reached ", n3101, " > ", N3101_MAX + 1, " (N3101_MAX+1) and PCU still sends us USFs");
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001505 f_shutdown(__BFILE__, __LINE__);
1506 }
Pau Espin Pedrol73c5d372021-03-24 18:48:24 +01001507 } else if (rx_usf == USF_UNUSED and n3101 == N3101_MAX + 1) {
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01001508 /* If we already received USFs for us and we don't receive them anymore, that means the TBF entered T3169 */
1509 log("PCU stopped requesting USF ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1510 if (not T_3169.running) {
1511 log("T3169 started");
1512 T_3169.start;
1513 }
1514 } else if(rx_usf == USF_UNUSED and n3101 > 0) {
1515 setverdict(fail, "PCU stopped requesting USFs too early: ", n3101, " < ", N3101_MAX, " (N3101_MAX)");
1516 f_shutdown(__BFILE__, __LINE__);
1517 } else {
1518 log("PCU requests ", rx_usf, ", we have ", ms.ul_tbf.usf[valueof(nr.ts_nr)]);
1519 }
1520 nr := ts_TsTrxBtsNum;
1521 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1522 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1523 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1524 block_nr := nr.blk_nr));
1525 repeat;
1526 }
1527 [] T_3169.timeout {
1528 log("T_3169 expired");
1529 /* Done in alt */
1530 }
1531 [] BTS.receive {
1532 setverdict(fail, "Unexpected BTS message");
1533 f_shutdown(__BFILE__, __LINE__);
1534 }
1535 }
1536
1537 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1538 /* USFs as per previous TBF since they were freed at expiration time: */
1539 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1540 var uint5_t old_tfi := ms.ul_tbf.tfi;
1541 f_ms_establish_ul_tbf(ms);
1542 if (old_tfi != ms.ul_tbf.tfi) {
1543 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1544 f_shutdown(__BFILE__, __LINE__);
1545 }
1546 for (var integer i := 0; i < 8; i := i +1) {
1547 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1548 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1549 f_shutdown(__BFILE__, __LINE__);
1550 }
1551 }
1552
1553 f_shutdown(__BFILE__, __LINE__, final := true);
1554}
1555
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001556
1557/* Verify after N3103_MAX is reached, T3169 is started and upon timeout TBF is
1558 freed and no longer available. Trigger it by sending a few UL blocks CTRL ACKING
1559 the final UL ACK sent at us. */
1560testcase TC_n3103_max_t3169() runs on RAW_PCU_Test_CT {
1561 var PCUIF_info_ind info_ind;
1562 var BTS_PDTCH_Block data_msg;
1563 var RlcmacDlBlock dl_block;
1564 var uint32_t sched_fn;
1565 var template (value) TsTrxBtsNum nr;
1566 var template RlcmacDlBlock exp_ul_ack;
1567 var template UlAckNackGprs exp_ul_ack_sub;
1568 var GprsMS ms;
1569 const integer N3103_MAX := 2; /* N3103 is usually somewhere 2-5 */
1570 var integer N3103 := 0;
1571 timer T_3169 := 1.0;
1572
1573 /* Initialize GPRS MS side */
1574 f_init_gprs_ms();
1575 ms := g_ms[0]; /* We only use first MS in this test */
1576
1577 /* Initialize the PCU interface abstraction */
1578 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1579 info_ind.n3103 := N3103_MAX;
1580 info_ind.t3169 := 1;
1581 f_init_raw(testcasename(), info_ind);
1582
1583 /* Establish an Uplink TBF */
1584 f_ms_establish_ul_tbf(ms);
1585
Pau Espin Pedrol93ae4522021-05-11 15:58:26 +02001586 f_ms_tx_ul_data_block_multi(ms, 5, with_tlli := true);
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02001587 exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *);
1588 exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub);
1589
1590 nr := ts_TsTrxBtsNum;
1591 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1592 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1593 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1594 block_nr := nr.blk_nr));
1595 alt {
1596 [N3103 < N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1597 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1598 exp_ul_ack)) -> value data_msg {
1599 if (not f_dl_block_rrbp_valid(data_msg.dl_block)) {
1600 setverdict(fail, "Unexpected DL BLOCK has no RRBP: ", data_msg.dl_block);
1601 f_shutdown(__BFILE__, __LINE__);
1602 }
1603
1604 nr := ts_TsTrxBtsNum;
1605 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1606 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1607 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1608 block_nr := nr.blk_nr));
1609 N3103 := N3103 + 1;
1610 if (N3103 == N3103_MAX) {
1611 /* At this point in time (N3103_MAX reached), PCU is
1612 * moving the TBF to RELEASE state so no data/ctrl for
1613 * it is tx'ed, hence the dummy blocks: */
1614 T_3169.start;
1615 }
1616 repeat;
1617 }
1618 [N3103 >= N3103_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1619 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1620 exp_ul_ack)) -> value data_msg {
1621 setverdict(fail, "Unexpected UL ACK/NACK after reaching N3103_MAX");
1622 f_shutdown(__BFILE__, __LINE__);
1623 }
1624 [] as_ms_rx_ignore_dummy(ms, nr);
1625 [T_3169.running] T_3169.timeout {
1626 log("T_3169 timeout");
1627 /* Done in alt, wait for pending RTS initiated previously in
1628 * above case before continuing (expect /* Dummy block): */
1629 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1630 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1631 tr_RLCMAC_DUMMY_CTRL));
1632 }
1633 [] BTS.receive {
1634 setverdict(fail, "Unexpected BTS message");
1635 f_shutdown(__BFILE__, __LINE__);
1636 }
1637 }
1638
1639 /* Now that T3169 has expired, establishing a Ul TBF should provide same
1640 * USFs as per previous TBF since they were freed at expiration time: */
1641 var uint3_t old_usf[8] := ms.ul_tbf.usf;
1642 var uint5_t old_tfi := ms.ul_tbf.tfi;
1643 f_ms_establish_ul_tbf(ms);
1644 if (old_tfi != ms.ul_tbf.tfi) {
1645 setverdict(fail, "Unexpected TFI change: ", ms.ul_tbf.tfi, " vs exp ", old_tfi);
1646 f_shutdown(__BFILE__, __LINE__);
1647 }
1648 for (var integer i := 0; i < 8; i := i +1) {
1649 if (ms.ul_tbf.usf[i] != old_usf[i]) {
1650 setverdict(fail, "Unexpected USF change: ", ms.ul_tbf.usf[i], " vs exp ", old_usf[i]);
1651 f_shutdown(__BFILE__, __LINE__);
1652 }
1653 }
1654
1655 f_shutdown(__BFILE__, __LINE__, final := true);
1656}
1657
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01001658/* Verify that a Downlink TBF is kept available until T3191 fires, at which
1659 * point the TBF is no longer available. In order to get to start of T3191, we
1660 * have to wait for x2031 since that marks the IDLE TBF time, that is, the delay
1661 * until TBF release procedure starts after draining DL queue. */
1662testcase TC_x2031_t3191() runs on RAW_PCU_Test_CT {
1663 var PCUIF_info_ind info_ind;
1664 var RlcmacDlBlock dl_block;
1665 var octetstring data1 := f_rnd_octstring(200);
1666 var octetstring data2 := f_rnd_octstring(10);
1667 var uint32_t dl_fn;
1668 var template (value) TsTrxBtsNum nr;
1669 var BTS_PDTCH_Block data_msg;
1670 var GprsMS ms;
1671
1672 /* Initialize NS/BSSGP side */
1673 f_init_bssgp();
1674 /* Initialize GPRS MS side */
1675 f_init_gprs_ms();
1676 ms := g_ms[0]; /* We only use first MS in this test */
1677
1678 /* Initialize the PCU interface abstraction */
1679 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1680 /* Set timer to 1 sec (default 5) to speedup test: */
1681 info_ind.t3191 := 1;
1682 f_init_raw(testcasename(), info_ind);
1683
1684 /* Establish BSSGP connection to the PCU */
1685 f_bssgp_establish();
1686 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1687
1688 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1689 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1690 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1691
1692 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1693 f_sleep(X2002);
1694
1695 while (true) {
1696 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1697
1698 /* Keep Ack/Nack description updated (except for last BSN) */
1699 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1700
1701 if (f_dl_block_rrbp_valid(dl_block)) {
1702 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1703 f_dl_block_ack_fn(dl_block, dl_fn));
1704 break;
1705 }
1706 }
1707
1708 /* Now we wait for IDLE TBF timer (X2031) to time out and receive a FINAL ACK */
1709 nr := ts_TsTrxBtsNum;
1710 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1711 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1712 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1713 block_nr := nr.blk_nr));
1714 alt {
1715 [] as_ms_rx_ignore_dummy(ms, nr);
1716 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1717 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1718 ?)) -> value data_msg {
1719 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
1720 log("Received FINAL_ACK");
1721 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1722 break;
1723 }
1724 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1725 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1726 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1727 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
1728 }
1729 nr := ts_TsTrxBtsNum;
1730 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1731 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1732 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1733 block_nr := nr.blk_nr));
1734 repeat;
1735 }
1736 [] BTS.receive {
1737 setverdict(fail, "Unexpected BTS message");
1738 f_shutdown(__BFILE__, __LINE__);
1739 }
1740 }
1741
1742 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1743 to time out. We simply sleep instead of requesting blocks because
1744 otherwise retransmissions would keep restarting the timer. */
1745 f_sleep(int2float(info_ind.t3191));
1746
1747 /* The TBF should be freed now, so new data should trigger an Assignment: */
1748 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1749 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1750
1751 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1752 f_sleep(X2002);
1753 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1754 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1755 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1756 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1757 f_dl_block_ack_fn(dl_block, dl_fn));
1758
1759 f_shutdown(__BFILE__, __LINE__, final := true);
1760}
1761
1762/* Same as TC_zero_x2031_t3191, but this time without x2031 (immediate FINAL_ACK). */
1763testcase TC_zero_x2031_t3191() runs on RAW_PCU_Test_CT {
1764 var PCUIF_info_ind info_ind;
1765 var RlcmacDlBlock dl_block;
1766 var octetstring data1 := f_rnd_octstring(1400);
1767 var octetstring data2 := f_rnd_octstring(10);
1768 var uint32_t dl_fn;
1769 var GprsMS ms;
1770
1771 /* Initialize NS/BSSGP side */
1772 f_init_bssgp();
1773 /* Initialize GPRS MS side */
1774 f_init_gprs_ms();
1775 ms := g_ms[0]; /* We only use first MS in this test */
1776
1777 /* Initialize the PCU interface abstraction */
1778 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1779 /* Set timer to 1 sec (default 5) to speedup test: */
1780 info_ind.t3191 := 1;
1781 f_init_raw(testcasename(), info_ind);
1782
1783 f_vty_config2(PCUVTY, {"pcu"}, "timer X2031 0");
1784
1785 /* Establish BSSGP connection to the PCU */
1786 f_bssgp_establish();
1787 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1788
1789 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1790 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1791 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1792
1793 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1794 f_sleep(X2002);
1795
1796 /* Send enough DL data to at least be able to DL ACK once (excl the
1797 * FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
1798 * other code paths like trying to Imm Assign on CCCH again, etc.. */
1799 while (true) {
1800 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
1801
1802 if (dl_block.data.mac_hdr.hdr_ext.fbi) {
1803 log("Received FINAL_ACK");
1804 ms.dl_tbf.acknack_desc.final_ack := '1'B;
1805 break;
1806 }
1807
1808 /* Keep Ack/Nack description updated (except for last BSN) */
1809 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
1810
1811 if (f_dl_block_rrbp_valid(dl_block)) {
1812 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1813 f_dl_block_ack_fn(dl_block, dl_fn));
1814 }
1815 }
1816
1817 /* Avoid ACKing the last RLC data block on purpose here, wait for t3191
1818 to time out. We simply sleep instead of requesting blocks because
1819 otherwise retransmissions would keep restarting the timer. */
1820 f_sleep(int2float(info_ind.t3191));
1821
1822 /* The TBF should be freed now, so new data should trigger an Assignment: */
1823 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
1824 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1825
1826 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1827 f_sleep(X2002);
1828 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
1829 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
1830 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1831 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1832 f_dl_block_ack_fn(dl_block, dl_fn));
1833
1834 f_shutdown(__BFILE__, __LINE__, final := true);
1835}
1836
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001837/* Verify that a Downlink TBF can be assigned using PACCH shortly after the
1838 * release of prev DL TBF due to MS staying in PDCH for a while (T3192, in PCU
1839 * T3193) after DL TBF release */
1840testcase TC_t3193() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001841 var RlcmacDlBlock dl_block;
1842 var octetstring data := f_rnd_octstring(10);
1843 var boolean ok;
1844 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001845 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001846 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001847 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
1848
1849 /* Initialize NS/BSSGP side */
1850 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001851 /* Initialize GPRS MS side */
1852 f_init_gprs_ms();
1853 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001854
1855 /* Initialize the PCU interface abstraction */
1856 f_init_raw(testcasename());
1857
1858 /* Establish BSSGP connection to the PCU */
1859 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01001860 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001861
1862 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001863 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
1864 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07001865
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001866 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1867 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001868 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001869
1870 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001871 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1872 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1873 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001874
1875 /* Now that final DL block is ACKED and TBF is released, T3193 in PCU
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001876 (T3192 in MS) was started and until it fires the MS will be available
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001877 on PDCH in case new data arrives from SGSN. Let's verify it: */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001878 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07001879 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001880
1881 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001882
1883 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07001884 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02001885 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
1886 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1887 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07001888
1889 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02001890}
1891
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001892/* Verify after N3105_MAX is reached, T3195 is started and upon timeout TBF is
1893 freed and no longer available. Trigger it by sending DL blocks and never DL
1894 ACKing the data (which are requested through RRBP) */
1895testcase TC_n3105_max_t3195() runs on RAW_PCU_Test_CT {
1896 var PCUIF_info_ind info_ind;
1897 var RlcmacDlBlock dl_block;
1898 var octetstring data1 := f_rnd_octstring(1000);
1899 var octetstring data2 := f_rnd_octstring(10);
1900 var uint32_t dl_fn;
1901 var template (value) TsTrxBtsNum nr;
1902 var BTS_PDTCH_Block data_msg;
1903 var GprsMS ms;
1904 const integer N3105_MAX := 2;
1905 var integer N3105 := 0;
1906 timer T_3195 := 1.0;
1907 var integer num_poll_recv := 0;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001908 var template RlcmacDlBlock dl_block_exp;
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001909
1910 /* Initialize NS/BSSGP side */
1911 f_init_bssgp();
1912 /* Initialize GPRS MS side */
1913 f_init_gprs_ms();
1914 ms := g_ms[0]; /* We only use first MS in this test */
1915
1916 /* Initialize the PCU interface abstraction */
1917 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
1918 /* Speedup test: */
1919 info_ind.n3105 := N3105_MAX;
1920 info_ind.t3195 := 1;
1921 f_init_raw(testcasename(), info_ind);
1922
1923 /* Disable "MS delay release" timer, to avoid old DL data kept in cached
1924 * MS and retransmitted after the TBF is released and later on created
1925 * (because the MS is reused) */
1926 f_vty_config2(PCUVTY, {"pcu"}, "timer X2030 0");
1927
1928 /* Establish BSSGP connection to the PCU */
1929 f_bssgp_establish();
1930 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
1931
1932 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
1933 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1934 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
1935
1936 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
1937 f_sleep(X2002);
1938
1939 /* Now we go on receiving DL data and not answering RRBP: */
1940 nr := ts_TsTrxBtsNum;
1941 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1942 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1943 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1944 block_nr := nr.blk_nr));
1945 alt {
1946 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1947 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1948 tr_RLCMAC_DATA)) -> value data_msg {
1949 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
1950 if (num_poll_recv == 0) {
1951 /* ACK first one so PCU detects we are there and doesn't retransmit Imm Ass */
1952 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
1953 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
1954 f_dl_block_ack_fn(data_msg.dl_block, data_msg.raw.fn));
1955 } else {
1956 log("Ignoring RRBP ", num_poll_recv);
1957 N3105 := N3105 + 1;
1958 }
1959 num_poll_recv := num_poll_recv + 1;
1960 }
1961
1962 nr := ts_TsTrxBtsNum;
1963 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1964 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1965 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1966 block_nr := nr.blk_nr));
1967 repeat;
1968 }
1969 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001970 * RELEASE state so no data for it is tx'ed, hence the dummy/idle blocks:
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01001971 */
1972 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1973 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1974 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
1975 if (not T_3195.running) {
1976 T_3195.start;
1977 /* We even send some new data, nothing should be sent to MS */
1978 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
1979 }
1980 nr := ts_TsTrxBtsNum;
1981 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1982 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1983 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1984 block_nr := nr.blk_nr));
1985 repeat;
1986 }
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02001987 [mp_osmo_pcu_newer_than_0_9_0 and N3105 == N3105_MAX]
1988 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
1989 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
1990 omit)) -> value data_msg {
1991 /* We may already receive idle blocks before our own TTCN3 timer
1992 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
1993 nr := ts_TsTrxBtsNum;
1994 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
1995 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
1996 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
1997 block_nr := nr.blk_nr));
1998 repeat;
1999 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002000 [T_3195.running] T_3195.timeout {
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002001 log("T_3195 timeout");
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002002 /* Done in alt, wait for pending RTS initiated previously in
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02002003 * above case before continuing (expect empty blocks on new
2004 * versions, Dummy block on older versions): */
2005 if (mp_osmo_pcu_newer_than_0_9_0) {
2006 dl_block_exp := omit;
2007 } else {
2008 dl_block_exp := tr_RLCMAC_DUMMY_CTRL;
2009 }
Pau Espin Pedrolbf8c71f2021-04-20 12:23:28 +02002010 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2011 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02002012 dl_block_exp));
2013 }
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01002014 [] BTS.receive {
2015 setverdict(fail, "Unexpected BTS message");
2016 f_shutdown(__BFILE__, __LINE__);
2017 }
2018 }
2019
2020 /* after T_3195 timeout, TBF is released */
2021 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data2));
2022 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2023
2024 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2025 f_sleep(X2002);
2026 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
2027
2028 /* ACK the DL block */
2029 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2030 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2031 f_dl_block_ack_fn(dl_block, dl_fn));
2032
2033 f_shutdown(__BFILE__, __LINE__, final := true);
2034}
2035
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002036/* Verify PCU handles correctly Countdown Procedure based on BS_CV_MAX */
2037testcase TC_countdown_procedure() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002038 var RlcmacDlBlock dl_block;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002039 var uint32_t sched_fn;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002040 var octetstring total_payload;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002041 var GprsMS ms;
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002042
2043 /* Initialize NS/BSSGP side */
2044 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002045 /* Initialize GPRS MS side */
2046 f_init_gprs_ms();
2047 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002048
2049 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002050 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002051
2052 /* Establish BSSGP connection to the PCU */
2053 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002054 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002055
2056 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002057 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002058
2059 /* Send one UL block (with TLLI since we are in One-Phase Access
2060 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002061 total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true));
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002062 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002063 f_ms_tx_ul_data_block(ms, total_payload, cv := 15, with_tlli := true, fn := ms.ul_tbf.start_time_fn)
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002064 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2065 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002066 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002067
2068 /* Send enough blocks to test whole procedure: Until Nth block
2069 (N=BS_CV_MAX), CV=15 is sent, and then the decreasing countdown value is sent.
2070 */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002071 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, 20);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002072 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2073 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002074 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002075
2076 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002077 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, total_payload));
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002078
2079 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02002080}
2081
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002082/* Verify PCU handles correctly CS1..4 with all possible LLC payload sizes fitting alone in one RLC block */
2083testcase TC_ul_all_sizes() runs on RAW_PCU_Test_CT {
2084 var RlcmacDlBlock dl_block;
2085 var uint32_t dl_fn, sched_fn;
2086 var octetstring payload;
2087 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002088 var template (value) LlcBlockHdr blk_hdr;
2089 var template (value) LlcBlocks blocks;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002090 var integer blk_len;
2091 var CodingScheme tx_cs;
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002092 var GprsMS ms;
2093
2094 /* Initialize NS/BSSGP side */
2095 f_init_bssgp();
2096 /* Initialize GPRS MS side */
2097 f_init_gprs_ms();
2098 ms := g_ms[0]; /* We only use first MS in this test */
2099
2100 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002101 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002102
2103 /* Establish BSSGP connection to the PCU */
2104 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002105 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002106
2107 /* Establish an Uplink TBF */
2108 f_ms_establish_ul_tbf(ms);
2109
2110 /* Send one UL block (with TLLI since we are in One-Phase Access
2111 contention resoultion) and make sure it is ACKED fine. */
2112 payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002113 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2114 more := false, e := true);
2115 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002116 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002117 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := ms.ul_tbf.tx_cs_mcs,
2118 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002119 cv := 15,
2120 bsn := ms.ul_tbf.bsn,
2121 blocks := blocks,
2122 tlli := ms.tlli);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002123 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002124 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002125
2126 /* ACK and check it was received fine */
2127 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2128 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2129 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2130 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002131 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, payload));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002132
2133 /* Test sending LLC PDUS of incrementing size */
2134 var integer max_size := 49;
2135 for (var integer i := 1; i <= max_size; i := i + 1) {
2136 var integer cv;
2137 /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */
2138 log("Sending DATA.ind with LLC payload size ", i);
2139 if (i < max_size - g_bs_cv_max) {
2140 cv := 15;
2141 } else {
2142 cv := max_size - i;
2143 }
2144
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002145 blk_len := 3 + 1 + i; /* 3 Header bytes + LI byte + payload length */
2146 tx_cs := f_rlcmac_block_len_required_cs_mcs(blk_len, false);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002147 payload := f_rnd_octstring(i);
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002148 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2149 more := false, e := true);
2150 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002151 /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002152 ul_data := t_RLCMAC_UL_DATA(cs := tx_cs,
2153 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002154 cv := cv,
2155 bsn := ms.ul_tbf.bsn,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002156 blocks := blocks);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002157 f_ultbf_inc_bsn(ms.ul_tbf);
2158 f_ms_tx_ul_block(ms, ul_data);
2159
2160 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002161 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, payload));
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002162
2163 /* we will receive UL ACK/NACK from time to time, handle it. */
2164 f_rx_rlcmac_dl_block(dl_block, dl_fn);
2165 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
2166 continue;
2167 }
2168 if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK_GPRS(ul_tfi := ?)) and
2169 not match(dl_block, tr_RLCMAC_UL_ACK_NACK_EGPRS(ul_tfi := ?))) {
2170 setverdict(fail, "Failed to match Packet Uplink ACK / NACK:", dl_block);
2171 f_shutdown(__BFILE__, __LINE__);
2172 }
2173
2174 log("Rx Packet Uplink ACK / NACK");
2175 sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);
2176 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2177 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2178 }
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002179
2180 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02002181}
2182
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002183function f_TC_ul_data_toolong_fills_padding_cs(inout GprsMS ms, CodingScheme cs, integer cv) runs on RAW_PCU_Test_CT {
2184 var octetstring payload;
2185 var template (value) RlcmacUlBlock ul_data;
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002186 var template (value) LlcBlockHdr blk_hdr;
2187 var template (value) LlcBlocks blocks;
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002188 var integer block_len, max_valid_data_len;
2189 timer T;
2190
2191 block_len := f_rlcmac_cs_mcs2block_len(cs);
2192 /* We need to send with TLLI since we are in One-Phase Access Contenion
2193 * resoultion), so that's -4 bytes of data, -3 for headers, -1 for LI
2194 * indicator, -1 for spare bits octet at the end */
2195 max_valid_data_len := block_len - 4 - 3 - 1 - 1;
2196 payload := f_rnd_octstring(max_valid_data_len + 1); /* +1 to write LLC data on last padding octet */
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002197 blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload),
2198 more := false, e := true);
2199 blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) };
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002200 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := cs,
2201 tfi := ms.ul_tbf.tfi,
Vadim Yanitskiyceb1f982020-10-17 15:58:19 +07002202 cv := cv,
2203 bsn := ms.ul_tbf.bsn,
2204 blocks := blocks,
2205 tlli := ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002206 f_ultbf_inc_bsn(ms.ul_tbf);
2207 f_ms_tx_data_ind(ms, enc_RlcmacUlBlock(valueof(ul_data)));
2208
2209 T.start(0.5);
2210 alt {
Harald Welte5339b2e2020-10-04 22:52:56 +02002211 [] BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, ?)) {
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002212 setverdict(fail, "LLC PDU in Malformed RLC block was forwarded");
2213 f_shutdown(__BFILE__, __LINE__);
2214 }
2215 [] T.timeout {
2216 setverdict(pass);
2217 }
2218 }
2219}
2220/* Verify PCU finds out incorrectly formated RLC block and discards it. This
2221 blocks intentionally contain last byte of data placed in last byte of RLC
2222 containing padding/spare bits, which is incorrect. Spare bits exist and are
2223 described for CS2..4 in 3GPP TS 44.060 Table 10.2.1: "RLC data block size,
2224 discounting padding in octet" */
2225testcase TC_ul_data_toolong_fills_padding() runs on RAW_PCU_Test_CT {
2226 var GprsMS ms;
2227 var integer block_len, max_valid_data_len;
2228
2229 /* Initialize NS/BSSGP side */
2230 f_init_bssgp();
2231 /* Initialize GPRS MS side */
2232 f_init_gprs_ms();
2233 ms := g_ms[0]; /* We only use first MS in this test */
2234
2235 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002236 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002237
2238 /* Establish BSSGP connection to the PCU */
2239 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002240 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002241
2242 /* Establish an Uplink TBF */
2243 f_ms_establish_ul_tbf(ms);
2244
2245 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2);
2246 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1);
2247 f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0);
2248
Vadim Yanitskiy8e6df0c2020-10-18 00:13:15 +07002249 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02002250}
2251
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002252/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2253 * answered, so TBFs for uplink and later for downlink are created.
2254 */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002255private function f_TC_mo_ping_pong_1phase_access(template (present) CodingScheme exp_cs_mcs := ?) runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002256 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002257 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002258 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002259 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002260 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002261
2262 /* Initialize NS/BSSGP side */
2263 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002264 /* Initialize GPRS MS side */
2265 f_init_gprs_ms();
2266 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002267
2268 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002269 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002270
2271 /* Establish BSSGP connection to the PCU */
2272 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002273 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002274
2275 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002276 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002277
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002278 /* Send one UL block (with TLLI since we are in One-Phase Access
2279 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002280 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002281 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2282 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002283 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002284
2285 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002286 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002287
2288 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002289 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2290 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002291
2292 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2293 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002294 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002295
2296 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002297 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2298 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2299 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002300
2301 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002302}
2303
2304/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2305 * answered, so TBFs for uplink and later for downlink are created.
2306 */
2307testcase TC_mo_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002308 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002309 f_TC_mo_ping_pong_1phase_access(exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002310}
2311
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002312/* Test scenario where MS wants to send some data on PDCH against SGSN and it is
2313 * answered, so TBFs for uplink and later for downlink are created.
2314 */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002315private function f_TC_mo_ping_pong_2phase_access(PCUIF_Flags ind_flags,
2316 template (value) MSRadioAccessCapabilityV ms_racap,
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002317 template (present) CodingScheme exp_ul_cs_mcs := ?,
2318 template (present) CodingScheme exp_dl_cs_mcs := ?)
2319runs on RAW_PCU_Test_CT {
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002320 var RlcmacDlBlock dl_block;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002321 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002322 var PollFnCtx pollctx;
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002323 var uint32_t sched_fn;
2324 var uint32_t dl_fn;
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002325 var uint32_t unused_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002326 var GprsMS ms;
2327
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002328 /* Initialize NS/BSSGP side */
2329 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002330 /* Initialize GPRS MS side */
2331 f_init_gprs_ms();
2332 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002333
2334 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002335 f_init_raw(testcasename(), ts_PCUIF_INFO_default(ind_flags));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002336
2337 /* Establish BSSGP connection to the PCU */
2338 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002339 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002340
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002341 /* Send PACKET RESOURCE REQUEST to upgrade to EGPRS */
2342 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002343
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002344 if (not match(ms.ul_tbf.tx_cs_mcs, exp_ul_cs_mcs)) {
2345 setverdict(fail, "Wrong CS_MCS ", ms.ul_tbf.tx_cs_mcs, " received vs exp ", exp_ul_cs_mcs);
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002346 f_shutdown(__BFILE__, __LINE__);
2347 }
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002348
2349 /* Send one UL block (without TLLI since we are in Second-Phase Access)
2350 and make sure it is ACKED fine */
Pau Espin Pedrolfdbce842021-03-03 11:43:40 +01002351 f_ms_tx_ul_data_block_multi(ms, 1);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002352
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002353 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002354 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002355
2356 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002357 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002358
2359 /* Now SGSN sends some DL data, PCU will page on PACCH */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002360 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Pau Espin Pedrolddd6c3f2021-03-03 12:01:20 +01002361 /* Sleep a bit to make sure PCU received the DL data and hence it will be prioritized by scheduler: */
2362 f_sleep(0.5);
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002363 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002364 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002365 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002366
Pau Espin Pedroladbbe1e2020-05-17 00:28:01 +02002367 /* PCU acks the UL data after having received CV=0) */
2368 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, unused_fn);
2369
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002370 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002371 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_dl_cs_mcs);
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002372
2373 /* ACK the DL block */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002374 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2375 f_ms_tx_ul_block(ms, f_dltbf_ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf, ischosen(dl_block.data_egprs)),
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002376 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol02c972d2020-05-13 15:56:16 +02002377
2378 f_shutdown(__BFILE__, __LINE__, final := true);
2379}
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002380
2381testcase TC_mo_ping_pong_with_ul_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002382 var template (present) CodingScheme exp_ul_cs_mcs := cs_gprs_any;
2383 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002384
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002385 f_TC_mo_ping_pong_2phase_access(c_PCUIF_Flags_noMCS, ms_racap_gprs_def, exp_ul_cs_mcs, exp_dl_cs_mcs);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01002386
2387 if (mp_osmo_pcu_newer_than_0_9_0) {
2388 var StatsDExpects expect := {
2389 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2390 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2391 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2392 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2393 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2394 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2395 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2396 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2397 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2398 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2399 };
2400 f_statsd_expect(expect);
2401 }
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002402}
2403
2404testcase TC_mo_ping_pong_with_ul_racap_egprs_only() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002405 var template (present) CodingScheme exp_ul_cs_mcs := mcs_egprs_any;
2406 var template (present) CodingScheme exp_dl_cs_mcs := mcs_egprs_any;
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02002407
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002408 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 +01002409 if (mp_osmo_pcu_newer_than_0_9_0) {
2410 var StatsDExpects expect := {
2411 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2412 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2413 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
2414 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 1, max := 1 },
2415 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2416 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2417 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2418 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2419 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2420 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2421 };
2422 f_statsd_expect(expect);
2423 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002424}
2425
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002426testcase TC_force_two_phase_access() runs on RAW_PCU_Test_CT {
2427 /* Configure PCU to force two phase access */
2428 g_force_two_phase_access := true;
2429
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002430 var CodingScheme exp_ul_cs_mcs := f_rlcmac_block_int2cs_mcs(g_mcs_initial_ul, false);
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002431 var template (present) CodingScheme exp_dl_cs_mcs := cs_gprs_any;
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002432
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002433 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 +01002434
2435 if (mp_osmo_pcu_newer_than_0_9_0) {
2436 var StatsDExpects expect := {
2437 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
2438 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
2439 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
2440 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
2441 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
2442 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
2443 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 1, max := 1 },
2444 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
2445 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
2446 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
2447 };
2448 f_statsd_expect(expect);
2449 }
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02002450}
2451
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002452/* Test scenario where SGSN wants to send some data against MS and it is
2453 * answered by the MS on PDCH, so TBFs for downlink and later for uplink are created.
2454 */
Vadim Yanitskiyc67240a2020-10-17 15:59:37 +07002455private function f_TC_mt_ping_pong(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit,
2456 template (present) CodingScheme exp_cs_mcs := ?)
2457runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002458 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002459 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002460 var uint32_t sched_fn;
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002461 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002462 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002463
2464 /* Initialize NS/BSSGP side */
2465 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002466 /* Initialize GPRS MS side */
2467 f_init_gprs_ms();
2468 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002469
2470 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002471 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002472
2473 /* Establish BSSGP connection to the PCU */
2474 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002475 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002476
2477 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002478 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2479 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002480
2481 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2482 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002483 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002484
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002485 /* ACK the DL block, and request UL TBF at the same time */
Pau Espin Pedrole8db6732020-11-12 21:06:41 +01002486 f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
2487 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 +02002488 f_dl_block_ack_fn(dl_block, dl_fn));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002489
Pau Espin Pedrol6791eb62020-05-20 18:27:10 +02002490 /* Expect UL ass */
Vadim Yanitskiy7431e9e2020-07-21 01:59:17 +07002491 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002492
Pau Espin Pedrol4aac3d02020-05-13 15:13:49 +02002493 /* Send one UL block (with TLLI since we are in One-Phase Access
2494 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002495 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002496 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2497 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002498 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002499
2500 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002501 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002502
2503 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002504}
2505
2506testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002507 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002508 f_TC_mt_ping_pong(omit, exp_cs_mcs);
2509}
2510
2511/* TC_mt_ping_pong, but DL-UNITDATA contains RA Access capability with (M)CS
2512/* information about the MS */
2513testcase TC_mt_ping_pong_with_dl_racap() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01002514 var template (present) CodingScheme exp_cs_mcs := cs_gprs_any;
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01002515 f_TC_mt_ping_pong(bssgp_ms_racap_gprs_def, exp_cs_mcs);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002516}
2517
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002518/* Verify that if PCU doesn't get one of the intermediate UL data blocks in a UL
2519 * TBF, it will request retransmission through UL ACK/NACK (with missing block
2520 * in its bitmap) when CV=0 is received (and hence it knows no more data is to
2521 * be transferred).
2522 */
2523testcase TC_ul_intermediate_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002524 var RlcmacDlBlock dl_block;
2525 var template (value) RlcmacUlBlock ul_data;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002526 var uint32_t sched_fn;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002527 var octetstring total_payload;
2528 var octetstring payload;
2529 var octetstring lost_payload;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002530 var uint5_t tfi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002531 var GprsMS ms;
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002532 var uint32_t payload_fill_len;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002533
2534 /* Initialize NS/BSSGP side */
2535 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002536 /* Initialize GPRS MS side */
2537 f_init_gprs_ms();
2538 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002539
2540 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002541 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002542
2543 /* Establish BSSGP connection to the PCU */
2544 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002545 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002546
2547 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002548 f_ms_establish_ul_tbf(ms);
2549 tfi := ms.ul_tbf.tfi;
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002550
2551 /* Send one UL block (with TLLI since we are in One-Phase Access
2552 contention resoultion) and make sure it is ACKED fine. */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002553 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 +02002554 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 +02002555
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002556 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2557 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002558 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002559 total_payload := payload;
2560
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002561 payload_fill_len := f_ultbf_payload_fill_length(ms.ul_tbf);
2562
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002563 /* Send 2 packets, skip 1 (inc bsn) and send another one */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002564 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002565 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002566 total_payload := total_payload & payload;
2567
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002568 payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002569 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002570 total_payload := total_payload & payload;
2571
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002572 lost_payload := f_rnd_octstring(payload_fill_len);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002573 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 +02002574 total_payload := total_payload & lost_payload;
2575
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002576 payload := f_rnd_octstring(payload_fill_len)
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002577 f_ms_tx_ul_data_block(ms, payload, cv := 15);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002578 total_payload := total_payload & payload;
2579
2580 /* 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 +02002581 total_payload := total_payload & f_ms_tx_ul_data_block_multi(ms, g_bs_cv_max);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002582
2583 /* On CV=0, we'll receive a UL ACK asking about missing block */
2584 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2585 /* TODO: check ack ack bitmap (URBB) */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002586 ul_data := t_RLCMAC_UL_DATA(cs := ms.ul_tbf.tx_cs_mcs,
2587 tfi := tfi,
2588 cv := 15,
2589 bsn := 3,
2590 blocks := {t_RLCMAC_LLCBLOCK(lost_payload)});
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002591 f_ms_tx_ul_block(ms, ul_data);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002592
2593 /* Now final ack is recieved */
2594 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2595 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002596 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002597
2598 /* receive one message on BSSGP with all aggregated data in payload: */
Harald Welte5339b2e2020-10-04 22:52:56 +02002599 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 +07002600
2601 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrola416cb82020-05-15 14:09:02 +02002602}
2603
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002604/* Verify that if PCU doesn't get an ACK for first DL block after IMM ASS, it
2605 * will retry by retransmitting both the IMM ASS + DL block after poll (ack)
2606 * timeout occurs (specified by sent RRBP on DL block). */
2607testcase TC_imm_ass_dl_block_retrans() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002608 var RlcmacDlBlock dl_block;
2609 var octetstring data := f_rnd_octstring(10);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002610 var uint32_t dl_fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002611 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002612
2613 /* Initialize NS/BSSGP side */
2614 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002615 /* Initialize GPRS MS side */
2616 f_init_gprs_ms();
2617 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002618
2619 /* Initialize the PCU interface abstraction */
2620 f_init_raw(testcasename());
2621
2622 /* Establish BSSGP connection to the PCU */
2623 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002624 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002625
2626 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002627 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2628 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002629
2630 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2631 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002632 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002633
2634 /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
2635 * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
2636 * should retrigger IMM ASS + GPRS DL procedure after poll timeout. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002637 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy2e213ae2020-05-06 22:26:17 +07002638
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002639 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2640 f_sleep(X2002);
Vadim Yanitskiyb6733a62020-05-10 14:39:00 +07002641 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002642
2643 /* ACK the DL block */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002644 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
2645 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2646 f_dl_block_ack_fn(dl_block, dl_fn));
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07002647
2648 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02002649}
2650
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002651/* Verify scheduling of multiple Downlink data blocks during one RRBP. */
2652testcase TC_dl_flow_more_blocks() runs on RAW_PCU_Test_CT {
2653 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
2654 var octetstring data := f_rnd_octstring(16);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002655 var PacketDlAssign dl_tbf_ass;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002656 var RlcmacDlBlock dl_block;
2657 var uint32_t ack_fn;
2658 var uint32_t fn;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002659 var GprsMS ms;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002660 timer T := 5.0;
2661
2662 /* Initialize NS/BSSGP side */
2663 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002664 /* Initialize GPRS MS side */
2665 f_init_gprs_ms();
2666 ms := g_ms[0]; /* We only use first MS in this test */
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002667
2668 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002669 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002670
Daniel Willmann535aea62020-09-21 13:27:08 +02002671 f_statsd_reset();
2672
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002673 /* Establish BSSGP connection to the PCU */
2674 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002675 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002676
2677 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002678 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
2679 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002680
2681 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
2682 f_sleep(X2002);
2683
2684 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
2685 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002686 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002687
2688 /* TDMA frame number on which we are supposed to send the ACK */
2689 ack_fn := f_dl_block_ack_fn(dl_block, fn);
2690
2691 /* SGSN sends more blocks during the indicated RRBP */
2692 for (var integer bsn := 1; bsn < 63; bsn := bsn + 1) {
2693 data := f_rnd_octstring(16); /* Random LLC data */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002694 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002695
2696 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, bsn);
2697
2698 /* Make sure this block has the same TFI as was assigned
2699 * FIXME: this is only valid for GPRS, not EGPRS. */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002700 if (dl_block.data.mac_hdr.hdr_ext.tfi != ms.dl_tbf.tfi) {
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002701 setverdict(fail, "Rx DL data block with unexpected TFI: ",
2702 dl_block.data.mac_hdr.hdr_ext.tfi);
2703 f_shutdown(__BFILE__, __LINE__);
2704 }
2705
2706 /* Keep Ack/Nack description updated */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002707 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002708
2709 /* Break if this is the end of RRBP */
2710 if (fn == ack_fn) {
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002711 ms.dl_tbf.acknack_desc.final_ack := '1'B;
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002712 break;
2713 }
2714 }
2715
2716 /* This is the end of RRBP, send Packet Downlink Ack/Nack */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02002717 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 +07002718
2719 /* Make sure that the next block (after the Ack) is dummy */
2720 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
2721
Daniel Willmann535aea62020-09-21 13:27:08 +02002722 var StatsDExpects expect := {
2723 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 0, max := 0},
2724 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
2725 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0},
2726 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
2727 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 0, max := 0},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01002728 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 64, max := 64},
Daniel Willmann535aea62020-09-21 13:27:08 +02002729 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 0, max := 0}
2730 };
2731 f_statsd_expect(expect);
2732
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07002733 f_shutdown(__BFILE__, __LINE__, final := true);
2734}
2735
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002736/* Verify Decoding and segmentation of UL LLC PDUs into RLC data blocks, OS#4559.
2737 * Check "GPRS from A-Z" slide "Example of LI-Field and E-Bit" page 186.
2738 * Check "3GPP TS 44.060" Annex B. */
2739testcase TC_ul_flow_multiple_llc_blocks() runs on RAW_PCU_Test_CT {
2740 var RlcmacDlBlock dl_block;
2741 var octetstring dataA := f_rnd_octstring(20);
2742 var octetstring dataB := f_rnd_octstring(13);
2743 var octetstring dataC := f_rnd_octstring(3);
2744 var octetstring dataD := f_rnd_octstring(12);
2745 var uint32_t sched_fn;
2746 var GprsMS ms;
2747 var template (value) RlcmacUlBlock ul_data;
2748
2749 /* Initialize NS/BSSGP side */
2750 f_init_bssgp();
2751 /* Initialize GPRS MS side */
2752 f_init_gprs_ms();
2753 ms := g_ms[0]; /* We only use first MS in this test */
2754
2755 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002756 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002757
2758 /* Establish BSSGP connection to the PCU */
2759 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01002760 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002761
2762 /* Establish an Uplink TBF */
2763 f_ms_establish_ul_tbf(ms);
2764
2765 /* Summary of what's transmitted:
2766 * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3]
2767 * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2]
2768 * 3- UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1]
2769 * 4- UL RlcDataBlock(dataD finishes) [BSN=3, CV=0]
2770 * And on SGSN we receive 4 packets, one for each LlcBlock dataA..D.
2771 * We'll also receive some UL ACK/NACK we need to reply with CTRL ACK.
2772 */
2773
2774 /* UL RlcDataBlock(dataA) [BSN=0, CV=3] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002775 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2776 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002777 cv := 3,
2778 bsn := ms.ul_tbf.bsn,
2779 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 0, 16)) },
2780 tlli := ms.tlli);
2781 /* Indicate no llc header, meaning first LLC block doesn't finish in current
2782 * RLCMAC block being sent. */
2783 ul_data.data.mac_hdr.e := true;
2784 f_ultbf_inc_bsn(ms.ul_tbf);
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002785 f_ms_tx_ul_block(ms, ul_data, ms.ul_tbf.start_time_fn);
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002786
2787 /* UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002788 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2789 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002790 cv := 2,
2791 bsn := ms.ul_tbf.bsn,
2792 blocks := { t_RLCMAC_LLCBLOCK(substr(dataA, 16, 4),
2793 t_RLCMAC_LLCBLOCK_HDR(length_ind := 4, more := true, e := true)),
2794 t_RLCMAC_LLCBLOCK(substr(dataB, 0, 11))
2795 },
2796 tlli := ms.tlli);
2797 f_ultbf_inc_bsn(ms.ul_tbf);
2798 f_ms_tx_ul_block(ms, ul_data);
2799
2800 /* UL block dataA should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002801 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 +02002802
2803 /* UL RlcDataBlock(dataB finished, dataC starts and finishes, dataD starts) [BSN=2, CV=1] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002804 ul_data := t_RLCMAC_UL_DATA_TLLI(cs := CS_1,
2805 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002806 cv := 1,
2807 bsn := ms.ul_tbf.bsn,
2808 blocks := { t_RLCMAC_LLCBLOCK(substr(dataB, 11, 2),
2809 t_RLCMAC_LLCBLOCK_HDR(length_ind := 2, more := true, e := false)),
2810 t_RLCMAC_LLCBLOCK(substr(dataC, 0, 3),
2811 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := true, e := true)),
2812 t_RLCMAC_LLCBLOCK(substr(dataD, 0, 9))
2813 },
2814 tlli := ms.tlli);
2815 f_ultbf_inc_bsn(ms.ul_tbf);
2816 f_ms_tx_ul_block(ms, ul_data);
2817
2818 /* UL block dataB and dataC should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002819 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id, dataB));
2820 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 +02002821
2822 /* UL RlcDataBlock(dataD finishes) [BSN=3, CV=0] */
Pau Espin Pedrolcb00c522020-11-06 19:52:05 +01002823 ul_data := t_RLCMAC_UL_DATA_TLLI(
2824 cs := CS_1,
2825 tfi := ms.ul_tbf.tfi,
Pau Espin Pedrol05b6c172020-06-26 17:28:23 +02002826 cv := 0,
2827 bsn := ms.ul_tbf.bsn,
2828 blocks := { t_RLCMAC_LLCBLOCK(substr(dataD, 9, 3),
2829 t_RLCMAC_LLCBLOCK_HDR(length_ind := 3, more := false, e := true))
2830 },
2831 tlli := ms.tlli);
2832 f_ultbf_inc_bsn(ms.ul_tbf);
2833 f_ms_tx_ul_block(ms, ul_data);
2834
2835 /* UL block dataB and dataD should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02002836 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 +02002837
2838 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
2839 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2840 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
2841
2842 f_shutdown(__BFILE__, __LINE__, final := true);
2843}
2844
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01002845/* Validate an Imm Assignment is retransmitted if first RRBP requesting DL
2846 * ACK/NACK is not answered */
2847testcase TC_dl_no_ack_retrans_imm_ass() runs on RAW_PCU_Test_CT {
2848 var RlcmacDlBlock dl_block;
2849 var octetstring data1 := f_rnd_octstring(200);
2850 var octetstring data2 := f_rnd_octstring(10);
2851 var uint32_t dl_fn;
2852 var GprsMS ms;
2853 var template (value) TsTrxBtsNum nr;
2854 var BTS_PDTCH_Block data_msg;
2855
2856 /* Initialize NS/BSSGP side */
2857 f_init_bssgp();
2858 /* Initialize GPRS MS side */
2859 f_init_gprs_ms();
2860 ms := g_ms[0]; /* We only use first MS in this test */
2861
2862 /* Initialize the PCU interface abstraction */
2863 f_init_raw(testcasename())
2864
2865 /* Establish BSSGP connection to the PCU */
2866 f_bssgp_establish();
2867 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2868
2869 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
2870 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data1));
2871 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2872
2873 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2874 f_sleep(X2002);
2875
2876 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
2877 while (true) {
2878 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
2879
2880 /* Keep Ack/Nack description updated (except for last BSN) */
2881 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
2882
2883 if (f_dl_block_rrbp_valid(dl_block)) {
2884 /* Don't transmit DL ACK here on purpose ignore it */
2885 break;
2886 }
2887 }
2888
2889 /* PCU starts whole process again */
2890 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
2891
2892 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
2893 f_sleep(X2002);
2894
2895 /* Recv DL data until receiving RRBP to DL ACK (because it's last queued
2896 /* DL data), after that we receive only DUMMY blocks so we are done */
2897 var boolean data_received := false;
2898 nr := ts_TsTrxBtsNum;
2899 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2900 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2901 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2902 block_nr := nr.blk_nr));
2903 alt {
2904 [data_received] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2905 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2906 tr_RLCMAC_DUMMY_CTRL)) { /* done */ }
2907 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
2908 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
2909 tr_RLCMAC_DATA)) -> value data_msg {
2910 data_received := true;
2911 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, data_msg.dl_block);
2912 if (data_msg.dl_block.data.mac_hdr.hdr_ext.fbi) {
2913 log("Received FINAL_ACK");
2914 ms.dl_tbf.acknack_desc.final_ack := '1'B;
2915 }
2916 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
2917 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
2918 f_dl_block_ack_fn(dl_block, data_msg.raw.fn));
2919 }
2920 nr := ts_TsTrxBtsNum;
2921 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
2922 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
2923 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
2924 block_nr := nr.blk_nr));
2925 repeat;
2926 }
2927 [] BTS.receive {
2928 setverdict(fail, "Unexpected BTS message");
2929 f_shutdown(__BFILE__, __LINE__);
2930 }
2931 }
2932
2933 f_shutdown(__BFILE__, __LINE__, final := true);
2934}
2935
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002936/* Verify allocation and use of multislot tbf, triggered by MS class provided in SGSN. SYS#5131 */
2937testcase TC_dl_multislot_tbf_ms_class_from_sgsn() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002938 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002939 var octetstring data := f_rnd_octstring(10);
2940 var PacketDlAssign dl_tbf_ass;
2941 var RlcmacDlBlock dl_block;
2942 var uint32_t poll_fn;
2943 var uint32_t sched_fn;
2944 var GprsMS ms;
2945 timer T := 5.0;
2946
2947 /* Initialize NS/BSSGP side */
2948 f_init_bssgp();
2949 /* Initialize GPRS MS side */
2950 f_init_gprs_ms();
2951 ms := g_ms[0]; /* We only use first MS in this test */
2952
2953 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01002954 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
2955 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002956
2957 /* Initialize the PCU interface abstraction */
2958 f_init_raw(testcasename(), info_ind);
2959
2960 /* Establish BSSGP connection to the PCU */
2961 f_bssgp_establish();
2962 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
2963
2964 /* Establish an Uplink TBF, this way the PCU can send DL Assignment
2965 through PDCH (no multiblock assignment possible through PCH) */
2966 f_ms_establish_ul_tbf(ms);
2967
2968 /* Send one UL block (with TLLI since we are in One-Phase Access
2969 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02002970 f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn,
2971 nr := f_ms_tx_TsTrxBtsNum(ms));
Pau Espin Pedrol0ea8b6f2020-10-29 20:48:43 +01002972 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
2973 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2974
2975 /* SGSN sends some DL data, PCU will assign DL TBF through PACCH */
2976 var MultislotCap_GPRS_BSSGP mscap_gprs := {
2977 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
2978 gprsextendeddynalloccap := '0'B
2979 };
2980 var MSRadioAccessCapabilityV_BSSGP ms_racap := { valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, mscap_gprs, omit)) };
2981 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
2982 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
2983 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
2984 setverdict(fail, "Expected 8 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
2985 f_shutdown(__BFILE__, __LINE__);
2986 }
2987 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
2988
2989 f_shutdown(__BFILE__, __LINE__, final := true);
2990}
2991
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002992testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01002993 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01002994 var RlcmacDlBlock dl_block;
2995 var octetstring data := f_rnd_octstring(10);
2996 var PollFnCtx pollctx;
2997 var uint32_t sched_fn;
2998 var GprsMS ms;
2999
3000 var MultislotCap_GPRS mscap_gprs := {
3001 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3002 gprsextendeddynalloccap := '0'B
3003 };
3004 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3005
3006
3007 /* Initialize NS/BSSGP side */
3008 f_init_bssgp();
3009 /* Initialize GPRS MS side */
3010 f_init_gprs_ms();
3011 ms := g_ms[0]; /* We only use first MS in this test */
3012
3013 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003014 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3015 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrol8155bf42020-10-29 17:34:26 +01003016
3017 /* Initialize the PCU interface abstraction */
3018 f_init_raw(testcasename(), info_ind);
3019
3020 /* Establish BSSGP connection to the PCU */
3021 f_bssgp_establish();
3022 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3023
3024 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3025 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3026
3027 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
3028 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
3029
3030 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
3031 dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms));
3032 if (f_dltbf_num_slots(ms.dl_tbf) != 8) {
3033 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_dltbf_num_slots(ms.dl_tbf));
3034 f_shutdown(__BFILE__, __LINE__);
3035 }
3036 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms));
3037
3038 f_shutdown(__BFILE__, __LINE__, final := true);
3039}
3040
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003041testcase TC_ul_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT {
3042 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
3043 var RlcmacDlBlock dl_block;
3044 var octetstring data := f_rnd_octstring(10);
3045 var PollFnCtx pollctx;
3046 var uint32_t sched_fn;
3047 var GprsMS ms;
3048
3049 var MultislotCap_GPRS mscap_gprs := {
3050 gprsmultislotclass := '10010'B, /* MS class 18, supports 8 DL and 8 UL */
3051 gprsextendeddynalloccap := '0'B
3052 };
3053 var MSRadioAccessCapabilityV ms_racap := { valueof(ts_RaCapRec('0001'B /* E-GSM */, mscap_gprs, omit)) };
3054
3055
3056 /* Initialize NS/BSSGP side */
3057 f_init_bssgp();
3058 /* Initialize GPRS MS side */
3059 f_init_gprs_ms();
3060 ms := g_ms[0]; /* We only use first MS in this test */
3061
3062 /* Only 1 TRX with 8 PDCH */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003063 f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0);
3064 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrola9f27fa2020-10-30 13:16:21 +01003065
3066 /* Initialize the PCU interface abstraction */
3067 f_init_raw(testcasename(), info_ind);
3068
3069 /* Establish BSSGP connection to the PCU */
3070 f_bssgp_establish();
3071 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3072
3073 /* Send PACKET RESOURCE REQUEST to notify the MultiSlot Class */
3074 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap));
3075
3076 if (f_ultbf_num_slots(ms.ul_tbf) != 8) {
3077 setverdict(fail, "Expected 8 PDCH slot allocated but got ", f_ultbf_num_slots(ms.ul_tbf));
3078 f_shutdown(__BFILE__, __LINE__);
3079 }
3080
3081 f_shutdown(__BFILE__, __LINE__, final := true);
3082}
3083
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003084/* Test scenario where MS wants to request a new TBF once the current one is
3085 * ending, by means of sending a Packet Resource Request on ul slot provided by
3086 * last Pkt Ul ACK's RRBP.
3087 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3088testcase TC_ul_tbf_reestablish_with_pkt_resource_req() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003089 var RlcmacDlBlock dl_block;
3090 var octetstring data := f_rnd_octstring(10);
3091 var uint32_t sched_fn;
3092 var uint32_t dl_fn;
3093 var template RlcmacDlBlock acknack_tmpl;
3094 var GprsMS ms;
3095
3096 /* Initialize NS/BSSGP side */
3097 f_init_bssgp();
3098 /* Initialize GPRS MS side */
3099 f_init_gprs_ms();
3100 ms := g_ms[0]; /* We only use first MS in this test */
3101
3102 /* Initialize the PCU interface abstraction */
3103 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003104 f_statsd_reset();
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003105
3106 /* Establish BSSGP connection to the PCU */
3107 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003108 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003109
3110 /* Establish an Uplink TBF */
3111 f_ms_establish_ul_tbf(ms);
3112
3113 /* Send one UL block (with TLLI since we are in One-Phase Access
3114 contention resoultion) and make sure it is ACKED fine */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003115 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 +02003116
3117 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003118 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003119
3120 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3121 tr_UlAckNackGprs(ms.tlli,
3122 tr_AckNackDescription(final_ack := '1'B),
3123 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3124 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3125
3126 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3127
3128 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
Vadim Yanitskiyf3cb4dd2020-07-21 01:52:33 +07003129 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 +07003130 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_UL_PACKET_ASS);
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003131 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3132 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3133
3134 /* Send one UL block (without TLLI since we are in Second-Phase Access)
3135 and make sure it is ACKED fine */
3136 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := false); /* TODO: send using cs_mcs */
3137
3138 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003139 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003140
3141 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3142 /* ACK the ACK */
3143 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3144
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003145 if (mp_osmo_pcu_newer_than_0_9_0) {
3146 var StatsDExpects expect := {
3147 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1 },
3148 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 0, max := 0 },
3149 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 1, max := 1 },
3150 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3151 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 1, max := 1 },
3152 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 1, max := 1 },
3153 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
3154 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 1, max := 1 },
3155 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 },
3156 { name := "TTCN3.bts.0.pkt.ul_assignment", mtype := "c", min := 1, max := 1 }
3157 };
3158 f_statsd_expect(expect);
3159 }
3160
Pau Espin Pedrolcdbe9032020-07-07 20:20:42 +02003161 f_shutdown(__BFILE__, __LINE__, final := true);
3162}
3163
Pau Espin Pedrold658f342021-10-15 14:52:22 +02003164/* Test scenario where MS wants to request a new TBF once the current one is
3165 * ending, by means of sending a Packet Resource Request on ul slot provided by
3166 * last Pkt Ul ACK's RRBP. new Pkt Ul Ass is never confirmed by the MS in this test.
3167 * See 3GPP TS 44.060 sec 9.3.2.4.2 "Non-extended uplink TBF mode" */
3168testcase TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() runs on RAW_PCU_Test_CT {
3169 var PCUIF_info_ind info_ind;
3170 var RlcmacDlBlock dl_block;
3171 var octetstring data := f_rnd_octstring(10);
3172 var uint32_t sched_fn;
3173 var uint32_t dl_fn;
3174 var template (value) TsTrxBtsNum nr;
3175 var BTS_PDTCH_Block data_msg;
3176 var template RlcmacDlBlock acknack_tmpl;
3177 var GprsMS ms;
3178 const integer N3105_MAX := 2;
3179 var integer N3105 := 0;
3180 timer T_3195 := 1.0 + 0.5; /* 0.5: extra offset since we cannot match exactly */
3181
3182 /* Initialize NS/BSSGP side */
3183 f_init_bssgp();
3184 /* Initialize GPRS MS side */
3185 f_init_gprs_ms();
3186 ms := g_ms[0]; /* We only use first MS in this test */
3187
3188 /* Initialize the PCU interface abstraction */
3189 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
3190 /* Speedup test: */
3191 info_ind.n3105 := N3105_MAX;
3192 info_ind.t3195 := 1;
3193 f_init_raw(testcasename(), info_ind);
3194
3195 /* Establish BSSGP connection to the PCU */
3196 f_bssgp_establish();
3197 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3198
3199 /* Establish an Uplink TBF */
3200 f_ms_establish_ul_tbf(ms);
3201
3202 /* Send one UL block (with TLLI since we are in One-Phase Access
3203 contention resoultion) and make sure it is ACKED fine */
3204 f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);
3205
3206 /* UL block should be received in SGSN */
3207 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
3208
3209 acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,
3210 tr_UlAckNackGprs(ms.tlli,
3211 tr_AckNackDescription(final_ack := '1'B),
3212 tr_UlAckNackGprsAdditionsRel99(tbf_est := true)))
3213 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);
3214
3215 /* TODO: verify TBF_EST and FinalACK are both '1' above */
3216
3217 /* Send PACKET RESOURCE REQUEST to request a new UL TBF */
3218 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)), sched_fn);
3219
3220 /* Now Keep ignoring the Pkt Ul Ass on PACCH: */
3221 /* Now we go on receiving DL data and not answering RRBP: */
3222 nr := ts_TsTrxBtsNum;
3223 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3224 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3225 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3226 block_nr := nr.blk_nr));
3227 alt {
3228 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3229 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3230 tr_RLCMAC_UL_PACKET_ASS)) -> value data_msg {
3231 if (f_dl_block_rrbp_valid(data_msg.dl_block)) {
3232 log("Ignoring RRBP N3105 ", N3105);
3233 N3105 := N3105 + 1;
3234 }
3235 nr := ts_TsTrxBtsNum;
3236 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3237 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3238 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3239 block_nr := nr.blk_nr));
3240 repeat;
3241 }
3242 /* At this point in time (N3105_MAX reached), PCU already moved TBF to
3243 * RELEASE state so no data for it is tx'ed, hence the dummy blocks:
3244 */
3245 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3246 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3247 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
3248 if (not T_3195.running) {
3249 T_3195.start;
3250 }
3251 nr := ts_TsTrxBtsNum;
3252 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3253 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3254 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3255 block_nr := nr.blk_nr));
3256 repeat;
3257 }
3258 [N3105 == N3105_MAX] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3259 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3260 omit)) -> value data_msg {
3261 /* We may already receive idle blocks before our own TTCN3 timer
3262 * triggers due to the TBF being released. Keep going until our T_3195 triggers. */
3263 nr := ts_TsTrxBtsNum;
3264 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3265 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3266 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3267 block_nr := nr.blk_nr));
3268 repeat;
3269 }
3270 /* We receive Dummy blocks in between Pkt Ul Ass while PCU waits for us to ack it */
3271 [not T_3195.running] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3272 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3273 tr_RLCMAC_DUMMY_CTRL)) -> value data_msg {
3274 log("Ignoring Dummy block FN ", data_msg.raw.fn);
3275 nr := ts_TsTrxBtsNum;
3276 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
3277 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
3278 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
3279 block_nr := nr.blk_nr));
3280 repeat;
3281 }
3282 [T_3195.running] T_3195.timeout {
3283 log("T_3195 timeout");
3284 /* Done in alt, wait for pending RTS initiated previously in
3285 * above case before continuing (expect nothing to be sent since there's no active TBF): */
3286 BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
3287 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
3288 omit));
3289 }
3290 [] BTS.receive {
3291 setverdict(fail, "Unexpected BTS message");
3292 f_shutdown(__BFILE__, __LINE__);
3293 }
3294 }
3295
3296 f_shutdown(__BFILE__, __LINE__, final := true);
3297}
3298
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003299/* Test CS paging over the BTS<->PCU socket.
3300 * 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.
3301 * Paging should be send on the PACCH.
3302 *
3303 * 1. Send a Paging Request over PCU socket.
3304 * 2. Send a Ready-To-Send message over PCU socket
3305 * 3. Expect a Paging Frame
3306 */
3307testcase TC_paging_cs_from_bts() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003308 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003309 var MobileIdentityLV mi;
3310 var octetstring mi_enc_lv;
3311 var hexstring imsi := f_gen_imsi(42);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003312 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003313
3314 /* Initialize NS/BSSGP side */
3315 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003316 /* Initialize GPRS MS side */
3317 f_init_gprs_ms();
3318 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003319
3320 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003321 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003322
3323 /* Establish BSSGP connection to the PCU */
3324 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003325 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003326
3327 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003328 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003329
3330 /* build mobile Identity */
3331 mi := valueof(ts_MI_IMSI_LV(imsi));
3332 mi_enc_lv := enc_MobileIdentityLV(mi);
3333 /* Send paging request */
3334 BTS.send(ts_PCUIF_PAG_REQ(bts_nr := 0, id_lv := mi_enc_lv, chan_needed := 0,
3335 sapi :=PCU_IF_SAPI_PDTCH));
3336
3337 /* Receive it on BTS side towards MS */
3338 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3339
3340 /* Make sure that Packet Paging Request contains the same IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003341 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
3342 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3343 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3344 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003345
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003346 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003347}
3348
3349/* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).
3350 */
3351private function f_tc_paging_cs_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3352runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003353 var RlcmacDlBlock dl_block;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003354 var hexstring imsi := f_gen_imsi(42);
3355 var GsmTmsi tmsi;
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003356 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003357
3358 /* Initialize NS/BSSGP side */
3359 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003360 /* Initialize GPRS MS side */
3361 f_init_gprs_ms();
3362 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003363
3364 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003365 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003366
3367 /* Establish BSSGP connection to the PCU */
3368 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003369 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003370
3371 /* Establish an Uplink TBF */
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003372 f_ms_establish_ul_tbf(ms);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003373
3374 /* Send paging request with or without TMSI */
3375 if (use_ptmsi) {
3376 tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */
3377 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, tmsi));
3378 } else {
3379 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, imsi));
3380 }
3381
3382 /* Receive it on BTS side towards MS */
3383 f_rx_rlcmac_dl_block_exp_pkt_pag_req(dl_block);
3384
3385 /* Make sure that Packet Paging Request contains the same P-TMSI/IMSI */
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003386 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003387 if (use_ptmsi) {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003388 if (not f_pkt_paging_match_tmsi(req, tmsi, ps_domain := false)) {
3389 setverdict(fail, "Failed to match P-TMSI ", tmsi, " in ", req);
3390 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003391 } else {
Vadim Yanitskiy3e5f0742020-11-01 03:30:18 +07003392 if (not f_pkt_paging_match_imsi(req, imsi, ps_domain := false)) {
3393 setverdict(fail, "Failed to match IMSI ", imsi, " in ", req);
3394 }
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003395 }
3396
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003397 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003398}
3399
3400testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3401 f_tc_paging_cs_from_sgsn(0, true);
3402}
3403
3404testcase TC_paging_cs_from_sgsn_sign() runs on RAW_PCU_Test_CT {
3405 f_tc_paging_cs_from_sgsn(0);
3406}
3407
3408testcase TC_paging_cs_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Harald Welte5339b2e2020-10-04 22:52:56 +02003409 f_tc_paging_cs_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003410}
3411
3412/* Test PS paging over Gb (SGSN->PCU->BTS[CCCH]).
3413 */
3414private function f_tc_paging_ps_from_sgsn(Nsvci bvci, boolean use_ptmsi := false)
3415runs on RAW_PCU_Test_CT {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003416 var integer imsi_suff_tx := 423;
3417 var hexstring imsi := f_gen_imsi(imsi_suff_tx);
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003418 var GprsMS ms;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003419
3420 /* Initialize NS/BSSGP side */
3421 f_init_bssgp();
Pau Espin Pedrol4f7b8fd2020-05-18 18:28:17 +02003422 /* Initialize GPRS MS side */
3423 f_init_gprs_ms();
3424 ms := g_ms[0]; /* We only use first MS in this test */
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003425
Oliver Smith61b4e732021-07-22 08:14:29 +02003426 f_statsd_reset();
3427
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003428 /* Establish BSSGP connection to the PCU */
3429 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003430 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003431
3432 /* Send BSSGP PAGING-PS (with or without TMSI), wait for RR Paging Request Type 1.
3433 * Make sure that both paging group (IMSI suffix) and Mobile Identity match. */
3434 if (use_ptmsi) {
3435 var OCT4 tmsi := f_rnd_octstring(4); /* Random P-TMSI */
3436 BSSGP[0].send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));
3437 f_pcuif_rx_pch_pag_req1(t_MI_TMSI(tmsi), imsi_suff_tx);
3438 } else {
3439 BSSGP[0].send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
3440 f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);
3441 }
3442
Oliver Smith61b4e732021-07-22 08:14:29 +02003443 if (mp_osmo_pcu_newer_than_0_9_0) {
3444 var StatsDExpects expect := {
Oliver Smith36d95d82021-08-06 22:01:53 +02003445 { name := "TTCN3.pcu.sgsn.0.rx_paging_ps", mtype := "c", min := 1, max := 1 },
3446 /* After the PCU receives the paging request from SGSN,
3447 * and it doesn't have any errors, PCU sends it to the
3448 * BTS to do paging over PCH. */
3449 { name := "TTCN3.bts.0.pch.requests", mtype := "c", min := 1, max := 1 }
Oliver Smith61b4e732021-07-22 08:14:29 +02003450 };
3451 f_statsd_expect(expect);
3452 }
Oliver Smithfbd39312021-07-27 15:23:39 +02003453}
3454
3455testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {
3456 /* Initialize the PCU interface abstraction */
3457 f_init_raw(testcasename());
3458
3459 f_tc_paging_ps_from_sgsn(0, true);
Oliver Smith61b4e732021-07-22 08:14:29 +02003460
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003461 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003462}
3463
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003464testcase TC_paging_ps_from_sgsn_sign() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003465 /* Initialize the PCU interface abstraction */
3466 f_init_raw(testcasename());
3467
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003468 f_tc_paging_ps_from_sgsn(0);
Oliver Smithfbd39312021-07-27 15:23:39 +02003469
3470 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003471}
3472
3473testcase TC_paging_ps_from_sgsn_ptp() runs on RAW_PCU_Test_CT {
Oliver Smithfbd39312021-07-27 15:23:39 +02003474 /* Initialize the PCU interface abstraction */
3475 f_init_raw(testcasename());
3476
Harald Welte5339b2e2020-10-04 22:52:56 +02003477 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
Oliver Smithfbd39312021-07-27 15:23:39 +02003478
3479 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003480}
3481
Oliver Smithe1a77c42021-07-28 13:36:09 +02003482testcase TC_paging_pch_timeout() runs on RAW_PCU_Test_CT {
3483 /* Initialize the PCU interface abstraction */
3484 f_init_raw(testcasename());
3485
3486 /* Set T3113 to 1s to shorten the test duration */
3487 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 1");
3488
3489 /* Reset stats and send paging PS request */
3490 f_tc_paging_ps_from_sgsn(mp_gb_cfg.bvc[0].bvci);
3491
3492 /* Verify that counter increases when T3113 times out (MS did not start
3493 * TBF to respond to paging). */
3494 f_sleep(1.2);
3495 var StatsDExpects expect := {
3496 { name := "TTCN3.bts.0.pch.requests.timeout", mtype := "c", min := 1, max := 1 }
3497 };
3498 f_statsd_expect(expect);
3499
3500 f_vty_config2(PCUVTY, {"pcu"}, "timer T3113 default");
3501 f_shutdown(__BFILE__, __LINE__, final := true);
3502}
3503
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003504/* Verify osmo-pcu handles DL UNIT_DATA from SGSN with IMSI IE correctly. See OS#4729 */
3505testcase TC_bssgp_dl_unitdata_with_valid_imsi() runs on RAW_PCU_Test_CT {
3506 var RlcmacDlBlock dl_block;
3507 var octetstring data := f_rnd_octstring(10);
3508 var uint32_t sched_fn;
3509 var uint32_t dl_fn;
3510 var GprsMS ms;
3511
3512 /* Initialize NS/BSSGP side */
3513 f_init_bssgp();
3514 /* Initialize GPRS MS side */
3515 f_init_gprs_ms();
3516 ms := g_ms[0]; /* We only use first MS in this test */
3517
3518 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003519 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003520
Daniel Willmann535aea62020-09-21 13:27:08 +02003521 f_statsd_reset();
3522
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003523 /* Establish BSSGP connection to the PCU */
3524 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003525 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003526
3527 /* Establish an Uplink TBF */
3528 f_ms_establish_ul_tbf(ms);
3529
3530 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003531 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 +02003532 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3533 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3534 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3535
3536 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003537 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003538
3539 /* Now SGSN sends some DL data, PCU will page on CCCH (PCH) */
3540 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI(ms.imsi)));
3541 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3542
3543 /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
3544 f_sleep(X2002);
3545 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
3546
3547 /* ACK the DL block */
3548 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
3549 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
3550 f_dl_block_ack_fn(dl_block, dl_fn));
3551
Daniel Willmann535aea62020-09-21 13:27:08 +02003552 var StatsDExpects expect := {
3553 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
3554 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 1, max := 1},
3555 { name := "TTCN3.bts.0.tbf.dl.alloc", mtype := "c", min := 1, max := 1},
3556 { name := "TTCN3.bts.0.tbf.ul.alloc", mtype := "c", min := 1, max := 1},
Pau Espin Pedrol0bf74e52020-12-11 19:25:42 +01003557 { name := "TTCN3.bts.0.rlc.dl_payload_bytes", mtype := "c", min := 10, max := 10},
Pau Espin Pedrol599d56b2020-11-17 12:01:46 +01003558 { name := "TTCN3.bts.0.rlc.ul_payload_bytes", mtype := "c", min := 26, max := 26}
Daniel Willmann535aea62020-09-21 13:27:08 +02003559 };
3560 f_statsd_expect(expect);
3561
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003562 f_shutdown(__BFILE__, __LINE__, final := true);
3563}
3564
3565/* Verify osmo-pcu acts on incorrect IMSI IE content in DL UNIT_DATA from SGSN. See OS#4729 */
3566testcase TC_bssgp_dl_unitdata_with_invalid_imsi() runs on RAW_PCU_Test_CT {
3567 var RlcmacDlBlock dl_block;
3568 var octetstring data := f_rnd_octstring(10);
3569 var uint32_t sched_fn;
3570 var uint32_t dl_fn;
3571 var GprsMS ms;
3572
3573 /* Initialize NS/BSSGP side */
3574 f_init_bssgp();
3575 /* Initialize GPRS MS side */
3576 f_init_gprs_ms();
3577 ms := g_ms[0]; /* We only use first MS in this test */
3578
3579 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01003580 f_init_raw(testcasename(), ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003581
3582 /* Establish BSSGP connection to the PCU */
3583 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01003584 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003585
3586 /* Establish an Uplink TBF */
3587 f_ms_establish_ul_tbf(ms);
3588
3589 /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02003590 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 +02003591 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn);
3592 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
3593 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
3594
3595 /* UL block should be received in SGSN */
Harald Welte5339b2e2020-10-04 22:52:56 +02003596 BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003597
3598 /* Now SGSN sends some DL data with an invalid IMSI */
3599 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, imsi := ts_BSSGP_IMSI('1122'H)));
3600
Pau Espin Pedrolf7e947a2021-01-25 18:51:33 +01003601 BSSGP_GLOBAL[0].receive(tr_BSSGP_STATUS(omit, BSSGP_CAUSE_CONDITIONAL_IE_ERROR, ?));
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02003602
3603 /* TODO: make sure no data is sent over PCU -> MS */
3604
3605 f_shutdown(__BFILE__, __LINE__, final := true);
3606}
3607
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003608private function f_tc_dl_data_no_llc_ui_dummy(template (omit) MSRadioAccessCapabilityV_BSSGP ms_racap := omit) runs on RAW_PCU_Test_CT {
3609 var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);
3610 var octetstring data := f_rnd_octstring(6);
3611 var RlcmacDlBlock dl_block;
3612 var GprsMS ms;
3613 var uint32_t fn;
3614
3615 /* Initialize NS/BSSGP side */
3616 f_init_bssgp();
3617 /* Initialize GPRS MS side */
3618 f_init_gprs_ms();
3619 ms := g_ms[0]; /* We only use first MS in this test */
3620
3621 /* Initialize the PCU interface abstraction */
3622 f_init_raw(testcasename());
3623
3624 /* Establish BSSGP connection to the PCU */
3625 f_bssgp_establish();
3626 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
3627
3628 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
3629 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, ms_racap));
3630 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
3631
3632 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
3633 f_sleep(X2002);
3634
3635 /* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
3636 f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
3637
3638 if (ischosen(dl_block.data_egprs)) {
3639 if (lengthof(dl_block.data_egprs.blocks) != 2) {
3640 setverdict(fail, "DL EGPRS block has unexpected number of LLC frames: ", dl_block.data_egprs);
3641 f_shutdown(__BFILE__, __LINE__);
3642 }
3643 if (dl_block.data_egprs.blocks[1].hdr.length_ind != 127) {
3644 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3645 f_shutdown(__BFILE__, __LINE__);
3646 }
3647 if (not match(dl_block.data_egprs.blocks[1].payload,
3648 f_pad_oct(''O, lengthof(dl_block.data_egprs.blocks[1].payload), '2B'O))) {
3649 setverdict(fail, "DL EGPRS block 2nd llc frame is not padding!: ", dl_block.data_egprs);
3650 f_shutdown(__BFILE__, __LINE__);
3651 }
3652 } else if (lengthof(dl_block.data.blocks) > 1) {
3653 setverdict(fail, "DL GPRS block has extra unexpected LLC frames: ", dl_block.data);
3654 f_shutdown(__BFILE__, __LINE__);
3655 }
3656
3657 f_shutdown(__BFILE__, __LINE__, final := true);
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_gprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
3663 f_tc_dl_data_no_llc_ui_dummy(omit);
3664}
3665
3666/* Verify osmo-pcu Doesn't append LLC UI dummy frames to rlcmac blocks
3667 * containing llc data. See OS#4849 */
3668testcase TC_dl_egprs_data_no_llc_ui_dummy() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01003669 f_tc_dl_data_no_llc_ui_dummy(bssgp_ms_racap_egprs_def);
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01003670}
3671
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003672private function f_TC_egprs_pkt_chan_req(in EGPRSPktChRequest req,
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003673 template GsmRrMessage t_imm_ass := ?,
3674 PCUIF_BurstType bt := BURST_TYPE_1)
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003675runs on RAW_PCU_Test_CT {
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003676 var GsmRrMessage rr_msg;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003677 var uint16_t ra11;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003678
3679 ra11 := enc_EGPRSPktChRequest2uint(req);
3680 log("Sending EGPRS Packet Channel Request (", ra11, "): ", req);
3681
Vadim Yanitskiy28d18e12020-05-29 15:25:59 +07003682 rr_msg := f_pcuif_tx_rach_rx_imm_ass(ra := ra11, is_11bit := 1, burst_type := bt);
Vadim Yanitskiy43893902020-05-29 15:21:50 +07003683 if (not match(rr_msg, t_imm_ass)) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003684 setverdict(fail, "Immediate Assignment does not match");
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003685 f_shutdown(__BFILE__, __LINE__);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003686 }
3687
3688 setverdict(pass);
3689}
3690
3691testcase TC_egprs_pkt_chan_req_signalling() runs on RAW_PCU_Test_CT {
3692 var template GsmRrMessage imm_ass;
3693 var template IaRestOctets rest;
3694 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003695 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003696
3697 /* Initialize the PCU interface abstraction */
3698 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003699 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003700
3701 var EGPRSPktChRequest req := {
3702 /* NOTE: other fields are set in the loop */
3703 signalling := { tag := '110011'B }
3704 };
3705
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003706 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003707 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3708 req.signalling.random_bits := ext_ra;
3709
3710 /* For signalling, do we expect Multiblock UL TBF Assignment? */
3711 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3712 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3713 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3714
3715 f_TC_egprs_pkt_chan_req(req, imm_ass);
3716 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003717
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003718 if (mp_osmo_pcu_newer_than_0_9_0) {
3719 var StatsDExpects expect := {
3720 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3721 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3722 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3723 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
3724 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3725 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
3726 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
3727 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3728 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3729 };
3730 f_statsd_expect(expect);
3731 }
3732
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003733 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003734}
3735
3736testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {
3737 var template GsmRrMessage imm_ass;
3738 var template IaRestOctets rest;
3739 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003740 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003741
3742 /* Initialize the PCU interface abstraction */
3743 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003744 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003745
3746 var EGPRSPktChRequest req := {
3747 /* NOTE: other fields are set in the loop */
3748 one_phase := { tag := '0'B }
3749 };
3750
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003751 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003752 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3753 var BIT5 mslot_class := int2bit(f_rnd_int(32), 5);
3754 var BIT2 priority := substr(ext_ra, 0, 2);
3755 var BIT3 rand := substr(ext_ra, 2, 3);
3756
3757 req.one_phase.multislot_class := mslot_class;
3758 req.one_phase.priority := priority;
3759 req.one_phase.random_bits := rand;
3760
3761 /* For one phase access, do we expect Dynamic UL TBF Assignment? */
3762 ul_ass := tr_EgprsUlAssDynamic(ext_ra := ext_ra);
3763 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3764 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3765
3766 f_TC_egprs_pkt_chan_req(req, imm_ass);
3767 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003768
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003769 if (mp_osmo_pcu_newer_than_0_9_0) {
3770 var StatsDExpects expect := {
3771 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3772 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3773 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := num_req, max := num_req },
3774 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3775 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3776 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := num_req, max := num_req },
3777 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
3778 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3779 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3780 };
3781 f_statsd_expect(expect);
3782 }
3783
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003784 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003785}
3786
3787testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {
3788 var template GsmRrMessage imm_ass;
3789 var template IaRestOctets rest;
3790 var template EgprsUlAss ul_ass;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003791 const integer num_req := 6;
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003792
3793 /* Initialize the PCU interface abstraction */
3794 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003795 f_statsd_reset();
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003796
3797 var EGPRSPktChRequest req := {
3798 /* NOTE: other fields are set in the loop */
3799 two_phase := { tag := '110000'B }
3800 };
3801
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003802 for (var integer i := 0; i < num_req; i := i + 1) {
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003803 var BIT5 ext_ra := int2bit(f_rnd_int(32), 5);
3804 var BIT2 priority := substr(ext_ra, 0, 2);
3805 var BIT3 rand := substr(ext_ra, 2, 3);
3806
3807 req.two_phase.priority := priority;
3808 req.two_phase.random_bits := rand;
3809
3810 /* For two phase access, do we expect Multiblock UL TBF Assignment? */
3811 ul_ass := tr_EgprsUlAssMultiblock(ext_ra := ext_ra);
3812 rest := tr_IaRestOctets_EGPRSULAss(ul_ass);
3813 imm_ass := tr_IMM_TBF_ASS(dl := false, rest := rest);
3814
3815 f_TC_egprs_pkt_chan_req(req, imm_ass);
3816 }
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003817
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003818 if (mp_osmo_pcu_newer_than_0_9_0) {
3819 var StatsDExpects expect := {
3820 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3821 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3822 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3823 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := num_req, max := num_req },
3824 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := num_req, max := num_req },
3825 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 0, max := 0 },
3826 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := num_req, max := num_req },
3827 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
3828 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3829 };
3830 f_statsd_expect(expect);
3831 }
3832
Vadim Yanitskiy91f8a092020-05-06 21:41:05 +07003833 f_shutdown(__BFILE__, __LINE__, final := true);
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02003834}
3835
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003836private function f_TC_egprs_pkt_chan_req_reject(bitstring ra11, uint32_t fn,
3837 template IARRestOctets rest := ?,
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003838 PCUIF_BurstType bt := BURST_TYPE_1,
3839 template WaitIndication wi := ?)
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003840runs on RAW_PCU_Test_CT {
3841 var template ReqRefWaitInd tr_ref;
3842 var GsmRrMessage rr_msg;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003843
3844 /* Send RACH.ind with malformed EGPRS Packet Channel Request */
3845 BTS.send(ts_PCUIF_RACH_IND(bts_nr := 0, trx_nr := 0, ts_nr := 0,
3846 ra := bit2int(ra11), is_11bit := 1,
3847 burst_type := bt, fn := fn,
3848 arfcn := 871));
3849
3850 /* Abuse f_pcuif_rx_imm_ass(): wait for Immediate Assignment Reject */
Vadim Yanitskiy7466c332020-05-28 20:41:19 +07003851 rr_msg := f_pcuif_rx_imm_ass(t_imm_ass := tr_IMM_ASS_REJ);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003852
3853 /* Just to have a short-name reference to the actual message */
3854 var ImmediateAssignmentReject iar := rr_msg.payload.imm_ass_rej;
3855
3856 /* Make sure that Request Reference list contains at least one entry
3857 * with our TDMA frame number, and RA is set to 'reserved' value 127. */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003858 tr_ref := tr_ReqRefWaitInd(f_compute_ReqRef(127, fn), wi);
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003859 if (not match(iar.payload, { *, tr_ref, * })) {
3860 setverdict(fail, "Request Reference list does not match");
3861 f_shutdown(__BFILE__, __LINE__);
3862 }
3863
3864 /* Match Feature Indicator (must indicate PS domain) */
3865 if (not match(iar.feature_ind, FeatureIndicator:{?, false, true})) {
3866 setverdict(fail, "Feature Indicator does not match");
3867 f_shutdown(__BFILE__, __LINE__);
3868 }
3869
3870 /* Match IAR Rest Octets */
3871 if (not match(iar.rest_octets, rest)) {
3872 setverdict(fail, "IAR Rest Octets does not match: ",
3873 iar.rest_octets, " vs expected ", rest);
3874 f_shutdown(__BFILE__, __LINE__);
3875 }
3876
3877 setverdict(pass);
3878}
3879
3880/* Verify the contents of RR Immediate Assignment Reject message and its
3881 * Rest Octets sent in response to EGPRS Packet Channel Request (11 bit). */
3882testcase TC_egprs_pkt_chan_req_reject_content() runs on RAW_PCU_Test_CT {
3883 var template IARRestOctets rest;
3884 var BIT5 ext_ra;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003885 const integer num_req := 6;
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003886
3887 /* Initialize the PCU interface abstraction */
3888 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003889 f_statsd_reset();
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003890
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003891 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003892 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3893 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3894
3895 /* Intentionally incorrect message (see table 11.2.5a.2) */
3896 f_TC_egprs_pkt_chan_req_reject('111111'B & ext_ra, 1337 + i, rest);
3897 }
3898
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003899 if (mp_osmo_pcu_newer_than_0_9_0) {
3900 var StatsDExpects expect := {
3901 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3902 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3903 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3904 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3905 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
3906 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
3907 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
3908 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3909 };
3910 f_statsd_expect(expect);
3911 }
3912
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07003913 f_shutdown(__BFILE__, __LINE__, final := true);
3914}
3915
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003916/* At the moment, the IUT does not support any emergency services. Make sure
3917 * that EGPRS Packet Channel Request for an emergency call is properly rejected. */
3918testcase TC_egprs_pkt_chan_req_reject_emergency() runs on RAW_PCU_Test_CT {
3919 var template IARRestOctets rest;
3920 var BIT5 ext_ra;
3921 var BIT11 ra11;
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003922 const integer num_req := 6;
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003923
3924 /* Initialize the PCU interface abstraction */
3925 f_init_raw(testcasename());
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003926 f_statsd_reset();
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003927
3928 var EGPRSPktChRequest req := {
3929 /* NOTE: other fields are set in the loop */
3930 emergency := { tag := '110111'B }
3931 };
3932
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003933 for (var integer i := 0; i < num_req; i := i + 1) {
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003934 ext_ra := int2bit(f_rnd_int(32), 5); /* 5 LSB's of RA11 */
3935 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(ext_ra), * });
3936
3937 req.emergency.random_bits := ext_ra;
3938 ra11 := enc_EGPRSPktChRequest2bits(req);
3939
3940 /* Intentionally incorrect message (see table 11.2.5a.2) */
3941 f_TC_egprs_pkt_chan_req_reject(ra11, 1337 + i, rest);
3942 }
3943
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003944 if (mp_osmo_pcu_newer_than_0_9_0) {
3945 var StatsDExpects expect := {
3946 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := num_req, max := num_req },
3947 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := num_req, max := num_req },
3948 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 0, max := 0 },
3949 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
3950 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := num_req, max := num_req },
3951 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 0, max := 0 },
3952 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := num_req, max := num_req },
3953 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
3954 };
3955 f_statsd_expect(expect);
3956 }
3957
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07003958 f_shutdown(__BFILE__, __LINE__, final := true);
3959}
3960
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003961/* Make sure that IUT responds with RR Immediate Assignment Reject due to exhaustion. */
3962testcase TC_egprs_pkt_chan_req_reject_exhaustion() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003963 var PCUIF_info_ind info_ind;
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003964 var template IARRestOctets rest;
3965 var BIT11 ra11;
3966
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003967 info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003968 info_ind.t3142 := 3;
Vadim Yanitskiyd5321fb2020-10-31 20:23:47 +07003969
3970 /* Only the first TRX is enabled. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01003971 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
3972 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003973
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003974 /* Initialize the PCU interface abstraction */
Pau Espin Pedrol7ebc1122020-10-29 13:33:39 +01003975 f_init_raw(testcasename(), info_ind);
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01003976 f_statsd_reset();
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003977
3978 var EGPRSPktChRequest req := {
3979 one_phase := {
3980 tag := '0'B,
3981 multislot_class := '10101'B,
3982 priority := '01'B,
3983 random_bits := '101'B
3984 }
3985 };
3986
3987 /* We send 7 requests, the IUT gives us all available USFs (0..6).
3988 * TODO: make it configurable: usf_max := mp_pdch_ts_num * 7. */
3989 for (var integer i := 0; i < 7; i := i + 1) {
3990 req.one_phase.random_bits := int2bit(f_rnd_int(8), 3);
3991 f_TC_egprs_pkt_chan_req(req, tr_IMM_TBF_ASS);
3992 }
3993
3994 ra11 := enc_EGPRSPktChRequest2bits(req);
3995 rest := tr_IARRestOctets({ *, tr_ExtRAOpt(substr(ra11, 6, 5)), * });
3996
3997 /* At this point, the IUT should run out of free USFs */
Pau Espin Pedrola5cee4c2021-04-26 13:50:29 +02003998 f_TC_egprs_pkt_chan_req_reject(ra11, 1870, rest, wi := info_ind.t3142);
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07003999
Pau Espin Pedrol023330d2021-11-08 14:10:21 +01004000 if (mp_osmo_pcu_newer_than_0_9_0) {
4001 var StatsDExpects expect := {
4002 { name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 8, max := 8 },
4003 { name := "TTCN3.bts.0.rach.requests.11bit", mtype := "c", min := 8, max := 8 },
4004 { name := "TTCN3.bts.0.rach.requests.one_phase", mtype := "c", min := 8, max := 8 },
4005 { name := "TTCN3.bts.0.rach.requests.two_phase", mtype := "c", min := 0, max := 0 },
4006 { name := "TTCN3.bts.0.rach.requests.unexpected", mtype := "c", min := 0, max := 0 },
4007 { name := "TTCN3.bts.0.immediate.assignment_UL", mtype := "c", min := 7, max := 7 },
4008 { name := "TTCN3.bts.0.immediate.assignment_ul.one_phase", mtype := "c", min := 7, max := 7 },
4009 { name := "TTCN3.bts.0.immediate.assignment_ul.two_phase", mtype := "c", min := 0, max := 0 },
4010 { name := "TTCN3.bts.0.immediate.assignment_ul.contention_resolution_success", mtype := "c", min := 0, max := 0 },
4011 { name := "TTCN3.bts.0.immediate.assignment_rej", mtype := "c", min := 1, max := 1 },
4012 { name := "TTCN3.bts.0.immediate.assignment_DL", mtype := "c", min := 0, max := 0 }
4013 };
4014 f_statsd_expect(expect);
4015 }
4016
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07004017 f_shutdown(__BFILE__, __LINE__, final := true);
4018}
4019
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004020/* Randomly generate a set of hopping parameters for one timeslot */
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004021private function f_TC_pcuif_fh_params_gen(integer max_ma_len)
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004022return template (value) PCUIF_InfoTrxTs {
Vadim Yanitskiy7a04cdd2020-09-07 11:43:32 +07004023 /* Pick a random MA length in range 2 .. max_ma_len */
4024 var integer ma_len := 2 + f_rnd_int(max_ma_len - 2);
4025
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004026 return ts_PCUIF_InfoTrxTsH1(tsc := f_rnd_int(7),
4027 hsn := f_rnd_int(63),
4028 maio := f_rnd_int(63),
4029 ma := f_rnd_bitstring(ma_len));
4030}
4031
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004032private function f_TC_pcuif_fh_check_imm_ass(in PCUIF_info_ind info_ind,
4033 in GsmRrMessage rr_msg)
4034{
4035 var ImmediateAssignment ia := rr_msg.payload.imm_ass;
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004036 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[ia.pkt_chan_desc.tn];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004037
4038 var template PacketChannelDescription tr_pkt_chan_desc := {
4039 channel_Type_spare := ?,
4040 tn := ?,
4041 tsc := ts.tsc,
4042 presence := '1'B,
4043 zero := omit,
4044 one := {
4045 maio := ts.maio,
4046 hsn := ts.hsn
4047 }
4048 };
4049
4050 if (not match(ia.pkt_chan_desc, tr_pkt_chan_desc)) {
4051 setverdict(fail, "Packet Channel Description does not match: ",
4052 ia.pkt_chan_desc, " vs ", tr_pkt_chan_desc);
4053 }
4054
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004055 /* Mobile Allocation is expected to be octet-aligned */
4056 var uint8_t ma_oct_len := (ts.ma_bit_len + 8 - 1) / 8;
4057 var template MobileAllocationLV tr_ma := {
4058 len := ma_oct_len, /* in bytes */
4059 ma := substr(ts.ma, 0, ma_oct_len * 8)
4060 };
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004061
4062 if (not match(ia.mobile_allocation, tr_ma)) {
4063 setverdict(fail, "Mobile Allocation does not match: ",
4064 ia.mobile_allocation, " vs ", tr_ma);
4065 }
4066
4067 setverdict(pass);
4068}
4069
4070/* Make sure that Immediate (UL EGPRS TBF) Assignment contains hopping parameters */
4071testcase TC_pcuif_fh_imm_ass_ul_egprs() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004072 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004073 var GprsMS ms := valueof(t_GprsMS_def);
4074
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004075 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004076 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004077
4078 /* Initialize the PCU interface abstraction */
4079 f_init_raw(testcasename(), info_ind);
4080
4081 /* EGPRS Packet Channel Request (cause=Signalling) */
4082 f_ms_use_ra(ms, bit2int('11001101010'B), ra_is_11bit := 1);
4083
4084 /* Establish an Uplink EGPRS TBF */
4085 f_ms_establish_ul_tbf(ms);
4086
4087 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4088 f_shutdown(__BFILE__, __LINE__, final := true);
4089}
4090
4091/* Make sure that Immediate (UL TBF) Assignment contains hopping parameters */
4092testcase TC_pcuif_fh_imm_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004093 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004094 var GprsMS ms := valueof(t_GprsMS_def);
4095
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004096 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004097 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(32);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004098
4099 /* Initialize the PCU interface abstraction */
4100 f_init_raw(testcasename(), info_ind);
4101
4102 /* Establish an Uplink TBF */
4103 f_ms_establish_ul_tbf(ms);
4104
4105 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.ul_tbf.rr_imm_ass);
4106 f_shutdown(__BFILE__, __LINE__, final := true);
4107}
4108
4109/* Make sure that Immediate (DL TBF) Assignment contains hopping parameters */
4110testcase TC_pcuif_fh_imm_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004111 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004112 var GprsMS ms := valueof(t_GprsMS_def);
4113
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004114 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004115 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(16);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004116
4117 /* Initialize NS/BSSGP side */
4118 f_init_bssgp();
4119
4120 /* Initialize the PCU interface abstraction */
4121 f_init_raw(testcasename(), info_ind);
4122
4123 /* Establish BSSGP connection to the PCU */
4124 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004125 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004126
4127 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
4128 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, f_rnd_octstring(12)));
4129 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
4130
4131 f_TC_pcuif_fh_check_imm_ass(valueof(info_ind), ms.dl_tbf.rr_imm_ass);
4132 f_shutdown(__BFILE__, __LINE__, final := true);
4133}
4134
4135private function f_TC_pcuif_fh_check_pkt_ass(in PCUIF_info_ind info_ind,
4136 in FrequencyParameters fp)
4137{
4138 /* FIXME: TRX0/TS7 is a hard-coded expectation, make it configurable */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004139 var PCUIF_InfoTrxTs ts := info_ind.trx[0].ts[7];
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004140
4141 /* Table 12.8.1: Frequency Parameters information elements */
4142 var template FrequencyParameters tr_fp := {
4143 tsc := ts.tsc,
4144 presence := '10'B, /* Direct encoding 1 */
4145 arfcn := omit,
4146 indirect := omit,
4147 direct1 := {
4148 maio := ts.maio,
4149 /* Table 12.10a.1: GPRS Mobile Allocation information elements */
4150 mobile_allocation := {
4151 hsn := ts.hsn,
4152 rfl_number_list_present := '0'B,
4153 rfl_number_list := omit,
4154 ma_present := '0'B, /* inverted logic */
Vadim Yanitskiy43ccaf52020-09-05 21:35:13 +07004155 ma_length := ts.ma_bit_len,
4156 ma_bitmap := substr(ts.ma, 0, ts.ma_bit_len)
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004157 }
4158 },
4159 direct2 := omit
4160 };
4161
4162 if (not match(fp, tr_fp)) {
4163 setverdict(fail, "Frequency Parameters IE does not match: ",
4164 fp, " vs ", tr_fp);
4165 }
4166
4167 setverdict(pass);
4168}
4169
4170/* Make sure that Packet Uplink Assignment contains hopping parameters */
4171testcase TC_pcuif_fh_pkt_ass_ul() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004172 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004173 var GprsMS ms := valueof(t_GprsMS_def);
4174 var uint32_t poll_fn;
4175
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004176 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004177 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004178
4179 /* Initialize the PCU interface abstraction */
4180 f_init_raw(testcasename(), info_ind);
4181
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004182 /* Single block (two phase) packet access */
4183 var uint16_t ra := bit2int(chan_req_sb);
4184 f_ms_use_ra(ms, ra, ra_is_11bit := 0);
4185
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004186 /* Establish an Uplink TBF */
4187 f_ms_establish_ul_tbf(ms);
4188
4189 /* Send Packet Resource Request, so the network will allocate an Uplink resource */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004190 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, omit)),
4191 fn := ms.ul_tbf.start_time_fn);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004192
4193 /* Expect an RLC/MAC block with Packet Uplink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004194 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_UL_PACKET_ASS);
4195 var PacketUlAssignment ua := ms.ul_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004196
4197 /* 3GPP TS 44.060, section 12.8 "Frequency Parameters" */
4198 var template (omit) FrequencyParameters fp;
4199 if (ua.is_egprs == '1'B) {
4200 fp := ua.egprs.freq_par;
4201 } else {
4202 fp := ua.gprs.freq_par;
4203 }
4204
4205 /* This is an optional IE, so it's worth to check its presence */
4206 if (istemplatekind(fp, "omit")) {
4207 setverdict(fail, "Frequency Parameters IE is not present");
4208 f_shutdown(__BFILE__, __LINE__);
4209 }
4210
4211 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), valueof(fp));
4212 f_shutdown(__BFILE__, __LINE__, final := true);
4213}
4214
4215/* Make sure that Packet Downlink Assignment contains hopping parameters */
4216testcase TC_pcuif_fh_pkt_ass_dl() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004217 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004218 var octetstring data := f_rnd_octstring(10);
4219 var GprsMS ms := valueof(t_GprsMS_def);
4220 var RlcmacDlBlock dl_block;
4221 var uint32_t poll_fn;
4222
Vadim Yanitskiyef0c1b52020-09-05 21:32:18 +07004223 /* Enable frequency hopping on TRX0/TS7 */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004224 info_ind.trx[0].ts[7] := f_TC_pcuif_fh_params_gen(33);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004225
4226 /* Initialize NS/BSSGP side */
4227 f_init_bssgp();
4228
4229 /* Initialize the PCU interface abstraction */
4230 f_init_raw(testcasename(), info_ind);
4231
4232 /* Establish BSSGP connection to the PCU */
4233 f_bssgp_establish();
Pau Espin Pedrol7b761e22021-01-11 14:43:35 +01004234 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004235
4236 /* Establish an Uplink TBF */
4237 f_ms_establish_ul_tbf(ms);
4238
4239 /* Send an Uplink block, so this TBF becomes "active" */
Pau Espin Pedroldee55702021-04-23 21:08:22 +02004240 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 +07004241
4242 /* DL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4243 f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn);
4244 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), poll_fn);
4245
4246 /* SGSN sends some DL data, PCU will assign Downlink resource on PACCH */
4247 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
4248
4249 /* Expect an RLC/MAC block with Packet Downlink Assignment on PACCH (see 11.2.29) */
Pau Espin Pedrol46e36042020-10-29 21:27:43 +01004250 f_ms_rx_pkt_ass_pacch(ms, poll_fn, tr_RLCMAC_DL_PACKET_ASS);
4251 var PacketDlAssignment da := ms.dl_tbf.ass.pacch;
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07004252
4253 /* This is an optional IE, so it's worth to check its presence */
4254 if (not ispresent(da.freq_par)) {
4255 setverdict(fail, "Frequency Parameters IE is not present");
4256 f_shutdown(__BFILE__, __LINE__);
4257 }
4258
4259 f_TC_pcuif_fh_check_pkt_ass(valueof(info_ind), da.freq_par);
4260 f_shutdown(__BFILE__, __LINE__, final := true);
4261}
4262
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004263/* Check if the IUT handles subsequent INFO.ind messages */
4264testcase TC_pcuif_info_ind_subsequent() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01004265 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004266 var BTS_PDTCH_Block data_msg;
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004267
4268 /* Initialize the PCU interface abstraction */
4269 f_init_raw(testcasename(), info_ind);
4270
4271 /* Send 16 conseqtive INFO.ind messages and check that the IUT stays alive */
4272 for (var integer i := 0; i < 16; i := i + 1) {
4273 BTS.send(ts_PCUIF_INFO_IND(0, info_ind));
Pau Espin Pedrolb34bb062021-01-19 18:58:07 +01004274 f_pcuif_rx_data_req_pdtch(data_msg);
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07004275 }
4276
4277 f_shutdown(__BFILE__, __LINE__, final := true);
4278}
4279
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004280/* Verify allocation of several MS along PDCH ts of several TRX. See OS#1775, SYS#5030 */
4281testcase TC_multitrx_multims_alloc() runs on RAW_PCU_Test_CT {
4282 var PCUIF_info_ind info_ind;
4283 var integer i;
4284 const integer num_ms := 8;
4285
4286 /* Initialize NS/BSSGP side */
4287 f_init_bssgp();
4288 /* Initialize GPRS MS side */
4289 f_init_gprs_ms(num_ms);
4290
Pau Espin Pedrol745a48b2020-10-30 15:31:07 +01004291 info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS));
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004292 /* Only the 3 first TRX are enabled. The enabled ones all have same
4293 amount of resources, hence same amount of initial resources. */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004294 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (3 .. 7));
4295 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
4296 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
4297 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004298
4299 /* Initialize the PCU interface abstraction */
4300 f_init_raw(testcasename(), info_ind);
4301
4302 /* Establish BSSGP connection to the PCU */
4303 f_bssgp_establish();
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004304 f_multi_ms_bssgp_register();
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004305
Vadim Yanitskiy8a02b922020-10-31 21:57:10 +07004306 /* Establish an Uplink TBF for each GprsMS instance */
4307 f_multi_ms_establish_tbf(do_activate := false);
4308
4309 /* Check if all TBFs are allocated on different TRX in an uniform way */
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004310 for (i := 0; i < num_ms; i := i + 1) {
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004311 if (g_ms[i].ul_tbf.arfcn != info_ind.trx[i mod 3].arfcn) {
Pau Espin Pedrolb20b7e52020-10-28 21:28:45 +01004312 setverdict(fail, "Got assigned ARFCN ", g_ms[i].ul_tbf.arfcn,
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004313 " vs exp ", info_ind.trx[i mod 3].arfcn);
Pau Espin Pedrolbfd69f62020-10-22 18:06:07 +02004314 f_shutdown(__BFILE__, __LINE__);
4315 }
4316 }
4317
4318 f_shutdown(__BFILE__, __LINE__, final := true);
4319}
4320
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004321/* Verify concurrent PDCH use of EGPRS and GPRS (EGPRS dl rlcmac blk is
4322 * downgraded to CS1-4 so that GPRS can read the USF).
4323 * See 3GPP TS 44.060 5.2.4a "Multiplexing of GPRS, EGPRS and EGPRS2 capable mobile stations"
4324 */
4325testcase TC_multiplex_dl_gprs_egprs() runs on RAW_PCU_Test_CT {
4326 var PCUIF_info_ind info_ind;
4327 const integer num_ms := 2; /* 2 MS, first one is GPRS-only, second one is EGPRS */
4328 var PollFnCtx pollctx;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004329 var uint32_t sched_fn, dl_fn, ack_fn;
4330 var octetstring data := f_rnd_octstring(10);
4331 var RlcmacDlBlock dl_block;
4332 var integer tx_data_remain := 5;
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004333 var integer tgt_ms, usf_ms;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004334 var integer ms_gprs_usf_count[num_ms] := { 0, 0 };
4335 var integer ms_egprs_usf_count[num_ms] := { 0, 0 };
4336
4337 /* Initialize NS/BSSGP side */
4338 f_init_bssgp();
4339 /* Initialize GPRS MS side */
4340 f_init_gprs_ms(num_ms);
4341
4342 info_ind := valueof(ts_PCUIF_INFO_default);
4343 /* Only use 1 PDCH to make sure both end up in the same slot: */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004344 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
4345 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7));
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004346
4347 /* Initialize the PCU interface abstraction */
4348 f_init_raw(testcasename(), info_ind);
4349
4350 /* Set Initial MCS > 4 and maintain it non-variable to simplify test */
4351 g_mcs_initial_dl := 5;
4352 g_mcs_max_dl := 5;
4353 f_pcuvty_set_allowed_cs_mcs();
4354
4355 /* Establish BSSGP connection to the PCU */
4356 f_bssgp_establish();
4357 f_multi_ms_bssgp_register();
4358
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004359 /* Establish UL TBF for MS0 (GPRS-only) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004360 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 +01004361 if (not match(g_ms[0].ul_tbf.tx_cs_mcs, cs_gprs_any)) {
4362 setverdict(fail, "Wrong CS_MCS ", g_ms[0].ul_tbf.tx_cs_mcs, " received vs exp ", cs_gprs_any);
4363 f_shutdown(__BFILE__, __LINE__);
4364 }
4365 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4366 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4367
4368 /* Establish UL TBF for MS1 (EGPRS) */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004369 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 +01004370 if (not match(g_ms[1].ul_tbf.tx_cs_mcs, mcs_egprs_any)) {
4371 setverdict(fail, "Wrong CS_MCS ", g_ms[1].ul_tbf.tx_cs_mcs, " received vs exp ", mcs_egprs_any);
4372 f_shutdown(__BFILE__, __LINE__);
4373 }
4374 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4375 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), pollctx.fn, nr := pollctx.tstrxbts);
4376
4377 /* Now SGSN sends some DL data to MS0, PCU will assign a GPRS DL TBF on PACCH */
4378 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4379 f_sleep(0.1);
4380 f_ms_rx_pkt_ass_pacch(g_ms[0], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4381 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4382 f_ms_tx_ul_block(g_ms[0], ts_RLCMAC_CTRL_ACK(g_ms[0].tlli), sched_fn);
4383 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4384 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, cs_gprs_any);
4385 /* ACK the DL block */
4386 f_dltbf_ack_block(g_ms[0].dl_tbf, dl_block, '0'B);
4387 f_ms_tx_ul_block(g_ms[0], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[0].dl_tbf, false),
4388 f_dl_block_ack_fn(dl_block, dl_fn));
4389
4390 /* Now SGSN sends some DL data to MS1, PCU will assign a EGPRS DL TBF on PACCH */
4391 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4392 f_sleep(0.1);
4393 f_ms_rx_pkt_ass_pacch(g_ms[1], sched_fn, tr_RLCMAC_DL_PACKET_ASS);
4394 /* DL Ass sets poll+rrbp requesting PACKET CONTROL ACK */
4395 f_ms_tx_ul_block(g_ms[1], ts_RLCMAC_CTRL_ACK(g_ms[1].tlli), sched_fn);
4396 /* After acking the dl assignment, dl tbf goes into FLOW state and PCU will provide DL data when BTS asks for it */
4397 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, mcs_egprs_any);
4398 /* ACK the DL block */
4399 f_dltbf_ack_block(g_ms[1].dl_tbf, dl_block, '0'B);
4400 f_ms_tx_ul_block(g_ms[1], f_dltbf_ts_RLCMAC_DL_ACK_NACK(g_ms[1].dl_tbf, true),
4401 f_dl_block_ack_fn(dl_block, dl_fn));
4402
4403 data := f_rnd_octstring(1400);
4404 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4405 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4406
4407 for (var integer i := 0; i < 800; i := i + 1) {
4408 f_rx_rlcmac_dl_block(dl_block, dl_fn);
4409
4410 if (match(dl_block, tr_RLCMAC_DUMMY_CTRL)) {
4411 /* No more data to receive, done */
4412 break;
4413 }
4414
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004415 usf_ms := -1;
4416
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004417 if (ischosen(dl_block.ctrl)) {
4418 setverdict(fail, "Unexpected DL CTRL block ", dl_block);
4419 f_shutdown(__BFILE__, __LINE__);
4420 } else if (ischosen(dl_block.data_egprs)) {
4421 if (not match(dl_block.data_egprs.mac_hdr.tfi, g_ms[1].dl_tbf.tfi)) {
4422 setverdict(fail, "EGPRS DL DATA not matching EGPRS MS TFI (", g_ms[1].dl_tbf.tfi, "): ", dl_block.data_egprs.mac_hdr.tfi);
4423 f_shutdown(__BFILE__, __LINE__);
4424 }
4425 tgt_ms := 1;
4426 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[0].ul_tbf.usf[7])) {
4427 if (dl_block.data_egprs.mcs > MCS_4) {
4428 setverdict(fail, "Signalling USF ", dl_block.data_egprs.mac_hdr.usf, " for GPRS-only MS using MCS > 4: ", dl_block);
4429 f_shutdown(__BFILE__, __LINE__);
4430 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004431 usf_ms := 0;
4432 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004433 } else {
4434 if (dl_block.data_egprs.mcs <= MCS_4) {
4435 setverdict(fail, "Using too-low MCS for EGPRS MS: ", dl_block.data_egprs.mcs);
4436 f_shutdown(__BFILE__, __LINE__);
4437 }
4438 if (match(dl_block.data_egprs.mac_hdr.usf, g_ms[1].ul_tbf.usf[7])) {
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004439 usf_ms := 1;
4440 ms_egprs_usf_count[usf_ms] := ms_egprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004441 }
4442 }
4443 } else {
4444 if (not match(dl_block.data.mac_hdr.hdr_ext.tfi, g_ms[0].dl_tbf.tfi)) {
4445 setverdict(fail, "GPRS DL DATA not matching GPRS MS TFI (", g_ms[0].dl_tbf.tfi, "): ", dl_block.data.mac_hdr.hdr_ext.tfi);
4446 f_shutdown(__BFILE__, __LINE__);
4447 }
4448 tgt_ms := 0;
4449 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 +01004450 usf_ms := 0;
4451 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004452 } 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 +01004453 usf_ms := 1;
4454 ms_gprs_usf_count[usf_ms] := ms_gprs_usf_count[usf_ms] + 1;
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004455 }
4456 }
4457
4458 /* Keep Ack/Nack description updated */
4459 f_dltbf_ack_block(g_ms[tgt_ms].dl_tbf, dl_block);
4460
4461 /* TDMA frame number on which we are supposed to send the ACK */
4462 if (f_dl_block_rrbp_valid(dl_block)) {
4463 ack_fn := f_dl_block_ack_fn(dl_block, dl_fn);
4464 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);
4465 if (tx_data_remain != 0) {
4466 /* Submit more data from time to time to keep the TBF ongoing */
4467 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[0].tlli, data));
4468 BSSGP[0].send(ts_BSSGP_DL_UD(g_ms[1].tlli, data));
4469 tx_data_remain := tx_data_remain - 1;
4470 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004471 } else if (tx_data_remain != 0) {
4472 /* keep sending UL blocks when requested by USF to avoid
4473 * UL TBF timeout and hence stop receival of USFs */
4474 if (usf_ms != -1) {
4475 f_ms_tx_ul_data_block(g_ms[usf_ms], f_rnd_octstring(10), cv := 15);
4476 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004477 }
4478 }
4479
4480 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 +01004481 /* He we check that DL blocks scheduled at GPRS can still request UL
4482 * blocks for EGPRS MS, and the other way around. Furthermore, the 2nd
4483 * condition also ensures the downgrade to <=MCS4 condition is tested
4484 * above */
4485 if (ms_gprs_usf_count[1] == 0 or ms_egprs_usf_count[0] == 0) {
4486 setverdict(fail, "USF exchange thresholds not met!");
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004487 f_shutdown(__BFILE__, __LINE__);
4488 }
Pau Espin Pedrol4ceb61c2021-03-24 18:03:42 +01004489 /* Here check for some level of fairness between them (at least ~40%): */
4490 var integer gprs_usf_cnt := ms_gprs_usf_count[0] + ms_egprs_usf_count[0];
4491 var integer egprs_usf_cnt := ms_gprs_usf_count[1] + ms_egprs_usf_count[1];
4492 var integer total_usf_cnt := gprs_usf_cnt + egprs_usf_cnt;
4493 if (gprs_usf_cnt < total_usf_cnt * 4 / 10) {
4494 setverdict(fail, "USF GPRS-only MS ", gprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4495 f_shutdown(__BFILE__, __LINE__);
4496 }
4497 if (egprs_usf_cnt < total_usf_cnt * 4 / 10) {
4498 setverdict(fail, "USF EGPRS MS ", egprs_usf_cnt, " < ", total_usf_cnt * 4 / 10);
4499 f_shutdown(__BFILE__, __LINE__);
4500 }
Pau Espin Pedrole1303052020-11-16 11:13:51 +01004501
4502 f_shutdown(__BFILE__, __LINE__, final := true);
4503}
4504
4505
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004506private function f_TC_paging_cs_multi_ms(template (value) TsTrxBtsNum nr,
4507 boolean exp_imsi, boolean exp_tmsi)
4508runs on RAW_PCU_Test_CT {
4509 var bitstring mask := f_pad_bit(''B, lengthof(g_ms), '0'B);
4510 var integer pending := lengthof(g_ms);
4511 var RlcmacDlBlock dl_block;
4512 var boolean f1, f2;
4513
4514 while (pending > 0) {
4515 var uint32_t poll_fn;
4516
4517 /* Obtain a Downlink block and make sure it is a paging request */
4518 f_rx_rlcmac_dl_block(dl_block, poll_fn, nr := nr);
4519 if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ)) {
4520 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4521 break;
4522 }
4523
4524 /* This should not happen in general, but who knows... */
4525 var PacketPagingReq req := dl_block.ctrl.payload.u.paging;
4526 if (not ispresent(req.repeated_pageinfo)) {
4527 setverdict(fail, "Repeated Page Info IE is absent?!?");
4528 break;
4529 }
4530
4531 /* A single message may contain several MIs depending on their type */
4532 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4533 f1 := exp_imsi and f_pkt_paging_match_imsi(req, g_ms[i].imsi,
4534 ps_domain := false);
4535 f2 := exp_tmsi and f_pkt_paging_match_tmsi(req, oct2int(g_ms[i].tlli),
4536 ps_domain := false);
4537 if (not f1 and not f2)
4538 { continue; }
4539
4540 /* Detect duplicate MIs */
4541 if (mask[i] == '1'B) {
4542 setverdict(fail, "MS is paged twice: ", g_ms[i].imsi);
4543 continue;
4544 }
4545
4546 mask[i] := '1'B;
4547 }
4548
4549 pending := pending - lengthof(req.repeated_pageinfo);
4550 }
4551
4552 for (var integer i := 0; i < lengthof(mask); i := i + 1) {
4553 if (mask[i] != '1'B) {
4554 setverdict(fail, "MS was not paged at all: ", g_ms[i].imsi);
4555 log("===== mask := ", mask);
4556 }
4557 }
4558
4559 /* All messages must have been received by now, expect a dummy block */
4560 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := nr);
4561}
4562
4563private function f_TC_paging_cs_multi_ms_init(BIT8 pdch_mask)
4564runs on RAW_PCU_Test_CT {
4565 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
4566 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4567
4568 /* Initialize NS/BSSGP side */
4569 f_init_bssgp();
4570
4571 /* Explicitly set the given PDCH slot-mask to all transceivers */
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01004572 f_PCUIF_PDCHMask_set(info_ind, pdch_mask);
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07004573
4574 /* Allocate 56 GprsMS instances (maximum for 8 PDCH slots) */
4575 f_init_gprs_ms(7 * 8);
4576
4577 /* Initialize the PCU interface abstraction */
4578 f_init_raw(testcasename(), info_ind);
4579
4580 /* Establish BSSGP connection to the PCU */
4581 f_bssgp_establish();
4582 f_multi_ms_bssgp_register();
4583
4584 /* Establish an Uplink TBF for each GprsMS instance */
4585 f_multi_ms_establish_tbf(do_activate := true);
4586}
4587
4588testcase TC_paging_cs_multi_ms_imsi() runs on RAW_PCU_Test_CT {
4589 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4590
4591 /* Common part: send INFO.ind, establish TBFs... */
4592 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4593
4594 /* Enqueue multiple CS PAGING requests at a time (IMSI only) */
4595 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4596 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4597 }
4598
4599 /* FIXME: work around a race condition between PCUIF and BSSGP */
4600 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4601
4602 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4603 * The IUT is expected to page on all PDCH slots of all transceivers. */
4604 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4605 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4606 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := false);
4607 }
4608
4609 f_shutdown(__BFILE__, __LINE__, final := true);
4610}
4611
4612testcase TC_paging_cs_multi_ms_tmsi() runs on RAW_PCU_Test_CT {
4613 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4614
4615 /* Common part: send INFO.ind, establish TBFs... */
4616 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4617
4618 /* Enqueue multiple CS PAGING requests at a time (P-TMSI only) */
4619 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4620 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4621 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4622 }
4623
4624 /* FIXME: work around a race condition between PCUIF and BSSGP */
4625 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4626
4627 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4628 * The IUT is expected to page on all PDCH slots of all transceivers. */
4629 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4630 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4631 f_TC_paging_cs_multi_ms(nr, exp_imsi := false, exp_tmsi := true);
4632 }
4633
4634 f_shutdown(__BFILE__, __LINE__, final := true);
4635}
4636
4637testcase TC_paging_cs_multi_ms_imsi_tmsi() runs on RAW_PCU_Test_CT {
4638 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
4639
4640 /* Common part: send INFO.ind, establish TBFs... */
4641 f_TC_paging_cs_multi_ms_init(pdch_mask := '00000001'B);
4642
4643 /* Enqueue multiple CS PAGING requests at a time (IMSI & P-TMSI) */
4644 for (var integer i := 0; i < lengthof(g_ms); i := i + 1) {
4645 var GsmTmsi tmsi := oct2int(g_ms[i].tlli); /* P-TMSI == TLLI */
4646 if (i mod 3 == 0) { /* One PDU fits: 1 IMSI and 2 P-TMSI MIs */
4647 BSSGP[0].send(ts_BSSGP_CS_PAGING_PTMSI(bvci, g_ms[i].imsi, tmsi));
4648 } else {
4649 BSSGP[0].send(ts_BSSGP_CS_PAGING_IMSI(bvci, g_ms[i].imsi));
4650 }
4651 }
4652
4653 /* FIXME: work around a race condition between PCUIF and BSSGP */
4654 f_sleep(0.2); /* i.e. give the IUT some time to process everything */
4655
4656 /* Check what the IUT sends on PACCH, all GprsMS instances must be paged.
4657 * The IUT is expected to page on all PDCH slots of all transceivers. */
4658 for (var integer trx_nr := 0; trx_nr < 8; trx_nr := trx_nr + 1) {
4659 var template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum(7, trx_nr);
4660 f_TC_paging_cs_multi_ms(nr, exp_imsi := true, exp_tmsi := true);
4661 }
4662
4663 f_shutdown(__BFILE__, __LINE__, final := true);
4664}
4665
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004666private function f_skip_dummy(integer max_num_iter, out uint32_t sched_fn)
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004667runs on RAW_PCU_Test_CT return RlcmacDlBlock {
4668 var RlcmacDlBlock dl_block;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004669 var integer i := 0;
4670 while (true) {
4671 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4672 if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {
4673 break;
4674 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004675 if (max_num_iter > 0 and i > max_num_iter) {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004676 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4677 f_shutdown(__BFILE__, __LINE__);
4678 }
4679 i := i + 1;
4680 }
4681 return dl_block;
4682}
4683
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004684private function f_outbound_nacc_rim_tx_resp(PCUIF_info_ind info_ind)
4685runs on RAW_PCU_Test_CT {
4686 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),
4687 info_ind.lac),
4688 info_ind.rac),
4689 info_ind.cell_id));
4690 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4691 423),
4692 2),
4693 5));
4694 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4695 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4696 var template (value) RAN_Information_RIM_Container res_cont :=
4697 ts_RAN_Information_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
4698 ts_RIM_Sequence_Number(2),
4699 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
4700 ts_RIM_Protocol_Version_Number(1),
4701 tsu_ApplContainer_or_ApplErrContainer_NACC(tsu_ApplContainer_NACC(dst, false, 3, si_default)),
4702 omit);
4703 RIM.send(ts_PDU_BSSGP_RAN_INFORMATION(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4704 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4705 res_cont));
4706}
4707
4708altstep as_outbound_nacc_rim_resolve(PCUIF_info_ind info_ind, boolean do_answer := true, boolean do_repeat := false)
4709runs on RAW_PCU_Test_CT {
4710 /* RIM procedure: */
4711 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),
4712 info_ind.lac),
4713 info_ind.rac),
4714 info_ind.cell_id));
4715 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
4716 423),
4717 2),
4718 5));
4719 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src));
4720 var RIM_Routing_Address dst_addr := valueof(t_RIM_Routing_Address_cid(dst));
4721 [] RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
4722 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
4723 tr_RAN_Information_Request_RIM_Container)) {
4724 if (do_answer) {
4725 f_outbound_nacc_rim_tx_resp(info_ind);
4726 }
4727 if (do_repeat) {
4728 repeat;
4729 }
4730 }
4731}
4732
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004733private function f_handle_nacc_rac_ci_query(PCUIF_info_ind info_ind, GsmArfcn req_arfcn, uint6_t req_bsic,
4734 boolean answer := true, boolean use_old_ctrl_iface := false)
4735runs on RAW_PCU_Test_CT {
4736 if (use_old_ctrl_iface == true) {
4737 f_ipa_ctrl_wait_link_up();
4738 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
4739 int2str(info_ind.lac) & "." &
4740 int2str(info_ind.cell_id) & "." &
4741 int2str(req_arfcn) & "." &
4742 int2str(req_bsic);
4743 if (answer) {
4744 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "023-43-423-2-5");
4745 } else {
4746 f_ctrl_exp_get(IPA_CTRL, ctrl_var, omit);
4747 }
4748 } else {
4749 var PCUIF_Message pcu_msg;
4750 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
4751 if (answer) {
4752 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
4753 }
4754 }
4755}
4756
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004757/* Start NACC from MS side */
4758private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004759 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004760 boolean skip_final_ctrl_ack := false,
4761 boolean use_old_ctrl_iface := false)
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004762runs on RAW_PCU_Test_CT {
4763 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4764 var RlcmacDlBlock dl_block;
4765 var uint32_t sched_fn;
4766 var GsmArfcn req_arfcn := 862;
4767 var uint6_t req_bsic := 43;
4768
4769 /* Start NACC from MS side */
4770 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
4771 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
4772
4773 if (exp_rac_ci_query == true) {
4774 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004775 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 +01004776 }
4777
4778 if (exp_si_query == true) {
4779 /* RIM procedure: */
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01004780 as_outbound_nacc_rim_resolve(info_ind);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004781 }
4782
4783 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01004784 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004785
4786 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
4787 f_rx_rlcmac_dl_block(dl_block, sched_fn);
4788 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4789 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4790 f_shutdown(__BFILE__, __LINE__);
4791 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004792 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004793 if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
Pau Espin Pedrola846e612021-02-01 19:25:25 +01004794 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4795 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4796 }
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004797}
4798
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004799/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
4800testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004801 var PollFnCtx pollctx;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004802 var GprsMS ms;
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004803 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004804 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004805
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004806 if (use_old_ctrl_iface) {
4807 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4808 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4809 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004810
4811 /* Initialize NS/BSSGP side */
4812 f_init_bssgp();
4813 /* Initialize GPRS MS side */
4814 f_init_gprs_ms();
4815 ms := g_ms[0]; /* We only use first MS in this test */
4816
4817 /* Initialize the PCU interface abstraction */
4818 f_init_raw(testcasename(), info_ind);
4819
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004820 /* Make sure we are not affected by full cache from previous tests */
4821 f_pcuvty_flush_neigh_caches();
4822
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004823 /* Establish BSSGP connection to the PCU */
4824 f_bssgp_establish();
4825 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4826
4827 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004828 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 +01004829 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4830 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4831
4832 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004833 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004834
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004835 f_shutdown(__BFILE__, __LINE__, final := true);
4836}
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004837
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004838/* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
4839testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
4840 var PollFnCtx pollctx;
4841 var GprsMS ms;
4842 var RlcmacDlBlock dl_block;
4843 var uint32_t sched_fn;
4844 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004845 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004846
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004847 if (use_old_ctrl_iface) {
4848 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4849 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4850 }
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01004851
4852 /* Initialize NS/BSSGP side */
4853 f_init_bssgp();
4854 /* Initialize GPRS MS side */
4855 f_init_gprs_ms();
4856 ms := g_ms[0]; /* We only use first MS in this test */
4857
4858 /* Initialize the PCU interface abstraction */
4859 f_init_raw(testcasename(), info_ind);
4860
4861 /* Make sure we are not affected by full cache from previous tests */
4862 f_pcuvty_flush_neigh_caches();
4863
4864 /* Establish BSSGP connection to the PCU */
4865 f_bssgp_establish();
4866 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4867
4868 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004869 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 +01004870 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4871 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4872
4873 /* Start NACC from MS side, avoid sending final CTRL ACK */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004874 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 +01004875
4876 /* Wait until we receive something non-dummy */
4877 dl_block := f_skip_dummy(0, sched_fn);
4878 /* Make sure it is a Pkt Cell Chg Continue (retransmitted)*/
4879 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
4880 setverdict(fail, "Rx unexpected DL block: ", dl_block);
4881 }
4882 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
4883 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
4884 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
4885 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
4886 }
4887
4888 f_shutdown(__BFILE__, __LINE__, final := true);
4889}
4890
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004891/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8) twice, the second time using the caches */
4892testcase TC_nacc_outbound_success_twice() runs on RAW_PCU_Test_CT {
4893 var PollFnCtx pollctx;
4894 var GprsMS ms;
4895 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004896 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004897 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004898
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004899 if (use_old_ctrl_iface) {
4900 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4901 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4902 }
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01004903
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004904 /* Initialize NS/BSSGP side */
4905 f_init_bssgp();
4906 /* Initialize GPRS MS side */
4907 f_init_gprs_ms();
4908 ms := g_ms[0]; /* We only use first MS in this test */
4909
4910 /* Initialize the PCU interface abstraction */
4911 f_init_raw(testcasename(), info_ind);
4912
4913 /* Make sure we are not affected by full cache from previous tests */
4914 f_pcuvty_flush_neigh_caches();
4915 /* Set timeout values for caches so that entries will be in cache during second try */
4916 f_pcuvty_set_neigh_caches(10, 10);
4917
4918 /* Establish BSSGP connection to the PCU */
4919 f_bssgp_establish();
4920 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4921
4922 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004923 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 +01004924 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4925 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4926
4927 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004928 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01004929
4930 /* 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 +02004931 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 +01004932
4933 f_shutdown(__BFILE__, __LINE__, final := true);
4934}
4935
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004936/* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC,
4937 * TS 44.060 sec 8.8) twice, the second time after caches timed out
4938 */
4939testcase TC_nacc_outbound_success_twice_nocache() runs on RAW_PCU_Test_CT {
4940 var PollFnCtx pollctx;
4941 var GprsMS ms;
4942 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004943 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004944 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004945
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004946 if (use_old_ctrl_iface) {
4947 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
4948 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
4949 }
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004950
4951 /* Initialize NS/BSSGP side */
4952 f_init_bssgp();
4953 /* Initialize GPRS MS side */
4954 f_init_gprs_ms();
4955 ms := g_ms[0]; /* We only use first MS in this test */
4956
4957 /* Initialize the PCU interface abstraction */
4958 f_init_raw(testcasename(), info_ind);
4959
4960 /* Make sure we are not affected by full cache from previous tests */
4961 f_pcuvty_flush_neigh_caches();
4962 /* Set timeout values for caches so that entries will be erased before the second try */
4963 f_pcuvty_set_neigh_caches(1, 1);
4964
4965 /* Establish BSSGP connection to the PCU */
4966 f_bssgp_establish();
4967 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
4968
4969 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01004970 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004971 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
4972 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
4973
4974 /* Start NACC from MS side */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02004975 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004976
4977 /* CTRL client should have disconnected from us */
4978 f_ipa_ctrl_wait_link_down();
4979 /* wait for cache entries to time out */
4980 f_sleep(2.0);
4981 /* 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 +02004982 f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
Pau Espin Pedrol85366682021-01-27 19:04:54 +01004983
4984 f_shutdown(__BFILE__, __LINE__, final := true);
4985}
4986
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01004987/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004988testcase TC_nacc_outbound_rac_ci_resolve_conn_refused() runs on RAW_PCU_Test_CT {
4989 var RlcmacDlBlock dl_block;
4990 var PollFnCtx pollctx;
4991 var uint32_t sched_fn;
4992 var GprsMS ms;
4993 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
4994 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01004995 var GsmArfcn req_arfcn := 862;
4996 var uint6_t req_bsic := 43;
4997
4998 /* In here we explicitly avoid starting osmo-bsc emulation neighbor
4999 * resolution CTRL port, to trigger Conn Refused by socket:
5000 * f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5001 */
5002
5003 /* Initialize NS/BSSGP side */
5004 f_init_bssgp();
5005 /* Initialize GPRS MS side */
5006 f_init_gprs_ms();
5007 ms := g_ms[0]; /* We only use first MS in this test */
5008
5009 /* Initialize the PCU interface abstraction */
5010 f_init_raw(testcasename(), info_ind);
5011
5012 /* Make sure we are not affected by full cache from previous tests */
5013 f_pcuvty_flush_neigh_caches();
5014
5015 /* Establish BSSGP connection to the PCU */
5016 f_bssgp_establish();
5017 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5018
5019 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005020 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 +01005021 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5022 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5023
5024 /* Start NACC from MS side */
5025 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5026 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5027
5028 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005029 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005030 /* Make sure it is a Pkt Cell Chg Continue */
5031 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5032 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5033 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005034 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5035 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5036 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5037 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5038 }
Pau Espin Pedrole51c17a2021-01-27 18:29:22 +01005039
5040 f_shutdown(__BFILE__, __LINE__, final := true);
5041}
5042
5043/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005044testcase TC_nacc_outbound_rac_ci_resolve_timeout() runs on RAW_PCU_Test_CT {
5045 var RlcmacDlBlock dl_block;
5046 var PollFnCtx pollctx;
5047 var uint32_t sched_fn;
5048 var GprsMS ms;
5049 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5050 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005051 var GsmArfcn req_arfcn := 862;
5052 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005053 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005054
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005055 if (use_old_ctrl_iface) {
5056 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5057 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5058 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005059
5060 /* Initialize NS/BSSGP side */
5061 f_init_bssgp();
5062 /* Initialize GPRS MS side */
5063 f_init_gprs_ms();
5064 ms := g_ms[0]; /* We only use first MS in this test */
5065
5066 /* Initialize the PCU interface abstraction */
5067 f_init_raw(testcasename(), info_ind);
5068
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005069 /* Make sure we are not affected by full cache from previous tests */
5070 f_pcuvty_flush_neigh_caches();
5071
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005072 /* Establish BSSGP connection to the PCU */
5073 f_bssgp_establish();
5074 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5075
5076 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005077 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 +01005078 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5079 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5080
5081 /* Start NACC from MS side */
5082 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5083 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5084
5085 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005086 /* we receive RAC+CI resolution request, but we never answer to it, timeout should occur */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005087 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 +01005088
5089 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005090 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005091 /* Make sure it is a Pkt Cell Chg Continue */
5092 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5093 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5094 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005095 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5096 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5097 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5098 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5099 }
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01005100
5101 f_shutdown(__BFILE__, __LINE__, final := true);
5102}
5103
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005104/* Verify PCU transmits Pkt Cell Change Continue if RAC+CI resolution fails during outbound NACC procedure */
5105testcase TC_nacc_outbound_rac_ci_resolve_fail_parse_response() runs on RAW_PCU_Test_CT {
5106 var RlcmacDlBlock dl_block;
5107 var PollFnCtx pollctx;
5108 var uint32_t sched_fn;
5109 var GprsMS ms;
5110 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5111 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005112 var GsmArfcn req_arfcn := 862;
5113 var uint6_t req_bsic := 43;
5114
5115 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5116 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5117
5118 /* Initialize NS/BSSGP side */
5119 f_init_bssgp();
5120 /* Initialize GPRS MS side */
5121 f_init_gprs_ms();
5122 ms := g_ms[0]; /* We only use first MS in this test */
5123
5124 /* Initialize the PCU interface abstraction */
5125 f_init_raw(testcasename(), info_ind);
5126
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005127 /* Make sure we are not affected by full cache from previous tests */
5128 f_pcuvty_flush_neigh_caches();
5129
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005130 /* Establish BSSGP connection to the PCU */
5131 f_bssgp_establish();
5132 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5133
5134 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005135 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 +01005136 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5137 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5138
5139 /* Start NACC from MS side */
5140 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5141 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5142
5143 /* osmo-pcu should now ask for resolution: */
5144 f_ipa_ctrl_wait_link_up();
5145 var charstring ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5146 int2str(info_ind.lac) & "." &
5147 int2str(info_ind.cell_id) & "." &
5148 int2str(req_arfcn) & "." &
5149 int2str(req_bsic);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005150 /* we receive RAC+CI resolution request and we send incorrectly formated response */
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005151 f_ctrl_exp_get(IPA_CTRL, ctrl_var, "foobar-error");
5152
5153 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005154 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005155 /* Make sure it is a Pkt Cell Chg Continue */
5156 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5157 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5158 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005159 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5160 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5161 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5162 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5163 }
Pau Espin Pedrol4b5227c2021-01-26 20:03:01 +01005164
5165 f_shutdown(__BFILE__, __LINE__, final := true);
5166}
5167
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005168/* Verify PCU transmits Pkt Cell Change Continue if SI resolution fails during outbound NACC procedure */
5169testcase TC_nacc_outbound_si_resolve_timeout() runs on RAW_PCU_Test_CT {
5170 var RlcmacDlBlock dl_block;
5171 var PollFnCtx pollctx;
5172 var uint32_t sched_fn;
5173 var GprsMS ms;
5174 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5175 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005176 var GsmArfcn req_arfcn := 862;
5177 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005178 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005179 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 */
5180 info_ind.lac),
5181 info_ind.rac),
5182 info_ind.cell_id));
5183 var BssgpCellId dst := valueof(ts_BssgpCellId(ts_RAI(ts_LAI('023F43'H, /* Decided by test itself (emulating BSC) */
5184 423),
5185 2),
5186 5));
5187 var template RIM_Routing_Address src_addr := t_RIM_Routing_Address_cid(src);
5188 var template RIM_Routing_Address dst_addr := t_RIM_Routing_Address_cid(dst);
5189
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005190 if (use_old_ctrl_iface) {
5191 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5192 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5193 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005194
5195 /* Initialize NS/BSSGP side */
5196 f_init_bssgp();
5197 /* Initialize GPRS MS side */
5198 f_init_gprs_ms();
5199 ms := g_ms[0]; /* We only use first MS in this test */
5200
5201 /* Initialize the PCU interface abstraction */
5202 f_init_raw(testcasename(), info_ind);
5203
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01005204 /* Make sure we are not affected by full cache from previous tests */
5205 f_pcuvty_flush_neigh_caches();
5206
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005207 /* Establish BSSGP connection to the PCU */
5208 f_bssgp_establish();
5209 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5210
5211 /* Send PACKET RESOURCE REQUEST */
Pau Espin Pedrol13ab5ea2021-02-05 11:56:15 +01005212 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 +01005213 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5214 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5215
5216 /* Start NACC from MS side */
5217 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5218 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5219
5220 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005221 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 +01005222
5223 /* RIM procedure: */
5224 RIM.receive(tr_RAN_INFORMATION_REQUEST(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
5225 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
5226 tr_RAN_Information_Request_RIM_Container));
5227 /* We never answer the RIM procude -> PCU timeouts and should send Pkt Cell Chg continue */
5228
5229 /* Wait until we receive something non-dummy */
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005230 dl_block := f_skip_dummy(0, sched_fn);
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005231 /* Make sure it is a Pkt Cell Chg Continue */
5232 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5233 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5234 }
Pau Espin Pedrola846e612021-02-01 19:25:25 +01005235 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5236 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5237 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5238 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5239 }
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01005240
5241 f_shutdown(__BFILE__, __LINE__, final := true);
5242}
5243
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005244/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for CTRL resolution */
5245testcase TC_nacc_outbound_pkt_cell_chg_notif_dup() runs on RAW_PCU_Test_CT {
5246 var PollFnCtx pollctx;
5247 var GprsMS ms;
5248 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5249 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5250 var RlcmacDlBlock dl_block;
5251 var uint32_t sched_fn;
5252 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005253 var charstring ctrl_var;
5254 var PCUIF_Message pcu_msg;
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005255 var GsmArfcn req_arfcn := 862;
5256 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005257 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005258
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005259 if (use_old_ctrl_iface) {
5260 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5261 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5262 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005263
5264 /* Initialize NS/BSSGP side */
5265 f_init_bssgp();
5266 /* Initialize GPRS MS side */
5267 f_init_gprs_ms();
5268 ms := g_ms[0]; /* We only use first MS in this test */
5269
5270 /* Initialize the PCU interface abstraction */
5271 f_init_raw(testcasename(), info_ind);
5272
5273 /* Make sure we are not affected by full cache from previous tests */
5274 f_pcuvty_flush_neigh_caches();
5275
5276 /* Establish BSSGP connection to the PCU */
5277 f_bssgp_establish();
5278 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5279
5280 /* Send PACKET RESOURCE REQUEST */
5281 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5282 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5283 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5284
5285 /* Start NACC from MS side */
5286 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5287 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5288
5289 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005290 if (use_old_ctrl_iface) {
5291 f_ipa_ctrl_wait_link_up();
5292 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5293 int2str(info_ind.lac) & "." &
5294 int2str(info_ind.cell_id) & "." &
5295 int2str(req_arfcn) & "." &
5296 int2str(req_bsic);
5297 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5298 } else {
5299 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5300 }
5301
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005302 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif */
5303 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5304 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005305
5306 if (use_old_ctrl_iface) {
5307 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5308 } else {
5309 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5310 }
5311
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005312 timer T := 2.0;
5313 T.start;
5314 alt {
5315 [] as_outbound_nacc_rim_resolve(info_ind, do_repeat := true);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005316 [use_old_ctrl_iface] IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl {
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005317 setverdict(fail, "Received unexpected CTRL resolution after duplicate Pkt Cell Change Notification:", rx_ctrl);
5318 f_shutdown(__BFILE__, __LINE__);
5319 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005320 [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 {
5321 setverdict(fail, "Received unexpected PCUIF resolution after duplicate Pkt Cell Change Notification:", pcu_msg);
5322 f_shutdown(__BFILE__, __LINE__);
5323 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005324 [] T.timeout {
5325 setverdict(pass);
5326 }
5327 }
5328
5329 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005330 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005331
5332 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5333 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5334 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5335 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5336 f_shutdown(__BFILE__, __LINE__);
5337 }
5338 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5339 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5340 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5341 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5342 }
5343
5344 f_shutdown(__BFILE__, __LINE__, final := true);
5345}
5346
5347/* Test MS sending Pkt Cell Change Notify twice (duplicate msg) while waiting for SI resolution */
5348testcase TC_nacc_outbound_pkt_cell_chg_notif_dup2() runs on RAW_PCU_Test_CT {
5349 var PollFnCtx pollctx;
5350 var GprsMS ms;
5351 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5352 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5353 var RlcmacDlBlock dl_block;
5354 var uint32_t sched_fn;
5355 var CtrlMessage rx_ctrl;
5356 var GsmArfcn req_arfcn := 862;
5357 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005358 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005359
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005360 if (use_old_ctrl_iface) {
5361 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5362 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5363 }
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005364
5365 /* Initialize NS/BSSGP side */
5366 f_init_bssgp();
5367 /* Initialize GPRS MS side */
5368 f_init_gprs_ms();
5369 ms := g_ms[0]; /* We only use first MS in this test */
5370
5371 /* Initialize the PCU interface abstraction */
5372 f_init_raw(testcasename(), info_ind);
5373
5374 /* Make sure we are not affected by full cache from previous tests */
5375 f_pcuvty_flush_neigh_caches();
5376
5377 /* Establish BSSGP connection to the PCU */
5378 f_bssgp_establish();
5379 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5380
5381 /* Send PACKET RESOURCE REQUEST */
5382 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5383 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5384 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5385
5386 /* Start NACC from MS side */
5387 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5388 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5389
5390 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005391 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 +01005392 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5393 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif */
5394 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5395 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5396 f_outbound_nacc_rim_tx_resp(info_ind);
5397 timer T := 1.0;
5398 T.start;
5399 alt {
5400 [] RIM.receive {
5401 setverdict(fail, "Received unexpected RIM message");
5402 f_shutdown(__BFILE__, __LINE__);
5403 }
5404 [] T.timeout {
5405 setverdict(pass);
5406 }
5407 }
5408
5409 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005410 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01005411
5412 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5413 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5414 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5415 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5416 f_shutdown(__BFILE__, __LINE__);
5417 }
5418 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5419 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5420 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5421 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5422 }
5423
5424 f_shutdown(__BFILE__, __LINE__, final := true);
5425}
5426
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005427/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Neigh Data Change */
5428testcase TC_nacc_outbound_pkt_cell_chg_notif_dup3() runs on RAW_PCU_Test_CT {
5429 var PollFnCtx pollctx;
5430 var GprsMS ms;
5431 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5432 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5433 var RlcmacDlBlock dl_block;
5434 var uint32_t sched_fn;
5435 var CtrlMessage rx_ctrl;
5436 var GsmArfcn req_arfcn := 862;
5437 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005438 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005439
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005440 if (use_old_ctrl_iface) {
5441 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5442 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5443 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005444
5445 /* Initialize NS/BSSGP side */
5446 f_init_bssgp();
5447 /* Initialize GPRS MS side */
5448 f_init_gprs_ms();
5449 ms := g_ms[0]; /* We only use first MS in this test */
5450
5451 /* Initialize the PCU interface abstraction */
5452 f_init_raw(testcasename(), info_ind);
5453
5454 /* Make sure we are not affected by full cache from previous tests */
5455 f_pcuvty_flush_neigh_caches();
5456
5457 /* Establish BSSGP connection to the PCU */
5458 f_bssgp_establish();
5459 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5460
5461 /* Send PACKET RESOURCE REQUEST */
5462 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5463 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5464 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5465
5466 /* Start NACC from MS side */
5467 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5468 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5469
5470 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005471 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 +01005472 /* RIM procedure: */
5473 as_outbound_nacc_rim_resolve(info_ind);
5474
5475 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif: */
5476 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5477 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5478
5479 /* It should be ignored, let's continue fetching Pkt Neigh Data Change */
5480 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
5481
5482 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5483 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5484 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5485 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5486 f_shutdown(__BFILE__, __LINE__);
5487 }
5488 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5489 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5490 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5491 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5492 }
5493}
5494
5495/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while sending Pkt Cell Change Continue */
5496testcase TC_nacc_outbound_pkt_cell_chg_notif_dup4() runs on RAW_PCU_Test_CT {
5497 var PollFnCtx pollctx;
5498 var GprsMS ms;
5499 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5500 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5501 var RlcmacDlBlock dl_block;
5502 var uint32_t sched_fn;
5503 var CtrlMessage rx_ctrl;
5504 var GsmArfcn req_arfcn := 862;
5505 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005506 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005507
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005508 if (use_old_ctrl_iface) {
5509 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5510 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5511 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005512
5513 /* Initialize NS/BSSGP side */
5514 f_init_bssgp();
5515 /* Initialize GPRS MS side */
5516 f_init_gprs_ms();
5517 ms := g_ms[0]; /* We only use first MS in this test */
5518
5519 /* Initialize the PCU interface abstraction */
5520 f_init_raw(testcasename(), info_ind);
5521
5522 /* Make sure we are not affected by full cache from previous tests */
5523 f_pcuvty_flush_neigh_caches();
5524
5525 /* Establish BSSGP connection to the PCU */
5526 f_bssgp_establish();
5527 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5528
5529 /* Send PACKET RESOURCE REQUEST */
5530 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5531 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5532 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5533
5534 /* Start NACC from MS side */
5535 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5536 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5537
5538 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005539 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 +01005540 /* RIM procedure: */
5541 as_outbound_nacc_rim_resolve(info_ind);
5542
5543 /* Announce SI back to MS, continue NACC procedure */
5544 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5545
5546 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5547 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5548
5549 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5550 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5551 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5552 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5553 f_shutdown(__BFILE__, __LINE__);
5554 }
5555 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5556 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5557 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5558 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5559 }
5560}
5561
5562/* Test MS sending Pkt Cell Change Notification twice (duplicate msg) while waiting for Pkt Cell Change Continue CTRL ACK */
5563testcase TC_nacc_outbound_pkt_cell_chg_notif_dup5() runs on RAW_PCU_Test_CT {
5564 var PollFnCtx pollctx;
5565 var GprsMS ms;
5566 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5567 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5568 var RlcmacDlBlock dl_block;
5569 var uint32_t sched_fn;
5570 var CtrlMessage rx_ctrl;
5571 var GsmArfcn req_arfcn := 862;
5572 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005573 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005574
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005575 if (use_old_ctrl_iface) {
5576 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5577 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5578 }
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01005579
5580 /* Initialize NS/BSSGP side */
5581 f_init_bssgp();
5582 /* Initialize GPRS MS side */
5583 f_init_gprs_ms();
5584 ms := g_ms[0]; /* We only use first MS in this test */
5585
5586 /* Initialize the PCU interface abstraction */
5587 f_init_raw(testcasename(), info_ind);
5588
5589 /* Make sure we are not affected by full cache from previous tests */
5590 f_pcuvty_flush_neigh_caches();
5591
5592 /* Establish BSSGP connection to the PCU */
5593 f_bssgp_establish();
5594 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5595
5596 /* Send PACKET RESOURCE REQUEST */
5597 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5598 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5599 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5600
5601 /* Start NACC from MS side */
5602 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5603 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5604
5605 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005606 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 +01005607 /* RIM procedure: */
5608 as_outbound_nacc_rim_resolve(info_ind);
5609
5610 /* Announce SI back to MS, continue NACC procedure */
5611 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5612
5613 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5614 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5615 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5616 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5617 f_shutdown(__BFILE__, __LINE__);
5618 }
5619 /* trigger a dup Pkt Cell Change Notif, it should be ignored: */
5620 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5621
5622 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5623 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5624 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5625 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5626 }
5627}
5628
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005629/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5630 * while waiting for CTRL resolution */
5631testcase TC_nacc_outbound_pkt_cell_chg_notif_twice() runs on RAW_PCU_Test_CT {
5632 var PollFnCtx pollctx;
5633 var GprsMS ms;
5634 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5635 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5636 var RlcmacDlBlock dl_block;
5637 var uint32_t sched_fn;
5638 var CtrlMessage rx_ctrl;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005639 var charstring ctrl_var;
5640 var PCUIF_Message pcu_msg;
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005641 var GsmArfcn req_arfcn := 862;
5642 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005643 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005644
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005645 if (use_old_ctrl_iface) {
5646 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5647 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5648 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005649
5650 /* Initialize NS/BSSGP side */
5651 f_init_bssgp();
5652 /* Initialize GPRS MS side */
5653 f_init_gprs_ms();
5654 ms := g_ms[0]; /* We only use first MS in this test */
5655
5656 /* Initialize the PCU interface abstraction */
5657 f_init_raw(testcasename(), info_ind);
5658
5659 /* Make sure we are not affected by full cache from previous tests */
5660 f_pcuvty_flush_neigh_caches();
5661
5662 /* Establish BSSGP connection to the PCU */
5663 f_bssgp_establish();
5664 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5665
5666 /* Send PACKET RESOURCE REQUEST */
5667 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5668 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5669 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5670
5671 /* Start NACC from MS side */
5672 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5673 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5674
5675 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005676 if (use_old_ctrl_iface) {
5677 f_ipa_ctrl_wait_link_up();
5678 ctrl_var := "neighbor_resolve_cgi_ps_from_lac_ci." &
5679 int2str(info_ind.lac) & "." &
5680 int2str(info_ind.cell_id) & "." &
5681 int2str(req_arfcn) & "." &
5682 int2str(req_bsic);
5683 IPA_CTRL.receive(tr_CtrlMsgGet(?, ctrl_var)) -> value rx_ctrl;
5684 } else {
5685 BTS.receive(tr_PCUIF_NEIGH_ADDR_REQ(0, info_ind.lac, info_ind.cell_id, req_arfcn, req_bsic)) -> value pcu_msg;
5686 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005687 /* Before receiving CTRL response, MS retransmits Pkt cell Chg Notif with different tgt arfcn */
5688 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5689 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5690 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005691 if (use_old_ctrl_iface) {
5692 IPA_CTRL.send(ts_CtrlMsgGetRepl(rx_ctrl.cmd.id, valueof(ctrl_var), valueof("023-43-423-2-5")));
5693 } else {
5694 BTS.send(ts_PCUIF_NEIGH_ADDR_CNF(0, pcu_msg.u.container.u.neigh_addr_req, 0, 23, 43, 0, 423, 2, 5));
5695 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005696 /* We should now receive a 2nd CTRL request with the new ARFCN+BSIC */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005697 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 +01005698
5699 /* And finally everything continues as usual with RIN procedure */
5700 as_outbound_nacc_rim_resolve(info_ind);
5701
5702 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005703 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005704
5705 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5706 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5707 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5708 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5709 f_shutdown(__BFILE__, __LINE__);
5710 }
5711 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5712 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5713 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5714 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5715 }
5716
5717 f_shutdown(__BFILE__, __LINE__, final := true);
5718}
5719
5720/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5721 * while waiting for SI resolution */
5722testcase TC_nacc_outbound_pkt_cell_chg_notif_twice2() runs on RAW_PCU_Test_CT {
5723 var PollFnCtx pollctx;
5724 var GprsMS ms;
5725 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5726 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5727 var RlcmacDlBlock dl_block;
5728 var uint32_t sched_fn;
5729 var CtrlMessage rx_ctrl;
5730 var GsmArfcn req_arfcn := 862;
5731 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005732 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005733
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005734 if (use_old_ctrl_iface) {
5735 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5736 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5737 }
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005738
5739 /* Initialize NS/BSSGP side */
5740 f_init_bssgp();
5741 /* Initialize GPRS MS side */
5742 f_init_gprs_ms();
5743 ms := g_ms[0]; /* We only use first MS in this test */
5744
5745 /* Initialize the PCU interface abstraction */
5746 f_init_raw(testcasename(), info_ind);
5747
5748 /* Make sure we are not affected by full cache from previous tests */
5749 f_pcuvty_flush_neigh_caches();
5750
5751 /* Establish BSSGP connection to the PCU */
5752 f_bssgp_establish();
5753 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5754
5755 /* Send PACKET RESOURCE REQUEST */
5756 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5757 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5758 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5759
5760 /* Start NACC from MS side */
5761 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5762 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5763
5764 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005765 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 +01005766 as_outbound_nacc_rim_resolve(info_ind, do_answer := false);
5767 /* Before receiving RIM response, MS retransmits Pkt cell Chg Notif with different tgt cell: */
5768 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5769 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5770 f_sleep(0.2); /* let some time to avoid race conditons between CTRL and RLCMAC */
5771 f_outbound_nacc_rim_tx_resp(info_ind);
5772
5773 /* As a result, CTRL + RIM resolution for new tgt cell should now be done: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005774 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 +01005775
5776 /* And finally everything continues as usual with RIN procedure */
5777 as_outbound_nacc_rim_resolve(info_ind);
5778
5779 /* Announce SI back to MS, continue NACC procedure */
Pau Espin Pedrol6cb71cc2021-02-11 13:54:01 +01005780 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01005781
5782 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5783 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5784 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5785 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5786 f_shutdown(__BFILE__, __LINE__);
5787 }
5788 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5789 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5790 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5791 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5792 }
5793
5794 f_shutdown(__BFILE__, __LINE__, final := true);
5795}
5796
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005797/* Test MS sending Pkt Cell Change Notify twice (different tgt cell each time)
5798 * while sending Pkt Neigh Data Change */
5799testcase TC_nacc_outbound_pkt_cell_chg_notif_twice3() runs on RAW_PCU_Test_CT {
5800 var PollFnCtx pollctx;
5801 var GprsMS ms;
5802 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5803 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5804 var RlcmacDlBlock dl_block;
5805 var uint32_t sched_fn;
5806 var CtrlMessage rx_ctrl;
5807 var GsmArfcn req_arfcn := 862;
5808 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005809 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005810
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005811 if (use_old_ctrl_iface) {
5812 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5813 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5814 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005815
5816 /* Initialize NS/BSSGP side */
5817 f_init_bssgp();
5818 /* Initialize GPRS MS side */
5819 f_init_gprs_ms();
5820 ms := g_ms[0]; /* We only use first MS in this test */
5821
5822 /* Initialize the PCU interface abstraction */
5823 f_init_raw(testcasename(), info_ind);
5824
5825 /* Make sure we are not affected by full cache from previous tests */
5826 f_pcuvty_flush_neigh_caches();
5827
5828 /* Establish BSSGP connection to the PCU */
5829 f_bssgp_establish();
5830 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5831
5832 /* Send PACKET RESOURCE REQUEST */
5833 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5834 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5835 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5836
5837 /* Start NACC from MS side */
5838 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5839 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5840
5841 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005842 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 +01005843 /* RIM procedure: */
5844 as_outbound_nacc_rim_resolve(info_ind);
5845
5846 /* Receive first Pkt Neigh data Change, then trigger a new Pkt Cell Change Notif (different ARFCN+BSIC): */
5847 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
5848 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5849 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5850
5851 /* It should trigger RAC_CI resolution to start again: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005852 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 +01005853 /* RIM procedure: */
5854 as_outbound_nacc_rim_resolve(info_ind);
5855 /* Transmit SI back to MS */
5856 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5857
5858 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5859 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5860 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5861 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5862 f_shutdown(__BFILE__, __LINE__);
5863 }
5864 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5865 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5866 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5867 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5868 }
5869}
5870
5871/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while sending Pkt Cell Change Continue */
5872testcase TC_nacc_outbound_pkt_cell_chg_notif_twice4() runs on RAW_PCU_Test_CT {
5873 var PollFnCtx pollctx;
5874 var GprsMS ms;
5875 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5876 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5877 var RlcmacDlBlock dl_block;
5878 var uint32_t sched_fn;
5879 var CtrlMessage rx_ctrl;
5880 var GsmArfcn req_arfcn := 862;
5881 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005882 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005883
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005884 if (use_old_ctrl_iface) {
5885 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5886 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5887 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005888
5889 /* Initialize NS/BSSGP side */
5890 f_init_bssgp();
5891 /* Initialize GPRS MS side */
5892 f_init_gprs_ms();
5893 ms := g_ms[0]; /* We only use first MS in this test */
5894
5895 /* Initialize the PCU interface abstraction */
5896 f_init_raw(testcasename(), info_ind);
5897
5898 /* Make sure we are not affected by full cache from previous tests */
5899 f_pcuvty_flush_neigh_caches();
5900
5901 /* Establish BSSGP connection to the PCU */
5902 f_bssgp_establish();
5903 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5904
5905 /* Send PACKET RESOURCE REQUEST */
5906 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5907 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5908 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5909
5910 /* Start NACC from MS side */
5911 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5912 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5913
5914 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005915 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 +01005916 /* RIM procedure: */
5917 as_outbound_nacc_rim_resolve(info_ind);
5918
5919 /* Announce SI back to MS, continue NACC procedure */
5920 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5921
5922 /* trigger a Pkt Cell Change Notif with different tgt cell */
5923 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
5924 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5925
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005926 /* It should trigger RAC_CI resolution to start again: */
5927 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
5928
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005929 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
5930 f_rx_rlcmac_dl_block_exp_dummy(dl_block, nr := f_ms_tx_TsTrxBtsNum(ms));
5931
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005932 /* RIM procedure: */
5933 as_outbound_nacc_rim_resolve(info_ind);
5934 /* Transmit SI back to MS */
5935 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
5936
5937 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
5938 f_rx_rlcmac_dl_block(dl_block, sched_fn);
5939 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
5940 setverdict(fail, "Rx unexpected DL block: ", dl_block);
5941 f_shutdown(__BFILE__, __LINE__);
5942 }
5943 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
5944 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
5945 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
5946 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
5947 }
5948}
5949
5950/* Test MS sending Pkt Cell Change Notification twice (different tgt cell) while waiting for Pkt Cell Change Continue CTRL ACK*/
5951testcase TC_nacc_outbound_pkt_cell_chg_notif_twice5() runs on RAW_PCU_Test_CT {
5952 var PollFnCtx pollctx;
5953 var GprsMS ms;
5954 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
5955 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
5956 var RlcmacDlBlock dl_block;
5957 var uint32_t sched_fn;
5958 var CtrlMessage rx_ctrl;
5959 var GsmArfcn req_arfcn := 862;
5960 var uint6_t req_bsic := 43;
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005961 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005962
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005963 if (use_old_ctrl_iface) {
5964 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
5965 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
5966 }
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01005967
5968 /* Initialize NS/BSSGP side */
5969 f_init_bssgp();
5970 /* Initialize GPRS MS side */
5971 f_init_gprs_ms();
5972 ms := g_ms[0]; /* We only use first MS in this test */
5973
5974 /* Initialize the PCU interface abstraction */
5975 f_init_raw(testcasename(), info_ind);
5976
5977 /* Make sure we are not affected by full cache from previous tests */
5978 f_pcuvty_flush_neigh_caches();
5979
5980 /* Establish BSSGP connection to the PCU */
5981 f_bssgp_establish();
5982 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
5983
5984 /* Send PACKET RESOURCE REQUEST */
5985 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
5986 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
5987 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
5988
5989 /* Start NACC from MS side */
5990 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
5991 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
5992
5993 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02005994 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 +01005995 /* RIM procedure: */
5996 as_outbound_nacc_rim_resolve(info_ind);
5997
5998 /* Announce SI back to MS, continue NACC procedure */
5999 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6000
6001 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6002 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6003 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6004 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6005 f_shutdown(__BFILE__, __LINE__);
6006 }
6007
6008 /* trigger a Pkt Cell Change Notif with different tgt cell */
6009 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn + 1, req_bsic + 1);
6010 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6011
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006012 /* It should trigger RAC_CI resolution to start again: */
6013 /* When using new PCUIF interface for resolution, we must
6014 * PCUIF.receive() here since that's the first message in the PCUIF
6015 * queue that PCU will have sent. Calling other functions doing
6016 * PCUIF.receive() (like f_ms_tx_ul_block() below) will make them fail
6017 * due to unexpected message receive. */
6018 if (not use_old_ctrl_iface) {
6019 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6020 }
6021
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006022 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6023 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6024 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6025 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6026 }
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006027
6028 /* When using CTRL interface, we must schedule the ACK before (see
6029 * above) blocking here waiting for the resoltion, otherwise we'll be
6030 * too late scheduling by the time the resolution is done. */
6031 if (use_old_ctrl_iface) {
6032 f_handle_nacc_rac_ci_query(info_ind, req_arfcn + 1, req_bsic + 1, true, use_old_ctrl_iface);
6033 }
6034
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006035 /* PCU TBF NACC state changed, so we should next receive a dummy block: */
6036 f_rx_rlcmac_dl_block_exp_dummy(dl_block);
6037
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006038 /* RIM procedure: */
6039 as_outbound_nacc_rim_resolve(info_ind);
6040 /* Transmit SI back to MS */
6041 f_ms_handle_pkt_neighbor_cell_data(ms, si_default);
6042
6043 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6044 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6045 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6046 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6047 f_shutdown(__BFILE__, __LINE__);
6048 }
6049 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6050 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6051 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6052 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6053 }
6054}
6055
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006056/* Test MS sending Pkt Cell Change Notification on an MS with an existing but unassigned (no TFI) DL TBF */
6057testcase TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() runs on RAW_PCU_Test_CT {
6058 var PollFnCtx pollctx;
6059 var GprsMS ms;
6060 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6061 var template (value) RlcmacUlCtrlMsg cell_chf_notif;
6062 var RlcmacDlBlock dl_block;
6063 var uint32_t sched_fn, dl_fn;
6064 var CtrlMessage rx_ctrl;
6065 var GsmArfcn req_arfcn := 862;
6066 var uint6_t req_bsic := 43;
6067 var octetstring data := f_rnd_octstring(10);
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006068 var boolean use_old_ctrl_iface := mp_ctrl_neigh_ip != "";
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006069
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006070 if (use_old_ctrl_iface) {
6071 /* Initialize osmo-bsc emulation neighbor resolution CTRL port */
6072 f_ipa_ctrl_start_server(mp_ctrl_neigh_ip, mp_ctrl_neigh_port);
6073 }
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006074
6075 /* Initialize NS/BSSGP side */
6076 f_init_bssgp();
6077 /* Initialize GPRS MS side */
6078 f_init_gprs_ms();
6079 ms := g_ms[0]; /* We only use first MS in this test */
6080
6081 /* Initialize the PCU interface abstraction */
6082 f_init_raw(testcasename(), info_ind);
6083
6084 /* Make sure we are not affected by full cache from previous tests */
6085 f_pcuvty_flush_neigh_caches();
6086
6087 /* Establish BSSGP connection to the PCU */
6088 f_bssgp_establish();
6089 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6090
6091 /* Send PACKET RESOURCE REQUEST */
6092 pollctx := f_ms_establish_ul_tbf_2phase_access(ms, ts_RlcMacUlCtrl_PKT_RES_REQ(ms.tlli, ms_racap_gprs_def));
6093 /* Pkt Uplink Assignment above sets poll+rrbp requesting PACKET CONTROL ACK */
6094 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
6095
6096 /* Start NACC from MS side */
6097 cell_chf_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF(ms.ul_tbf.tfi, req_arfcn, req_bsic);
6098 f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chf_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
6099
6100 /* osmo-pcu should now ask for resolution: */
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006101 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 +01006102 /* RIM procedure: */
6103 as_outbound_nacc_rim_resolve(info_ind);
6104
6105 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data));
6106 /* Make sure we leave some time for SGSN->PCU data to arrive to PCU */
6107 f_sleep(0.1);
6108 /* rx DL assignment, don't ack it yet (keep TBF in state ASSIGN): */
6109 f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS);
6110
6111 /* NACC: scheduler selects tx Pkt Cell Neighbor Data. Receive first one: */
6112 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, single_step := true);
6113 /* ACK DL assignment (we do it here on purpose to test tx Pkt Neigh Cell
6114 * Data with unassigned DL TBF in line above): */
6115 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6116 /* Continue receiving Pkt Cell Neighbor Data */
6117 f_ms_handle_pkt_neighbor_cell_data(ms, si_default, f_ms_tx_TsTrxBtsNum(ms), 1, 16);
6118
6119 /* Obtain a Downlink block and make sure it is a Pkt Cell Chg Continue */
6120 f_rx_rlcmac_dl_block(dl_block, sched_fn);
6121 if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE))) {
6122 setverdict(fail, "Rx unexpected DL block: ", dl_block);
6123 f_shutdown(__BFILE__, __LINE__);
6124 }
6125 /* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
6126 if (dl_block.ctrl.mac_hdr.rrbp_valid) {
6127 sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
6128 f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
6129 }
6130
6131 /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
6132 f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
6133 f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
6134 f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
6135 f_dl_block_ack_fn(dl_block, dl_fn));
6136}
6137
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006138
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006139function f_do_inbound_nacc(template (value) RIM_Routing_Information tx_src_addr, template RIM_Routing_Information rx_dst_addr)
6140runs on RAW_PCU_Test_CT
6141{
6142 var template (value) RAN_Information_Request_RIM_Container req_cont;
6143 var template (value) PDU_BSSGP bssgp_rim_pdu;
6144 var template PDU_BSSGP bssgp_rim_pdu_expect;
6145 var template RAN_Information_RIM_Container rim_cont_expect;
6146 var RIM_Routing_Address bts_addr;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006147
6148 /* Send sysinfo to the PCU */
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006149 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 +01006150 BTS.send(si1_data_ind);
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006151 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 +01006152 BTS.send(si3_data_ind);
Pau Espin Pedrol02a6d0c2021-04-19 17:11:07 +02006153 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);
6154 BTS.send(si13_data_ind);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006155 f_sleep(1.0);
6156
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006157 bts_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006158
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006159 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6160 ts_RIM_Sequence_Number(1),
6161 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6162 ts_RIM_Protocol_Version_Number(1),
6163 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6164 omit);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006165 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
6166 tx_src_addr, req_cont);
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006167
6168 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6169 tr_RIM_Sequence_Number(1),
6170 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6171 tr_RIM_Protocol_Version_Number(1),
Pau Espin Pedrol0af478e2021-02-05 18:00:58 +01006172 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 +01006173 omit);
6174
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006175 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(rx_dst_addr,
6176 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, bts_addr),
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006177 rim_cont_expect);
6178 RIM.send(bssgp_rim_pdu);
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006179 timer T := 2.0;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006180 T.start;
6181 alt {
6182 [] RIM.receive(bssgp_rim_pdu_expect) { }
6183 [] RIM.receive {
6184 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6185 }
6186 [] T.timeout {
6187 setverdict(fail, "No BSSGP RIM PDU received");
6188 mtc.stop;
6189 }
6190 }
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006191}
6192/* Send a RIM RAN info request to the PCU and verify the response, we expect
6193 * getting the system information back which we have transfered to the PCU via
6194 * PCUIF on startup. */
6195testcase TC_rim_ran_info_req_single_rep() runs on RAW_PCU_Test_CT {
6196 /* Initialize NS/BSSGP side */
6197 f_init_bssgp();
6198
6199 /* Initialize the PCU interface abstraction */
6200 f_init_raw(testcasename());
6201
6202 /* Establish BSSGP connection to the PCU */
6203 f_bssgp_establish();
6204
6205 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6206 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6207
6208 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6209 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr));
6210
6211 f_shutdown(__BFILE__, __LINE__, final := true);
6212}
6213
6214/* Same as TC_rim_ran_info_req_single_rep, but using an EUTRAN eNodeB ID as
6215 * Routing information, to verify PCU handles that kind of address just fine
6216 */
6217testcase TC_rim_ran_info_req_single_rep_eutran() runs on RAW_PCU_Test_CT {
6218 /* Initialize NS/BSSGP side */
6219 f_init_bssgp();
6220
6221 /* Initialize the PCU interface abstraction */
6222 f_init_raw(testcasename());
6223
6224 /* Establish BSSGP connection to the PCU */
6225 f_bssgp_establish();
6226
6227 var BssgpCellId src_cid := {ra_id := { lai := { mcc_mnc := '262F42'H, lac := 12345}, rac := 0 }, cell_id := 20962 };
6228 var RIM_Routing_Address src_addr := valueof(t_RIM_Routing_Address_enbid(src_cid, tac := 3, gnbid := '12345678123456'O));
6229
6230 f_do_inbound_nacc(ts_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr),
6231 tr_RIM_Routing_Information(RIM_ADDR_EUTRAN_NODEB_ID, src_addr));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006232
6233 f_shutdown(__BFILE__, __LINE__, final := true);
6234}
6235
6236/* Same as above, but in this case we simulate the rare case in which the PCU
6237 * has no system information available. We expect getting a response back but
6238 * with no system information inside. */
6239testcase TC_rim_ran_info_req_single_rep_no_si() runs on RAW_PCU_Test_CT {
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006240 var template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006241 var PCUIF_Message pcu_msg;
6242 timer T := 2.0;
6243
6244 /* Initialize NS/BSSGP side */
6245 f_init_bssgp();
6246
6247 /* Initialize the PCU interface abstraction */
6248 f_init_raw(testcasename(), info_ind);
6249
6250 /* Establish BSSGP connection to the PCU */
6251 f_bssgp_establish();
6252
6253 /* Clear sysinfo from the PCU */
6254 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);
6255 BTS.send(si1_data_ind);
6256 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);
6257 BTS.send(si3_data_ind);
6258 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);
6259 BTS.send(si16_data_ind);
6260 f_sleep(1.0);
6261
Pau Espin Pedrolfa64e282021-02-05 17:56:52 +01006262 var RIM_Routing_Address dst_addr;
6263 var RIM_Routing_Address src_addr;
6264 var template (value) RAN_Information_Request_RIM_Container req_cont;
6265 var template (value) PDU_BSSGP bssgp_rim_pdu;
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006266 var template PDU_BSSGP bssgp_rim_pdu_expect;
6267 var template RAN_Information_RIM_Container rim_cont_expect;
6268
6269 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 +01006270 src_addr := valueof(t_RIM_Routing_Address_cid(src_cid));
6271 dst_addr := valueof(t_RIM_Routing_Address_cid(mp_gb_cfg.bvc[0].cell_id));
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006272
6273 req_cont := ts_RAN_Information_Request_RIM_Container(ts_RIM_Application_Identity(RIM_APP_ID_NACC),
6274 ts_RIM_Sequence_Number(1),
6275 ts_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6276 ts_RIM_Protocol_Version_Number(1),
6277 tsu_RAN_Information_Request_Application_Container_NACC(mp_gb_cfg.bvc[0].cell_id),
6278 omit);
6279 bssgp_rim_pdu := ts_RAN_INFORMATION_REQUEST(ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6280 ts_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6281 req_cont);
6282
6283
6284 rim_cont_expect := tr_RAN_Information_RIM_Container(tr_RIM_Application_Identity(RIM_APP_ID_NACC),
6285 tr_RIM_Sequence_Number(1),
6286 tr_RIM_PDU_Indications(false, RIM_PDU_TYPE_SING_REP),
6287 tr_RIM_Protocol_Version_Number(1),
6288 tru_ApplContainer_or_ApplErrContainer_NACC(tru_ApplContainer_NACC(mp_gb_cfg.bvc[0].cell_id, false, 0, ''O)),
6289 omit);
6290
6291 bssgp_rim_pdu_expect := tr_PDU_BSSGP_RAN_INFORMATION(tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, src_addr),
6292 tr_RIM_Routing_Information(RIM_ADDR_GERAN_CELL_ID, dst_addr),
6293 rim_cont_expect);
6294 RIM.send(bssgp_rim_pdu);
6295 T.start;
6296 alt {
6297 [] RIM.receive(bssgp_rim_pdu_expect) { }
6298 [] RIM.receive {
6299 setverdict(fail, "Unexpected BSSGP RIM PDU received");
6300 }
6301 [] T.timeout {
6302 setverdict(fail, "No BSSGP RIM PDU received");
6303 mtc.stop;
6304 }
6305 }
6306
6307 f_shutdown(__BFILE__, __LINE__, final := true);
6308}
6309
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006310/* 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 +02006311testcase TC_pdch_energy_saving() runs on RAW_PCU_Test_CT {
6312 var PCUIF_info_ind info_ind;
6313 var template (value) TsTrxBtsNum nr;
6314 var RlcmacDlBlock dl_block;
6315 var BTS_PDTCH_Block data_msg;
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006316 var integer ts;
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006317 timer T;
6318
6319 /* Initialize NS/BSSGP side */
6320 f_init_bssgp();
6321
6322 info_ind := valueof(ts_PCUIF_INFO_default);
6323 /* The 2 first TRX are enabled. */
6324 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (2 .. 7));
6325 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 0);
6326 f_PCUIF_PDCHMask_set(info_ind, '00000001'B, 1);
6327
6328 /* Initialize the PCU interface abstraction */
6329 f_init_raw(testcasename(), info_ind);
6330
6331 /* Establish BSSGP connection to the PCU */
6332 f_bssgp_establish();
6333
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006334 for (ts := 0; ts < 2; ts := ts + 1) {
6335 nr := ts_TsTrxBtsNum(ts_nr := 7, trx_nr := ts, bts_nr := 0, blk_nr := 0);
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006336
Pau Espin Pedrol332aba82021-09-22 14:50:35 +02006337 BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
6338 sapi := PCU_IF_SAPI_PDTCH, fn := 0,
6339 arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), block_nr := nr.blk_nr));
6340 T.start(0.5);
6341 alt {
6342 [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
6343 tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
6344 omit)) -> value data_msg {
6345 setverdict(pass);
6346 T.stop;
6347 }
6348 [] as_rx_fail_dummy(nr);
6349 [] BTS.receive {
6350 setverdict(fail, "Unexpected block from BTS");
6351 f_shutdown(__BFILE__, __LINE__);
6352 }
6353 [] T.timeout {
6354 setverdict(fail, "Expected IDLE block from BTS");
6355 f_shutdown(__BFILE__, __LINE__);
6356 }
6357 }
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006358 }
6359
6360 f_shutdown(__BFILE__, __LINE__, final := true);
6361}
6362
Oliver Smith3d174882021-09-03 11:38:51 +02006363/* Test stats for available and occupied PDCHs */
6364testcase TC_stat_pdch_avail_occ() runs on RAW_PCU_Test_CT {
6365 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6366 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6367
6368 /* Initialize NS/BSSGP side */
6369 f_init_bssgp();
6370
Oliver Smithedcded22021-09-14 09:26:55 +02006371 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6372 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6373 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6374 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6375 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6376 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
Oliver Smith3d174882021-09-03 11:38:51 +02006377
Oliver Smith72d0c692021-09-08 10:03:52 +02006378 /* Allocate 4 GprsMS instances */
Oliver Smith3d174882021-09-03 11:38:51 +02006379 f_init_gprs_ms(4);
6380
6381 /* Initialize the PCU interface abstraction */
6382 f_init_raw(testcasename(), info_ind);
6383
6384 /* Reset stats */
6385 f_statsd_reset();
6386
6387 /* Establish BSSGP */
6388 f_bssgp_establish();
6389
6390 /* 8 PDCHs available, 0 occupied */
6391 var StatsDExpects expect := {
6392 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006393 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6394 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6395 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
Oliver Smith3d174882021-09-03 11:38:51 +02006396 };
6397 f_statsd_expect(expect);
6398
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006399 /* Establish an Uplink TBF for each GprsMS instance (3x GPRS, 1x EGPRS) */
Oliver Smith3d174882021-09-03 11:38:51 +02006400 f_multi_ms_bssgp_register();
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006401 f_ms_establish_ul_tbf(g_ms[0]);
6402 f_ms_establish_ul_tbf(g_ms[1]);
6403 f_ms_establish_ul_tbf(g_ms[2]);
6404 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 +02006405
6406 /* 4 PDCHs occupied */
6407 expect := {
6408 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
Oliver Smith4b2a89f2021-09-08 11:24:39 +02006409 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 4, max := 4 },
6410 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 3, max := 3 },
6411 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
Oliver Smith3d174882021-09-03 11:38:51 +02006412 };
6413 f_statsd_expect(expect);
6414
6415 f_shutdown(__BFILE__, __LINE__, final := true);
6416}
6417
Oliver Smithf04762d2021-09-14 17:20:38 +02006418/* Test stats for available and occupied PDCHs, for MS which is not known by
6419 * the PCU (e.g. because it was forgotten due to no interaction, and old DL
6420 * data arrives from SGSN) */
6421function f_tc_stat_pdch_avail_occ_ms_not_known(boolean egprs) runs on RAW_PCU_Test_CT {
6422 var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
6423 const BssgpBvci bvci := mp_gb_cfg.bvc[0].bvci;
6424
6425 /* Ensure a deterministic slot allocation of 1 PDCH with MS class 1 */
6426 const MultislotCap_GPRS_BSSGP bssgp_mscap_gprs := {
6427 gprsmultislotclass := '00001'B,
6428 gprsextendeddynalloccap := '0'B
6429 };
6430 const MultislotCap_EGPRS_BSSGP bssgp_mscap_egprs := {
6431 egprsmultislotclass := '00001'B,
6432 egprsextendeddynalloccap := '0'B
6433 };
6434 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_gprs := {
6435 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, omit)) };
6436 template (value) MSRadioAccessCapabilityV_BSSGP bssgp_ms_racap_egprs := {
6437 valueof(ts_RaCapRec_BSSGP('0001'B /* E-GSM */, bssgp_mscap_gprs, bssgp_mscap_egprs)) };
6438
6439 /* Initialize NS/BSSGP side */
6440 f_init_bssgp();
6441
6442 /* Only the 4 first TRX are enabled, each with 2 PDCHs. */
6443 f_PCUIF_PDCHMask_set(info_ind, '00000011'B, 0);
6444 f_PCUIF_PDCHMask_set(info_ind, '00001100'B, 1);
6445 f_PCUIF_PDCHMask_set(info_ind, '11000000'B, 2);
6446 f_PCUIF_PDCHMask_set(info_ind, '00110000'B, 3);
6447 f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (4 .. 7));
6448
6449 /* Allocate 1 GprsMS instance */
6450 f_init_gprs_ms(1);
6451
6452 /* Initialize the PCU interface abstraction */
6453 f_init_raw(testcasename(), info_ind);
6454
6455 /* Reset stats */
6456 f_statsd_reset();
6457
6458 /* Establish BSSGP */
6459 f_bssgp_establish();
6460
6461 /* 8 PDCHs available, 0 occupied */
6462 var StatsDExpects expect := {
6463 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6464 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 0, max := 0 },
6465 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6466 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6467 };
6468 f_statsd_expect(expect);
6469
6470 var GprsMS ms := g_ms[0]; /* We only use first MS in this test */
6471 f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);
6472
6473 /* SGSN sends some DL data, PCU will page on CCCH (PCH) */
6474 var octetstring data := f_rnd_octstring(1400);
6475 if (egprs) {
6476 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_egprs));
6477 } else {
6478 BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, bssgp_ms_racap_gprs));
6479 }
6480 f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);
6481
6482 /* Wait timer X2002 and DL block is available after CCCH IMM ASS */
6483 f_sleep(X2002);
6484
6485 /* 1 PDCH occupied */
6486 if (egprs) {
6487 expect := {
6488 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6489 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6490 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 0, max := 0 },
6491 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 1, max := 1 }
6492 };
6493 } else {
6494 expect := {
6495 { name := "TTCN3.bts.0.pdch.available", mtype := "g", min := 8, max := 8 },
6496 { name := "TTCN3.bts.0.pdch.occupied", mtype := "g", min := 1, max := 1 },
6497 { name := "TTCN3.bts.0.pdch.occupied.gprs", mtype := "g", min := 1, max := 1 },
6498 { name := "TTCN3.bts.0.pdch.occupied.egprs", mtype := "g", min := 0, max := 0 }
6499 };
6500 }
6501 f_statsd_expect(expect);
6502
6503 /* Clean up */
6504 f_shutdown(__BFILE__, __LINE__, final := true);
6505}
6506testcase TC_stat_pdch_avail_occ_ms_not_known_gprs() runs on RAW_PCU_Test_CT {
6507 f_tc_stat_pdch_avail_occ_ms_not_known(false);
6508}
6509testcase TC_stat_pdch_avail_occ_ms_not_known_egprs() runs on RAW_PCU_Test_CT {
6510 f_tc_stat_pdch_avail_occ_ms_not_known(true);
6511}
6512
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006513control {
6514 execute( TC_pcuif_suspend() );
Pau Espin Pedrol9e04d5e2021-01-11 15:03:50 +01006515 execute( TC_pcuif_suspend_active_tbf() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006516 execute( TC_ta_ptcch_idle() );
6517 execute( TC_ta_rach_imm_ass() );
Vadim Yanitskiy866f8702021-05-26 14:50:27 +02006518 execute( TC_ta_ul_ack_nack_first_block() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006519 execute( TC_ta_idle_dl_tbf_ass() );
6520 execute( TC_ta_ptcch_ul_multi_tbf() );
6521 execute( TC_cs_lqual_ul_tbf() );
6522 execute( TC_cs_initial_ul() );
6523 execute( TC_cs_max_ul() );
Pau Espin Pedrol75122592020-11-03 15:22:59 +01006524 execute( TC_cs_initial_dl() );
Pau Espin Pedrol5d07ae62020-11-05 17:59:30 +01006525 execute( TC_cs_max_dl() );
6526 execute( TC_dl_cs1_to_cs4() );
Pau Espin Pedrol2354d6a2020-11-05 18:36:59 +01006527 execute( TC_mcs_initial_ul() );
Pau Espin Pedroldb15fa72020-11-11 12:58:34 +01006528 execute( TC_mcs_max_ul() );
Pau Espin Pedrole4fa45b2020-11-11 13:28:31 +01006529 execute( TC_mcs_initial_dl() );
Pau Espin Pedrol1b9aa782020-11-12 21:14:16 +01006530 execute( TC_mcs_max_dl() );
Pau Espin Pedrol1451f9f2021-05-11 11:52:37 +02006531 execute( TC_t3141() );
Pau Espin Pedrolf30fa1d2021-03-03 19:55:11 +01006532 execute( TC_n3101_max_t3169() );
Pau Espin Pedrolcc895df2021-04-20 12:58:32 +02006533 execute( TC_n3103_max_t3169() );
Pau Espin Pedrol84a8c3c2021-03-01 17:22:29 +01006534 execute( TC_x2031_t3191() );
6535 execute( TC_zero_x2031_t3191() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006536 execute( TC_t3193() );
Pau Espin Pedrol14ca7e32021-03-01 17:41:21 +01006537 execute( TC_n3105_max_t3195() );
Pau Espin Pedrol487d6342020-05-14 19:22:33 +02006538 execute( TC_countdown_procedure() );
Pau Espin Pedrolfb2301e2020-06-30 20:46:54 +02006539 execute( TC_ul_all_sizes() );
Pau Espin Pedrol5e6844d2020-07-01 17:24:02 +02006540 execute( TC_ul_data_toolong_fills_padding() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006541 execute( TC_mo_ping_pong() );
6542 execute( TC_mo_ping_pong_with_ul_racap() );
Pau Espin Pedrol0c0bf872020-05-14 15:50:49 +02006543 execute( TC_force_two_phase_access() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006544 execute( TC_mt_ping_pong() );
6545 execute( TC_mt_ping_pong_with_dl_racap() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006546 execute( TC_ul_intermediate_retrans() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006547 execute( TC_imm_ass_dl_block_retrans() );
Vadim Yanitskiy71238c12020-05-11 03:48:06 +07006548 execute( TC_dl_flow_more_blocks() );
Pau Espin Pedrole1195bb2020-07-07 13:27:18 +02006549 execute( TC_ul_flow_multiple_llc_blocks() );
Pau Espin Pedrol90fdfed2021-03-02 17:29:32 +01006550 execute( TC_dl_no_ack_retrans_imm_ass() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006551 execute( TC_paging_cs_from_bts() );
6552 execute( TC_paging_cs_from_sgsn_sign_ptmsi() );
6553 execute( TC_paging_cs_from_sgsn_sign() );
6554 execute( TC_paging_cs_from_sgsn_ptp() );
6555 execute( TC_paging_ps_from_sgsn_sign_ptmsi() );
6556 execute( TC_paging_ps_from_sgsn_sign() );
6557 execute( TC_paging_ps_from_sgsn_ptp() );
Oliver Smithe1a77c42021-07-28 13:36:09 +02006558 if (mp_osmo_pcu_newer_than_0_9_0) {
6559 execute( TC_paging_pch_timeout() );
6560 }
Vadim Yanitskiydbd4b242020-10-31 05:44:58 +07006561 execute( TC_paging_cs_multi_ms_imsi_tmsi() );
6562 execute( TC_paging_cs_multi_ms_imsi() );
6563 execute( TC_paging_cs_multi_ms_tmsi() );
Pau Espin Pedrolc03eb122020-08-27 18:54:24 +02006564 execute( TC_bssgp_dl_unitdata_with_valid_imsi() );
6565 execute( TC_bssgp_dl_unitdata_with_invalid_imsi() );
Pau Espin Pedrol2e459d62020-11-30 19:34:16 +01006566 execute( TC_dl_gprs_data_no_llc_ui_dummy() );
6567 execute( TC_dl_egprs_data_no_llc_ui_dummy() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006568
6569 /* EGPRS specific test cases */
6570 execute( TC_egprs_pkt_chan_req_signalling() );
6571 execute( TC_egprs_pkt_chan_req_one_phase() );
6572 execute( TC_egprs_pkt_chan_req_two_phase() );
Vadim Yanitskiy4f56d322020-05-22 20:15:48 +07006573 execute( TC_egprs_pkt_chan_req_reject_content() );
Vadim Yanitskiy7e06c252020-05-22 20:48:53 +07006574 execute( TC_egprs_pkt_chan_req_reject_emergency() );
Vadim Yanitskiyc4324ff2020-05-22 21:53:58 +07006575 execute( TC_egprs_pkt_chan_req_reject_exhaustion() );
Pau Espin Pedrol42acafc2020-05-14 15:18:38 +02006576
6577 execute( TC_mo_ping_pong_with_ul_racap_egprs_only() );
Vadim Yanitskiy94fe83e2020-07-20 04:03:13 +07006578
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006579 /* Immediate Assignment on AGCH/PCH */
6580 execute( TC_pcuif_fh_imm_ass_ul_egprs() );
6581 execute( TC_pcuif_fh_imm_ass_ul() );
6582 execute( TC_pcuif_fh_imm_ass_dl() );
6583 /* Packet Uplink/Downlink Assignment on PACCH */
6584 execute( TC_pcuif_fh_pkt_ass_ul() );
6585 execute( TC_pcuif_fh_pkt_ass_dl() );
6586 execute( TC_multitrx_multims_alloc() );
6587 execute( TC_dl_multislot_tbf_ms_class_from_sgsn() );
6588 execute( TC_dl_multislot_tbf_ms_class_from_2phase() );
6589 execute( TC_ul_multislot_tbf_ms_class_from_2phase() );
Pau Espin Pedrol37604572021-10-15 14:36:16 +02006590 execute( TC_ul_tbf_reestablish_with_pkt_resource_req() );
Pau Espin Pedrold658f342021-10-15 14:52:22 +02006591 execute( TC_ul_tbf_reestablish_with_pkt_resource_req_n3105_max() );
Vadim Yanitskiy1da1fef2021-03-23 04:28:18 +01006592
Pau Espin Pedrole1303052020-11-16 11:13:51 +01006593 execute( TC_multiplex_dl_gprs_egprs() );
Vadim Yanitskiyd53fb672020-10-09 16:41:02 +07006594
6595 execute( TC_pcuif_info_ind_subsequent() );
Pau Espin Pedrol0637ba02021-01-22 18:36:12 +01006596 execute( TC_nacc_outbound_success() );
Pau Espin Pedrol2abbba92021-02-02 11:52:57 +01006597 execute( TC_nacc_outbound_success_no_ctrl_ack() );
Pau Espin Pedrol43be4252021-01-27 16:40:54 +01006598 execute( TC_nacc_outbound_success_twice() );
Pau Espin Pedrol85366682021-01-27 19:04:54 +01006599 execute( TC_nacc_outbound_success_twice_nocache() );
Pau Espin Pedrol31e30642021-01-26 19:25:16 +01006600 execute( TC_nacc_outbound_rac_ci_resolve_timeout() );
Pau Espin Pedrol9076ee72021-01-26 19:38:26 +01006601 execute( TC_nacc_outbound_si_resolve_timeout() );
Pau Espin Pedrol6a715482021-02-10 18:40:46 +01006602 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup() );
6603 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup2() );
Pau Espin Pedrol0d6ebb72021-02-11 14:53:24 +01006604 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup3() );
6605 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup4() );
6606 execute( TC_nacc_outbound_pkt_cell_chg_notif_dup5() );
Pau Espin Pedrold4ed3602021-02-11 12:37:22 +01006607 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice() );
6608 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice2() );
Pau Espin Pedrol179ddef2021-02-11 16:03:46 +01006609 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice3() );
6610 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice4() );
6611 execute( TC_nacc_outbound_pkt_cell_chg_notif_twice5() );
Pau Espin Pedrol13035772021-02-18 16:07:06 +01006612 execute( TC_nacc_outbound_pkt_cell_chg_notif_unassigned_dl_tbf() );
Pau Espin Pedrolf28fd082021-09-07 20:02:25 +02006613 if (mp_ctrl_neigh_ip != "") { /* PCU using old CTRL neigh addr resolution iface */
6614 execute( TC_nacc_outbound_rac_ci_resolve_conn_refused() );
6615 execute( TC_nacc_outbound_rac_ci_resolve_fail_parse_response() );
6616 }
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006617
6618 execute( TC_rim_ran_info_req_single_rep() );
Pau Espin Pedrol436e2bd2021-05-06 20:07:08 +02006619 execute( TC_rim_ran_info_req_single_rep_eutran() );
Philipp Maierd55fe7e2021-02-01 17:23:40 +01006620 execute( TC_rim_ran_info_req_single_rep_no_si() );
Pau Espin Pedrol3aa61c62021-08-25 19:24:03 +02006621
6622 execute (TC_pdch_energy_saving() );
Oliver Smith3d174882021-09-03 11:38:51 +02006623
6624 execute( TC_stat_pdch_avail_occ() );
Oliver Smithf04762d2021-09-14 17:20:38 +02006625 execute( TC_stat_pdch_avail_occ_ms_not_known_gprs() );
6626 execute( TC_stat_pdch_avail_occ_ms_not_known_egprs() );
Pau Espin Pedrol8dd59fb2020-04-29 15:08:16 +02006627}
6628
Harald Weltea419df22019-03-21 17:23:04 +01006629}